From 04323e1f5c5a1e468c968349481226b2211deb8f Mon Sep 17 00:00:00 2001 From: Zed <124834187+zZedix@users.noreply.github.com> Date: Sun, 5 Oct 2025 01:52:45 +0330 Subject: [PATCH 1/6] Handle socket.gaierror for invalid hostnames --- main.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/main.py b/main.py index e3043aa60..3cd4ff8ed 100644 --- a/main.py +++ b/main.py @@ -45,7 +45,7 @@ def check_and_modify_ip(ip_address: str) -> str: Raises: ValueError: If the provided IP address is invalid, return localhost. """ - try: + try: # Attempt to resolve hostname to IP address resolved_ip = socket.gethostbyname(ip_address) @@ -59,7 +59,7 @@ def check_and_modify_ip(ip_address: str) -> str: else: return "localhost" - except ValueError: + except (ValueError, socket.gaierror): return "localhost" From 55e27f4f212c33ac000f267f5c593bd94aeda65d Mon Sep 17 00:00:00 2001 From: Zed <124834187+zZedix@users.noreply.github.com> Date: Sun, 5 Oct 2025 11:26:10 +0330 Subject: [PATCH 2/6] Update main.py --- main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.py b/main.py index 3cd4ff8ed..03dd0e69a 100644 --- a/main.py +++ b/main.py @@ -45,7 +45,7 @@ def check_and_modify_ip(ip_address: str) -> str: Raises: ValueError: If the provided IP address is invalid, return localhost. """ - try: + try: # Attempt to resolve hostname to IP address resolved_ip = socket.gethostbyname(ip_address) From 37042eb6c18a5717e1e30d24bf0936e257579979 Mon Sep 17 00:00:00 2001 From: Zed <124834187+zZedix@users.noreply.github.com> Date: Sun, 5 Oct 2025 12:22:07 +0330 Subject: [PATCH 3/6] safely detect global IPv4 and close socket properly --- app/utils/system.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/utils/system.py b/app/utils/system.py index 5fbc20717..a615fbc87 100644 --- a/app/utils/system.py +++ b/app/utils/system.py @@ -70,6 +70,7 @@ def get_public_ip(): except httpx.RequestError: pass + sock = None try: sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.connect(("8.8.8.8", 80)) @@ -79,11 +80,10 @@ def get_public_ip(): except (socket.error, IndexError): pass finally: - sock.close() + if sock: + sock.close() return "127.0.0.1" - - def get_public_ipv6(): try: resp = httpx.get("http://api6.ipify.org/", timeout=5).text.strip() From e27a03a04dfc4e7aaf312ce8b16ca3c4fb48391e Mon Sep 17 00:00:00 2001 From: Zed <124834187+zZedix@users.noreply.github.com> Date: Sun, 5 Oct 2025 12:24:50 +0330 Subject: [PATCH 4/6] Harden get_subscription_payload against malformed tokens --- app/utils/jwt.py | 72 ++++++++++++++++++++++++++++++------------------ 1 file changed, 45 insertions(+), 27 deletions(-) diff --git a/app/utils/jwt.py b/app/utils/jwt.py index 54adf2c99..504690aae 100644 --- a/app/utils/jwt.py +++ b/app/utils/jwt.py @@ -60,34 +60,52 @@ async def get_subscription_payload(token: str) -> dict | None: return if token.startswith("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9."): - payload = jwt.decode(token, await get_secret_key(), algorithms=["HS256"]) + try: + payload = jwt.decode(token, await get_secret_key(), algorithms=["HS256"]) + except jwt.exceptions.PyJWTError: + return + if payload.get("access") == "subscription": return { - "username": payload["sub"], - "created_at": datetime.fromtimestamp(payload["iat"], tz=timezone.utc), + "username": payload.get("sub"), + "created_at": datetime.fromtimestamp(payload.get("iat", 0), tz=timezone.utc), } - else: - return - else: - u_token = token[:-10] - u_signature = token[-10:] - try: - u_token_dec = b64decode( - (u_token.encode("utf-8") + b"=" * (-len(u_token.encode("utf-8")) % 4)), - altchars=b"-_", - validate=True, - ) - u_token_dec_str = u_token_dec.decode("utf-8") - except Exception: - return - u_token_resign = b64encode( - sha256((u_token + await get_secret_key()).encode("utf-8")).digest(), altchars=b"-_" - ).decode("utf-8")[:10] - if u_signature == u_token_resign: - u_username = u_token_dec_str.split(",")[0] - u_created_at = int(u_token_dec_str.split(",")[1]) - return {"username": u_username, "created_at": datetime.fromtimestamp(u_created_at, tz=timezone.utc)} - else: - return - except jwt.exceptions.PyJWTError: + return + + u_token = token[:-10] + u_signature = token[-10:] + + try: + u_token_dec = b64decode( + (u_token.encode("utf-8") + b"=" * (-len(u_token.encode("utf-8")) % 4)), + altchars=b"-_", + validate=True, + ) + u_token_dec_str = u_token_dec.decode("utf-8") + except Exception: + return + + u_token_resign = b64encode( + sha256((u_token + await get_secret_key()).encode("utf-8")).digest(), + altchars=b"-_", + ).decode("utf-8")[:10] + + if u_signature != u_token_resign: + return + + parts = u_token_dec_str.split(",") + if len(parts) != 2: + return + + u_username, u_created_at_str = parts + if not u_created_at_str.isdigit(): + return + + u_created_at = int(u_created_at_str) + return { + "username": u_username, + "created_at": datetime.fromtimestamp(u_created_at, tz=timezone.utc), + } + + except Exception: return From 859286deaa3c256ceb9973c5b15f4a14fc24e754 Mon Sep 17 00:00:00 2001 From: Zed <124834187+zZedix@users.noreply.github.com> Date: Sun, 5 Oct 2025 13:08:14 +0330 Subject: [PATCH 5/6] =?UTF-8?q?=E2=9C=A8=20=D8=A8=D9=87=D8=A8=D9=88=D8=AF?= =?UTF-8?q?=20README=20=D8=A8=D8=A7=20=D9=84=D9=88=DA=AF=D9=88=DB=8C=20?= =?UTF-8?q?=D8=AC=D8=AF=DB=8C=D8=AF=20=D9=88=20=D8=B7=D8=B1=D8=A7=D8=AD?= =?UTF-8?q?=DB=8C=20=D8=B2=DB=8C=D8=A8=D8=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - اضافه کردن لوگوی PasarGuard - بهبود طراحی بصری با ایموجی‌ها و جداول - ترجمه کامل به فارسی و انگلیسی - ساختار بهتر و خوانایی بیشتر - اضافه کردن بخش‌های جدید و بهبود یافته --- .dockerignore | 24 + .env.example | 66 + .gitattributes | 10 + .github/ISSUE_TEMPLATE/bug_report.md | 33 + .github/ISSUE_TEMPLATE/feature_request.md | 20 + .github/workflows/api-codeql.yml | 48 + .github/workflows/build.yml | 140 + .github/workflows/frontend-codeql.yml | 48 + .github/workflows/ruff-check.yml | 33 + .../workflows/test-database-migrations.yml | 103 + .gitignore | 170 + CONTRIBUTING.md | 150 + Dockerfile | 39 + LICENSE | 661 + Makefile | 142 + PasarGuard.code-workspace | 113 + README-fa.md | 449 + README-ru.md | 470 + README-zh-cn.md | 464 + README.md | 677 + alembic.ini | 99 + app/__init__.py | 116 + app/core/__init__.py | 0 app/core/abstract_core.py | 21 + app/core/hosts.py | 76 + app/core/manager.py | 97 + app/core/xray.py | 413 + app/db/__init__.py | 16 + app/db/base.py | 62 + app/db/compiles_types.py | 118 + app/db/crud/__init__.py | 18 + app/db/crud/admin.py | 217 + app/db/crud/bulk.py | 416 + app/db/crud/core.py | 102 + app/db/crud/general.py | 103 + app/db/crud/group.py | 149 + app/db/crud/host.py | 166 + app/db/crud/node.py | 295 + app/db/crud/settings.py | 29 + app/db/crud/user.py | 1064 ++ app/db/crud/user_template.py | 152 + app/db/migrations/README | 1 + app/db/migrations/env.py | 89 + app/db/migrations/script.py.mako | 24 + ..._sub_updated_at_and_sub_last_user_agent.py | 30 + ...025d427831dd_sub_last_user_agent_length.py | 34 + ...9a5_add_randomizednoalpn_and_unsafe_to_.py | 83 + .../07f9bbb3db4e_user_last_status_change.py | 49 + .../084b8004104c_cast_alpn_as_enumarray.py | 91 + .../08b381fc1bc7_update_shadowsocks_method.py | 75 + ...2b_add_sub_template_sub_domain_profile_.py | 34 + ...6e_make_data_limit_and_expire_duration_.py | 56 + app/db/migrations/versions/0f720f5c54dd_.py | 24 + .../16e19723febc_migrate_to_groups.py | 302 + app/db/migrations/versions/1ad79b97fdcf_.py | 24 + ...dd_extra_sttings_to_usertemplates_table.py | 28 + .../versions/1cf7d159fdbb_add_online_at.py | 28 + .../1dc5f89b706a_drop_proxies_table.py | 35 + .../1f6e978be88e_migrate_to_sqlalchemy_v2.py | 244 + ...c_add_threshold_to_notificationreminder.py | 28 + app/db/migrations/versions/2313cdc30da3_.py | 24 + ...231de97dc3_add_use_sni_as_host_to_hosts.py | 27 + .../versions/2ea33513efc0_noise_for_sqlite.py | 32 + .../305943d779c4_add_h3_to_alpn_enum.py | 119 + ...92220c0d0_add_support_random_user_agent.py | 28 + .../versions/343ad7904b19_remove_tls_table.py | 38 + .../35760ebfabd2_add_status_to_hosts.py | 45 + ...5f7f8fa9cf2_add_sub_revoked_at_to_users.py | 28 + .../migrations/versions/37692c1c9715_nodes.py | 47 + ...proxy_settings_column_to_users_table.py.py | 82 + .../3c466ce2ab63_round_float_values.py | 61 + .../3cf36a5fde73_init_system_table.py | 39 + .../470465472326_add_path_to_hosts.py | 26 + .../4e66033a2b9b_separate_nodes_config.py | 111 + .../versions/4eb0a0eb835f_reformat_hosts.py | 69 + ...8_drop_proxy_outbound_and_sockopt_from_.py | 27 + .../versions/508061427170_fix_timezones.py | 178 + .../51e941ed9018_deactive_user_status.py | 119 + .../versions/53586547c10e_node_api_key.py | 27 + ...fc_last_status_change_for_expired_users.py | 75 + .../5575fe410515_add_telegram_id_to_admin.py | 30 + .../versions/57fda18cd9e6_add_xray_version.py | 28 + .../versions/58a5b64175a8_node_stats_table.py | 40 + ...6e7b165_add_password_reset_at_to_admins.py | 28 + .../migrations/versions/5b84d88804a1_fix.py | 48 + .../versions/671621870b02_init_admin.py | 44 + ...ca039166_next_plan_to_template_relation.py | 32 + ...1_add_data_limit_reset_strategy_and_on_.py | 31 + .../714f227201a7_fix_user_template.py | 35 + .../77c86a261126_nodes_coefficient.py | 28 + .../versions/7a0dbb8a2f65_init_tls_table.py | 39 + app/db/migrations/versions/7a93bcd44713_.py | 24 + .../7cbe9d91ac11_proxyhost_security_added.py | 40 + .../versions/81554fa3c345_admin_discord_id.py | 28 + .../versions/852d951c9c08_drop_extra_index.py | 46 + .../89bcb1419c66_fix_user_status_enum.py | 104 + .../versions/8e849e06f131_proxy_table.py | 81 + ...fe407cf56c9_add_general_settings_to_app.py | 45 + ...40d6eec_add_is_disabled_to_admins_table.py | 28 + .../versions/947ebbd8debe_add_on_hold.py | 122 + .../versions/94a5cc12c0d6_init_user_table.py | 42 + ..._change_fragments_and_noise_from_regex_.py | 178 + .../97dd9311ab93_add_user_templates.py | 46 + ...e_drop_mux_enable_column_in_hosts_table.py | 28 + .../versions/9af04c077ede_init_settings.py | 248 + ...0a2_add_created_at_field_to_users_table.py | 33 + ...cd_user_template_status_and_reset_usage.py | 45 + .../versions/9d5a518ae432_init_jwt_table.py | 37 + ...a4831e991a_add_ech_config_list_to_hosts.py | 28 + ...f0_add_allow_in_secure_and_disable_host.py | 34 + .../a0d3d400ea75_admin_is_sudo_field.py | 29 + ...a6e3fff39291_add_notification_reminders.py | 38 + .../a9cfd5611a82_add_noise_settings.py | 28 + .../ac26f36783a2_increase_username_length.py | 40 + ...nd_mux_enable_fragment_setting_to_hosts.py | 34 + .../versions/b15eba6e5867_add_host_sni.py | 26 + ...b25e7e6be241_added_users_usage_to_admin.py | 28 + .../migrations/versions/b3378dc6de01_hosts.py | 36 + .../be0c5f840473_fix_multiple_heads_error.py | 24 + .../beb47f520963_gather_node_logs_option.py | 28 + .../c106bb40c861_alpn_fingerprint_hosts.py | 35 + .../c3cd674b9bcd_added_next_plan_for_user.py | 37 + .../versions/c41c441de44c_gozargah_node.py | 50 + .../versions/c47250b790eb_add_user_note.py | 28 + ...5c734bd3da2_add_priority_to_proxy_hosts.py | 150 + ...bab_drop_excloud_inbounds_and_template_.py | 40 + .../ccbf9d322ae3_user_auto_delete_in_days.py | 28 + ...6aaf82_add_is_disabled_to_usertemplates.py | 28 + ..._add_userusageresetlogs_model_and_data_.py | 42 + ...ename_admin_users_usage_to_used_traffic.py | 24 + .../d0a3960f5dad_usagelog_table_for_admin.py | 35 + ...d607d3ca5246_change_enumarray_to_string.py | 137 + ..._move_data_from_proxies_table_to_users_.py | 73 + .../dd725e4d3628_fix_mysql_collations.py | 130 + ...a563_rename_deactive_status_to_disabled.py | 115 + ...5f15c3f_merge_fad8b1997c3a_a0d3d400ea75.py | 24 + .../e422f859847f_refactor_sub_updated_at.py | 60 + .../versions/e4a86bc8ec7b_node_user_usages.py | 39 + .../versions/e56f1c781e46_fix_on_hold.py | 29 + ...b4_increase_length_of_the_host_and_sni_.py | 41 + ...993f1a_inbounds_table_excluded_inbounds.py | 41 + ...3e_add_headers_and_transports_settings_.py | 32 + app/db/migrations/versions/ece13c4c6f65_.py | 24 + .../f2b9caa23e16_change_expire_to_datetime.py | 76 + .../versions/f44ec4769d5d_fix_alpn_enum.py | 48 + .../fad8b1997c3a_case_insensitive_username.py | 85 + ...fbfc49f01004_drop_fire_on_either_column.py | 28 + .../versions/fc01b1520e72_add_node_usages.py | 73 + ...796f840a4_remove_certficiate_from_nodes.py | 28 + app/db/models.py | 616 + app/jobs/__init__.py | 13 + app/jobs/cleanup_subscription_updates.py | 81 + app/jobs/dependencies.py | 3 + app/jobs/inboud.py | 26 + app/jobs/node_checker.py | 101 + app/jobs/node_stats.py | 52 + app/jobs/record_usages.py | 305 + app/jobs/remove_expired_users.py | 26 + app/jobs/reset_user_data_usage.py | 47 + app/jobs/review_users.py | 203 + app/jobs/send_notifications.py | 115 + app/models/admin.py | 99 + app/models/core.py | 54 + app/models/group.py | 46 + app/models/host.py | 240 + app/models/node.py | 164 + app/models/proxy.py | 49 + app/models/settings.py | 222 + app/models/stats.py | 77 + app/models/system.py | 18 + app/models/user.py | 179 + app/models/user_template.py | 68 + app/models/validators.py | 226 + app/node/__init__.py | 113 + app/node/user.py | 60 + app/notification/__init__.py | 192 + app/notification/client.py | 113 + app/notification/discord/__init__.py | 48 + app/notification/discord/admin.py | 97 + app/notification/discord/colors.py | 7 + app/notification/discord/core.py | 63 + app/notification/discord/group.py | 62 + app/notification/discord/host.py | 73 + app/notification/discord/messages.py | 252 + app/notification/discord/node.py | 86 + app/notification/discord/user.py | 164 + app/notification/discord/user_template.py | 67 + app/notification/discord/utils.py | 32 + app/notification/telegram/__init__.py | 48 + app/notification/telegram/admin.py | 73 + app/notification/telegram/core.py | 46 + app/notification/telegram/group.py | 41 + app/notification/telegram/host.py | 49 + app/notification/telegram/messages.py | 301 + app/notification/telegram/node.py | 59 + app/notification/telegram/user.py | 140 + app/notification/telegram/user_template.py | 52 + app/notification/telegram/utils.py | 32 + app/notification/webhook/__init__.py | 129 + app/operation/__init__.py | 158 + app/operation/admin.py | 127 + app/operation/core.py | 75 + app/operation/group.py | 87 + app/operation/host.py | 109 + app/operation/node.py | 350 + app/operation/settings.py | 44 + app/operation/subscription.py | 157 + app/operation/system.py | 65 + app/operation/user.py | 509 + app/operation/user_template.py | 68 + app/routers/__init__.py | 24 + app/routers/admin.py | 154 + app/routers/authentication.py | 100 + app/routers/core.py | 85 + app/routers/group.py | 205 + app/routers/home.py | 52 + app/routers/host.py | 85 + app/routers/node.py | 205 + app/routers/settings.py | 27 + app/routers/subscription.py | 63 + app/routers/system.py | 61 + app/routers/user.py | 358 + app/routers/user_template.py | 75 + app/settings/__init__.py | 68 + app/subscription/__init__.py | 16 + app/subscription/base.py | 47 + app/subscription/clash.py | 392 + app/subscription/funcs.py | 76 + app/subscription/links.py | 460 + app/subscription/outline.py | 48 + app/subscription/share.py | 292 + app/subscription/singbox.py | 345 + app/subscription/xray.py | 680 + app/telegram/__init__.py | 125 + app/telegram/handlers/__init__.py | 11 + app/telegram/handlers/admin/__init__.py | 17 + app/telegram/handlers/admin/bulk_actions.py | 163 + app/telegram/handlers/admin/confirm_action.py | 43 + app/telegram/handlers/admin/main_menu.py | 56 + app/telegram/handlers/admin/user.py | 622 + app/telegram/handlers/base.py | 60 + app/telegram/handlers/client/__init__.py | 7 + app/telegram/handlers/client/show_info.py | 42 + app/telegram/handlers/error_handler.py | 40 + app/telegram/keyboards/__init__.py | 0 app/telegram/keyboards/admin.py | 49 + app/telegram/keyboards/base.py | 19 + app/telegram/keyboards/bulk_actions.py | 33 + app/telegram/keyboards/confim_action.py | 16 + app/telegram/keyboards/group.py | 41 + app/telegram/keyboards/user.py | 157 + app/telegram/middlewares/__init__.py | 9 + app/telegram/middlewares/acl.py | 36 + app/telegram/utils/filters.py | 13 + app/telegram/utils/forms.py | 29 + app/telegram/utils/shared.py | 39 + app/telegram/utils/texts.py | 263 + app/templates/__init__.py | 21 + app/templates/clash/README.md | 42 + app/templates/clash/default.yml | 13 + app/templates/filters.py | 41 + app/templates/home/index.html | 1942 +++ app/templates/singbox/README.md | 42 + app/templates/singbox/default.json | 85 + app/templates/subscription/index.html | 203 + app/templates/user_agent/default.json | 104 + app/templates/user_agent/grpc.json | 20 + app/templates/xray/README.md | 44 + app/templates/xray/default.json | 58 + app/utils/crypto.py | 76 + app/utils/helpers.py | 76 + app/utils/jwt.py | 93 + app/utils/logger.py | 94 + app/utils/responses.py | 43 + app/utils/store.py | 28 + app/utils/system.py | 114 + build_dashboard.sh | 5 + cli/README.md | 60 + cli/__init__.py | 49 + cli/admin.py | 226 + cli/main.py | 63 + cli/system.py | 58 + cli_wrapper.sh | 2 + config.py | 99 + dashboard/.env.example | 1 + dashboard/.gitignore | 25 + dashboard/.prettierrc.json | 21 + dashboard/README.md | 42 + dashboard/__init__.py | 62 + dashboard/build.zip | Bin 0 -> 1785169 bytes dashboard/bun.lock | 2319 +++ dashboard/components.json | 21 + dashboard/custom.d.ts | 6 + dashboard/eslint.config.js | 25 + dashboard/index.html | 22 + dashboard/orval.config.ts | 24 + dashboard/package-lock.json | 12735 ++++++++++++++++ dashboard/package.json | 114 + .../favicon/android-chrome-192x192.png | Bin 0 -> 16698 bytes .../favicon/android-chrome-512x512.png | Bin 0 -> 58809 bytes .../statics/favicon/apple-touch-icon.png | Bin 0 -> 58809 bytes dashboard/public/statics/favicon/favicon.ico | Bin 0 -> 575 bytes .../public/statics/favicon/logo-dark.png | Bin 0 -> 264842 bytes dashboard/public/statics/favicon/logo-pwa.png | Bin 0 -> 283405 bytes dashboard/public/statics/favicon/logo.png | Bin 0 -> 263181 bytes .../public/statics/favicon/mstile-150x150.png | Bin 0 -> 11714 bytes .../public/statics/favicon/mstile-310x310.png | Bin 0 -> 31771 bytes .../public/statics/favicon/mstile-70x70.png | Bin 0 -> 4045 bytes dashboard/public/statics/locales/en.json | 1502 ++ dashboard/public/statics/locales/fa.json | 1482 ++ dashboard/public/statics/locales/ru.json | 1491 ++ dashboard/public/statics/locales/zh.json | 1534 ++ dashboard/react-router.config.ts | 10 + dashboard/src/App.tsx | 20 + dashboard/src/assets/react.svg | 1 + dashboard/src/components/ActionButtons.tsx | 560 + dashboard/src/components/AdminStatistics.tsx | 73 + dashboard/src/components/AdminStatusBadge.tsx | 59 + dashboard/src/components/CopyButton.tsx | 45 + dashboard/src/components/Footer.tsx | 23 + dashboard/src/components/Language.tsx | 41 + dashboard/src/components/LineCountFilter.tsx | 52 + dashboard/src/components/LoadingSpinner.tsx | 27 + dashboard/src/components/OnlineBadge.tsx | 82 + dashboard/src/components/OnlineStatus.tsx | 61 + dashboard/src/components/PageTransition.tsx | 237 + dashboard/src/components/RouteGuard.tsx | 53 + dashboard/src/components/SinceLogsFilter.tsx | 72 + dashboard/src/components/Statistics.tsx | 74 + dashboard/src/components/StatusBadge.tsx | 75 + dashboard/src/components/StatusLogsFilter.tsx | 168 + dashboard/src/components/TerminalLine.tsx | 127 + dashboard/src/components/TopLoadingBar.tsx | 234 + .../src/components/UsageSliderCompact.tsx | 34 + dashboard/src/components/UsersStatistics.tsx | 134 + .../src/components/admins/AdminsTable.tsx | 281 + dashboard/src/components/admins/columns.tsx | 174 + .../src/components/admins/data-table.tsx | 211 + dashboard/src/components/admins/filters.tsx | 207 + .../src/components/bulk/SelectorPanel.tsx | 169 + .../charts/AllNodesStackedBarChart.tsx | 563 + .../components/charts/AreaCostumeChart.tsx | 526 + .../src/components/charts/CostumeBarChart.tsx | 345 + .../src/components/charts/EmptyState.tsx | 92 + .../src/components/charts/TimeSelector.tsx | 30 + .../src/components/common/AdminsSelector.tsx | 137 + .../src/components/common/GroupsSelector.tsx | 142 + .../components/common/TimeRangeSelector.tsx | 99 + .../dashboard/DashboardAdminStatistics.tsx | 26 + .../dashboard/DashboardStatistics.tsx | 223 + .../dashboard/admin-statistics-card.tsx | 67 + .../components/dashboard/data-usage-chart.tsx | 337 + .../dashboard/users-statistics-card.tsx | 56 + .../src/components/dialogs/AdminModal.tsx | 397 + .../components/dialogs/AdvanceSearchModal.tsx | 261 + .../components/dialogs/CoreConfigModal.tsx | 826 + .../src/components/dialogs/GroupModal.tsx | 156 + .../src/components/dialogs/HostModal.tsx | 2801 ++++ .../src/components/dialogs/NodeModal.tsx | 719 + .../src/components/dialogs/QRCodeModal.tsx | 44 + .../src/components/dialogs/SetOwnerModal.tsx | 130 + .../src/components/dialogs/ShortcutsModal.tsx | 202 + .../src/components/dialogs/UsageModal.tsx | 376 + .../src/components/dialogs/UserModal.tsx | 2064 +++ .../dialogs/UserOnlineStatsModal.tsx | 572 + .../dialogs/UserSubscriptionClientsModal.tsx | 401 + .../components/dialogs/UserTemplateModal.tsx | 438 + dashboard/src/components/github-star.tsx | 19 + dashboard/src/components/groups/Group.tsx | 132 + dashboard/src/components/groups/Groups.tsx | 102 + dashboard/src/components/hosts/Hosts.tsx | 822 + .../src/components/hosts/SortableHost.tsx | 237 + .../src/components/layout/sidebar-toggle.tsx | 22 + dashboard/src/components/layout/sidebar.tsx | 356 + dashboard/src/components/nav-main.tsx | 80 + dashboard/src/components/nav-secondary.tsx | 39 + dashboard/src/components/nav-user.tsx | 115 + dashboard/src/components/nodes/Node.tsx | 238 + dashboard/src/components/nodes/Nodes.tsx | 159 + dashboard/src/components/page-header.tsx | 51 + dashboard/src/components/settings/Core.tsx | 76 + dashboard/src/components/settings/Cores.tsx | 132 + dashboard/src/components/settings/Logs.tsx | 130 + dashboard/src/components/spinner.tsx | 43 + .../src/components/statistics/Statistics.tsx | 150 + .../statistics/SystemStatisticsSection.tsx | 217 + .../statistics/UserStatisticsSection.tsx | 121 + .../src/components/templates/UserTemplate.tsx | 192 + dashboard/src/components/theme-provider.tsx | 688 + dashboard/src/components/theme-toggle.tsx | 44 + dashboard/src/components/ui/accordion.tsx | 44 + dashboard/src/components/ui/alert-dialog.tsx | 108 + dashboard/src/components/ui/alert.tsx | 32 + dashboard/src/components/ui/avatar.tsx | 21 + dashboard/src/components/ui/badge.tsx | 32 + dashboard/src/components/ui/breadcrumb.tsx | 57 + dashboard/src/components/ui/button.tsx | 50 + dashboard/src/components/ui/calendar.tsx | 210 + dashboard/src/components/ui/card.tsx | 33 + dashboard/src/components/ui/carousel.tsx | 183 + dashboard/src/components/ui/chart.tsx | 250 + dashboard/src/components/ui/checkbox.tsx | 23 + dashboard/src/components/ui/collapsible.tsx | 9 + dashboard/src/components/ui/command.tsx | 87 + dashboard/src/components/ui/dialog.tsx | 71 + dashboard/src/components/ui/drawer.tsx | 47 + dashboard/src/components/ui/dropdown-menu.tsx | 173 + dashboard/src/components/ui/form.tsx | 104 + dashboard/src/components/ui/hover-card.tsx | 26 + dashboard/src/components/ui/input.tsx | 31 + dashboard/src/components/ui/label.tsx | 14 + dashboard/src/components/ui/loader-button.tsx | 18 + dashboard/src/components/ui/pagination.tsx | 71 + .../src/components/ui/password-input.tsx | 64 + .../src/components/ui/persian-calendar.tsx | 212 + dashboard/src/components/ui/popover.tsx | 31 + dashboard/src/components/ui/progress.tsx | 18 + dashboard/src/components/ui/radio-group.tsx | 30 + dashboard/src/components/ui/scroll-area.tsx | 51 + dashboard/src/components/ui/select.tsx | 105 + dashboard/src/components/ui/separator.tsx | 21 + dashboard/src/components/ui/sheet.tsx | 74 + dashboard/src/components/ui/sidebar.tsx | 578 + dashboard/src/components/ui/skeleton.tsx | 7 + dashboard/src/components/ui/sonner.tsx | 32 + dashboard/src/components/ui/switch.tsx | 23 + dashboard/src/components/ui/table.tsx | 47 + dashboard/src/components/ui/tabs.tsx | 34 + dashboard/src/components/ui/textarea.tsx | 19 + dashboard/src/components/ui/toggle-group.tsx | 47 + dashboard/src/components/ui/toggle.tsx | 36 + dashboard/src/components/ui/tooltip.tsx | 31 + dashboard/src/components/users/columns.tsx | 167 + dashboard/src/components/users/data-table.tsx | 184 + dashboard/src/components/users/filters.tsx | 294 + .../src/components/users/users-table.tsx | 309 + dashboard/src/constants/Project.ts | 5 + dashboard/src/constants/Proxies.ts | 1 + dashboard/src/constants/UserSettings.ts | 60 + dashboard/src/entry.client.tsx | 13 + dashboard/src/hooks/use-admin.ts | 45 + dashboard/src/hooks/use-clipboard.ts | 57 + dashboard/src/hooks/use-dir-detection.tsx | 8 + dashboard/src/hooks/use-dynamic-errors.ts | 93 + dashboard/src/hooks/use-mobile.tsx | 19 + dashboard/src/hooks/use-store.ts | 14 + dashboard/src/hooks/use-toast.ts | 189 + dashboard/src/hooks/use-top-loading-bar.ts | 356 + dashboard/src/index.css | 234 + dashboard/src/lib/dayjs.ts | 15 + dashboard/src/lib/menu-list.ts | 84 + dashboard/src/lib/utils.ts | 6 + dashboard/src/locales/i18n.ts | 40 + dashboard/src/pages/_dashboard._index.tsx | 526 + dashboard/src/pages/_dashboard.admins.tsx | 197 + dashboard/src/pages/_dashboard.bulk.data.tsx | 335 + .../src/pages/_dashboard.bulk.expire.tsx | 353 + .../src/pages/_dashboard.bulk.groups.tsx | 337 + dashboard/src/pages/_dashboard.bulk.proxy.tsx | 290 + dashboard/src/pages/_dashboard.bulk.tsx | 95 + dashboard/src/pages/_dashboard.groups.tsx | 24 + dashboard/src/pages/_dashboard.hosts.tsx | 261 + .../src/pages/_dashboard.nodes._index.tsx | 5 + .../src/pages/_dashboard.nodes.cores.tsx | 223 + dashboard/src/pages/_dashboard.nodes.logs.tsx | 407 + dashboard/src/pages/_dashboard.nodes.tsx | 102 + .../src/pages/_dashboard.settings.cleanup.tsx | 638 + .../src/pages/_dashboard.settings.discord.tsx | 260 + .../src/pages/_dashboard.settings.general.tsx | 217 + .../_dashboard.settings.notifications.tsx | 703 + .../_dashboard.settings.subscriptions.tsx | 819 + .../pages/_dashboard.settings.telegram.tsx | 503 + .../src/pages/_dashboard.settings.theme.tsx | 364 + dashboard/src/pages/_dashboard.settings.tsx | 242 + .../src/pages/_dashboard.settings.webhook.tsx | 565 + dashboard/src/pages/_dashboard.statistics.tsx | 100 + dashboard/src/pages/_dashboard.templates.tsx | 138 + dashboard/src/pages/_dashboard.tsx | 36 + dashboard/src/pages/_dashboard.users.tsx | 182 + dashboard/src/pages/login.tsx | 219 + dashboard/src/router.tsx | 184 + dashboard/src/service/api/index.ts | 6125 ++++++++ dashboard/src/service/http.ts | 46 + dashboard/src/sw-register.ts | 17 + dashboard/src/utils/authStorage.ts | 11 + dashboard/src/utils/dateFormatter.tsx | 114 + dashboard/src/utils/formatByte.ts | 23 + dashboard/src/utils/isEmptyObject.ts | 4 + dashboard/src/utils/logsUtils.ts | 150 + dashboard/src/utils/query-client.ts | 3 + dashboard/src/utils/react-query.ts | 3 + dashboard/src/utils/userAgentParser.ts | 117 + dashboard/src/utils/userPreferenceStorage.ts | 10 + dashboard/src/vite-env.d.ts | 2 + dashboard/tailwind.config.js | 289 + dashboard/tsconfig.app.json | 28 + dashboard/tsconfig.json | 17 + dashboard/tsconfig.node.json | 22 + dashboard/vite.config.mts | 99 + docker-compose.yml | 8 + install_service.sh | 27 + main.py | 152 + pasarguard-cli.py | 24 + pasarguard-tui.py | 53 + pyproject.toml | 77 + pytest.ini | 10 + start.sh | 3 + tests/api/__init__.py | 94 + tests/api/conftest.py | 125 + tests/api/test_a_admin.py | 111 + tests/api/test_b_core.py | 418 + tests/api/test_c_group.py | 73 + tests/api/test_d_host.py | 79 + tests/api/test_e_user.py | 217 + tests/api/test_f_user_template.py | 89 + tests/api/test_g_bulk.py | 134 + tests/api/test_h_system.py | 20 + tests/conftest.py | 28 + tui/README.md | 42 + tui/__init__.py | 29 + tui/admin.py | 481 + tui/help.py | 36 + tui/style.tcss | 91 + tui_wrapper.sh | 2 + uv.lock | 2183 +++ 525 files changed, 96551 insertions(+) create mode 100644 .dockerignore create mode 100644 .env.example create mode 100644 .gitattributes create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/workflows/api-codeql.yml create mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/frontend-codeql.yml create mode 100644 .github/workflows/ruff-check.yml create mode 100644 .github/workflows/test-database-migrations.yml create mode 100644 .gitignore create mode 100644 CONTRIBUTING.md create mode 100644 Dockerfile create mode 100644 LICENSE create mode 100644 Makefile create mode 100644 PasarGuard.code-workspace create mode 100644 README-fa.md create mode 100644 README-ru.md create mode 100644 README-zh-cn.md create mode 100644 README.md create mode 100644 alembic.ini create mode 100644 app/__init__.py create mode 100644 app/core/__init__.py create mode 100644 app/core/abstract_core.py create mode 100644 app/core/hosts.py create mode 100644 app/core/manager.py create mode 100644 app/core/xray.py create mode 100644 app/db/__init__.py create mode 100644 app/db/base.py create mode 100644 app/db/compiles_types.py create mode 100644 app/db/crud/__init__.py create mode 100644 app/db/crud/admin.py create mode 100644 app/db/crud/bulk.py create mode 100644 app/db/crud/core.py create mode 100644 app/db/crud/general.py create mode 100644 app/db/crud/group.py create mode 100644 app/db/crud/host.py create mode 100644 app/db/crud/node.py create mode 100644 app/db/crud/settings.py create mode 100644 app/db/crud/user.py create mode 100644 app/db/crud/user_template.py create mode 100644 app/db/migrations/README create mode 100644 app/db/migrations/env.py create mode 100644 app/db/migrations/script.py.mako create mode 100644 app/db/migrations/versions/015cf1dc6eca_sub_updated_at_and_sub_last_user_agent.py create mode 100644 app/db/migrations/versions/025d427831dd_sub_last_user_agent_length.py create mode 100644 app/db/migrations/versions/04a5ec93e9a5_add_randomizednoalpn_and_unsafe_to_.py create mode 100644 app/db/migrations/versions/07f9bbb3db4e_user_last_status_change.py create mode 100644 app/db/migrations/versions/084b8004104c_cast_alpn_as_enumarray.py create mode 100644 app/db/migrations/versions/08b381fc1bc7_update_shadowsocks_method.py create mode 100644 app/db/migrations/versions/0b62f893092b_add_sub_template_sub_domain_profile_.py create mode 100644 app/db/migrations/versions/0d22271ee06e_make_data_limit_and_expire_duration_.py create mode 100644 app/db/migrations/versions/0f720f5c54dd_.py create mode 100644 app/db/migrations/versions/16e19723febc_migrate_to_groups.py create mode 100644 app/db/migrations/versions/1ad79b97fdcf_.py create mode 100644 app/db/migrations/versions/1ccf7b18b283_add_extra_sttings_to_usertemplates_table.py create mode 100644 app/db/migrations/versions/1cf7d159fdbb_add_online_at.py create mode 100644 app/db/migrations/versions/1dc5f89b706a_drop_proxies_table.py create mode 100644 app/db/migrations/versions/1f6e978be88e_migrate_to_sqlalchemy_v2.py create mode 100644 app/db/migrations/versions/21226bc711ac_add_threshold_to_notificationreminder.py create mode 100644 app/db/migrations/versions/2313cdc30da3_.py create mode 100644 app/db/migrations/versions/2b231de97dc3_add_use_sni_as_host_to_hosts.py create mode 100644 app/db/migrations/versions/2ea33513efc0_noise_for_sqlite.py create mode 100644 app/db/migrations/versions/305943d779c4_add_h3_to_alpn_enum.py create mode 100644 app/db/migrations/versions/31f92220c0d0_add_support_random_user_agent.py create mode 100644 app/db/migrations/versions/343ad7904b19_remove_tls_table.py create mode 100644 app/db/migrations/versions/35760ebfabd2_add_status_to_hosts.py create mode 100644 app/db/migrations/versions/35f7f8fa9cf2_add_sub_revoked_at_to_users.py create mode 100644 app/db/migrations/versions/37692c1c9715_nodes.py create mode 100644 app/db/migrations/versions/3b59f3680c90_add_groups_table_and_add_proxy_settings_column_to_users_table.py.py create mode 100644 app/db/migrations/versions/3c466ce2ab63_round_float_values.py create mode 100644 app/db/migrations/versions/3cf36a5fde73_init_system_table.py create mode 100644 app/db/migrations/versions/470465472326_add_path_to_hosts.py create mode 100644 app/db/migrations/versions/4e66033a2b9b_separate_nodes_config.py create mode 100644 app/db/migrations/versions/4eb0a0eb835f_reformat_hosts.py create mode 100644 app/db/migrations/versions/4f045f53bef8_drop_proxy_outbound_and_sockopt_from_.py create mode 100644 app/db/migrations/versions/508061427170_fix_timezones.py create mode 100644 app/db/migrations/versions/51e941ed9018_deactive_user_status.py create mode 100644 app/db/migrations/versions/53586547c10e_node_api_key.py create mode 100644 app/db/migrations/versions/54c4b8c525fc_last_status_change_for_expired_users.py create mode 100644 app/db/migrations/versions/5575fe410515_add_telegram_id_to_admin.py create mode 100644 app/db/migrations/versions/57fda18cd9e6_add_xray_version.py create mode 100644 app/db/migrations/versions/58a5b64175a8_node_stats_table.py create mode 100644 app/db/migrations/versions/5a4446e7b165_add_password_reset_at_to_admins.py create mode 100644 app/db/migrations/versions/5b84d88804a1_fix.py create mode 100644 app/db/migrations/versions/671621870b02_init_admin.py create mode 100644 app/db/migrations/versions/68edca039166_next_plan_to_template_relation.py create mode 100644 app/db/migrations/versions/6980e98bba01_add_data_limit_reset_strategy_and_on_.py create mode 100644 app/db/migrations/versions/714f227201a7_fix_user_template.py create mode 100644 app/db/migrations/versions/77c86a261126_nodes_coefficient.py create mode 100644 app/db/migrations/versions/7a0dbb8a2f65_init_tls_table.py create mode 100644 app/db/migrations/versions/7a93bcd44713_.py create mode 100644 app/db/migrations/versions/7cbe9d91ac11_proxyhost_security_added.py create mode 100644 app/db/migrations/versions/81554fa3c345_admin_discord_id.py create mode 100644 app/db/migrations/versions/852d951c9c08_drop_extra_index.py create mode 100644 app/db/migrations/versions/89bcb1419c66_fix_user_status_enum.py create mode 100644 app/db/migrations/versions/8e849e06f131_proxy_table.py create mode 100644 app/db/migrations/versions/8fe407cf56c9_add_general_settings_to_app.py create mode 100644 app/db/migrations/versions/931ed40d6eec_add_is_disabled_to_admins_table.py create mode 100644 app/db/migrations/versions/947ebbd8debe_add_on_hold.py create mode 100644 app/db/migrations/versions/94a5cc12c0d6_init_user_table.py create mode 100644 app/db/migrations/versions/95da30deba8d_change_fragments_and_noise_from_regex_.py create mode 100644 app/db/migrations/versions/97dd9311ab93_add_user_templates.py create mode 100644 app/db/migrations/versions/9aa6559916be_drop_mux_enable_column_in_hosts_table.py create mode 100644 app/db/migrations/versions/9af04c077ede_init_settings.py create mode 100644 app/db/migrations/versions/9b60be6cd0a2_add_created_at_field_to_users_table.py create mode 100644 app/db/migrations/versions/9cfffef342cd_user_template_status_and_reset_usage.py create mode 100644 app/db/migrations/versions/9d5a518ae432_init_jwt_table.py create mode 100644 app/db/migrations/versions/9fa4831e991a_add_ech_config_list_to_hosts.py create mode 100644 app/db/migrations/versions/a0715c2615f0_add_allow_in_secure_and_disable_host.py create mode 100644 app/db/migrations/versions/a0d3d400ea75_admin_is_sudo_field.py create mode 100644 app/db/migrations/versions/a6e3fff39291_add_notification_reminders.py create mode 100644 app/db/migrations/versions/a9cfd5611a82_add_noise_settings.py create mode 100644 app/db/migrations/versions/ac26f36783a2_increase_username_length.py create mode 100644 app/db/migrations/versions/adda2dd4a741_add_sockopt_proxy_outbound_mux_enable_fragment_setting_to_hosts.py create mode 100644 app/db/migrations/versions/b15eba6e5867_add_host_sni.py create mode 100644 app/db/migrations/versions/b25e7e6be241_added_users_usage_to_admin.py create mode 100644 app/db/migrations/versions/b3378dc6de01_hosts.py create mode 100644 app/db/migrations/versions/be0c5f840473_fix_multiple_heads_error.py create mode 100644 app/db/migrations/versions/beb47f520963_gather_node_logs_option.py create mode 100644 app/db/migrations/versions/c106bb40c861_alpn_fingerprint_hosts.py create mode 100644 app/db/migrations/versions/c3cd674b9bcd_added_next_plan_for_user.py create mode 100644 app/db/migrations/versions/c41c441de44c_gozargah_node.py create mode 100644 app/db/migrations/versions/c47250b790eb_add_user_note.py create mode 100644 app/db/migrations/versions/c5c734bd3da2_add_priority_to_proxy_hosts.py create mode 100644 app/db/migrations/versions/cb99b515fbab_drop_excloud_inbounds_and_template_.py create mode 100644 app/db/migrations/versions/ccbf9d322ae3_user_auto_delete_in_days.py create mode 100644 app/db/migrations/versions/cf67676aaf82_add_is_disabled_to_usertemplates.py create mode 100644 app/db/migrations/versions/d02dcfbf1517_add_userusageresetlogs_model_and_data_.py create mode 100644 app/db/migrations/versions/d085fae205b6_rename_admin_users_usage_to_used_traffic.py create mode 100644 app/db/migrations/versions/d0a3960f5dad_usagelog_table_for_admin.py create mode 100644 app/db/migrations/versions/d607d3ca5246_change_enumarray_to_string.py create mode 100644 app/db/migrations/versions/db68f8d3d40b_move_data_from_proxies_table_to_users_.py create mode 100644 app/db/migrations/versions/dd725e4d3628_fix_mysql_collations.py create mode 100644 app/db/migrations/versions/e3f0e888a563_rename_deactive_status_to_disabled.py create mode 100644 app/db/migrations/versions/e410e5f15c3f_merge_fad8b1997c3a_a0d3d400ea75.py create mode 100644 app/db/migrations/versions/e422f859847f_refactor_sub_updated_at.py create mode 100644 app/db/migrations/versions/e4a86bc8ec7b_node_user_usages.py create mode 100644 app/db/migrations/versions/e56f1c781e46_fix_on_hold.py create mode 100644 app/db/migrations/versions/e7b869e999b4_increase_length_of_the_host_and_sni_.py create mode 100644 app/db/migrations/versions/e91236993f1a_inbounds_table_excluded_inbounds.py create mode 100644 app/db/migrations/versions/eaa9f30f983e_add_headers_and_transports_settings_.py create mode 100644 app/db/migrations/versions/ece13c4c6f65_.py create mode 100644 app/db/migrations/versions/f2b9caa23e16_change_expire_to_datetime.py create mode 100644 app/db/migrations/versions/f44ec4769d5d_fix_alpn_enum.py create mode 100644 app/db/migrations/versions/fad8b1997c3a_case_insensitive_username.py create mode 100644 app/db/migrations/versions/fbfc49f01004_drop_fire_on_either_column.py create mode 100644 app/db/migrations/versions/fc01b1520e72_add_node_usages.py create mode 100644 app/db/migrations/versions/fe7796f840a4_remove_certficiate_from_nodes.py create mode 100644 app/db/models.py create mode 100644 app/jobs/__init__.py create mode 100644 app/jobs/cleanup_subscription_updates.py create mode 100644 app/jobs/dependencies.py create mode 100644 app/jobs/inboud.py create mode 100644 app/jobs/node_checker.py create mode 100644 app/jobs/node_stats.py create mode 100644 app/jobs/record_usages.py create mode 100644 app/jobs/remove_expired_users.py create mode 100644 app/jobs/reset_user_data_usage.py create mode 100644 app/jobs/review_users.py create mode 100644 app/jobs/send_notifications.py create mode 100644 app/models/admin.py create mode 100644 app/models/core.py create mode 100644 app/models/group.py create mode 100644 app/models/host.py create mode 100644 app/models/node.py create mode 100644 app/models/proxy.py create mode 100644 app/models/settings.py create mode 100644 app/models/stats.py create mode 100644 app/models/system.py create mode 100644 app/models/user.py create mode 100644 app/models/user_template.py create mode 100644 app/models/validators.py create mode 100644 app/node/__init__.py create mode 100644 app/node/user.py create mode 100644 app/notification/__init__.py create mode 100644 app/notification/client.py create mode 100644 app/notification/discord/__init__.py create mode 100644 app/notification/discord/admin.py create mode 100644 app/notification/discord/colors.py create mode 100644 app/notification/discord/core.py create mode 100644 app/notification/discord/group.py create mode 100644 app/notification/discord/host.py create mode 100644 app/notification/discord/messages.py create mode 100644 app/notification/discord/node.py create mode 100644 app/notification/discord/user.py create mode 100644 app/notification/discord/user_template.py create mode 100644 app/notification/discord/utils.py create mode 100644 app/notification/telegram/__init__.py create mode 100644 app/notification/telegram/admin.py create mode 100644 app/notification/telegram/core.py create mode 100644 app/notification/telegram/group.py create mode 100644 app/notification/telegram/host.py create mode 100644 app/notification/telegram/messages.py create mode 100644 app/notification/telegram/node.py create mode 100644 app/notification/telegram/user.py create mode 100644 app/notification/telegram/user_template.py create mode 100644 app/notification/telegram/utils.py create mode 100644 app/notification/webhook/__init__.py create mode 100644 app/operation/__init__.py create mode 100644 app/operation/admin.py create mode 100644 app/operation/core.py create mode 100644 app/operation/group.py create mode 100644 app/operation/host.py create mode 100644 app/operation/node.py create mode 100644 app/operation/settings.py create mode 100644 app/operation/subscription.py create mode 100644 app/operation/system.py create mode 100644 app/operation/user.py create mode 100644 app/operation/user_template.py create mode 100644 app/routers/__init__.py create mode 100644 app/routers/admin.py create mode 100644 app/routers/authentication.py create mode 100644 app/routers/core.py create mode 100644 app/routers/group.py create mode 100644 app/routers/home.py create mode 100644 app/routers/host.py create mode 100644 app/routers/node.py create mode 100644 app/routers/settings.py create mode 100644 app/routers/subscription.py create mode 100644 app/routers/system.py create mode 100644 app/routers/user.py create mode 100644 app/routers/user_template.py create mode 100644 app/settings/__init__.py create mode 100644 app/subscription/__init__.py create mode 100644 app/subscription/base.py create mode 100644 app/subscription/clash.py create mode 100644 app/subscription/funcs.py create mode 100644 app/subscription/links.py create mode 100644 app/subscription/outline.py create mode 100644 app/subscription/share.py create mode 100644 app/subscription/singbox.py create mode 100644 app/subscription/xray.py create mode 100644 app/telegram/__init__.py create mode 100644 app/telegram/handlers/__init__.py create mode 100644 app/telegram/handlers/admin/__init__.py create mode 100644 app/telegram/handlers/admin/bulk_actions.py create mode 100644 app/telegram/handlers/admin/confirm_action.py create mode 100644 app/telegram/handlers/admin/main_menu.py create mode 100644 app/telegram/handlers/admin/user.py create mode 100644 app/telegram/handlers/base.py create mode 100644 app/telegram/handlers/client/__init__.py create mode 100644 app/telegram/handlers/client/show_info.py create mode 100644 app/telegram/handlers/error_handler.py create mode 100644 app/telegram/keyboards/__init__.py create mode 100644 app/telegram/keyboards/admin.py create mode 100644 app/telegram/keyboards/base.py create mode 100644 app/telegram/keyboards/bulk_actions.py create mode 100644 app/telegram/keyboards/confim_action.py create mode 100644 app/telegram/keyboards/group.py create mode 100644 app/telegram/keyboards/user.py create mode 100644 app/telegram/middlewares/__init__.py create mode 100644 app/telegram/middlewares/acl.py create mode 100644 app/telegram/utils/filters.py create mode 100644 app/telegram/utils/forms.py create mode 100644 app/telegram/utils/shared.py create mode 100644 app/telegram/utils/texts.py create mode 100644 app/templates/__init__.py create mode 100644 app/templates/clash/README.md create mode 100644 app/templates/clash/default.yml create mode 100644 app/templates/filters.py create mode 100644 app/templates/home/index.html create mode 100644 app/templates/singbox/README.md create mode 100644 app/templates/singbox/default.json create mode 100644 app/templates/subscription/index.html create mode 100644 app/templates/user_agent/default.json create mode 100644 app/templates/user_agent/grpc.json create mode 100644 app/templates/xray/README.md create mode 100644 app/templates/xray/default.json create mode 100644 app/utils/crypto.py create mode 100644 app/utils/helpers.py create mode 100644 app/utils/jwt.py create mode 100644 app/utils/logger.py create mode 100644 app/utils/responses.py create mode 100644 app/utils/store.py create mode 100644 app/utils/system.py create mode 100755 build_dashboard.sh create mode 100644 cli/README.md create mode 100644 cli/__init__.py create mode 100644 cli/admin.py create mode 100644 cli/main.py create mode 100644 cli/system.py create mode 100644 cli_wrapper.sh create mode 100644 config.py create mode 100644 dashboard/.env.example create mode 100644 dashboard/.gitignore create mode 100644 dashboard/.prettierrc.json create mode 100644 dashboard/README.md create mode 100644 dashboard/__init__.py create mode 100644 dashboard/build.zip create mode 100644 dashboard/bun.lock create mode 100644 dashboard/components.json create mode 100644 dashboard/custom.d.ts create mode 100644 dashboard/eslint.config.js create mode 100644 dashboard/index.html create mode 100644 dashboard/orval.config.ts create mode 100644 dashboard/package-lock.json create mode 100644 dashboard/package.json create mode 100644 dashboard/public/statics/favicon/android-chrome-192x192.png create mode 100644 dashboard/public/statics/favicon/android-chrome-512x512.png create mode 100644 dashboard/public/statics/favicon/apple-touch-icon.png create mode 100644 dashboard/public/statics/favicon/favicon.ico create mode 100644 dashboard/public/statics/favicon/logo-dark.png create mode 100644 dashboard/public/statics/favicon/logo-pwa.png create mode 100644 dashboard/public/statics/favicon/logo.png create mode 100644 dashboard/public/statics/favicon/mstile-150x150.png create mode 100644 dashboard/public/statics/favicon/mstile-310x310.png create mode 100644 dashboard/public/statics/favicon/mstile-70x70.png create mode 100644 dashboard/public/statics/locales/en.json create mode 100644 dashboard/public/statics/locales/fa.json create mode 100644 dashboard/public/statics/locales/ru.json create mode 100644 dashboard/public/statics/locales/zh.json create mode 100644 dashboard/react-router.config.ts create mode 100644 dashboard/src/App.tsx create mode 100644 dashboard/src/assets/react.svg create mode 100644 dashboard/src/components/ActionButtons.tsx create mode 100644 dashboard/src/components/AdminStatistics.tsx create mode 100644 dashboard/src/components/AdminStatusBadge.tsx create mode 100644 dashboard/src/components/CopyButton.tsx create mode 100644 dashboard/src/components/Footer.tsx create mode 100644 dashboard/src/components/Language.tsx create mode 100644 dashboard/src/components/LineCountFilter.tsx create mode 100644 dashboard/src/components/LoadingSpinner.tsx create mode 100644 dashboard/src/components/OnlineBadge.tsx create mode 100644 dashboard/src/components/OnlineStatus.tsx create mode 100644 dashboard/src/components/PageTransition.tsx create mode 100644 dashboard/src/components/RouteGuard.tsx create mode 100644 dashboard/src/components/SinceLogsFilter.tsx create mode 100644 dashboard/src/components/Statistics.tsx create mode 100644 dashboard/src/components/StatusBadge.tsx create mode 100644 dashboard/src/components/StatusLogsFilter.tsx create mode 100644 dashboard/src/components/TerminalLine.tsx create mode 100644 dashboard/src/components/TopLoadingBar.tsx create mode 100644 dashboard/src/components/UsageSliderCompact.tsx create mode 100644 dashboard/src/components/UsersStatistics.tsx create mode 100644 dashboard/src/components/admins/AdminsTable.tsx create mode 100644 dashboard/src/components/admins/columns.tsx create mode 100644 dashboard/src/components/admins/data-table.tsx create mode 100644 dashboard/src/components/admins/filters.tsx create mode 100644 dashboard/src/components/bulk/SelectorPanel.tsx create mode 100644 dashboard/src/components/charts/AllNodesStackedBarChart.tsx create mode 100644 dashboard/src/components/charts/AreaCostumeChart.tsx create mode 100644 dashboard/src/components/charts/CostumeBarChart.tsx create mode 100644 dashboard/src/components/charts/EmptyState.tsx create mode 100644 dashboard/src/components/charts/TimeSelector.tsx create mode 100644 dashboard/src/components/common/AdminsSelector.tsx create mode 100644 dashboard/src/components/common/GroupsSelector.tsx create mode 100644 dashboard/src/components/common/TimeRangeSelector.tsx create mode 100644 dashboard/src/components/dashboard/DashboardAdminStatistics.tsx create mode 100644 dashboard/src/components/dashboard/DashboardStatistics.tsx create mode 100644 dashboard/src/components/dashboard/admin-statistics-card.tsx create mode 100644 dashboard/src/components/dashboard/data-usage-chart.tsx create mode 100644 dashboard/src/components/dashboard/users-statistics-card.tsx create mode 100644 dashboard/src/components/dialogs/AdminModal.tsx create mode 100644 dashboard/src/components/dialogs/AdvanceSearchModal.tsx create mode 100644 dashboard/src/components/dialogs/CoreConfigModal.tsx create mode 100644 dashboard/src/components/dialogs/GroupModal.tsx create mode 100644 dashboard/src/components/dialogs/HostModal.tsx create mode 100644 dashboard/src/components/dialogs/NodeModal.tsx create mode 100644 dashboard/src/components/dialogs/QRCodeModal.tsx create mode 100644 dashboard/src/components/dialogs/SetOwnerModal.tsx create mode 100644 dashboard/src/components/dialogs/ShortcutsModal.tsx create mode 100644 dashboard/src/components/dialogs/UsageModal.tsx create mode 100644 dashboard/src/components/dialogs/UserModal.tsx create mode 100644 dashboard/src/components/dialogs/UserOnlineStatsModal.tsx create mode 100644 dashboard/src/components/dialogs/UserSubscriptionClientsModal.tsx create mode 100644 dashboard/src/components/dialogs/UserTemplateModal.tsx create mode 100644 dashboard/src/components/github-star.tsx create mode 100644 dashboard/src/components/groups/Group.tsx create mode 100644 dashboard/src/components/groups/Groups.tsx create mode 100644 dashboard/src/components/hosts/Hosts.tsx create mode 100644 dashboard/src/components/hosts/SortableHost.tsx create mode 100644 dashboard/src/components/layout/sidebar-toggle.tsx create mode 100644 dashboard/src/components/layout/sidebar.tsx create mode 100644 dashboard/src/components/nav-main.tsx create mode 100644 dashboard/src/components/nav-secondary.tsx create mode 100644 dashboard/src/components/nav-user.tsx create mode 100644 dashboard/src/components/nodes/Node.tsx create mode 100644 dashboard/src/components/nodes/Nodes.tsx create mode 100644 dashboard/src/components/page-header.tsx create mode 100644 dashboard/src/components/settings/Core.tsx create mode 100644 dashboard/src/components/settings/Cores.tsx create mode 100644 dashboard/src/components/settings/Logs.tsx create mode 100644 dashboard/src/components/spinner.tsx create mode 100644 dashboard/src/components/statistics/Statistics.tsx create mode 100644 dashboard/src/components/statistics/SystemStatisticsSection.tsx create mode 100644 dashboard/src/components/statistics/UserStatisticsSection.tsx create mode 100644 dashboard/src/components/templates/UserTemplate.tsx create mode 100644 dashboard/src/components/theme-provider.tsx create mode 100644 dashboard/src/components/theme-toggle.tsx create mode 100644 dashboard/src/components/ui/accordion.tsx create mode 100644 dashboard/src/components/ui/alert-dialog.tsx create mode 100644 dashboard/src/components/ui/alert.tsx create mode 100644 dashboard/src/components/ui/avatar.tsx create mode 100644 dashboard/src/components/ui/badge.tsx create mode 100644 dashboard/src/components/ui/breadcrumb.tsx create mode 100644 dashboard/src/components/ui/button.tsx create mode 100644 dashboard/src/components/ui/calendar.tsx create mode 100644 dashboard/src/components/ui/card.tsx create mode 100644 dashboard/src/components/ui/carousel.tsx create mode 100644 dashboard/src/components/ui/chart.tsx create mode 100644 dashboard/src/components/ui/checkbox.tsx create mode 100644 dashboard/src/components/ui/collapsible.tsx create mode 100644 dashboard/src/components/ui/command.tsx create mode 100644 dashboard/src/components/ui/dialog.tsx create mode 100644 dashboard/src/components/ui/drawer.tsx create mode 100644 dashboard/src/components/ui/dropdown-menu.tsx create mode 100644 dashboard/src/components/ui/form.tsx create mode 100644 dashboard/src/components/ui/hover-card.tsx create mode 100644 dashboard/src/components/ui/input.tsx create mode 100644 dashboard/src/components/ui/label.tsx create mode 100644 dashboard/src/components/ui/loader-button.tsx create mode 100644 dashboard/src/components/ui/pagination.tsx create mode 100644 dashboard/src/components/ui/password-input.tsx create mode 100644 dashboard/src/components/ui/persian-calendar.tsx create mode 100644 dashboard/src/components/ui/popover.tsx create mode 100644 dashboard/src/components/ui/progress.tsx create mode 100644 dashboard/src/components/ui/radio-group.tsx create mode 100644 dashboard/src/components/ui/scroll-area.tsx create mode 100644 dashboard/src/components/ui/select.tsx create mode 100644 dashboard/src/components/ui/separator.tsx create mode 100644 dashboard/src/components/ui/sheet.tsx create mode 100644 dashboard/src/components/ui/sidebar.tsx create mode 100644 dashboard/src/components/ui/skeleton.tsx create mode 100644 dashboard/src/components/ui/sonner.tsx create mode 100644 dashboard/src/components/ui/switch.tsx create mode 100644 dashboard/src/components/ui/table.tsx create mode 100644 dashboard/src/components/ui/tabs.tsx create mode 100644 dashboard/src/components/ui/textarea.tsx create mode 100644 dashboard/src/components/ui/toggle-group.tsx create mode 100644 dashboard/src/components/ui/toggle.tsx create mode 100644 dashboard/src/components/ui/tooltip.tsx create mode 100644 dashboard/src/components/users/columns.tsx create mode 100644 dashboard/src/components/users/data-table.tsx create mode 100644 dashboard/src/components/users/filters.tsx create mode 100644 dashboard/src/components/users/users-table.tsx create mode 100644 dashboard/src/constants/Project.ts create mode 100644 dashboard/src/constants/Proxies.ts create mode 100644 dashboard/src/constants/UserSettings.ts create mode 100644 dashboard/src/entry.client.tsx create mode 100644 dashboard/src/hooks/use-admin.ts create mode 100644 dashboard/src/hooks/use-clipboard.ts create mode 100644 dashboard/src/hooks/use-dir-detection.tsx create mode 100644 dashboard/src/hooks/use-dynamic-errors.ts create mode 100644 dashboard/src/hooks/use-mobile.tsx create mode 100644 dashboard/src/hooks/use-store.ts create mode 100644 dashboard/src/hooks/use-toast.ts create mode 100644 dashboard/src/hooks/use-top-loading-bar.ts create mode 100644 dashboard/src/index.css create mode 100644 dashboard/src/lib/dayjs.ts create mode 100644 dashboard/src/lib/menu-list.ts create mode 100644 dashboard/src/lib/utils.ts create mode 100644 dashboard/src/locales/i18n.ts create mode 100644 dashboard/src/pages/_dashboard._index.tsx create mode 100644 dashboard/src/pages/_dashboard.admins.tsx create mode 100644 dashboard/src/pages/_dashboard.bulk.data.tsx create mode 100644 dashboard/src/pages/_dashboard.bulk.expire.tsx create mode 100644 dashboard/src/pages/_dashboard.bulk.groups.tsx create mode 100644 dashboard/src/pages/_dashboard.bulk.proxy.tsx create mode 100644 dashboard/src/pages/_dashboard.bulk.tsx create mode 100644 dashboard/src/pages/_dashboard.groups.tsx create mode 100644 dashboard/src/pages/_dashboard.hosts.tsx create mode 100644 dashboard/src/pages/_dashboard.nodes._index.tsx create mode 100644 dashboard/src/pages/_dashboard.nodes.cores.tsx create mode 100644 dashboard/src/pages/_dashboard.nodes.logs.tsx create mode 100644 dashboard/src/pages/_dashboard.nodes.tsx create mode 100644 dashboard/src/pages/_dashboard.settings.cleanup.tsx create mode 100644 dashboard/src/pages/_dashboard.settings.discord.tsx create mode 100644 dashboard/src/pages/_dashboard.settings.general.tsx create mode 100644 dashboard/src/pages/_dashboard.settings.notifications.tsx create mode 100644 dashboard/src/pages/_dashboard.settings.subscriptions.tsx create mode 100644 dashboard/src/pages/_dashboard.settings.telegram.tsx create mode 100644 dashboard/src/pages/_dashboard.settings.theme.tsx create mode 100644 dashboard/src/pages/_dashboard.settings.tsx create mode 100644 dashboard/src/pages/_dashboard.settings.webhook.tsx create mode 100644 dashboard/src/pages/_dashboard.statistics.tsx create mode 100644 dashboard/src/pages/_dashboard.templates.tsx create mode 100644 dashboard/src/pages/_dashboard.tsx create mode 100644 dashboard/src/pages/_dashboard.users.tsx create mode 100644 dashboard/src/pages/login.tsx create mode 100644 dashboard/src/router.tsx create mode 100644 dashboard/src/service/api/index.ts create mode 100644 dashboard/src/service/http.ts create mode 100644 dashboard/src/sw-register.ts create mode 100644 dashboard/src/utils/authStorage.ts create mode 100644 dashboard/src/utils/dateFormatter.tsx create mode 100644 dashboard/src/utils/formatByte.ts create mode 100644 dashboard/src/utils/isEmptyObject.ts create mode 100644 dashboard/src/utils/logsUtils.ts create mode 100644 dashboard/src/utils/query-client.ts create mode 100644 dashboard/src/utils/react-query.ts create mode 100644 dashboard/src/utils/userAgentParser.ts create mode 100644 dashboard/src/utils/userPreferenceStorage.ts create mode 100644 dashboard/src/vite-env.d.ts create mode 100644 dashboard/tailwind.config.js create mode 100644 dashboard/tsconfig.app.json create mode 100644 dashboard/tsconfig.json create mode 100644 dashboard/tsconfig.node.json create mode 100644 dashboard/vite.config.mts create mode 100644 docker-compose.yml create mode 100755 install_service.sh create mode 100644 main.py create mode 100644 pasarguard-cli.py create mode 100644 pasarguard-tui.py create mode 100644 pyproject.toml create mode 100644 pytest.ini create mode 100644 start.sh create mode 100644 tests/api/__init__.py create mode 100644 tests/api/conftest.py create mode 100644 tests/api/test_a_admin.py create mode 100644 tests/api/test_b_core.py create mode 100644 tests/api/test_c_group.py create mode 100644 tests/api/test_d_host.py create mode 100644 tests/api/test_e_user.py create mode 100644 tests/api/test_f_user_template.py create mode 100644 tests/api/test_g_bulk.py create mode 100644 tests/api/test_h_system.py create mode 100644 tests/conftest.py create mode 100644 tui/README.md create mode 100644 tui/__init__.py create mode 100644 tui/admin.py create mode 100644 tui/help.py create mode 100644 tui/style.tcss create mode 100644 tui_wrapper.sh create mode 100644 uv.lock diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 000000000..8c690bf3c --- /dev/null +++ b/.dockerignore @@ -0,0 +1,24 @@ +**/node_modules +*.log +*.md +*.pyc +*.pyd +*.pyo +.docker* +.env* +.git* +.idea +.vscode +Dockerfile* +__pycache__ +db.sqlite3 +db.sqlite3-journal +docker-compose*.yml +v2ray-core +xray-core +tests +venv* +.venv* +LICENSE +install_service.sh +Marzban.code-workspace diff --git a/.env.example b/.env.example new file mode 100644 index 000000000..9194bdbe5 --- /dev/null +++ b/.env.example @@ -0,0 +1,66 @@ +UVICORN_HOST = "0.0.0.0" +UVICORN_PORT = 8000 +# ALLOWED_ORIGINS=http://localhost,http://localhost:8000,http://example.com + +## We highly recommend add admin using `pasarguard cli` tool and do not use +## the following variables which is somehow hard codded infrmation. +# SUDO_USERNAME = "admin" +# SUDO_PASSWORD = "admin" + +# UVICORN_UDS = "/run/pasarguard.socket" +# UVICORN_SSL_CERTFILE = "/var/lib/pasarguard/certs/example.com/fullchain.pem" +# UVICORN_SSL_KEYFILE = "/var/lib/pasarguard/certs/example.com/key.pem" +# UVICORN_SSL_CA_TYPE = "public" + +# DASHBOARD_PATH = "/dashboard/" + +# SUBSCRIPTION_PATH = "sub" +# USER_SUBSCRIPTION_CLIENTS_LIMIT = 10 + +# CUSTOM_TEMPLATES_DIRECTORY="/var/lib/pasarguard/templates/" +# CLASH_SUBSCRIPTION_TEMPLATE="clash/my-custom-template.yml" +# SUBSCRIPTION_PAGE_TEMPLATE="subscription/index.html" +# HOME_PAGE_TEMPLATE="home/index.html" +# XRAY_SUBSCRIPTION_TEMPLATE="xray/default.json" +# SINGBOX_SUBSCRIPTION_TEMPLATE="singbox/default.json" + +## External config to import into v2ray format subscription +# EXTERNAL_CONFIG = "config://..." + +# SQLALCHEMY_DATABASE_URL = "sqlite+aiosqlite:///db.sqlite3" +# SQLALCHEMY_DATABASE_URL="postgresql+asyncpg://postgres:DB_PASSWORD@localhost:5432/pasarguard" +# SQLALCHEMY_DATABASE_URL="mysql+asyncmy://root:DB_PASSWORD@127.0.0.1/pasarguard" +# SQLALCHEMY_POOL_SIZE = 10 +# SQLALCHEMY_MAX_OVERFLOW = 30 + +### Use negative values to disable auto-delete by default +# USERS_AUTODELETE_DAYS = -1 +# USER_AUTODELETE_INCLUDE_LIMITED_ACCOUNTS = false + +### for developers +# DOCS=True +# DEBUG=True +# DO_NOT_LOG_TELEGRAM_BOT=True +# SAVE_LOGS_TO_FILE=False +# LOG_FILE_PATH="pasarguard.log" +# LOG_BACKUP_COUNT=72 +# LOG_ROTATION_ENABLED=False +# LOG_ROTATION_INTERVAL=1 +# LOG_ROTATION_UNIT="H" # "S", "M", "H", "D", "W0"-"W6", "midnight" +# LOG_MAX_BYTES=10485760 # 10 MB +# ECHO_SQL_QUERIES=False +# VITE_BASE_API="https://example.com/" +# JWT_ACCESS_TOKEN_EXPIRE_MINUTES = 1440 + +# due to high amount of data, this job is only available for postgresql and timescaledb +# ENABLE_RECORDING_NODES_STATS = False + +# JOB_CORE_HEALTH_CHECK_INTERVAL = 10 +# JOB_RECORD_NODE_USAGES_INTERVAL = 30 +# JOB_RECORD_USER_USAGES_INTERVAL = 10 +# JOB_REVIEW_USERS_INTERVAL = 10 +# JOB_SEND_NOTIFICATIONS_INTERVAL = 30 +# JOB_GHATER_NODES_STATS_INTERVAL = 25 +# JOB_REMOVE_OLD_INBOUNDS_INTERVAL = 600 +# JOB_REMOVE_EXPIRED_USERS_INTERVAL = 3600 +# JOB_RESET_USER_DATA_USAGE_INTERVAL = 600 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..3c3288210 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,10 @@ +# Ignore frontend files for language detection +dashboard/** linguist-vendored +*.ts linguist-vendored +*.tsx linguist-vendored +*.js linguist-vendored +*.jsx linguist-vendored + +# Emphasize Python files +*.py linguist-detectable +app/** linguist-detectable diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 000000000..d349818af --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,33 @@ +--- +name: Bug report +about: Create a report to help us improve +title: Bug title +labels: bug +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Machine details (please complete the following information):** + - OS: [e.g. ubuntu 20] +- Python version: [e.g 3.8] +- Nodejs version: [e.g 16.17] +- Browser [e.g. chrome, safari] + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 000000000..6819cf2c4 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: Feature title +labels: enhancement +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/.github/workflows/api-codeql.yml b/.github/workflows/api-codeql.yml new file mode 100644 index 000000000..6da610e83 --- /dev/null +++ b/.github/workflows/api-codeql.yml @@ -0,0 +1,48 @@ +name: "API CodeQL" + +on: + push: + branches: + - "*" + paths-ignore: + - "dashboard/**" + pull_request: + branches: + - "*" + paths-ignore: + - "dashboard/**" + schedule: + - cron: "0 11 * * 3" + +jobs: + analyze: + name: Analyze + runs-on: "ubuntu-latest" + timeout-minutes: 120 + permissions: + security-events: write + actions: read + contents: read + + strategy: + fail-fast: false + matrix: + language: + - "python" + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Initialize CodeQL + uses: github/codeql-action/init@v3 + with: + languages: ${{ matrix.language }} + + - name: Autobuild + uses: github/codeql-action/autobuild@v3 + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v3 + with: + category: "/language:${{matrix.language}}" diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 000000000..9b8497da9 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,140 @@ +name: Build-Docker + +on: + release: + types: [created] + +env: + IMAGE: pasarguard/${{ github.event.repository.name }}:${{ github.ref_name }} + GHCR_IMAGE: ghcr.io/pasarguard/${{ github.event.repository.name }}:${{ github.ref_name }} + IMAGE_LATEST: pasarguard/${{ github.event.repository.name }}:latest + GHCR_IMAGE_LATEST: ghcr.io/pasarguard/${{ github.event.repository.name }}:latest + +jobs: + build-dashboard: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Bun + uses: oven-sh/setup-bun@v2 + with: + bun-version: latest + + - name: Install dependencies + working-directory: ./dashboard + run: bun install --frozen-lockfile + + - name: Build dashboard + run: ./build_dashboard.sh + + - name: Upload dashboard build + uses: actions/upload-artifact@v4 + with: + name: dashboard-build + path: ./dashboard/build/ + retention-days: 1 + + build-images: + needs: build-dashboard + strategy: + matrix: + arch: [amd64, arm64] + include: + - arch: amd64 + platform: linux/amd64 + runner: ubuntu-24.04 + - arch: arm64 + platform: linux/arm64 + runner: ubuntu-24.04-arm + runs-on: ${{ matrix.runner }} + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Download dashboard build + uses: actions/download-artifact@v4 + with: + name: dashboard-build + path: ./dashboard/build/ + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build and push ${{ matrix.arch }} image + uses: docker/build-push-action@v6 + with: + context: . + platforms: ${{ matrix.platform }} + push: true + file: ./Dockerfile + tags: | + ${{ env.IMAGE }}-${{ matrix.arch }} + ${{ env.GHCR_IMAGE }}-${{ matrix.arch }} + cache-from: type=gha + cache-to: type=gha,mode=max + + push-manifest: + needs: [build-images] + runs-on: ubuntu-latest + steps: + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Create tagged manifest + uses: int128/docker-manifest-create-action@v2 + with: + tags: ${{ env.IMAGE }} + sources: | + ${{ env.IMAGE }}-amd64 + ${{ env.IMAGE }}-arm64 + + - name: Create tagged manifest for GitHub + uses: int128/docker-manifest-create-action@v2 + with: + tags: ${{ env.GHCR_IMAGE }} + sources: | + ${{ env.GHCR_IMAGE }}-amd64 + ${{ env.GHCR_IMAGE }}-arm64 + + - name: Create latest manifest if not prerelease + if: ${{ github.event.release.prerelease != true }} + uses: int128/docker-manifest-create-action@v2 + with: + tags: ${{ env.IMAGE_LATEST }} + sources: | + ${{ env.IMAGE }}-amd64 + ${{ env.IMAGE }}-arm64 + + - name: Create latest manifest for GitHub if not prerelease + if: ${{ github.event.release.prerelease != true }} + uses: int128/docker-manifest-create-action@v2 + with: + tags: ${{ env.GHCR_IMAGE_LATEST }} + sources: | + ${{ env.GHCR_IMAGE }}-amd64 + ${{ env.GHCR_IMAGE }}-arm64 \ No newline at end of file diff --git a/.github/workflows/frontend-codeql.yml b/.github/workflows/frontend-codeql.yml new file mode 100644 index 000000000..f549b9fef --- /dev/null +++ b/.github/workflows/frontend-codeql.yml @@ -0,0 +1,48 @@ +name: "Frontend CodeQL" + +on: + push: + branches: + - "*" + paths: + - "dashboard/**" + pull_request: + branches: + - "*" + paths: + - "dashboard/**" + schedule: + - cron: "0 11 * * 3" + +jobs: + analyze: + name: Analyze + runs-on: "ubuntu-latest" + timeout-minutes: 120 + permissions: + security-events: write + actions: read + contents: read + + strategy: + fail-fast: false + matrix: + language: + - "javascript-typescript" + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Initialize CodeQL + uses: github/codeql-action/init@v3 + with: + languages: ${{ matrix.language }} + + - name: Autobuild + uses: github/codeql-action/autobuild@v3 + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v3 + with: + category: "/language:${{matrix.language}}" diff --git a/.github/workflows/ruff-check.yml b/.github/workflows/ruff-check.yml new file mode 100644 index 000000000..9d7b57dd2 --- /dev/null +++ b/.github/workflows/ruff-check.yml @@ -0,0 +1,33 @@ +name: Code Format Checker +on: + push: + branches: + - "*" + paths: + - "**/*.py" + + pull_request: + branches: + - "*" + paths: + - "**/*.py" + +jobs: + ruff: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: "3.12" + + - name: Install Ruff + run: | + python -m pip install --upgrade pip + pip install ruff + - name: Run Ruff Format + run: | + ruff check --output-format=github . diff --git a/.github/workflows/test-database-migrations.yml b/.github/workflows/test-database-migrations.yml new file mode 100644 index 000000000..ecab8d487 --- /dev/null +++ b/.github/workflows/test-database-migrations.yml @@ -0,0 +1,103 @@ +name: Test Database Migrations + +on: + push: + paths: + - "**.py" + pull_request: + paths: + - "**.py" + +jobs: + test-databases: + runs-on: ubuntu-latest + services: + postgres: + image: postgres:latest + env: + POSTGRES_PASSWORD: postgres + POSTGRES_DB: testdb + ports: + - 5432:5432 + options: >- + --health-cmd="pg_isready" + --health-interval=10s + --health-timeout=5s + --health-retries=5 + timescaledb: + image: timescale/timescaledb:latest-pg17 + env: + POSTGRES_PASSWORD: timescale + POSTGRES_DB: testdb + ports: + - 5433:5432 + options: >- + --health-cmd="pg_isready" + --health-interval=10s + --health-timeout=5s + --health-retries=5 + mysql: + image: mysql:latest + env: + MYSQL_ROOT_PASSWORD: root + MYSQL_DATABASE: testdb + ports: + - 3306:3306 + options: >- + --health-cmd="mysqladmin ping -hlocalhost -uroot -proot" + --health-interval=10s + --health-timeout=5s + --health-retries=5 + mariadb: + image: mariadb:10.6 + env: + MYSQL_ROOT_PASSWORD: root + MYSQL_DATABASE: testdb + MYSQL_USER: testuser + MYSQL_PASSWORD: testpassword + ports: + - 3307:3306 + options: >- + --health-cmd "mysqladmin ping -h localhost -u testuser --password=testpassword" + --health-interval=10s + --health-timeout=5s + --health-retries=5 + + strategy: + matrix: + db: [sqlite, postgres, timescaledb, mysql, mariadb] + include: + - db: sqlite + url: sqlite+aiosqlite:///./test.db + + - db: postgres + url: postgresql+asyncpg://postgres:postgres@localhost:5432/testdb + + - db: timescaledb + url: postgresql+asyncpg://postgres:timescale@localhost:5433/testdb + + - db: mysql + url: mysql+asyncmy://root:root@localhost:3306/testdb + + - db: mariadb + url: mysql+asyncmy://testuser:testpassword@localhost:3307/testdb + + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: "3.12" + + - name: Set DATABASE_URL + run: | + echo "TEST_FROM=github" >> $GITHUB_ENV + echo "SQLALCHEMY_DATABASE_URL=${{ matrix.url }}" >> $GITHUB_ENV + + - name: Install dependencies + run: make setup + + - name: Run Alembic Migrations + run: make run-migration + + - name: Run Tests + run: make test diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..c2945ec84 --- /dev/null +++ b/.gitignore @@ -0,0 +1,170 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +*.sqlite3 +*.sqlite3-journal +*.db + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +.python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.venv +venv/ +venv.bak/ +.vscode/ +.cursor/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +.idea/ + +.env +v2ray-core +xray-core + +# don't track custom/dev.json/yaml/yml configs, such as xray-custom.json or clash-dev.yaml +*-custom.json +*-custom.yaml +*-custom.yml +*-dev.json +*-dev.yml +*-dev.yaml +*-debug.* +*-test.* + +*Zone.Identifier +.DS_Store + +#ignore node-module for dashboard +node_modules/ +deadlock-analysis.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 000000000..e08f0f67d --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,150 @@ +# Contribute to PasarGuard + +Thanks for considering contributing to **PasarGuard**! + +## 🙋 Questions + +Please **don’t use GitHub Issues** to ask questions. Instead, use one of the following platforms: + +- 💬 Telegram: [@Pasar_Guard](https://t.me/pasar_guard) +- 🗣️ GitHub Discussions: [PasarGuard Discussions](https://github.com/pasarguard/panel/discussions) + +## 🐞 Reporting Issues + +When reporting a bug or issue, please include: + +- ✅ What you expected to happen +- ❌ What actually happened (include server logs or browser errors) +- ⚙️ Your `xray` JSON config and `.env` settings (censor sensitive info) +- 🔢 Your PasarGuard version and Docker version (if applicable) + +--- + +# 🚀 Submitting a Pull Request + +If there's no open issue for your idea, consider opening one for discussion **before submitting a PR**. + +You can contribute to any issue that: + +- Has no PR linked +- Has no maintainer assigned + +No need to ask for permission! + +## 🔀 Branching Strategy + +- Always branch off of the `next` branch +- Keep `main` stable and production-ready + +--- + +# 📁 Project Structure + +```text +. +├── app # Backend code (FastAPI - Python) +├── cli # CLI code (Typer - Python) +├── tui # TUI code (Textual - Python) +├── dashboard # Frontend code (React - TypeScript) +└── tests # API tests +``` + +--- + +## 🧠 Backend (FastAPI) + +The backend is built with **FastAPI** and **SQLAlchemy**: + +- **Pydantic models**: `app/models` +- **Database models & operations**: `app/db` +- **backend logic should go in**: `app/operations` +- **Migrations (Alembic)**: `app/db/migrations` + +🧩 **Note**: Ensure **all backend logic is organized and implemented in the `operations` module**. This keeps route handling, database access, and service logic clearly separated and easier to maintain. + +### 📘 API Docs (Swagger / ReDoc) + +Enable the `DOCS` flag in your `.env` file to access: + +- Swagger UI: [http://localhost:8000/docs](http://localhost:8000/docs) +- ReDoc: [http://localhost:8000/redoc](http://localhost:8000/redoc) + +### 🎯 Code Formatting + +Format and lint code with: + +```bash +make check +make format +``` + +### 🗃️ Database Migrations + +To apply Alembic migrations to your database, run: + +```bash +make run-migration +``` + +--- + +## 💻 Frontend (React + Tailwind) + +> ⚠️ **We no longer upload pre-built frontend files.** + +The frontend is located in the `dashboard` directory and is built using: + +- **React + TypeScript** +- **Tailwind CSS (Shadcn UI)** + +To build: + +```bash +bun install +``` + +Remove the `dashboard/build` directory and restart the Python backend — the frontend will auto-rebuild (except in debug mode). + +### 🧩 Component Guidelines + +- Follow **Tailwind + Shadcn** best practices +- Keep components **single-purpose** +- Prioritize **readability** and **maintainability** + +--- + +## 🛠️ PasarGuard CLI + +PasarGuard’s CLI is built using [Typer](https://typer.tiangolo.com/). + +- CLI codebase: `cli/` + +--- + +## 🛠️ PasarGuard TUI + +PasarGuard’s TUI is built using [Textual](https://textual.textualize.io/). + +- TUI codebase: `tui/` + +--- + +## 🐛 Debug Mode + +To run the project in debug mode with auto-reload, you can set the environment variable DEBUG to true. then by running the main.py, the backend and frontend will run separately on different ports. + +Note that you must first install the necessary npm packages by running npm install inside the dashboard directory before running in debug mode. + +Install frontend dependencies: + +```bash +make install-front +``` + +Run the backend (`main.py`) + +> ⚠️ In debug mode, the frontend will **not rebuild automatically** if you delete `dashboard/build`. + +--- + +Feel free to reach out via [Telegram](https://t.me/pasar_guard) or GitHub Discussions if you have any questions. Happy contributing! 🚀 diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..62defc9a6 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,39 @@ +ARG PYTHON_VERSION=3.12 + +FROM ghcr.io/astral-sh/uv:python$PYTHON_VERSION-bookworm-slim AS builder +ENV UV_COMPILE_BYTECODE=1 UV_LINK_MODE=copy + +RUN apt-get update && apt-get install -y --no-install-recommends \ + gcc \ + python3-dev \ + libc6-dev \ + && rm -rf /var/lib/apt/lists/* + +ENV UV_PYTHON_DOWNLOADS=0 + +WORKDIR /build +RUN --mount=type=cache,target=/root/.cache/uv \ + --mount=type=bind,source=uv.lock,target=uv.lock \ + --mount=type=bind,source=pyproject.toml,target=pyproject.toml \ + uv sync --frozen --no-install-project --no-dev +ADD . /build +RUN --mount=type=cache,target=/root/.cache/uv \ + uv sync --frozen --no-dev + + +FROM python:$PYTHON_VERSION-slim-bookworm + +COPY --from=builder /build /code +WORKDIR /code + +ENV PATH="/code/.venv/bin:$PATH" + +COPY cli_wrapper.sh /usr/bin/pasarguard-cli +RUN chmod +x /usr/bin/pasarguard-cli + +COPY tui_wrapper.sh /usr/bin/pasarguard-tui +RUN chmod +x /usr/bin/pasarguard-tui + +RUN chmod +x /code/start.sh + +ENTRYPOINT ["/code/start.sh"] \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..425d0879d --- /dev/null +++ b/LICENSE @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 21 January 2023 + + Copyright (C) 2023 Gozargah organization. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/Makefile b/Makefile new file mode 100644 index 000000000..d5c913da9 --- /dev/null +++ b/Makefile @@ -0,0 +1,142 @@ +# Makefile to check and set up Python 3.12 and a virtual environment + +PYTHON_VERSION=3.12 +VENV_DIR=.venv + +# Check if Python 3.12 is installed, if not, install it +.PHONY: check-python +check-python: + @if ! python${PYTHON_VERSION} --version | grep -q "$(PYTHON_VERSION)"; then \ + echo "Python $(PYTHON_VERSION) is not installed. Installing..."; \ + sudo add-apt-repository -y ppa:deadsnakes/ppa && sudo apt update && sudo apt install -y python$(PYTHON_VERSION) python$(PYTHON_VERSION)-venv || { \ + echo "Failed to install Python $(PYTHON_VERSION). Please install it manually."; \ + exit 1; \ + }; \ + else \ + echo "Python $(PYTHON_VERSION) is installed."; \ + fi + +.PHONY: install_uv +install_uv: + @if ! uv --help >/dev/null 2>&1; then \ + echo "uv not found. Installing..."; \ + curl -LsSf https://astral.sh/uv/install.sh | sh; \ + echo "uv installed. Ensure ~/.cargo/bin is in your PATH."; \ + else \ + echo "uv is already installed."; \ + fi + +# Install Python dependencies from pyproject.toml +.PHONY: requirements +requirements: + @uv sync + +# Check if nvm is installed, if not, install it +.PHONY: check-nvm +check-nvm: + @if ! command -v nvm > /dev/null 2>&1; then \ + echo "nvm not found. Installing..."; \ + curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash || { \ + echo "Failed to install nvm. Please install it manually."; \ + exit 1; \ + }; \ + export NVM_DIR="$$HOME/.nvm"; \ + [ -s "$$NVM_DIR/nvm.sh" ] && . "$$NVM_DIR/nvm.sh"; \ + [ -s "$$NVM_DIR/bash_completion" ] && . "$$NVM_DIR/bash_completion"; \ + echo "nvm installed. Version: `nvm --version`"; \ + else \ + echo "nvm is already installed. Version: `nvm --version`"; \ + fi + +# Check if nodejs is installed, if not, install it +.PHONY: check-nodejs +check-nodejs: check-nvm + @if ! node -v > /dev/null 2>&1; then \ + echo "nodejs not found. Installing..."; \ + nvm install 22 || { \ + echo "Failed to install nodejs. Please install it manually."; \ + exit 1; \ + }; \ + else \ + echo "nodejs is already installed."; \ + fi + +# Check if bun is installed, if not, install it +.PHONY: check-bun +check-bun: check-nodejs + @if ! bun --version > /dev/null 2>&1; then \ + echo "bun not found. Installing..."; \ + curl -fsSL https://bun.sh/install | bash || { \ + echo "Failed to install bun. Please install it manually."; \ + exit 1; \ + }; \ + else \ + echo "bun is already installed."; \ + fi + +# Install frontend dependencies (Node.js packages) +.PHONY: install-front +install-front: check-bun + @cd dashboard && bun install + +# Run database migrations using Alembic +.PHONY: run-migration +run-migration: + @uv run alembic upgrade head + +# run PasarGuard +.PHONY: run +run: + @uv run main.py + +# run pasarguard-cli +.PHONY: run-cli +run-cli: + @uv run pasarguard-cli.py + +# run pasarguard-tui +.PHONY: run-tui +run-tui: + @uv run pasarguard-tui.py + + +# Run tests +.PHONY: test +test: + @uv run pytest tests/ + +# Run tests-watch +.PHONY: test-whatch +test-whatch: + @uv run ptw + +# Run PasarGuard with watchfiles +.PHONY: run-watch +run-watch: + @echo "Running application with watchfiles..." + @uv run watchfiles --filter python "uv run main.py" . + +# Check code +.PHONY: check +check: + @uv run ruff check . + +# Format code +.PHONY: format +format: + @uv run ruff format . + +# Clean the environment +.PHONY: clean +clean: + @rm -rf $(VENV_DIR) + @echo "Virtual environment removed." + +# Setup environment: check Python, install uv, and sync requirements +.PHONY: setup +setup: check-python install_uv requirements + +# Format code (front-end) +.PHONY: fformat +fformat: + @cd dashboard && bun run prettier . --write diff --git a/PasarGuard.code-workspace b/PasarGuard.code-workspace new file mode 100644 index 000000000..dbcebcc9b --- /dev/null +++ b/PasarGuard.code-workspace @@ -0,0 +1,113 @@ +{ + "remote.extensionKind": { + "GitHub.copilot": [ + "ui" + ], + "GitHub.copilot-chat": [ + "ui" + ] + }, + "folders": [ + { + "path": "." + } + ], + "settings": { + "python.analysis.inlayHints.variableTypes": true, + "python.analysis.autoImportCompletions": true, + "python.analysis.completeFunctionParens": true, + "python.analysis.inlayHints.pytestParameters": true, + "python.analysis.inlayHints.callArgumentNames": "all", + "python.analysis.inlayHints.functionReturnTypes": true, + "ruff.enable": true, + "ruff.format.preview": true, + "ruff.fixAll": true, + "ruff.organizeImports": true, + "ruff.showSyntaxErrors": true, + "[python]": { + "editor.defaultFormatter": "charliermarsh.ruff", + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.fixAll.ruff": "explicit", + "source.organizeImports.ruff": "explicit" + } + }, + "editor.codeActionsOnSave": { + "source.organizeImports": "never" + }, + "remote.localPortHost": "allInterfaces", + "[javascript]": { + "javascript.autoClosingTags": true, + "editor.codeActionsOnSave": { + "source.fixAll": "never", + "source.fixAll.eslint": "explicit", + "source.organizeImports": "explicit" + }, + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[javascriptreact]": { + "editor.codeActionsOnSave": { + "source.fixAll": "never", + "source.fixAll.eslint": "explicit", + "source.organizeImports": "explicit" + }, + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[typescript]": { + "typescript.autoClosingTags": true, + "typescript.suggest.enabled": true, + "editor.codeActionsOnSave": { + "source.fixAll": "never", + "source.fixAll.eslint": "explicit", + "source.organizeImports": "explicit" + }, + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[typescriptreact]": { + "editor.codeActionsOnSave": { + "source.fixAll": "never", + "source.fixAll.eslint": "explicit", + "source.organizeImports": "explicit" + }, + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "emmet.includeLanguages": { + "javascript": "javascriptreact" + }, + "css.enabledLanguages": [ + "html", + "jsx" + ], + "files.autoSave": "afterDelay", + "python.testing.pytestArgs": [ + "." + ], + "python.testing.unittestEnabled": false, + "python.testing.pytestEnabled": true + }, + "launch": { + "version": "0.2.0", + "configurations": [ + { + "name": "Python Debugger: Current File", + "type": "debugpy", + "request": "launch", + "program": "main.py", + "console": "integratedTerminal" + } + ], + "compounds": [] + }, + "extensions": { + "recommendations": [ + "donjayamanne.python-extension-pack", + "ms-vscode.vscode-typescript-next", + "yoavbls.pretty-ts-errors", + "dbaeumer.vscode-eslint", + "esbenp.prettier-vscode", + "charliermarsh.ruff", + "tamasfe.even-better-toml", + "Bar.python-import-helper" + ] + } +} \ No newline at end of file diff --git a/README-fa.md b/README-fa.md new file mode 100644 index 000000000..93de7b4f2 --- /dev/null +++ b/README-fa.md @@ -0,0 +1,449 @@ +

+ + + + + + +

+ +

پاسارگارد

+ +

+ راه حل یکپارچه برای مدیریت پروتکل های مختلف +

+ +
+

+ + + + + + + + + + + + + + + + + + +

+ +

+ + English + + / + + فارسی + + / + + 简体中文 + + / + + Русский + +

+ +

+ + Elk screenshots + +

+ +## فهرست مطالب + +- [بررسی اجمالی](#بررسی-اجمالی) + - [چرا پاسارگارد؟](#چرا-پاسارگارد) + - [امکانات](#امکانات) +- [راهنمای نصب](#راهنمای-نصب) +- [تنظیمات](#تنظیمات) +- [داکیومنت](#داکیومنت) +- [استفاده از API](#استفاده-از-api) +- [پشتیبان گیری از پاسارگارد](#پشتیبان-گیری-از-پاسارگارد) +- [ربات تلگرام](#ربات-تلگرام) +- [رابط خط فرمان (CLI) پاسارگارد](#رابط-خط-فرمان-cli-پاسارگارد) +- [نود](#نود) +- [ارسال اعلان‌ها به آدرس وبهوک](#ارسال-اعلانها-به-آدرس-وبهوک) +- [کمک مالی](#کمک-مالی) +- [لایسنس](#لایسنس) +- [مشارکت در توسعه](#مشارکت-در-توسعه) + +# بررسی اجمالی + +پاسارگارد یک نرم افزار (وب اپلیکیشن) مدیریت پروکسی است که امکان مدیریت چند صد حساب پروکسی را با قدرت و دسترسی بالا فراهم میکند. پاسارگارد از [Xray-core](https://github.com/XTLS/Xray-core) قدرت گرفته و با Python و React پیاده سازی شده است. + +## چرا پاسارگارد؟ + +پاسارگارد دارای یک رابط کاربری ساده است که قابلیت های زیادی دارد. پاسارگارد امکان ایجاد چند نوع پروکسی برای کاربر ها را فراهم میکند بدون اینکه به تنظیمات پیچیده ای نیاز داشته باشید. به کمک رابط کاربری تحت وب پاسارگارد، شما میتوانید کاربران را مانیتور، ویرایش و در صورت نیاز، محدود کنید. + +### امکانات + +- **رابط کاربری تحت وب** آماده +- به صورت **REST API** پیاده سازی شده +- پشتیبانی از پروتکل های **Vmess**, **VLESS**, **Trojan** و **Shadowsocks** +- امکان فعالسازی **چندین پروتکل** برای هر یوزر +- امکان ساخت **چندین کاربر** بر روی یک inbound +- پشتیبانی از **چندین inbound** بر روی **یک port** (به کمک fallbacks) +- محدودیت بر اساس مصرف **ترافیک** و **تاریخ انقضا** +- محدودیت **ترافیک دوره ای** (به عنوان مثال روزانه، هفتگی و غیره) +- پشتیبانی از **Subscription link** سازگار با **V2ray** _(مثل نرم افزار های V2RayNG, SingBox, Nekoray و...)_ و **Clash** +- ساخت **لینک اشتراک گذاری** و **QRcode** به صورت خودکار +- مانیتورینگ منابع سرور و **مصرف ترافیک** +- پشتیبانی از تنظیمات xray +- پشتیبانی از **TLS** +- **ربات تلگرام** +- **رابط خط فرمان (CLI)** داخلی +- قابلیت ایجاد **چندین مدیر** (تکمیل نشده است) + +# راهنمای نصب + +### ⚠️ دستورات زیر نسخه های پیش از انتشار (آلفا/بتا) را نصب می کنند + +با دستور زیر پاسارگارد را با دیتابیس SQLite نصب کنید: + +```bash +sudo bash -c "$(curl -sL https://github.com/PasarGuard/scripts/raw/main/pasarguard.sh)" @ install --pre-release +``` + +با دستور زیر پاسارگارد را با دیتابیس MySQL نصب کنید: + +```bash +sudo bash -c "$(curl -sL https://github.com/PasarGuard/scripts/raw/main/pasarguard.sh)" @ install --database mysql --pre-release +``` + +با دستور زیر پاسارگارد را با دیتابیس MariaDB نصب کنید: + +```bash +sudo bash -c "$(curl -sL https://github.com/PasarGuard/scripts/raw/main/pasarguard.sh)" @ install --database mariadb --pre-release +``` + +با دستور زیر پاسارگارد را با دیتابیس PostgreSQL نصب کنید: + +```bash +sudo bash -c "$(curl -sL https://github.com/PasarGuard/scripts/raw/main/pasarguard.sh)" @ install --database postgresql --pre-release +``` + +وقتی نصب تمام شد: + +- شما لاگ های پاسارگارد رو مشاهده میکنید که می‌توانید با بستن ترمینال یا فشار دادن `Ctrl+C` از آن خارج شوید +- فایل های پاسارگارد در پوشه `/opt/pasarguard` قرار می‌گیرند +- فایل تنظیمات در مسیر `/opt/pasarguard/.env` قرار می‌گیرد ([تنظیمات](#تنظیمات) را مشاهده کنید) +- فایل های مهم (اطلاعات) پاسارگارد در مسیر `/var/lib/pasarguard` قرار می‌گیرند + به دلایل امنیتی، داشبورد پاسارگارد از طریق آیپی قابل دسترسی نیست. بنابراین، باید برای دامنه خود [گواهی SSL](https://pasarguard.github.io/PasarGuard/fa/examples/issue-ssl-certificate) بگیرید و از طریق آدرس https://YOUR_DOMAIN:8000/dashboard/ وارد داشبورد پاسارگارد شوید (نام دامنه خود را جایگزین YOUR_DOMAIN کنید) +- همچنین می‌توانید از فوروارد کردن پورت SSH برای دسترسی لوکال به داشبورد پاسارگارد بدون دامنه استفاده کنید. نام کاربری و آیپی سرور خود را جایگزین `user@serverip` کنید و دستور زیر را اجرا کنید: + +```bash +ssh -L 8000:localhost:8000 user@serverip +``` + +در نهایت، می‌توانید لینک زیر را در مرورگر خود وارد کنید تا به داشبورد پاسارگارد دسترسی پیدا کنید: + +http://localhost:8000/dashboard/ + +به محض بستن ترمینال SSH، دسترسی شما به داشبورد قطع خواهد شد. بنابراین، این روش تنها برای تست کردن توصیه می‌شود. + +در مرحله بعد, باید یک ادمین سودو بسازید + +```bash +pasarguard cli admin create --sudo +``` + +تمام! حالا با این اطلاعات می‌توانید وارد پاسارگارد شوید + +برای مشاهده راهنمای اسکریپت پاسارگارد دستور زیر را اجرا کنید + +```bash +pasarguard --help +``` + +اگر مشتاق هستید که پاسارگارد رو با پایتون و به صورت دستی اجرا کنید، مراحل زیر را مشاهده کنید + +
+

نصب به صورت دستی (پیچیده)

+ +لطفا xray را نصب کنید. +شما میتواند به کمک [Xray-install](https://github.com/XTLS/Xray-install) این کار را انجام دهید. + +```bash +bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install +``` + +پروژه را clone کنید و dependency ها را نصب کنید. دقت کنید که نسخه پایتون شما Python>=3.12.7 باشد. + +```bash +git clone https://github.com/PasarGuard/panel.git +cd PasarGuard +curl -LsSf https://astral.sh/uv/install.sh | sh +uv sync +``` + +همچنین میتواند از [Python Virtualenv](https://pypi.org/project/virtualenv/) هم استفاده کنید. + +سپس کامند زیر را اجرا کنید تا دیتابیس تنظیم شود. + +```bash +uv run alembic upgrade head +``` + +اگر می خواهید از `PasarGuard-cli` استفاده کنید، باید آن را به یک فایل در `$PATH` خود لینک و قابل اجرا (executable) کنید. سپس تکمیل خودکار (auto-completion) آن را نصب کنید: + +```bash +sudo ln -s $(pwd)/PasarGuard-cli.py /usr/bin/pasarguard-cli +sudo chmod +x /usr/bin/pasarguard-cli +pasarguard-cli completion install +``` + +حالا یک کپی از `.env.example` با نام `.env` بسازید و با یک ادیتور آن را باز کنید و تنظیمات دلخواه خود را انجام دهید. یه عنوان مثال نام کاربری و رمز عبور را می توانید در این فایل تغییر دهید. + +```bash +cp .env.example .env +nano .env +``` + +> برای اطلاعات بیشتر بخش [تنظیمات](#تنظیمات) را مطالعه کنید. + +در انتها, پاسارگارد را به کمک دستور زیر اجرا کنید. + +```bash +uv run main.py +``` + +اجرا با استفاده از systemctl در لینوکس + +``` +systemctl enable /var/lib/pasarguard/PasarGuard.service +systemctl start PasarGuard +``` + +اجرا با nginx + +``` +server { + listen 443 ssl http2; + listen [::]:443 ssl http2; + server_name example.com; + + ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; + + location ~* /(dashboard|statics|sub|api|docs|redoc|openapi.json) { + proxy_pass http://0.0.0.0:8000; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } +} +``` + +or + +``` +server { + listen 443 ssl http2; + listen [::]:443 ssl http2; + server_name PasarGuard.example.com; + + ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; + + location / { + proxy_pass http://0.0.0.0:8000; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } +} +``` + +به صورت پیشفرض پاسارگارد در آدرس `http://localhost:8000/dashboard` اجرا میشود. شما میتوانید با تغییر `UVICORN_HOST` و `UVICORN_PORT`، هاست و پورت را تغییر دهید. + +
+ +# تنظیمات + +> متغیر های زیر در فایل ‍`env` یا `.env` استفاده میشوند. شما می توانید با تعریف و تغییر آن ها، تنظیمات پاسارگارد را تغییر دهید. + +| توضیحات | متغیر | +| -------------------------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------: | +| نام کاربری مدیر کل | SUDO_USERNAME | +| رمز عبور مدیر کل | SUDO_PASSWORD | +| آدرس دیتابیس ([بر اساس مستندات SQLAlchemy](https://docs.sqlalchemy.org/en/20/core/engines.html#database-urls)) | SQLALCHEMY_DATABASE_URL | +| (پیشفرض: `10`) | SQLALCHEMY_POOL_SIZE | +| (پیشفرض: `30`) | SQLALCHEMY_MAX_OVERFLOW | +| آدرس هاستی که پاسارگارد روی آن اجرا میشود (پیشفرض: `0.0.0.0`) | UVICORN_HOST | +| پورتی که پاسارگارد روی آن اجرا میشود (پیشفرض: `8000`) | UVICORN_PORT | +| اجرای پاسارگارد بر روی یک Unix domain socket | UVICORN_UDS | +| آدرس گواهی SSL به جهت ایمن کردن پنل پاسارگارد | UVICORN_SSL_CERTFILE | +| آدرس کلید گواهی SSL | UVICORN_SSL_KEYFILE | +| نوع گواهینامه مرجع SSL. از «خصوصی» برای آزمایش CA با امضای خود استفاده کنید (پیش‌فرض: `public`) | UVICORN_SSL_CA_TYPE | +| مسیر فایل json تنظیمات xray (پیشفرض: `xray_config.json`) | XRAY_JSON | +| مسیر باینری xray (پیشفرض: `/usr/local/bin/xray`) | XRAY_EXECUTABLE_PATH | +| مسیر asset های xray (پیشفرض: `/usr/local/share/xray`) | XRAY_ASSETS_PATH | +| پیشوند (یا هاست) آدرس های اشتراکی (زمانی کاربرد دارد که نیاز دارید دامنه subscription link ها با دامنه پنل متفاوت باشد) | XRAY_SUBSCRIPTION_URL_PREFIX | +| تگ inboundای که به عنوان fallback استفاده میشود. | XRAY_FALLBACKS_INBOUND_TAG | +| تگ های inbound ای که لازم نیست در کانفیگ های ساخته شده وجود داشته باشند. | XRAY_EXCLUDE_INBOUND_TAGS | +| آدرس محل template های شخصی سازی شده کاربر | CUSTOM_TEMPLATES_DIRECTORY | +| تمپلیت مورد استفاده برای تولید کانفیگ های Clash (پیشفرض: `clash/default.yml`) | CLASH_SUBSCRIPTION_TEMPLATE | +| تمپلیت صفحه اطلاعات اشتراک کاربر (پیشفرض `subscription/index.html`) | SUBSCRIPTION_PAGE_TEMPLATE | +| تمپلیت مورد استفاده برای تولید کانفیگ های xray (پیشفرض: `xray/default.yml`) | XRAY_SUBSCRIPTION_TEMPLATE | +| تمپلیت مورد استفاده برای تولید کانفیگ های singbox (پیشفرض: `singbox/default.yml`) | SINGBOX_SUBSCRIPTION_TEMPLATE | +| تمپلیت صفحه اول (پیشفرض: `home/index.html`) | HOME_PAGE_TEMPLATE | +| توکن ربات تلگرام (دریافت از [@botfather](https://t.me/botfather)) | TELEGRAM_API_TOKEN | +| آیدی عددی ادمین در تلگرام (دریافت از [@userinfobot](https://t.me/userinfobot)) | TELEGRAM_ADMIN_ID | +| اجرای ربات از طریق پروکسی | TELEGRAM_PROXY_URL | +| مدت زمان انقضا توکن دسترسی به پنل پاسارگارد, `0` به معنای بدون تاریخ انقضا است (پیشفرض: `1440`) | JWT_ACCESS_TOKEN_EXPIRE_MINUTES | +| فعال سازی داکیومنتیشن به آدرس `/docs` و `/redoc`(پیشفرض: `False`) | DOCS | +| فعالسازی حالت توسعه (development) (پیشفرض: `False`) | DEBUG | +| آدرس webhook که تغییرات حالت یک کاربر به آن ارسال می‌شوند. اگر این متغیر مقدار داشته باشد، ارسال پیام‌ها انجام می‌شوند. | WEBHOOK_ADDRESS | +| متغیری که به عنوان `x-webhook-secret` در header ارسال می‌شود. (پیشفرض: `None`) | WEBHOOK_SECRET | +| تعداد دفعاتی که برای ارسال یک پیام، در صورت تشخیص خطا در ارسال تلاش دوباره شود (پیشفرض `3`) | NUMBER_OF_RECURRENT_NOTIFICATIONS | +| مدت زمان بین هر ارسال دوباره پیام در صورت تشخیص خطا در ارسال به ثانیه (پیشفرض: `180`) | RECURRENT_NOTIFICATIONS_TIMEOUT | +| هنگام رسیدن مصرف کاربر به چه درصدی پیام اخطار به آدرس وبهوک ارسال شود (پیشفرض: `80`) | NOTIFY_REACHED_USAGE_PERCENT | +| چند روز مانده به انتهای سرویس پیام اخطار به آدرس وبهوک ارسال شود (پیشفرض: `3`) | NOTIFY_DAYS_LEFT | +| حذف خودکار کاربران منقضی شده (و بطور اختیاری محدود شده) پس از گذشت این تعداد روز (مقادیر منفی این قابلیت را به طور پیشفرض غیرفعال می کنند. پیشفرض: `-1`) | USERS_AUTODELETE_DAYS | +| تعیین اینکه کاربران محدودشده شامل حذف خودکار بشوند یا نه | USER_AUTODELETE_INCLUDE_LIMITED_ACCOUNTS | +| شما می توانید مسیر api خود را برای اشتراک تغییر دهید | XRAY_SUBSCRIPTION_PATH | +| با توجه به حجم بالای داده، این کار فقط برای postgresql و timescaledb در دسترس است | ENABLE_RECORDING_NODES_STATS | +| فعال کردن کانفیگ سفارشی JSON برای همه برنامه‌هایی که از آن پشتیبانی می‌کنند (پیش‌فرض: `False`) | USE_CUSTOM_JSON_DEFAULT | +| فعال کردن کانفیگ سفارشی JSON فقط برای برنامه‌ی V2rayNG (پیش‌فرض: `False`) | USE_CUSTOM_JSON_FOR_V2RAYNG | +| فعال کردن کانفیگ سفارشی JSON فقط برای برنامه‌ی Streisand (پیش‌فرض: `False`) | USE_CUSTOM_JSON_FOR_STREISAND | +| فعال کردن کانفیگ سفارشی JSON فقط برای برنامه‌ی V2rayN (پیش‌فرض: `False`) | USE_CUSTOM_JSON_FOR_V2RAYN | + +# داکیومنت + +[داکیومنت پاسارگارد](https://pasarguard.github.io/PasarGuard) تمامی آموزش‌های ضروری برای شروع را فراهم می‌کند و در سه زبان فارسی، انگلیسی و روسی در دسترس است. این داکیومنت نیاز به تلاش زیادی دارد تا تمامی جنبه‌های پروژه را به طور کامل پوشش دهد. ما از کمک و همکاری شما برای بهبود آن استقبال و قدردانی می‌کنیم. می‌توانید در این صفحه [گیت‌هاب](https://github.com/Gozargah/pasarguard.github.io) مشارکت کنید. + +# استفاده از API + +پاسارگارد به توسعه دهندگانAPI REST ارائه می دهد. برای مشاهده اسناد API در قالب Swagger UI یا ReDoc، متغیر `DOCS=True` را در تنظیمات خود ست کنید و در مرورگر به مسیر `/docs` و `/redoc` بروید. + +# پشتیبان گیری از پاسارگارد + +بهتر است همیشه از فایل های پاسارگارد خود نسخه پشتیبان تهیه کنید تا در صورت خرابی سیستم یا حذف تصادفی اطلاعات از دست نروند. مراحل تهیه نسخه پشتیبان از پاسارگارد به شرح زیر است: + +1. به طور پیش فرض، تمام فایل های مهم پاسارگارد در `/var/lib/pasarguard` ذخیره می شوند (در نسخه داکر). کل پوشه `/var/lib/pasarguard` را در یک مکان پشتیبان مورد نظر خود، مانند هارد دیسک خارجی یا فضای ذخیره سازی ابری کپی کنید. +2. علاوه بر این، مطمئن شوید که از فایل env خود که حاوی متغیرهای تنظیمات شما است و همچنین فایل پیکربندی Xray خود نسخه پشتیبان تهیه کنید. + +خدمات پشتیبان‌گیری پاسارگارد به طور کارآمد تمام فایل‌های ضروری را فشرده کرده و آن‌ها را به ربات تلگرام مشخص شده شما ارسال می‌کند. این خدمات از پایگاه‌های داده SQLite، MySQL و MariaDB پشتیبانی می‌کند. یکی از ویژگی‌های اصلی آن، خودکار بودن است که به شما اجازه می‌دهد تا پشتیبان‌گیری‌ها را هر ساعت برنامه‌ریزی کنید. محدودیتی در مورد محدودیت‌های آپلود تلگرام برای ربات‌ها وجود ندارد؛ اگر فایل شما بزرگتر از میزان محدودیت تلگرام باشد، به دو یا چند بخش تقسیم شده و ارسال می‌شود. علاوه بر این، شما می‌توانید در هر زمان پشتیبان‌گیری فوری انجام دهید. + +نصب آخرین ورژن پاسارگارد کامند: + +```bash +sudo bash -c "$(curl -sL https://github.com/PasarGuard/scripts/raw/main/pasarguard.sh)" @ install-script +``` + +راه‌اندازی سرویس پشتیبان گیری: + +```bash +pasarguard backup-service +``` + +پشتیبان گیری فوری: + +```bash +pasarguard backup +``` + +با انجام این مراحل، می توانید اطمینان حاصل کنید که از تمام فایل ها و داده های پاسارگارد خود یک نسخه پشتیبان تهیه کرده اید. به خاطر داشته باشید که نسخه های پشتیبان خود را به طور مرتب به روز کنید تا آنها را به روز نگه دارید. + +# ربات تلگرام + +پاسارگارد دارای یک ربات تلگرام داخلی است که می تواند مدیریت سرور، ایجاد و حذف کاربر و ارسال نوتیفیکیشن را انجام دهد. این ربات را می توان با انجام چند مرحله ساده به راحتی فعال کرد + +برای فعال کردن ربات تلگرام: + +1. در تنظیمات، متغیر`TELEGRAM_API_TOKEN` را به API TOKEN ربات تلگرام خود تنظیم کنید. +2. همینطور، متغیر`TELEGRAM_ADMIN_ID` را به شناسه عددی حساب تلگرام خود تنظیم کنید. شما می‌توانید شناسه خود را از [@userinfobot](https://t.me/userinfobot) دریافت کنید. + +# رابط خط فرمان (CLI) پاسارگارد + +پاسارگارد دارای یک رابط خط فرمان (CLI) داخلی به نام `PasarGuard-cli` است که به مدیران اجازه می دهد با آن ارتباط مستقیم داشته باشند. + +اگر پاسارگارد را با استفاده از اسکریپت نصب آسان نصب کرده اید، می توانید با اجرای دستور زیر به دستورات cli دسترسی پیدا کنید + +```bash +pasarguard cli [OPTIONS] COMMAND [ARGS]... +``` + +برای اطلاعات بیشتر، می توانید [مستندات CLI پاسارگارد](./cli/README.md) را مطالعه کنید. + +# رابط کاربری متنی (TUI) پاسارگارد + +پاسارگارد همچنین یک رابط کاربری متنی (TUI) برای مدیریت تعاملی مستقیم در ترمینال شما فراهم می کند. + +اگر پاسارگارد را با استفاده از اسکریپت نصب آسان نصب کرده اید، می توانید با اجرای دستور زیر به TUI دسترسی پیدا کنید: + +```bash +pasarguard tui +``` + +برای اطلاعات بیشتر، می توانید [مستندات TUI پاسارگارد](./tui/README.md) را مطالعه کنید. + +# نود + +پروژه پاسارگارد [نود](https://github.com/PasarGuard/node) را معرفی می کند که توزیع زیرساخت را متحول می کند. با نود، می توانید زیرساخت خود را در چندین مکان توزیع کنید و از مزایایی مانند افزونگی، در دسترس بودن بالا، مقیاس پذیری و انعطاف پذیری بهره مند شوید. نود به کاربران این امکان را می دهد که به سرورهای مختلف متصل شوند و به آنها انعطاف پذیری انتخاب و اتصال به چندین سرور را به جای محدود شدن به تنها یک سرور ارائه می دهد. +برای اطلاعات دقیق تر و دستورالعمل های نصب، لطفاً به [مستندات رسمی PasarGuard-node](https://github.com/PasarGuard/node) مراجعه کنید. + +# ارسال اعلان‌ها به آدرس وبهوک + +شما می‌توانید آدرسی را برای پاسارگارد فراهم کنید تا تغییرات کاربران را به صورت اعلان برای شما ارسال کند. + +اعلان‌ها به صورت یک درخواست POST به آدرسی که در `WEBHOOK_ADDRESS` فراهم شده به همراه مقدار تعیین شده در `WEBHOOK_SECRET` به عنوان `x-webhook-secret` در header درخواست ارسال می‌شوند. + +نمونه‌ای از درخواست ارسال شده توسط پاسارگارد: + +``` +Headers: +Host: 0.0.0.0:9000 +User-Agent: python-requests/2.28.1 +Accept-Encoding: gzip, deflate +Accept: */* +Connection: keep-alive +x-webhook-secret: something-very-very-secret +Content-Length: 107 +Content-Type: application/json + + + +Body: +{"username": "PasarGuard_test_user", "action": "user_updated", "enqueued_at": 1680506457.636369, "tries": 0} +``` + +انواع مختلف actionهایی که پاسارگارد ارسال می‌کند: `user_created`, `user_updated`, `user_deleted`, `user_limited`, `user_expired`, `user_disabled`, `user_enabled` + +# کمک مالی + +اگر پاسارگارد را برای شما مفید بوده و می‌خواهید از توسعه آن حمایت کنید، می‌توانید کمک مالی کنید، [اینجا کلیک کنید](https://donate.gozargah.pro) + +از حمایت شما متشکرم! + +# لایسنس + +توسعه یافته شده در [ناشناس!] و منتشر شده تحت لایسنس [AGPL-3.0](./LICENSE). + +# مشارکت در توسعه + +این ❤️‍🔥 تقدیم به همه‌ی کسایی که در توسعه پاسارگارد مشارکت می‌کنند! اگر می‌خواهید مشارکت داشته باشید، لطفاً [دستورالعمل‌های مشارکت](CONTRIBUTING.md) ما را بررسی کنید و در صورت تمایل Pull Request ارسال کنید یا یک Issue باز کنید. همچنین از شما برای پیوستن به گروه [تلگرام](https://t.me/Pasar_Guard) ما برای حمایت یا کمک به راهنمایی استقبال می کنیم. + +لطفا اگر امکانش رو دارید، با بررسی [لیست کار ها](https://github.com/PasarGuard/panel/issues) به ما در بهبود پاسارگارد کمک کنید. کمک های شما با آغوش باز پذیرفته میشه. + +

+با تشکر از همه همکارانی که به بهبود پاسارگارد کمک کردند: +

+

+ + + +

+

+ ساخته شده با contrib.rocks +

diff --git a/README-ru.md b/README-ru.md new file mode 100644 index 000000000..ff44b4d4f --- /dev/null +++ b/README-ru.md @@ -0,0 +1,470 @@ +

+ + + + + + +

+ +

PasarGuard

+ +

+ Унифицированное решение с графическим интерфейсом, устойчивое к цензуре +

+ +
+

+ + + + + + + + + + + + + + + + + + +

+ +

+ + English + + / + + فارسی + + / + + 简体中文 + + / + + Русский + +

+ +

+ + PasarGuard screenshots + +

+ +## Оглавление + +- [Введение](#введение) + - [Почему PasarGuard?](#почему-PasarGuard) + - [Функции](#функции) +- [Руководство по установке](#руководство-по-установке) +- [Конфигурация](#конфигурация) +- [документация](#документация) +- [API](#api) +- [Backup](#backup) +- [Telegram Bot](#telegram-bot) +- [PasarGuard CLI](#PasarGuard-cli) +- [PasarGuard Node](#node) +- [Webhook уведомления](#webhook-уведомления) +- [Поддержка](#поддержка) +- [Лицензия](#лицензия) +- [Участники](#участники) + +# Введение + +PasarGuard — это инструмент управления прокси-серверами, который предоставляет простой и удобный пользовательский интерфейс для управления сотнями учетных записей прокси на базе [Xray-core](https://github.com/XTLS/Xray-core) и созданный с использованием Python и ReactJS. + +## Почему PasarGuard? + +PasarGuard удобен в использовании, многофункционален и надежен. Он позволяет создавать различные прокси для пользователей без сложной настройки. С помощью встроенного веб-интерфейса можно контролировать, изменять и ограничивать пользователей. + +### Функции + +- Готовый **Web UI** +- **REST API** бэкэнд +- Поддержка [**множества узлов**](#PasarGuard-node) (для распределения инфраструктуры и масштабируемости) +- Поддержка протоколов **Vmess**, **VLESS**, **Trojan** и **Shadowsocks** +- Возможность активации **нескольких протоколов** для каждого пользователя +- **Несколько пользователей** на одном inbound +- **Несколько inbound** на **одном порту** (поддержка fallbacks) +- Ограничения на основе **количества трафика** и **срока действия** +- Ограничение трафика по **периодам** (например выдавать трафик на день, неделю и т. д.) +- Поддержка **ссылок-подписок** совместимых с **V2ray** _(такие как V2RayNG, SingBox, Nekoray, и др.)_, **Clash** и **ClashMeta** +- Автоматическая генерация **Ссылок** и **QRcode** +- Мониторинг ресурсов сервера и **использования трафика** +- Настраиваемые конфигурации xray +- Поддержка **TLS** и **REALITY** +- Встроенный **Telegram Bot** +- Встроенный **Command Line Interface (CLI)** +- **Несколько языков** +- Поддержка **Нескольких администраторов** (WIP) + +# Руководство по установке + +### ⚠️ Следующие команды установят предварительные версии (alpha/beta) + +Установка PasarGuard с базой данных SQLite (по умолчанию): + +```bash +sudo bash -c "$(curl -sL https://github.com/PasarGuard/scripts/raw/main/pasarguard.sh)" @ install --pre-release +``` + +Установка PasarGuard с базой данных MySQL: + +```bash +sudo bash -c "$(curl -sL https://github.com/PasarGuard/scripts/raw/main/pasarguard.sh)" @ install --database mysql --pre-release +``` + +Установка PasarGuard с базой данных MariaDB: + +```bash +sudo bash -c "$(curl -sL https://github.com/PasarGuard/scripts/raw/main/pasarguard.sh)" @ install --database mariadb --pre-release +``` + +Установка PasarGuard с базой данных PostgreSQL: + +```bash +sudo bash -c "$(curl -sL https://github.com/PasarGuard/scripts/raw/main/pasarguard.sh)" @ install --database postgresql --pre-release +``` + +Когда установка будет завершена: + +- Вы увидите логи, которые можно остановить, нажав `Ctrl+C` или закрыв терминал. +- Файлы PasarGuard будут размещены по адресу `/opt/pasarguard`. +- Файл конфигурации будет размещен по адресу `/opt/pasarguard/.env` (см. [Конфигурация](#конфигурация)). +- Файлы с данными будут размещены по адресу `/var/lib/pasarguard`. +- По соображениям безопасности, панель управления PasarGuard недоступна через IP-адрес. Поэтому вам необходимо [получить SSL-сертификат](https://pasarguard.github.io/PasarGuard/ru/examples/issue-ssl-certificate) и получить доступ к панели управления PasarGuard, открыв веб-браузер и перейдя по адресу `https://YOUR_DOMAIN:8000/dashboard/` (замените YOUR_DOMAIN на ваш фактический домен). +- Вы также можете использовать перенаправление портов SSH для локального доступа к панели управления PasarGuard без домена. Замените `user@serverip` на ваше фактическое имя пользователя SSH и IP-адрес сервера и выполните следующую команду: + +```bash +ssh -L 8000:localhost:8000 user@serverip +``` + +Наконец, введите следующую ссылку в ваш браузер, чтобы получить доступ к панели управления PasarGuard: + +http://localhost:8000/dashboard/ + +Вы потеряете доступ к панели управления, как только закроете терминал SSH. Поэтому этот метод рекомендуется использовать только для тестирования. + +Далее, Вам нужно создать главного администратора для входа в панель управления PasarGuard, выполнив следующую команду: + +```bash +pasarguard cli admin create --sudo +``` + +Готово! Теперь Вы можете войти, используя данные своей учетной записи. + +Для того, чтобы увидеть справочное сообщение от скрипта PasarGuard, выполните команду: + +```bash +pasarguard --help +``` + +Если Вы хотите запустить проект, используя его исходный код, обратитесь к разделу ниже + +
+

Ручная установка

+ +Установите xray на Ваш сервер. + +Вы можете сделать это, используя [Xray-install](https://github.com/XTLS/Xray-install): + +```bash +bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install +``` + +Клонируйте этот проект и установите зависимости (Вам нужен Python >= 3.12.7): + +```bash +git clone https://github.com/PasarGuard/panel.git +cd PasarGuard +curl -LsSf https://astral.sh/uv/install.sh | sh +uv sync +``` + +В качестве альтернативы для создания виртуальной среды можно использовать [Python Virtualenv](https://pypi.org/project/virtualenv/). + +Затем выполните следующую команду для запуска скрипта миграции базы данных: + +```bash +uv run alembic upgrade head +``` + +Если Вы хотите использовать `PasarGuard-cli`, необходимо связать его с файлом в `$PATH`, сделать его исполняемым и установить: + +```bash +sudo ln -s $(pwd)/PasarGuard-cli.py /usr/bin/pasarguard-cli +sudo chmod +x /usr/bin/pasarguard-cli +pasarguard-cli completion install +``` + +Теперь настало время настройки. + +Создайте копию файла `.env.example`, посмотрите его и отредактируйте с помощью текстового редактора,например `nano`. + +Возможно, вам захочется изменить учетные данные администратора. + +```bash +cp .env.example .env +nano .env +``` + +> Проверьте раздел [Конфигурации](#конфигурация) для получения большей информации. + +В завершение запустите приложение с помощью следующей команды: + +```bash +uv run main.py +``` + +Для запуска с помощью linux systemctl (скопируйте файл PasarGuard.service в `/var/lib/pasarguard/PasarGuard.service`): + +``` +systemctl enable /var/lib/pasarguard/PasarGuard.service +systemctl start PasarGuard +``` + +Для использования с nginx: + +``` +server { + listen 443 ssl http2; + listen [::]:443 ssl http2; + server_name example.com; + + ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; + + location ~* /(dashboard|statics|sub|api|docs|redoc|openapi.json) { + proxy_pass http://0.0.0.0:8000; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + + # xray-core ws-path: / + # client ws-path: /PasarGuard/me/2087 + # + # All traffic is proxed through port 443, and send to the xray port(2087, 2088 etc.). + # The '/PasarGuard' in location regex path can changed any characters by yourself. + # + # /${path}/${username}/${xray-port} + location ~* /PasarGuard/.+/(.+)$ { + proxy_redirect off; + proxy_pass http://127.0.0.1:$1/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } +} +``` + +или: + +``` +server { + listen 443 ssl http2; + listen [::]:443 ssl http2; + server_name PasarGuard.example.com; + + ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; + + location / { + proxy_pass http://0.0.0.0:8000; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } +} +``` + +По умолчанию приложение будет запускаться на `http://localhost:8000/dashboard`. Вы можете настроить его, изменив переменные окружения `UVICORN_HOST` и `UVICORN_PORT`. + +
+ +# Конфигурация + +> Ниже приведены настройки, которые можно задать с помощью переменных окружения поместив их в файл `.env`. + +| Перменная | Описание | +| ---------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ | +| SUDO_USERNAME | Имя пользователя главного администратора | +| SUDO_PASSWORD | Пароль главного администратора | +| SQLALCHEMY_DATABASE_URL | Путь к файлу БД ([SQLAlchemy's docs](https://docs.sqlalchemy.org/en/20/core/engines.html#database-urls)) | +| UVICORN_HOST | Привязка приложения к хосту (по умолчанию: `0.0.0.0`) | +| UVICORN_PORT | Привязка приложения к порту (по умолчанию: `8000`) | +| UVICORN_UDS | Привязка приложения к UNIX domain socket | +| UVICORN_SSL_CERTFILE | Адрес файла сертификата SSL | +| UVICORN_SSL_KEYFILE | Адрес файла ключа SSL | +| UVICORN_SSL_CA_TYPE | Тип центра сертификации ключа SSL. Используйте `private` для тестирования самоподписанных CA (по умолчанию: `public`) | +| XRAY_JSON | Адрес файла JSON конфигурации Xray. (по умолчанию: `xray_config.json`) | +| XRAY_EXECUTABLE_PATH | Путь к бинарникам Xray (по умолчанию: `/usr/local/bin/xray`) | +| XRAY_ASSETS_PATH | Путь к папке с рессурсными файлами для Xray (файлы geoip.dat и geosite.dat) (по умолчанию: `/usr/local/share/xray`) | +| XRAY_SUBSCRIPTION_URL_PREFIX | Префикс адреса подписки | +| XRAY_FALLBACKS_INBOUND_TAG | Если вы используете входящее соединение с несколькими резервными вариантами, укажите здесь его тег | +| XRAY_EXCLUDE_INBOUND_TAGS | Теги входящих соединений, которые не требуют управления и не должны быть включены в список прокси | +| CUSTOM_TEMPLATES_DIRECTORY | Путь к папке с пользовательскими шаблонами (по умолчанию: `app/templates`) | +| CLASH_SUBSCRIPTION_TEMPLATE | Шаблон для создания конфигурации Clash (по умолчанию: `clash/default.yml`) | +| SUBSCRIPTION_PAGE_TEMPLATE | Шаблон для страницы подписки (по умолчанию: `subscription/index.html`) | +| HOME_PAGE_TEMPLATE | Шаблон главной страницы (по умолчанию: `home/index.html`) | +| TELEGRAM_API_TOKEN | Токен Telegram-бота (полученный от [@botfather](https://t.me/botfather)) | +| TELEGRAM_ADMIN_ID | Числовой идентификатор администратора в Telegram (полученный от [@userinfobot](https://t.me/userinfobot)) | +| TELEGRAM_PROXY_URL | URL прокси для запуска Telegram-бота (если серверы Telegram заблокированы на вашем сервере). | +| JWT_ACCESS_TOKEN_EXPIRE_MINUTES | Время истечения срока действия доступного токена в минутах, `0` означает "без истечения срока действия" (по умолчанию: `1440`) | +| DOCS | Активация документации API по адресам `/docs` и `/redoc`. (по умолчанию: `False`) | +| DEBUG | Активация режима разработки (development) (по умолчанию: `False`) | +| WEBHOOK_ADDRESS | Адрес Webhook для отправки уведомлений. Уведомления Webhook будут отправляться, если это значение было установлено | +| WEBHOOK_SECRET | Webhook secret будет передаваться с каждым запросом в виде `x-webhook-secret` в заголовке (по умолчанию: `None`) | +| NUMBER_OF_RECURRENT_NOTIFICATIONS | Сколько раз повторять попытку отправки уведомления при обнаружении ошибки (по умолчанию: `3`) | +| RECURRENT_NOTIFICATIONS_TIMEOUT | Тайм-аут между каждым повторным запросом при обнаружении ошибки в секундах (по умолчанию: `180`) | +| NOTIFY_REACHED_USAGE_PERCENT | При каком проценте использования отправлять предупреждение (по умолчанию: `80`) | +| NOTIFY_DAYS_LEFT | Когда отправлять предупреждение об истечении срока действия (по умолчанию: `3`) | +| SQLALCHEMY_POOL_SIZE | (по умолчанию: `10`) | +| SQLALCHEMY_MAX_OVERFLOW | (по умолчанию: `30`) | +| XRAY_SUBSCRIPTION_TEMPLATE | Шаблон, который будет использоваться для создания конфигураций xray (по умолчанию: `xray/default.yml`) | +| SINGBOX_SUBSCRIPTION_TEMPLATE | Шаблон, который будет использоваться для создания конфигураций singbox (по умолчанию: `singbox/default.yml`) | +| USERS_AUTODELETE_DAYS | Удалять истекших (и опционально ограниченных) пользователей через столько дней (отрицательные значения отключают эту функцию, по умолчанию: `-1`) | +| USER_AUTODELETE_INCLUDE_LIMITED_ACCOUNTS | Включать ли ограниченные учетные записи в функцию автоматического удаления (по умолчанию: `False`) | +| XRAY_SUBSCRIPTION_PATH | Вы можете изменить путь api для подписки (по умолчанию: `sub`) | +| ENABLE_RECORDING_NODES_STATS | Из-за большого объема данных эта задача доступна только для postgresql и timescaledb | + +# документация + +[Документация PasarGuard](https://pasarguard.github.io/PasarGuard/ru/) предоставляет все необходимые руководства для начала работы и доступна на трех языках: фарси, английском и русском. Для полного охвата всех аспектов проекта требуется значительное количество усилий. Мы приветствуем и ценим ваш вклад в улучшение документации. Вы можете внести свой вклад в этот [репозиторий на GitHub](https://github.com/Gozargah/pasarguard.github.io). + +# API + +PasarGuard предоставляет REST API, позволяющий разработчикам программно взаимодействовать с сервисами PasarGuard. Для просмотра документации по API в Swagger UI или ReDoc установите переменную `DOCS=True` и перейдите по ссылкам `/docs` и `/redoc`. + +# Backup + +Всегда полезно регулярно создавать резервные копии файлов PasarGuard, чтобы предотвратить потерю данных в случае системных сбоев или случайного удаления. Ниже приведены шаги для создания резервной копии PasarGuard: + +1. По умолчанию все важные файлы PasarGuard сохраняются в папке `/var/lib/pasarguard` (в версиях Docker). Скопируйте весь каталог `/var/lib/pasarguard` в выбранное вами место резервного копирования, например на внешний жесткий диск или в облачное хранилище. +2. Кроме того, не забудьте сделать резервную копию файла env, содержащего переменные конфигурации, а также файла конфигурации Xray. Если вы устанавливали PasarGuard с помощью PasarGuard-scripts (рекомендуемый подход к установке), то env и другие конфигурации должны находиться в каталоге `/opt/pasarguard/`. + +Выполнив эти действия, вы сможете обеспечить резервное копирование всех файлов и данных PasarGuard, а также переменных конфигурации и конфигурации Xray на случай, если в будущем потребуется их восстановить. Не забывайте регулярно обновлять резервные копии, чтобы поддерживать их в актуальном состоянии. + +# Telegram Bot + +PasarGuard поставляется с встроенным ботом Telegram, который может управлять сервером, создавать и удалять пользователей, а также отправлять уведомления. Этот бот можно легко включить, выполнив несколько простых шагов, и он предоставляет удобный способ взаимодействия с PasarGuard без необходимости каждый раз заходить на сервер. + +Чтобы включить Telegram-бота, выполните следующие действия: + +1. установите `TELEGRAM_API_TOKEN` в качестве API-токена вашего бота. +2. установите `TELEGRAM_ADMIN_ID` в качестве цифрового ID вашего Telegram-аккаунта, который вы можете получить от [@userinfobot](https://t.me/userinfobot) + +Сервис резервного копирования PasarGuard эффективно архивирует все необходимые файлы и отправляет их вашему указанному Telegram-боту. Он поддерживает базы данных SQLite, MySQL и MariaDB. Одной из ключевых особенностей является автоматизация, позволяющая настроить расписание резервного копирования, например, каждый час. При этом ограничений на размер файлов для загрузки в Telegram через бота нет: если файл превышает лимит, он будет автоматически разделен и отправлен частями. Также можно запустить резервное копирование вручную в любой момент. + +Установка последней версии PasarGuard: + +```bash +sudo bash -c "$(curl -sL https://github.com/PasarGuard/scripts/raw/main/pasarguard.sh)" @ install-script +``` + +Настройка сервиса резервного копирования: + +```bash +pasarguard backup-service +``` + +Мгновенное резервное копирование: + +```bash +pasarguard backup +``` + +# PasarGuard CLI + +PasarGuard поставляется с встроенным CLI под названием `PasarGuard-cli`, который позволяет администраторам напрямую взаимодействовать с ним. + +Если вы установили PasarGuard с помощью скрипта установки, то доступ к командам cli можно получить, выполнив команду: + +```bash +pasarguard cli [OPTIONS] COMMAND [ARGS]... +``` + +Для получения дополнительной информации можно ознакомиться с [документацией по PasarGuard CLI](./cli/README.md). + +# Пользовательский интерфейс терминала (TUI) PasarGuard + +PasarGuard также предоставляет пользовательский интерфейс терминала (TUI) для интерактивного управления непосредственно в вашем терминале. + +Если вы установили PasarGuard с помощью простого установочного скрипта, вы можете получить доступ к TUI, запустив: + +```bash +pasarguard tui +``` + +Для получения дополнительной информации вы можете ознакомиться с [документацией по TUI PasarGuard](./tui/README.md). + +# Node + +Проект PasarGuard представляет [node](https://github.com/PasarGuard/node), который помогает Вам в распределении инфраструктуры. С помощью node можно распределить инфраструктуру по нескольким узлам, получив такие преимущества, как высокая доступность, масштабируемость и гибкость. node позволяет пользователям подключаться к различным серверам, предоставляя им гибкость в выборе, а не ограничиваться только одним сервером. +Более подробная информация и инструкции по установке приведены в [официальной документации PasarGuard-node](https://github.com/PasarGuard/node). + +# Webhook уведомления + +Вы можете задать адрес webhook, и PasarGuard будет отправлять уведомления на этот адрес. + +Запросы будут отправляться в виде POST-запроса на адрес, указанный в `WEBHOOK_ADDRESS`, с `WEBHOOK_SECRET` в качестве `x-webhook-secret` в заголовках. + +Пример запроса, отправленного PasarGuard: + +``` +Headers: +Host: 0.0.0.0:9000 +User-Agent: python-requests/2.28.1 +Accept-Encoding: gzip, deflate +Accept: */* +Connection: keep-alive +x-webhook-secret: something-very-very-secret +Content-Length: 107 +Content-Type: application/json + + + +Body: +{"username": "PasarGuard_test_user", "action": "user_updated", "enqueued_at": 1680506457.636369, "tries": 0} +``` + +Различные типы действий: `user_created`, `user_updated`, `user_deleted`, `user_limited`, `user_expired`, `user_disabled`, `user_enabled` + +# Поддержка + +Если вы нашли PasarGuard полезным и хотели бы поддержать его развитие, вы можете сделать пожертвование, [нажмите здесь](https://donate.gozargah.pro) + +Спасибо за поддержку! + +# Лицензия + +Сделано в [Unknown!] и опубликовано под [AGPL-3.0](./LICENSE). + +# Участники + +Мы ❤️‍🔥 участников проекта! Если вы хотите внести свой вклад, пожалуйста, ознакомьтесь с нашим [Contributing Guidelines](CONTRIBUTING.md) и не стесняйтесь отправлять запросы на исправление ошибок или сообщить о проблеме. Мы также приглашаем вас присоединиться к нашей группе [Telegram](https://t.me/Pasar_Guard) для получения поддержки. + +Проверьте [open issues](https://github.com/PasarGuard/panel/issues), чтобы помочь развитию этого проекта. + +

+Спасибо всем участникам, благодаря которым PasarGuard становится лучше: +

+

+ + + +

+

+ Made with contrib.rocks +

diff --git a/README-zh-cn.md b/README-zh-cn.md new file mode 100644 index 000000000..03eb2c63b --- /dev/null +++ b/README-zh-cn.md @@ -0,0 +1,464 @@ +

+ + + + + + +

+ +

PasarGuard

+ +

+ Unified GUI Censorship Resistant Solution +

+ +
+

+ + + + + + + + + + + + + + + + + + +

+ +

+ + English + + / + + فارسی + + / + + 简体中文 + + / + + Русский + +

+ +

+ + PasarGuard screenshots + +

+ +## 目录 + +- [概览](#概览) + - [为什么要使用 PasarGuard?](#为什么要使用-PasarGuard) + - [特性](#特性) +- [安装指南](#安装指南) +- [配置](#配置) +- [文档](#文档) +- [如何使用 API](#如何使用-api) +- [如何备份 PasarGuard](#如何备份-PasarGuard) +- [Telegram bot](#telegram-bot) +- [PasarGuard CLI](#PasarGuard-cli) +- [PasarGuard Node](#PasarGuard-node) +- [Webhook 通知](#webhook-通知) +- [捐赠](#捐赠) +- [许可](#许可) +- [贡献者](#贡献者) + +# 概览 + +PasarGuard 是一个代理管理工具,提供简单易用的用户界面,可管理数百个代理账户,由 [Xray-core](https://github.com/XTLS/Xray-core) 提供支持,使用 Python 和 Reactjs 构建。 + +## 为什么要使用 PasarGuard? + +PasarGuard 是一个用户友好、功能丰富且可靠的工具。它让您可以为用户创建不同的代理,无需进行任何复杂的配置。通过其内置的 Web 界面,您可以监视、修改和限制用户。 + +### 特性 + +- 内置 **Web 界面** +- 完全支持 **REST API** 的后端 +- 支持 **Vmess**、**VLESS**、**Trojan** 和 **Shadowsocks** 协议 +- 单用户的**多协议**支持 +- 单入站的**多用户**支持 +- 单端口的**多入站**支持(使用 fallbacks) +- **流量**和**过期日期**限制 +- 周期性的流量限制(例如每天、每周等) +- 兼容 **V2ray** 的**订阅链接**(例如 V2RayNG、SingBox、Nekoray 等)和 **Clash** +- 自动化的**分享链接**和**二维码**生成器 +- 系统监控和**流量统计** +- 可自定义的 xray 配置 +- **TLS** 支持 +- 集成的 **Telegram Bot** +- **多管理员**支持(WIP) + +# 安装指南 + +### ⚠️ 以下命令将安装预发布版本(alpha/beta) + +运行以下命令以使用 SQLite 数据库安装 PasarGuard。 + +```bash +sudo bash -c "$(curl -sL https://github.com/PasarGuard/scripts/raw/main/pasarguard.sh)" @ install --pre-release +``` + +运行以下命令以使用 MySQL 数据库安装 PasarGuard。 + +```bash +sudo bash -c "$(curl -sL https://github.com/PasarGuard/scripts/raw/main/pasarguard.sh)" @ install --database mysql --pre-release +``` + +运行以下命令以使用 MariaDB 数据库安装 PasarGuard。 + +```bash +sudo bash -c "$(curl -sL https://github.com/PasarGuard/scripts/raw/main/pasarguard.sh)" @ install --database mariadb --pre-release +``` + +运行以下命令以使用 PostgreSQL 数据库安装 PasarGuard。 + +```bash +sudo bash -c "$(curl -sL https://github.com/PasarGuard/scripts/raw/main/pasarguard.sh)" @ install --database postgresql --pre-release +``` + +安装完成后: + +- 您将看到日志,可以通过关闭终端或按`Ctrl+C`停止查看 +- PasarGuard 文件将位于`/opt/pasarguard` +- 配置文件位于`/opt/pasarguard/.env`(请参阅[配置](#配置)部分查看变量) +- 数据文件将位于`/var/lib/pasarguard` +- 为安全起见,PasarGuard 仪表板无法通过 IP 地址访问。因此,您必须[获取 SSL 证书](https://pasarguard.github.io/PasarGuard/en/examples/issue-ssl-certificate)并通过打开 Web 浏览器并导航到`https://YOUR_DOMAIN:8000/dashboard/`来访问您的 PasarGuard 仪表板(将 YOUR_DOMAIN 替换为您的实际域) +- 您还可以使用 SSH 端口转发在本地访问 PasarGuard 仪表板而无需域。将`user@serverip`替换为您的实际 SSH 用户名和服务器 IP,然后运行以下命令: + +```bash +ssh -L 8000:localhost:8000 user@serverip +``` + +Finally, you can enter the following link in your browser to access your PasarGuard dashboard: + +http://localhost:8000/dashboard/ + +You will lose access to the dashboard as soon as you close the SSH terminal. Therefore, this method is recommended only for testing purposes. + +接下来,您需要通过以下命令创建一个 sudo 管理员以登录到 PasarGuard 仪表板 + +```bash +pasarguard cli admin create --sudo +``` + +就是这样!您可以使用这些凭据登录到您的仪表板 + +要查看 PasarGuard 脚本的帮助消息,请运行以下命令 + +```bash +pasarguard --help +``` + +If you are eager to run the project using the source code, check the section below + +
+

手动安装(高级)

+ +在您的机器上安装 xray + +您可以使用 [Xray-install](https://github.com/XTLS/Xray-install) 脚本进行安装: + +```bash +bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install +``` + +克隆项目并安装依赖项。 + +您需要 Python>=3.12.7 版本。 + +```bash +git clone https://github.com/PasarGuard/panel.git +cd PasarGuard +curl -LsSf https://astral.sh/uv/install.sh | sh +uv sync +``` + +另外,为了拥有一个隔离的环境,您可以使用 [Python Virtualenv](https://pypi.org/project/virtualenv/)。 + +另外,为了拥有一个隔离的环境,您可以使用 [Python Virtualenv](https://pypi.org/project/virtualenv/)。 + +然后运行以下命令运行数据库迁移脚本: + +```bash +uv run alembic upgrade head +``` + +如果您想使用`PasarGuard-cli`,您应该将其链接到`$PATH`中的一个文件,使其可执行,并安装自动完成功能: + +```bash +sudo ln -s $(pwd)/PasarGuard-cli.py /usr/bin/pasarguard-cli +sudo chmod +x /usr/bin/pasarguard-cli +pasarguard-cli completion install +``` + +现在开始配置: + +复制 `.env.example` 文件,查看并使用文本编辑器(如`nano`)进行编辑。 + +您可能想要修改管理员凭据。 + +```bash +cp .env.example .env +nano .env +``` + +> 请查看[配置](#配置)部分以获取更多信息。 + +最终,使用以下命令启动应用程序: + +```bash +uv run main.py +``` + +也可使用 linux systemctl 启动: + +``` +systemctl enable /var/lib/pasarguard/PasarGuard.service +systemctl start PasarGuard +``` + +配合 nginx 使用: + +``` +server { + listen 443 ssl http2; + listen [::]:443 ssl http2; + server_name example.com; + + ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; + + location ~* /(dashboard|statics|sub|api|docs|redoc|openapi.json) { + proxy_pass http://0.0.0.0:8000; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + + # xray-core ws-path: / + # client ws-path: /PasarGuard/me/2087 + # + # 所有流量通过 443 端口进行代理,然后分发至真正的 xray 端口(2087、2088 等等)。 + # 路径中的 “/PasarGuard” 可以改为任意合法 URL 字符. + # + # /${path}/${username}/${xray-port} + location ~* /PasarGuard/.+/(.+)$ { + proxy_redirect off; + proxy_pass http://127.0.0.1:$1/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } +} +``` + +或 + +``` +server { + listen 443 ssl http2; + listen [::]:443 ssl http2; + server_name PasarGuard.example.com; + + ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; + + location / { + proxy_pass http://0.0.0.0:8000; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } +} +``` + +默认情况下,应用将在 `http://localhost:8000/dashboard` 上运行。您可以通过更改 `UVICORN_HOST` 和 `UVICORN_PORT` 环境变量来进行配置。 + +
+ +# 配置 + +> 您可以使用环境变量或将其放置在 `env` 或 `.env` 文件中来设置以下设置。 + +| 变量 | 描述 | +| ---------------------------------------- | ---------------------------------------------------------------------------------------------------- | +| SUDO_USERNAME | 管理员用户名(默认: admin) | +| SUDO_PASSWORD | 管理员密码(默认: admin) | +| SQLALCHEMY_DATABASE_URL | 数据库文档([SQLAlchemy's docs](https://docs.sqlalchemy.org/en/20/core/engines.html#database-urls)) | +| UVICORN_HOST | 绑定应用程序到此主机(默认为 `0.0.0.0`) | +| UVICORN_PORT | 绑定应用程序到此端口(默认为 `8000`) | +| UVICORN_UDS | 将应用程序绑定到一个 UNIX 域套接字 | +| UVICORN_SSL_CERTFILE | SSL 证书文件路径 | +| UVICORN_SSL_KEYFILE | SSL 密钥文件路径 | +| UVICORN_SSL_CA_TYPE | 授权 SSL 证书的类型。使用“private”来测试自签名 CA(默认值:`public`) | +| XRAY_JSON | Xray 的 json 配置文件路径(默认: `xray_config.json`) | +| XRAY_EXECUTABLE_PATH | Xray 的执行程序路径: `/usr/local/bin/xray`) | +| XRAY_ASSETS_PATH | Xray 的资源目录: `/usr/local/share/xray`) | +| XRAY_SUBSCRIPTION_URL_PREFIX | 订阅 URL 的前缀 | +| XRAY_FALLBACKS_INBOUND_TAG | 包含 fallbacks 的入站标记, 在您需要使用 fallbacks 配置此项 | +| XRAY_EXCLUDE_INBOUND_TAGS | 不需要此应用程序管理或在链接中包含的入站标记 | +| CLASH_SUBSCRIPTION_TEMPLATE | 将用于生成冲突配置的模板(默认值:`clash/default.yml`) | +| SUBSCRIPTION_PAGE_TEMPLATE | 用于生成订阅信息页面的模板(默认:`subscription/index.html`) | +| HOME_PAGE_TEMPLATE | 诱饵页面模板(默认:`home/index.html`) | +| TELEGRAM_API_TOKEN | Telegram bot API 令牌(可以从 [@botfather](https://t.me/botfather) 获取) | +| TELEGRAM_ADMIN_ID | 管理员的 Telegram ID(可以使用 [@userinfobot](https://t.me/userinfobot) 查找您的 ID) | +| TELEGRAM_PROXY_URL | 在代理下运行 Telegram bot。 | +| JWT_ACCESS_TOKEN_EXPIRE_MINUTES | Access Tokens 的过期时间,以分钟为单位,`0` 表示无限期(默认为 `1440` 分钟) | +| DOCS | API 文档是否应该在 `/docs` 和 `/redoc` 上提供(默认为 `False` | +| SQLALCHEMY_POOL_SIZE | (默认: `10`) | +| SQLALCHEMY_MAX_OVERFLOW | (默认: `30`) | +| XRAY_SUBSCRIPTION_TEMPLATE | 将用于生成 xray 配置的模板 (默认: `xray/default.yml`) | +| SINGBOX_SUBSCRIPTION_TEMPLATE | 将用于生成 singbox 配置的模板 (默认: `singbox/default.yml`) | +| DEBUG | 开发调试模式 (默认: `False`) | +| USERS_AUTODELETE_DAYS | 多少天后删除过期(以及可选的受限用户) (负值禁用此功能, 默认: `-1`) | +| USER_AUTODELETE_INCLUDE_LIMITED_ACCOUNTS | 是否在自动删除功能中包括受限帐户 (默认: `False`) | +| XRAY_SUBSCRIPTION_PATH | 您可以更改订阅的 api 路径 (默认: `sub`) | +| ENABLE_RECORDING_NODES_STATS | 由于数据量大,此作业仅适用于 postgresql 和 timescaledb | + +# 文档 + +[PasarGuard 文档](https://pasarguard.github.io/PasarGuard) 提供了所有必要的入门指南,支持三种语言:波斯语、英语和俄语。要全面覆盖项目的各个方面,这些文档需要大量的工作。我们欢迎并感谢您的贡献,以帮助我们改进文档。您可以在这个 [GitHub 仓库](https://github.com/Gozargah/pasarguard.github.io) 中进行贡献。 + +# 如何使用 API + +PasarGuard 提供了 REST API,使开发人员能够以编程方式与 PasarGuard 服务进行交互。要在 Swagger UI 或 ReDoc 中查看 API 文档,设置配置变量 `DOCS=True`,然后导航到 `/docs` 和 `/redoc`。 + +# 如何备份 PasarGuard + +定期备份 PasarGuard 文件是预防系统故障或意外删除导致数据丢失的好习惯。以下是备份 PasarGuard 的步骤: + +1. 默认情况下,所有重要的 PasarGuard 文件都保存在 `/var/lib/pasarguard` ( Docker 版本)中。将整个 `/var/lib/pasarguard` 目录复制到您选择的备份位置,比如外部硬盘或云存储。 +2. 此外,请确保备份您的 `env` 文件,其中包含您的配置变量,以及您的 `Xray` 配置文件。 + +PasarGuard 的备份服务会高效地压缩所有必要文件并将它们发送到您指定的 Telegram 机器人。它支持 SQLite、MySQL 和 MariaDB 数据库。其一个主要功能是自动化,允许您每小时安排一次备份。对于 Telegram 机器人的上传限制没有限制;如果文件超过限制,它会被拆分并以多个部分发送。此外,您可以在任何时间启动即时备份。 + +安装最新版 PasarGuard 命令: + +```bash +sudo bash -c "$(curl -sL https://github.com/PasarGuard/scripts/raw/main/pasarguard.sh)" @ install-script +``` + +设置备份服务: + +```bash +pasarguard backup-service +``` + +获取即时备份: + +```bash +pasarguard backup +``` + +按照这些步骤,您可以确保有备份所有 PasarGuard 文件和数据,以及您的配置变量和 Xray 配置,以备将来恢复使用。请记得定期更新备份,以保持它们的最新性。 + +# Telegram bot + +PasarGuard 配备了一个集成的 Telegram bot,可以处理服务器管理、用户创建和删除,以及发送通知。通过几个简单的步骤,您可以轻松地启用这个机器人,并提供了一种方便的方式与 PasarGuard 交互,而不需要每次都登录到服务器上。 + +启用 Telegram bot: + +1. 将 `TELEGRAM_API_TOKEN` 设置为您的 bot API Token。 +2. 将 `TELEGRAM_ADMIN_ID` 设置为您的 Telegram ID,您可以从 [@userinfobot](https://t.me/userinfobot) 中获取自己的 ID。 + +# PasarGuard CLI + +PasarGuard 带有一个名为`PasarGuard-cli`的集成 CLI,允许管理员直接与其交互。 + +如果您使用简易安装脚本安装了 PasarGuard,您可以通过运行以下命令来访问 CLI 命令 + +```bash +pasarguard cli [OPTIONS] COMMAND [ARGS]... +``` + +更多信息,您可以阅读[PasarGuard CLI 的文档](./cli/README.md)。 + +# PasarGuard 终端用户界面 (TUI) + +PasarGuard 还提供了一个终端用户界面 (TUI),用于直接在您的终端中进行交互式管理。 + +如果您使用简易安装脚本安装了 PasarGuard,您可以通过运行以下命令访问 TUI: + +```bash +pasarguard tui +``` + +更多信息,您可以阅读 [PasarGuard TUI 的文档](./tui/README.md)。 + +# Node + +PasarGuard 项目引入了[node](https://github.com/PasarGuard/node),它彻底改变了基础设施的分布。通过 node,您可以将您的基础设施分布到多个位置,从而获得冗余、高可用性、可伸缩性、灵活性等好处。node 使用户能够连接到不同的服务器,为他们提供了选择和连接多个服务器的灵活性,而不是仅限于一个服务器。 +有关更详细的信息和安装说明,请参阅[PasarGuard-node 官方文档](https://github.com/PasarGuard/node) + +# Webhook 通知 + +您可以设置一个 webhook 地址,PasarGuard 会将通知发送到该地址。 + +请求将作为 post 请求发送到`WEBHOOK_ADDRESS`提供的地址,并在头文件中以`WEBHOOK_SECRET`作为`x-webhook-secret`。 + +PasarGuard 发送的示例请求: + +``` +Headers: +Host: 0.0.0.0:9000 +User-Agent: python-requests/2.28.1 +Accept-Encoding: gzip, deflate +Accept: */* +Connection: keep-alive +x-webhook-secret: something-very-very-secret +Content-Length: 107 +Content-Type: application/json + + + +Body: +{"username": "PasarGuard_test_user", "action": "user_updated", "enqueued_at": 1680506457.636369, "tries": 0} +``` + +不同的操作类型是:`user_created`、`user_updated`、`user_deleted`、`user_limited`、`user_expired`、`user_disabled`、`user_enabled` + +# 捐赠 + +如果您觉得 PasarGuard 有用并希望支持其发展,您可以捐款,[点击这里](https://donate.gozargah.pro) + +感谢您的支持! + +# 许可 + +制作于 [Unknown!] 并在 [AGPL-3.0](./LICENSE) 下发布。 + +# 贡献者 + +我们热爱贡献者!如果您想做出贡献,请查看我们的[贡献指南](CONTRIBUTING.md)并随时提交拉取请求或打开问题。我们也欢迎您加入我们的 [Telegram](https://t.me/Pasar_Guard) 群组,以获得支持或贡献指导。 + +查看 [issues](https://github.com/PasarGuard/panel/issues) 以帮助改进这个项目。 + +

+感谢所有为改善 PasarGuard 做出贡献的贡献者们: +

+

+ + + +

+

+ Made with contrib.rocks +

diff --git a/README.md b/README.md new file mode 100644 index 000000000..e39158aa9 --- /dev/null +++ b/README.md @@ -0,0 +1,677 @@ +
+ +# 🛡️ PasarGuard + +[![PasarGuard Logo](https://github.com/PasarGuard/docs/blob/main/logos/PasarGuard-black-logo.png)](https://github.com/PasarGuard/panel) + +### راه‌حل یکپارچه مقاوم در برابر سانسور با رابط گرافیکی + +**Unified GUI Censorship Resistant Solution** + +
+ +
+ +## 📊 وضعیت پروژه | Project Status + +[![Build Status](https://img.shields.io/github/actions/workflow/status/PasarGuard/panel/build.yml?style=for-the-badge&label=Build&logo=github)](https://github.com/PasarGuard/panel/actions) +[![Docker Pulls](https://img.shields.io/docker/pulls/PasarGuard/panel?style=for-the-badge&label=Docker%20Pulls&logo=docker)](https://hub.docker.com/r/PasarGuard/panel) +[![License](https://img.shields.io/github/license/PasarGuard/panel?style=for-the-badge&label=License&logo=opensourceinitiative)](https://github.com/PasarGuard/panel/blob/main/LICENSE) +[![Telegram](https://img.shields.io/badge/Telegram-Group-2CA5E0?style=for-the-badge&logo=telegram&logoColor=white)](https://t.me/Pasar_Guard) +[![GitHub Stars](https://img.shields.io/github/stars/PasarGuard/panel?style=for-the-badge&label=Stars&logo=github)](https://github.com/PasarGuard/panel) + +
+ +
+ +## 🌍 زبان‌ها | Languages + +[![English](https://img.shields.io/badge/English-🇺🇸-blue?style=for-the-badge)](./README.md) +[![فارسی](https://img.shields.io/badge/فارسی-🇮🇷-green?style=for-the-badge)](./README-fa.md) +[![简体中文](https://img.shields.io/badge/简体中文-🇨🇳-red?style=for-the-badge)](./README-zh-cn.md) +[![Русский](https://img.shields.io/badge/Русский-🇷🇺-orange?style=for-the-badge)](./README-ru.md) + +
+ +
+ +## 🖼️ پیش‌نمایش | Preview + +[![PasarGuard Dashboard Preview](https://github.com/PasarGuard/docs/raw/master/screenshots/preview.png)](https://github.com/PasarGuard/panel) + +*کلیک کنید تا تصویر بزرگ‌تر را ببینید | Click to view larger image* + +
+ +## 📋 فهرست مطالب | Table of Contents + +- [📖 Overview](#overview) + - [❓ Why using PasarGuard?](#why-using-PasarGuard) + - [✨ Features](#features) +- [🚀 Installation guide](#installation-guide) +- [⚙️ Configuration](#configuration) +- [📚 Documentation](#documentation) +- [🔌 API](#api) +- [💾 Backup](#backup) +- [🤖 Telegram Bot](#telegram-bot) +- [💻 PasarGuard CLI](#PasarGuard-cli) +- [🌐 PasarGuard Node](#node) +- [🔔 Webhook notifications](#webhook-notifications) +- [💝 Donation](#donation) +- [📄 License](#license) +- [👥 Contributors](#contributors) + +# 📖 Overview + +
+ +**PasarGuard** ابزاری قدرتمند برای مدیریت پروکسی است که رابط کاربری ساده و آسانی برای مدیریت صدها حساب پروکسی فراهم می‌کند. این ابزار بر پایه [Xray-core](https://github.com/XTLS/Xray-core) ساخته شده و با استفاده از Python و Reactjs توسعه یافته است. + +**PasarGuard** is a powerful proxy management tool that provides a simple and easy-to-use user interface for managing hundreds of proxy accounts. Built on [Xray-core](https://github.com/XTLS/Xray-core) and developed using Python and Reactjs. + +
+ +## ❓ Why using PasarGuard? + +
+ +PasarGuard کاربرپسند، غنی از ویژگی و قابل اعتماد است. این ابزار به شما امکان ایجاد پروکسی‌های مختلف برای کاربرانتان بدون هیچ پیکربندی پیچیده‌ای را می‌دهد. با استفاده از رابط وب داخلی آن، می‌توانید کاربران را نظارت، تغییر و محدود کنید. + +PasarGuard is user-friendly, feature-rich and reliable. It lets you create different proxies for your users without any complicated configuration. Using its built-in web UI, you are able to monitor, modify and limit users. + +
+ +### ✨ Features + +
+ +| 🎯 **Core Features** | 🔧 **Technical Features** | 🌐 **Protocol Support** | +|:---:|:---:|:---:| +| 🌐 Built-in **Web UI** | 🔌 Fully **REST API** backend | 📡 **Vmess** Protocol | +| 📊 System monitoring | 🏗️ [**Multiple Nodes**](#node) support | 🚀 **VLESS** Protocol | +| 📈 **Traffic statistics** | ⚙️ Customizable xray configuration | 🛡️ **Trojan** Protocol | +| 🔗 **Subscription links** | 🔐 **TLS** and **REALITY** support | 🌙 **Shadowsocks** Protocol | +| 📱 **QRcode** generator | 🤖 Integrated **Telegram Bot** | 🔄 **Multi-protocol** support | +| 📅 **Traffic limitations** | 💻 Integrated **CLI** | 👥 **Multi-user** support | +| ⏰ **Periodic limits** | 🌍 **Multi-language** | 🔀 **Multi-inbound** support | +| 👨‍💼 **Multi-admin** support | 📦 **Docker** ready | 🎯 **Single port** fallbacks | + +
+ +#### 🎯 **Key Capabilities:** + +- ✅ **Built-in Web UI** - رابط کاربری وب داخلی +- ✅ **Fully REST API** backend - بک‌اند API کامل +- ✅ **[Multiple Nodes](#node)** support - پشتیبانی از چندین نود +- ✅ **Multi-protocol** for a single user - چندین پروتکل برای یک کاربر +- ✅ **Multi-user** on a single inbound - چندین کاربر روی یک inbound +- ✅ **Multi-inbound** on a **single port** - چندین inbound روی یک پورت +- ✅ **Traffic** and **expiry date** limitations - محدودیت ترافیک و تاریخ انقضا +- ✅ **Periodic** traffic limit (daily, weekly, etc.) - محدودیت ترافیک دوره‌ای +- ✅ **Subscription link** compatible with **V2ray**, **Clash** and **ClashMeta** +- ✅ Automated **Share link** and **QRcode** generator +- ✅ System monitoring and **traffic statistics** +- ✅ Customizable xray configuration +- ✅ **TLS** and **REALITY** support +- ✅ Integrated **Telegram Bot** +- ✅ Integrated **Command Line Interface (CLI)** +- ✅ **Multi-language** support +- ✅ **Multi-admin** support (WIP) + +# 🚀 Installation guide + +
+ +## ⚠️ هشدار | Warning + +دستورات زیر نسخه‌های پیش‌انتشار (آلفا/بتا) را نصب می‌کنند + +The following commands will install the pre-release versions (alpha/beta) + +
+ +## 📦 نصب با پایگاه داده SQLite | Install with SQLite Database + +```bash +sudo bash -c "$(curl -sL https://github.com/PasarGuard/scripts/raw/main/pasarguard.sh)" @ install --pre-release +``` + +## 🗄️ نصب با پایگاه داده MySQL | Install with MySQL Database + +```bash +sudo bash -c "$(curl -sL https://github.com/PasarGuard/scripts/raw/main/pasarguard.sh)" @ install --database mysql --pre-release +``` + +## 🗃️ نصب با پایگاه داده MariaDB | Install with MariaDB Database + +```bash +sudo bash -c "$(curl -sL https://github.com/PasarGuard/scripts/raw/main/pasarguard.sh)" @ install --database mariadb --pre-release +``` + +## 🐘 نصب با پایگاه داده PostgreSQL | Install with PostgreSQL Database + +```bash +sudo bash -c "$(curl -sL https://github.com/PasarGuard/scripts/raw/main/pasarguard.sh)" @ install --database postgresql --pre-release +``` + +## ✅ پس از تکمیل نصب | After Installation Complete + +
+ +### 📋 مراحل بعدی | Next Steps + +
+ +- ✅ **Logs**: شما لاگ‌ها را خواهید دید که می‌توانید با بستن ترمینال یا فشردن `Ctrl+C` آن‌ها را متوقف کنید +- 📁 **Files Location**: فایل‌های PasarGuard در `/opt/pasarguard` قرار خواهند گرفت +- ⚙️ **Configuration**: فایل پیکربندی در `/opt/pasarguard/.env` یافت می‌شود +- 💾 **Data Files**: فایل‌های داده در `/var/lib/pasarguard` قرار خواهند گرفت +- 🔒 **Security**: داشبورد PasarGuard به دلایل امنیتی از طریق آدرس IP قابل دسترسی نیست +- 🌐 **SSL Required**: باید [گواهی SSL دریافت کنید](https://PasarGuard.github.io/PasarGuard/en/examples/issue-ssl-certificate) و به `https://YOUR_DOMAIN:8000/dashboard/` دسترسی پیدا کنید + +### 🔗 دسترسی محلی با SSH | Local Access via SSH + +```bash +ssh -L 8000:localhost:8000 user@serverip +``` + +سپس در مرورگر خود به آدرس زیر بروید: + +Then navigate to the following link in your browser: + +``` +http://localhost:8000/dashboard/ +``` + +⚠️ **توجه**: دسترسی به داشبورد با بستن ترمینال SSH از بین می‌رود. این روش فقط برای تست توصیه می‌شود. + +### 👨‍💼 ایجاد ادمین | Create Admin + +```bash +pasarguard cli admin create --sudo +``` + +### ❓ راهنمایی | Help + +```bash +pasarguard --help +``` + +## 🔧 نصب دستی (پیشرفته) | Manual Install (Advanced) + +
+ +اگر می‌خواهید پروژه را با کد منبع اجرا کنید، بخش زیر را بررسی کنید + +If you are eager to run the project using the source code, check the section below + +
+ +
+

🔧 Manual install (advanced) | نصب دستی (پیشرفته)

+ +### 🚀 مرحله 1: نصب Xray | Step 1: Install Xray + +```bash +bash -c "$(curl -L https://github.com/XTLS/Xray-install/raw/main/install-release.sh)" @ install +``` + +### 📥 مرحله 2: کلون پروژه | Step 2: Clone Project + +```bash +git clone https://github.com/PasarGuard/panel.git +cd PasarGuard +curl -LsSf https://astral.sh/uv/install.sh | sh +uv sync +``` + +> **نکته**: شما به Python >= 3.12.7 نیاز دارید | You need Python >= 3.12.7 + +### 🗄️ مرحله 3: مهاجرت پایگاه داده | Step 3: Database Migration + +```bash +uv run alembic upgrade head +``` + +### 💻 مرحله 4: نصب CLI | Step 4: Install CLI + +```bash +sudo ln -s $(pwd)/PasarGuard-cli.py /usr/bin/pasarguard-cli +sudo chmod +x /usr/bin/pasarguard-cli +pasarguard-cli completion install +``` + +### ⚙️ مرحله 5: پیکربندی | Step 5: Configuration + +```bash +cp .env.example .env +nano .env +``` + +> 📖 برای اطلاعات بیشتر بخش [پیکربندی](#configuration) را بررسی کنید | Check [configurations](#configuration) section for more information + +### 🚀 مرحله 6: اجرای برنامه | Step 6: Run Application + +```bash +uv run main.py +``` + +### 🔧 اجرا با systemctl | Run with systemctl + +```bash +systemctl enable /var/lib/pasarguard/PasarGuard.service +systemctl start PasarGuard +``` + +### 🌐 پیکربندی Nginx | Nginx Configuration + +```nginx +server { + listen 443 ssl http2; + listen [::]:443 ssl http2; + server_name example.com; + + ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; + + location ~* /(dashboard|statics|sub|api|docs|redoc|openapi.json) { + proxy_pass http://0.0.0.0:8000; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + + # xray-core ws-path: / + # client ws-path: /PasarGuard/me/2087 + # + # All traffic is proxed through port 443, and send to the xray port(2087, 2088 etc.). + # The '/PasarGuard' in location regex path can changed any characters by yourself. + # + # /${path}/${username}/${xray-port} + location ~* /PasarGuard/.+/(.+)$ { + proxy_redirect off; + proxy_pass http://127.0.0.1:$1/; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } +} +``` + +### 🌐 پیکربندی ساده Nginx | Simple Nginx Configuration + +```nginx +server { + listen 443 ssl http2; + listen [::]:443 ssl http2; + server_name PasarGuard.example.com; + + ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; + + location / { + proxy_pass http://0.0.0.0:8000; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } +} +``` + +### 🌐 دسترسی به داشبورد | Dashboard Access + +به طور پیش‌فرض برنامه روی `http://localhost:8000/dashboard` اجرا می‌شود. می‌توانید با تغییر متغیرهای محیطی `UVICORN_HOST` و `UVICORN_PORT` آن را پیکربندی کنید. + +By default the app will be run on `http://localhost:8000/dashboard`. You can configure it using changing the `UVICORN_HOST` and `UVICORN_PORT` environment variables. + +
+ +# ⚙️ Configuration + +
+ +می‌توانید تنظیمات زیر را با استفاده از متغیرهای محیطی یا قرار دادن آن‌ها در فایل `.env` تنظیم کنید. + +You can set settings below using environment variables or placing them in `.env` file. + +
+ +## 📋 جدول متغیرهای پیکربندی | Configuration Variables Table + +| متغیر | Variable | توضیحات | Description | +|:---:|:---:|:---:|:---:| +| `SUDO_USERNAME` | SUDO_USERNAME | نام کاربری سوپرکاربر | Superuser's username | +| `SUDO_PASSWORD` | SUDO_PASSWORD | رمز عبور سوپرکاربر | Superuser's password | +| `SQLALCHEMY_DATABASE_URL` | SQLALCHEMY_DATABASE_URL | آدرس پایگاه داده | Database URL | +| `SQLALCHEMY_POOL_SIZE` | SQLALCHEMY_POOL_SIZE | اندازه پول اتصال (پیش‌فرض: 10) | Pool size (default: 10) | +| `SQLALCHEMY_MAX_OVERFLOW` | SQLALCHEMY_MAX_OVERFLOW | حداکثر سرریز (پیش‌فرض: 30) | Max overflow (default: 30) | +| `UVICORN_HOST` | UVICORN_HOST | میزبان اتصال (پیش‌فرض: 0.0.0.0) | Bind host (default: 0.0.0.0) | +| `UVICORN_PORT` | UVICORN_PORT | پورت اتصال (پیش‌فرض: 8000) | Bind port (default: 8000) | +| `UVICORN_UDS` | UVICORN_UDS | اتصال به سوکت دامنه UNIX | UNIX domain socket | +| `UVICORN_SSL_CERTFILE` | UVICORN_SSL_CERTFILE | فایل گواهی SSL | SSL certificate file | +| `UVICORN_SSL_KEYFILE` | UVICORN_SSL_KEYFILE | فایل کلید SSL | SSL key file | +| `UVICORN_SSL_CA_TYPE` | UVICORN_SSL_CA_TYPE | نوع گواهی CA (پیش‌فرض: public) | CA type (default: public) | +| `XRAY_JSON` | XRAY_JSON | مسیر فایل پیکربندی Xray | Xray config file path | +| `CUSTOM_TEMPLATES_DIRECTORY` | CUSTOM_TEMPLATES_DIRECTORY | مسیر قالب‌های سفارشی | Custom templates directory | +| `CLASH_SUBSCRIPTION_TEMPLATE` | CLASH_SUBSCRIPTION_TEMPLATE | قالب اشتراک Clash | Clash subscription template | +| `SUBSCRIPTION_PAGE_TEMPLATE` | SUBSCRIPTION_PAGE_TEMPLATE | قالب صفحه اشتراک | Subscription page template | +| `XRAY_SUBSCRIPTION_TEMPLATE` | XRAY_SUBSCRIPTION_TEMPLATE | قالب اشتراک Xray | Xray subscription template | +| `SINGBOX_SUBSCRIPTION_TEMPLATE` | SINGBOX_SUBSCRIPTION_TEMPLATE | قالب اشتراک SingBox | SingBox subscription template | +| `HOME_PAGE_TEMPLATE` | HOME_PAGE_TEMPLATE | قالب صفحه اصلی | Home page template | +| `JWT_ACCESS_TOKEN_EXPIRE_MINUTES` | JWT_ACCESS_TOKEN_EXPIRE_MINUTES | زمان انقضای توکن (دقیقه) | Token expire time (minutes) | +| `DOCS` | DOCS | نمایش مستندات API | Show API docs | +| `DEBUG` | DEBUG | حالت دیباگ | Debug mode | +| `USERS_AUTODELETE_DAYS` | USERS_AUTODELETE_DAYS | حذف خودکار کاربران منقضی | Auto-delete expired users | +| `USER_AUTODELETE_INCLUDE_LIMITED_ACCOUNTS` | USER_AUTODELETE_INCLUDE_LIMITED_ACCOUNTS | شامل حساب‌های محدود | Include limited accounts | +| `XRAY_SUBSCRIPTION_PATH` | XRAY_SUBSCRIPTION_PATH | مسیر API اشتراک | Subscription API path | +| `ENABLE_RECORDING_NODES_STATS` | ENABLE_RECORDING_NODES_STATS | ثبت آمار نودها | Record node statistics | + +# 📚 Documentation + +
+ +[مستندات PasarGuard](https://PasarGuard.github.io/PasarGuard) تمام راهنمای‌های ضروری برای شروع کار را فراهم می‌کند و به سه زبان فارسی، انگلیسی و روسی در دسترس است. + +The [PasarGuard Documentation](https://PasarGuard.github.io/PasarGuard) provides all the essential guides to get you started, available in three languages: Farsi, English, and Russian. + +
+ +## 🤝 مشارکت در مستندات | Contributing to Documentation + +این مستندات نیاز به تلاش قابل توجهی برای پوشش جامع تمام جنبه‌های پروژه دارد. ما از مشارکت شما برای بهبود آن استقبال می‌کنیم. + +This documentation requires significant effort to cover all aspects of the project comprehensively. We welcome and appreciate your contributions to help us improve it. + +[مخزن GitHub مستندات](https://github.com/PasarGuard/PasarGuard.github.io) | [Documentation GitHub Repository](https://github.com/PasarGuard/PasarGuard.github.io) + +# 🔌 API + +
+ +PasarGuard یک REST API فراهم می‌کند که به توسعه‌دهندگان امکان تعامل برنامه‌نویسی با سرویس‌های PasarGuard را می‌دهد. + +PasarGuard provides a REST API that enables developers to interact with PasarGuard services programmatically. + +
+ +## 📖 مشاهده مستندات API | View API Documentation + +برای مشاهده مستندات API در Swagger UI یا ReDoc، متغیر پیکربندی `DOCS=True` را تنظیم کنید و به `/docs` و `/redoc` بروید. + +To view the API documentation in Swagger UI or ReDoc, set the configuration variable `DOCS=True` and navigate to the `/docs` and `/redoc`. + +# 💾 Backup + +
+ +## 🔄 سرویس پشتیبان‌گیری خودکار | Automated Backup Service + +همیشه ایده خوبی است که فایل‌های PasarGuard خود را به طور منظم پشتیبان‌گیری کنید تا از از دست رفتن داده در صورت خرابی سیستم یا حذف تصادفی جلوگیری کنید. + +It's always a good idea to backup your PasarGuard files regularly to prevent data loss in case of system failures or accidental deletion. + +
+ +## 📋 مراحل پشتیبان‌گیری | Backup Steps + +1. **📁 فایل‌های مهم**: به طور پیش‌فرض، تمام فایل‌های مهم PasarGuard در `/var/lib/pasarguard` ذخیره می‌شوند +2. **⚙️ فایل پیکربندی**: فایل env و فایل پیکربندی Xray را نیز پشتیبان‌گیری کنید +3. **📂 مسیر پیکربندی**: اگر با اسکریپت PasarGuard نصب کرده‌اید، پیکربندی‌ها در `/opt/pasarguard/` قرار دارند + +## 🤖 سرویس پشتیبان‌گیری تلگرام | Telegram Backup Service + +سرویس پشتیبان‌گیری PasarGuard به طور کارآمد تمام فایل‌های ضروری را فشرده می‌کند و آن‌ها را به ربات تلگرام مشخص شده شما ارسال می‌کند. + +### ✨ ویژگی‌ها | Features + +- ✅ پشتیبانی از SQLite، MySQL و MariaDB +- ✅ خودکارسازی با امکان زمان‌بندی پشتیبان‌گیری هر ساعت +- ✅ بدون محدودیت آپلود تلگرام (فایل‌های بزرگ تقسیم می‌شوند) +- ✅ امکان پشتیبان‌گیری فوری در هر زمان + +### 🚀 نصب و راه‌اندازی | Installation & Setup + +```bash +# نصب آخرین نسخه اسکریپت PasarGuard +sudo bash -c "$(curl -sL https://github.com/PasarGuard/scripts/raw/main/pasarguard.sh)" @ install-script + +# راه‌اندازی سرویس پشتیبان‌گیری +pasarguard backup-service + +# پشتیبان‌گیری فوری +pasarguard backup +``` + +## 💡 نکات مهم | Important Notes + +- 🔄 پشتیبان‌گیری‌ها را به طور منظم به‌روزرسانی کنید +- 📁 تمام فایل‌های داده و پیکربندی را پشتیبان‌گیری کنید +- 🔐 فایل‌های env و پیکربندی Xray را فراموش نکنید + +# 🤖 Telegram Bot + +
+ +PasarGuard با یک ربات تلگرام یکپارچه همراه است که می‌تواند مدیریت سرور، ایجاد و حذف کاربران و ارسال اعلان‌ها را انجام دهد. + +PasarGuard comes with an integrated Telegram bot that can handle server management, user creation and removal, and send notifications. + +
+ +## ⚙️ راه‌اندازی ربات تلگرام | Enable Telegram Bot + +این ربات را می‌توان با دنبال کردن چند مرحله ساده به راحتی فعال کرد و راهی راحت برای تعامل با PasarGuard بدون نیاز به ورود به سرور در هر بار فراهم می‌کند. + +This bot can be easily enabled by following a few simple steps, and it provides a convenient way to interact with PasarGuard without having to log in to the server every time. + +### 🔧 مراحل راه‌اندازی | Setup Steps + +1. **🔑 تنظیم توکن API**: `TELEGRAM_API_TOKEN` را به توکن API ربات خود تنظیم کنید +2. **👤 تنظیم شناسه ادمین**: `TELEGRAM_ADMIN_ID` را به شناسه عددی حساب تلگرام خود تنظیم کنید + +### 📱 دریافت شناسه تلگرام | Get Telegram ID + +می‌توانید شناسه خود را از [@userinfobot](https://t.me/userinfobot) دریافت کنید. + +You can get your ID from [@userinfobot](https://t.me/userinfobot). + +# 💻 PasarGuard CLI + +
+ +PasarGuard با یک CLI یکپارچه به نام `PasarGuard-cli` همراه است که به مدیران امکان تعامل مستقیم با آن را می‌دهد. + +PasarGuard comes with an integrated CLI named `PasarGuard-cli` which allows administrators to have direct interaction with it. + +
+ +## 🚀 استفاده از CLI | Using CLI + +اگر PasarGuard را با اسکریپت نصب آسان نصب کرده‌اید، می‌توانید با اجرای دستور زیر به دستورات CLI دسترسی پیدا کنید: + +If you've installed PasarGuard using easy install script, you can access the cli commands by running: + +```bash +pasarguard cli [OPTIONS] COMMAND [ARGS]... +``` + +## 📖 مستندات CLI | CLI Documentation + +برای اطلاعات بیشتر، می‌توانید [مستندات PasarGuard CLI](./cli/README.md) را مطالعه کنید. + +For more information, You can read [PasarGuard CLI's documentation](./cli/README.md). + +# 🖥️ PasarGuard TUI + +
+ +PasarGuard همچنین یک رابط کاربری ترمینال (TUI) برای مدیریت تعاملی مستقیماً در ترمینال شما فراهم می‌کند. + +PasarGuard also provides a Terminal User Interface (TUI) for interactive management directly within your terminal. + +
+ +## 🚀 استفاده از TUI | Using TUI + +اگر PasarGuard را با اسکریپت نصب آسان نصب کرده‌اید، می‌توانید با اجرای دستور زیر به TUI دسترسی پیدا کنید: + +If you've installed PasarGuard using the easy install script, you can access the TUI by running: + +```bash +pasarguard tui +``` + +## 📖 مستندات TUI | TUI Documentation + +برای اطلاعات بیشتر، می‌توانید [مستندات PasarGuard TUI](./tui/README.md) را مطالعه کنید. + +For more information, you can read [PasarGuard TUI's documentation](./tui/README.md). + +# 🌐 Node + +
+ +پروژه PasarGuard [node](https://github.com/PasarGuard/node) را معرفی می‌کند که توزیع زیرساخت را متحول می‌کند. + +The PasarGuard project introduces the [node](https://github.com/PasarGuard/node), which revolutionizes infrastructure distribution. + +
+ +## ✨ مزایای Node | Node Benefits + +با node، می‌توانید زیرساخت خود را در چندین مکان توزیع کنید و از مزایایی مانند: + +With node, you can distribute your infrastructure across multiple locations, unlocking benefits such as: + +- 🔄 **Redundancy** - افزونگی +- ⚡ **High Availability** - در دسترس بودن بالا +- 📈 **Scalability** - مقیاس‌پذیری +- 🔧 **Flexibility** - انعطاف‌پذیری + +## 🎯 انعطاف کاربران | User Flexibility + +node به کاربران امکان اتصال به سرورهای مختلف را می‌دهد و انعطاف انتخاب و اتصال به چندین سرور به جای محدودیت به یک سرور را فراهم می‌کند. + +node empowers users to connect to different servers, offering them the flexibility to choose and connect to multiple servers instead of being limited to only one server. + +## 📖 مستندات Node | Node Documentation + +برای اطلاعات تفصیلی و دستورالعمل‌های نصب، لطفاً به [مستندات رسمی PasarGuard-node](https://github.com/PasarGuard/node) مراجعه کنید. + +For more detailed information and installation instructions, please refer to the [PasarGuard-node official documentation](https://github.com/PasarGuard/node) + +# 🔔 Webhook notifications + +
+ +می‌توانید یک آدرس webhook تنظیم کنید و PasarGuard اعلان‌ها را به آن آدرس ارسال کند. + +You can set a webhook address and PasarGuard will send the notifications to that address. + +
+ +## 📡 نحوه کارکرد | How it Works + +درخواست‌ها به عنوان درخواست POST به آدرس ارائه شده توسط `WEBHOOK_ADDRESS` با `WEBHOOK_SECRET` به عنوان `x-webhook-secret` در هدرها ارسال می‌شوند. + +The requests will be sent as a post request to the address provided by `WEBHOOK_ADDRESS` with `WEBHOOK_SECRET` as `x-webhook-secret` in the headers. + +## 📋 مثال درخواست | Example Request + +```http +Headers: +Host: 0.0.0.0:9000 +User-Agent: python-requests/2.28.1 +Accept-Encoding: gzip, deflate +Accept: */* +Connection: keep-alive +x-webhook-secret: something-very-very-secret +Content-Length: 107 +Content-Type: application/json + +Body: +{"username": "PasarGuard_test_user", "action": "user_updated", "enqueued_at": 1680506457.636369, "tries": 0} +``` + +## 🎯 انواع عملیات | Action Types + +انواع مختلف عملیات عبارتند از: `user_created`, `user_updated`, `user_deleted`, `user_limited`, `user_expired`, `user_disabled`, `user_enabled` + +Different action types are: `user_created`, `user_updated`, `user_deleted`, `user_limited`, `user_expired`, `user_disabled`, `user_enabled` + +# 💝 Donation + +
+ +اگر PasarGuard را مفید یافتید و می‌خواهید از توسعه آن پشتیبانی کنید، می‌توانید کمک مالی کنید. + +If you found PasarGuard useful and would like to support its development, you can make a donation. + +
+ +## 🎯 حمایت از پروژه | Support the Project + +[کمک مالی کنید](https://donate.gozargah.pro) | [Make a Donation](https://donate.gozargah.pro) + +از حمایت شما متشکریم! | Thank you for your support! + +# 📄 License + +
+ +ساخته شده در [نامشخص!] و منتشر شده تحت [AGPL-3.0](./LICENSE). + +Made in [Unknown!] and Published under [AGPL-3.0](./LICENSE). + +
+ +# 👥 Contributors + +
+ +ما ❤️‍🔥 مشارکت‌کنندگان را دوست داریم! اگر می‌خواهید مشارکت کنید، لطفاً [راهنمای مشارکت](CONTRIBUTING.md) ما را بررسی کنید و آزادانه یک pull request ارسال کنید یا issue باز کنید. + +We ❤️‍🔥 contributors! If you'd like to contribute, please check out our [Contributing Guidelines](CONTRIBUTING.md) and feel free to submit a pull request or open an issue. + +
+ +## 🤝 پیوستن به جامعه | Join the Community + +همچنین از شما دعوت می‌کنیم به گروه [تلگرام](https://t.me/Pasar_Guard) ما برای پشتیبانی یا راهنمایی مشارکت بپیوندید. + +We also welcome you to join our [Telegram](https://t.me/Pasar_Guard) group for either support or contributing guidance. + +## 🐛 کمک به پیشرفت پروژه | Help Project Progress + +[مسائل باز](https://github.com/PasarGuard/panel/issues) را بررسی کنید تا به پیشرفت این پروژه کمک کنید. + +Check [open issues](https://github.com/PasarGuard/panel/issues) to help the progress of this project. + +
+ +## 🙏 تشکر از مشارکت‌کنندگان | Thanks to Contributors + +از تمام مشارکت‌کنندگانی که به بهبود PasarGuard کمک کرده‌اند متشکریم: + +Thanks to the all contributors who have helped improve PasarGuard: + +
+ +
+ + + + + +
+ +
+ +ساخته شده با contrib.rocks + +Made with contrib.rocks + +
diff --git a/alembic.ini b/alembic.ini new file mode 100644 index 000000000..402281a09 --- /dev/null +++ b/alembic.ini @@ -0,0 +1,99 @@ +# A generic, single database configuration. + +[alembic] +# path to migration scripts +script_location = app/db/migrations + +# template used to generate migration file names; The default value is %%(rev)s_%%(slug)s +# Uncomment the line below if you want the files to be prepended with date and time +# see https://alembic.sqlalchemy.org/en/latest/tutorial.html#editing-the-ini-file +# for all available tokens +# file_template = %%(year)d_%%(month).2d_%%(day).2d_%%(hour).2d%%(minute).2d-%%(rev)s_%%(slug)s + +# sys.path path, will be prepended to sys.path if present. +# defaults to the current working directory. +prepend_sys_path = . + +# timezone to use when rendering the date within the migration file +# as well as the filename. +# If specified, requires the python-dateutil library that can be +# installed by adding `alembic[tz]` to the pip requirements +# string value is passed to dateutil.tz.gettz() +# leave blank for localtime +# timezone = + +# max length of characters to apply to the +# "slug" field +# truncate_slug_length = 40 + +# set to 'true' to run the environment during +# the 'revision' command, regardless of autogenerate +# revision_environment = false + +# set to 'true' to allow .pyc and .pyo files without +# a source .py file to be detected as revisions in the +# versions/ directory +# sourceless = false + +# version location specification; This defaults +# to app/db/migrations/versions. When using multiple version +# directories, initial revisions must be specified with --version-path. +# The path separator used here should be the separator specified by "version_path_separator" below. +# version_locations = %(here)s/bar:%(here)s/bat:app/db/migrations/versions + +# version path separator; As mentioned above, this is the character used to split +# version_locations. The default within new alembic.ini files is "os", which uses os.pathsep. +# If this key is omitted entirely, it falls back to the legacy behavior of splitting on spaces and/or commas. +# Valid values for version_path_separator are: +# +# version_path_separator = : +# version_path_separator = ; +# version_path_separator = space +version_path_separator = os # Use os.pathsep. Default configuration used for new projects. + + +[post_write_hooks] +# post_write_hooks defines scripts or Python functions that are run +# on newly generated revision scripts. See the documentation for further +# detail and examples + +# format using "black" - use the console_scripts runner, against the "black" entrypoint +# hooks = black +# black.type = console_scripts +# black.entrypoint = black +# black.options = -l 79 REVISION_SCRIPT_FILENAME + +# Logging configuration +[loggers] +keys = root,sqlalchemy,alembic + +[handlers] +keys = console + +[formatters] +keys = generic + +[logger_root] +level = WARN +handlers = console +qualname = + +[logger_sqlalchemy] +level = WARN +handlers = +qualname = sqlalchemy.engine + +[logger_alembic] +level = INFO +handlers = +qualname = alembic + +[handler_console] +class = StreamHandler +args = (sys.stderr,) +level = NOTSET +formatter = generic + +[formatter_generic] +format = %(levelname)-5.5s [%(name)s] %(message)s +datefmt = %H:%M:%S diff --git a/app/__init__.py b/app/__init__.py new file mode 100644 index 000000000..4a1b66598 --- /dev/null +++ b/app/__init__.py @@ -0,0 +1,116 @@ +import asyncio +from contextlib import asynccontextmanager + +from apscheduler.schedulers.asyncio import AsyncIOScheduler +from fastapi import FastAPI, Request, status +from fastapi.encoders import jsonable_encoder +from fastapi.exceptions import RequestValidationError +from fastapi.middleware.cors import CORSMiddleware +from fastapi.responses import JSONResponse +from fastapi.routing import APIRoute + +from app.utils.logger import get_logger +from config import ALLOWED_ORIGINS, DOCS, SUBSCRIPTION_PATH + +__version__ = "1.0.0-rc-2" + +startup_functions = [] +shutdown_functions = [] + + +def on_startup(func): + startup_functions.append(func) + return func + + +def on_shutdown(func): + shutdown_functions.append(func) + return func + + +@asynccontextmanager +async def lifespan(app: FastAPI): + for func in startup_functions: + if callable(func): + if asyncio.iscoroutinefunction(func): # Better way to check if it's async + if "app" in func.__code__.co_varnames: + await func(app) + else: + await func() + else: + if "app" in func.__code__.co_varnames: + func(app) + else: + func() + yield + + for func in shutdown_functions: + if callable(func): + if asyncio.iscoroutinefunction(func): + if "app" in func.__code__.co_varnames: + await func(app) + else: + await func() + else: + if "app" in func.__code__.co_varnames: + func(app) + else: + func() + + +app = FastAPI( + title="PasarGuardAPI", + description="Unified GUI Censorship Resistant Solution", + version=__version__, + lifespan=lifespan, + openapi_url="/openapi.json" if DOCS else None, +) + +scheduler = AsyncIOScheduler(job_defaults={"max_instances": 20}, timezone="UTC") +logger = get_logger() + + +app.add_middleware( + CORSMiddleware, + allow_origins=ALLOWED_ORIGINS, + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) +from app import routers, telegram, jobs # noqa +from app.routers import api_router # noqa + +app.include_router(api_router) + + +def use_route_names_as_operation_ids(app: FastAPI) -> None: + for route in app.routes: + if isinstance(route, APIRoute): + route.operation_id = route.name + + +use_route_names_as_operation_ids(app) + + +@on_startup +def validate_paths(): + paths = [f"{r.path}/" for r in app.routes] + paths.append("/api/") + if f"/{SUBSCRIPTION_PATH}/" in paths: + raise ValueError(f"you can't use /{SUBSCRIPTION_PATH}/ as subscription path it reserved for {app.title}") + + +on_startup(scheduler.start) +on_shutdown(scheduler.shutdown) +on_startup(lambda: logger.info(f"PasarGuard v{__version__}")) + + +@app.exception_handler(RequestValidationError) +def validation_exception_handler(request: Request, exc: RequestValidationError): + details = {} + for error in exc.errors(): + details[error["loc"][-1]] = error.get("msg") + return JSONResponse( + status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, + content=jsonable_encoder({"detail": details}), + ) diff --git a/app/core/__init__.py b/app/core/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/app/core/abstract_core.py b/app/core/abstract_core.py new file mode 100644 index 000000000..ed5fba392 --- /dev/null +++ b/app/core/abstract_core.py @@ -0,0 +1,21 @@ +from abc import ABC, abstractmethod + + +class AbstractCore(ABC): + @abstractmethod + def __init__(self, config: dict, exclude_inbound_tags: list[str], fallbacks_inbound_tags: list[str]) -> None: + raise NotImplementedError + + @abstractmethod + def to_str(self, **json_kwargs) -> str: + raise NotImplementedError + + @property + @abstractmethod + def inbounds_by_tag(self) -> dict: + raise NotImplementedError + + @property + @abstractmethod + def inbounds(self) -> list[str]: + raise NotImplementedError diff --git a/app/core/hosts.py b/app/core/hosts.py new file mode 100644 index 000000000..508b9eca6 --- /dev/null +++ b/app/core/hosts.py @@ -0,0 +1,76 @@ +from sqlalchemy.ext.asyncio import AsyncSession + +from app import on_startup +from app.core.manager import core_manager +from app.db import GetDB +from app.db.crud.host import get_host_by_id, get_hosts, get_or_create_inbound +from app.db.models import ProxyHost, ProxyHostSecurity +from app.models.host import MuxSettings, TransportSettings +from app.utils.store import DictStorage + + +def _prepare_host_data(host: ProxyHost) -> dict: + return { + "remark": host.remark, + "inbound_tag": host.inbound_tag, + "address": [v for v in host.address], + "port": host.port, + "path": host.path or None, + "sni": [v for v in host.sni] if host.sni else [], + "host": [v for v in host.host] if host.host else [], + "alpn": [alpn.value for alpn in host.alpn] if host.alpn else [], + "fingerprint": host.fingerprint.value, + "tls": None if host.security == ProxyHostSecurity.inbound_default else host.security.value, + "allowinsecure": host.allowinsecure, + "fragment_settings": host.fragment_settings, + "noise_settings": host.noise_settings, + "random_user_agent": host.random_user_agent, + "use_sni_as_host": host.use_sni_as_host, + "http_headers": host.http_headers, + "mux_settings": MuxSettings.model_validate(host.mux_settings).model_dump(by_alias=True, exclude_none=True) + if host.mux_settings + else {}, + "transport_settings": TransportSettings.model_validate(host.transport_settings).model_dump( + by_alias=True, exclude_none=True + ) + if host.transport_settings + else {}, + "status": host.status, + "ech_config_list": host.ech_config_list, + } + + +@DictStorage +async def hosts(storage: dict, db: AsyncSession): + inbounds_list = await core_manager.get_inbounds() + for tag in inbounds_list: + await get_or_create_inbound(db, tag) + + storage.clear() + db_hosts = await get_hosts(db) + + for host in db_hosts: + if host.is_disabled or (host.inbound_tag not in inbounds_list): + continue + downstream = None + if ( + host.transport_settings + and host.transport_settings.get("xhttp_settings") + and (ds_host := host.transport_settings.get("xhttp_settings", {}).get("download_settings")) + ): + downstream = await get_host_by_id(db, ds_host) + + host_data = _prepare_host_data(host) + + if downstream: + host_data["downloadSettings"] = _prepare_host_data(downstream) + else: + host_data["downloadSettings"] = None + + storage[host.id] = host_data + + +@on_startup +async def initialize_hosts(): + async with GetDB() as db: + await hosts.update(db) diff --git a/app/core/manager.py b/app/core/manager.py new file mode 100644 index 000000000..43781f875 --- /dev/null +++ b/app/core/manager.py @@ -0,0 +1,97 @@ +from copy import deepcopy + +from aiorwlock import RWLock +from aiocache import cached + +from app import on_startup +from app.core.abstract_core import AbstractCore +from app.core.xray import XRayConfig +from app.db import GetDB +from app.db.crud.core import get_core_configs +from app.db.models import CoreConfig + + +class CoreManager: + def __init__(self): + self._cores: dict[int, AbstractCore] = {} + self._lock = RWLock(fast=True) + self._inbounds: list[str] = [] + self._inbounds_by_tag = {} + + @staticmethod + def validate_core( + config: dict, exclude_inbounds: set[str] | None = None, fallbacks_inbounds: set[str] | None = None + ): + exclude_inbounds = exclude_inbounds or set() + fallbacks_inbounds = fallbacks_inbounds or set() + return XRayConfig(config, exclude_inbounds.copy(), fallbacks_inbounds.copy()) + + async def update_inbounds(self): + async with self._lock.writer_lock: + new_inbounds = {} + for core in self._cores.values(): + new_inbounds.update(core.inbounds_by_tag) + + self._inbounds_by_tag = new_inbounds + self._inbounds = list(self._inbounds_by_tag.keys()) + + await self.get_inbounds.cache.clear() + await self.get_inbounds_by_tag.cache.clear() + + async def update_core(self, db_core_config: CoreConfig): + backend_config = self.validate_core( + db_core_config.config, db_core_config.exclude_inbound_tags, db_core_config.fallbacks_inbound_tags + ) + + async with self._lock.writer_lock: + self._cores.update({db_core_config.id: backend_config}) + + await self.update_inbounds() + + async def remove_core(self, core_id: int): + async with self._lock.writer_lock: + core = self._cores.get(core_id, None) + if core: + del self._cores[core_id] + else: + return + + await self.update_inbounds() + + async def get_core(self, core_id: int) -> AbstractCore | None: + async with self._lock.reader_lock: + core = self._cores.get(core_id, None) + + if not core: + core = self._cores.get(1) + + return core + + @cached() + async def get_inbounds(self) -> list[str]: + async with self._lock.reader_lock: + return deepcopy(self._inbounds) + + @cached() + async def get_inbounds_by_tag(self) -> dict: + async with self._lock.reader_lock: + return deepcopy(self._inbounds_by_tag) + + async def get_inbound_by_tag(self, tag) -> dict: + async with self._lock.reader_lock: + inbound = self._inbounds_by_tag.get(tag, None) + if not inbound: + return None + return deepcopy(inbound) + + +core_manager = CoreManager() + + +@on_startup +async def init_core_manager(): + async with GetDB() as db: + core_configs, _ = await get_core_configs(db) + + for config in core_configs: + await core_manager.update_core(config) diff --git a/app/core/xray.py b/app/core/xray.py new file mode 100644 index 000000000..b626420bf --- /dev/null +++ b/app/core/xray.py @@ -0,0 +1,413 @@ +from __future__ import annotations + +import base64 +import json +from copy import deepcopy +from pathlib import PosixPath +from typing import Union + +import commentjson + +from app.utils.crypto import get_cert_SANs, get_x25519_public_key + + +class XRayConfig(dict): + def __init__( + self, + config: Union[dict, str, PosixPath] = {}, + exclude_inbound_tags: set[str] | None = set(), + fallbacks_inbound_tags: set[str] | None = set(), + ): + """Initialize the XRay config.""" + if isinstance(config, str): + # considering string as json + config = commentjson.loads(config) + + if isinstance(config, dict): + config = deepcopy(config) + + super().__init__(config) + self._validate() + + if exclude_inbound_tags is None: + exclude_inbound_tags = set() + if fallbacks_inbound_tags is None: + fallbacks_inbound_tags = set() + exclude_inbound_tags.update(fallbacks_inbound_tags) + self.exclude_inbound_tags = exclude_inbound_tags + + self._inbounds = [] + self._inbounds_by_tag = {} + self._fallbacks_inbound = [] + for tag in fallbacks_inbound_tags: + inbound = self.get_inbound(tag) + if inbound: + self._fallbacks_inbound.append(inbound) + self._resolve_inbounds() + + def _validate(self): + """Validate the config.""" + if not self.get("inbounds"): + raise ValueError("config doesn't have inbounds") + + if not self.get("outbounds"): + raise ValueError("config doesn't have outbounds") + + for inbound in self["inbounds"]: + if not inbound.get("tag"): + raise ValueError("all inbounds must have a unique tag") + if "," in inbound.get("tag"): + raise ValueError("character «,» is not allowed in inbound tag") + if "<=>" in inbound.get("tag"): + raise ValueError("character «<=>» is not allowed in inbound tag") + for outbound in self["outbounds"]: + if not outbound.get("tag"): + raise ValueError("all outbounds must have a unique tag") + + def _find_fallback_inbound(self, inbound: dict) -> list: + """Find fallback inbounds for an inbound.""" + fallback_inbounds = [] + for fallback in self._fallbacks_inbound: + for fallback_settings in fallback.get("settings", {}).get("fallbacks", []): + if fallback_settings.get("dest", "") == inbound.get("listen") or fallback_settings.get( + "dest", "" + ) == inbound.get("port", 0): + fallback_inbounds.append(fallback) + return fallback_inbounds + + def _create_base_settings(self, inbound: dict) -> dict: + """Create base settings for an inbound.""" + settings = { + "tag": inbound["tag"], + "protocol": inbound["protocol"], + "port": None, + "network": "tcp", + "tls": "none", + "sni": [], + "host": [], + "path": "", + "header_type": "", + "is_fallback": False, + "fallbacks": [], + } + return settings + + def _handle_port_settings(self, inbound: dict, settings: dict): + """Handle port settings for an inbound.""" + port_found = True + try: + settings["port"] = inbound["port"] + except KeyError: + port_found = False + + if self._fallbacks_inbound and "<=>" not in inbound["tag"]: + if inbound.get("settings", {}).get("fallbacks", []): + if not port_found: + raise ValueError(f"{settings['tag']} inbound doesn't have port") + else: + return + fallbacks = self._find_fallback_inbound(inbound) + if fallbacks: + settings["is_fallback"] = True + settings["fallbacks"] = fallbacks + elif not port_found: + raise ValueError(f"{settings['tag']} inbound doesn't have port") + + def _handle_tls_settings(self, tls_settings: dict, settings: dict, inbound_tag: str): + """Handle TLS security settings.""" + settings["tls"] = "tls" + for certificate in tls_settings.get("certificates", []): + if certificate.get("certificateFile", None): + with open(certificate["certificateFile"], "rb") as file: + cert = file.read() + settings["sni"].extend(get_cert_SANs(cert)) + + if certificate.get("keyFile", None): + with open(certificate["keyFile"], "rb") as file: + key = file.read() + else: + raise ValueError(f"{inbound_tag} inbound doesn't keyFile in tlsSettings") + + certificate["certificate"] = [line.decode() for line in cert.splitlines()] + certificate["key"] = [line.decode() for line in key.splitlines()] + + del certificate["certificateFile"] + del certificate["keyFile"] + + elif certificate.get("certificate", None): + cert = certificate["certificate"] + if isinstance(cert, list): + cert = "\n".join(cert) + if isinstance(cert, str): + cert = cert.encode() + settings["sni"].extend(get_cert_SANs(cert)) + + return tls_settings + + def _handle_reality_settings(self, tls_settings: dict, settings: dict, inbound_tag: str): + """Handle Reality security settings.""" + settings["fp"] = "chrome" + settings["tls"] = "reality" + settings["sni"] = tls_settings.get("serverNames", []) + + pvk = tls_settings.get("privateKey") + if not pvk: + raise ValueError(f"You need to provide privateKey in realitySettings of {inbound_tag}") + + settings["pbk"] = get_x25519_public_key(pvk) + if not settings.get("pbk"): + raise ValueError(f"You need to provide publicKey in realitySettings of {inbound_tag}") + + try: + settings["sids"] = tls_settings.get("shortIds") + settings["sids"][0] # check if there is any shortIds + except (IndexError, TypeError): + raise ValueError(f"You need to define at least one shortID in realitySettings of {inbound_tag}") + try: + settings["spx"] = tls_settings.get("SpiderX") + except Exception: + settings["spx"] = "" + + settings["mldsa65Verify"] = tls_settings.get("mldsa65Verify") + + def _handle_network_settings(self, net: str, net_settings: dict, settings: dict, inbound_tag: str): + """Handle network-specific settings.""" + if net in ("tcp", "raw"): + self._handle_tcp_raw_settings(net_settings, settings, inbound_tag) + elif net == "ws": + self._handle_ws_settings(net_settings, settings) + elif net in ("grpc", "gun"): + self._handle_grpc_settings(net_settings, settings) + elif net == "quic": + self._handle_quic_settings(net_settings, settings) + elif net == "httpupgrade": + self._handle_httpupgrade_settings(net_settings, settings) + elif net in ("splithttp", "xhttp"): + self._handle_xhttp_settings(net_settings, settings) + elif net == "kcp": + self._handle_kcp_settings(net_settings, settings) + elif net in ("http", "h2", "h3"): + self._handle_http_settings(net_settings, settings) + else: + self._handle_default_network_settings(net_settings, settings) + + def _handle_tcp_raw_settings(self, net_settings: dict, settings: dict, inbound_tag: str): + """Handle TCP and RAW network settings.""" + header = net_settings.get("header", {}) + request = header.get("request", {}) + path = request.get("path") + host = request.get("headers", {}).get("Host") + + settings["header_type"] = header.get("type", "none") + + if isinstance(path, str) or isinstance(host, str): + raise ValueError( + f"Settings of {inbound_tag} for path and host must be list, not str\n" + "https://xtls.github.io/config/transports/tcp.html#httpheaderobject" + ) + + if path and isinstance(path, list): + settings["path"] = path[0] + + if host and isinstance(host, list): + settings["host"] = host + + def _handle_ws_settings(self, net_settings: dict, settings: dict): + """Handle WebSocket network settings.""" + path = net_settings.get("path", "") + host = net_settings.get("host", "") or net_settings.get("headers", {}).get("Host") + + settings["header_type"] = "" + + if isinstance(path, list) or isinstance(host, list): + raise ValueError( + "Settings for path and host must be str, not list\n" + "https://xtls.github.io/config/transports/websocket.html#websocketobject" + ) + + if isinstance(path, str): + settings["path"] = path + + if isinstance(host, str): + settings["host"] = [host] + + def _handle_grpc_settings(self, net_settings: dict, settings: dict): + """Handle gRPC network settings.""" + settings["header_type"] = "" + settings["path"] = net_settings.get("serviceName", "") + host = net_settings.get("authority", "") + settings["host"] = [host] + + def _handle_quic_settings(self, net_settings: dict, settings: dict): + """Handle QUIC network settings.""" + settings["header_type"] = net_settings.get("header", {}).get("type", "") + settings["path"] = net_settings.get("key", "") + settings["host"] = [net_settings.get("security", "")] + + def _handle_httpupgrade_settings(self, net_settings: dict, settings: dict): + """Handle HTTP Upgrade network settings.""" + settings["path"] = net_settings.get("path", "") + host = net_settings.get("host", "") + settings["host"] = [host] + + def _handle_xhttp_settings(self, net_settings: dict, settings: dict): + """Handle XHTTP network settings.""" + settings["path"] = net_settings.get("path", "") + host = net_settings.get("host", "") + settings["host"] = [host] + settings["mode"] = net_settings.get("mode", "auto") + + def _handle_kcp_settings(self, net_settings: dict, settings: dict): + """Handle KCP network settings.""" + header = net_settings.get("header", {}) + settings["header_type"] = header.get("type", "") + settings["host"] = header.get("domain", "") + settings["path"] = net_settings.get("seed", "") + + def _handle_http_settings(self, net_settings: dict, settings: dict): + """Handle HTTP network settings.""" + settings["host"] = net_settings.get("host") or net_settings.get("Host", "") + settings["path"] = net_settings.get("path", "") + + def _handle_default_network_settings(self, net_settings: dict, settings: dict): + """Handle default network settings.""" + settings["path"] = net_settings.get("path", "") + host = net_settings.get("host", {}) or net_settings.get("Host", {}) + if host and isinstance(host, str): + settings["host"] = host + elif host and isinstance(host, list): + settings["host"] = host[0] + + def _handle_shadowsocks_settings(self, inbound_settings: dict, settings: dict): + """Handle shadowsocks special settings.""" + settings["method"] = inbound_settings.get("method", "") + if settings["method"] == "2022-blake3-chacha20-poly1305": + raise ValueError("only 2022-blake3-aes-*-gcm methods are supported") + if settings["method"].startswith("2022-blake3"): + settings["is_2022"] = True + password = inbound_settings.get("password", "") + + # Validate if password is a valid base64 string + try: + base64.b64decode(password, validate=True) + settings["password"] = password + except Exception: + raise ValueError("Shadowsocks password must be a valid base64 string") + else: + settings["is_2022"] = False + settings["header_type"] = "none" + + def _resolve_inbounds(self): + """Resolve all inbounds and their settings.""" + for inbound in self["inbounds"]: + self._read_inbound(inbound) + + def _read_inbound(self, inbound: dict): + """Read an inbound and its settings.""" + if inbound["protocol"] not in ("vmess", "vless", "trojan", "shadowsocks"): + return + + if inbound["tag"] in self.exclude_inbound_tags: + return + + if not inbound.get("settings"): + inbound["settings"] = {} + if not inbound["settings"].get("clients"): + inbound["settings"]["clients"] = [] + + settings = self._create_base_settings(inbound) + self._handle_port_settings(inbound, settings) + + if inbound["protocol"] == "vless": + settings["flow"] = inbound.get("settings").get("flow", "") + vless_decryption = inbound.get("settings").get("decryption", "none") + vless_encryption = inbound.get("settings").get("encryption", "none") + if vless_decryption != "none" and vless_encryption == "none": + raise ValueError(f"'encryption' key must be provided in {inbound['tag']} inbound") + settings["encryption"] = vless_encryption + + if inbound["protocol"] == "shadowsocks": + self._handle_shadowsocks_settings(inbound["settings"], settings) + + if stream := inbound.get("streamSettings"): + net = stream.get("network", "tcp") + net_settings = stream.get(f"{net}Settings", {}) + security = stream.get("security") + tls_settings = stream.get(f"{security}Settings") + + if settings["is_fallback"] is True: + for fallback in settings["fallbacks"]: + fallback_tag = f"{inbound['tag']}<=>{fallback['tag']}" # Fake inbound tag + if fallback_tag in self._inbounds_by_tag: + continue + try: + fallback_port = fallback["port"] + except KeyError: + raise ValueError("fallbacks inbound doesn't have port") + fallback_security = fallback.get("streamSettings", {}).get("security") + fallback_tls_settings = fallback.get("streamSettings", {}).get(f"{fallback_security}Settings", {}) + fallback_inbound = self._make_fallback_inbound( + deepcopy(inbound), fallback_security, fallback_tls_settings, fallback_tag, fallback_port + ) + self._read_inbound(fallback_inbound) + + settings["network"] = net + + if security == "tls": + stream["tlsSettings"] = self._handle_tls_settings(tls_settings, settings, inbound["tag"]) + elif security == "reality": + self._handle_reality_settings(tls_settings, settings, inbound["tag"]) + + self._handle_network_settings(net, net_settings, settings, inbound["tag"]) + + if inbound["tag"] not in self._inbounds: + self._inbounds.append(inbound["tag"]) + self._inbounds_by_tag[inbound["tag"]] = settings + + def _make_fallback_inbound( + self, + inbound: dict, + security: str, + tls_settings: dict, + inbound_tag: str, + port: int | str, + ): + """Make a fallback inbound.""" + fallback_inbound = { + **inbound, + "port": port, + "tag": inbound_tag, + } + fallback_inbound["streamSettings"]["security"] = security + fallback_inbound["streamSettings"][f"{security}Settings"] = tls_settings + return fallback_inbound + + def get_inbound(self, tag) -> dict: + """Get an inbound by tag.""" + for inbound in self["inbounds"]: + if inbound["tag"] == tag: + return inbound + + def get_outbound(self, tag) -> dict: + """Get an outbound by tag.""" + for outbound in self["outbounds"]: + if outbound["tag"] == tag: + return outbound + + def to_str(self, **json_kwargs) -> str: + """Convert the config to a JSON string.""" + return json.dumps(self, **json_kwargs) + + @property + def inbounds_by_tag(self) -> dict: + """Get inbounds by tag.""" + return self._inbounds_by_tag + + @property + def inbounds(self) -> list[str]: + """Get inbounds by tag.""" + return self._inbounds + + def copy(self): + """Copy the config.""" + return deepcopy(self) diff --git a/app/db/__init__.py b/app/db/__init__.py new file mode 100644 index 000000000..5cc091f93 --- /dev/null +++ b/app/db/__init__.py @@ -0,0 +1,16 @@ +from sqlalchemy.ext.asyncio import AsyncSession + +from .base import Base, GetDB, get_db # noqa + + +from .models import JWT, System, User # noqa + +__all__ = [ + "GetDB", + "get_db", + "User", + "System", + "JWT", + "Base", + "AsyncSession", +] diff --git a/app/db/base.py b/app/db/base.py new file mode 100644 index 000000000..16ed862f0 --- /dev/null +++ b/app/db/base.py @@ -0,0 +1,62 @@ +from sqlalchemy.exc import SQLAlchemyError +from sqlalchemy.ext.asyncio import AsyncAttrs, async_sessionmaker, create_async_engine +from sqlalchemy.orm import DeclarativeBase, MappedAsDataclass + +from config import ( + ECHO_SQL_QUERIES, + SQLALCHEMY_DATABASE_URL, + SQLALCHEMY_MAX_OVERFLOW, + SQLALCHEMY_POOL_SIZE, +) + +IS_SQLITE = SQLALCHEMY_DATABASE_URL.startswith("sqlite") + +if IS_SQLITE: + engine = create_async_engine( + SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False}, echo=ECHO_SQL_QUERIES + ) +else: + engine = create_async_engine( + SQLALCHEMY_DATABASE_URL, + pool_size=SQLALCHEMY_POOL_SIZE, + max_overflow=SQLALCHEMY_MAX_OVERFLOW, + pool_recycle=300, + pool_timeout=5, + pool_pre_ping=True, + echo=ECHO_SQL_QUERIES, + ) + +SessionLocal = async_sessionmaker(autocommit=False, autoflush=False, bind=engine) + +# Determine dialect once at startup based on connection URL +if SQLALCHEMY_DATABASE_URL.startswith("sqlite"): + DATABASE_DIALECT = "sqlite" +elif SQLALCHEMY_DATABASE_URL.startswith("postgresql"): + DATABASE_DIALECT = "postgresql" +elif SQLALCHEMY_DATABASE_URL.startswith("mysql"): + DATABASE_DIALECT = "mysql" +else: + raise ValueError("Unsupported database URL") + + +class Base(DeclarativeBase, MappedAsDataclass, AsyncAttrs): + pass + + +class GetDB: # Context Manager + def __init__(self): + self.db = SessionLocal() + + async def __aenter__(self): + return self.db + + async def __aexit__(self, exc_type, exc_value, traceback): + if isinstance(exc_value, SQLAlchemyError): + await self.db.rollback() # rollback on exception + + await self.db.close() + + +async def get_db(): # Dependency + async with GetDB() as db: + yield db diff --git a/app/db/compiles_types.py b/app/db/compiles_types.py new file mode 100644 index 000000000..e6aa4a7e7 --- /dev/null +++ b/app/db/compiles_types.py @@ -0,0 +1,118 @@ +from sqlalchemy import String, Numeric, TypeDecorator +from sqlalchemy.sql.expression import FunctionElement +from sqlalchemy.ext.compiler import compiles + + +class CaseSensitiveString(String): + def __init__(self, length=None): + super(CaseSensitiveString, self).__init__(length) + + +# Modify how this type is handled for each dialect +@compiles(CaseSensitiveString, "sqlite") +def compile_cs_sqlite(element, compiler, **kw): + return f"VARCHAR({element.length}) COLLATE BINARY" # BINARY is case-sensitive in SQLite + + +@compiles(CaseSensitiveString, "postgresql") +def compile_cs_postgresql(element, compiler, **kw): + return f'VARCHAR({element.length}) COLLATE "C"' # "C" collation is case-sensitive + + +@compiles(CaseSensitiveString, "mysql") +def compile_cs_mysql(element, compiler, **kw): + return f"VARCHAR({element.length}) COLLATE utf8mb4_bin" # utf8mb4_bin is case-sensitive + + +class EnumArray(TypeDecorator): + """Custom SQLAlchemy type to handle Enum lists as a comma-separated string.""" + + impl = String + + def __init__(self, enum_cls, length=255): + super(EnumArray, self).__init__(length=length) + self.enum_cls = enum_cls + + def process_bind_param(self, value, dialect): + """Convert Enum list to a comma-separated string for storage.""" + if value is None: + return None + return ",".join([v.value for v in value]) + + def process_result_value(self, value, dialect): + """Convert stored comma-separated string back to an Enum list.""" + if value is None: + return None + if isinstance(value, str): + return [self.enum_cls(v) for v in value.split(",") if v] + return [self.enum_cls(v) for v in value] + + +class StringArray(TypeDecorator): + """Custom SQLAlchemy type to handle String lists as a comma-separated string.""" + + impl = String + + def __init__(self, length=255, **kwargs): + super(StringArray, self).__init__(length=length, **kwargs) + + def process_bind_param(self, value, dialect): + """Convert list to a comma-separated string for storage.""" + if not value: + return "" + return ",".join([str(v) for v in value]) + + def process_result_value(self, value, dialect): + """Convert stored comma-separated string back to a StringArraySet.""" + if value is None: + return set() + if isinstance(value, str): + return set(v for v in value.split(",") if v) + return set(value) + + +class DaysDiff(FunctionElement): + type = Numeric() + name = "days_diff" + inherit_cache = True + + +@compiles(DaysDiff, "postgresql") +def compile_days_diff_postgresql(element, compiler, **kw): + return "EXTRACT(EPOCH FROM (expire - CURRENT_TIMESTAMP)) / 86400" + + +@compiles(DaysDiff, "mysql") +def compile_days_diff_mysql(element, compiler, **kw): + return "DATEDIFF(expire, UTC_TIMESTAMP())" + + +@compiles(DaysDiff, "sqlite") +def compile_days_diff_sqlite(element, compiler, **kw): + return "(julianday(expire) - julianday('now'))" + + +class DateDiff(FunctionElement): + type = Numeric() + name = "date_diff" + inherit_cache = True + + def __init__(self, date1, date2, **kwargs): + super().__init__(**kwargs) + self.date1 = date1 + self.date2 = date2 + + +@compiles(DateDiff, "postgresql") +def compile_date_diff_postgresql(element, compiler, **kw): + return f"EXTRACT(EPOCH FROM ({compiler.process(element.date1)} - {compiler.process(element.date2)})) / 86400" + + +@compiles(DateDiff, "mysql") +def compile_date_diff_mysql(element, compiler, **kw): + return f"DATEDIFF({compiler.process(element.date1)}, {compiler.process(element.date2)})" + + +@compiles(DateDiff, "sqlite") +def compile_date_diff_sqlite(element, compiler, **kw): + return f"julianday({compiler.process(element.date1)}) - julianday({compiler.process(element.date2)})" diff --git a/app/db/crud/__init__.py b/app/db/crud/__init__.py new file mode 100644 index 000000000..9197113af --- /dev/null +++ b/app/db/crud/__init__.py @@ -0,0 +1,18 @@ +from .admin import get_admin +from .core import get_core_config_by_id +from .group import get_group_by_id +from .host import get_host_by_id +from .node import get_node_by_id +from .user import get_user +from .user_template import get_user_template + + +__all__ = [ + "get_admin", + "get_core_config_by_id", + "get_group_by_id", + "get_host_by_id", + "get_node_by_id", + "get_user", + "get_user_template", +] diff --git a/app/db/crud/admin.py b/app/db/crud/admin.py new file mode 100644 index 000000000..22d0f7b3b --- /dev/null +++ b/app/db/crud/admin.py @@ -0,0 +1,217 @@ +from datetime import datetime, timezone + +from sqlalchemy import func, select +from sqlalchemy.ext.asyncio import AsyncSession + +from app.db.models import Admin, AdminUsageLogs +from app.models.admin import AdminCreate, AdminModify + + +async def load_admin_attrs(admin: Admin): + await admin.awaitable_attrs.users + await admin.awaitable_attrs.usage_logs + + +async def get_admin(db: AsyncSession, username: str) -> Admin: + """ + Retrieves an admin by username. + + Args: + db (AsyncSession): Database session. + username (str): The username of the admin. + + Returns: + Admin: The admin object. + """ + admin = (await db.execute(select(Admin).where(Admin.username == username))).unique().scalar_one_or_none() + if admin: + await load_admin_attrs(admin) + return admin + + +async def create_admin(db: AsyncSession, admin: AdminCreate) -> Admin: + """ + Creates a new admin in the database. + + Args: + db (AsyncSession): Database session. + admin (AdminCreate): The admin creation data. + + Returns: + Admin: The created admin object. + """ + db_admin = Admin(**admin.model_dump(exclude={"password"}), hashed_password=admin.hashed_password) + db.add(db_admin) + await db.commit() + await db.refresh(db_admin) + await load_admin_attrs(db_admin) + return db_admin + + +async def update_admin(db: AsyncSession, db_admin: Admin, modified_admin: AdminModify) -> Admin: + """ + Updates an admin's details. + + Args: + db (AsyncSession): Database session. + dbadmin (Admin): The admin object to be updated. + modified_admin (AdminModify): The modified admin data. + + Returns: + Admin: The updated admin object. + """ + if modified_admin.is_sudo is not None: + db_admin.is_sudo = modified_admin.is_sudo + if modified_admin.is_disabled is not None: + db_admin.is_disabled = modified_admin.is_disabled + if modified_admin.hashed_password is not None and db_admin.hashed_password != modified_admin.hashed_password: + db_admin.hashed_password = modified_admin.hashed_password + db_admin.password_reset_at = datetime.now(timezone.utc) + if modified_admin.telegram_id is not None: + db_admin.telegram_id = modified_admin.telegram_id + if modified_admin.discord_webhook is not None: + db_admin.discord_webhook = modified_admin.discord_webhook + if modified_admin.discord_id is not None: + db_admin.discord_id = modified_admin.discord_id + if modified_admin.sub_template is not None: + db_admin.sub_template = modified_admin.sub_template + if modified_admin.sub_domain is not None: + db_admin.sub_domain = modified_admin.sub_domain + if modified_admin.support_url is not None: + db_admin.support_url = modified_admin.support_url + if modified_admin.profile_title is not None: + db_admin.profile_title = modified_admin.profile_title + + await db.commit() + await load_admin_attrs(db_admin) + return db_admin + + +async def remove_admin(db: AsyncSession, dbadmin: Admin) -> None: + """ + Removes an admin from the database. + + Args: + db (AsyncSession): Database session. + dbadmin (Admin): The admin object to be removed. + """ + await db.delete(dbadmin) + await db.commit() + + +async def get_admin_by_id(db: AsyncSession, id: int) -> Admin: + """ + Retrieves an admin by their ID. + + Args: + db (AsyncSession): Database session. + id (int): The ID of the admin. + + Returns: + Admin: The admin object. + """ + admin = (await db.execute(select(Admin).where(Admin.id == id))).first() + if admin: + await load_admin_attrs(admin) + return admin + + +async def get_admin_by_telegram_id(db: AsyncSession, telegram_id: int) -> Admin: + """ + Retrieves an admin by their Telegram ID. + + Args: + db (AsyncSession): Database session. + telegram_id (int): The Telegram ID of the admin. + + Returns: + Admin: The admin object. + """ + admin = (await db.execute(select(Admin).where(Admin.telegram_id == telegram_id))).scalar_one_or_none() + if admin: + await load_admin_attrs(admin) + return admin + + +async def get_admin_by_discord_id(db: AsyncSession, discord_id: int) -> Admin: + """ + Retrieves an admin by their Discord ID. + + Args: + db (AsyncSession): Database session. + discord_id (int): The Discord ID of the admin. + + Returns: + Admin: The admin object. + """ + admin = (await db.execute(select(Admin).where(Admin.discord_id == discord_id))).first() + if admin: + await load_admin_attrs(admin) + return admin + + +async def get_admins( + db: AsyncSession, offset: int | None = None, limit: int | None = None, username: str | None = None +) -> list[Admin]: + """ + Retrieves a list of admins with optional filters and pagination. + + Args: + db (AsyncSession): Database session. + offset (Optional[int]): The number of records to skip (for pagination). + limit (Optional[int]): The maximum number of records to return. + username (Optional[str]): The username to filter by. + + Returns: + List[Admin]: A list of admin objects. + """ + query = select(Admin) + if username: + query = query.where(Admin.username.ilike(f"%{username}%")) + if offset: + query = query.offset(offset) + if limit: + query = query.limit(limit) + + admins = (await db.execute(query)).scalars().all() + + for admin in admins: + await load_admin_attrs(admin) + + return admins + + +async def reset_admin_usage(db: AsyncSession, db_admin: Admin) -> Admin: + """ + Retrieves an admin's usage by their username. + Args: + db (AsyncSession): Database session. + db_admin (Admin): The admin object to be updated. + Returns: + Admin: The updated admin. + """ + if db_admin.used_traffic == 0: + return db_admin + + usage_log = AdminUsageLogs(admin_id=db_admin.id, used_traffic_at_reset=db_admin.used_traffic) + db.add(usage_log) + db_admin.used_traffic = 0 + + await db.commit() + await db.refresh(db_admin) + await load_admin_attrs(db_admin) + return db_admin + + +async def get_admins_count(db: AsyncSession) -> int: + """ + Retrieves the total count of admins. + + Args: + db (AsyncSession): Database session. + + Returns: + int: The total number of admins. + """ + count = (await db.execute(select(func.count(Admin.id)))).scalar_one() + return count diff --git a/app/db/crud/bulk.py b/app/db/crud/bulk.py new file mode 100644 index 000000000..3af6057c3 --- /dev/null +++ b/app/db/crud/bulk.py @@ -0,0 +1,416 @@ +from datetime import datetime as dt, timezone as tz +from typing import Optional + +from sqlalchemy import and_, case, cast, delete, func, or_, select, text, update +from sqlalchemy.dialects.postgresql import JSONB +from sqlalchemy.ext.asyncio import AsyncSession + +from app.db.base import DATABASE_DIALECT +from app.db.models import ( + Admin, + Group, + NextPlan, + NodeUserUsage, + User, + UserStatus, + UserUsageResetLogs, + users_groups_association, +) +from app.models.group import BulkGroup +from app.models.user import BulkUser, BulkUsersProxy + +from .general import get_datetime_add_expression +from .user import load_user_attrs + + +async def reset_all_users_data_usage(db: AsyncSession, admin: Optional[Admin] = None): + """ + Efficiently resets data usage for all users, or users under a specific admin if provided. + + This function performs a high-performance reset by executing bulk database operations + rather than iterating over ORM-mapped objects, improving speed and reducing memory usage. + + Operations performed: + - Sets `used_traffic` to 0 for all target users. + - Sets `status` to `active` for all users, unless filtered by admin. + - Deletes all related `UserUsageResetLogs`, `NodeUserUsage`, and `NextPlan` entries. + + Args: + db (AsyncSession): The SQLAlchemy async session used for database operations. + admin (Optional[Admin]): If provided, only resets data usage for users belonging to this admin. + If None, resets usage for all users in the system. + + Notes: + - All operations are executed in bulk for performance. + - This function assumes proper foreign key constraints and cascading rules are in place. + - The function commits changes at the end of the operation. + """ + user_ids_query = select(User.id).where(User.admin_id == admin.id) if admin else select(User.id) + user_ids = (await db.execute(user_ids_query)).scalars().all() + + if not user_ids: + return + + await db.execute(update(User).where(User.id.in_(user_ids)).values(used_traffic=0, status=UserStatus.active)) + + await db.execute(delete(UserUsageResetLogs).where(UserUsageResetLogs.user_id.in_(user_ids))) + await db.execute(delete(NodeUserUsage).where(NodeUserUsage.user_id.in_(user_ids))) + await db.execute(delete(NextPlan).where(NextPlan.user_id.in_(user_ids))) + + await db.commit() + + +async def disable_all_active_users(db: AsyncSession, admin: Admin | None = None): + """ + Disable all active users or users under a specific admin. + + Args: + db (AsyncSession): Database session. + admin (Optional[Admin]): Admin to filter users by, if any. + """ + query = update(User).where(User.status.in_((UserStatus.active, UserStatus.on_hold))) + if admin: + query = query.filter(User.admin_id == admin.id) + + await db.execute( + query.values( + {User.status: UserStatus.disabled, User.last_status_change: dt.now(tz.utc)}, + ) + ) + + await db.commit() + await db.refresh(admin) + + +async def activate_all_disabled_users(db: AsyncSession, admin: Admin | None = None): + """ + Activate all disabled users or users under a specific admin. + + Args: + db (AsyncSession): Database session. + admin (Optional[Admin]): Admin to filter users by, if any. + """ + query_for_active_users = update(User).where(User.status == UserStatus.disabled) + query_for_on_hold_users = update(User).where( + and_( + User.status == UserStatus.disabled, + User.expire.is_(None), + User.on_hold_expire_duration.isnot(None), + ) + ) + if admin: + query_for_active_users = query_for_active_users.where(User.admin_id == admin.id) + query_for_on_hold_users = query_for_on_hold_users.where(User.admin_id == admin.id) + + await db.execute( + query_for_on_hold_users.values( + {User.status: UserStatus.on_hold, User.last_status_change: dt.now(tz.utc)}, + ) + ) + await db.execute( + query_for_active_users.values( + {User.status: UserStatus.active, User.last_status_change: dt.now(tz.utc)}, + ) + ) + + await db.commit() + await db.refresh(admin) + + +def _create_group_filter(bulk_model: BulkGroup): + """Create a comprehensive SQLAlchemy filter condition from a BulkGroup model.""" + other_conditions = [] + if bulk_model.admins: + other_conditions.append(User.admin_id.in_(bulk_model.admins)) + if bulk_model.has_group_ids: + other_conditions.append(User.groups.any(Group.id.in_(bulk_model.has_group_ids))) + + user_ids = bulk_model.users or [] + + filter_conditions = [] + if user_ids: + filter_conditions.append(User.id.in_(user_ids)) + if other_conditions: + filter_conditions.append(and_(*other_conditions)) + + if len(filter_conditions) > 1: + return or_(*filter_conditions) + elif filter_conditions: + return filter_conditions[0] + else: + return True + + +async def add_groups_to_users(db: AsyncSession, bulk_model: BulkGroup) -> tuple[list, int] | tuple[list[User], int]: + """ + Bulk add groups to users and return list of affected User objects. + """ + final_filter = _create_group_filter(bulk_model) + + # Get target user IDs + result = await db.execute(select(User.id).where(final_filter)) + user_ids = {row[0] for row in result.all()} + + count_effctive_users = len(user_ids) + + if not user_ids: + return [], count_effctive_users + + # Fetch existing associations for target users + existing = await db.execute( + select(users_groups_association).where(users_groups_association.c.user_id.in_(user_ids)) + ) + existing_pairs = {(r.user_id, r.groups_id) for r in existing.all()} + + # Prepare new associations + new_rows = [ + {"user_id": uid, "groups_id": gid} + for uid in user_ids + for gid in bulk_model.group_ids + if (uid, gid) not in existing_pairs + ] + + if not new_rows: + return [], count_effctive_users + + await db.execute(users_groups_association.insert(), new_rows) + await db.commit() + + # Return users that actually had groups added + result = await db.execute(select(User).where(User.id.in_({r["user_id"] for r in new_rows}))) + users = result.scalars().all() + for user in users: + await load_user_attrs(user) + return users, count_effctive_users + + +async def remove_groups_from_users( + db: AsyncSession, bulk_model: BulkGroup +) -> tuple[list, int] | tuple[list[User], int]: + """ + Bulk remove groups from users and return list of affected User objects. + """ + final_filter = _create_group_filter(bulk_model) + + # Get target user IDs + result = await db.execute(select(User.id).where(final_filter)) + user_ids = {row[0] for row in result.all()} + + count_effctive_users = len(user_ids) + + if not user_ids: + return [], count_effctive_users + + # Identify affected users (those who actually have the groups to be removed) + subquery = ( + select(users_groups_association.c.user_id) + .where( + and_( + users_groups_association.c.user_id.in_(user_ids), + users_groups_association.c.groups_id.in_(bulk_model.group_ids), + ) + ) + .distinct() + ) + result = await db.execute(select(User).where(User.id.in_(subquery))) + users = result.scalars().all() + + if not users: + return [], count_effctive_users + + await db.execute( + delete(users_groups_association).where( + users_groups_association.c.user_id.in_([u.id for u in users]), + users_groups_association.c.groups_id.in_(bulk_model.group_ids), + ) + ) + await db.commit() + for user in users: + await load_user_attrs(user) + return users, count_effctive_users + + +def _create_final_filter(bulk_model: BulkUser | BulkUsersProxy): + """Create a comprehensive SQLAlchemy filter condition from a bulk model.""" + other_conditions = [] + if hasattr(bulk_model, "status") and bulk_model.status: + other_conditions.append(User.status.in_([i.value for i in bulk_model.status])) + if bulk_model.admins: + other_conditions.append(User.admin_id.in_([i for i in bulk_model.admins])) + if bulk_model.group_ids: + other_conditions.append(User.groups.any(Group.id.in_(bulk_model.group_ids))) + + user_ids = bulk_model.users or [] + + filter_conditions = [] + if user_ids: + filter_conditions.append(User.id.in_(user_ids)) + if other_conditions: + filter_conditions.append(and_(*other_conditions)) + + if len(filter_conditions) > 1: + return or_(*filter_conditions) + elif filter_conditions: + return filter_conditions[0] + else: + return True + + +async def update_users_expire(db: AsyncSession, bulk_model: BulkUser) -> tuple[list[User], int] | tuple[list, int]: + """ + Bulk update user expiration dates and return list of User objects where status changed. + """ + final_filter = _create_final_filter(bulk_model) + + count_effctive_users = ( + await db.execute(select(func.count(User.id)).where(and_(final_filter, User.expire.isnot(None)))) + ).scalar_one_or_none() or 0 + # Get database-specific datetime addition expression + new_expire = get_datetime_add_expression(User.expire, bulk_model.amount) + current_time = dt.now(tz.utc) + + # First, get the users that will have status changes BEFORE updating + status_change_conditions = or_( + and_(new_expire <= current_time, User.status == UserStatus.active), + and_(new_expire > current_time, User.status == UserStatus.expired), + ) + + # Get IDs of users whose status will change + result = await db.execute( + select(User.id).where(and_(final_filter, User.expire.isnot(None), status_change_conditions)) + ) + status_changed_user_ids = [row[0] for row in result.fetchall()] + + # Perform the update + status_cases = [ + (and_(new_expire <= current_time, User.status == UserStatus.active), UserStatus.expired), + (and_(new_expire > current_time, User.status == UserStatus.expired), UserStatus.active), + ] + + await db.execute( + update(User) + .where(and_(final_filter, User.expire.isnot(None))) + .values(expire=new_expire, status=case(*status_cases, else_=User.status)) + ) + await db.commit() + + # Return the users whose status changed + if status_changed_user_ids: + result = await db.execute(select(User).where(User.id.in_(status_changed_user_ids))) + users = result.scalars().all() + for user in users: + await load_user_attrs(user) + return users, count_effctive_users + return [], count_effctive_users + + +async def update_users_datalimit(db: AsyncSession, bulk_model: BulkUser) -> tuple[list[User], int] | tuple[list, int]: + """ + Bulk update user data limits and return list of User objects where status changed. + """ + final_filter = _create_final_filter(bulk_model) + + count_effctive_users = ( + await db.execute( + select(func.count(User.id)).where(and_(final_filter, User.data_limit.isnot(None), User.data_limit != 0)) + ) + ).scalar_one_or_none() or 0 + + # First, get the users that will have status changes BEFORE updating + status_change_conditions = or_( + and_(User.data_limit + bulk_model.amount <= User.used_traffic, User.status == UserStatus.active), + and_(User.data_limit + bulk_model.amount > User.used_traffic, User.status == UserStatus.limited), + ) + + # Get IDs of users whose status will change + result = await db.execute( + select(User.id).where( + and_(final_filter, User.data_limit.isnot(None), User.data_limit != 0, status_change_conditions) + ) + ) + status_changed_user_ids = [row[0] for row in result.fetchall()] + + # Perform the update + status_cases = [ + ( + and_(User.data_limit + bulk_model.amount <= User.used_traffic, User.status == UserStatus.active), + UserStatus.limited, + ), + ( + and_(User.data_limit + bulk_model.amount > User.used_traffic, User.status == UserStatus.limited), + UserStatus.active, + ), + ] + + await db.execute( + update(User) + .where(and_(final_filter, User.data_limit.isnot(None), User.data_limit != 0)) + .values(data_limit=User.data_limit + bulk_model.amount, status=case(*status_cases, else_=User.status)) + ) + + await db.commit() + + # Return the users whose status changed + if status_changed_user_ids: + result = await db.execute(select(User).where(User.id.in_(status_changed_user_ids))) + users = result.scalars().all() + for user in users: + await load_user_attrs(user) + return users, count_effctive_users + return [], count_effctive_users + + +async def update_users_proxy_settings( + db: AsyncSession, bulk_model: BulkUsersProxy +) -> tuple[list, int] | tuple[list[User], int]: + """ + Bulk update the `proxy_settings` JSON field for users and return updated rows. + """ + final_filter = _create_final_filter(bulk_model) + + # First select the users that will be updated + select_stmt = select(User).where(final_filter) + result = await db.execute(select_stmt) + users_to_update = result.scalars().all() + count_effctive_users = len(users_to_update) + + if not users_to_update: + return [], count_effctive_users + + # Prepare the update statement + if DATABASE_DIALECT == "postgresql": + proxy_settings_expr = cast(User.proxy_settings, JSONB) + if bulk_model.flow is not None: + proxy_settings_expr = func.jsonb_set( + proxy_settings_expr, + text("'{vless,flow}'"), + cast(f"{bulk_model.flow.value}", JSONB), + True, + ) + if bulk_model.method is not None: + proxy_settings_expr = func.jsonb_set( + proxy_settings_expr, + text("'{shadowsocks,method}'"), + cast(f"{bulk_model.method.value}", JSONB), + True, + ) + else: + proxy_settings_expr = User.proxy_settings + if bulk_model.flow is not None: + proxy_settings_expr = func.json_set(proxy_settings_expr, "$.vless.flow", f"{bulk_model.flow.value}") + if bulk_model.method is not None: + proxy_settings_expr = func.json_set( + proxy_settings_expr, "$.shadowsocks.method", f"{bulk_model.method.value}" + ) + + # Perform the update + update_stmt = update(User).where(final_filter).values(proxy_settings=proxy_settings_expr) + await db.execute(update_stmt) + await db.commit() + + # Refresh the user objects to get updated values + for user in users_to_update: + await db.refresh(user) + await load_user_attrs(user) + + return users_to_update, count_effctive_users diff --git a/app/db/crud/core.py b/app/db/crud/core.py new file mode 100644 index 000000000..02cc85101 --- /dev/null +++ b/app/db/crud/core.py @@ -0,0 +1,102 @@ +from sqlalchemy import select +from sqlalchemy.ext.asyncio import AsyncSession + +from app.db.models import CoreConfig +from app.models.core import CoreCreate + + +async def get_core_config_by_id(db: AsyncSession, core_id: int) -> CoreConfig | None: + """ + Retrieves a core configuration by its ID. + + Args: + db (AsyncSession): The database session. + core_id (int): The ID of the core configuration to retrieve. + + Returns: + Optional[CoreConfig]: The CoreConfig object if found, None otherwise. + """ + return (await db.execute(select(CoreConfig).where(CoreConfig.id == core_id))).unique().scalar_one_or_none() + + +async def create_core_config(db: AsyncSession, core_config: CoreCreate) -> CoreConfig: + """ + Creates a new core configuration in the database. + + Args: + db (AsyncSession): The database session. + core_config (CoreCreate): The core configuration creation model containing core details. + + Returns: + CoreConfig: The newly created CoreConfig object. + """ + db_core_config = CoreConfig( + name=core_config.name, + config=core_config.config, + exclude_inbound_tags=core_config.exclude_inbound_tags or set(), + fallbacks_inbound_tags=core_config.fallbacks_inbound_tags or set(), + ) + db.add(db_core_config) + await db.commit() + await db.refresh(db_core_config) + return db_core_config + + +async def modify_core_config( + db: AsyncSession, db_core_config: CoreConfig, modified_core_config: CoreCreate +) -> CoreConfig: + """ + Modifies an existing core configuration with new information. + + Args: + db (AsyncSession): The database session. + db_core_config (CoreConfig): The CoreConfig object to be updated. + modified_core_config (CoreCreate): The modification model containing updated core details. + + Returns: + CoreConfig: The updated CoreConfig object. + """ + core_data = modified_core_config.model_dump(exclude_none=True) + + for key, value in core_data.items(): + setattr(db_core_config, key, value) + + await db.commit() + await db.refresh(db_core_config) + return db_core_config + + +async def remove_core_config(db: AsyncSession, db_core_config: CoreConfig) -> None: + """ + Removes a core configuration from the database. + + Args: + db (AsyncSession): The database session. + db_core_config (CoreConfig): The CoreConfig object to be removed. + """ + await db.delete(db_core_config) + await db.commit() + + +async def get_core_configs(db: AsyncSession, offset: int = None, limit: int = None) -> tuple[int, list[CoreConfig]]: + """ + Retrieves a list of core configurations with optional pagination. + + Args: + db (AsyncSession): The database session. + offset (int, optional): The number of records to skip (for pagination). + limit (int, optional): The maximum number of records to return. + + Returns: + tuple: A tuple containing: + - list[CoreConfig]: A list of CoreConfig objects + - int: The total count of core configurations + """ + query = select(CoreConfig) + if offset: + query = query.offset(offset) + if limit: + query = query.limit(limit) + + all_core_configs = (await db.execute(query)).scalars().all() + return all_core_configs, len(all_core_configs) diff --git a/app/db/crud/general.py b/app/db/crud/general.py new file mode 100644 index 000000000..732aa60f3 --- /dev/null +++ b/app/db/crud/general.py @@ -0,0 +1,103 @@ +from sqlalchemy import String, func, or_, select, text +from sqlalchemy.ext.asyncio import AsyncSession + +from app.db.base import DATABASE_DIALECT +from app.db.models import JWT, System +from app.models.stats import Period + +MYSQL_FORMATS = { + Period.minute: "%Y-%m-%d %H:%i:00", + Period.hour: "%Y-%m-%d %H:00:00", + Period.day: "%Y-%m-%d", + Period.month: "%Y-%m-01", +} +SQLITE_FORMATS = { + Period.minute: "%Y-%m-%d %H:%M:00", + Period.hour: "%Y-%m-%d %H:00:00", + Period.day: "%Y-%m-%d", + Period.month: "%Y-%m-01", +} + + +def _build_trunc_expression(period: Period, column): + """Builds the appropriate truncation SQL expression based on DATABASE_DIALECT and period.""" + if DATABASE_DIALECT == "postgresql": + return func.date_trunc(period.value, column) + elif DATABASE_DIALECT == "mysql": + return func.date_format(column, MYSQL_FORMATS[period.value]) + elif DATABASE_DIALECT == "sqlite": + return func.strftime(SQLITE_FORMATS[period.value], column) + + raise ValueError(f"Unsupported dialect: {DATABASE_DIALECT}") + + +def get_datetime_add_expression(datetime_column, seconds: int): + """ + Get database-specific datetime addition expression + """ + if DATABASE_DIALECT == "mysql": + return func.date_add(datetime_column, text("INTERVAL :seconds SECOND").bindparams(seconds=seconds)) + elif DATABASE_DIALECT == "postgresql": + return datetime_column + func.make_interval(0, 0, 0, 0, 0, 0, seconds) + elif DATABASE_DIALECT == "sqlite": + return func.datetime(func.strftime("%s", datetime_column) + seconds, "unixepoch") + + raise ValueError(f"Unsupported dialect: {DATABASE_DIALECT}") + + +def json_extract(column, path: str): + """ + Args: + column: The JSON column in your model + path: JSON path (e.g., '$.theme') + """ + match DATABASE_DIALECT: + case "postgresql": + keys = path.replace("$.", "").split(".") + expr = column + for key in keys: + expr = expr.op("->>")(key) if key == keys[-1] else expr.op("->")(key) + return expr.cast(String) + case "mysql": + return func.json_unquote(func.json_extract(column, path)).cast(String) + case "sqlite": + return func.json_extract(column, path).cast(String) + + +def build_json_proxy_settings_search_condition(column, value: str): + """ + Builds a condition to search JSON column for UUIDs or passwords. + Supports PostgresSQL, MySQL, SQLite. + """ + return or_( + *[ + json_extract(column, field) == value + for field in ("$.vmess.id", "$.vless.id", "$.trojan.password", "$.shadowsocks.password") + ], + ) + + +async def get_system_usage(db: AsyncSession) -> System: + """ + Retrieves system usage information. + + Args: + db (AsyncSession): Database session. + + Returns: + System: System usage information. + """ + return (await db.execute(select(System))).scalar_one_or_none() + + +async def get_jwt_secret_key(db: AsyncSession) -> str: + """ + Retrieves the JWT secret key. + + Args: + db (AsyncSession): Database session. + + Returns: + str: JWT secret key. + """ + return (await db.execute(select(JWT))).scalar_one_or_none().secret_key diff --git a/app/db/crud/group.py b/app/db/crud/group.py new file mode 100644 index 000000000..ac3589011 --- /dev/null +++ b/app/db/crud/group.py @@ -0,0 +1,149 @@ +from sqlalchemy import select, func +from sqlalchemy.ext.asyncio import AsyncSession + +from app.db.models import ProxyInbound, Group +from app.models.group import GroupCreate, GroupModify + +from .host import get_or_create_inbound + + +async def get_inbounds_by_tags(db: AsyncSession, tags: list[str]) -> list[ProxyInbound]: + """ + Retrieves inbounds by their tags. + """ + return [(await get_or_create_inbound(db, tag)) for tag in tags] + + +async def load_group_attrs(group: Group): + await group.awaitable_attrs.users + await group.awaitable_attrs.inbounds + + +async def get_group_by_id(db: AsyncSession, group_id: int) -> Group | None: + """ + Retrieves a group by its ID. + + Args: + db (AsyncSession): The database session. + group_id (int): The ID of the group to retrieve. + + Returns: + Optional[Group]: The Group object if found, None otherwise. + """ + group = (await db.execute(select(Group).where(Group.id == group_id))).unique().scalar_one_or_none() + if group: + await load_group_attrs(group) + return group + + +async def create_group(db: AsyncSession, group: GroupCreate) -> Group: + """ + Creates a new group in the database. + + Args: + db (AsyncSession): The database session. + group (GroupCreate): The group creation model containing group details. + + Returns: + Group: The newly created Group object. + """ + db_group = Group( + name=group.name, + inbounds=await get_inbounds_by_tags(db, group.inbound_tags), + is_disabled=group.is_disabled, + ) + db.add(db_group) + await db.commit() + await db.refresh(db_group) + await load_group_attrs(db_group) + return db_group + + +async def get_group(db: AsyncSession, offset: int = None, limit: int = None) -> tuple[list[Group], int]: + """ + Retrieves a list of groups with optional pagination. + + Args: + db (AsyncSession): The database session. + offset (int, optional): The number of records to skip (for pagination). + limit (int, optional): The maximum number of records to return. + + Returns: + tuple: A tuple containing: + - list[Group]: A list of Group objects + - int: The total count of groups + """ + groups = select(Group) + + count_query = select(func.count()).select_from(groups.subquery()) + + if offset: + groups = groups.offset(offset) + if limit: + groups = groups.limit(limit) + + count = (await db.execute(count_query)).scalar_one() + + all_groups = (await db.execute(groups)).scalars().all() + + for group in all_groups: + await load_group_attrs(group) + + return all_groups, count + + +async def get_groups_by_ids(db: AsyncSession, group_ids: list[int]) -> list[Group]: + """ + Retrieves a list of groups by their IDs. + + Args: + db (AsyncSession): The database session. + group_ids (list[int]): The IDs of the groups to retrieve. + + Returns: + list[Group]: A list of Group objects. + """ + groups = (await db.execute(select(Group).where(Group.id.in_(group_ids)))).scalars().all() + + for group in groups: + await load_group_attrs(group) + + return groups + + +async def modify_group(db: AsyncSession, db_group: Group, modified_group: GroupModify) -> Group: + """ + Modify an existing group with new information. + + Args: + db (AsyncSession): The database session. + dbgroup (Group): The Group object to be updated. + modified_group (GroupModify): The modification model containing updated group details. + + Returns: + Group: The updated Group object. + """ + + if db_group.name != modified_group.name: + db_group.name = modified_group.name + if modified_group.is_disabled is not None: + db_group.is_disabled = modified_group.is_disabled + if modified_group.inbound_tags: + inbounds = await get_inbounds_by_tags(db, modified_group.inbound_tags) + db_group.inbounds = inbounds + await db.commit() + await db.refresh(db_group) + await load_group_attrs(db_group) + return db_group + + +async def remove_group(db: AsyncSession, dbgroup: Group): + """ + Removes a group from the database. + + Args: + db (AsyncSession): The database session. + dbgroup (Group): The Group object to be removed. + """ + await db.delete(dbgroup) + await db.commit() diff --git a/app/db/crud/host.py b/app/db/crud/host.py new file mode 100644 index 000000000..f55c7095d --- /dev/null +++ b/app/db/crud/host.py @@ -0,0 +1,166 @@ +import asyncio +from enum import Enum +from typing import List, Optional + +from sqlalchemy import select +from sqlalchemy.ext.asyncio import AsyncSession + +from app.db.models import ProxyInbound, ProxyHost +from app.models.host import CreateHost + + +async def get_or_create_inbound(db: AsyncSession, inbound_tag: str) -> ProxyInbound: + """ + Retrieves or creates a proxy inbound based on the given tag. + + Args: + db (AsyncSession): Database session. + inbound_tag (str): The tag of the inbound. + + Returns: + ProxyInbound: The retrieved or newly created proxy inbound. + """ + stmt = select(ProxyInbound).where(ProxyInbound.tag == inbound_tag) + result = await db.execute(stmt) + inbound = result.scalar_one_or_none() + + if not inbound: + inbound = ProxyInbound(tag=inbound_tag) + db.add(inbound) + await db.commit() + await db.refresh(inbound) + + return inbound + + +async def get_inbounds_not_in_tags(db: AsyncSession, excluded_tags: List[str]) -> List[ProxyInbound]: + """ + Get all inbounds where the tag is not in the provided list of tags. + + Args: + db: Database session + excluded_tags: List of tags to exclude + + Returns: + List of ProxyInbound objects not matching any tag in the list + """ + stmt = select(ProxyInbound).where(ProxyInbound.tag.not_in(excluded_tags)) + result = await db.execute(stmt) + return result.scalars().all() + + +async def remove_inbounds(db: AsyncSession, inbounds: List[ProxyInbound]) -> None: + """ + Remove a list of inbounds from the database. + + Args: + db: Database session + inbounds: List of ProxyInbound objects to remove + """ + if not inbounds: + return + + await asyncio.gather(*[db.delete(inbound) for inbound in inbounds]) + await db.commit() + + +ProxyHostSortingOptions = Enum( + "ProxyHostSortingOptions", + { + "priority": ProxyHost.priority.asc(), + "id": ProxyHost.id.asc(), + "-priority": ProxyHost.priority.desc(), + "-id": ProxyHost.id.desc(), + }, +) + + +async def get_hosts( + db: AsyncSession, + offset: Optional[int] = 0, + limit: Optional[int] = 0, + sort: ProxyHostSortingOptions = "priority", +) -> list[ProxyHost]: + """ + Retrieves hosts. + + Args: + db (AsyncSession): Database session. + offset (Optional[int]): Number of records to skip. + limit (Optional[int]): Number of records to retrieve. + + Returns: + List[ProxyHost]: List of hosts for the inbound. + """ + stmt = select(ProxyHost).order_by(sort) + + if offset: + stmt = stmt.offset(offset) + if limit: + stmt = stmt.limit(limit) + + result = await db.execute(stmt) + return list(result.scalars().all()) + + +async def get_host_by_id(db: AsyncSession, id: int) -> ProxyHost: + """ + Retrieves host by id. + + Args: + db (AsyncSession): Database session. + id (int): The ID of the host. + + Returns: + ProxyHost: The host if found. + """ + stmt = select(ProxyHost).where(ProxyHost.id == id) + result = await db.execute(stmt) + return result.scalar_one_or_none() + + +async def create_host(db: AsyncSession, new_host: CreateHost) -> ProxyHost: + """ + Creates a proxy Host based on the host. + + Args: + db (AsyncSession): Database session. + host (CreateHost): The new host to add. + + Returns: + ProxyHost: The retrieved or newly created proxy host. + """ + db_host = ProxyHost(**new_host.model_dump(exclude={"inbound_tag", "id"})) + db_host.inbound = await get_or_create_inbound(db, new_host.inbound_tag) + + db.add(db_host) + await db.commit() + await db.refresh(db_host) + return db_host + + +async def modify_host(db: AsyncSession, db_host: ProxyHost, modified_host: CreateHost) -> ProxyHost: + host_data = modified_host.model_dump(exclude={"id"}) + + for key, value in host_data.items(): + setattr(db_host, key, value) + + await db.commit() + await db.refresh(db_host) + return db_host + + +async def remove_host(db: AsyncSession, db_host: ProxyHost) -> ProxyHost: + """ + Removes a proxy Host from the database. + + Args: + db (AsyncSession): Database session. + db_host (ProxyHost): The host to remove. + + Returns: + ProxyHost: The removed proxy host. + """ + await db.delete(db_host) + await db.commit() + return db_host diff --git a/app/db/crud/node.py b/app/db/crud/node.py new file mode 100644 index 000000000..acfbde135 --- /dev/null +++ b/app/db/crud/node.py @@ -0,0 +1,295 @@ +from datetime import datetime, timezone +from typing import Optional, Union + +from sqlalchemy import and_, delete, func, select, update +from sqlalchemy.ext.asyncio import AsyncSession + +from app.db.models import Node, NodeStat, NodeStatus, NodeUsage, NodeUserUsage +from app.models.node import NodeCreate, NodeModify, UsageTable +from app.models.stats import NodeStats, NodeStatsList, NodeUsageStat, NodeUsageStatsList, Period + +from .general import _build_trunc_expression + + +async def get_node(db: AsyncSession, name: str) -> Optional[Node]: + """ + Retrieves a node by its name. + + Args: + db (AsyncSession): The database session. + name (str): The name of the node to retrieve. + + Returns: + Optional[Node]: The Node object if found, None otherwise. + """ + return (await db.execute(select(Node).where(Node.name == name))).unique().scalar_one_or_none() + + +async def get_node_by_id(db: AsyncSession, node_id: int) -> Optional[Node]: + """ + Retrieves a node by its ID. + + Args: + db (AsyncSession): The database session. + node_id (int): The ID of the node to retrieve. + + Returns: + Optional[Node]: The Node object if found, None otherwise. + """ + return (await db.execute(select(Node).where(Node.id == node_id))).unique().scalar_one_or_none() + + +async def get_nodes( + db: AsyncSession, + status: Optional[Union[NodeStatus, list]] = None, + enabled: bool | None = None, + core_id: int | None = None, + offset: int | None = None, + limit: int | None = None, +) -> list[Node]: + """ + Retrieves nodes based on optional status and enabled filters. + + Args: + db (AsyncSession): The database session. + status (Optional[Union[app.db.models.NodeStatus, list]]): The status or list of statuses to filter by. + enabled (bool): If True, excludes disabled nodes. + + Returns: + List[Node]: A list of Node objects matching the criteria. + """ + query = select(Node) + + if status: + if isinstance(status, list): + query = query.where(Node.status.in_(status)) + else: + query = query.where(Node.status == status) + + if enabled: + query = query.where(Node.status != NodeStatus.disabled) + + if core_id: + query = query.where(Node.core_config_id == core_id) + + if offset: + query = query.offset(offset) + if limit: + query = query.limit(limit) + + return (await db.execute(query)).scalars().all() + + +async def get_nodes_usage( + db: AsyncSession, + start: datetime, + end: datetime, + period: Period, + node_id: int | None = None, + group_by_node: bool = False, +) -> NodeUsageStatsList: + """ + Retrieves usage data for all nodes within a specified time range. + + Args: + db (AsyncSession): The database session. + start (datetime): The start time of the usage period. + end (datetime): The end time of the usage period. + + Returns: + NodeUsageStatsList: A NodeUsageStatsList contain list of NodeUsageResponse objects containing usage data. + """ + trunc_expr = _build_trunc_expression(period, NodeUsage.created_at) + + conditions = [NodeUsage.created_at >= start, NodeUsage.created_at <= end] + + if node_id is not None: + conditions.append(NodeUsage.node_id == node_id) + else: + node_id = -1 # Default value for node_id when not specified + + if group_by_node: + stmt = ( + select( + trunc_expr.label("period_start"), + func.coalesce(NodeUsage.node_id, 0).label("node_id"), + func.sum(NodeUsage.downlink).label("downlink"), + func.sum(NodeUsage.uplink).label("uplink"), + ) + .where(and_(*conditions)) + .group_by(trunc_expr, NodeUsage.node_id) + .order_by(trunc_expr) + ) + else: + stmt = ( + select( + trunc_expr.label("period_start"), + func.sum(NodeUsage.downlink).label("downlink"), + func.sum(NodeUsage.uplink).label("uplink"), + ) + .where(and_(*conditions)) + .group_by(trunc_expr) + .order_by(trunc_expr) + ) + + result = await db.execute(stmt) + stats = {} + for row in result.mappings(): + row_dict = dict(row) + node_id_val = row_dict.pop("node_id", node_id) + if node_id_val not in stats: + stats[node_id_val] = [] + stats[node_id_val].append(NodeUsageStat(**row_dict)) + + return NodeUsageStatsList(period=period, start=start, end=end, stats=stats) + + +async def get_node_stats( + db: AsyncSession, node_id: int, start: datetime, end: datetime, period: Period +) -> NodeStatsList: + trunc_expr = _build_trunc_expression(period, NodeStat.created_at) + conditions = [NodeStat.created_at >= start, NodeStat.created_at <= end, NodeStat.node_id == node_id] + + stmt = ( + select( + trunc_expr.label("period_start"), + func.avg(NodeStat.mem_used / NodeStat.mem_total * 100).label("mem_usage_percentage"), + func.avg(NodeStat.cpu_usage).label("cpu_usage_percentage"), # CPU usage is already in percentage + func.avg(NodeStat.incoming_bandwidth_speed).label("incoming_bandwidth_speed"), + func.avg(NodeStat.outgoing_bandwidth_speed).label("outgoing_bandwidth_speed"), + ) + .where(and_(*conditions)) + .group_by(trunc_expr) + .order_by(trunc_expr) + ) + + result = await db.execute(stmt) + + return NodeStatsList(period=period, start=start, end=end, stats=[NodeStats(**row) for row in result.mappings()]) + + +async def create_node(db: AsyncSession, node: NodeCreate) -> Node: + """ + Creates a new node in the database. + + Args: + db (AsyncSession): The database session. + node (NodeCreate): The node creation model containing node details. + + Returns: + Node: The newly created Node object. + """ + db_node = Node(**node.model_dump()) + + db.add(db_node) + await db.commit() + await db.refresh(db_node) + return db_node + + +async def remove_node(db: AsyncSession, db_node: Node) -> Node: + """ + Removes a node from the database. + + Args: + db (AsyncSession): The database session. + dbnode (Node): The Node object to be removed. + + Returns: + Node: The removed Node object. + """ + await db.delete(db_node) + await db.commit() + + +async def modify_node(db: AsyncSession, db_node: Node, modify: NodeModify) -> Node: + """ + modify an existing node with new information. + + Args: + db (AsyncSession): The database session. + dbnode (Node): The Node object to be updated. + modify (NodeModify): The modification model containing updated node details. + + Returns: + Node: The modified Node object. + """ + + node_data = modify.model_dump(exclude_none=True) + + for key, value in node_data.items(): + setattr(db_node, key, value) + + db_node.xray_version = None + db_node.message = None + db_node.node_version = None + + if db_node.status != NodeStatus.disabled: + db_node.status = NodeStatus.connecting + + await db.commit() + await db.refresh(db_node) + return db_node + + +async def update_node_status( + db: AsyncSession, + db_node: Node, + status: NodeStatus, + message: str = "", + xray_version: str = "", + node_version: str = "", +) -> Node: + """ + Updates the status of a node. + + Args: + db (AsyncSession): The database session. + dbnode (Node): The Node object to be updated. + status (app.db.models.NodeStatus): The new status of the node. + message (str, optional): A message associated with the status update. + version (str, optional): The version of the node software. + + Returns: + Node: The updated Node object. + """ + stmt = ( + update(Node) + .where(Node.id == db_node.id) + .values( + status=status, + message=message, + xray_version=xray_version, + node_version=node_version, + last_status_change=datetime.now(timezone.utc), + ) + ) + await db.execute(stmt) + await db.commit() + await db.refresh(db_node) + return db_node + + +def _table_model(table: UsageTable): + if table == UsageTable.node_user_usages: + return NodeUserUsage + if table == UsageTable.node_usages: + return NodeUsage + raise ValueError("Invalid table enum") + + +async def clear_usage_data( + db: AsyncSession, table: UsageTable, start: datetime | None = None, end: datetime | None = None +): + filters = [] + if start: + filters.append(getattr(_table_model(table), "created_at") >= start.replace(tzinfo=timezone.utc)) + if end: + filters.append(getattr(_table_model(table), "created_at") < end.replace(tzinfo=timezone.utc)) + + stmt = delete(_table_model(table)) + if filters: + stmt = stmt.where(and_(*filters)) + + await db.execute(stmt) + await db.commit() diff --git a/app/db/crud/settings.py b/app/db/crud/settings.py new file mode 100644 index 000000000..06af597a4 --- /dev/null +++ b/app/db/crud/settings.py @@ -0,0 +1,29 @@ +from sqlalchemy import select +from sqlalchemy.ext.asyncio import AsyncSession + +from app.db.models import Settings +from app.models.settings import SettingsSchema + + +async def get_settings(db: AsyncSession) -> Settings: + """ + Retrieves the Settings. + + Args: + db (AsyncSession): Database session. + + Returns: + Settings: Settings information. + """ + return (await db.execute(select(Settings))).scalar_one_or_none() + + +async def modify_settings(db: AsyncSession, db_setting: Settings, modify: SettingsSchema) -> Settings: + settings_data = modify.model_dump(exclude_none=True) + + for key, value in settings_data.items(): + setattr(db_setting, key, value) + + await db.commit() + await db.refresh(db_setting) + return db_setting diff --git a/app/db/crud/user.py b/app/db/crud/user.py new file mode 100644 index 000000000..6a53dc479 --- /dev/null +++ b/app/db/crud/user.py @@ -0,0 +1,1064 @@ +import asyncio +from copy import deepcopy +from datetime import UTC, datetime, timedelta, timezone +from enum import Enum +from typing import List, Optional, Sequence + +from sqlalchemy import and_, case, delete, desc, func, not_, or_, select, update +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy.orm import joinedload +from sqlalchemy.sql.functions import coalesce + +from app.db.compiles_types import DateDiff +from app.db.models import ( + Admin, + Group, + NextPlan, + NodeUserUsage, + NotificationReminder, + ReminderType, + User, + UserDataLimitResetStrategy, + UserStatus, + UserSubscriptionUpdate, + UserUsageResetLogs, +) +from app.models.proxy import ProxyTable +from app.models.stats import Period, UserUsageStat, UserUsageStatsList +from app.models.user import UserCreate, UserModify, UserNotificationResponse +from config import USERS_AUTODELETE_DAYS + +from .general import _build_trunc_expression, build_json_proxy_settings_search_condition +from .group import get_groups_by_ids + + +async def load_user_attrs(user: User): + await user.awaitable_attrs.admin + await user.awaitable_attrs.next_plan + await user.awaitable_attrs.usage_logs + await user.awaitable_attrs.groups + + +async def get_user(db: AsyncSession, username: str) -> Optional[User]: + """ + Retrieves a user by username. + + Args: + db (AsyncSession): Database session. + username (str): The username of the user. + + Returns: + Optional[User]: The user object if found, else None. + """ + stmt = select(User).where(User.username == username) + + user = (await db.execute(stmt)).unique().scalar_one_or_none() + if user: + await load_user_attrs(user) + return user + + +async def get_user_by_id(db: AsyncSession, user_id: int) -> User | None: + """ + Retrieves a user by user ID. + + Args: + db (AsyncSession): Database session. + user_id (int): The ID of the user. + + Returns: + Optional[User]: The user object if found, else None. + """ + stmt = select(User).where(User.id == user_id) + + user = (await db.execute(stmt)).unique().scalar_one_or_none() + if user: + await load_user_attrs(user) + return user + + +UsersSortingOptions = Enum( + "UsersSortingOptions", + { + "username": User.username.asc(), + "used_traffic": User.used_traffic.asc(), + "data_limit": User.data_limit.asc(), + "expire": User.expire.asc(), + "created_at": User.created_at.asc(), + "edit_at": User.edit_at.asc(), + "-username": User.username.desc(), + "-used_traffic": User.used_traffic.desc(), + "-data_limit": User.data_limit.desc(), + "-expire": User.expire.desc(), + "-created_at": User.created_at.desc(), + "-edit_at": User.edit_at.desc(), + }, +) + + +async def get_users( + db: AsyncSession, + offset: int | None = None, + limit: int | None = None, + usernames: list[str] | None = None, + search: str | None = None, + proxy_id: str | None = None, + status: UserStatus | list[UserStatus] | None = None, + sort: list[UsersSortingOptions] | None = None, + admin: Admin | None = None, + admins: list[str] | None = None, + reset_strategy: UserDataLimitResetStrategy | list[UserDataLimitResetStrategy] | None = None, + return_with_count: bool = False, + group_ids: list[int] | None = None, +) -> list[User] | tuple[list[User], int]: + """ + Retrieves users based on various filters. + + Args: + db: Database session. + offset: Number of records to skip. + limit: Number of records to retrieve. + usernames: List of usernames to filter by. + search: Search term for username. + status: User status filter (single status or list). + sort: Sort options. + admin: Admin filter. + admins: List of admin usernames to filter by. + reset_strategy: Reset strategy filter (single strategy or list). + return_with_count: Whether to return total count. + group_ids: Filter users by their group IDs. + + Returns: + List of users or tuple with (users, count) if return_with_count is True. + """ + stmt = select(User) + + filters = [] + if usernames: + filters.append(User.username.in_(usernames)) + if search: + filters.append(or_(User.username.ilike(f"%{search}%"), User.note.ilike(f"%{search}%"))) + + if status: + if isinstance(status, list): + filters.append(User.status.in_(status)) + else: + filters.append(User.status == status) + if admin: + filters.append(User.admin_id == admin.id) + if admins: + stmt = stmt.join(User.admin).filter(Admin.username.in_(admins)) + if reset_strategy: + if isinstance(reset_strategy, list): + filters.append(User.data_limit_reset_strategy.in_(reset_strategy)) + else: + filters.append(User.data_limit_reset_strategy == reset_strategy) + + if group_ids: + filters.append(User.groups.any(Group.id.in_(group_ids))) + if proxy_id: + filters.append(build_json_proxy_settings_search_condition(User.proxy_settings, proxy_id)) + + if filters: + stmt = stmt.where(and_(*filters)) + + if sort: + stmt = stmt.order_by(*sort) + + total = None + if return_with_count: + count_stmt = select(func.count()).select_from(stmt.subquery()) + result = await db.execute(count_stmt) + total = result.scalar() + + if offset: + stmt = stmt.offset(offset) + if limit: + stmt = stmt.limit(limit) + + result = await db.execute(stmt) + users = list(result.unique().scalars().all()) + + for user in users: + await load_user_attrs(user) + + if return_with_count: + return users, total + return users + + +async def get_expired_users( + db: AsyncSession, + expired_after: datetime | None = None, + expired_before: datetime | None = None, + admin_id: int | None = None, +): + query = select(User).where(User.status.in_([UserStatus.limited, UserStatus.expired])).where(User.is_expired) + if expired_after: + query = query.where(User.expire >= expired_after) + if expired_before: + query = query.where(User.expire <= expired_before) + if admin_id: + query = query.where(User.admin_id == admin_id) + + return (await db.execute(query)).unique().scalars().all() + + +async def get_active_to_expire_users(db: AsyncSession) -> list[User]: + stmt = select(User).where(User.status == UserStatus.active).where(User.is_expired) + + return list((await db.execute(stmt)).unique().scalars().all()) + + +async def get_active_to_limited_users(db: AsyncSession) -> list[User]: + stmt = select(User).where(User.status == UserStatus.active).where(User.is_limited) + + return list((await db.execute(stmt)).unique().scalars().all()) + + +async def get_on_hold_to_active_users(db: AsyncSession) -> list[User]: + stmt = select(User).where(User.status == UserStatus.on_hold).where(User.become_online) + + return list((await db.execute(stmt)).unique().scalars().all()) + + +async def get_users_to_reset_data_usage(db: AsyncSession) -> list[User]: + """ + Retrieves users whose data usage needs to be reset based on their reset strategy. + """ + last_reset_subq = ( + select( + UserUsageResetLogs.user_id, + func.max(UserUsageResetLogs.reset_at).label("last_reset_at"), + ) + .group_by(UserUsageResetLogs.user_id) + .subquery() + ) + + last_reset_time = coalesce(last_reset_subq.c.last_reset_at, User.created_at) + + reset_strategy_to_days = { + UserDataLimitResetStrategy.day: 1, + UserDataLimitResetStrategy.week: 7, + UserDataLimitResetStrategy.month: 30, + UserDataLimitResetStrategy.year: 365, + } + + num_days_to_reset_case = case( + *((User.data_limit_reset_strategy == strategy, days) for strategy, days in reset_strategy_to_days.items()), + else_=None, + ) + + stmt = ( + select(User) + .outerjoin(last_reset_subq, User.id == last_reset_subq.c.user_id) + .where( + User.status.in_([UserStatus.active, UserStatus.limited]), + User.data_limit_reset_strategy != UserDataLimitResetStrategy.no_reset, + DateDiff(func.now(), last_reset_time) >= num_days_to_reset_case, + ) + ) + + return list((await db.execute(stmt)).unique().scalars().all()) + + +async def get_usage_percentage_reached_users(db: AsyncSession, percentage: int) -> list[User]: + """ + Get active users who have reached or exceeded the specified usage percentage threshold + and don't have an existing notification reminder for this threshold. + """ + # Subquery to check for existing notification reminders + existing_reminder_subq = ( + select(NotificationReminder.user_id) + .where( + NotificationReminder.user_id == User.id, + NotificationReminder.type == ReminderType.data_usage, + NotificationReminder.threshold == percentage, + ) + .exists() + ) + + stmt = ( + select(User) + .options(joinedload(User.notification_reminders)) + .where(User.status == UserStatus.active) + .where(User.usage_percentage >= percentage) + .where(not_(existing_reminder_subq)) # Only users without existing reminders + ) + + users = list((await db.execute(stmt)).unique().scalars().all()) + for user in users: + await load_user_attrs(user) + return users + + +async def get_days_left_reached_users(db: AsyncSession, days: int) -> list[User]: + """ + Get active users who have reached or exceeded the specified days left threshold + and don't have an existing notification reminder for this threshold. + """ + # Subquery to check for existing notification reminders + existing_reminder_subq = ( + select(NotificationReminder.user_id) + .where( + NotificationReminder.user_id == User.id, + NotificationReminder.type == ReminderType.expiration_date, + NotificationReminder.threshold == days, + ) + .exists() + ) + + stmt = ( + select(User) + .options(joinedload(User.notification_reminders)) + .where(User.status == UserStatus.active) + .where(User.expire.isnot(None)) + .where(User.days_left == days) + .where(not_(existing_reminder_subq)) # Only users without existing reminders + ) + + users = list((await db.execute(stmt)).unique().scalars().all()) + for user in users: + await load_user_attrs(user) + return users + + +async def get_user_usages( + db: AsyncSession, + user_id: int, + start: datetime, + end: datetime, + period: Period, + node_id: int | None = None, + group_by_node: bool = False, +) -> UserUsageStatsList: + """ + Retrieves user usages within a specified date range. + """ + + # Build the appropriate truncation expression + trunc_expr = _build_trunc_expression(period, NodeUserUsage.created_at) + + conditions = [ + NodeUserUsage.created_at >= start, + NodeUserUsage.created_at <= end, + NodeUserUsage.user_id == user_id, + ] + + if node_id is not None: + conditions.append(NodeUserUsage.node_id == node_id) + else: + node_id = -1 + + if group_by_node: + stmt = ( + select( + trunc_expr.label("period_start"), + func.coalesce(NodeUserUsage.node_id, 0).label("node_id"), + func.sum(NodeUserUsage.used_traffic).label("total_traffic"), + ) + .where(and_(*conditions)) + .group_by(trunc_expr, NodeUserUsage.node_id) + .order_by(trunc_expr) + ) + + else: + stmt = ( + select(trunc_expr.label("period_start"), func.sum(NodeUserUsage.used_traffic).label("total_traffic")) + .where(and_(*conditions)) + .group_by(trunc_expr) + .order_by(trunc_expr) + ) + + result = await db.execute(stmt) + stats = {} + for row in result.mappings(): + row_dict = dict(row) + node_id_val = row_dict.pop("node_id", node_id) + if node_id_val not in stats: + stats[node_id_val] = [] + stats[node_id_val].append(UserUsageStat(**row_dict)) + + return UserUsageStatsList(period=period, start=start, end=end, stats=stats) + + +async def get_users_count(db: AsyncSession, status: UserStatus = None, admin_id: int = None) -> int: + """ + Gets the total count of users with optional filters. + + Args: + db (AsyncSession): Database session. + status (UserStatus, optional): Filter by user status. + admin_id (int, optional): Filter by admin. + Returns: + int: Total count of users. + """ + stmt = select(func.count(User.id)) + + filters = [] + if status: + filters.append(User.status == status) + if admin_id: + filters.append(User.admin_id == admin_id) + + if filters: + stmt = stmt.where(and_(*filters)) + + result = await db.execute(stmt) + return result.scalar() + + +async def get_users_count_by_status( + db: AsyncSession, statuses: list[UserStatus], admin_id: int = None +) -> dict[str, int]: + """ + Gets count of users grouped by status in a single query. + + Args: + db (AsyncSession): Database session. + statuses (list[UserStatus]): List of statuses to count. + admin_id (int, optional): Filter by admin. + Returns: + dict[str, int]: Dictionary with status counts and total. + """ + stmt = select(User.status, func.count(User.id).label("count")) + + filters = [User.status.in_(statuses)] + if admin_id: + filters.append(User.admin_id == admin_id) + + stmt = stmt.where(and_(*filters)).group_by(User.status) + + result = await db.execute(stmt) + status_counts = {row.status.value: row.count for row in result} + + # Ensure all requested statuses are present with 0 count if missing + all_statuses = {status.value: status_counts.get(status.value, 0) for status in statuses} + + # Add total count + all_statuses["total"] = sum(all_statuses.values()) + + return all_statuses + + +async def create_user(db: AsyncSession, new_user: UserCreate, groups: list[Group], admin: Admin) -> User: + """ + Creates a new user. + + Args: + db (AsyncSession): Database session. + new_user (UserCreate): User creation data. + groups (list[Group]): Groups to assign to user. + admin (Admin): Admin creating the user. + + Returns: + User: Created user object. + """ + db_user = User(**new_user.model_dump(exclude={"group_ids", "expire", "proxy_settings", "next_plan"})) + db_user.admin = admin + db_user.groups = groups + db_user.expire = new_user.expire or None + db_user.proxy_settings = new_user.proxy_settings.dict() + + db.add(db_user) + await db.commit() + await db.refresh(db_user) + + if new_user.next_plan: + db_user.next_plan = NextPlan(user_id=db_user.id, **new_user.next_plan.model_dump()) + db.add(db_user.next_plan) + await db.commit() + await db.refresh(db_user) + + await load_user_attrs(db_user) + return db_user + + +async def remove_user(db: AsyncSession, db_user: User) -> User: + """ + Removes a user from the database. + + Args: + db (AsyncSession): Database session. + db_user (User): User to remove. + + Returns: + User: Removed user object. + """ + await db.delete(db_user) + await db.commit() + return db_user + + +async def remove_users(db: AsyncSession, db_users: list[User]): + """ + Removes multiple users from the database. + + Args: + db (AsyncSession): Database session. + dbusers (list[User]): List of user objects to be removed. + """ + + await asyncio.gather(*[db.delete(user) for user in db_users]) + await db.commit() + + +async def modify_user(db: AsyncSession, db_user: User, modify: UserModify) -> User: + """ + Modify a user's information. + + Args: + db (AsyncSession): Database session. + dbuser (User): User to update. + modify (UserModify): Modified user data. + + Returns: + User: Updated user object. + """ + remove_usage_reminder = False + remove_expiration_reminder = False + + if modify.proxy_settings is not None: + db_user.proxy_settings = modify.proxy_settings.dict() + if modify.group_ids: + db_user.groups = await get_groups_by_ids(db, modify.group_ids) + + if modify.status is not None: + db_user.status = modify.status + + if modify.status is UserStatus.on_hold: + db_user.expire = None + remove_expiration_reminder = True + + elif modify.expire == 0: + db_user.expire = None + remove_expiration_reminder = True + if db_user.status is UserStatus.expired: + db_user.status = UserStatus.active + + elif modify.expire is not None: + db_user.expire = modify.expire + if db_user.status in [UserStatus.active, UserStatus.expired]: + if not db_user.expire or db_user.expire.replace(tzinfo=timezone.utc) > datetime.now(timezone.utc): + db_user.status = UserStatus.active + + remove_expiration_reminder = True + else: + db_user.status = UserStatus.expired + + if modify.data_limit is not None: + db_user.data_limit = modify.data_limit or None + if db_user.status not in [UserStatus.expired, UserStatus.disabled]: + if not db_user.data_limit or db_user.used_traffic < db_user.data_limit: + if db_user.status != UserStatus.on_hold: + db_user.status = UserStatus.active + + remove_usage_reminder = True + else: + db_user.status = UserStatus.limited + + if modify.note is not None: + db_user.note = modify.note or None + + if modify.data_limit_reset_strategy is not None: + db_user.data_limit_reset_strategy = modify.data_limit_reset_strategy.value + + if modify.on_hold_timeout == 0: + db_user.on_hold_timeout = None + elif modify.on_hold_timeout is not None: + db_user.on_hold_timeout = modify.on_hold_timeout + + if modify.on_hold_expire_duration is not None: + db_user.on_hold_expire_duration = modify.on_hold_expire_duration + + if modify.next_plan is not None: + db_user.next_plan = NextPlan( + user_id=db_user.id, + user_template_id=modify.next_plan.user_template_id, + data_limit=modify.next_plan.data_limit, + expire=modify.next_plan.expire, + add_remaining_traffic=modify.next_plan.add_remaining_traffic, + ) + elif db_user.next_plan is not None: + await db.delete(db_user.next_plan) + + db_user.edit_at = datetime.now(timezone.utc) + + if remove_usage_reminder or remove_expiration_reminder: + id = db_user.id + usage_percentage = db_user.usage_percentage + days_left = db_user.days_left + + if remove_usage_reminder: + await delete_user_passed_notification_reminders(db, id, ReminderType.data_usage, usage_percentage) + if remove_expiration_reminder: + await delete_user_passed_notification_reminders(db, id, ReminderType.expiration_date, days_left) + + await db.commit() + await db.refresh(db_user) + await load_user_attrs(db_user) + return db_user + + +async def _reset_user_traffic_and_log(db: AsyncSession, db_user: User): + """Helper to reset user traffic and log the action.""" + await db_user.awaitable_attrs.node_usages + await db_user.awaitable_attrs.next_plan + usage_log = UserUsageResetLogs( + user_id=db_user.id, + used_traffic_at_reset=db_user.used_traffic, + ) + db.add(usage_log) + + db_user.used_traffic = 0 + db_user.node_usages.clear() + + if db_user.next_plan: + await db.delete(db_user.next_plan) + db_user.next_plan = None + + +async def reset_user_data_usage(db: AsyncSession, db_user: User) -> User: + """ + Resets the data usage of a user and logs the reset. + + Args: + db (AsyncSession): Database session. + dbuser (User): The user object whose data usage is to be reset. + + Returns: + User: The updated user object. + """ + await _reset_user_traffic_and_log(db, db_user) + + if db_user.status not in [UserStatus.expired, UserStatus.disabled]: + db_user.status = UserStatus.active.value + + await db.commit() + await db.refresh(db_user) + await load_user_attrs(db_user) + return db_user + + +async def bulk_reset_user_data_usage(db: AsyncSession, users: list[User]) -> list[User]: + """ + Resets the data usage for a list of users and logs the reset. + + Args: + db (AsyncSession): Database session. + users (list[User]): The list of user objects whose data usage is to be reset. + + Returns: + list[User]: The updated list of user objects. + """ + for db_user in users: + await _reset_user_traffic_and_log(db, db_user) + if db_user.status not in [UserStatus.expired, UserStatus.disabled]: + db_user.status = UserStatus.active.value + await db.commit() + for user in users: + await db.refresh(user) + await load_user_attrs(user) + return users + + +async def reset_user_by_next(db: AsyncSession, db_user: User) -> User: + """ + Resets the data usage of a user based on next user. + + Args: + db (AsyncSession): Database session. + dbuser (User): The user object whose data usage is to be reset. + + Returns: + User: The updated user object. + """ + remaining_traffic = (db_user.data_limit or 0) - db_user.used_traffic + if db_user.next_plan.user_template_id is None: + db_user.data_limit = db_user.next_plan.data_limit + ( + 0 if not db_user.next_plan.add_remaining_traffic else remaining_traffic + ) + db_user.expire = ( + timedelta(seconds=db_user.next_plan.expire) + datetime.now(UTC) if db_user.next_plan.expire else None + ) + else: + await db_user.next_plan.awaitable_attrs.user_template + await db_user.next_plan.user_template.awaitable_attrs.groups + db_user.groups = db_user.next_plan.user_template.groups + db_user.data_limit = db_user.next_plan.user_template.data_limit + ( + 0 if not db_user.next_plan.add_remaining_traffic else remaining_traffic + ) + if db_user.next_plan.user_template.status is UserStatus.on_hold: + db_user.status = UserStatus.on_hold + db_user.on_hold_expire_duration = db_user.next_plan.user_template.expire_duration + db_user.on_hold_timeout = db_user.next_plan.user_template.on_hold_timeout + db_user.expire = None + else: + db_user.expire = ( + timedelta(seconds=db_user.next_plan.user_template.expire_duration) + datetime.now(UTC) + if db_user.next_plan.user_template.expire_duration + else None + ) + + if db_user.next_plan.user_template.extra_settings: + proxy_settings = deepcopy(db_user.proxy_settings) + proxy_settings["vless"]["flow"] = ( + db_user.next_plan.user_template.extra_settings["flow"] + if db_user.next_plan.user_template.extra_settings["flow"] + else "" + ) + proxy_settings["shadowsocks"]["method"] = ( + db_user.next_plan.user_template.extra_settings["method"] + if db_user.next_plan.user_template.extra_settings["method"] + else "chacha20-ietf-poly1305" + ) + db_user.proxy_settings = proxy_settings + db_user.data_limit_reset_strategy = db_user.next_plan.user_template.data_limit_reset_strategy + + await _reset_user_traffic_and_log(db, db_user) + db_user.status = UserStatus.active + + await db.commit() + await db.refresh(db_user) + await load_user_attrs(db_user) + return db_user + + +async def revoke_user_sub(db: AsyncSession, db_user: User) -> User: + """ + Revokes the subscription of a user and updates proxies settings. + + Args: + db (AsyncSession): Database session. + db_user (User): The user object whose subscription is to be revoked. + + Returns: + User: The updated user object. + """ + stmt = ( + update(User) + .where(User.id == db_user.id) + .values(sub_revoked_at=datetime.now(timezone.utc), proxy_settings=ProxyTable().dict()) + ) + await db.execute(stmt) + await db.commit() + await db.refresh(db_user) + await load_user_attrs(db_user) + return db_user + + +async def user_sub_update(db: AsyncSession, user_id: User, user_agent: str) -> User: + """ + Updates the user's subscription details. + + Args: + db (AsyncSession): Database session. + user_id (User): The user id whose subscription is to be updated. + user_agent (str): The user agent string. + + """ + agent = UserSubscriptionUpdate(user_id=user_id, user_agent=user_agent) + db.add(agent) + await db.commit() + + +async def get_user_sub_update_list( + db: AsyncSession, user_id: int, offset: int = 0, limit: int = 10 +) -> tuple[Sequence[UserSubscriptionUpdate], int]: + stmt = ( + select(UserSubscriptionUpdate) + .where(UserSubscriptionUpdate.user_id == user_id) + .order_by(desc(UserSubscriptionUpdate.created_at)) + ) + + result = await db.execute(select(func.count()).select_from(stmt.subquery())) + count = result.scalar() or 0 + + if offset: + stmt = stmt.offset(offset) + if limit: + stmt = stmt.limit(limit) + + result = (await db.execute(stmt)).unique().scalars().all() + + return result, count + + +async def autodelete_expired_users( + db: AsyncSession, include_limited_users: bool = False +) -> list[UserNotificationResponse]: + """ + Deletes expired (optionally also limited) users whose auto-delete time has passed. + + Args: + db (AsyncSession): Database session + include_limited_users (bool, optional): Whether to delete limited users as well. + Defaults to False. + + Returns: + list[UserNotificationResponse]: List of deleted users. + """ + target_status = [UserStatus.expired] if not include_limited_users else [UserStatus.expired, UserStatus.limited] + + auto_delete = coalesce(User.auto_delete_in_days, USERS_AUTODELETE_DAYS) + + query = ( + select( + User, + auto_delete, # Use global auto-delete days as fallback + ) + .where( + auto_delete >= 0, # Negative values prevent auto-deletion + User.status.in_(target_status), + ) + .options(joinedload(User.admin)) + ) + + expired_users = [ + user + for (user, auto_delete) in (await db.execute(query)).unique() + if user.last_status_change.replace(tzinfo=timezone.utc) + timedelta(days=auto_delete) + <= datetime.now(timezone.utc) + ] + + result: list[UserNotificationResponse] = [] + if expired_users: + for user in expired_users: + await load_user_attrs(user) + result.append(UserNotificationResponse.model_validate(user)) + + await remove_users(db, expired_users) + + return result + + +async def get_all_users_usages( + db: AsyncSession, + admin: str, + start: datetime, + end: datetime, + period: Period = Period.hour, + node_id: int | None = None, + group_by_node: bool = False, +) -> UserUsageStatsList: + """ + Retrieves aggregated usage data for all users of an admin within a specified time range, + grouped by the specified time period. + + Args: + db (AsyncSession): Database session for querying. + admin (Admin): The admin user for which to retrieve user usage data. + start (datetime): Start of the period. + end (datetime): End of the period. + period (Period): Time period to group by ('minute', 'hour', 'day', 'month'). + node_id (Optional[int]): Filter results by specific node ID if provided + + Returns: + UserUsageStatsList: Aggregated usage data for each period. + """ + admin_users = {user.id for user in await get_users(db=db, admins=admin)} + + # Build the appropriate truncation expression + trunc_expr = _build_trunc_expression(period, NodeUserUsage.created_at) + + conditions = [ + NodeUserUsage.created_at >= start, + NodeUserUsage.created_at <= end, + NodeUserUsage.user_id.in_(admin_users), + ] + + if node_id is not None: + conditions.append(NodeUserUsage.node_id == node_id) + else: + node_id = -1 + + if group_by_node: + stmt = ( + select( + trunc_expr.label("period_start"), + func.coalesce(NodeUserUsage.node_id, 0).label("node_id"), + func.sum(NodeUserUsage.used_traffic).label("total_traffic"), + ) + .where(and_(*conditions)) + .group_by(trunc_expr, NodeUserUsage.node_id) + .order_by(trunc_expr) + ) + else: + stmt = ( + select(trunc_expr.label("period_start"), func.sum(NodeUserUsage.used_traffic).label("total_traffic")) + .where(and_(*conditions)) + .group_by(trunc_expr) + .order_by(trunc_expr) + ) + + result = await db.execute(stmt) + stats = {} + for row in result.mappings(): + row_dict = dict(row) + node_id_val = row_dict.pop("node_id", node_id) + if node_id_val not in stats: + stats[node_id_val] = [] + stats[node_id_val].append(UserUsageStat(**row_dict)) + + return UserUsageStatsList(period=period, start=start, end=end, stats=stats) + + +async def update_users_status(db: AsyncSession, users: list[User], status: UserStatus) -> list[User]: + """ + Updates a users status and records the time of change. + + Args: + db (AsyncSession): Database session. + users list[User]: The users list to update. + status (UserStatus): The new status. + + Returns: + User: The updated user object. + """ + user_ids = [user.id for user in users] + stmt = ( + update(User).where(User.id.in_(user_ids)).values(status=status, last_status_change=datetime.now(timezone.utc)) + ) + await db.execute(stmt) + await db.commit() + for user in users: + await db.refresh(user) + await load_user_attrs(user) + return users + + +async def set_owner(db: AsyncSession, db_user: User, admin: Admin) -> User: + """ + Sets the owner (admin) of a user. + + Args: + db (AsyncSession): Database session. + db_user (User): The user object whose owner is to be set. + admin (Admin): The admin to set as owner. + + Returns: + User: The updated user object. + """ + stmt = update(User).where(User.id == db_user.id).values(admin_id=admin.id) + await db.execute(stmt) + await db.commit() + await db.refresh(db_user) + await load_user_attrs(db_user) + return db_user + + +async def start_users_expire(db: AsyncSession, users: list[User]) -> list[User]: + """ + Starts the expiration timer for a user. + + Args: + db (AsyncSession): Database session. + users list[User]: The users list whose expiration timer is to be started. + + Returns: + list[User]: The updated users list. + """ + now = datetime.now(timezone.utc) + for user in users: + expire_time = now + timedelta(seconds=user.on_hold_expire_duration) + stmt = ( + update(User) + .where(User.id == user.id) + .values(expire=expire_time, on_hold_expire_duration=None, on_hold_timeout=None, status=UserStatus.active) + ) + await db.execute(stmt) + + await db.commit() + for user in users: + await db.refresh(user) + await load_user_attrs(user) + return users + + +async def create_notification_reminder( + db: AsyncSession, reminder_type: ReminderType, expires_at: datetime, user_id: int, threshold: int | None = None +) -> NotificationReminder: + """ + Creates a new notification reminder. + + Args: + db (AsyncSession): The database session. + reminder_type (ReminderType): The type of reminder. + expires_at (datetime): The expiration time of the reminder. + user_id (int): The ID of the user associated with the reminder. + threshold (Optional[int]): The threshold value to check for (e.g., days left or usage percent). + + Returns: + NotificationReminder: The newly created NotificationReminder object. + """ + reminder = NotificationReminder(type=reminder_type, expires_at=expires_at, user_id=user_id) + if threshold is not None: + reminder.threshold = threshold + db.add(reminder) + await db.commit() + await db.refresh(reminder) + return reminder + + +async def bulk_create_notification_reminders(db: AsyncSession, reminder_data: List[dict]) -> None: + """ + Bulk creates notification reminders. + + Args: + db (AsyncSession): The database session. + reminder_data (List[dict]): List of reminder data dicts with keys: user_id, type, threshold, expires_at + """ + if not reminder_data: + return + + reminders = [] + for data in reminder_data: + reminder = NotificationReminder( + type=data["type"], expires_at=data["expires_at"], user_id=data["user_id"], threshold=data.get("threshold") + ) + reminders.append(reminder) + + db.add_all(reminders) + await db.commit() + + +async def delete_user_passed_notification_reminders( + db: AsyncSession, user_id: int, type: ReminderType, threshold: int +) -> None: + """ + Deletes user reminders passed. + + Args: + db (AsyncSession): The database session. + user_id (int): The ID of the user. + reminder_type (ReminderType): The type of reminder to delete. + threshold (int): The threshold to delete (e.g., days left or usage percent). + """ + conditions = [NotificationReminder.user_id == user_id, NotificationReminder.type == type] + + if type == ReminderType.data_usage: + conditions.append(NotificationReminder.threshold > threshold) + if type == ReminderType.expiration_date: + conditions.append(NotificationReminder.threshold < threshold) + + stmt = delete(NotificationReminder).where(and_(*conditions)) + await db.execute(stmt) + + +async def count_online_users(db: AsyncSession, time_delta: timedelta, admin_id: int | None = None): + """ + Counts the number of users who have been online within the specified time delta. + + Args: + db (AsyncSession): The database session. + time_delta (timedelta): The time period to check for online users. + admin_id (int, optional): Filter by admin. + + Returns: + int: The number of users who have been online within the specified time period. + """ + twenty_four_hours_ago = datetime.now(timezone.utc) - time_delta + query = select(func.count(User.id)).where(User.online_at.isnot(None), User.online_at >= twenty_four_hours_ago) + if admin_id: + query = query.where(User.admin_id == admin_id) + return (await db.execute(query)).scalar_one_or_none() diff --git a/app/db/crud/user_template.py b/app/db/crud/user_template.py new file mode 100644 index 000000000..6f26f5c34 --- /dev/null +++ b/app/db/crud/user_template.py @@ -0,0 +1,152 @@ +from typing import Union, List + +from sqlalchemy import select +from sqlalchemy.ext.asyncio import AsyncSession + +from app.db.models import UserTemplate +from app.models.user_template import UserTemplateCreate, UserTemplateModify + +from .group import get_groups_by_ids + + +async def load_user_template_attrs(template: UserTemplate): + await template.awaitable_attrs.groups + + +async def create_user_template(db: AsyncSession, user_template: UserTemplateCreate) -> UserTemplate: + """ + Creates a new user template in the database. + + Args: + db (AsyncSession): Database session. + user_template (UserTemplateCreate): The user template creation data. + + Returns: + UserTemplate: The created user template object. + """ + + db_user_template = UserTemplate( + name=user_template.name, + data_limit=user_template.data_limit, + expire_duration=user_template.expire_duration, + username_prefix=user_template.username_prefix, + username_suffix=user_template.username_suffix, + groups=await get_groups_by_ids(db, user_template.group_ids) if user_template.group_ids else None, + extra_settings=user_template.extra_settings.dict() if user_template.extra_settings else None, + status=user_template.status, + reset_usages=user_template.reset_usages, + on_hold_timeout=user_template.on_hold_timeout, + is_disabled=user_template.is_disabled, + data_limit_reset_strategy=user_template.data_limit_reset_strategy, + ) + + db.add(db_user_template) + await db.commit() + await db.refresh(db_user_template) + await load_user_template_attrs(db_user_template) + return db_user_template + + +async def modify_user_template( + db: AsyncSession, db_user_template: UserTemplate, modified_user_template: UserTemplateModify +) -> UserTemplate: + """ + Updates a user template's details. + + Args: + db (AsyncSession): Database session. + db_user_template (UserTemplate): The user template object to be updated. + modified_user_template (UserTemplateModify): The modified user template data. + + Returns: + UserTemplate: The updated user template object. + """ + if modified_user_template.name is not None: + db_user_template.name = modified_user_template.name + if modified_user_template.data_limit is not None: + db_user_template.data_limit = modified_user_template.data_limit + if modified_user_template.expire_duration is not None: + db_user_template.expire_duration = modified_user_template.expire_duration + if modified_user_template.username_prefix is not None: + db_user_template.username_prefix = modified_user_template.username_prefix + if modified_user_template.username_suffix is not None: + db_user_template.username_suffix = modified_user_template.username_suffix + if modified_user_template.group_ids: + db_user_template.groups = await get_groups_by_ids(db, modified_user_template.group_ids) + if modified_user_template.extra_settings is not None: + db_user_template.extra_settings = modified_user_template.extra_settings.dict() + if modified_user_template.status is not None: + db_user_template.status = modified_user_template.status + if modified_user_template.reset_usages is not None: + db_user_template.reset_usages = modified_user_template.reset_usages + if modified_user_template.on_hold_timeout is not None: + db_user_template.on_hold_timeout = modified_user_template.on_hold_timeout + if modified_user_template.is_disabled is not None: + db_user_template.is_disabled = modified_user_template.is_disabled + if modified_user_template.data_limit_reset_strategy is not None: + db_user_template.data_limit_reset_strategy = modified_user_template.data_limit_reset_strategy + + await db.commit() + await db.refresh(db_user_template) + await load_user_template_attrs(db_user_template) + return db_user_template + + +async def remove_user_template(db: AsyncSession, db_user_template: UserTemplate): + """ + Removes a user template from the database. + + Args: + db (AsyncSession): Database session. + db_user_template (UserTemplate): The user template object to be removed. + """ + await db.delete(db_user_template) + await db.commit() + + +async def get_user_template(db: AsyncSession, user_template_id: int) -> UserTemplate: + """ + Retrieves a user template by its ID. + + Args: + db (AsyncSession): Database session. + user_template_id (int): The ID of the user template. + + Returns: + UserTemplate: The user template object. + """ + user_template = ( + (await db.execute(select(UserTemplate).where(UserTemplate.id == user_template_id))) + .unique() + .scalar_one_or_none() + ) + if user_template: + await load_user_template_attrs(user_template) + return user_template + + +async def get_user_templates( + db: AsyncSession, offset: Union[int, None] = None, limit: Union[int, None] = None +) -> List[UserTemplate]: + """ + Retrieves a list of user templates with optional pagination. + + Args: + db (AsyncSession): Database session. + offset (Union[int, None]): The number of records to skip (for pagination). + limit (Union[int, None]): The maximum number of records to return. + + Returns: + List[UserTemplate]: A list of user template objects. + """ + query = select(UserTemplate) + if offset: + query = query.offset(offset) + if limit: + query = query.limit(limit) + + user_templates = (await db.execute(query)).scalars().all() + for template in user_templates: + await load_user_template_attrs(template) + + return user_templates diff --git a/app/db/migrations/README b/app/db/migrations/README new file mode 100644 index 000000000..98e4f9c44 --- /dev/null +++ b/app/db/migrations/README @@ -0,0 +1 @@ +Generic single-database configuration. \ No newline at end of file diff --git a/app/db/migrations/env.py b/app/db/migrations/env.py new file mode 100644 index 000000000..7eff2f372 --- /dev/null +++ b/app/db/migrations/env.py @@ -0,0 +1,89 @@ +import asyncio +from logging.config import fileConfig +from sqlalchemy import pool +from sqlalchemy.engine import Connection +from sqlalchemy.ext.asyncio import async_engine_from_config +from alembic import context + +from app.db.base import Base +from config import SQLALCHEMY_DATABASE_URL + +# this is the Alembic Config object, which provides +# access to the values within the .ini file in use. +config = context.config +config.set_main_option('sqlalchemy.url', SQLALCHEMY_DATABASE_URL) + +# Interpret the config file for Python logging. +# This line sets up loggers basically. +if config.config_file_name is not None: + fileConfig(config.config_file_name) + +# add your model's MetaData object here +# for 'autogenerate' support +# from myapp import mymodel +# target_metadata = mymodel.Base.metadata +target_metadata = Base.metadata + +# other values from the config, defined by the needs of env.py, +# can be acquired: +# my_important_option = config.get_main_option("my_important_option") +# ... etc. + + +def run_migrations_offline() -> None: + """Run migrations in 'offline' mode. + + This configures the context with just a URL + and not an Engine, though an Engine is acceptable + here as well. By skipping the Engine creation + we don't even need a DBAPI to be available. + + Calls to context.execute() here emit the given string to the + script output. + + """ + url = config.get_main_option("sqlalchemy.url") + context.configure( + url=url, + target_metadata=target_metadata, + literal_binds=True, + dialect_opts={"paramstyle": "named"}, + ) + + with context.begin_transaction(): + context.run_migrations() +def do_run_migrations(connection: Connection) -> None: + context.configure(connection=connection, target_metadata=target_metadata) + + with context.begin_transaction(): + context.run_migrations() + + +async def run_async_migrations() -> None: + """In this scenario we need to create an Engine + and associate a connection with the context. + + """ + + connectable = async_engine_from_config( + config.get_section(config.config_ini_section, {}), + prefix="sqlalchemy.", + poolclass=pool.NullPool, + ) + + async with connectable.connect() as connection: + await connection.run_sync(do_run_migrations) + + await connectable.dispose() + + +def run_migrations_online() -> None: + """Run migrations in 'online' mode.""" + + asyncio.run(run_async_migrations()) + + +if context.is_offline_mode(): + run_migrations_offline() +else: + run_migrations_online() \ No newline at end of file diff --git a/app/db/migrations/script.py.mako b/app/db/migrations/script.py.mako new file mode 100644 index 000000000..55df2863d --- /dev/null +++ b/app/db/migrations/script.py.mako @@ -0,0 +1,24 @@ +"""${message} + +Revision ID: ${up_revision} +Revises: ${down_revision | comma,n} +Create Date: ${create_date} + +""" +from alembic import op +import sqlalchemy as sa +${imports if imports else ""} + +# revision identifiers, used by Alembic. +revision = ${repr(up_revision)} +down_revision = ${repr(down_revision)} +branch_labels = ${repr(branch_labels)} +depends_on = ${repr(depends_on)} + + +def upgrade() -> None: + ${upgrades if upgrades else "pass"} + + +def downgrade() -> None: + ${downgrades if downgrades else "pass"} diff --git a/app/db/migrations/versions/015cf1dc6eca_sub_updated_at_and_sub_last_user_agent.py b/app/db/migrations/versions/015cf1dc6eca_sub_updated_at_and_sub_last_user_agent.py new file mode 100644 index 000000000..ba8f6ef75 --- /dev/null +++ b/app/db/migrations/versions/015cf1dc6eca_sub_updated_at_and_sub_last_user_agent.py @@ -0,0 +1,30 @@ +"""sub_updated_at and sub_last_user_agent + +Revision ID: 015cf1dc6eca +Revises: c47250b790eb +Create Date: 2023-08-08 18:42:07.829202 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '015cf1dc6eca' +down_revision = 'c47250b790eb' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('users', sa.Column('sub_updated_at', sa.DateTime(), nullable=True)) + op.add_column('users', sa.Column('sub_last_user_agent', sa.String(length=64), nullable=True)) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('users', 'sub_last_user_agent') + op.drop_column('users', 'sub_updated_at') + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/025d427831dd_sub_last_user_agent_length.py b/app/db/migrations/versions/025d427831dd_sub_last_user_agent_length.py new file mode 100644 index 000000000..d463ff3d7 --- /dev/null +++ b/app/db/migrations/versions/025d427831dd_sub_last_user_agent_length.py @@ -0,0 +1,34 @@ +"""sub_last_user_agent length + +Revision ID: 025d427831dd +Revises: a6e3fff39291 +Create Date: 2023-08-22 00:50:25.575609 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '025d427831dd' +down_revision = 'a6e3fff39291' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + bind = op.get_bind() + + if bind.engine.name == 'mysql': + op.alter_column('users', 'sub_last_user_agent', + existing_type=sa.String(length=512), + nullable=True) + + +def downgrade() -> None: + bind = op.get_bind() + + if bind.engine.name == 'mysql': + op.alter_column('users', 'sub_last_user_agent', + existing_type=sa.String(length=64), + nullable=True) diff --git a/app/db/migrations/versions/04a5ec93e9a5_add_randomizednoalpn_and_unsafe_to_.py b/app/db/migrations/versions/04a5ec93e9a5_add_randomizednoalpn_and_unsafe_to_.py new file mode 100644 index 000000000..33c37c334 --- /dev/null +++ b/app/db/migrations/versions/04a5ec93e9a5_add_randomizednoalpn_and_unsafe_to_.py @@ -0,0 +1,83 @@ +"""add randomizednoalpn and unsafe to fingerprints + +Revision ID: 04a5ec93e9a5 +Revises: 8fe407cf56c9 +Create Date: 2025-07-10 14:55:05.980537 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '04a5ec93e9a5' +down_revision = '8fe407cf56c9' +branch_labels = None +depends_on = None + +# Previous enum (without the new values) +old_fingerprint = sa.Enum( + "none", "chrome", "firefox", "safari", "ios", "android", "edge", + "360", "qq", "random", "randomized", + name="proxyhostfingerprint" +) + +# New enum (with added values) +new_fingerprint = sa.Enum( + "none", "chrome", "firefox", "safari", "ios", "android", "edge", + "360", "qq", "random", "randomized", "randomizednoalpn", "unsafe", + name="proxyhostfingerprint" +) + +def upgrade(): + bind = op.get_bind() + dialect = bind.dialect.name + + if dialect == "postgresql": + op.execute("ALTER TYPE proxyhostfingerprint ADD VALUE IF NOT EXISTS 'randomizednoalpn'") + op.execute("ALTER TYPE proxyhostfingerprint ADD VALUE IF NOT EXISTS 'unsafe'") + else: + with op.batch_alter_table("hosts", schema=None) as batch_op: + batch_op.alter_column( + "fingerprint", + type_=new_fingerprint, + existing_type=old_fingerprint, + existing_nullable=True + ) + + +def downgrade(): + bind = op.get_bind() + dialect = bind.dialect.name + + if dialect == "postgresql": + # Rename old type + op.execute("ALTER TYPE proxyhostfingerprint RENAME TO proxyhostfingerprint_old") + + # Create new (downgraded) enum type + op.execute(""" + CREATE TYPE proxyhostfingerprint AS ENUM ( + 'none', 'chrome', 'firefox', 'safari', 'ios', + 'android', 'edge', '360', 'qq', 'random', 'randomized' + ) + """) + + # Alter the column to use the new enum + op.execute(""" + ALTER TABLE hosts + ALTER COLUMN fingerprint TYPE proxyhostfingerprint + USING fingerprint::text::proxyhostfingerprint + """) + + # Drop the old enum type + op.execute("DROP TYPE proxyhostfingerprint_old") + + else: + # SQLite / MySQL: Just switch enum type + with op.batch_alter_table("hosts", schema=None) as batch_op: + batch_op.alter_column( + "fingerprint", + type_=old_fingerprint, + existing_type=new_fingerprint, + existing_nullable=True + ) \ No newline at end of file diff --git a/app/db/migrations/versions/07f9bbb3db4e_user_last_status_change.py b/app/db/migrations/versions/07f9bbb3db4e_user_last_status_change.py new file mode 100644 index 000000000..7e62f0551 --- /dev/null +++ b/app/db/migrations/versions/07f9bbb3db4e_user_last_status_change.py @@ -0,0 +1,49 @@ +"""user_last_status_change + +Revision ID: 07f9bbb3db4e +Revises: ccbf9d322ae3 +Create Date: 2024-04-23 09:57:24.697613 + +""" + +from alembic import op +import sqlalchemy as sa +from datetime import datetime + +# revision identifiers, used by Alembic. +revision = '07f9bbb3db4e' +down_revision = 'ccbf9d322ae3' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + # Add the column 'last_status_change' + op.add_column('users', sa.Column('last_status_change', sa.DateTime(), nullable=True)) + + # Define the 'users' table for SQLAlchemy Core operations + users_table = sa.Table( + 'users', + sa.MetaData(), + sa.Column('id', sa.Integer, primary_key=True), + sa.Column('last_status_change', sa.DateTime()) + ) + + # Set last_status_change to the current UTC time for rows where it's NULL + connection = op.get_bind() + update_stmt = ( + sa.update(users_table) + .where(users_table.c.last_status_change.is_(None)) + .values(last_status_change=datetime.utcnow()) + ) + connection.execute(update_stmt) + + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + # Drop the 'last_status_change' column + op.drop_column('users', 'last_status_change') + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/084b8004104c_cast_alpn_as_enumarray.py b/app/db/migrations/versions/084b8004104c_cast_alpn_as_enumarray.py new file mode 100644 index 000000000..d33e8f957 --- /dev/null +++ b/app/db/migrations/versions/084b8004104c_cast_alpn_as_enumarray.py @@ -0,0 +1,91 @@ +"""cast alpn as EnumArray + +Revision ID: 084b8004104c +Revises: 9fa4831e991a +Create Date: 2025-09-07 14:32:13.968789 + +""" +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import mysql, postgresql + + +# revision identifiers, used by Alembic. +revision = '084b8004104c' +down_revision = '9fa4831e991a' +branch_labels = None +depends_on = None + + +alpn_enum = ('none', 'h3', 'h2', 'http/1.1', 'h3,h2,http/1.1', 'h3,h2', 'h2,http/1.1') + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + connection = op.get_bind() + dialect = connection.dialect.name + + if dialect == 'postgresql': + op.alter_column( + 'hosts', + 'alpn', + existing_type=postgresql.ENUM(*alpn_enum, name="proxyhostalpn"), + type_=sa.String(14), + nullable=True, + ) + elif dialect == 'mysql': + op.alter_column( + 'hosts', + 'alpn', + existing_type=mysql.ENUM(*alpn_enum), + type_=sa.String(14), + nullable=True, + ) + else: # sqlite + with op.batch_alter_table('hosts') as batch_op: + batch_op.alter_column( + 'alpn', + existing_type=sa.VARCHAR(length=14), + type_=sa.String(14), + nullable=True, + existing_server_default=sa.text("'none'"), + ) + + op.execute("UPDATE hosts SET alpn = NULL WHERE alpn = 'none'") + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.execute(f"UPDATE hosts SET alpn = 'none' WHERE alpn IS NULL OR alpn NOT IN {alpn_enum}") + + connection = op.get_bind() + dialect = connection.dialect.name + + if dialect == 'postgresql': + op.alter_column( + 'hosts', + 'alpn', + existing_type=sa.String(14), + type_=postgresql.ENUM(*alpn_enum, name="proxyhostalpn"), + nullable=False, + postgresql_using='alpn::proxyhostalpn' + ) + elif dialect == 'mysql': + op.alter_column( + 'hosts', + 'alpn', + existing_type=sa.String(14), + type_=mysql.ENUM(*alpn_enum), + nullable=False, + ) + else: + with op.batch_alter_table('hosts') as batch_op: + batch_op.alter_column( + 'alpn', + existing_type=sa.String(14), + type_=sa.VARCHAR(length=14), + nullable=False, + existing_server_default=sa.text("'none'"), + ) + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/08b381fc1bc7_update_shadowsocks_method.py b/app/db/migrations/versions/08b381fc1bc7_update_shadowsocks_method.py new file mode 100644 index 000000000..f2c246648 --- /dev/null +++ b/app/db/migrations/versions/08b381fc1bc7_update_shadowsocks_method.py @@ -0,0 +1,75 @@ +"""update_shadowsocks_method + +Revision ID: 08b381fc1bc7 +Revises: 0f720f5c54dd +Create Date: 2023-11-03 13:41:57.120379 + +""" + +from alembic import op +import sqlalchemy as sa +from sqlalchemy import cast, String +import json + +# revision identifiers, used by Alembic. +revision = '08b381fc1bc7' +down_revision = '0f720f5c54dd' +branch_labels = None +depends_on = None + +# Define the table using SQLAlchemy Core +proxies_table = sa.Table( + 'proxies', + sa.MetaData(), + sa.Column('id', sa.Integer, primary_key=True), + sa.Column('type', sa.String), + sa.Column('settings', sa.Text), +) + + +def upgrade() -> None: + connection = op.get_bind() + + # Select proxies where type = 'Shadowsocks' + stmt = sa.select(proxies_table.c.id, proxies_table.c.settings).where( + cast(proxies_table.c.type, String) == 'Shadowsocks' + ) + result = connection.execute(stmt) + + for pid, settings in result: + settings = json.loads(settings) + if settings.get('method') == 'chacha20-poly1305': + new_settings = settings.copy() + new_settings['method'] = 'chacha20-ietf-poly1305' + + # Update query using SQLAlchemy's update() + update_stmt = ( + sa.update(proxies_table) + .where(proxies_table.c.id == pid) + .values(settings=json.dumps(new_settings)) + ) + connection.execute(update_stmt) + + +def downgrade() -> None: + connection = op.get_bind() + + # Select proxies where type = 'Shadowsocks' + stmt = sa.select(proxies_table.c.id, proxies_table.c.settings).where( + cast(proxies_table.c.type, String) == 'Shadowsocks' + ) + result = connection.execute(stmt) + + for pid, settings in result: + settings = json.loads(settings) + if settings.get('method') == 'chacha20-ietf-poly1305': + new_settings = settings.copy() + new_settings['method'] = 'chacha20-poly1305' + + # Update query using SQLAlchemy's update() + update_stmt = ( + sa.update(proxies_table) + .where(proxies_table.c.id == pid) + .values(settings=json.dumps(new_settings)) + ) + connection.execute(update_stmt) diff --git a/app/db/migrations/versions/0b62f893092b_add_sub_template_sub_domain_profile_.py b/app/db/migrations/versions/0b62f893092b_add_sub_template_sub_domain_profile_.py new file mode 100644 index 000000000..6964d9b64 --- /dev/null +++ b/app/db/migrations/versions/0b62f893092b_add_sub_template_sub_domain_profile_.py @@ -0,0 +1,34 @@ +"""add sub_template, sub_domain, profile_title and support_url to admin table + +Revision ID: 0b62f893092b +Revises: 9aa6559916be +Create Date: 2025-03-08 17:12:10.205130 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '0b62f893092b' +down_revision = '9aa6559916be' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('admins', sa.Column('sub_template', sa.String(length=1024), nullable=True)) + op.add_column('admins', sa.Column('sub_domain', sa.String(length=256), nullable=True)) + op.add_column('admins', sa.Column('profile_title', sa.String(length=512), nullable=True)) + op.add_column('admins', sa.Column('support_url', sa.String(length=1024), nullable=True)) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('admins', 'support_url') + op.drop_column('admins', 'profile_title') + op.drop_column('admins', 'sub_domain') + op.drop_column('admins', 'sub_template') + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/0d22271ee06e_make_data_limit_and_expire_duration_.py b/app/db/migrations/versions/0d22271ee06e_make_data_limit_and_expire_duration_.py new file mode 100644 index 000000000..2f910a8a1 --- /dev/null +++ b/app/db/migrations/versions/0d22271ee06e_make_data_limit_and_expire_duration_.py @@ -0,0 +1,56 @@ +"""make data_limit and expire_duration bigint and sub_last_user_agent string + +Revision ID: 0d22271ee06e +Revises: 1dc5f89b706a +Create Date: 2025-03-19 22:04:10.485911 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '0d22271ee06e' +down_revision = '1dc5f89b706a' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table('user_templates') as batch_op: + batch_op.alter_column('data_limit', + existing_type=sa.INTEGER(), + type_=sa.BigInteger(), + existing_nullable=True) + batch_op.alter_column('expire_duration', + existing_type=sa.INTEGER(), + type_=sa.BigInteger(), + existing_nullable=True) + + with op.batch_alter_table('users') as batch_op: + batch_op.alter_column('sub_last_user_agent', + existing_type=sa.VARCHAR(length=64), + type_=sa.String(length=512), + existing_nullable=True) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table('users') as batch_op: + batch_op.alter_column('sub_last_user_agent', + existing_type=sa.String(length=512), + type_=sa.VARCHAR(length=64), + existing_nullable=True) + + with op.batch_alter_table('user_templates') as batch_op: + batch_op.alter_column('expire_duration', + existing_type=sa.BigInteger(), + type_=sa.INTEGER(), + existing_nullable=True) + batch_op.alter_column('data_limit', + existing_type=sa.BigInteger(), + type_=sa.INTEGER(), + existing_nullable=True) + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/0f720f5c54dd_.py b/app/db/migrations/versions/0f720f5c54dd_.py new file mode 100644 index 000000000..88f37237c --- /dev/null +++ b/app/db/migrations/versions/0f720f5c54dd_.py @@ -0,0 +1,24 @@ +"""empty message + +Revision ID: 0f720f5c54dd +Revises: 5a4446e7b165, fe7796f840a4 +Create Date: 2023-10-27 16:19:33.690427 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '0f720f5c54dd' +down_revision = ('5a4446e7b165', 'fe7796f840a4') +branch_labels = None +depends_on = None + + +def upgrade() -> None: + pass + + +def downgrade() -> None: + pass diff --git a/app/db/migrations/versions/16e19723febc_migrate_to_groups.py b/app/db/migrations/versions/16e19723febc_migrate_to_groups.py new file mode 100644 index 000000000..8a7cbe523 --- /dev/null +++ b/app/db/migrations/versions/16e19723febc_migrate_to_groups.py @@ -0,0 +1,302 @@ +"""migrate to groups + +Revision ID: 16e19723febc +Revises: 3b59f3680c90 +Create Date: 2025-03-17 08:45:33.514529 + +""" +import json +from enum import Enum +from collections import defaultdict, Counter +from decouple import config as decouple_config + +import commentjson +import sqlalchemy as sa +from alembic import op +from sqlalchemy import Column, ForeignKey, MetaData, Table +from sqlalchemy.orm import Session +from app.db.models import ( + User, + ProxyInbound, +) + + +# revision identifiers, used by Alembic. +revision = '16e19723febc' +down_revision = '3b59f3680c90' +branch_labels = None +depends_on = None + + +class ProxyTypes(str, Enum): + VMess = "vmess" + VLESS = "vless" + Trojan = "trojan" + Shadowsocks = "shadowsocks" + + +group_table = Table( + "groups", + MetaData(), + Column('id', sa.Integer, primary_key=True), + Column("name",sa.String(64),unique=True), + Column("is_disabled",sa.Boolean(),default=False) +) +proxy_table = Table( + 'proxies', + MetaData(), + Column('id', sa.Integer, primary_key=True), + Column('user_id', ForeignKey("users.id")), + Column('type', sa.Enum(ProxyTypes)), + Column('settings', sa.JSON) + ) +user_template_table = Table( + "user_templates", + MetaData(), + Column('id', sa.Integer, primary_key=True), + Column("name",sa.String(64),unique=True), + Column("data_limit", sa.BigInteger, default=0), + Column("expire_duration", sa.BigInteger, default=0), + Column("username_prefix", sa.String(20)), + Column("username_suffix", sa.String(20)), + ) +template_group_association = Table( + "template_group_association", + MetaData(), + Column("user_template_id", ForeignKey("user_templates.id")), + Column("group_id", ForeignKey("groups.id")), + ) +template_inbounds_association = Table( + "template_inbounds_association", + MetaData(), + Column("user_template_id", ForeignKey("user_templates.id")), + Column("inbound_tag", ForeignKey("inbounds.tag")), + ) +excluded_inbounds_association = Table( + "exclude_inbounds_association", + MetaData(), + Column("proxy_id", ForeignKey("proxies.id")), + Column("inbound_tag", ForeignKey("inbounds.tag")), + ) +inbounds_groups_association = Table( + "inbounds_groups_association", + MetaData(), + Column("inbound_id", ForeignKey("inbounds.id") ), + Column("group_id", ForeignKey("groups.id") ), +) +users_groups_association = Table( + "users_groups_association", + MetaData(), + Column("user_id", ForeignKey("users.id")), + Column("groups_id", ForeignKey("groups.id")), +) + +base_xray = { + "log": {"loglevel": "warning"}, + "inbounds": [ + { + "tag": "Shadowsocks TCP", + "listen": "0.0.0.0", + "port": 1080, + "protocol": "shadowsocks", + "settings": {"clients": [], "network": "tcp,udp"}, + } + ], + "outbounds": [{"protocol": "freedom", "tag": "DIRECT"}, {"protocol": "blackhole", "tag": "BLOCK"}], + "routing": {"rules": [{"ip": ["geoip:private"], "outboundTag": "BLOCK", "type": "field"}]}, +} + +def get_config(key, default=None, cast=None): + if cast is not None: + return decouple_config(key, default=default, cast=cast) + else: + return decouple_config(key, default=default) + +XRAY_JSON = get_config("XRAY_JSON", default="./xray_config.json") + + +def upgrade() -> None: + + try: + connection = op.get_bind() + session = Session(bind=connection) + if session.query(User.id).count() <= 0: + return + result = ( + session.query( + User.id.label("user_id"), + proxy_table.c.type.label("proxy_type"), + ProxyInbound.tag.label("excluded_inbound_tag"), + ) + .join(proxy_table, proxy_table.c.user_id == User.id) + .outerjoin(excluded_inbounds_association, proxy_table.c.id == excluded_inbounds_association.c.proxy_id) + .outerjoin(ProxyInbound, excluded_inbounds_association.c.inbound_tag == ProxyInbound.tag) + .group_by(User.id, proxy_table.c.type, ProxyInbound.tag) + .order_by(User.id, proxy_table.c.type) + .all() + ) + template_count = session.query(user_template_table).count() + if template_count > 0: + templates = ( + session.query( + user_template_table.c.id.label("tid"), + template_inbounds_association.c.inbound_tag.label("inbounds"), + ) + .outerjoin(ProxyInbound, template_inbounds_association.c.inbound_tag == ProxyInbound.tag) + .group_by(user_template_table.c.id, template_inbounds_association.c.inbound_tag) + .order_by(user_template_table.c.id) + .all() + ) + template_dict = defaultdict(lambda: {"id": 0, "inbounds": []}) + for row in templates: + tid = row.tid + t_inbounds = row.inbounds + template_dict[tid]["id"] = tid + template_dict[tid]["inbounds"].append(t_inbounds) + + users_dict = defaultdict(lambda: {"proxy_type": set(), "excluded_inbounds": []}) + + for row in result: + user_id = row.user_id + tag = row.excluded_inbound_tag or "No Excluded Inbounds" + proxy_type = row.proxy_type + users_dict[user_id]["proxy_type"].add(proxy_type) + users_dict[user_id]["excluded_inbounds"].append(tag) + if len(users_dict[user_id]["excluded_inbounds"]) > 1 and "No Excluded Inbounds" in users_dict[user_id]["excluded_inbounds"]: + users_dict[user_id]["excluded_inbounds"].remove("No Excluded Inbounds") + + groups = defaultdict(list) + + for key, value in users_dict.items(): + excluded_inbounds = tuple(sorted(value["excluded_inbounds"])) + groups[excluded_inbounds].append({"id": key, **value}) + + try: + with open(XRAY_JSON, 'r') as file: + config = commentjson.loads(file.read()) + except Exception: + config = base_xray + + inbounds = [{"tag": inbound['tag'], "protocol": inbound["protocol"]} + for inbound in config['inbounds'] if 'tag' in inbound] + + users_dict = defaultdict(lambda: {"proxy_type": set(), "excluded_inbounds": [], "inbounds": []}) + for k, users in groups.items(): + for user in users: + users_dict[user["id"]].update(**user) + inbounds_ = [] + for t in user["proxy_type"]: + for i in inbounds: + if t == i["protocol"] and i["tag"] not in user["excluded_inbounds"]: + inbounds_.append(i["tag"]) + users_dict[user["id"]]["inbounds"] = inbounds_ + + grouped = defaultdict(list) + + for key, value in users_dict.items(): + group_key = json.dumps({ + "inbounds": value["inbounds"], + }, sort_keys=True) + + grouped[group_key].append({"id": value["id"]}) + + result = {} + counter = 1 + result["templates"] = {} + for group_key, users in grouped.items(): + group_name = f"group{counter}" + group_data = json.loads(group_key) + dbinbounds = session.query(ProxyInbound).filter(ProxyInbound.tag.in_(group_data["inbounds"])).all() + session.execute( + group_table.insert().values( + name=group_name, + )) + group_id = session.execute(sa.select(group_table).where(group_table.c.name == group_name)).scalar() + + # Fix: Check if dbinbounds is not empty before inserting + if dbinbounds: + inbound_data = [ + {"inbound_id": i.id, "group_id": group_id} for i in dbinbounds if i.id is not None + ] + + # Add additional check to ensure we're not inserting empty values + if inbound_data: + session.execute( + inbounds_groups_association.insert(), + inbound_data + ) + + users_data = [{"user_id": user["id"], "groups_id": group_id} for user in users] + session.execute( + users_groups_association.insert(), + users_data, + ) + counter += 1 + if template_count <= 0: + continue + session.commit() + for k, val in template_dict.items(): + if Counter(val["inbounds"]) == Counter(group_data["inbounds"]): + # Check if association already exists + exists = session.execute( + sa.select(template_group_association).where( + (template_group_association.c.user_template_id == int(k)) & + (template_group_association.c.group_id == group_id) + ) + ).scalar() + + if not exists: + # Insert new association + session.execute( + template_group_association.insert().values( + user_template_id=int(k), + group_id=group_id + ) + ) + + if template_count > 0: + dbtemplates_assin = session.execute(template_inbounds_association.select()).all() + grouped_data = defaultdict(list) + for number, text in dbtemplates_assin: + grouped_data[number].append(text) + + for k,inbounds in grouped_data.items(): + group_name = f"group{counter}" + user_template = session.execute(user_template_table.select().where(user_template_table.c.id == int(k))).first() + + template_groups = session.execute(template_group_association.select().where(template_group_association.c.user_template_id == k)).first() + if not template_groups: + session.execute(group_table.insert().values( + name=group_name + )) + group_id = session.execute(sa.select(group_table).where(group_table.c.name == group_name)).scalar() + + dbinbounds = session.query(ProxyInbound).filter(ProxyInbound.tag.in_(inbounds)).all() + + # Fix: Similar check here to ensure we have valid data before insert + if dbinbounds: + inbound_data = [ + {"inbound_id": i.id, "group_id": group_id} for i in dbinbounds if i.id is not None + ] + + # Add additional check to ensure we're not inserting empty values + if inbound_data: + session.execute( + inbounds_groups_association.insert(), + inbound_data + ) + + session.execute( + template_group_association.insert().values( + user_template_id=int(k), + group_id=group_id, + ) + ) + counter += 1 + + finally: + session.commit() + session.close() + +def downgrade() -> None: + pass \ No newline at end of file diff --git a/app/db/migrations/versions/1ad79b97fdcf_.py b/app/db/migrations/versions/1ad79b97fdcf_.py new file mode 100644 index 000000000..ec44ec8ac --- /dev/null +++ b/app/db/migrations/versions/1ad79b97fdcf_.py @@ -0,0 +1,24 @@ +"""empty message + +Revision ID: 1ad79b97fdcf +Revises: 852d951c9c08, adda2dd4a741 +Create Date: 2024-02-28 15:11:19.999585 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '1ad79b97fdcf' +down_revision = ('852d951c9c08', 'adda2dd4a741') +branch_labels = None +depends_on = None + + +def upgrade() -> None: + pass + + +def downgrade() -> None: + pass diff --git a/app/db/migrations/versions/1ccf7b18b283_add_extra_sttings_to_usertemplates_table.py b/app/db/migrations/versions/1ccf7b18b283_add_extra_sttings_to_usertemplates_table.py new file mode 100644 index 000000000..aa5379479 --- /dev/null +++ b/app/db/migrations/versions/1ccf7b18b283_add_extra_sttings_to_usertemplates_table.py @@ -0,0 +1,28 @@ +"""add extra_sttings to usertemplates table + +Revision ID: 1ccf7b18b283 +Revises: 35760ebfabd2 +Create Date: 2025-04-07 11:57:39.917127 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '1ccf7b18b283' +down_revision = '35760ebfabd2' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('user_templates', sa.Column('extra_settings', sa.JSON(none_as_null=True), nullable=True)) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('user_templates', 'extra_settings') + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/1cf7d159fdbb_add_online_at.py b/app/db/migrations/versions/1cf7d159fdbb_add_online_at.py new file mode 100644 index 000000000..b29aff0ca --- /dev/null +++ b/app/db/migrations/versions/1cf7d159fdbb_add_online_at.py @@ -0,0 +1,28 @@ +"""add online at + +Revision ID: 1cf7d159fdbb +Revises: 025d427831dd +Create Date: 2023-08-23 15:48:26.281666 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '1cf7d159fdbb' +down_revision = '025d427831dd' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('users', sa.Column('online_at', sa.DateTime(), nullable=True)) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('users', 'online_at') + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/1dc5f89b706a_drop_proxies_table.py b/app/db/migrations/versions/1dc5f89b706a_drop_proxies_table.py new file mode 100644 index 000000000..3ce576d28 --- /dev/null +++ b/app/db/migrations/versions/1dc5f89b706a_drop_proxies_table.py @@ -0,0 +1,35 @@ +"""drop proxies table + +Revision ID: 1dc5f89b706a +Revises: db68f8d3d40b +Create Date: 2025-03-17 13:08:21.002382 + +""" +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import sqlite + +# revision identifiers, used by Alembic. +revision = '1dc5f89b706a' +down_revision = 'db68f8d3d40b' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('proxies') + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('proxies', + sa.Column('id', sa.INTEGER(), nullable=False), + sa.Column('user_id', sa.INTEGER(), nullable=True), + sa.Column('type', sa.VARCHAR(length=11), nullable=False), + sa.Column('settings', sqlite.JSON(), nullable=False), + sa.ForeignKeyConstraint(['user_id'], ['users.id'], ), + sa.PrimaryKeyConstraint('id') + ) + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/1f6e978be88e_migrate_to_sqlalchemy_v2.py b/app/db/migrations/versions/1f6e978be88e_migrate_to_sqlalchemy_v2.py new file mode 100644 index 000000000..71f428190 --- /dev/null +++ b/app/db/migrations/versions/1f6e978be88e_migrate_to_sqlalchemy_v2.py @@ -0,0 +1,244 @@ +"""migrate to sqlalchemy v2 + +Revision ID: 1f6e978be88e +Revises: 0d22271ee06e +Create Date: 2025-03-22 22:08:45.392485 + +""" + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import mysql, postgresql +from app.db.models import CaseSensitiveString + + +# revision identifiers, used by Alembic. +revision = "1f6e978be88e" +down_revision = "0d22271ee06e" +branch_labels = None +depends_on = None + + +def upgrade() -> None: + connection = op.get_bind() + dialect = connection.dialect.name + # Alter admin_usage_logs table + with op.batch_alter_table("admin_usage_logs") as batch_op: + batch_op.alter_column("admin_id", existing_type=sa.INTEGER(), nullable=False) + batch_op.alter_column("reset_at", existing_type=sa.DATETIME(), nullable=False) + + # Alter admins table + with op.batch_alter_table("admins") as batch_op: + batch_op.alter_column("username", existing_type=sa.VARCHAR(length=34), nullable=False) + batch_op.alter_column("hashed_password", existing_type=sa.VARCHAR(length=128), nullable=False) + batch_op.alter_column("created_at", existing_type=sa.DATETIME(), nullable=False) + batch_op.alter_column( + "is_sudo", existing_type=sa.BOOLEAN(), nullable=False, existing_server_default=sa.text("0") + ) + + # Alter groups table + with op.batch_alter_table("groups") as batch_op: + batch_op.alter_column("name", existing_type=sa.VARCHAR(length=64), nullable=False) + + # Alter node_usages table + with op.batch_alter_table("node_usages") as batch_op: + batch_op.alter_column("uplink", existing_type=sa.BIGINT(), nullable=False) + batch_op.alter_column("downlink", existing_type=sa.BIGINT(), nullable=False) + + # Alter node_user_usages table + with op.batch_alter_table("node_user_usages") as batch_op: + batch_op.alter_column("user_id", existing_type=sa.INTEGER(), nullable=False) + batch_op.alter_column("used_traffic", existing_type=sa.BIGINT(), nullable=False) + + # Alter nodes table + with op.batch_alter_table("nodes") as batch_op: + batch_op.alter_column("name", existing_type=sa.VARCHAR(length=256), nullable=False) + batch_op.alter_column("created_at", existing_type=sa.DATETIME(), nullable=False) + batch_op.alter_column("uplink", existing_type=sa.BIGINT(), nullable=False) + batch_op.alter_column("downlink", existing_type=sa.BIGINT(), nullable=False) + + # Alter notification_reminders table + with op.batch_alter_table("notification_reminders") as batch_op: + batch_op.alter_column("user_id", existing_type=sa.INTEGER(), nullable=False) + batch_op.alter_column("created_at", existing_type=sa.DATETIME(), nullable=False) + + # Alter system table + with op.batch_alter_table("system") as batch_op: + batch_op.alter_column("uplink", existing_type=sa.BIGINT(), nullable=False) + batch_op.alter_column("downlink", existing_type=sa.BIGINT(), nullable=False) + + # Alter user_templates table + with op.batch_alter_table("user_templates") as batch_op: + batch_op.alter_column("data_limit", existing_type=sa.BIGINT(), nullable=False) + batch_op.alter_column("expire_duration", existing_type=sa.BIGINT(), nullable=False) + + # Alter user_usage_logs table + with op.batch_alter_table("user_usage_logs") as batch_op: + batch_op.alter_column("reset_at", existing_type=sa.DATETIME(), nullable=False) + + # Alter users table + with op.batch_alter_table("users") as batch_op: + batch_op.alter_column("username", existing_type=sa.VARCHAR(length=34), type_=CaseSensitiveString(length=34), nullable=False) + batch_op.alter_column("used_traffic", existing_type=sa.BIGINT(), nullable=False) + if dialect == "sqlite": + batch_op.alter_column( + "created_at", + existing_type=sa.DATETIME(), + nullable=False, + existing_server_default=sa.text("(CURRENT_TIMESTAMP)"), + ) + elif dialect == "mysql": + batch_op.alter_column( + "created_at", existing_type=mysql.DATETIME(), nullable=False, existing_server_default=sa.text("(now())") + ) + elif dialect == "postgresql": + batch_op.alter_column( + "created_at", + existing_type=postgresql.TIMESTAMP(), + nullable=False, + existing_server_default=sa.text("CURRENT_TIMESTAMP"), + ) + + if dialect == "mysql": + op.alter_column( + "hosts", + "alpn", + existing_type=mysql.ENUM("h3", "h3,h2", "h3,h2,http/1.1", "none", "h2", "http/1.1", "h2,http/1.1"), + type_=sa.Enum( + "none", "h3", "h2", "http/1.1", "h3,h2,http/1.1", "h3,h2", "h2,http/1.1", name="proxyhostalpn" + ), + existing_nullable=False, + ) + op.alter_column( + "users", + "status", + existing_type=mysql.ENUM("on_hold", "active", "limited", "expired", "disabled"), + type_=sa.Enum("active", "disabled", "limited", "expired", "on_hold", name="userstatus"), + existing_nullable=False, + ) + + if dialect == "postgresql": + op.alter_column( + "users", + "proxy_settings", + existing_type=postgresql.JSONB(astext_type=sa.Text()), + type_=sa.JSON(none_as_null=True), + existing_nullable=False, + existing_server_default=sa.text("'{}'::jsonb"), + ) + + # ### end Alembic commands ### + + +def downgrade() -> None: + connection = op.get_bind() + dialect = connection.dialect.name + + if dialect == "postgresql": + op.alter_column( + "users", + "proxy_settings", + existing_type=sa.JSON(none_as_null=True), + type_=postgresql.JSONB(astext_type=sa.Text()), + existing_nullable=False, + existing_server_default=sa.text("'{}'::jsonb"), + postgresql_using="proxy_settings::jsonb", + ) + + if dialect == "mysql": + op.alter_column( + "users", + "status", + existing_type=sa.Enum("active", "disabled", "limited", "expired", "on_hold", name="userstatus"), + type_=mysql.ENUM("on_hold", "active", "limited", "expired", "disabled"), + existing_nullable=False, + ) + op.alter_column( + "hosts", + "alpn", + existing_type=sa.Enum( + "none", "h3", "h2", "http/1.1", "h3,h2,http/1.1", "h3,h2", "h2,http/1.1", name="proxyhostalpn" + ), + type_=mysql.ENUM("h3", "h3,h2", "h3,h2,http/1.1", "none", "h2", "http/1.1", "h2,http/1.1"), + existing_nullable=False, + ) + + # Alter users table + with op.batch_alter_table("users") as batch_op: + if dialect == "sqlite": + batch_op.alter_column( + "created_at", + existing_type=sa.DATETIME(), + nullable=True, + existing_server_default=sa.text("(CURRENT_TIMESTAMP)"), + ) + + elif dialect == "mysql": + batch_op.alter_column( + "created_at", existing_type=mysql.DATETIME(), nullable=True, existing_server_default=sa.text("(now())") + ) + + elif dialect == "postgresql": + batch_op.alter_column( + "created_at", + existing_type=postgresql.TIMESTAMP(), + nullable=True, + existing_server_default=sa.text("CURRENT_TIMESTAMP"), + ) + + batch_op.alter_column("used_traffic", existing_type=sa.BIGINT(), nullable=True) + batch_op.alter_column("username", existing_type=sa.VARCHAR(length=34), type_=CaseSensitiveString(length=34), nullable=True) + + # Alter user_usage_logs table + with op.batch_alter_table("user_usage_logs") as batch_op: + batch_op.alter_column("reset_at", existing_type=sa.DATETIME(), nullable=True) + + # Alter user_templates table + with op.batch_alter_table("user_templates") as batch_op: + batch_op.alter_column("expire_duration", existing_type=sa.BIGINT(), nullable=True) + batch_op.alter_column("data_limit", existing_type=sa.BIGINT(), nullable=True) + + # Alter system table + with op.batch_alter_table("system") as batch_op: + batch_op.alter_column("downlink", existing_type=sa.BIGINT(), nullable=True) + batch_op.alter_column("uplink", existing_type=sa.BIGINT(), nullable=True) + + # Alter notification_reminders table + with op.batch_alter_table("notification_reminders") as batch_op: + batch_op.alter_column("created_at", existing_type=sa.DATETIME(), nullable=True) + batch_op.alter_column("user_id", existing_type=sa.INTEGER(), nullable=True) + + # Alter nodes table + with op.batch_alter_table("nodes") as batch_op: + batch_op.alter_column("downlink", existing_type=sa.BIGINT(), nullable=True) + batch_op.alter_column("uplink", existing_type=sa.BIGINT(), nullable=True) + batch_op.alter_column("created_at", existing_type=sa.DATETIME(), nullable=True) + batch_op.alter_column("name", existing_type=sa.VARCHAR(length=256), nullable=True) + + # Alter node_user_usages table + with op.batch_alter_table("node_user_usages") as batch_op: + batch_op.alter_column("used_traffic", existing_type=sa.BIGINT(), nullable=True) + batch_op.alter_column("user_id", existing_type=sa.INTEGER(), nullable=True) + + # Alter node_usages table + with op.batch_alter_table("node_usages") as batch_op: + batch_op.alter_column("downlink", existing_type=sa.BIGINT(), nullable=True) + batch_op.alter_column("uplink", existing_type=sa.BIGINT(), nullable=True) + + # Alter groups table + with op.batch_alter_table("groups") as batch_op: + batch_op.alter_column("name", existing_type=sa.VARCHAR(length=64), nullable=True) + + # Alter admins table + with op.batch_alter_table("admins") as batch_op: + batch_op.alter_column( + "is_sudo", existing_type=sa.BOOLEAN(), nullable=True, existing_server_default=sa.text("0") + ) + batch_op.alter_column("created_at", existing_type=sa.DATETIME(), nullable=True) + batch_op.alter_column("hashed_password", existing_type=sa.VARCHAR(length=128), nullable=True) + batch_op.alter_column("username", existing_type=sa.VARCHAR(length=34), nullable=True) + + # Alter admin_usage_logs table + with op.batch_alter_table("admin_usage_logs") as batch_op: + batch_op.alter_column("reset_at", existing_type=sa.DATETIME(), nullable=True) + batch_op.alter_column("admin_id", existing_type=sa.INTEGER(), nullable=True) diff --git a/app/db/migrations/versions/21226bc711ac_add_threshold_to_notificationreminder.py b/app/db/migrations/versions/21226bc711ac_add_threshold_to_notificationreminder.py new file mode 100644 index 000000000..e7fa93775 --- /dev/null +++ b/app/db/migrations/versions/21226bc711ac_add_threshold_to_notificationreminder.py @@ -0,0 +1,28 @@ +"""add threshold to NotificationReminder + +Revision ID: 21226bc711ac +Revises: 2ea33513efc0 +Create Date: 2024-10-18 12:26:30.504491 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '21226bc711ac' +down_revision = '2ea33513efc0' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('notification_reminders', sa.Column('threshold', sa.Integer(), nullable=True)) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('notification_reminders', 'threshold') + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/2313cdc30da3_.py b/app/db/migrations/versions/2313cdc30da3_.py new file mode 100644 index 000000000..a55726ec0 --- /dev/null +++ b/app/db/migrations/versions/2313cdc30da3_.py @@ -0,0 +1,24 @@ +"""empty message + +Revision ID: 2313cdc30da3 +Revises: 305943d779c4, 07f9bbb3db4e +Create Date: 2024-07-12 16:18:15.012072 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '2313cdc30da3' +down_revision = ('305943d779c4', '07f9bbb3db4e') +branch_labels = None +depends_on = None + + +def upgrade() -> None: + pass + + +def downgrade() -> None: + pass diff --git a/app/db/migrations/versions/2b231de97dc3_add_use_sni_as_host_to_hosts.py b/app/db/migrations/versions/2b231de97dc3_add_use_sni_as_host_to_hosts.py new file mode 100644 index 000000000..b724c999e --- /dev/null +++ b/app/db/migrations/versions/2b231de97dc3_add_use_sni_as_host_to_hosts.py @@ -0,0 +1,27 @@ +"""add use sni as host to hosts + +Revision ID: 2b231de97dc3 +Revises: e7b869e999b4 +Create Date: 2024-12-15 09:48:24.330959 + +""" +import sqlalchemy as sa +from alembic import op + +# revision identifiers, used by Alembic. +revision = '2b231de97dc3' +down_revision = 'e7b869e999b4' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('hosts', sa.Column('use_sni_as_host', sa.Boolean(), server_default='0', nullable=False)) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('hosts', 'use_sni_as_host') + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/2ea33513efc0_noise_for_sqlite.py b/app/db/migrations/versions/2ea33513efc0_noise_for_sqlite.py new file mode 100644 index 000000000..dd847127e --- /dev/null +++ b/app/db/migrations/versions/2ea33513efc0_noise_for_sqlite.py @@ -0,0 +1,32 @@ +"""noise for sqlite + +Revision ID: 2ea33513efc0 +Revises: a9cfd5611a82 +Create Date: 2024-10-11 15:36:32.096594 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '2ea33513efc0' +down_revision = 'a9cfd5611a82' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + bind = op.get_bind() + + if bind.engine.name == 'sqlite': + with op.batch_alter_table('hosts') as batch_op: + batch_op.alter_column('noise_setting', + existing_type=sa.String(length=2000), + nullable=True) + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + pass + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/305943d779c4_add_h3_to_alpn_enum.py b/app/db/migrations/versions/305943d779c4_add_h3_to_alpn_enum.py new file mode 100644 index 000000000..a2d739be3 --- /dev/null +++ b/app/db/migrations/versions/305943d779c4_add_h3_to_alpn_enum.py @@ -0,0 +1,119 @@ +"""add h3 to alpn enum + +Revision ID: 305943d779c4 +Revises: 31f92220c0d0 +Create Date: 2024-07-03 19:27:15.282711 + +""" +import sqlalchemy as sa +from alembic import op +from sqlalchemy.dialects import postgresql + + +# revision identifiers, used by Alembic. +revision = '305943d779c4' +down_revision = '31f92220c0d0' +branch_labels = None +depends_on = None + + +# Enum configuration +enum_name = "alpn" +temp_enum_name = f"temp_{enum_name}" +old_values = ("none", "h2", "http/1.1", "h2,http/1.1") +new_values = ("h3", "h3,h2", "h3,h2,http/1.1", *old_values) + +# Downgrade configuration +downgrade_from = ("h3", "h3,h2", "h3,h2,http/1.1", "") +downgrade_to = "none" + +old_type = sa.Enum(*old_values, name=enum_name) +new_type = sa.Enum(*new_values, name=enum_name) + +table_name = "hosts" +column_name = "alpn" + +def upgrade() -> None: + # 1. Create new enum type + new_type.create(op.get_bind(), checkfirst=True) + + # 2. Handle PostgreSQL-specific migration + if op.get_bind().dialect.name == 'postgresql': + connection = op.get_bind() + + # Temporary migration column + with op.batch_alter_table(table_name) as batch_op: + batch_op.add_column(sa.Column('alpn_new', sa.Text(), nullable=True)) + + # Copy existing values, using a CASE to handle potential unmapped values + connection.execute(sa.text(f""" + UPDATE {table_name} + SET alpn_new = CASE + WHEN alpn IS NULL THEN 'none' + ELSE alpn::text + END + """)) + + # Drop old column and rename new column + with op.batch_alter_table(table_name) as batch_op: + batch_op.drop_column('alpn') + batch_op.alter_column('alpn_new', + new_column_name='alpn', + type_=new_type, + nullable=False, + server_default=sa.text("'none'"), + postgresql_using='alpn_new::alpn' + ) + else: + # For other databases, use standard column type modification + with op.batch_alter_table(table_name) as batch_op: + batch_op.alter_column( + column_name, + existing_type=old_type, + type_=new_type, + existing_nullable=False + ) + +def downgrade() -> None: + # 1. Create old enum type + old_type.create(op.get_bind(), checkfirst=True) + + # 2. Handle PostgreSQL-specific downgrade + if op.get_bind().dialect.name == 'postgresql': + connection = op.get_bind() + + # Temporary migration column + with op.batch_alter_table(table_name) as batch_op: + batch_op.add_column(sa.Column('alpn_old', sa.Text(), nullable=True)) + + # Copy existing values with specific downgrade logic + connection.execute(sa.text(f""" + UPDATE {table_name} + SET alpn_old = CASE + WHEN alpn::text IN {downgrade_from} THEN '{downgrade_to}' + ELSE alpn::text + END + """)) + + # Drop current column and rename old column + with op.batch_alter_table(table_name) as batch_op: + batch_op.drop_column('alpn') + batch_op.alter_column('alpn_old', + new_column_name='alpn', + type_=old_type, + nullable=False, + server_default=sa.text("'none'"), + postgresql_using='alpn_old::alpn' + ) + else: + # For other databases, use standard column type modification + with op.batch_alter_table(table_name) as batch_op: + batch_op.alter_column( + column_name, + existing_type=new_type, + type_=old_type, + existing_nullable=False + ) + + # Drop the new enum type + new_type.drop(op.get_bind(), checkfirst=True) \ No newline at end of file diff --git a/app/db/migrations/versions/31f92220c0d0_add_support_random_user_agent.py b/app/db/migrations/versions/31f92220c0d0_add_support_random_user_agent.py new file mode 100644 index 000000000..65c9b3412 --- /dev/null +++ b/app/db/migrations/versions/31f92220c0d0_add_support_random_user_agent.py @@ -0,0 +1,28 @@ +"""Add Support Random User-Agent + +Revision ID: 31f92220c0d0 +Revises: 4f045f53bef8 +Create Date: 2024-06-01 21:28:33.310627 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '31f92220c0d0' +down_revision = '4f045f53bef8' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('hosts', sa.Column('random_user_agent', sa.Boolean(), server_default='0', nullable=False)) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('hosts', 'random_user_agent') + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/343ad7904b19_remove_tls_table.py b/app/db/migrations/versions/343ad7904b19_remove_tls_table.py new file mode 100644 index 000000000..78853fb67 --- /dev/null +++ b/app/db/migrations/versions/343ad7904b19_remove_tls_table.py @@ -0,0 +1,38 @@ +"""Remove tls table + +Revision ID: 343ad7904b19 +Revises: d607d3ca5246 +Create Date: 2025-07-12 23:25:45.994090 + +""" +from alembic import op +import sqlalchemy as sa +from app.utils.crypto import generate_certificate + + +# revision identifiers, used by Alembic. +revision = '343ad7904b19' +down_revision = 'd607d3ca5246' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('tls') + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + table = op.create_table('tls', + sa.Column('id', sa.INTEGER(), autoincrement=True, nullable=False), + sa.Column('key', sa.VARCHAR(length=4096), autoincrement=False, nullable=False), + sa.Column('certificate', sa.VARCHAR(length=2048), autoincrement=False, nullable=False), + sa.PrimaryKeyConstraint('id', name='tls_pkey') + ) + + tls = generate_certificate() + op.bulk_insert(table, [{"id": 1, "key": tls['key'], "certificate": tls['cert']}]) + + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/35760ebfabd2_add_status_to_hosts.py b/app/db/migrations/versions/35760ebfabd2_add_status_to_hosts.py new file mode 100644 index 000000000..0ae1679df --- /dev/null +++ b/app/db/migrations/versions/35760ebfabd2_add_status_to_hosts.py @@ -0,0 +1,45 @@ +"""add status to hosts + +Revision ID: 35760ebfabd2 +Revises: f44ec4769d5d +Create Date: 2025-03-28 09:04:24.440491 + +""" +from alembic import op +import sqlalchemy as sa +from app.db.compiles_types import EnumArray + + +# revision identifiers, used by Alembic. +revision = '35760ebfabd2' +down_revision = 'f44ec4769d5d' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + dialect = op.get_bind().dialect.name + + # Define the column type once for reusability + status_column_type = EnumArray(sa.Enum('active', 'disabled', 'limited', 'expired', 'on_hold', name='userstatus')) + + if dialect == 'mysql': + # MySQL: Add nullable, update, then alter to non-nullable + op.add_column('hosts', sa.Column('status', status_column_type, nullable=True)) + op.execute("UPDATE hosts SET status = '[]'") # Set default for existing rows + op.alter_column('hosts', 'status', nullable=False, + existing_type=status_column_type) + elif dialect == 'postgresql': + # PostgreSQL: Use server_default='{}' as PostgreSQL uses array syntax + op.add_column('hosts', sa.Column('status', status_column_type, + server_default='{}', nullable=False)) + else: + # SQLite and others: Use server_default='[]' + op.add_column('hosts', sa.Column('status', status_column_type, + server_default='[]', nullable=False)) + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('hosts', 'status') + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/35f7f8fa9cf2_add_sub_revoked_at_to_users.py b/app/db/migrations/versions/35f7f8fa9cf2_add_sub_revoked_at_to_users.py new file mode 100644 index 000000000..87e8c0400 --- /dev/null +++ b/app/db/migrations/versions/35f7f8fa9cf2_add_sub_revoked_at_to_users.py @@ -0,0 +1,28 @@ +"""add sub_revoked_at to users + +Revision ID: 35f7f8fa9cf2 +Revises: fc01b1520e72 +Create Date: 2023-07-06 15:52:00.307575 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '35f7f8fa9cf2' +down_revision = 'fc01b1520e72' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('users', sa.Column('sub_revoked_at', sa.DateTime(), nullable=True)) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('users', 'sub_revoked_at') + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/37692c1c9715_nodes.py b/app/db/migrations/versions/37692c1c9715_nodes.py new file mode 100644 index 000000000..47a1cfd39 --- /dev/null +++ b/app/db/migrations/versions/37692c1c9715_nodes.py @@ -0,0 +1,47 @@ +"""nodes + +Revision ID: 37692c1c9715 +Revises: 97dd9311ab93 +Create Date: 2023-03-27 02:49:00.118903 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '37692c1c9715' +down_revision = '97dd9311ab93' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('nodes', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('name', sa.String(length=256, collation=( + 'NOCASE' if op.get_bind().engine.name == 'sqlite' else '' + )), nullable=True), + sa.Column('address', sa.String(length=256), nullable=False), + sa.Column('port', sa.Integer(), nullable=False), + sa.Column('api_port', sa.Integer(), nullable=False), + sa.Column('certificate', sa.String(length=2048), nullable=False), + sa.Column('status', sa.Enum('connected','connecting','error','disabled', name='nodestatus'), nullable=False), + sa.Column('last_status_change', sa.DateTime(), nullable=True), + sa.Column('message', sa.String(length=1024), nullable=True), + sa.Column('created_at', sa.DateTime(), nullable=True), + sa.Column('uplink', sa.BigInteger(), nullable=True), + sa.Column('downlink', sa.BigInteger(), nullable=True), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('name') + ) + op.create_index(op.f('ix_nodes_id'), 'nodes', ['id'], unique=False) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_index(op.f('ix_nodes_id'), table_name='nodes') + op.drop_table('nodes') + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/3b59f3680c90_add_groups_table_and_add_proxy_settings_column_to_users_table.py.py b/app/db/migrations/versions/3b59f3680c90_add_groups_table_and_add_proxy_settings_column_to_users_table.py.py new file mode 100644 index 000000000..7f546cf20 --- /dev/null +++ b/app/db/migrations/versions/3b59f3680c90_add_groups_table_and_add_proxy_settings_column_to_users_table.py.py @@ -0,0 +1,82 @@ +"""add groups table and add proxy_settings column to users table + +Revision ID: 3b59f3680c90 +Revises: c41c441de44c +Create Date: 2025-03-17 08:35:44.071861 + +""" +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import mysql, postgresql + + +# revision identifiers, used by Alembic. +revision = '3b59f3680c90' +down_revision = 'c41c441de44c' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('groups', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('name', sa.String(length=64), nullable=True), + sa.Column('is_disabled', sa.Boolean(), nullable=False, server_default='0', default=False), + sa.PrimaryKeyConstraint('id') + ) + op.create_table('inbounds_groups_association', + sa.Column('inbound_id', sa.Integer(), nullable=False), + sa.Column('group_id', sa.Integer(), nullable=False), + sa.ForeignKeyConstraint(['group_id'], ['groups.id'], ), + sa.ForeignKeyConstraint(['inbound_id'], ['inbounds.id'], ), + sa.PrimaryKeyConstraint('inbound_id', 'group_id') + ) + op.create_table('template_group_association', + sa.Column('user_template_id', sa.Integer(), nullable=True), + sa.Column('group_id', sa.Integer(), nullable=True), + sa.ForeignKeyConstraint(['group_id'], ['groups.id'], ), + sa.ForeignKeyConstraint(['user_template_id'], ['user_templates.id'], ) + ) + op.create_table('users_groups_association', + sa.Column('user_id', sa.Integer(), nullable=False), + sa.Column('groups_id', sa.Integer(), nullable=False), + sa.ForeignKeyConstraint(['groups_id'], ['groups.id'], ), + sa.ForeignKeyConstraint(['user_id'], ['users.id'], ), + sa.PrimaryKeyConstraint('user_id', 'groups_id') + ) + + # Handle proxy_settings column addition based on database type + dialect = op.get_bind().dialect.name + if dialect == 'mysql': + # For MySQL: Add column first, then update with default value + op.add_column('users', sa.Column('proxy_settings', mysql.JSON(), nullable=True)) + op.execute("UPDATE users SET proxy_settings = '{}'") + # Make it not nullable after setting default, specifying the existing type + with op.batch_alter_table('users') as batch_op: + batch_op.alter_column('proxy_settings', + existing_type=mysql.JSON(), + nullable=False) + elif dialect == 'postgresql': + # For PostgreSQL: Can use JSONB with default + op.add_column('users', sa.Column('proxy_settings', + postgresql.JSONB(), + server_default='{}', + nullable=False)) + else: + # For SQLite and others: Use standard JSON + op.add_column('users', sa.Column('proxy_settings', + sa.JSON(none_as_null=True), + server_default='{}', + nullable=False)) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('users_groups_association') + op.drop_table('template_group_association') + op.drop_table('inbounds_groups_association') + op.drop_table('groups') + op.drop_column('users', 'proxy_settings') + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/3c466ce2ab63_round_float_values.py b/app/db/migrations/versions/3c466ce2ab63_round_float_values.py new file mode 100644 index 000000000..ada1a7994 --- /dev/null +++ b/app/db/migrations/versions/3c466ce2ab63_round_float_values.py @@ -0,0 +1,61 @@ +"""round float values + +Revision ID: 3c466ce2ab63 +Revises: fbfc49f01004 +Create Date: 2025-06-09 10:45:51.691719 + +""" +from alembic import op +from sqlalchemy import MetaData, Table, func, update + + +# revision identifiers, used by Alembic. +revision = '3c466ce2ab63' +down_revision = 'fbfc49f01004' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # Get connection and metadata + connection = op.get_bind() + metadata = MetaData() + + # Reflect tables + admins = Table('admins', metadata, autoload_with=connection) + node_user_usages = Table('node_user_usages', metadata, autoload_with=connection) + user_usage_logs = Table('user_usage_logs', metadata, autoload_with=connection) + users = Table('users', metadata, autoload_with=connection) + + # Update admins table - truncate used_traffic column (remove decimal part) + connection.execute( + update(admins).values( + used_traffic=func.floor(admins.c.used_traffic) + ) + ) + + # Update node_user_usages table - truncate used_traffic column (remove decimal part) + connection.execute( + update(node_user_usages).values( + used_traffic=func.floor(node_user_usages.c.used_traffic) + ) + ) + + # Update user_usage_logs table - truncate used_traffic_at_reset column (remove decimal part) + connection.execute( + update(user_usage_logs).values( + used_traffic_at_reset=func.floor(user_usage_logs.c.used_traffic_at_reset) + ) + ) + + # Update users table - truncate used_traffic column (remove decimal part) + connection.execute( + update(users).values( + used_traffic=func.floor(users.c.used_traffic) + ) + ) + + +def downgrade() -> None: + # No downgrade needed as truncating decimals is irreversible + pass diff --git a/app/db/migrations/versions/3cf36a5fde73_init_system_table.py b/app/db/migrations/versions/3cf36a5fde73_init_system_table.py new file mode 100644 index 000000000..a02523291 --- /dev/null +++ b/app/db/migrations/versions/3cf36a5fde73_init_system_table.py @@ -0,0 +1,39 @@ +"""init system table + +Revision ID: 3cf36a5fde73 +Revises: 94a5cc12c0d6 +Create Date: 2022-11-22 04:48:55.227490 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '3cf36a5fde73' +down_revision = '94a5cc12c0d6' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + table = op.create_table('system', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('uplink', sa.BigInteger(), nullable=True), + sa.Column('downlink', sa.BigInteger(), nullable=True), + sa.PrimaryKeyConstraint('id') + ) + op.create_index(op.f('ix_system_id'), 'system', ['id'], unique=False) + + # INSERT DEFAULT ROW + op.bulk_insert(table, [{"id": 1, "uplink": 0, "downlink": 0}]) + + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_index(op.f('ix_system_id'), table_name='system') + op.drop_table('system') + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/470465472326_add_path_to_hosts.py b/app/db/migrations/versions/470465472326_add_path_to_hosts.py new file mode 100644 index 000000000..00093c35c --- /dev/null +++ b/app/db/migrations/versions/470465472326_add_path_to_hosts.py @@ -0,0 +1,26 @@ +"""add path to hosts + +Revision ID: 470465472326 +Revises: e56f1c781e46 +Create Date: 2023-12-15 05:46:43.493605 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '470465472326' +down_revision = 'e56f1c781e46' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + with op.batch_alter_table('hosts') as batch_op: + batch_op.add_column(sa.Column('path', sa.String(256), nullable=True)) + + +def downgrade() -> None: + with op.batch_alter_table('hosts') as batch_op: + batch_op.drop_column('path') diff --git a/app/db/migrations/versions/4e66033a2b9b_separate_nodes_config.py b/app/db/migrations/versions/4e66033a2b9b_separate_nodes_config.py new file mode 100644 index 000000000..b5de7c44b --- /dev/null +++ b/app/db/migrations/versions/4e66033a2b9b_separate_nodes_config.py @@ -0,0 +1,111 @@ +"""separate nodes config + +Revision ID: 4e66033a2b9b +Revises: 1ccf7b18b283 +Create Date: 2025-04-08 17:39:03.984285 + +""" + +from alembic import op +import sqlalchemy as sa +import commentjson +from datetime import datetime as dt, timezone as tz +from decouple import config as decouple_config + +from app.core.xray import XRayConfig + + +# revision identifiers, used by Alembic. +revision = "4e66033a2b9b" +down_revision = "1ccf7b18b283" +branch_labels = None +depends_on = None + + +base_xray = { + "log": {"loglevel": "warning"}, + "inbounds": [ + { + "tag": "Shadowsocks TCP", + "listen": "0.0.0.0", + "port": 1080, + "protocol": "shadowsocks", + "settings": {"clients": [], "network": "tcp,udp"}, + } + ], + "outbounds": [{"protocol": "freedom", "tag": "DIRECT"}, {"protocol": "blackhole", "tag": "BLOCK"}], + "routing": {"rules": [{"ip": ["geoip:private"], "outboundTag": "BLOCK", "type": "field"}]}, +} + +def get_config(key, default=None, cast=None): + if cast is not None: + return decouple_config(key, default=default, cast=cast) + else: + return decouple_config(key, default=default) + + +XRAY_JSON = get_config("XRAY_JSON", default="./xray_config.json") +XRAY_FALLBACKS_INBOUND_TAGS = get_config( + "XRAY_FALLBACKS_INBOUND_TAG", cast=lambda v: [tag.strip() for tag in v.split(",")] if v else [], default="" +) +XRAY_EXCLUDE_INBOUND_TAGS = get_config("XRAY_EXCLUDE_INBOUND_TAGS", default="").split() + + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_table( + "core_configs", + sa.Column("id", sa.Integer(), nullable=False), + sa.Column("created_at", sa.DateTime(timezone=True), nullable=False), + sa.Column("name", sa.String(length=256), nullable=False), + sa.Column("config", sa.JSON(), nullable=False), + sa.Column("exclude_inbound_tags", sa.String(length=2048), nullable=True), + sa.Column("fallbacks_inbound_tags", sa.String(length=2048), nullable=True), + sa.PrimaryKeyConstraint("id"), + ) + op.add_column("nodes", sa.Column("core_config_id", sa.Integer(), nullable=True)) + with op.batch_alter_table("nodes", schema=None) as batch_op: + batch_op.create_foreign_key( + "nodes_ibfk_1", + "core_configs", + ["core_config_id"], + ["id"], + ondelete="SET NULL" + ) + # ### end Alembic commands ### + try: + with open(XRAY_JSON, "r") as file: + config = commentjson.loads(file.read()) + + XRayConfig(config, XRAY_EXCLUDE_INBOUND_TAGS, XRAY_FALLBACKS_INBOUND_TAGS) + except Exception: + config = base_xray + + op.bulk_insert( + sa.table( + "core_configs", + sa.Column("created_at", sa.DateTime), + sa.Column("name", sa.String), + sa.Column("config", sa.JSON), + sa.Column("exclude_inbound_tags", sa.String), + sa.Column("fallbacks_inbound_tags", sa.String), + ), + [ + { + "created_at": dt.now(tz.utc).replace(tzinfo=None), + "name": "Default Core Config", + "config": config, + "exclude_inbound_tags": ",".join(XRAY_EXCLUDE_INBOUND_TAGS), + "fallbacks_inbound_tags": ",".join(XRAY_FALLBACKS_INBOUND_TAGS), + } + ], + ) + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint("nodes_ibfk_1", 'nodes', type_='foreignkey') + op.drop_column('nodes', 'core_config_id') + op.drop_table('core_configs') + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/4eb0a0eb835f_reformat_hosts.py b/app/db/migrations/versions/4eb0a0eb835f_reformat_hosts.py new file mode 100644 index 000000000..cb640d128 --- /dev/null +++ b/app/db/migrations/versions/4eb0a0eb835f_reformat_hosts.py @@ -0,0 +1,69 @@ +"""reformat hosts + +Revision ID: 4eb0a0eb835f +Revises: be0c5f840473 +Create Date: 2024-12-04 14:32:38.599601 + +""" +from alembic import op +from sqlalchemy.orm import Session +import commentjson +import json +from decouple import config as decouple_config + +from app.db.models import ProxyHost + + +# revision identifiers, used by Alembic. +revision = '4eb0a0eb835f' +down_revision = 'be0c5f840473' +branch_labels = None +depends_on = None + + +base_xray = { + "log": {"loglevel": "warning"}, + "routing": {"rules": [{"ip": ["geoip:private"], "outboundTag": "BLOCK", "type": "field"}]}, + "inbounds": [ + { + "tag": "Shadowsocks TCP", + "listen": "0.0.0.0", + "port": 1080, + "protocol": "shadowsocks", + "settings": {"clients": [], "network": "tcp,udp"}, + } + ], + "outbounds": [{"protocol": "freedom", "tag": "DIRECT"}, {"protocol": "blackhole", "tag": "BLOCK"}], +} + +def get_config(key, default=None, cast=None): + if cast is not None: + return decouple_config(key, default=default, cast=cast) + else: + return decouple_config(key, default=default) + + +XRAY_JSON = get_config("XRAY_JSON", default="./xray_config.json") + + +def upgrade() -> None: + try: + with open(XRAY_JSON, 'r') as file: + config = commentjson.loads(file.read()) + except Exception: + config = base_xray + + # find current inbound tags + inbounds = [inbound['tag'] for inbound in config['inbounds'] if 'tag' in inbound] + + connection = op.get_bind() + session = Session(bind=connection) + try: + # remove hosts with old inbound tag + session.query(ProxyHost).filter(ProxyHost.inbound_tag.notin_(inbounds)).delete(synchronize_session=False) + session.commit() + finally: + session.close() + +def downgrade() -> None: + pass diff --git a/app/db/migrations/versions/4f045f53bef8_drop_proxy_outbound_and_sockopt_from_.py b/app/db/migrations/versions/4f045f53bef8_drop_proxy_outbound_and_sockopt_from_.py new file mode 100644 index 000000000..7f9a2e347 --- /dev/null +++ b/app/db/migrations/versions/4f045f53bef8_drop_proxy_outbound_and_sockopt_from_.py @@ -0,0 +1,27 @@ +"""drop proxy_outbound and sockopt from hosts + +Revision ID: 4f045f53bef8 +Revises: 1ad79b97fdcf +Create Date: 2024-02-28 20:45:33.206410 + +""" +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import mysql + +# revision identifiers, used by Alembic. +revision = '4f045f53bef8' +down_revision = '1ad79b97fdcf' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + with op.batch_alter_table('hosts') as batch_op: + batch_op.drop_column('proxy_outbound') + batch_op.drop_column('sockopt') + + +def downgrade() -> None: + op.add_column('hosts', sa.Column('sockopt', sa.JSON(), nullable=True)) + op.add_column('hosts', sa.Column('proxy_outbound', sa.JSON(), nullable=True)) diff --git a/app/db/migrations/versions/508061427170_fix_timezones.py b/app/db/migrations/versions/508061427170_fix_timezones.py new file mode 100644 index 000000000..e123d6864 --- /dev/null +++ b/app/db/migrations/versions/508061427170_fix_timezones.py @@ -0,0 +1,178 @@ +"""fix timezones + +Revision ID: 508061427170 +Revises: 81554fa3c345 +Create Date: 2025-04-25 11:35:45.402834 + +""" +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +# revision identifiers, used by Alembic. +revision = '508061427170' +down_revision = '81554fa3c345' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + if op.get_bind().dialect.name != 'postgresql': + return + + # ### commands auto generated by Alembic - please adjust! ### + op.alter_column('admin_usage_logs', 'reset_at', + existing_type=postgresql.TIMESTAMP(), + type_=sa.DateTime(timezone=True), + existing_nullable=False) + op.alter_column('admins', 'created_at', + existing_type=postgresql.TIMESTAMP(), + type_=sa.DateTime(timezone=True), + existing_nullable=False) + op.alter_column('admins', 'password_reset_at', + existing_type=postgresql.TIMESTAMP(), + type_=sa.DateTime(timezone=True), + existing_nullable=True) + op.alter_column('node_usages', 'created_at', + existing_type=postgresql.TIMESTAMP(), + type_=sa.DateTime(timezone=True), + existing_nullable=False) + op.alter_column('node_user_usages', 'created_at', + existing_type=postgresql.TIMESTAMP(), + type_=sa.DateTime(timezone=True), + existing_nullable=False) + op.alter_column('nodes', 'last_status_change', + existing_type=postgresql.TIMESTAMP(), + type_=sa.DateTime(timezone=True), + existing_nullable=True) + op.alter_column('nodes', 'created_at', + existing_type=postgresql.TIMESTAMP(), + type_=sa.DateTime(timezone=True), + existing_nullable=False) + op.alter_column('notification_reminders', 'expires_at', + existing_type=postgresql.TIMESTAMP(), + type_=sa.DateTime(timezone=True), + existing_nullable=True) + op.alter_column('notification_reminders', 'created_at', + existing_type=postgresql.TIMESTAMP(), + type_=sa.DateTime(timezone=True), + existing_nullable=False) + op.alter_column('user_usage_logs', 'reset_at', + existing_type=postgresql.TIMESTAMP(), + type_=sa.DateTime(timezone=True), + existing_nullable=False) + op.alter_column('users', 'expire', + existing_type=postgresql.TIMESTAMP(), + type_=sa.DateTime(timezone=True), + existing_nullable=True) + op.alter_column('users', 'sub_revoked_at', + existing_type=postgresql.TIMESTAMP(), + type_=sa.DateTime(timezone=True), + existing_nullable=True) + op.alter_column('users', 'sub_updated_at', + existing_type=postgresql.TIMESTAMP(), + type_=sa.DateTime(timezone=True), + existing_nullable=True) + op.alter_column('users', 'created_at', + existing_type=postgresql.TIMESTAMP(), + type_=sa.DateTime(timezone=True), + existing_nullable=False, + existing_server_default=sa.text('CURRENT_TIMESTAMP')) + op.alter_column('users', 'online_at', + existing_type=postgresql.TIMESTAMP(), + type_=sa.DateTime(timezone=True), + existing_nullable=True) + op.alter_column('users', 'on_hold_timeout', + existing_type=postgresql.TIMESTAMP(), + type_=sa.DateTime(timezone=True), + existing_nullable=True) + op.alter_column('users', 'edit_at', + existing_type=postgresql.TIMESTAMP(), + type_=sa.DateTime(timezone=True), + existing_nullable=True) + op.alter_column('users', 'last_status_change', + existing_type=postgresql.TIMESTAMP(), + type_=sa.DateTime(timezone=True), + existing_nullable=True) + # ### end Alembic commands ### + + +def downgrade() -> None: + if op.get_bind().dialect.name != 'postgresql': + return + + # ### commands auto generated by Alembic - please adjust! ### + op.alter_column('users', 'last_status_change', + existing_type=sa.DateTime(timezone=True), + type_=postgresql.TIMESTAMP(), + existing_nullable=True) + op.alter_column('users', 'edit_at', + existing_type=sa.DateTime(timezone=True), + type_=postgresql.TIMESTAMP(), + existing_nullable=True) + op.alter_column('users', 'on_hold_timeout', + existing_type=sa.DateTime(timezone=True), + type_=postgresql.TIMESTAMP(), + existing_nullable=True) + op.alter_column('users', 'online_at', + existing_type=sa.DateTime(timezone=True), + type_=postgresql.TIMESTAMP(), + existing_nullable=True) + op.alter_column('users', 'created_at', + existing_type=sa.DateTime(timezone=True), + type_=postgresql.TIMESTAMP(), + existing_nullable=False, + existing_server_default=sa.text('CURRENT_TIMESTAMP')) + op.alter_column('users', 'sub_updated_at', + existing_type=sa.DateTime(timezone=True), + type_=postgresql.TIMESTAMP(), + existing_nullable=True) + op.alter_column('users', 'sub_revoked_at', + existing_type=sa.DateTime(timezone=True), + type_=postgresql.TIMESTAMP(), + existing_nullable=True) + op.alter_column('users', 'expire', + existing_type=sa.DateTime(timezone=True), + type_=postgresql.TIMESTAMP(), + existing_nullable=True) + op.alter_column('user_usage_logs', 'reset_at', + existing_type=sa.DateTime(timezone=True), + type_=postgresql.TIMESTAMP(), + existing_nullable=False) + op.alter_column('notification_reminders', 'created_at', + existing_type=sa.DateTime(timezone=True), + type_=postgresql.TIMESTAMP(), + existing_nullable=False) + op.alter_column('notification_reminders', 'expires_at', + existing_type=sa.DateTime(timezone=True), + type_=postgresql.TIMESTAMP(), + existing_nullable=True) + op.alter_column('nodes', 'created_at', + existing_type=sa.DateTime(timezone=True), + type_=postgresql.TIMESTAMP(), + existing_nullable=False) + op.alter_column('nodes', 'last_status_change', + existing_type=sa.DateTime(timezone=True), + type_=postgresql.TIMESTAMP(), + existing_nullable=True) + op.alter_column('node_user_usages', 'created_at', + existing_type=sa.DateTime(timezone=True), + type_=postgresql.TIMESTAMP(), + existing_nullable=False) + op.alter_column('node_usages', 'created_at', + existing_type=sa.DateTime(timezone=True), + type_=postgresql.TIMESTAMP(), + existing_nullable=False) + op.alter_column('admins', 'password_reset_at', + existing_type=sa.DateTime(timezone=True), + type_=postgresql.TIMESTAMP(), + existing_nullable=True) + op.alter_column('admins', 'created_at', + existing_type=sa.DateTime(timezone=True), + type_=postgresql.TIMESTAMP(), + existing_nullable=False) + op.alter_column('admin_usage_logs', 'reset_at', + existing_type=sa.DateTime(timezone=True), + type_=postgresql.TIMESTAMP(), + existing_nullable=False) + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/51e941ed9018_deactive_user_status.py b/app/db/migrations/versions/51e941ed9018_deactive_user_status.py new file mode 100644 index 000000000..1a5193d2b --- /dev/null +++ b/app/db/migrations/versions/51e941ed9018_deactive_user_status.py @@ -0,0 +1,119 @@ +"""deactive user status + +Revision ID: 51e941ed9018 +Revises: b15eba6e5867 +Create Date: 2023-03-07 19:15:24.287031 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '51e941ed9018' +down_revision = 'b15eba6e5867' +branch_labels = None +depends_on = None + + +# Describing of enum +enum_name = "status" +temp_enum_name = f"temp_{enum_name}" +old_values = ('active', 'limited', 'expired') +new_values = ("deactive", *old_values) +downgrade_to = ("deactive", "active") # on downgrade convert [0] to [1] +old_type = sa.Enum(*old_values, name=enum_name) +new_type = sa.Enum(*new_values, name=enum_name) +temp_type = sa.Enum(*new_values, name=temp_enum_name) + + +# Describing of table +table_name = "users" +column_name = "status" +temp_table = sa.sql.table( + table_name, + sa.Column( + column_name, + new_type, + nullable=False + ) +) + + +def upgrade(): + status_enum = sa.Enum('active', 'limited', 'expired', name='status') + status_enum.create(op.get_bind()) + + # temp type to use instead of old one + temp_type.create(op.get_bind(), checkfirst=False) + + # changing of column type from old enum to new one. + # SQLite will create temp table for this + with op.batch_alter_table(table_name) as batch_op: + batch_op.alter_column( + column_name, + existing_type=old_type, + type_=temp_type, + existing_nullable=False, + postgresql_using=f"{column_name}::text::{temp_enum_name}" + ) + + # remove old enum, create new enum + old_type.drop(op.get_bind(), checkfirst=False) + new_type.create(op.get_bind(), checkfirst=False) + + # changing of column type from temp enum to new one. + # SQLite will create temp table for this + with op.batch_alter_table(table_name) as batch_op: + batch_op.alter_column( + column_name, + existing_type=temp_type, + type_=new_type, + existing_nullable=False, + postgresql_using=f"{column_name}::text::{enum_name}" + ) + + # remove temp enum + temp_type.drop(op.get_bind(), checkfirst=False) + + +def downgrade(): + # old enum don't have new value anymore. + # before downgrading from new enum to old one, + # we should replace new value from new enum with + # somewhat of old values from old enum + op.execute( + temp_table + .update() + .where( + temp_table.c.status == downgrade_to[0] + ) + .values( + status=downgrade_to[1] + ) + ) + + temp_type.create(op.get_bind(), checkfirst=False) + + with op.batch_alter_table(table_name) as batch_op: + batch_op.alter_column( + column_name, + existing_type=new_type, + type_=temp_type, + existing_nullable=False, + postgresql_using=f"{column_name}::text::{temp_enum_name}" + ) + + new_type.drop(op.get_bind(), checkfirst=False) + old_type.create(op.get_bind(), checkfirst=False) + + with op.batch_alter_table(table_name) as batch_op: + batch_op.alter_column( + column_name, + existing_type=temp_type, + type_=old_type, + existing_nullable=False, + postgresql_using=f"{column_name}::text::{enum_name}" + ) + + temp_type.drop(op.get_bind(), checkfirst=False) diff --git a/app/db/migrations/versions/53586547c10e_node_api_key.py b/app/db/migrations/versions/53586547c10e_node_api_key.py new file mode 100644 index 000000000..f3def67ca --- /dev/null +++ b/app/db/migrations/versions/53586547c10e_node_api_key.py @@ -0,0 +1,27 @@ +"""node api key + +Revision ID: 53586547c10e +Revises: 58a5b64175a8 +Create Date: 2025-04-13 22:03:43.772863 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '53586547c10e' +down_revision = '58a5b64175a8' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('nodes', sa.Column('api_key', sa.String(length=36), nullable=True)) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('nodes', 'api_key') + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/54c4b8c525fc_last_status_change_for_expired_users.py b/app/db/migrations/versions/54c4b8c525fc_last_status_change_for_expired_users.py new file mode 100644 index 000000000..09e2d7d90 --- /dev/null +++ b/app/db/migrations/versions/54c4b8c525fc_last_status_change_for_expired_users.py @@ -0,0 +1,75 @@ +"""last_status_change_for_expired_users + +Revision ID: 54c4b8c525fc +Revises: 2313cdc30da3 +Create Date: 2024-07-25 11:15:51.776880 + +""" + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.sql import func, case, text +from sqlalchemy import text + +# revision identifiers, used by Alembic. +revision = '54c4b8c525fc' +down_revision = '2313cdc30da3' +branch_labels = None +depends_on = None + +# Define the 'users' table +users_table = sa.Table( + 'users', + sa.MetaData(), + sa.Column('id', sa.Integer, primary_key=True), + sa.Column('status', sa.String), + sa.Column('expire', sa.Integer), # Assuming 'expire' is a UNIX timestamp + sa.Column('last_status_change', sa.DateTime) +) + + +def upgrade() -> None: + # Get database connection and dialect + connection = op.get_bind() + dialect = connection.dialect.name + + # Create the update statement based on dialect + if dialect == 'postgresql': + update_stmt = text(""" + UPDATE users + SET last_status_change = to_timestamp(expire) + WHERE status = 'expired' AND expire IS NOT NULL + """) + elif dialect == 'mysql': + update_stmt = text(""" + UPDATE users + SET last_status_change = FROM_UNIXTIME(expire) + WHERE status = 'expired' AND expire IS NOT NULL + """) + else: # sqlite + update_stmt = text(""" + UPDATE users + SET last_status_change = datetime(expire, 'unixepoch') + WHERE status = 'expired' AND expire IS NOT NULL + """) + + connection.execute(update_stmt) + + +def downgrade() -> None: + connection = op.get_bind() + + # Set last_status_change to the current timestamp for 'expired' users + update_stmt = ( + sa.update(users_table) + .where( + sa.and_( + users_table.c.status == 'expired', + users_table.c.expire.isnot(None) + ) + ) + .values(last_status_change=func.now()) # CURRENT_TIMESTAMP equivalent + ) + + # Execute the update statement + connection.execute(update_stmt) diff --git a/app/db/migrations/versions/5575fe410515_add_telegram_id_to_admin.py b/app/db/migrations/versions/5575fe410515_add_telegram_id_to_admin.py new file mode 100644 index 000000000..a66a38c48 --- /dev/null +++ b/app/db/migrations/versions/5575fe410515_add_telegram_id_to_admin.py @@ -0,0 +1,30 @@ +"""add_telegram_id_to_admin + +Revision ID: 5575fe410515 +Revises: 470465472326 +Create Date: 2024-02-01 22:30:47.515512 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '5575fe410515' +down_revision = '470465472326' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('admins', sa.Column('telegram_id', sa.BigInteger(), nullable=True)) + op.add_column('admins', sa.Column('discord_webhook', sa.String(length=1024), nullable=True)) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('admins', 'discord_webhook') + op.drop_column('admins', 'telegram_id') + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/57fda18cd9e6_add_xray_version.py b/app/db/migrations/versions/57fda18cd9e6_add_xray_version.py new file mode 100644 index 000000000..bda26f9d0 --- /dev/null +++ b/app/db/migrations/versions/57fda18cd9e6_add_xray_version.py @@ -0,0 +1,28 @@ +"""add xray version + +Revision ID: 57fda18cd9e6 +Revises: e4a86bc8ec7b +Create Date: 2023-05-03 17:14:45.696488 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '57fda18cd9e6' +down_revision = 'e4a86bc8ec7b' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('nodes', sa.Column('xray_version', sa.String(length=32), nullable=True)) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('nodes', 'xray_version') + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/58a5b64175a8_node_stats_table.py b/app/db/migrations/versions/58a5b64175a8_node_stats_table.py new file mode 100644 index 000000000..d816dc028 --- /dev/null +++ b/app/db/migrations/versions/58a5b64175a8_node_stats_table.py @@ -0,0 +1,40 @@ +"""node stats table + +Revision ID: 58a5b64175a8 +Revises: 4e66033a2b9b +Create Date: 2025-04-10 13:36:20.215092 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '58a5b64175a8' +down_revision = '4e66033a2b9b' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('node_stats', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('created_at', sa.DateTime(timezone=True), nullable=False), + sa.Column('node_id', sa.Integer(), nullable=False), + sa.Column('mem_total', sa.BigInteger(), nullable=False), + sa.Column('mem_used', sa.BigInteger(), nullable=False), + sa.Column('cpu_cores', sa.Integer(), nullable=False), + sa.Column('cpu_usage', sa.Float(), nullable=False), + sa.Column('incoming_bandwidth_speed', sa.BigInteger(), nullable=False), + sa.Column('outgoing_bandwidth_speed', sa.BigInteger(), nullable=False), + sa.ForeignKeyConstraint(['node_id'], ['nodes.id'], ), + sa.PrimaryKeyConstraint('id') + ) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('node_stats') + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/5a4446e7b165_add_password_reset_at_to_admins.py b/app/db/migrations/versions/5a4446e7b165_add_password_reset_at_to_admins.py new file mode 100644 index 000000000..69ffacbb1 --- /dev/null +++ b/app/db/migrations/versions/5a4446e7b165_add_password_reset_at_to_admins.py @@ -0,0 +1,28 @@ +"""add password_reset_at to admins + +Revision ID: 5a4446e7b165 +Revises: 77c86a261126 +Create Date: 2023-10-27 15:54:42.099101 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '5a4446e7b165' +down_revision = '77c86a261126' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('admins', sa.Column('password_reset_at', sa.DateTime(), nullable=True)) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('admins', 'password_reset_at') + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/5b84d88804a1_fix.py b/app/db/migrations/versions/5b84d88804a1_fix.py new file mode 100644 index 000000000..8404ed25d --- /dev/null +++ b/app/db/migrations/versions/5b84d88804a1_fix.py @@ -0,0 +1,48 @@ +"""fix + +Revision ID: 5b84d88804a1 +Revises: 7cbe9d91ac11 +Create Date: 2023-03-08 15:41:25.827671 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '5b84d88804a1' +down_revision = '7cbe9d91ac11' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table('hosts') as batch_op: + batch_op.alter_column('sni', + existing_type=sa.VARCHAR(length=256), + nullable=True) + batch_op.alter_column('host', + existing_type=sa.VARCHAR(length=256), + nullable=True) + with op.batch_alter_table('users') as batch_op: + batch_op.alter_column('status', + existing_type=sa.VARCHAR(length=8), + nullable=False) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table('users') as batch_op: + batch_op.alter_column('status', + existing_type=sa.VARCHAR(length=8), + nullable=True) + with op.batch_alter_table('hosts') as batch_op: + batch_op.alter_column('host', + existing_type=sa.VARCHAR(length=256), + nullable=False) + batch_op.alter_column('sni', + existing_type=sa.VARCHAR(length=256), + nullable=False) + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/671621870b02_init_admin.py b/app/db/migrations/versions/671621870b02_init_admin.py new file mode 100644 index 000000000..9d5a16783 --- /dev/null +++ b/app/db/migrations/versions/671621870b02_init_admin.py @@ -0,0 +1,44 @@ +"""init admin + +Revision ID: 671621870b02 +Revises: 8e849e06f131 +Create Date: 2023-01-13 18:57:40.199730 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '671621870b02' +down_revision = '8e849e06f131' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('admins', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('username', sa.String(34), nullable=True), + sa.Column('hashed_password', sa.String(128), nullable=True), + sa.Column('created_at', sa.DateTime(), nullable=True), + sa.PrimaryKeyConstraint('id') + ) + op.create_index(op.f('ix_admins_id'), 'admins', ['id'], unique=False) + op.create_index(op.f('ix_admins_username'), 'admins', ['username'], unique=True) + with op.batch_alter_table('users') as batch_op: + batch_op.add_column(sa.Column('admin_id', sa.Integer(), nullable=True)) + batch_op.create_foreign_key('fk_users_admin_id_admins', 'admins', ['admin_id'], ['id']) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table('users') as batch_op: + batch_op.drop_column('admin_id') + batch_op.drop_constraint('fk_users_admin_id_admins', type_='foreignkey') + op.drop_index(op.f('ix_admins_username'), table_name='admins') + op.drop_index(op.f('ix_admins_id'), table_name='admins') + op.drop_table('admins') + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/68edca039166_next_plan_to_template_relation.py b/app/db/migrations/versions/68edca039166_next_plan_to_template_relation.py new file mode 100644 index 000000000..5718c8c65 --- /dev/null +++ b/app/db/migrations/versions/68edca039166_next_plan_to_template_relation.py @@ -0,0 +1,32 @@ +"""next plan to template relation + +Revision ID: 68edca039166 +Revises: 931ed40d6eec +Create Date: 2025-01-12 23:58:41.810295 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '68edca039166' +down_revision = '931ed40d6eec' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table('next_plans') as batch_op: + batch_op.add_column(sa.Column('user_template_id', sa.Integer(), nullable=True)) + batch_op.create_foreign_key('fk_next_plans_user_template_id_user_templates', 'user_templates', ['user_template_id'], ['id']) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table('next_plans') as batch_op: + batch_op.drop_constraint('fk_next_plans_user_template_id_user_templates', type_='foreignkey') + batch_op.drop_column('user_template_id') + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/6980e98bba01_add_data_limit_reset_strategy_and_on_.py b/app/db/migrations/versions/6980e98bba01_add_data_limit_reset_strategy_and_on_.py new file mode 100644 index 000000000..58fd35154 --- /dev/null +++ b/app/db/migrations/versions/6980e98bba01_add_data_limit_reset_strategy_and_on_.py @@ -0,0 +1,31 @@ +"""add data_limit_reset_strategy and on_hold_timeout to usertemplate table + +Revision ID: 6980e98bba01 +Revises: 9cfffef342cd +Create Date: 2025-04-14 21:38:13.835658 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '6980e98bba01' +down_revision = '9cfffef342cd' +branch_labels = None +depends_on = None + +new_enum = sa.Enum('no_reset', 'day', 'week', 'month', 'year', name='userdatalimitresetstrategy') + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('user_templates', sa.Column('on_hold_timeout', sa.Integer(), nullable=True)) + op.add_column('user_templates', sa.Column('data_limit_reset_strategy', new_enum, server_default='no_reset', nullable=False)) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('user_templates', 'data_limit_reset_strategy') + op.drop_column('user_templates', 'on_hold_timeout') + # ### end Alembic commands ### \ No newline at end of file diff --git a/app/db/migrations/versions/714f227201a7_fix_user_template.py b/app/db/migrations/versions/714f227201a7_fix_user_template.py new file mode 100644 index 000000000..fd6b18a81 --- /dev/null +++ b/app/db/migrations/versions/714f227201a7_fix_user_template.py @@ -0,0 +1,35 @@ +"""Fix User Template + +Revision ID: 714f227201a7 +Revises: 947ebbd8debe +Create Date: 2023-10-29 13:45:03.223039 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '714f227201a7' +down_revision = '947ebbd8debe' +branch_labels = None +depends_on = None + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table('user_templates') as batch_op: + batch_op.alter_column('data_limit',existing_type=sa.BigInteger, + nullable=True) + batch_op.alter_column('expire_duration',existing_type=sa.BigInteger, + nullable=True) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table('user_templates') as batch_op: + batch_op.alter_column('data_limit',existing_type=sa.Integer, + nullable=False) + batch_op.alter_column('expire_duration',existing_type=sa.Integer, + nullable=False) + # ### end Alembic commands ### \ No newline at end of file diff --git a/app/db/migrations/versions/77c86a261126_nodes_coefficient.py b/app/db/migrations/versions/77c86a261126_nodes_coefficient.py new file mode 100644 index 000000000..f507965c5 --- /dev/null +++ b/app/db/migrations/versions/77c86a261126_nodes_coefficient.py @@ -0,0 +1,28 @@ +"""Nodes coefficient + +Revision ID: 77c86a261126 +Revises: a0715c2615f0 +Create Date: 2023-09-16 17:31:42.925189 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '77c86a261126' +down_revision = 'a0715c2615f0' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('nodes', sa.Column('usage_coefficient', sa.Float(), server_default=sa.text('1.0'), nullable=False)) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('nodes', 'usage_coefficient') + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/7a0dbb8a2f65_init_tls_table.py b/app/db/migrations/versions/7a0dbb8a2f65_init_tls_table.py new file mode 100644 index 000000000..45fd377bb --- /dev/null +++ b/app/db/migrations/versions/7a0dbb8a2f65_init_tls_table.py @@ -0,0 +1,39 @@ +"""init tls table + +Revision ID: 7a0dbb8a2f65 +Revises: 77c86a261126 +Create Date: 2023-10-22 13:58:12.431246 + +""" +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import mysql +from app.utils.crypto import generate_certificate + +# revision identifiers, used by Alembic. +revision = '7a0dbb8a2f65' +down_revision = '77c86a261126' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + table = op.create_table('tls', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('key', sa.String(length=4096), nullable=False), + sa.Column('certificate', sa.String(length=2048), nullable=False), + sa.PrimaryKeyConstraint('id') + ) + + # INSERT DEFAULT ROW + tls = generate_certificate() + op.bulk_insert(table, [{"id": 1, "key": tls['key'], "certificate": tls['cert']}]) + + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('tls') + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/7a93bcd44713_.py b/app/db/migrations/versions/7a93bcd44713_.py new file mode 100644 index 000000000..3b78b7f08 --- /dev/null +++ b/app/db/migrations/versions/7a93bcd44713_.py @@ -0,0 +1,24 @@ +"""empty message + +Revision ID: 7a93bcd44713 +Revises: 2b231de97dc3, f2b9caa23e16 +Create Date: 2025-01-11 12:30:03.803844 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '7a93bcd44713' +down_revision = ('2b231de97dc3', 'f2b9caa23e16') +branch_labels = None +depends_on = None + + +def upgrade() -> None: + pass + + +def downgrade() -> None: + pass diff --git a/app/db/migrations/versions/7cbe9d91ac11_proxyhost_security_added.py b/app/db/migrations/versions/7cbe9d91ac11_proxyhost_security_added.py new file mode 100644 index 000000000..02b6e5000 --- /dev/null +++ b/app/db/migrations/versions/7cbe9d91ac11_proxyhost_security_added.py @@ -0,0 +1,40 @@ +"""ProxyHost: security added + +Revision ID: 7cbe9d91ac11 +Revises: b15eba6e5867 +Create Date: 2023-03-07 23:30:49.678157 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = "7cbe9d91ac11" +down_revision = "e3f0e888a563" +branch_labels = None +depends_on = None + + +def upgrade() -> None: + proxyhostsecurity_enum = sa.Enum('inbound_default', 'none', 'tls', name='proxyhostsecurity') + proxyhostsecurity_enum.create(op.get_bind()) + + # ### commands auto generated by Alembic - please adjust! ### + op.add_column( + "hosts", + sa.Column( + "security", + sa.Enum("inbound_default", "none", "tls", name="proxyhostsecurity"), + nullable=False, + server_default="inbound_default" + ), + ) + + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column("hosts", "security") + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/81554fa3c345_admin_discord_id.py b/app/db/migrations/versions/81554fa3c345_admin_discord_id.py new file mode 100644 index 000000000..b0d474e95 --- /dev/null +++ b/app/db/migrations/versions/81554fa3c345_admin_discord_id.py @@ -0,0 +1,28 @@ +"""admin discord id + +Revision ID: 81554fa3c345 +Revises: ac26f36783a2 +Create Date: 2025-04-18 17:42:53.157022 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '81554fa3c345' +down_revision = 'ac26f36783a2' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('admins', sa.Column('discord_id', sa.BigInteger(), nullable=True)) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('admins', 'discord_id') + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/852d951c9c08_drop_extra_index.py b/app/db/migrations/versions/852d951c9c08_drop_extra_index.py new file mode 100644 index 000000000..00d7df928 --- /dev/null +++ b/app/db/migrations/versions/852d951c9c08_drop_extra_index.py @@ -0,0 +1,46 @@ +"""drop_extra_index + +Revision ID: 852d951c9c08 +Revises: dd725e4d3628 +Create Date: 2024-02-15 23:51:53.510090 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '852d951c9c08' +down_revision = 'dd725e4d3628' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_index('ix_admins_id', table_name='admins') + op.drop_index('ix_node_usages_id', table_name='node_usages') + op.drop_index('ix_node_user_usages_id', table_name='node_user_usages') + op.drop_index('ix_nodes_id', table_name='nodes') + op.drop_index('ix_notification_reminders_id', table_name='notification_reminders') + op.drop_index('ix_proxies_id', table_name='proxies') + op.drop_index('ix_system_id', table_name='system') + op.drop_index('ix_user_templates_id', table_name='user_templates') + op.drop_index('ix_user_usage_logs_id', table_name='user_usage_logs') + op.drop_index('ix_users_id', table_name='users') + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_index('ix_users_id', 'users', ['id'], unique=False) + op.create_index('ix_user_usage_logs_id', 'user_usage_logs', ['id'], unique=False) + op.create_index('ix_user_templates_id', 'user_templates', ['id'], unique=False) + op.create_index('ix_system_id', 'system', ['id'], unique=False) + op.create_index('ix_proxies_id', 'proxies', ['id'], unique=False) + op.create_index('ix_notification_reminders_id', 'notification_reminders', ['id'], unique=False) + op.create_index('ix_nodes_id', 'nodes', ['id'], unique=False) + op.create_index('ix_node_user_usages_id', 'node_user_usages', ['id'], unique=False) + op.create_index('ix_node_usages_id', 'node_usages', ['id'], unique=False) + op.create_index('ix_admins_id', 'admins', ['id'], unique=False) + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/89bcb1419c66_fix_user_status_enum.py b/app/db/migrations/versions/89bcb1419c66_fix_user_status_enum.py new file mode 100644 index 000000000..5e63c8519 --- /dev/null +++ b/app/db/migrations/versions/89bcb1419c66_fix_user_status_enum.py @@ -0,0 +1,104 @@ +"""fix user status enum + +Revision ID: 89bcb1419c66 +Revises: 1f6e978be88e +Create Date: 2025-03-27 12:03:01.459307 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '89bcb1419c66' +down_revision = '1f6e978be88e' +branch_labels = None +depends_on = None + + +old_enum_name = "status" +new_enum_name = "userstatus" +temp_enum_name = f"temp_{old_enum_name}" +values = ("active", "disabled", "limited", "expired", "on_hold") + +old_type = sa.Enum(*values, name=old_enum_name) +new_type = sa.Enum(*values, name=new_enum_name) +temp_type = sa.Enum(*values, name=temp_enum_name) + + +# Describing of table +table_name = "users" +column_name = "status" +temp_table = sa.sql.table( + table_name, + sa.Column( + column_name, + new_type, + nullable=False + ) +) + + +def upgrade(): + # temp type to use instead of old one + try: + new_type.drop(op.get_bind(), checkfirst=False) + except Exception: + pass + + temp_type.create(op.get_bind(), checkfirst=False) + + # changing of column type from old enum to new one. + # SQLite will create temp table for this + with op.batch_alter_table(table_name) as batch_op: + batch_op.alter_column( + column_name, + existing_type=old_type, + type_=temp_type, + existing_nullable=False, + postgresql_using=f"{column_name}::text::{temp_enum_name}" + ) + + # remove old enum, create new enum + old_type.drop(op.get_bind(), checkfirst=False) + new_type.create(op.get_bind(), checkfirst=False) + + # changing of column type from temp enum to new one. + # SQLite will create temp table for this + with op.batch_alter_table(table_name) as batch_op: + batch_op.alter_column( + column_name, + existing_type=temp_type, + type_=new_type, + existing_nullable=False, + postgresql_using=f"{column_name}::text::{new_enum_name}" + ) + + # remove temp enum + temp_type.drop(op.get_bind(), checkfirst=False) + + +def downgrade(): + temp_type.create(op.get_bind(), checkfirst=False) + + with op.batch_alter_table(table_name) as batch_op: + batch_op.alter_column( + column_name, + existing_type=new_type, + type_=temp_type, + existing_nullable=False, + postgresql_using=f"{column_name}::text::{temp_enum_name}" + ) + + new_type.drop(op.get_bind(), checkfirst=False) + old_type.create(op.get_bind(), checkfirst=False) + + with op.batch_alter_table(table_name) as batch_op: + batch_op.alter_column( + column_name, + existing_type=temp_type, + type_=old_type, + existing_nullable=False, + postgresql_using=f"{column_name}::text::{old_enum_name}" + ) + + temp_type.drop(op.get_bind(), checkfirst=False) diff --git a/app/db/migrations/versions/8e849e06f131_proxy_table.py b/app/db/migrations/versions/8e849e06f131_proxy_table.py new file mode 100644 index 000000000..3f1cf405c --- /dev/null +++ b/app/db/migrations/versions/8e849e06f131_proxy_table.py @@ -0,0 +1,81 @@ +"""proxy table + +Revision ID: 8e849e06f131 +Revises: 9b60be6cd0a2 +Create Date: 2022-12-26 05:47:14.745622 + +""" + +import json +from alembic import op +import sqlalchemy as sa +from sqlalchemy.sql import select +from sqlalchemy.dialects import sqlite + +# revision identifiers, used by Alembic. +revision = '8e849e06f131' +down_revision = '9b60be6cd0a2' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # Define the 'proxies' table + proxies_table = op.create_table( + 'proxies', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user_id', sa.Integer(), nullable=True), + sa.Column('type', sa.Enum('VMess', 'VLESS', 'Trojan', 'Shadowsocks', name='proxytypes'), nullable=False), + sa.Column('settings', sa.JSON(), nullable=False), + sa.ForeignKeyConstraint(['user_id'], ['users.id']), + sa.PrimaryKeyConstraint('id') + ) + + # Reflect the 'users' table for data migration + metadata = sa.MetaData() + users_table = sa.Table( + 'users', + metadata, + sa.Column('id', sa.Integer(), primary_key=True), + sa.Column('proxy_type', sa.String(11)), + sa.Column('settings', sa.JSON()) + ) + + # Migrate data: Copy `proxy_type` and `settings` from 'users' to 'proxies' + connection = op.get_bind() + results = connection.execute(select(users_table.c.id, users_table.c.proxy_type, users_table.c.settings)).fetchall() + op.bulk_insert( + proxies_table, + [{"user_id": row.id, "type": row.proxy_type, "settings": json.loads(row.settings)} for row in results] + ) + + # Alter 'users' table: Drop 'proxy_type' and 'settings' + with op.batch_alter_table('users') as batch_op: + batch_op.alter_column( + 'created_at', + existing_type=sa.DATETIME(), + nullable=True, + existing_server_default=sa.text('(CURRENT_TIMESTAMP)') + ) + batch_op.drop_column('proxy_type') + batch_op.drop_column('settings') + + # Create an index on the 'proxies' table + op.create_index(op.f('ix_proxies_id'), 'proxies', ['id'], unique=False) + + +def downgrade() -> None: + # Recreate 'proxy_type' and 'settings' columns in the 'users' table + with op.batch_alter_table('users') as batch_op: + batch_op.add_column(sa.Column('settings', sa.JSON(), nullable=False)) + batch_op.add_column(sa.Column('proxy_type', sa.String(length=11), nullable=False)) + batch_op.alter_column( + 'created_at', + existing_type=sa.DATETIME(), + nullable=False, + existing_server_default=sa.text('(CURRENT_TIMESTAMP)') + ) + + # Drop the index and table 'proxies' + op.drop_index(op.f('ix_proxies_id'), table_name='proxies') + op.drop_table('proxies') diff --git a/app/db/migrations/versions/8fe407cf56c9_add_general_settings_to_app.py b/app/db/migrations/versions/8fe407cf56c9_add_general_settings_to_app.py new file mode 100644 index 000000000..568e3bab4 --- /dev/null +++ b/app/db/migrations/versions/8fe407cf56c9_add_general_settings_to_app.py @@ -0,0 +1,45 @@ +"""add general settings to app + +Revision ID: 8fe407cf56c9 +Revises: 3c466ce2ab63 +Create Date: 2025-07-08 15:48:02.163498 + +""" +import json +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '8fe407cf56c9' +down_revision = '3c466ce2ab63' +branch_labels = None +depends_on = None + + +def upgrade(): + bind = op.get_bind() + dialect = bind.dialect.name + + # Step 1: Add nullable column using batch_op + with op.batch_alter_table('settings') as batch_op: + batch_op.add_column( + sa.Column('general', sa.JSON(), nullable=True) + ) + + # Step 2: Backfill with default JSON value + default_value = { + "default_flow": "", + "default_method": "chacha20-ietf-poly1305" + } + default_str = json.dumps(default_value) + op.execute(f"UPDATE settings SET general = '{default_str}'") + + # Step 3: Make column non-nullable (only if not SQLite) + with op.batch_alter_table('settings') as batch_op: + batch_op.alter_column('general',existing_type=sa.JSON(), type_=sa.JSON(), nullable=False) + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('settings', 'general') + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/931ed40d6eec_add_is_disabled_to_admins_table.py b/app/db/migrations/versions/931ed40d6eec_add_is_disabled_to_admins_table.py new file mode 100644 index 000000000..bdb5517cf --- /dev/null +++ b/app/db/migrations/versions/931ed40d6eec_add_is_disabled_to_admins_table.py @@ -0,0 +1,28 @@ +"""add is_disabled to admins table + +Revision ID: 931ed40d6eec +Revises: 7a93bcd44713 +Create Date: 2025-01-12 08:00:38.731094 + +""" +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import mysql + +# revision identifiers, used by Alembic. +revision = '931ed40d6eec' +down_revision = '7a93bcd44713' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('admins', sa.Column('is_disabled', sa.Boolean(), server_default='0', nullable=False)) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('admins', 'is_disabled') + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/947ebbd8debe_add_on_hold.py b/app/db/migrations/versions/947ebbd8debe_add_on_hold.py new file mode 100644 index 000000000..0fc23e5c1 --- /dev/null +++ b/app/db/migrations/versions/947ebbd8debe_add_on_hold.py @@ -0,0 +1,122 @@ +"""Add on hold + +Revision ID: 947ebbd8debe +Revises: 08b381fc1bc7 +Create Date: 2023-10-08 06:37:10.027798 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '947ebbd8debe' +down_revision = '08b381fc1bc7' +branch_labels = None +depends_on = None + +# Describing of enum +enum_name = "status" +temp_enum_name = f"temp_{enum_name}" +old_values = ('active', 'limited', 'expired', 'disabled') +new_values = ("on_hold", *old_values) +# on downgrade convert [0] to [1] +downgrade_to = ("on_hold", "active") +old_type = sa.Enum(*old_values, name=enum_name) +new_type = sa.Enum(*new_values, name=enum_name) +temp_type = sa.Enum(*new_values, name=temp_enum_name) + + +# Describing of table +table_name = "users" +column_name = "status" +temp_table = sa.sql.table( + table_name, + sa.Column( + column_name, + new_type, + nullable=False + ) +) + + +def upgrade(): + # temp type to use instead of old one + temp_type.create(op.get_bind(), checkfirst=False) + + # changing of column type from old enum to new one. + # SQLite will create temp table for this + with op.batch_alter_table(table_name) as batch_op: + batch_op.alter_column( + column_name, + existing_type=old_type, + type_=temp_type, + existing_nullable=False, + postgresql_using=f"{column_name}::text::{temp_enum_name}" + ) + + # remove old enum, create new enum + old_type.drop(op.get_bind(), checkfirst=False) + new_type.create(op.get_bind(), checkfirst=False) + + # changing of column type from temp enum to new one. + # SQLite will create temp table for this + with op.batch_alter_table(table_name) as batch_op: + batch_op.alter_column( + column_name, + existing_type=temp_type, + type_=new_type, + existing_nullable=False, + postgresql_using=f"{column_name}::text::{enum_name}" + ) + + # remove temp enum + temp_type.drop(op.get_bind(), checkfirst=False) + + op.add_column('users', sa.Column('timeout', sa.Integer(), nullable=True)) + op.add_column('users', sa.Column('edit_at', sa.DateTime(), nullable=True)) + + +def downgrade(): + # old enum don't have new value anymore. + # before downgrading from new enum to old one, + # we should replace new value from new enum with + # somewhat of old values from old enum + op.execute( + temp_table + .update() + .where( + temp_table.c.status == downgrade_to[0] + ) + .values( + status=downgrade_to[1] + ) + ) + + temp_type.create(op.get_bind(), checkfirst=False) + + with op.batch_alter_table(table_name) as batch_op: + batch_op.alter_column( + column_name, + existing_type=new_type, + type_=temp_type, + existing_nullable=False, + postgresql_using=f"{column_name}::text::{temp_enum_name}" + ) + + new_type.drop(op.get_bind(), checkfirst=False) + old_type.create(op.get_bind(), checkfirst=False) + + with op.batch_alter_table(table_name) as batch_op: + batch_op.alter_column( + column_name, + existing_type=temp_type, + type_=old_type, + existing_nullable=False, + postgresql_using=f"{column_name}::text::{enum_name}" + ) + + temp_type.drop(op.get_bind(), checkfirst=False) + + op.drop_column('users', 'edit_at') + op.drop_column('users', 'timeout') diff --git a/app/db/migrations/versions/94a5cc12c0d6_init_user_table.py b/app/db/migrations/versions/94a5cc12c0d6_init_user_table.py new file mode 100644 index 000000000..4d87386d5 --- /dev/null +++ b/app/db/migrations/versions/94a5cc12c0d6_init_user_table.py @@ -0,0 +1,42 @@ +"""init user table + +Revision ID: 94a5cc12c0d6 +Revises: +Create Date: 2022-11-18 20:54:05.616546 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '94a5cc12c0d6' +down_revision = None +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('users', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('username', sa.String(34), nullable=True), + sa.Column('proxy_type', sa.Enum('VMess', 'VLESS', 'Trojan', 'Shadowsocks', name='proxytypes'), nullable=False), + sa.Column('settings', sa.JSON(), nullable=False), + sa.Column('status', sa.Enum('active', 'limited', 'expired', name='userstatus'), nullable=True), + sa.Column('used_traffic', sa.BigInteger(), nullable=True), + sa.Column('data_limit', sa.BigInteger(), nullable=True), + sa.Column('expire', sa.Integer(), nullable=True), + sa.PrimaryKeyConstraint('id') + ) + op.create_index(op.f('ix_users_id'), 'users', ['id'], unique=False) + op.create_index(op.f('ix_users_username'), 'users', ['username'], unique=True) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_index(op.f('ix_users_username'), table_name='users') + op.drop_index(op.f('ix_users_id'), table_name='users') + op.drop_table('users') + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/95da30deba8d_change_fragments_and_noise_from_regex_.py b/app/db/migrations/versions/95da30deba8d_change_fragments_and_noise_from_regex_.py new file mode 100644 index 000000000..a6647638f --- /dev/null +++ b/app/db/migrations/versions/95da30deba8d_change_fragments_and_noise_from_regex_.py @@ -0,0 +1,178 @@ +"""change fragments and noise from regex to json + +Revision ID: 95da30deba8d +Revises: eaa9f30f983e +Create Date: 2025-02-26 21:54:13.977279 + +""" +from alembic import op +import sqlalchemy as sa +from sqlalchemy.orm import Session +from sqlalchemy.dialects import mysql + + +# revision identifiers, used by Alembic. +revision = '95da30deba8d' +down_revision = 'eaa9f30f983e' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + bind = op.get_bind() + + inspector = sa.inspect(bind) + existing_columns = [col['name'] for col in inspector.get_columns('hosts')] + + # If both target columns already exist, skip the migration entirely + if 'noise_settings' in existing_columns and 'fragment_settings' in existing_columns: + return + + session = Session(bind=bind) + + def regex_to_json(table: sa.Table): + # Only query columns that exist + columns_to_query = [table.c.id] + if 'fragment_setting' in existing_columns: + columns_to_query.append(table.c.fragment_setting) + if 'noise_setting' in existing_columns: + columns_to_query.append(table.c.noise_setting) + + for row in session.query(*columns_to_query).all(): + updates = {} + + if 'fragment_setting' in existing_columns and hasattr(row, 'fragment_setting') and row.fragment_setting: + fragment = row.fragment_setting + fragment_json = sa.null() + if fragment: + try: + length, interval, packets = fragment.split(",") + fragment_json = {"xray": {"packets": packets, "length": length, "interval": interval}} + updates['fragment_settings'] = fragment_json + except ValueError: + pass + + if 'noise_setting' in existing_columns and hasattr(row, 'noise_setting') and row.noise_setting: + noises = row.noise_setting + noises_settings_json = sa.null() + if noises: + try: + sn = noises.split("&") + noises_settings_json = {"xray": []} + for n in sn: + try: + tp, delay = n.split(",") + _type, packet = tp.split(":") + noises_settings_json["xray"].append( + {"type": _type, "packet": packet, "delay": delay}) + except ValueError: + continue + updates['noise_settings'] = noises_settings_json + except ValueError: + pass + + if updates: + session.execute( + table.update().where(table.c.id == row.id).values(**updates) + ) + + # Add new JSON columns + if 'noise_settings' not in existing_columns: + op.add_column('hosts', sa.Column('noise_settings', sa.JSON(none_as_null=True), nullable=True)) + + if 'fragment_settings' not in existing_columns: + op.add_column('hosts', sa.Column('fragment_settings', sa.JSON(none_as_null=True), nullable=True)) + + try: + with op.batch_alter_table('hosts') as batch_op: + hosts_table = sa.Table('hosts', sa.MetaData(), autoload_with=bind) + regex_to_json(hosts_table) + + # Drop old columns if they exist + if 'noise_setting' in existing_columns: + batch_op.drop_column('noise_setting') + + if 'fragment_setting' in existing_columns: + batch_op.drop_column('fragment_setting') + + session.commit() + finally: + session.close() + + +def downgrade() -> None: + bind = op.get_bind() + + inspector = sa.inspect(bind) + existing_columns = [col['name'] for col in inspector.get_columns('hosts')] + + # If both target columns already exist, skip the migration entirely + if 'noise_setting' in existing_columns and 'fragment_setting' in existing_columns: + return + + session = Session(bind=bind) + + def json_to_regex(table: sa.Table): + # Only query columns that exist + columns_to_query = [table.c.id] + if 'fragment_settings' in existing_columns: + columns_to_query.append(table.c.fragment_settings) + if 'noise_settings' in existing_columns: + columns_to_query.append(table.c.noise_settings) + + for row in session.query(*columns_to_query).all(): + updates = {} + + if hasattr(row, 'fragment_settings') and row.fragment_settings: + fragment_json = row.fragment_settings + fragment_regex = sa.null() + + # Convert fragment JSON back to regex + if fragment_json and 'xray' in fragment_json: + xray = fragment_json['xray'] + if all(k in xray for k in ['length', 'interval', 'packets']): + fragment_regex = f"{xray['length']},{xray['interval']},{xray['packets']}" + updates['fragment_setting'] = fragment_regex + + if hasattr(row, 'noise_settings') and row.noise_settings: + noise_json = row.noise_settings + noise_regex = sa.null() + + # Convert noise JSON back to regex + if noise_json and 'xray' in noise_json and isinstance(noise_json['xray'], list): + noise_parts = [] + for noise in noise_json['xray']: + if all(k in noise for k in ['type', 'packet', 'delay']): + noise_parts.append(f"{noise['type']}:{noise['packet']},{noise['delay']}") + + if noise_parts: + noise_regex = "&".join(noise_parts) + updates['noise_setting'] = noise_regex + + if updates: + session.execute( + table.update().where(table.c.id == row.id).values(**updates) + ) + + # Add old string columns + if 'fragment_setting' not in existing_columns: + op.add_column('hosts', sa.Column('fragment_setting', sa.String(255), nullable=True)) + + if 'noise_setting' not in existing_columns: + op.add_column('hosts', sa.Column('noise_setting', sa.String(255), nullable=True)) + + try: + with op.batch_alter_table('hosts') as batch_op: + hosts_table = sa.Table('hosts', sa.MetaData(), autoload_with=bind) + json_to_regex(hosts_table) + + # Drop JSON columns if they exist + if 'fragment_settings' in existing_columns: + batch_op.drop_column('fragment_settings') + + if 'noise_settings' in existing_columns: + batch_op.drop_column('noise_settings') + + session.commit() + finally: + session.close() diff --git a/app/db/migrations/versions/97dd9311ab93_add_user_templates.py b/app/db/migrations/versions/97dd9311ab93_add_user_templates.py new file mode 100644 index 000000000..5be7ad43e --- /dev/null +++ b/app/db/migrations/versions/97dd9311ab93_add_user_templates.py @@ -0,0 +1,46 @@ +"""add user templates + +Revision ID: 97dd9311ab93 +Revises: e410e5f15c3f +Create Date: 2023-03-26 04:09:42.829125 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '97dd9311ab93' +down_revision = 'e410e5f15c3f' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('user_templates', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('name', sa.String(length=64), nullable=False), + sa.Column('data_limit', sa.Integer(), nullable=True), + sa.Column('expire_duration', sa.Integer(), nullable=True), + sa.Column('username_prefix', sa.String(length=20), nullable=True), + sa.Column('username_suffix', sa.String(length=20), nullable=True), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('name') + ) + op.create_index(op.f('ix_user_templates_id'), 'user_templates', ['id'], unique=False) + op.create_table('template_inbounds_association', + sa.Column('user_template_id', sa.Integer(), nullable=True), + sa.Column('inbound_tag', sa.String(length=256), nullable=True), + sa.ForeignKeyConstraint(['inbound_tag'], ['inbounds.tag'], ), + sa.ForeignKeyConstraint(['user_template_id'], ['user_templates.id'], ) + ) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('template_inbounds_association') + op.drop_index(op.f('ix_user_templates_id'), table_name='user_templates') + op.drop_table('user_templates') + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/9aa6559916be_drop_mux_enable_column_in_hosts_table.py b/app/db/migrations/versions/9aa6559916be_drop_mux_enable_column_in_hosts_table.py new file mode 100644 index 000000000..639320351 --- /dev/null +++ b/app/db/migrations/versions/9aa6559916be_drop_mux_enable_column_in_hosts_table.py @@ -0,0 +1,28 @@ +"""drop mux_enable column in hosts table + +Revision ID: 9aa6559916be +Revises: 95da30deba8d +Create Date: 2025-02-27 11:28:13.464363 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '9aa6559916be' +down_revision = '95da30deba8d' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('hosts', 'mux_enable') + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('hosts', sa.Column('mux_enable', sa.BOOLEAN(), server_default=sa.text("'0'"), nullable=False)) + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/9af04c077ede_init_settings.py b/app/db/migrations/versions/9af04c077ede_init_settings.py new file mode 100644 index 000000000..8ae12fd58 --- /dev/null +++ b/app/db/migrations/versions/9af04c077ede_init_settings.py @@ -0,0 +1,248 @@ +"""init settings + +Revision ID: 9af04c077ede +Revises: beb47f520963 +Create Date: 2025-05-08 19:01:36.454848 + +""" +from alembic import op +import sqlalchemy as sa +from decouple import config as decouple_config + + +# revision identifiers, used by Alembic. +revision = "9af04c077ede" +down_revision = "beb47f520963" +branch_labels = None +depends_on = None + + +# Define a function to mimic config behavior but directly from environment +def get_config(key, default=None, cast=None): + if cast is not None: + return decouple_config(key, default=default, cast=cast) + else: + return decouple_config(key, default=default) + + +# Environment variables management +TELEGRAM_API_TOKEN = get_config("TELEGRAM_API_TOKEN", default="") +TELEGRAM_WEBHOOK_URL = get_config("TELEGRAM_WEBHOOK_URL", default="").strip("/") +TELEGRAM_WEBHOOK_SECRET_KEY = get_config("TELEGRAM_WEBHOOK_SECRET_KEY", default=None) +TELEGRAM_ADMIN_ID = get_config( + "TELEGRAM_ADMIN_ID", default="", cast=lambda v: int(v.split(",")[0].strip()) if v.strip() else None +) +TELEGRAM_PROXY_URL = get_config("TELEGRAM_PROXY_URL", default=None) +TELEGRAM_LOGGER_CHANNEL_ID = get_config("TELEGRAM_LOGGER_CHANNEL_ID", cast=int, default=0) +TELEGRAM_LOGGER_TOPIC_ID = get_config("TELEGRAM_LOGGER_TOPIC_ID", cast=int, default=0) +TELEGRAM_NOTIFY = get_config("TELEGRAM_NOTIFY", cast=bool, default=False) + +WEBHOOK_ADDRESS = get_config( + "WEBHOOK_ADDRESS", default="", cast=lambda v: [address.strip() for address in v.split(",")] if v else [] +) +WEBHOOK_SECRET = get_config("WEBHOOK_SECRET", default=None) +WEBHOOK_PROXY_URL = get_config("WEBHOOK_PROXY_URL", default=None) + +NOTIFICATION_PROXY_URL = get_config("NOTIFICATION_PROXY_URL", default=None) + +# recurrent notifications +RECURRENT_NOTIFICATIONS_TIMEOUT = get_config("RECURRENT_NOTIFICATIONS_TIMEOUT", default=180, cast=int) +NUMBER_OF_RECURRENT_NOTIFICATIONS = get_config("NUMBER_OF_RECURRENT_NOTIFICATIONS", default=3, cast=int) + +# Notification thresholds +NOTIFY_REACHED_USAGE_PERCENT = get_config( + "NOTIFY_REACHED_USAGE_PERCENT", default="80", cast=lambda v: [int(p.strip()) for p in v.split(",")] if v else [] +) +NOTIFY_DAYS_LEFT = get_config( + "NOTIFY_DAYS_LEFT", default="3", cast=lambda v: [int(d.strip()) for d in v.split(",")] if v else [] +) + +# Discord webhook +DISCORD_WEBHOOK_URL = get_config("DISCORD_WEBHOOK_URL", default="") + +# Subscription settings +XRAY_SUBSCRIPTION_URL_PREFIX = get_config("XRAY_SUBSCRIPTION_URL_PREFIX", default="").strip("/") +SUB_UPDATE_INTERVAL = get_config("SUB_UPDATE_INTERVAL", default="12") +SUB_SUPPORT_URL = get_config("SUB_SUPPORT_URL", default="https://t.me/") +SUB_PROFILE_TITLE = get_config("SUB_PROFILE_TITLE", default="Subscription") +HOST_STATUS_FILTER = get_config("HOST_STATUS_FILTER", default=True, cast=bool) + +# Custom JSON settings +USE_CUSTOM_JSON_DEFAULT = get_config("USE_CUSTOM_JSON_DEFAULT", default=False, cast=bool) +USE_CUSTOM_JSON_FOR_V2RAYN = get_config("USE_CUSTOM_JSON_FOR_V2RAYN", default=False, cast=bool) +USE_CUSTOM_JSON_FOR_V2RAYNG = get_config("USE_CUSTOM_JSON_FOR_V2RAYNG", default=False, cast=bool) +USE_CUSTOM_JSON_FOR_STREISAND = get_config("USE_CUSTOM_JSON_FOR_STREISAND", default=False, cast=bool) +USE_CUSTOM_JSON_FOR_HAPP = get_config("USE_CUSTOM_JSON_FOR_HAPP", default=False, cast=bool) +USE_CUSTOM_JSON_FOR_NPVTUNNEL = get_config("USE_CUSTOM_JSON_FOR_NPVTUNNEL", default=False, cast=bool) + + +# Build settings dictionaries +telegram = { + "enable": True if TELEGRAM_API_TOKEN and TELEGRAM_WEBHOOK_URL and TELEGRAM_WEBHOOK_SECRET_KEY else False, + "token": TELEGRAM_API_TOKEN if TELEGRAM_API_TOKEN else None, + "webhook_url": TELEGRAM_WEBHOOK_URL if TELEGRAM_WEBHOOK_URL else None, + "webhook_secret": TELEGRAM_WEBHOOK_SECRET_KEY if TELEGRAM_WEBHOOK_SECRET_KEY else None, + "proxy_url": TELEGRAM_PROXY_URL, +} + +discord = {"enable": False, "token": None, "proxy_url": None} + +webhook = { + "enable": True if WEBHOOK_ADDRESS else False, + "webhooks": [{"url": url, "secret": WEBHOOK_SECRET} for url in WEBHOOK_ADDRESS], + "days_left": NOTIFY_DAYS_LEFT, + "usage_percent": NOTIFY_REACHED_USAGE_PERCENT, + "timeout": RECURRENT_NOTIFICATIONS_TIMEOUT, + "recurrent": NUMBER_OF_RECURRENT_NOTIFICATIONS, + "proxy_url": WEBHOOK_PROXY_URL, +} + +notification_settings = { + "notify_telegram": TELEGRAM_NOTIFY, + "notify_discord": True if DISCORD_WEBHOOK_URL else False, + + "telegram_api_token": TELEGRAM_API_TOKEN if TELEGRAM_API_TOKEN else None, + "telegram_admin_id": TELEGRAM_ADMIN_ID if TELEGRAM_ADMIN_ID else None, + "telegram_channel_id": TELEGRAM_LOGGER_CHANNEL_ID if TELEGRAM_LOGGER_CHANNEL_ID else None, + "telegram_topic_id": TELEGRAM_LOGGER_TOPIC_ID if TELEGRAM_LOGGER_TOPIC_ID else None, + + "discord_webhook_url": DISCORD_WEBHOOK_URL if DISCORD_WEBHOOK_URL else None, + + "proxy_url": NOTIFICATION_PROXY_URL, + + "max_retries": 3, +} + +notification_enable = { + "admin": True, + "core": True, + "group": True, + "host": True, + "login": True, + "node": True, + "user": True, + "user_template": True, + "days_left": True, + "percentage_reached": True, +} + +xray_rule = "" + +def append_rule(pattern: str) -> None: + global xray_rule + if xray_rule: + xray_rule += "|" + pattern + else: + xray_rule = pattern + +if USE_CUSTOM_JSON_DEFAULT: + append_rule("[Vv]2rayNG") + append_rule("[Vv]2rayN") + append_rule("[Ss]treisand") + append_rule("[Hh]app") + append_rule(r"[Kk]tor\-client") + +else: + if USE_CUSTOM_JSON_FOR_V2RAYNG: + append_rule("[Vv]2rayNG") + if USE_CUSTOM_JSON_FOR_V2RAYN: + append_rule("[Vv]2rayN") + if USE_CUSTOM_JSON_FOR_STREISAND: + append_rule("[Ss]treisand") + if USE_CUSTOM_JSON_FOR_HAPP: + append_rule("[Hh]app") + if USE_CUSTOM_JSON_FOR_NPVTUNNEL: + append_rule(r"[Kk]tor\-client") + + +rules = [ + { + "pattern": r"^([Cc]lash[\-\.]?[Vv]erge|[Cc]lash[\-\.]?[Mm]eta|[Ff][Ll][Cc]lash|[Mm]ihomo)", + "target": "clash_meta" + }, + { + "pattern": r"^([Cc]lash|[Ss]tash)", + "target": "clash" + }, + { + "pattern": r"^(SFA|SFI|SFM|SFT|[Kk]aring|[Hh]iddify[Nn]ext)|.*[Ss]ing[\-b]?ox.*", + "target": "sing_box" + }, + { + "pattern": r"^(SS|SSR|SSD|SSS|Outline|Shadowsocks|SSconf)", + "target": "outline" + }, + { + "pattern": r"^.*", # Default catch-all pattern + "target": "links_base64" + } +] + +if xray_rule: + rules.insert(-1, {"pattern": r"^(%s)" % xray_rule, "target": "xray"}) + +manual_sub_request = { + "links": True, + "links_base64": True, + "xray": True, + "sing_box": True, + "clash": True, + "clash_meta": True, + "outline": True, +} + +subscription = { + "url_prefix": XRAY_SUBSCRIPTION_URL_PREFIX, + "update_interval": SUB_UPDATE_INTERVAL, + "support_url": SUB_SUPPORT_URL, + "profile_title": SUB_PROFILE_TITLE, + + "host_status_filter": HOST_STATUS_FILTER, + + "rules": rules, + "manual_sub_request": manual_sub_request +} + +base_settings = { + "telegram": telegram, + "discord": discord, + "webhook": webhook, + "notification_settings": notification_settings, + "notification_enable": notification_enable, + "subscription": subscription, +} +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_table("settings", + sa.Column("id", sa.Integer(), nullable=False), + sa.Column("telegram", sa.JSON(), nullable=False), + sa.Column("discord", sa.JSON(), nullable=False), + sa.Column("webhook", sa.JSON(), nullable=False), + sa.Column("notification_settings", sa.JSON(), nullable=False), + sa.Column("notification_enable", sa.JSON(), nullable=False), + sa.Column("subscription", sa.JSON(), nullable=False), + sa.PrimaryKeyConstraint("id") + ) + # ### end Alembic commands ### + + op.bulk_insert( + sa.table( + "settings", + sa.Column("id", sa.Integer), + sa.Column("telegram", sa.JSON), + sa.Column("discord", sa.JSON), + sa.Column("webhook", sa.JSON), + sa.Column("notification_settings", sa.JSON), + sa.Column("notification_enable", sa.JSON), + sa.Column("subscription", sa.JSON) + ), + [ + base_settings + ], + ) + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table("settings") + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/9b60be6cd0a2_add_created_at_field_to_users_table.py b/app/db/migrations/versions/9b60be6cd0a2_add_created_at_field_to_users_table.py new file mode 100644 index 000000000..b7da9743e --- /dev/null +++ b/app/db/migrations/versions/9b60be6cd0a2_add_created_at_field_to_users_table.py @@ -0,0 +1,33 @@ +"""add created_at field to users table + +Revision ID: 9b60be6cd0a2 +Revises: 9d5a518ae432 +Create Date: 2022-12-25 18:45:46.743506 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '9b60be6cd0a2' +down_revision = '9d5a518ae432' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table('users') as batch_op: + batch_op.add_column(sa.Column( + 'created_at', sa.DateTime(), + nullable=False, + server_default=sa.func.current_timestamp())) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table('users') as batch_op: + batch_op.drop_column('created_at') + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/9cfffef342cd_user_template_status_and_reset_usage.py b/app/db/migrations/versions/9cfffef342cd_user_template_status_and_reset_usage.py new file mode 100644 index 000000000..d7ba80f00 --- /dev/null +++ b/app/db/migrations/versions/9cfffef342cd_user_template_status_and_reset_usage.py @@ -0,0 +1,45 @@ +"""user template status and reset usage + +Revision ID: 9cfffef342cd +Revises: 53586547c10e +Create Date: 2025-04-14 11:08:05.711323 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = '9cfffef342cd' +down_revision = '53586547c10e' +branch_labels = None +depends_on = None + + +new_enum = sa.Enum('active', 'on_hold', name='userstatuscreate') + + + +def upgrade() -> None: + connection = op.get_bind() + dialect = connection.dialect.name + + if dialect == "postgresql": + new_enum.create(op.get_bind(), checkfirst=False) + + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('user_templates', sa.Column('status', new_enum, nullable=False, server_default='active')) + op.add_column('user_templates', sa.Column('reset_usages', sa.Boolean(), server_default='0', nullable=False)) + # ### end Alembic commands ### + + +def downgrade() -> None: + connection = op.get_bind() + dialect = connection.dialect.name + + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('user_templates', 'reset_usages') + op.drop_column('user_templates', 'status') + # ### end Alembic commands ### + + if dialect == "postgresql": + new_enum.drop(op.get_bind(), checkfirst=False) \ No newline at end of file diff --git a/app/db/migrations/versions/9d5a518ae432_init_jwt_table.py b/app/db/migrations/versions/9d5a518ae432_init_jwt_table.py new file mode 100644 index 000000000..51c44340d --- /dev/null +++ b/app/db/migrations/versions/9d5a518ae432_init_jwt_table.py @@ -0,0 +1,37 @@ +"""init jwt table + +Revision ID: 9d5a518ae432 +Revises: 3cf36a5fde73 +Create Date: 2022-11-24 21:02:44.278773 + +""" +import os +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '9d5a518ae432' +down_revision = '3cf36a5fde73' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + table = op.create_table('jwt', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('secret_key', sa.String(length=64), nullable=False), + sa.PrimaryKeyConstraint('id') + ) + + # INSERT DEFAULT ROW + op.bulk_insert(table, [{"id": 1, "secret_key": os.urandom(32).hex()}]) + + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('jwt') + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/9fa4831e991a_add_ech_config_list_to_hosts.py b/app/db/migrations/versions/9fa4831e991a_add_ech_config_list_to_hosts.py new file mode 100644 index 000000000..aed74df54 --- /dev/null +++ b/app/db/migrations/versions/9fa4831e991a_add_ech_config_list_to_hosts.py @@ -0,0 +1,28 @@ +"""add ech_config_list to hosts + +Revision ID: 9fa4831e991a +Revises: e422f859847f +Create Date: 2025-07-29 13:11:02.048475 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '9fa4831e991a' +down_revision = 'e422f859847f' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('hosts', sa.Column('ech_config_list', sa.String(length=512), nullable=True)) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('hosts', 'ech_config_list') + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/a0715c2615f0_add_allow_in_secure_and_disable_host.py b/app/db/migrations/versions/a0715c2615f0_add_allow_in_secure_and_disable_host.py new file mode 100644 index 000000000..08407b28b --- /dev/null +++ b/app/db/migrations/versions/a0715c2615f0_add_allow_in_secure_and_disable_host.py @@ -0,0 +1,34 @@ +"""Add allow in secure and disable host + +Revision ID: a0715c2615f0 +Revises: 1cf7d159fdbb +Create Date: 2023-09-13 20:39:58.913256 + +""" +import sqlalchemy +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'a0715c2615f0' +down_revision = '1cf7d159fdbb' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + try: + op.add_column('hosts', sa.Column('allowinsecure', sa.Boolean(), nullable=True)) + except sqlalchemy.exc.OperationalError: + with op.batch_alter_table('hosts') as batch_op: + batch_op.drop_column('allowinsecure') + op.add_column('hosts', sa.Column('allowinsecure', sa.Boolean(), nullable=True)) + + op.add_column('hosts', sa.Column('is_disabled', sa.Boolean(), nullable=True)) + + +def downgrade() -> None: + with op.batch_alter_table('hosts') as batch_op: + batch_op.drop_column('is_disabled') + batch_op.drop_column('allowinsecure') diff --git a/app/db/migrations/versions/a0d3d400ea75_admin_is_sudo_field.py b/app/db/migrations/versions/a0d3d400ea75_admin_is_sudo_field.py new file mode 100644 index 000000000..66a2eceb8 --- /dev/null +++ b/app/db/migrations/versions/a0d3d400ea75_admin_is_sudo_field.py @@ -0,0 +1,29 @@ +"""Admin: is_sudo field + +Revision ID: a0d3d400ea75 +Revises: 5b84d88804a1 +Create Date: 2023-03-10 23:01:23.260630 + +""" +from alembic import op +import sqlalchemy as sa +from sqlalchemy.sql import expression + + +# revision identifiers, used by Alembic. +revision = 'a0d3d400ea75' +down_revision = '5b84d88804a1' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('admins', sa.Column('is_sudo', sa.Boolean(), nullable=True, server_default=expression.false())) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('admins', 'is_sudo') + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/a6e3fff39291_add_notification_reminders.py b/app/db/migrations/versions/a6e3fff39291_add_notification_reminders.py new file mode 100644 index 000000000..77eaaa6bc --- /dev/null +++ b/app/db/migrations/versions/a6e3fff39291_add_notification_reminders.py @@ -0,0 +1,38 @@ +"""add notification reminders + +Revision ID: a6e3fff39291 +Revises: 015cf1dc6eca +Create Date: 2023-08-21 18:04:37.096599 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'a6e3fff39291' +down_revision = '015cf1dc6eca' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('notification_reminders', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user_id', sa.Integer(), nullable=True), + sa.Column('type', sa.Enum('expiration_date', 'data_usage', name='remindertype'), nullable=False), + sa.Column('expires_at', sa.DateTime(), nullable=True), + sa.Column('created_at', sa.DateTime(), nullable=True), + sa.ForeignKeyConstraint(['user_id'], ['users.id'], ), + sa.PrimaryKeyConstraint('id') + ) + op.create_index(op.f('ix_notification_reminders_id'), 'notification_reminders', ['id'], unique=False) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_index(op.f('ix_notification_reminders_id'), table_name='notification_reminders') + op.drop_table('notification_reminders') + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/a9cfd5611a82_add_noise_settings.py b/app/db/migrations/versions/a9cfd5611a82_add_noise_settings.py new file mode 100644 index 000000000..6b787aae9 --- /dev/null +++ b/app/db/migrations/versions/a9cfd5611a82_add_noise_settings.py @@ -0,0 +1,28 @@ +"""add noise settings + +Revision ID: a9cfd5611a82 +Revises: 2313cdc30da3 +Create Date: 2024-09-04 18:55:55.167589 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'a9cfd5611a82' +down_revision = '2313cdc30da3' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('hosts', sa.Column('noise_setting', sa.String(length=2000), nullable=True)) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('hosts', 'noise_setting') + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/ac26f36783a2_increase_username_length.py b/app/db/migrations/versions/ac26f36783a2_increase_username_length.py new file mode 100644 index 000000000..dd546aa75 --- /dev/null +++ b/app/db/migrations/versions/ac26f36783a2_increase_username_length.py @@ -0,0 +1,40 @@ +"""increase username length + +Revision ID: ac26f36783a2 +Revises: 6980e98bba01 +Create Date: 2025-04-18 16:43:14.242833 + +""" +from alembic import op +import sqlalchemy as sa +from app.db.compiles_types import CaseSensitiveString + + +# revision identifiers, used by Alembic. +revision = 'ac26f36783a2' +down_revision = '6980e98bba01' +branch_labels = None +depends_on = None + +table_name = 'users' + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table(table_name) as batch_op: + batch_op.alter_column('username', + existing_type=sa.VARCHAR(length=34), + type_=CaseSensitiveString(length=128), + existing_nullable=False, + ) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table(table_name) as batch_op: + batch_op.alter_column('username', + existing_type=CaseSensitiveString(length=128), + type_=sa.VARCHAR(length=34), + existing_nullable=False, + ) + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/adda2dd4a741_add_sockopt_proxy_outbound_mux_enable_fragment_setting_to_hosts.py b/app/db/migrations/versions/adda2dd4a741_add_sockopt_proxy_outbound_mux_enable_fragment_setting_to_hosts.py new file mode 100644 index 000000000..9e621f72d --- /dev/null +++ b/app/db/migrations/versions/adda2dd4a741_add_sockopt_proxy_outbound_mux_enable_fragment_setting_to_hosts.py @@ -0,0 +1,34 @@ +"""Add sockopt proxy_outbound mux_enable fragment_setting to hosts + +Revision ID: adda2dd4a741 +Revises: dd725e4d3628 +Create Date: 2024-02-18 21:46:55.311329 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'adda2dd4a741' +down_revision = 'dd725e4d3628' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('hosts', sa.Column('sockopt', sa.JSON(), nullable=True)) + op.add_column('hosts', sa.Column('proxy_outbound', sa.JSON(), nullable=True)) + op.add_column('hosts', sa.Column('mux_enable', sa.Boolean(), server_default='0', nullable=False)) + op.add_column('hosts', sa.Column('fragment_setting', sa.String(length=100), nullable=True)) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('hosts', 'proxy_outbound') + op.drop_column('hosts', 'sockopt') + op.drop_column('hosts', 'mux_enable') + op.drop_column('hosts', 'fragment_setting') + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/b15eba6e5867_add_host_sni.py b/app/db/migrations/versions/b15eba6e5867_add_host_sni.py new file mode 100644 index 000000000..de2ecdf7a --- /dev/null +++ b/app/db/migrations/versions/b15eba6e5867_add_host_sni.py @@ -0,0 +1,26 @@ +"""add host and sni columns to hosts table + +Revision ID: b15eba6e5867 +Revises: ece13c4c6f65 +Create Date: 2023-02-28 18:34:19.100255 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = "b15eba6e5867" +down_revision = "ece13c4c6f65" +branch_labels = None +depends_on = None + + +def upgrade() -> None: + op.add_column("hosts", sa.Column("sni", sa.String(256), nullable=True)) + op.add_column("hosts", sa.Column("host", sa.String(256), nullable=True)) + + +def downgrade() -> None: + op.drop_column("hosts", "host") + op.drop_column("hosts", "sni") diff --git a/app/db/migrations/versions/b25e7e6be241_added_users_usage_to_admin.py b/app/db/migrations/versions/b25e7e6be241_added_users_usage_to_admin.py new file mode 100644 index 000000000..8fe4deb1f --- /dev/null +++ b/app/db/migrations/versions/b25e7e6be241_added_users_usage_to_admin.py @@ -0,0 +1,28 @@ +"""Added users_usage to admin + +Revision ID: b25e7e6be241 +Revises: c3cd674b9bcd +Create Date: 2024-11-11 23:41:08.511867 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'b25e7e6be241' +down_revision = 'c3cd674b9bcd' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('admins', sa.Column('users_usage', sa.BigInteger(), nullable=False, server_default="0")) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('admins', 'users_usage') + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/b3378dc6de01_hosts.py b/app/db/migrations/versions/b3378dc6de01_hosts.py new file mode 100644 index 000000000..e33e37513 --- /dev/null +++ b/app/db/migrations/versions/b3378dc6de01_hosts.py @@ -0,0 +1,36 @@ +"""hosts + +Revision ID: b3378dc6de01 +Revises: e91236993f1a +Create Date: 2023-02-14 18:22:26.791353 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'b3378dc6de01' +down_revision = 'e91236993f1a' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('hosts', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('remark', sa.String(256), nullable=False), + sa.Column('address', sa.String(256), nullable=False), + sa.Column('port', sa.Integer(), nullable=True), + sa.Column('inbound_tag', sa.String(256), nullable=False), + sa.ForeignKeyConstraint(['inbound_tag'], ['inbounds.tag'], ), + sa.PrimaryKeyConstraint('id') + ) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('hosts') + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/be0c5f840473_fix_multiple_heads_error.py b/app/db/migrations/versions/be0c5f840473_fix_multiple_heads_error.py new file mode 100644 index 000000000..cb787c917 --- /dev/null +++ b/app/db/migrations/versions/be0c5f840473_fix_multiple_heads_error.py @@ -0,0 +1,24 @@ +"""fix multiple heads error + +Revision ID: be0c5f840473 +Revises: d0a3960f5dad, 54c4b8c525fc +Create Date: 2024-12-02 15:41:08.152196 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'be0c5f840473' +down_revision = ('d0a3960f5dad', '54c4b8c525fc') +branch_labels = None +depends_on = None + + +def upgrade() -> None: + pass + + +def downgrade() -> None: + pass diff --git a/app/db/migrations/versions/beb47f520963_gather_node_logs_option.py b/app/db/migrations/versions/beb47f520963_gather_node_logs_option.py new file mode 100644 index 000000000..e4773e0af --- /dev/null +++ b/app/db/migrations/versions/beb47f520963_gather_node_logs_option.py @@ -0,0 +1,28 @@ +"""gather node logs option + +Revision ID: beb47f520963 +Revises: 508061427170 +Create Date: 2025-05-03 11:39:20.303870 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'beb47f520963' +down_revision = '508061427170' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('nodes', sa.Column('gather_logs', sa.Boolean(), server_default='1', nullable=False)) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('nodes', 'gather_logs') + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/c106bb40c861_alpn_fingerprint_hosts.py b/app/db/migrations/versions/c106bb40c861_alpn_fingerprint_hosts.py new file mode 100644 index 000000000..e713922b0 --- /dev/null +++ b/app/db/migrations/versions/c106bb40c861_alpn_fingerprint_hosts.py @@ -0,0 +1,35 @@ +"""alpn_fingerprint_hosts + +Revision ID: c106bb40c861 +Revises: 57fda18cd9e6 +Create Date: 2023-05-05 18:50:45.505537 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'c106bb40c861' +down_revision = '57fda18cd9e6' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + proxyhostalpn_enum = sa.Enum('none', 'h2', 'http/1.1', 'h2,http/1.1', name='proxyhostalpn') + proxyhostalpn_enum.create(op.get_bind(), checkfirst=True) + + proxyhostfingerprint_enum = sa.Enum('none', 'chrome', 'firefox', 'safari', 'ios', 'android', 'edge', '360', 'qq', 'random', 'randomized', name='proxyhostfingerprint') + proxyhostfingerprint_enum.create(op.get_bind(), checkfirst=True) + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('hosts', sa.Column('alpn', sa.Enum('none', 'h2', 'http/1.1', 'h2,http/1.1', name='proxyhostalpn'), server_default='none', nullable=False)) + op.add_column('hosts', sa.Column('fingerprint', sa.Enum('none', 'chrome', 'firefox', 'safari', 'ios', 'android', 'edge', '360', 'qq', 'random', 'randomized', name='proxyhostfingerprint'), server_default='none', nullable=False)) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('hosts', 'fingerprint') + op.drop_column('hosts', 'alpn') + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/c3cd674b9bcd_added_next_plan_for_user.py b/app/db/migrations/versions/c3cd674b9bcd_added_next_plan_for_user.py new file mode 100644 index 000000000..4dfe60720 --- /dev/null +++ b/app/db/migrations/versions/c3cd674b9bcd_added_next_plan_for_user.py @@ -0,0 +1,37 @@ +"""Added next_plan for user + +Revision ID: c3cd674b9bcd +Revises: 21226bc711ac +Create Date: 2024-11-07 12:45:51.159960 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'c3cd674b9bcd' +down_revision = '21226bc711ac' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('next_plans', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user_id', sa.Integer(), nullable=False), + sa.Column('data_limit', sa.BigInteger(), nullable=False), + sa.Column('expire', sa.Integer(), nullable=True), + sa.Column('add_remaining_traffic', sa.Boolean(), server_default='0', nullable=False), + sa.Column('fire_on_either', sa.Boolean(), server_default='0', nullable=False), + sa.ForeignKeyConstraint(['user_id'], ['users.id'], ), + sa.PrimaryKeyConstraint('id') + ) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('next_plans') + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/c41c441de44c_gozargah_node.py b/app/db/migrations/versions/c41c441de44c_gozargah_node.py new file mode 100644 index 000000000..5545d0d79 --- /dev/null +++ b/app/db/migrations/versions/c41c441de44c_gozargah_node.py @@ -0,0 +1,50 @@ +"""gozargah-node + +Revision ID: c41c441de44c +Revises: 0b62f893092b +Create Date: 2025-03-12 15:01:01.918710 + +""" +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + + +# revision identifiers, used by Alembic. +revision = 'c41c441de44c' +down_revision = '0b62f893092b' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('nodes', sa.Column('node_version', sa.String(length=32), nullable=True)) + + # Create enum type for PostgreSQL + if op.get_bind().dialect.name == 'postgresql': + nodeconnectiontype = postgresql.ENUM('grpc', 'rest', name='nodeconnectiontype') + nodeconnectiontype.create(op.get_bind()) + + op.add_column('nodes', sa.Column('connection_type', sa.Enum('grpc', 'rest', name='nodeconnectiontype', create_type=False), server_default='grpc', nullable=False)) + op.add_column('nodes', sa.Column('server_ca', sa.String(length=2048), nullable=False, server_default='')) + op.add_column('nodes', sa.Column('keep_alive', sa.Integer(), nullable=False, server_default='0')) + op.add_column('nodes', sa.Column('max_logs', sa.BigInteger(), server_default=sa.text('1000'), nullable=False)) + op.drop_column('nodes', 'api_port') + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('nodes', sa.Column('api_port', sa.INTEGER(), nullable=False)) + op.drop_column('nodes', 'max_logs') + op.drop_column('nodes', 'keep_alive') + op.drop_column('nodes', 'server_ca') + op.drop_column('nodes', 'connection_type') + op.drop_column('nodes', 'node_version') + + # Drop enum type for PostgreSQL + if op.get_bind().dialect.name == 'postgresql': + nodeconnectiontype = postgresql.ENUM('grpc', 'rest', name='nodeconnectiontype') + nodeconnectiontype.drop(op.get_bind()) + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/c47250b790eb_add_user_note.py b/app/db/migrations/versions/c47250b790eb_add_user_note.py new file mode 100644 index 000000000..ebce4f605 --- /dev/null +++ b/app/db/migrations/versions/c47250b790eb_add_user_note.py @@ -0,0 +1,28 @@ +"""add user note + +Revision ID: c47250b790eb +Revises: 35f7f8fa9cf2 +Create Date: 2023-07-16 15:26:51.350468 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'c47250b790eb' +down_revision = '35f7f8fa9cf2' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('users', sa.Column('note', sa.String(length=500), nullable=True)) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('users', 'note') + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/c5c734bd3da2_add_priority_to_proxy_hosts.py b/app/db/migrations/versions/c5c734bd3da2_add_priority_to_proxy_hosts.py new file mode 100644 index 000000000..c798d4c86 --- /dev/null +++ b/app/db/migrations/versions/c5c734bd3da2_add_priority_to_proxy_hosts.py @@ -0,0 +1,150 @@ +"""add priority to proxy hosts + +Revision ID: c5c734bd3da2 +Revises: 68edca039166 +Create Date: 2025-02-24 22:29:49.063544 + +""" + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import mysql +from sqlalchemy import inspect + + +# revision identifiers, used by Alembic. +revision = "c5c734bd3da2" +down_revision = "68edca039166" +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + + dialect_name = op.get_bind().dialect.name + is_sqlite = dialect_name == "sqlite" + is_postgresql = dialect_name == "postgresql" + is_mysql = dialect_name == "mysql" + + op.add_column("hosts", sa.Column("priority", sa.Integer(), nullable=True)) + op.execute("UPDATE hosts SET priority = id") + + with op.batch_alter_table("hosts") as batch_op: + # Handle priority column first + batch_op.alter_column("priority", existing_type=sa.Integer(), nullable=False) + + if is_sqlite: + with op.batch_alter_table("hosts") as batch_op: + batch_op.alter_column('inbound_tag', + existing_type=sa.VARCHAR(length=256), + nullable=True) + batch_op.create_foreign_key("hosts_ibfk_1", 'inbounds', ['inbound_tag'], ['tag'], onupdate='CASCADE', ondelete='SET NULL') + + else: + # Find and drop the existing foreign key constraint FIRST + inspector = inspect(op.get_bind()) + for fk in inspector.get_foreign_keys('hosts'): + if fk['referred_table'] == 'inbounds' and 'inbound_tag' in fk['constrained_columns']: + op.drop_constraint( + fk['name'], + 'hosts', + type_='foreignkey' + ) + break + + if is_mysql: + # For MySQL, we need to drop the constraint before altering the column + op.alter_column( + 'hosts', + 'inbound_tag', + existing_type=mysql.VARCHAR(charset='utf8mb4', collation='utf8mb4_bin', length=256), + nullable=True, + ) + + elif is_postgresql: + # Now modify the column after dropping the constraint + op.alter_column( + 'hosts', + 'inbound_tag', + existing_type=sa.VARCHAR(length=256), + nullable=True, + ) + + # Create new foreign key with appropriate name + constraint_name = "hosts_inbound_tag_fkey" if is_postgresql else "hosts_ibfk_1" + op.create_foreign_key( + constraint_name, + 'hosts', + 'inbounds', + ['inbound_tag'], + ['tag'], + onupdate='CASCADE', + ondelete='SET NULL' + ) + + # Replace the direct constraint drop with an inspection-based approach + inspector = inspect(op.get_bind()) + for fk in inspector.get_foreign_keys('hosts'): + if fk['referred_table'] == 'proxies' and 'proxy_id' in fk['constrained_columns']: + op.drop_constraint( + fk['name'], + 'hosts', + type_='foreignkey' + ) + break + + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + + is_sqlite = op.get_bind().dialect.name == "sqlite" + is_postgresql = op.get_bind().dialect.name == "postgresql" + + if is_sqlite: + with op.batch_alter_table("hosts") as batch_op: + batch_op.drop_constraint('hosts_ibfk_1', type_='foreignkey') + batch_op.alter_column('inbound_tag', + existing_type=sa.VARCHAR(length=256), + nullable=False) + batch_op.create_foreign_key( + 'hosts_ibfk_1', + 'inbounds', + ['inbound_tag'], + ['tag'] + ) + + else: + # Find and drop the existing foreign key constraint + inspector = inspect(op.get_bind()) + for fk in inspector.get_foreign_keys('hosts'): + if fk['referred_table'] == 'inbounds' and 'inbound_tag' in fk['constrained_columns']: + op.drop_constraint( + fk['name'], + 'hosts', + type_='foreignkey' + ) + break + + # Create new foreign key with appropriate name + constraint_name = "hosts_inbound_tag_fkey" if is_postgresql else "hosts_ibfk_1" + op.create_foreign_key( + constraint_name, + 'hosts', + 'inbounds', + ['inbound_tag'], + ['tag'] + ) + + op.alter_column( + 'hosts', + 'inbound_tag', + existing_type=sa.VARCHAR(length=256), + nullable=False, + ) + + + op.drop_column("hosts", "priority") + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/cb99b515fbab_drop_excloud_inbounds_and_template_.py b/app/db/migrations/versions/cb99b515fbab_drop_excloud_inbounds_and_template_.py new file mode 100644 index 000000000..3aacf14f4 --- /dev/null +++ b/app/db/migrations/versions/cb99b515fbab_drop_excloud_inbounds_and_template_.py @@ -0,0 +1,40 @@ +"""drop excloud_inbounds and template_inbound tables + +Revision ID: cb99b515fbab +Revises: 16e19723febc +Create Date: 2025-03-17 10:32:08.929368 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'cb99b515fbab' +down_revision = '16e19723febc' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('template_inbounds_association') + op.drop_table('exclude_inbounds_association') + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('exclude_inbounds_association', + sa.Column('proxy_id', sa.INTEGER(), nullable=True), + sa.Column('inbound_tag', sa.VARCHAR(length=256), nullable=True), + sa.ForeignKeyConstraint(['inbound_tag'], ['inbounds.tag'], ), + sa.ForeignKeyConstraint(['proxy_id'], ['proxies.id'], ) + ) + op.create_table('template_inbounds_association', + sa.Column('user_template_id', sa.INTEGER(), nullable=True), + sa.Column('inbound_tag', sa.VARCHAR(length=256), nullable=True), + sa.ForeignKeyConstraint(['inbound_tag'], ['inbounds.tag'], ), + sa.ForeignKeyConstraint(['user_template_id'], ['user_templates.id'], ) + ) + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/ccbf9d322ae3_user_auto_delete_in_days.py b/app/db/migrations/versions/ccbf9d322ae3_user_auto_delete_in_days.py new file mode 100644 index 000000000..90dbdf363 --- /dev/null +++ b/app/db/migrations/versions/ccbf9d322ae3_user_auto_delete_in_days.py @@ -0,0 +1,28 @@ +"""user_auto_delete_in_days + +Revision ID: ccbf9d322ae3 +Revises: 4f045f53bef8 +Create Date: 2024-04-22 12:37:35.439501 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'ccbf9d322ae3' +down_revision = '4f045f53bef8' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('users', sa.Column('auto_delete_in_days', sa.Integer(), nullable=True)) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('users', 'auto_delete_in_days') + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/cf67676aaf82_add_is_disabled_to_usertemplates.py b/app/db/migrations/versions/cf67676aaf82_add_is_disabled_to_usertemplates.py new file mode 100644 index 000000000..6f8c9e1e3 --- /dev/null +++ b/app/db/migrations/versions/cf67676aaf82_add_is_disabled_to_usertemplates.py @@ -0,0 +1,28 @@ +"""add is_disabled to userTemplates + +Revision ID: cf67676aaf82 +Revises: d085fae205b6 +Create Date: 2025-05-16 18:20:41.833188 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'cf67676aaf82' +down_revision = 'd085fae205b6' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('user_templates', sa.Column('is_disabled', sa.Boolean(), server_default='0', nullable=False)) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('user_templates', 'is_disabled') + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/d02dcfbf1517_add_userusageresetlogs_model_and_data_.py b/app/db/migrations/versions/d02dcfbf1517_add_userusageresetlogs_model_and_data_.py new file mode 100644 index 000000000..5a204a730 --- /dev/null +++ b/app/db/migrations/versions/d02dcfbf1517_add_userusageresetlogs_model_and_data_.py @@ -0,0 +1,42 @@ +"""add UserUsageResetLogs Model and data_limit_strategy field to user + +Revision ID: d02dcfbf1517 +Revises: 671621870b02 +Create Date: 2023-02-01 21:10:49.830928 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'd02dcfbf1517' +down_revision = '671621870b02' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + userdatalimitresetstrategy = sa.Enum('no_reset', 'day', 'week', 'month', 'year', name='userdatalimitresetstrategy') + userdatalimitresetstrategy.create(op.get_bind()) + + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('user_usage_logs', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user_id', sa.Integer(), nullable=True), + sa.Column('used_traffic_at_reset', sa.BigInteger(), nullable=False), + sa.Column('reset_at', sa.DateTime(), nullable=True), + sa.ForeignKeyConstraint(['user_id'], ['users.id'], ), + sa.PrimaryKeyConstraint('id') + ) + op.create_index(op.f('ix_user_usage_logs_id'), 'user_usage_logs', ['id'], unique=False) + op.add_column('users', sa.Column('data_limit_reset_strategy', sa.Enum("no_reset", "day","week", "month", "year", name="userdatalimitresetstrategy"), nullable=False, server_default="no_reset")) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('users', 'data_limit_reset_strategy') + op.drop_index(op.f('ix_user_usage_logs_id'), table_name='user_usage_logs') + op.drop_table('user_usage_logs') + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/d085fae205b6_rename_admin_users_usage_to_used_traffic.py b/app/db/migrations/versions/d085fae205b6_rename_admin_users_usage_to_used_traffic.py new file mode 100644 index 000000000..0f8cac78f --- /dev/null +++ b/app/db/migrations/versions/d085fae205b6_rename_admin_users_usage_to_used_traffic.py @@ -0,0 +1,24 @@ +"""rename admin users usage to used_traffic + +Revision ID: d085fae205b6 +Revises: 9af04c077ede +Create Date: 2025-05-10 18:13:19.235725 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = 'd085fae205b6' +down_revision = '9af04c077ede' +branch_labels = None +depends_on = None + + +def upgrade(): + with op.batch_alter_table('admins') as batch_op: + batch_op.alter_column('users_usage', new_column_name='used_traffic', existing_type=sa.BigInteger) + +def downgrade(): + with op.batch_alter_table('admins') as batch_op: + batch_op.alter_column('used_traffic', new_column_name='users_usage', existing_type=sa.BigInteger) diff --git a/app/db/migrations/versions/d0a3960f5dad_usagelog_table_for_admin.py b/app/db/migrations/versions/d0a3960f5dad_usagelog_table_for_admin.py new file mode 100644 index 000000000..3a66228ca --- /dev/null +++ b/app/db/migrations/versions/d0a3960f5dad_usagelog_table_for_admin.py @@ -0,0 +1,35 @@ +"""UsageLog table for Admin + +Revision ID: d0a3960f5dad +Revises: b25e7e6be241 +Create Date: 2024-11-22 19:56:53.185624 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'd0a3960f5dad' +down_revision = 'b25e7e6be241' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('admin_usage_logs', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('admin_id', sa.Integer(), nullable=True), + sa.Column('used_traffic_at_reset', sa.BigInteger(), nullable=False), + sa.Column('reset_at', sa.DateTime(), nullable=True), + sa.ForeignKeyConstraint(['admin_id'], ['admins.id'], ), + sa.PrimaryKeyConstraint('id') + ) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('admin_usage_logs') + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/d607d3ca5246_change_enumarray_to_string.py b/app/db/migrations/versions/d607d3ca5246_change_enumarray_to_string.py new file mode 100644 index 000000000..88ec8d918 --- /dev/null +++ b/app/db/migrations/versions/d607d3ca5246_change_enumarray_to_string.py @@ -0,0 +1,137 @@ +"""Change EnumArray to String + +Revision ID: d607d3ca5246 +Revises: 04a5ec93e9a5 +Create Date: 2025-07-11 16:21:16.858208 +""" +from alembic import op +import sqlalchemy as sa +import json +from sqlalchemy.dialects import postgresql + +# revision identifiers, used by Alembic. +revision = 'd607d3ca5246' +down_revision = '04a5ec93e9a5' +branch_labels = None +depends_on = None + +user_status = sa.Enum('active', 'disabled', 'limited', 'expired', 'on_hold', name='userstatus') + +def upgrade() -> None: + bind = op.get_bind() + is_postgres = bind.engine.name == 'postgresql' + + op.add_column('hosts', sa.Column('status_new', sa.String(length=60), nullable=True, server_default="")) + connection = op.get_bind() + + if is_postgres: + # Use raw SQL to avoid SQLAlchemy's array parsing issues + result = connection.execute(sa.text("SELECT id, status FROM hosts")) + for row in result: + host_id, status_value = row + if status_value: + try: + # Handle different possible formats + if isinstance(status_value, list): + # Already a list + status_list = status_value + elif isinstance(status_value, str): + # Parse PostgreSQL array format like '{active,disabled}' + if status_value.startswith('{') and status_value.endswith('}'): + # Remove braces and split + status_list = status_value[1:-1].split(',') + else: + # Fallback for other string formats + status_list = [status_value] + else: + # Skip invalid data + continue + + # Clean and join + new_status = ",".join([s.strip('"').strip() for s in status_list if s.strip()]) + connection.execute( + sa.text("UPDATE hosts SET status_new = :status WHERE id = :host_id"), + {"status": new_status, "host_id": host_id} + ) + except Exception as e: + print(f"Warning: Failed to process status for host {host_id}: {e}") + continue + else: + hosts_table = sa.Table('hosts', sa.MetaData(), + sa.Column('id', sa.Integer, primary_key=True), + sa.Column('status', sa.JSON), + sa.Column('status_new', sa.String(60))) + + for host in connection.execute(sa.select(hosts_table.c.id, hosts_table.c.status)): + if host.status: + try: + status_list = host.status + if isinstance(status_list, str): + status_list = json.loads(status_list) + new_status = ",".join([s.strip('"') for s in status_list]) + connection.execute( + hosts_table.update().where(hosts_table.c.id == host.id).values(status_new=new_status) + ) + except Exception as e: + print(f"Warning: Failed to process status for host {host.id}: {e}") + continue + + with op.batch_alter_table('hosts') as batch_op: + batch_op.drop_column('status') + batch_op.alter_column('status_new', new_column_name='status', existing_type=sa.String(60)) + + +def downgrade() -> None: + bind = op.get_bind() + is_postgres = bind.engine.name == 'postgresql' + + if is_postgres: + op.add_column('hosts', sa.Column('status_old', postgresql.ARRAY(user_status), nullable=True, server_default="{}")) + else: + op.add_column('hosts', sa.Column('status_old', sa.JSON(), nullable=True, server_default=sa.text("'[]'"))) + + connection = op.get_bind() + + if is_postgres: + # Use raw SQL for PostgreSQL to avoid type issues + result = connection.execute(sa.text("SELECT id, status FROM hosts")) + for row in result: + host_id, status_value = row + if status_value: + try: + # Split comma-separated string and clean values + cleaned_list = [s.strip().strip('"') for s in status_value.split(',') if s.strip()] + if cleaned_list: + # Format as PostgreSQL array literal + array_literal = "{" + ",".join(cleaned_list) + "}" + # Use string substitution instead of parameter binding for casting + connection.execute( + sa.text(f"UPDATE hosts SET status_old = '{array_literal}'::userstatus[] WHERE id = {host_id}") + ) + except Exception as e: + print(f"Warning: Failed to process status for host {host_id}: {e}") + continue + else: + hosts_table = sa.Table('hosts', sa.MetaData(), + sa.Column('id', sa.Integer, primary_key=True), + sa.Column('status', sa.String(60)), + sa.Column('status_old', sa.JSON)) + + for host in connection.execute(sa.select(hosts_table.c.id, hosts_table.c.status)): + if host.status: + try: + cleaned_list = [s.strip('"') for s in host.status.split(',')] + new_status = json.dumps(cleaned_list) + connection.execute( + hosts_table.update().where(hosts_table.c.id == host.id).values(status_old=new_status) + ) + except Exception as e: + print(f"Warning: Failed to process status for host {host.id}: {e}") + continue + + with op.batch_alter_table('hosts') as batch_op: + batch_op.drop_column('status') + if is_postgres: + batch_op.alter_column('status_old', new_column_name='status', existing_type=postgresql.ARRAY(user_status)) + else: + batch_op.alter_column('status_old', new_column_name='status', existing_type=sa.JSON) \ No newline at end of file diff --git a/app/db/migrations/versions/db68f8d3d40b_move_data_from_proxies_table_to_users_.py b/app/db/migrations/versions/db68f8d3d40b_move_data_from_proxies_table_to_users_.py new file mode 100644 index 000000000..e725d1426 --- /dev/null +++ b/app/db/migrations/versions/db68f8d3d40b_move_data_from_proxies_table_to_users_.py @@ -0,0 +1,73 @@ +"""move data from proxies table to users table + +Revision ID: db68f8d3d40b +Revises: cb99b515fbab +Create Date: 2025-03-17 13:01:23.436120 + +""" +from uuid import uuid4 + +import sqlalchemy as sa +from alembic import op +from sqlalchemy.orm import Session + +from app.db.models import User +from app.utils.system import random_password + +# revision identifiers, used by Alembic. +revision = 'db68f8d3d40b' +down_revision = 'cb99b515fbab' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + bind = op.get_bind() + db = Session(bind=bind) + proxy_table = sa.table( + 'proxies', + sa.column('id', sa.Integer), + sa.column('user_id', sa.Integer), + sa.column('type', sa.String), + sa.column('settings', sa.JSON) + ) + existing_users = set(db.execute(sa.select(User.id)).scalars().all()) + + count_result = db.query(proxy_table).count() + if count_result <= 0: + return + proxies = db.execute( + sa.select( + proxy_table.c.user_id, + proxy_table.c.type, + proxy_table.c.settings + ) + ).fetchall() + user_proxy_map = {} + for user_id, proxy_type, settings in proxies: + if user_id not in user_proxy_map: + user_proxy_map[user_id] = {} + user_proxy_map[user_id][proxy_type.lower()] = settings + + for user_id, proxy in user_proxy_map.items(): + if "vmess" not in proxy: + user_proxy_map[user_id]["vmess"] = {"id": str(uuid4())} + if "vless" not in proxy: + user_proxy_map[user_id]["vless"] = {"id": str(uuid4()), "flow": ""} + if "trojan" not in proxy: + user_proxy_map[user_id]["trojan"] = {"password": random_password()} + if "shadowsocks" not in proxy: + user_proxy_map[user_id]["shadowsocks"] = { + "password": random_password(), "method": "chacha20-ietf-poly1305"} + updates = [ + {'id': user_id, 'proxy_settings': settings} + for user_id, settings in user_proxy_map.items() + if user_id in existing_users + ] + + db.bulk_update_mappings(User, updates) + db.commit() + + +def downgrade() -> None: + pass diff --git a/app/db/migrations/versions/dd725e4d3628_fix_mysql_collations.py b/app/db/migrations/versions/dd725e4d3628_fix_mysql_collations.py new file mode 100644 index 000000000..8c5d03873 --- /dev/null +++ b/app/db/migrations/versions/dd725e4d3628_fix_mysql_collations.py @@ -0,0 +1,130 @@ +"""fix_mysql_collations + +Revision ID: dd725e4d3628 +Revises: 5575fe410515 +Create Date: 2024-02-15 21:13:26.606283 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'dd725e4d3628' +down_revision = '5575fe410515' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + bind = op.get_bind() + metadata = sa.MetaData() + metadata.reflect(bind=bind.engine) + + if bind.engine.name == 'mysql': + + constraints = [] + for table_name, table in metadata.tables.items(): + for constraint in table.foreign_key_constraints: + if ( + isinstance(constraint, sa.sql.schema.ForeignKeyConstraint) + and constraint.referred_table.name == 'inbounds' + ): + for element in constraint.elements: + if element.column.name == 'tag': + constraints.append(constraint) + + op.alter_column('nodes', 'name', type_=sa.String(length=256, collation='utf8mb4_bin'), nullable=True) + op.alter_column('users', 'username', type_=sa.String(length=34, collation='utf8mb4_bin'), nullable=True) + + for cons in constraints: + op.drop_constraint( + cons.name, + cons.table.name, + type_='foreignkey' + ) + + op.alter_column( + 'inbounds', 'tag', + type_=sa.String(length=256, collation='utf8mb4_bin'), + nullable=False + ) + op.alter_column( + 'template_inbounds_association', 'inbound_tag', + type_=sa.String(length=256, collation='utf8mb4_bin'), + nullable=False + ) + op.alter_column( + 'hosts', 'inbound_tag', + type_=sa.String(length=256, collation='utf8mb4_bin'), + nullable=False + ) + op.alter_column( + 'exclude_inbounds_association', 'inbound_tag', + type_=sa.String(length=256, collation='utf8mb4_bin'), + nullable=False + ) + + for cons in constraints: + op.create_foreign_key( + cons.name, + cons.table.name, cons.referred_table.name, + [c.name for c in cons.columns], ['tag'], + ) + + +def downgrade() -> None: + bind = op.get_bind() + metadata = sa.MetaData() + metadata.reflect(bind=bind.engine) + + if bind.engine.name == 'mysql': + + constraints = [] + for table_name, table in metadata.tables.items(): + for constraint in table.foreign_key_constraints: + if ( + isinstance(constraint, sa.sql.schema.ForeignKeyConstraint) + and constraint.referred_table.name == 'inbounds' + ): + for element in constraint.elements: + if element.column.name == 'tag': + constraints.append(constraint) + + op.alter_column('nodes', 'name', type_=sa.String(length=256, collation='utf8mb4_general_ci'), nullable=True) + op.alter_column('users', 'username', type_=sa.String(length=34, collation='utf8mb4_general_ci'), nullable=True) + + for cons in constraints: + op.drop_constraint( + cons.name, + cons.table.name, + type_='foreignkey' + ) + + op.alter_column( + 'inbounds', 'tag', + type_=sa.String(length=256, collation='utf8mb4_general_ci'), + nullable=False + ) + op.alter_column( + 'template_inbounds_association', 'inbound_tag', + type_=sa.String(length=256, collation='utf8mb4_general_ci'), + nullable=False + ) + op.alter_column( + 'hosts', 'inbound_tag', + type_=sa.String(length=256, collation='utf8mb4_general_ci'), + nullable=False + ) + op.alter_column( + 'exclude_inbounds_association', 'inbound_tag', + type_=sa.String(length=256, collation='utf8mb4_general_ci'), + nullable=False + ) + + for cons in constraints: + op.create_foreign_key( + cons.name, + cons.table.name, cons.referred_table.name, + [c.name for c in cons.columns], ['tag'], + ) diff --git a/app/db/migrations/versions/e3f0e888a563_rename_deactive_status_to_disabled.py b/app/db/migrations/versions/e3f0e888a563_rename_deactive_status_to_disabled.py new file mode 100644 index 000000000..bc63fddb5 --- /dev/null +++ b/app/db/migrations/versions/e3f0e888a563_rename_deactive_status_to_disabled.py @@ -0,0 +1,115 @@ +"""rename deactive status to disabled + +Revision ID: e3f0e888a563 +Revises: 51e941ed9018 +Create Date: 2023-03-08 02:03:33.534948 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'e3f0e888a563' +down_revision = '51e941ed9018' +branch_labels = None +depends_on = None + +# Describing of enum +enum_name = "status" +temp_enum_name = f"temp_{enum_name}" +old_values = ('deactive', 'active', 'limited', 'expired') +new_values = ('disabled', 'active', 'limited', 'expired') +downgrade_to = ("disabled", "deactive") # on downgrade convert [0] to [1] +old_type = sa.Enum(*old_values, name=enum_name) +new_type = sa.Enum(*new_values, name=enum_name) +temp_type = sa.Enum(*new_values, name=temp_enum_name) + + +# Describing of table +table_name = "users" +column_name = "status" +temp_table = sa.sql.table( + table_name, + sa.Column( + column_name, + new_type, + nullable=False + ) +) + + +def upgrade(): + # temp type to use instead of old one + temp_type.create(op.get_bind(), checkfirst=False) + + # changing of column type from old enum to new one. + # SQLite will create temp table for this + with op.batch_alter_table(table_name) as batch_op: + batch_op.alter_column( + column_name, + existing_type=old_type, + type_=temp_type, + existing_nullable=False, + postgresql_using=f"{column_name}::text::{temp_enum_name}" + ) + + # remove old enum, create new enum + old_type.drop(op.get_bind(), checkfirst=False) + new_type.create(op.get_bind(), checkfirst=False) + + # changing of column type from temp enum to new one. + # SQLite will create temp table for this + with op.batch_alter_table(table_name) as batch_op: + batch_op.alter_column( + column_name, + existing_type=temp_type, + type_=new_type, + existing_nullable=False, + postgresql_using=f"{column_name}::text::{enum_name}" + ) + + # remove temp enum + temp_type.drop(op.get_bind(), checkfirst=False) + + +def downgrade(): + # old enum don't have new value anymore. + # before downgrading from new enum to old one, + # we should replace new value from new enum with + # somewhat of old values from old enum + op.execute( + temp_table + .update() + .where( + temp_table.c.status == downgrade_to[0] + ) + .values( + status=downgrade_to[1] + ) + ) + + temp_type.create(op.get_bind(), checkfirst=False) + + with op.batch_alter_table(table_name) as batch_op: + batch_op.alter_column( + column_name, + existing_type=new_type, + type_=temp_type, + existing_nullable=False, + postgresql_using=f"{column_name}::text::{temp_enum_name}" + ) + + new_type.drop(op.get_bind(), checkfirst=False) + old_type.create(op.get_bind(), checkfirst=False) + + with op.batch_alter_table(table_name) as batch_op: + batch_op.alter_column( + column_name, + existing_type=temp_type, + type_=old_type, + existing_nullable=False, + postgresql_using=f"{column_name}::text::{enum_name}" + ) + + temp_type.drop(op.get_bind(), checkfirst=False) diff --git a/app/db/migrations/versions/e410e5f15c3f_merge_fad8b1997c3a_a0d3d400ea75.py b/app/db/migrations/versions/e410e5f15c3f_merge_fad8b1997c3a_a0d3d400ea75.py new file mode 100644 index 000000000..2316842f7 --- /dev/null +++ b/app/db/migrations/versions/e410e5f15c3f_merge_fad8b1997c3a_a0d3d400ea75.py @@ -0,0 +1,24 @@ +"""merge fad8b1997c3a & a0d3d400ea75 + +Revision ID: e410e5f15c3f +Revises: fad8b1997c3a, a0d3d400ea75 +Create Date: 2023-03-20 14:06:53.709408 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'e410e5f15c3f' +down_revision = ('fad8b1997c3a', 'a0d3d400ea75') +branch_labels = None +depends_on = None + + +def upgrade() -> None: + pass + + +def downgrade() -> None: + pass diff --git a/app/db/migrations/versions/e422f859847f_refactor_sub_updated_at.py b/app/db/migrations/versions/e422f859847f_refactor_sub_updated_at.py new file mode 100644 index 000000000..ec75a31da --- /dev/null +++ b/app/db/migrations/versions/e422f859847f_refactor_sub_updated_at.py @@ -0,0 +1,60 @@ +"""refactor sub updated at + +Revision ID: e422f859847f +Revises: 343ad7904b19 +Create Date: 2025-07-21 13:09:02.770670 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'e422f859847f' +down_revision = '343ad7904b19' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + user_subscription_updates_table = op.create_table('user_subscription_updates', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user_id', sa.Integer(), nullable=False), + sa.Column('created_at', sa.DateTime(timezone=True), nullable=False), + sa.Column('user_agent', sa.String(length=512), nullable=False), + sa.ForeignKeyConstraint(['user_id'], ['users.id'], ), + sa.PrimaryKeyConstraint('id') + ) + + # Transfer data from users to user_subscription_updates + bind = op.get_bind() + session = sa.orm.Session(bind=bind) + + users_table = sa.Table('users', sa.MetaData(), + sa.Column('id', sa.Integer), + sa.Column('sub_updated_at', sa.DateTime(timezone=True)), + sa.Column('sub_last_user_agent', sa.String(length=512))) + + for user in session.query(users_table).filter(users_table.c.sub_updated_at.isnot(None)): + session.execute( + user_subscription_updates_table.insert().values( + user_id=user.id, + created_at=user.sub_updated_at, + user_agent=user.sub_last_user_agent or "Unknown" + ) + ) + session.commit() + + with op.batch_alter_table("users") as batch_op: + batch_op.drop_column('sub_last_user_agent') + batch_op.drop_column('sub_updated_at') + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('users', sa.Column('sub_updated_at', sa.DATETIME(timezone=True), nullable=True)) + op.add_column('users', sa.Column('sub_last_user_agent', sa.VARCHAR(length=512), nullable=True)) + op.drop_table('user_subscription_updates') + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/e4a86bc8ec7b_node_user_usages.py b/app/db/migrations/versions/e4a86bc8ec7b_node_user_usages.py new file mode 100644 index 000000000..88d69267f --- /dev/null +++ b/app/db/migrations/versions/e4a86bc8ec7b_node_user_usages.py @@ -0,0 +1,39 @@ +"""node_user_usages + +Revision ID: e4a86bc8ec7b +Revises: 37692c1c9715 +Create Date: 2023-05-03 14:45:25.800476 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'e4a86bc8ec7b' +down_revision = '37692c1c9715' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('node_user_usages', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user_username', sa.String(34), nullable=True), + sa.Column('node_id', sa.Integer(), nullable=True), + sa.Column('used_traffic', sa.BigInteger(), nullable=True), + sa.ForeignKeyConstraint(['node_id'], ['nodes.id'], ), + sa.ForeignKeyConstraint(['user_username'], ['users.username'], ), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user_username', 'node_id') + ) + op.create_index(op.f('ix_node_user_usages_id'), 'node_user_usages', ['id'], unique=False) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_index(op.f('ix_node_user_usages_id'), table_name='node_user_usages') + op.drop_table('node_user_usages') + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/e56f1c781e46_fix_on_hold.py b/app/db/migrations/versions/e56f1c781e46_fix_on_hold.py new file mode 100644 index 000000000..3b1ca7b81 --- /dev/null +++ b/app/db/migrations/versions/e56f1c781e46_fix_on_hold.py @@ -0,0 +1,29 @@ +"""Fix on hold + +Revision ID: e56f1c781e46 +Revises: 714f227201a7 +Create Date: 2023-11-03 20:47:52.601783 +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'e56f1c781e46' +down_revision = '714f227201a7' +branch_labels = None +depends_on = None + + +def upgrade(): + op.add_column('users', sa.Column('on_hold_timeout', sa.DateTime)) + op.add_column('users', sa.Column('on_hold_expire_duration', sa.BigInteger(), nullable=True)) + with op.batch_alter_table('users') as batch_op: + batch_op.drop_column('timeout') + + +def downgrade(): + op.add_column('users', sa.Column('timeout', sa.Integer)) + with op.batch_alter_table('users') as batch_op: + batch_op.drop_column('on_hold_timeout') + batch_op.drop_column('on_hold_expire_duration') diff --git a/app/db/migrations/versions/e7b869e999b4_increase_length_of_the_host_and_sni_.py b/app/db/migrations/versions/e7b869e999b4_increase_length_of_the_host_and_sni_.py new file mode 100644 index 000000000..4d55b674b --- /dev/null +++ b/app/db/migrations/versions/e7b869e999b4_increase_length_of_the_host_and_sni_.py @@ -0,0 +1,41 @@ +"""increase length of the host and sni columns + +Revision ID: e7b869e999b4 +Revises: be0c5f840473 +Create Date: 2024-12-12 15:41:55.487859 + +""" +import sqlalchemy as sa +from alembic import op + +# revision identifiers, used by Alembic. +revision = 'e7b869e999b4' +down_revision = 'be0c5f840473' +branch_labels = None +depends_on = None + + +def upgrade(): + # Increase the length of 'sni' and 'host' columns to 1000 + with op.batch_alter_table('hosts') as batch_op: + batch_op.alter_column('host', + existing_type=sa.String(length=256), + type_=sa.String(length=1000), + nullable=True) + batch_op.alter_column('sni', + existing_type=sa.String(length=256), + type_=sa.String(length=1000), + nullable=True) + + +def downgrade(): + # Revert the column lengths back to their original size + with op.batch_alter_table('hosts') as batch_op: + batch_op.alter_column('host', + existing_type=sa.String(length=1000), + type_=sa.String(length=256), + nullable=True) + batch_op.alter_column('sni', + existing_type=sa.String(length=1000), + type_=sa.String(length=256), + nullable=True) diff --git a/app/db/migrations/versions/e91236993f1a_inbounds_table_excluded_inbounds.py b/app/db/migrations/versions/e91236993f1a_inbounds_table_excluded_inbounds.py new file mode 100644 index 000000000..147da30c7 --- /dev/null +++ b/app/db/migrations/versions/e91236993f1a_inbounds_table_excluded_inbounds.py @@ -0,0 +1,41 @@ +"""inbounds table & excluded_inbounds + +Revision ID: e91236993f1a +Revises: 671621870b02 +Create Date: 2023-02-05 23:21:27.828558 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'e91236993f1a' +down_revision = '671621870b02' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('inbounds', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('tag', sa.String(256), nullable=False), + sa.PrimaryKeyConstraint('id') + ) + op.create_index(op.f('ix_inbounds_tag'), 'inbounds', ['tag'], unique=True) + op.create_table('exclude_inbounds_association', + sa.Column('proxy_id', sa.Integer(), nullable=True), + sa.Column('inbound_tag', sa.String(256), nullable=True), + sa.ForeignKeyConstraint(['inbound_tag'], ['inbounds.tag'], ), + sa.ForeignKeyConstraint(['proxy_id'], ['proxies.id'], ) + ) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('exclude_inbounds_association') + op.drop_index(op.f('ix_inbounds_tag'), table_name='inbounds') + op.drop_table('inbounds') + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/eaa9f30f983e_add_headers_and_transports_settings_.py b/app/db/migrations/versions/eaa9f30f983e_add_headers_and_transports_settings_.py new file mode 100644 index 000000000..53f625386 --- /dev/null +++ b/app/db/migrations/versions/eaa9f30f983e_add_headers_and_transports_settings_.py @@ -0,0 +1,32 @@ +"""add headers and transports_settings columns to hosts table + +Revision ID: eaa9f30f983e +Revises: c5c734bd3da2 +Create Date: 2025-02-26 14:20:14.371695 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'eaa9f30f983e' +down_revision = "c5c734bd3da2" +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('hosts', sa.Column('http_headers', sa.JSON(none_as_null=True), nullable=True)) + op.add_column('hosts', sa.Column('transport_settings', sa.JSON(none_as_null=True), nullable=True)) + op.add_column('hosts', sa.Column('mux_settings', sa.JSON(none_as_null=True), nullable=True)) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('hosts', 'mux_settings') + op.drop_column('hosts', 'transport_settings') + op.drop_column('hosts', 'http_headers') + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/ece13c4c6f65_.py b/app/db/migrations/versions/ece13c4c6f65_.py new file mode 100644 index 000000000..8ecb99d48 --- /dev/null +++ b/app/db/migrations/versions/ece13c4c6f65_.py @@ -0,0 +1,24 @@ +"""empty message + +Revision ID: ece13c4c6f65 +Revises: d02dcfbf1517, b3378dc6de01 +Create Date: 2023-02-23 14:55:19.953972 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'ece13c4c6f65' +down_revision = ('d02dcfbf1517', 'b3378dc6de01') +branch_labels = None +depends_on = None + + +def upgrade() -> None: + pass + + +def downgrade() -> None: + pass diff --git a/app/db/migrations/versions/f2b9caa23e16_change_expire_to_datetime.py b/app/db/migrations/versions/f2b9caa23e16_change_expire_to_datetime.py new file mode 100644 index 000000000..b92385a2b --- /dev/null +++ b/app/db/migrations/versions/f2b9caa23e16_change_expire_to_datetime.py @@ -0,0 +1,76 @@ +"""Change expire to DateTime + +Revision ID: f2b9caa23e16 +Revises: 4eb0a0eb835f +Create Date: 2024-12-11 13:34:31.935829 + +""" +from datetime import datetime, timezone + +import sqlalchemy as sa +from alembic import op +from sqlalchemy.orm import Session + +# revision identifiers, used by Alembic. +revision = 'f2b9caa23e16' +down_revision = '4eb0a0eb835f' +branch_labels = None +depends_on = None + + +def upgrade(): + bind = op.get_bind() + session = Session(bind=bind) + + def expire_to_datetime(table: sa.Table): + for row in session.query(table.c.id, table.c.expire).all(): + expire_timestamp = row.expire + expire_datetime = datetime.fromtimestamp(expire_timestamp, tz=timezone.utc) if expire_timestamp else None + + session.execute( + table.update().where(table.c.id == row.id).values(expire_temp=expire_datetime) + ) + + # Add temporary columns with the DateTime data type + op.add_column('users', sa.Column('expire_temp', sa.DateTime(timezone=True), nullable=True)) + try: + with op.batch_alter_table('users') as batch_op: + users_table = sa.Table('users', sa.MetaData(), autoload_with=bind) + expire_to_datetime(users_table) + + batch_op.drop_column('expire') + batch_op.alter_column('expire_temp', new_column_name='expire', existing_type=sa.DateTime) + + session.commit() + finally: + session.close() + +def downgrade(): + bind = op.get_bind() + session = Session(bind=bind) + + def expire_to_integer(table: sa.Table): + for row in session.query(table.c.id, table.c.expire).all(): + expire_datetime = row.expire + expire_timestamp = int(expire_datetime.timestamp()) if expire_datetime else None + + # Update the temporary column + session.execute( + table.update().where(table.c.id == row.id).values(expire_temp=expire_timestamp) + ) + + op.add_column('users', sa.Column('expire_temp', sa.Integer, nullable=True)) + try: + # Add temporary columns with the BigInteger data type + with op.batch_alter_table('users') as batch_op: + # Fetch all rows and update the temporary column + users_table = sa.Table('users', sa.MetaData(), autoload_with=bind) + expire_to_integer(users_table) + + batch_op.drop_column('expire') + batch_op.alter_column('expire_temp', new_column_name='expire', existing_type=sa.Integer) + + session.commit() + finally: + session.close() + \ No newline at end of file diff --git a/app/db/migrations/versions/f44ec4769d5d_fix_alpn_enum.py b/app/db/migrations/versions/f44ec4769d5d_fix_alpn_enum.py new file mode 100644 index 000000000..047537e99 --- /dev/null +++ b/app/db/migrations/versions/f44ec4769d5d_fix_alpn_enum.py @@ -0,0 +1,48 @@ +"""fix alpn enum + +Revision ID: f44ec4769d5d +Revises: 89bcb1419c66 +Create Date: 2025-03-27 13:14:48.350098 + +""" +from alembic import op +import sqlalchemy as sa + +# revision identifiers, used by Alembic. +revision = 'f44ec4769d5d' +down_revision = '89bcb1419c66' +branch_labels = None +depends_on = None + + +old_enum_name = "alpn" +new_enum_name = "proxyhostalpn" +values = ('none', 'h3', 'h2', 'http/1.1', 'h3,h2,http/1.1', 'h3,h2', 'h2,http/1.1') + +new_type = sa.Enum(*values, name=new_enum_name) + + +def upgrade(): + bind = op.get_bind() + + try: + new_type.drop(bind, checkfirst=False) + except Exception: + pass + + if bind.dialect.name == "postgresql": + # Rename the ENUM type directly in PostgreSQL + op.execute(f"ALTER TYPE {old_enum_name} RENAME TO {new_enum_name};") + else: + # For SQLite/MySQL: No-op (ENUM name is irrelevant) + pass + +def downgrade(): + bind = op.get_bind() + + if bind.dialect.name == "postgresql": + # Reverse the rename + op.execute(f"ALTER TYPE {new_enum_name} RENAME TO {old_enum_name};") + else: + # For SQLite/MySQL: No-op + pass \ No newline at end of file diff --git a/app/db/migrations/versions/fad8b1997c3a_case_insensitive_username.py b/app/db/migrations/versions/fad8b1997c3a_case_insensitive_username.py new file mode 100644 index 000000000..b634bef84 --- /dev/null +++ b/app/db/migrations/versions/fad8b1997c3a_case_insensitive_username.py @@ -0,0 +1,85 @@ +"""case insensitive username + +Revision ID: fad8b1997c3a +Revises: 5b84d88804a1 +Create Date: 2023-03-17 22:46:32.833004 + +""" + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.sql import func, select, update + +# revision identifiers, used by Alembic. +revision = 'fad8b1997c3a' +down_revision = '5b84d88804a1' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + bind = op.get_bind() + + if bind.engine.name == 'mysql': + # MySQL is case-insensitive by default, no action needed + pass + + elif bind.engine.name == 'sqlite': + # Drop the existing index + op.drop_index('ix_users_username', table_name='users') + + # Define the 'users' table for SQLAlchemy Core operations + users_table = sa.Table( + 'users', + sa.MetaData(), + sa.Column('id', sa.Integer, primary_key=True), + sa.Column('username', sa.String(34, collation='NOCASE')) + ) + + # Identify and resolve duplicate usernames with a case-insensitive check + connection = op.get_bind() + + while True: + # Use SQLAlchemy Core to find duplicates with COLLATE NOCASE + duplicate_query = ( + select(users_table.c.username, func.count()) + .group_by(users_table.c.username.collate("NOCASE")) + .having(func.count() > 1) + ) + duplicates = connection.execute(duplicate_query).fetchall() + + if not duplicates: + break # No duplicates, exit the loop + + # Resolve duplicates + for username, count in duplicates: + # Update rows with duplicate usernames + update_stmt = ( + update(users_table) + .where(users_table.c.username == username) + .values(username=f"{username}_{count}") + ) + connection.execute(update_stmt) + + # Alter column to enforce case-insensitivity + with op.batch_alter_table('users') as batch_op: + batch_op.alter_column('username', type_=sa.String(length=34, collation='NOCASE')) + + # Recreate the unique index + op.create_index(op.f('ix_users_username'), 'users', ['username'], unique=True) + + +def downgrade() -> None: + bind = op.get_bind() + + if bind.engine.name == 'mysql': + pass # MySQL remains unchanged + + elif bind.engine.name == 'sqlite': + # Revert the column alteration + with op.batch_alter_table('users') as batch_op: + batch_op.alter_column('username', type_=sa.String(length=34)) + + # Drop and recreate the index without case-insensitivity + op.drop_index('ix_users_username', table_name='users') + op.create_index(op.f('ix_users_username'), 'users', ['username'], unique=True) diff --git a/app/db/migrations/versions/fbfc49f01004_drop_fire_on_either_column.py b/app/db/migrations/versions/fbfc49f01004_drop_fire_on_either_column.py new file mode 100644 index 000000000..2902acb80 --- /dev/null +++ b/app/db/migrations/versions/fbfc49f01004_drop_fire_on_either_column.py @@ -0,0 +1,28 @@ +"""drop fire_on_either column + +Revision ID: fbfc49f01004 +Revises: cf67676aaf82 +Create Date: 2025-05-26 12:32:37.431078 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'fbfc49f01004' +down_revision = 'cf67676aaf82' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('next_plans', 'fire_on_either') + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('next_plans', sa.Column('fire_on_either', sa.BOOLEAN(), server_default=sa.text("'0'"), nullable=False)) + # ### end Alembic commands ### diff --git a/app/db/migrations/versions/fc01b1520e72_add_node_usages.py b/app/db/migrations/versions/fc01b1520e72_add_node_usages.py new file mode 100644 index 000000000..2b3f58335 --- /dev/null +++ b/app/db/migrations/versions/fc01b1520e72_add_node_usages.py @@ -0,0 +1,73 @@ +"""add node usages + +Revision ID: fc01b1520e72 +Revises: c106bb40c861 +Create Date: 2023-05-07 12:08:23.331402 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'fc01b1520e72' +down_revision = 'c106bb40c861' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('node_usages', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('created_at', sa.DateTime(), nullable=False), + sa.Column('node_id', sa.Integer(), nullable=True), + sa.Column('uplink', sa.BigInteger(), nullable=True), + sa.Column('downlink', sa.BigInteger(), nullable=True), + sa.ForeignKeyConstraint(['node_id'], ['nodes.id'], ), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('created_at', 'node_id') + ) + op.create_index(op.f('ix_node_usages_id'), 'node_usages', ['id'], unique=False) + # op.add_column('node_user_usages', sa.Column('created_at', sa.DateTime(), nullable=False)) + # op.create_unique_constraint(None, 'node_user_usages', ['created_at', 'user_id', 'node_id']) + # ### end Alembic commands ### + + # manual + op.drop_table('node_user_usages') + op.create_table('node_user_usages', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('created_at', sa.DateTime(), nullable=False), + sa.Column('user_id', sa.Integer(), nullable=True), + sa.Column('node_id', sa.Integer(), nullable=True), + sa.Column('used_traffic', sa.BigInteger(), nullable=True), + sa.ForeignKeyConstraint(['node_id'], ['nodes.id'], ), + sa.ForeignKeyConstraint(['user_id'], ['users.id'], ), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('created_at', 'user_id', 'node_id') + ) + op.create_index(op.f('ix_node_user_usages_id'), 'node_user_usages', ['id'], unique=False) + + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + # op.drop_constraint(None, 'node_user_usages', type_='unique') + # op.drop_column('node_user_usages', 'created_at') + op.drop_index(op.f('ix_node_usages_id'), table_name='node_usages') + op.drop_table('node_usages') + # ### end Alembic commands ### + + # manual + op.drop_table('node_user_usages') + op.create_table('node_user_usages', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('user_username', sa.String(34), nullable=True), + sa.Column('node_id', sa.Integer(), nullable=True), + sa.Column('used_traffic', sa.BigInteger(), nullable=True), + sa.ForeignKeyConstraint(['node_id'], ['nodes.id'], ), + sa.ForeignKeyConstraint(['user_username'], ['users.username'], ), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('user_username', 'node_id') + ) + op.create_index(op.f('ix_node_user_usages_id'), 'node_user_usages', ['id'], unique=False) diff --git a/app/db/migrations/versions/fe7796f840a4_remove_certficiate_from_nodes.py b/app/db/migrations/versions/fe7796f840a4_remove_certficiate_from_nodes.py new file mode 100644 index 000000000..2da2d3bee --- /dev/null +++ b/app/db/migrations/versions/fe7796f840a4_remove_certficiate_from_nodes.py @@ -0,0 +1,28 @@ +"""remove certficiate from nodes + +Revision ID: fe7796f840a4 +Revises: 7a0dbb8a2f65 +Create Date: 2023-10-25 15:38:32.121840 + +""" +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import mysql + +# revision identifiers, used by Alembic. +revision = 'fe7796f840a4' +down_revision = '7a0dbb8a2f65' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + with op.batch_alter_table('nodes') as batch_op: + batch_op.drop_column('certificate') + + +def downgrade() -> None: + with op.batch_alter_table('nodes') as batch_op: + batch_op.add_column(sa.Column( + 'certificate', mysql.VARCHAR(length=2048), + nullable=False, server_default='')) diff --git a/app/db/models.py b/app/db/models.py new file mode 100644 index 000000000..d4b3b8440 --- /dev/null +++ b/app/db/models.py @@ -0,0 +1,616 @@ +import os +from datetime import datetime as dt, timezone as tz +from enum import Enum +from typing import Any, Dict, List, Optional + +from sqlalchemy import ( + JSON, + BigInteger, + Column, + DateTime, + Enum as SQLEnum, + Float, + ForeignKey, + String, + Table, + UniqueConstraint, + and_, + case, + event, + func, + or_, +) +from sqlalchemy.ext.hybrid import hybrid_property +from sqlalchemy.orm import Mapped, mapped_column, relationship +from sqlalchemy.sql.expression import select, text + +from app.db.base import Base +from app.db.compiles_types import CaseSensitiveString, DaysDiff, EnumArray, StringArray + +inbounds_groups_association = Table( + "inbounds_groups_association", + Base.metadata, + Column("inbound_id", ForeignKey("inbounds.id"), primary_key=True), + Column("group_id", ForeignKey("groups.id"), primary_key=True), +) + +users_groups_association = Table( + "users_groups_association", + Base.metadata, + Column("user_id", ForeignKey("users.id"), primary_key=True), + Column("groups_id", ForeignKey("groups.id"), primary_key=True), +) + + +class Admin(Base): + __tablename__ = "admins" + + id: Mapped[int] = mapped_column(primary_key=True, init=False) + created_at: Mapped[dt] = mapped_column(DateTime(timezone=True), default_factory=lambda: dt.now(tz.utc), init=False) + username: Mapped[str] = mapped_column(String(34), unique=True, index=True) + hashed_password: Mapped[str] = mapped_column(String(128)) + users: Mapped[List["User"]] = relationship(back_populates="admin", init=False, default_factory=list) + usage_logs: Mapped[List["AdminUsageLogs"]] = relationship( + back_populates="admin", init=False, default_factory=list, cascade="all, delete-orphan" + ) + is_sudo: Mapped[bool] = mapped_column(default=False) + password_reset_at: Mapped[Optional[dt]] = mapped_column(DateTime(timezone=True), default=None) + telegram_id: Mapped[Optional[int]] = mapped_column(BigInteger, default=None) + discord_webhook: Mapped[Optional[str]] = mapped_column(String(1024), default=None) + discord_id: Mapped[Optional[int]] = mapped_column(BigInteger, default=None) + used_traffic: Mapped[int] = mapped_column(BigInteger, default=0) + is_disabled: Mapped[bool] = mapped_column(server_default="0", default=False) + sub_template: Mapped[Optional[str]] = mapped_column(String(1024), default=None) + sub_domain: Mapped[Optional[str]] = mapped_column(String(256), default=None) + profile_title: Mapped[Optional[str]] = mapped_column(String(512), default=None) + support_url: Mapped[Optional[str]] = mapped_column(String(1024), default=None) + + @hybrid_property + def reseted_usage(self) -> int: + return int(sum([log.used_traffic_at_reset for log in self.usage_logs])) + + @reseted_usage.expression + def reseted_usage(cls): + return ( + select(func.sum(AdminUsageLogs.used_traffic_at_reset)) + .where(AdminUsageLogs.admin_id == cls.id) + .label("reseted_usage") + ) + + @property + def lifetime_used_traffic(self) -> int: + return self.reseted_usage + self.used_traffic + + @property + def total_users(self) -> int: + return len(self.users) + + +class AdminUsageLogs(Base): + __tablename__ = "admin_usage_logs" + + id: Mapped[int] = mapped_column(primary_key=True, init=False) + admin_id: Mapped[int] = mapped_column(ForeignKey("admins.id")) + admin: Mapped["Admin"] = relationship(back_populates="usage_logs", init=False) + used_traffic_at_reset: Mapped[int] = mapped_column(BigInteger, nullable=False) + reset_at: Mapped[dt] = mapped_column(DateTime(timezone=True), default=lambda: dt.now(tz.utc), init=False) + + +class ReminderType(str, Enum): + expiration_date = "expiration_date" + data_usage = "data_usage" + + +class UserStatus(str, Enum): + active = "active" + disabled = "disabled" + limited = "limited" + expired = "expired" + on_hold = "on_hold" + + +class UserDataLimitResetStrategy(str, Enum): + no_reset = "no_reset" + day = "day" + week = "week" + month = "month" + year = "year" + + +class User(Base): + __tablename__ = "users" + + id: Mapped[int] = mapped_column(primary_key=True, init=False) + created_at: Mapped[dt] = mapped_column(DateTime(timezone=True), default_factory=lambda: dt.now(tz.utc), init=False) + username: Mapped[str] = mapped_column(CaseSensitiveString(128), unique=True, index=True) + node_usages: Mapped[List["NodeUserUsage"]] = relationship( + back_populates="user", cascade="all, delete-orphan", init=False, + ) + notification_reminders: Mapped[List["NotificationReminder"]] = relationship( + back_populates="user", cascade="all, delete-orphan", init=False + ) + subscription_updates: Mapped[List["UserSubscriptionUpdate"]] = relationship( + back_populates="user", cascade="all, delete-orphan", init=False + ) + usage_logs: Mapped[List["UserUsageResetLogs"]] = relationship(back_populates="user", init=False) + admin: Mapped["Admin"] = relationship(back_populates="users", init=False) + next_plan: Mapped[Optional["NextPlan"]] = relationship( + uselist=False, back_populates="user", cascade="all, delete-orphan", init=False + ) + groups: Mapped[List["Group"]] = relationship(secondary=users_groups_association, back_populates="users", init=False) + proxy_settings: Mapped[Dict[str, Any]] = mapped_column(JSON(True), server_default=text("'{}'"), default=lambda: {}) + status: Mapped[UserStatus] = mapped_column(SQLEnum(UserStatus), default=UserStatus.active) + used_traffic: Mapped[int] = mapped_column(BigInteger, default=0) + data_limit: Mapped[Optional[int]] = mapped_column(BigInteger, default=None) + data_limit_reset_strategy: Mapped[UserDataLimitResetStrategy] = mapped_column( + SQLEnum(UserDataLimitResetStrategy), + default=UserDataLimitResetStrategy.no_reset, + ) + _expire: Mapped[Optional[dt]] = mapped_column("expire", DateTime(timezone=True), default=None, init=False) + admin_id: Mapped[Optional[int]] = mapped_column(ForeignKey("admins.id"), default=None) + sub_revoked_at: Mapped[Optional[dt]] = mapped_column(DateTime(timezone=True), default=None) + note: Mapped[Optional[str]] = mapped_column(String(500), default=None) + online_at: Mapped[Optional[dt]] = mapped_column(DateTime(timezone=True), default=None) + on_hold_expire_duration: Mapped[Optional[int]] = mapped_column(BigInteger, default=None) + on_hold_timeout: Mapped[Optional[dt]] = mapped_column(DateTime(timezone=True), default=None) + auto_delete_in_days: Mapped[Optional[int]] = mapped_column(default=None) + edit_at: Mapped[Optional[dt]] = mapped_column(DateTime(timezone=True), default=None) + last_status_change: Mapped[Optional[dt]] = mapped_column(DateTime(timezone=True), default=None) + + @hybrid_property + def expire(self) -> Optional[dt]: + if self._expire and self._expire.tzinfo is None: + return self._expire.replace(tzinfo=tz.utc) + return self._expire + + @expire.inplace.expression + def expire(cls): + return cls._expire + + @expire.setter + def expire(self, value: Optional[dt]): + self._expire = value + + @hybrid_property + def reseted_usage(self) -> int: + return int(sum([log.used_traffic_at_reset for log in self.usage_logs])) + + @reseted_usage.expression + def reseted_usage(cls): + return ( + select(func.sum(UserUsageResetLogs.used_traffic_at_reset)) + .where(UserUsageResetLogs.user_id == cls.id) + .label("reseted_usage") + ) + + @property + def lifetime_used_traffic(self) -> int: + return int(sum([log.used_traffic_at_reset for log in self.usage_logs]) + self.used_traffic) + + @property + def last_traffic_reset_time(self): + return self.usage_logs[-1].reset_at if self.usage_logs else self.created_at + + async def inbounds(self) -> list[str]: + """Returns a flat list of all included inbound tags across all proxies""" + included_tags = set() + for group in self.groups: + if group.is_disabled: + continue + + await group.awaitable_attrs.inbounds + for inbound in group.inbound_tags: + included_tags.add(inbound) + return list(included_tags) + + @property + def group_ids(self): + return [group.id for group in self.groups] + + @property + def group_names(self): + return [group.name for group in self.groups] + + @hybrid_property + def is_expired(self) -> bool: + return self.expire is not None and self.expire <= dt.now(tz.utc) + + @is_expired.expression + def is_expired(cls): + return and_(cls.expire.isnot(None), cls.expire <= func.current_timestamp()) + + @hybrid_property + def is_limited(self) -> bool: + return self.data_limit is not None and self.data_limit > 0 and self.data_limit <= self.used_traffic + + @is_limited.expression + def is_limited(cls): + return and_(cls.data_limit.isnot(None), cls.data_limit > 0, cls.data_limit <= cls.used_traffic) + + @hybrid_property + def become_online(self) -> bool: + now = dt.now(tz.utc) + + # Check if online_at is set and greater than or equal to base time + if self.online_at: + base_time = (self.edit_at or self.created_at).replace(tzinfo=tz.utc) + return self.online_at.replace(tzinfo=tz.utc) >= base_time + + # Check if on_hold_timeout has passed + if self.on_hold_timeout and self.on_hold_timeout.replace(tzinfo=tz.utc) <= now: + return True + + return False + + @become_online.expression + def become_online(cls): + now = func.current_timestamp() + base_time = case((cls.edit_at.isnot(None), cls.edit_at), else_=cls.created_at) + + return or_( + # online_at condition + and_(cls.online_at.isnot(None), cls.online_at >= base_time), + # on_hold_timeout condition + and_(cls.online_at.is_(None), cls.on_hold_timeout.isnot(None), cls.on_hold_timeout <= now), + ) + + @hybrid_property + def usage_percentage(self) -> float: + if not self.data_limit or self.data_limit == 0: + return 0.0 + return (self.used_traffic * 100) / self.data_limit + + @usage_percentage.expression + def usage_percentage(cls): + return case( + (and_(cls.data_limit.isnot(None), cls.data_limit > 0), (cls.used_traffic * 100.0) / cls.data_limit), + else_=0.0, + ) + + @hybrid_property + def days_left(self) -> int: + if not self.expire: + return 0 + remaining_days = (self.expire.replace(tzinfo=tz.utc) - dt.now(tz.utc)).days + return max(remaining_days, 0) + + @days_left.expression + def days_left(cls): + return case((cls.expire.isnot(None), func.floor(DaysDiff())), else_=0) + + +class UserSubscriptionUpdate(Base): + __tablename__ = "user_subscription_updates" + + id: Mapped[int] = mapped_column(primary_key=True, init=False) + user_id: Mapped[int] = mapped_column(ForeignKey("users.id")) + user: Mapped["User"] = relationship(back_populates="subscription_updates", init=False) + created_at: Mapped[dt] = mapped_column(DateTime(timezone=True), default_factory=lambda: dt.now(tz.utc), init=False) + user_agent: Mapped[str] = mapped_column(String(512)) + + +template_group_association = Table( + "template_group_association", + Base.metadata, + Column("user_template_id", ForeignKey("user_templates.id")), + Column("group_id", ForeignKey("groups.id")), +) + + +class NextPlan(Base): + __tablename__ = "next_plans" + + id: Mapped[int] = mapped_column(primary_key=True, init=False) + user_id: Mapped[int] = mapped_column(ForeignKey("users.id")) + user_template_id: Mapped[Optional[int]] = mapped_column(ForeignKey("user_templates.id")) + user: Mapped["User"] = relationship(back_populates="next_plan", init=False) + user_template: Mapped[Optional["UserTemplate"]] = relationship(back_populates="next_plans", init=False) + data_limit: Mapped[int] = mapped_column(BigInteger, default=0) + expire: Mapped[Optional[int]] = mapped_column(default=None) + add_remaining_traffic: Mapped[bool] = mapped_column(default=False, server_default="0") + + +class UserStatusCreate(str, Enum): + active = "active" + on_hold = "on_hold" + + +class UserTemplate(Base): + __tablename__ = "user_templates" + + id: Mapped[int] = mapped_column(primary_key=True, init=False) + name: Mapped[str] = mapped_column(String(64), unique=True) + username_prefix: Mapped[Optional[str]] = mapped_column(String(20)) + username_suffix: Mapped[Optional[str]] = mapped_column(String(20)) + extra_settings: Mapped[Optional[Dict]] = mapped_column(JSON(True)) + next_plans: Mapped[List["NextPlan"]] = relationship( + back_populates="user_template", cascade="all, delete-orphan", init=False + ) + groups: Mapped[List["Group"]] = relationship(secondary=template_group_association, back_populates="templates") + data_limit: Mapped[int] = mapped_column(BigInteger, default=0) + expire_duration: Mapped[int] = mapped_column(BigInteger, default=0) # in seconds + on_hold_timeout: Mapped[Optional[int]] = mapped_column(default=None) + status: Mapped[UserStatusCreate] = mapped_column(SQLEnum(UserStatusCreate), default=UserStatusCreate.active) + reset_usages: Mapped[bool] = mapped_column(default=False, server_default="0") + data_limit_reset_strategy: Mapped[UserDataLimitResetStrategy] = mapped_column( + SQLEnum(UserDataLimitResetStrategy), + default=UserDataLimitResetStrategy.no_reset, + server_default="no_reset", + ) + is_disabled: Mapped[bool] = mapped_column(server_default="0", default=False) + + @property + def group_ids(self): + return [group.id for group in self.groups] + + +class UserUsageResetLogs(Base): + __tablename__ = "user_usage_logs" + + id: Mapped[int] = mapped_column(primary_key=True, init=False) + user_id: Mapped[Optional[int]] = mapped_column(ForeignKey("users.id"), nullable=True) + user: Mapped["User"] = relationship(back_populates="usage_logs", init=False) + used_traffic_at_reset: Mapped[int] = mapped_column(BigInteger, nullable=False) + reset_at: Mapped[dt] = mapped_column(DateTime(timezone=True), default=lambda: dt.now(tz.utc), init=False) + + +class ProxyInbound(Base): + __tablename__ = "inbounds" + + id: Mapped[int] = mapped_column(primary_key=True, init=False) + tag: Mapped[str] = mapped_column(String(256), unique=True, index=True) + hosts: Mapped[List["ProxyHost"]] = relationship(back_populates="inbound", init=False) + groups: Mapped[List["Group"]] = relationship( + secondary=inbounds_groups_association, back_populates="inbounds", init=False + ) + + +@event.listens_for(ProxyInbound, "after_delete") +def delete_association_rows(mapper, connection, target): + connection.execute( + inbounds_groups_association.delete().where(inbounds_groups_association.c.inbound_id == target.id) + ) + + +class ProxyHostSecurity(str, Enum): + inbound_default = "inbound_default" + none = "none" + tls = "tls" + + +class ProxyHostALPN(str, Enum): + h1 = "http/1.1" + h2 = "h2" + h3 = "h3" + + +ProxyHostFingerprint = Enum( + "ProxyHostFingerprint", + { + "none": "", + "chrome": "chrome", + "firefox": "firefox", + "safari": "safari", + "ios": "ios", + "android": "android", + "edge": "edge", + "360": "360", + "qq": "qq", + "random": "random", + "randomized": "randomized", + "randomizednoalpn": "randomizednoalpn", + "unsafe": "unsafe", + }, +) + + +class ProxyHost(Base): + __tablename__ = "hosts" + + id: Mapped[int] = mapped_column(primary_key=True, init=False) + remark: Mapped[str] = mapped_column(String(256), unique=False, nullable=False) + port: Mapped[Optional[int]] = mapped_column(nullable=True) + path: Mapped[Optional[str]] = mapped_column(String(256), unique=False, nullable=True) + priority: Mapped[int] = mapped_column(nullable=False) + allowinsecure: Mapped[Optional[bool]] = mapped_column(nullable=True) + address: Mapped[set[str]] = mapped_column(StringArray(256), default_factory=set, unique=False, nullable=False) + sni: Mapped[Optional[set[str]]] = mapped_column(StringArray(1000), default_factory=set, unique=False, nullable=True) + host: Mapped[Optional[set[str]]] = mapped_column( + StringArray(1000), default_factory=set, unique=False, nullable=True + ) + inbound_tag: Mapped[Optional[str]] = mapped_column( + String(256), ForeignKey("inbounds.tag", ondelete="SET NULL", onupdate="CASCADE"), nullable=True, init=False + ) + inbound: Mapped[Optional["ProxyInbound"]] = relationship(back_populates="hosts", init=False) + security: Mapped[ProxyHostSecurity] = mapped_column( + SQLEnum(ProxyHostSecurity), + unique=False, + default=ProxyHostSecurity.inbound_default, + ) + alpn: Mapped[Optional[list[ProxyHostALPN]]] = mapped_column(EnumArray(ProxyHostALPN, 14), default=list) + fingerprint: Mapped[ProxyHostFingerprint] = mapped_column( + SQLEnum(ProxyHostFingerprint), + unique=False, + default=ProxyHostSecurity.none, + server_default=ProxyHostSecurity.none.name, + ) + is_disabled: Mapped[Optional[bool]] = mapped_column(default=False) + fragment_settings: Mapped[Optional[Dict[str, Any]]] = mapped_column(JSON(none_as_null=True), default=None) + noise_settings: Mapped[Optional[Dict[str, Any]]] = mapped_column(JSON(none_as_null=True), default=None) + random_user_agent: Mapped[bool] = mapped_column(default=False, server_default="0") + use_sni_as_host: Mapped[bool] = mapped_column(default=False, server_default="0") + http_headers: Mapped[Optional[Dict[str, Any]]] = mapped_column(JSON(none_as_null=True), default=None) + transport_settings: Mapped[Optional[Dict[str, Any]]] = mapped_column(JSON(none_as_null=True), default=None) + mux_settings: Mapped[Optional[Dict[str, Any]]] = mapped_column(JSON(none_as_null=True), default=None) + status: Mapped[Optional[list[UserStatus]]] = mapped_column( + EnumArray(UserStatus, 60), default=list, server_default="" + ) + ech_config_list: Mapped[Optional[str]] = mapped_column(String(512), default=None) + + +class System(Base): + __tablename__ = "system" + + id: Mapped[int] = mapped_column(primary_key=True, init=False) + uplink: Mapped[int] = mapped_column(BigInteger, default=0) + downlink: Mapped[int] = mapped_column(BigInteger, default=0) + + +class JWT(Base): + __tablename__ = "jwt" + + id: Mapped[int] = mapped_column(primary_key=True, init=False) + secret_key: Mapped[str] = mapped_column(String(64), default=lambda: os.urandom(32).hex()) + + +class NodeConnectionType(str, Enum): + grpc = "grpc" + rest = "rest" + + +class NodeStatus(str, Enum): + connected = "connected" + connecting = "connecting" + error = "error" + disabled = "disabled" + + +class Node(Base): + __tablename__ = "nodes" + + id: Mapped[int] = mapped_column(primary_key=True, init=False) + created_at: Mapped[dt] = mapped_column(DateTime(timezone=True), default_factory=lambda: dt.now(tz.utc), init=False) + name: Mapped[str] = mapped_column(CaseSensitiveString(256), unique=True) + address: Mapped[str] = mapped_column(String(256), unique=False, nullable=False) + port: Mapped[int] = mapped_column(unique=False, nullable=False) + xray_version: Mapped[Optional[str]] = mapped_column(String(32), nullable=True, init=False) + message: Mapped[Optional[str]] = mapped_column(String(1024), nullable=True, init=False) + server_ca: Mapped[str] = mapped_column(String(2048), nullable=False) + api_key: Mapped[str | None] = mapped_column(String(36)) + node_version: Mapped[Optional[str]] = mapped_column(String(32), nullable=True, init=False) + core_config_id: Mapped[Optional[int]] = mapped_column( + ForeignKey("core_configs.id", ondelete="SET NULL"), nullable=True + ) + user_usages: Mapped[List["NodeUserUsage"]] = relationship( + back_populates="node", cascade="all, delete-orphan", init=False + ) + usages: Mapped[List["NodeUsage"]] = relationship(back_populates="node", cascade="all, delete-orphan", init=False) + core_config: Mapped[Optional["CoreConfig"]] = relationship("CoreConfig", init=False) + stats: Mapped[List["NodeStat"]] = relationship(back_populates="node", cascade="all, delete-orphan", init=False) + status: Mapped[NodeStatus] = mapped_column(SQLEnum(NodeStatus), default=NodeStatus.connecting) + last_status_change: Mapped[Optional[dt]] = mapped_column(DateTime(timezone=True), init=False) + uplink: Mapped[int] = mapped_column(BigInteger, default=0) + downlink: Mapped[int] = mapped_column(BigInteger, default=0) + usage_coefficient: Mapped[float] = mapped_column(Float, server_default=text("1.0"), default=1) + connection_type: Mapped[NodeConnectionType] = mapped_column( + SQLEnum(NodeConnectionType), + unique=False, + default=NodeConnectionType.grpc, + server_default=NodeConnectionType.grpc.name, + ) + keep_alive: Mapped[int] = mapped_column(unique=False, default=0) + max_logs: Mapped[int] = mapped_column(BigInteger, unique=False, default=1000, server_default=text("1000")) + gather_logs: Mapped[bool] = mapped_column(default=True, server_default="1") + + +class NodeUserUsage(Base): + __tablename__ = "node_user_usages" + __table_args__ = (UniqueConstraint("created_at", "user_id", "node_id"),) + + id: Mapped[int] = mapped_column(primary_key=True, init=False) + created_at: Mapped[dt] = mapped_column(DateTime(timezone=True), unique=False) # one hour per record + user_id: Mapped[int] = mapped_column(ForeignKey("users.id")) + user: Mapped["User"] = relationship(back_populates="node_usages", init=False) + node_id: Mapped[Optional[int]] = mapped_column(ForeignKey("nodes.id")) + node: Mapped["Node"] = relationship(back_populates="user_usages", init=False) + used_traffic: Mapped[int] = mapped_column(BigInteger, default=0) + + +class NodeUsage(Base): + __tablename__ = "node_usages" + __table_args__ = (UniqueConstraint("created_at", "node_id"),) + + id: Mapped[int] = mapped_column(primary_key=True, init=False) + created_at: Mapped[dt] = mapped_column(DateTime(timezone=True), unique=False) # one hour per record + node_id: Mapped[Optional[int]] = mapped_column(ForeignKey("nodes.id")) + node: Mapped["Node"] = relationship(back_populates="usages", init=False) + uplink: Mapped[int] = mapped_column(BigInteger, default=0) + downlink: Mapped[int] = mapped_column(BigInteger, default=0) + + +class NotificationReminder(Base): + __tablename__ = "notification_reminders" + + id: Mapped[int] = mapped_column(primary_key=True, init=False) + created_at: Mapped[dt] = mapped_column(DateTime(timezone=True), default_factory=lambda: dt.now(tz.utc), init=False) + user_id: Mapped[int] = mapped_column(ForeignKey("users.id")) + user: Mapped["User"] = relationship(back_populates="notification_reminders", init=False) + type: Mapped[ReminderType] = mapped_column(SQLEnum(ReminderType)) + threshold: Mapped[Optional[int]] = mapped_column(default=None) + expires_at: Mapped[Optional[dt]] = mapped_column(DateTime(timezone=True), default=None) + + +class Group(Base): + __tablename__ = "groups" + + id: Mapped[int] = mapped_column(primary_key=True, init=False) + name: Mapped[str] = mapped_column(String(64)) + users: Mapped[List["User"]] = relationship(secondary=users_groups_association, back_populates="groups", init=False) + inbounds: Mapped[List["ProxyInbound"]] = relationship( + secondary=inbounds_groups_association, back_populates="groups" + ) + templates: Mapped[List["UserTemplate"]] = relationship( + secondary=template_group_association, back_populates="groups", init=False + ) + is_disabled: Mapped[bool] = mapped_column(server_default="0", default=False) + + @property + def inbound_ids(self): + return [inbound.id for inbound in self.inbounds] + + @property + def inbound_tags(self): + return [inbound.tag for inbound in self.inbounds] + + @property + def total_users(self): + return len(self.users) + + +class CoreConfig(Base): + __tablename__ = "core_configs" + + id: Mapped[int] = mapped_column(primary_key=True, init=False) + created_at: Mapped[dt] = mapped_column(DateTime(timezone=True), default_factory=lambda: dt.now(tz.utc), init=False) + name: Mapped[str] = mapped_column(String(256)) + config: Mapped[Dict[str, Any]] = mapped_column(JSON(False)) + exclude_inbound_tags: Mapped[Optional[set[str]]] = mapped_column(StringArray(2048), default_factory=set) + fallbacks_inbound_tags: Mapped[Optional[set[str]]] = mapped_column(StringArray(2048), default_factory=set) + + +class NodeStat(Base): + __tablename__ = "node_stats" + + id: Mapped[int] = mapped_column(primary_key=True, init=False) + created_at: Mapped[dt] = mapped_column(DateTime(timezone=True), default_factory=lambda: dt.now(tz.utc), init=False) + node_id: Mapped[int] = mapped_column(ForeignKey("nodes.id")) + node: Mapped["Node"] = relationship(back_populates="stats", init=False) + mem_total: Mapped[int] = mapped_column(BigInteger, unique=False, nullable=False) + mem_used: Mapped[int] = mapped_column(BigInteger, unique=False, nullable=False) + cpu_cores: Mapped[int] = mapped_column(unique=False, nullable=False) + cpu_usage: Mapped[float] = mapped_column(unique=False, nullable=False) + incoming_bandwidth_speed: Mapped[int] = mapped_column(BigInteger, unique=False, nullable=False) + outgoing_bandwidth_speed: Mapped[int] = mapped_column(BigInteger, unique=False, nullable=False) + + +class Settings(Base): + __tablename__ = "settings" + + id: Mapped[int] = mapped_column(primary_key=True, init=False) + telegram: Mapped[dict] = mapped_column(JSON()) + discord: Mapped[dict] = mapped_column(JSON()) + webhook: Mapped[dict] = mapped_column(JSON()) + notification_settings: Mapped[dict] = mapped_column(JSON()) + notification_enable: Mapped[dict] = mapped_column(JSON()) + subscription: Mapped[dict] = mapped_column(JSON()) + general: Mapped[dict] = mapped_column(JSON()) diff --git a/app/jobs/__init__.py b/app/jobs/__init__.py new file mode 100644 index 000000000..bc7f1935d --- /dev/null +++ b/app/jobs/__init__.py @@ -0,0 +1,13 @@ +import glob +import importlib.util +from os.path import basename, dirname, join + +modules = glob.glob(join(dirname(__file__), "*.py")) + +for file in modules: + name = basename(file).replace(".py", "") + if name.startswith("_"): + continue + + spec = importlib.util.spec_from_file_location(name, file) + spec.loader.exec_module(importlib.util.module_from_spec(spec)) diff --git a/app/jobs/cleanup_subscription_updates.py b/app/jobs/cleanup_subscription_updates.py new file mode 100644 index 000000000..c657fe5c2 --- /dev/null +++ b/app/jobs/cleanup_subscription_updates.py @@ -0,0 +1,81 @@ +from sqlalchemy import func, select, delete + +from app import scheduler +from app.db import GetDB +from app.db.base import DATABASE_DIALECT +from app.db.models import UserSubscriptionUpdate +from app.utils.logger import get_logger +from config import USER_SUBSCRIPTION_CLIENTS_LIMIT, JOB_CLEANUP_SUBSCRIPTION_UPDATES_INTERVAL + +logger = get_logger("jobs") + + +async def cleanup_user_subscription_updates(): + """Clean up excess user subscription updates.""" + + async with GetDB() as db: + # First query: Find users that have more than the limit + users_with_excess = await db.execute( + select(UserSubscriptionUpdate.user_id) + .group_by(UserSubscriptionUpdate.user_id) + .having(func.count(UserSubscriptionUpdate.id) > USER_SUBSCRIPTION_CLIENTS_LIMIT) + ) + user_ids = [row.user_id for row in users_with_excess] + + if not user_ids: + logger.info("No users with excess subscription updates") + return + + # Second query: Use different approaches based on database type + if DATABASE_DIALECT == "mysql": + # MySQL/MariaDB: Use correlated subquery without LIMIT + total_deleted = 0 + for user_id in user_ids: + # Get IDs to keep (most recent N records) + keep_ids_result = await db.execute( + select(UserSubscriptionUpdate.id) + .where(UserSubscriptionUpdate.user_id == user_id) + .order_by(UserSubscriptionUpdate.created_at.desc()) + .limit(USER_SUBSCRIPTION_CLIENTS_LIMIT) + ) + keep_ids = [row.id for row in keep_ids_result] + + if keep_ids: + # Delete records not in keep list + result = await db.execute( + delete(UserSubscriptionUpdate).where( + UserSubscriptionUpdate.user_id == user_id, UserSubscriptionUpdate.id.not_in(keep_ids) + ) + ) + total_deleted += result.rowcount + + logger.info(f"Cleaned up {total_deleted} old subscription updates") + else: + # SQLite and PostgreSQL: Use original approach with LIMIT in subquery + sub = UserSubscriptionUpdate.__table__.alias("sub") + + keep_subquery = ( + select(sub.c.id) + .where(sub.c.user_id == UserSubscriptionUpdate.user_id) + .order_by(sub.c.created_at.desc()) + .limit(USER_SUBSCRIPTION_CLIENTS_LIMIT) + ) + + result = await db.execute( + delete(UserSubscriptionUpdate).where( + UserSubscriptionUpdate.user_id.in_(user_ids), UserSubscriptionUpdate.id.not_in(keep_subquery) + ) + ) + logger.info(f"Cleaned up {result.rowcount} old subscription updates") + + await db.commit() + + +if USER_SUBSCRIPTION_CLIENTS_LIMIT and USER_SUBSCRIPTION_CLIENTS_LIMIT >= 0: + # Schedule the cleanup job to run every few minutes + scheduler.add_job( + cleanup_user_subscription_updates, + "interval", + seconds=JOB_CLEANUP_SUBSCRIPTION_UPDATES_INTERVAL, + max_instances=1, + ) diff --git a/app/jobs/dependencies.py b/app/jobs/dependencies.py new file mode 100644 index 000000000..992d74668 --- /dev/null +++ b/app/jobs/dependencies.py @@ -0,0 +1,3 @@ +from app.models.admin import AdminDetails + +SYSTEM_ADMIN = AdminDetails(username="system", is_sudo=True) diff --git a/app/jobs/inboud.py b/app/jobs/inboud.py new file mode 100644 index 000000000..ba6b15d53 --- /dev/null +++ b/app/jobs/inboud.py @@ -0,0 +1,26 @@ +from app import scheduler +from app.db import GetDB +from app.db.crud.host import get_inbounds_not_in_tags, remove_inbounds +from app.core.manager import core_manager +from app.utils.logger import get_logger +from config import JOB_REMOVE_OLD_INBOUNDS_INTERVAL + + +logger = get_logger("jobs") + + +async def remove_old_inbounds(): + in_use_inbounds = await core_manager.get_inbounds() + + async with GetDB() as db: + old_inbounds = await get_inbounds_not_in_tags(db, in_use_inbounds) + + await remove_inbounds(db, old_inbounds) + + for inbound in old_inbounds: + logger.info(f"inbound {inbound.tag} removed.") + + +scheduler.add_job( + remove_old_inbounds, "interval", seconds=JOB_REMOVE_OLD_INBOUNDS_INTERVAL, coalesce=True, max_instances=1 +) diff --git a/app/jobs/node_checker.py b/app/jobs/node_checker.py new file mode 100644 index 000000000..8fe847f6c --- /dev/null +++ b/app/jobs/node_checker.py @@ -0,0 +1,101 @@ +import asyncio + +from PasarGuardNodeBridge import NodeAPIError, PasarGuardNode, Health + +from app import on_shutdown, on_startup, scheduler +from app.db import GetDB +from app.db.models import Node, NodeStatus +from app.db.crud.node import get_nodes +from app.node import node_manager +from app.utils.logger import get_logger +from app.operation.node import NodeOperation +from app.operation import OperatorType + +from config import JOB_CORE_HEALTH_CHECK_INTERVAL + + +node_operator = NodeOperation(operator_type=OperatorType.SYSTEM) +logger = get_logger("node-checker") + + +async def node_health_check(): + async def check_node(id: int, node: PasarGuardNode): + try: + await node.get_backend_stats(timeout=8) + + await node_operator.update_node_status( + id, NodeStatus.connected, await node.core_version(), await node.node_version() + ) + except NodeAPIError as e: + if e.code > -3: + await node_operator.update_node_status(id, NodeStatus.error, err=e.detail) + if e.code > 0: + await node_operator.connect_node(node_id=id) + + async def check_health(db_node: Node, node: PasarGuardNode): + if node is None: + return + try: + health = await asyncio.wait_for(node.get_health(), timeout=10) + except (asyncio.TimeoutError, NodeAPIError): + await node_operator.update_node_status(db_node.id, NodeStatus.error, err="Get health timeout") + + if db_node.status in (NodeStatus.connecting, NodeStatus.error) and health is Health.HEALTHY: + await node_operator.update_node_status(db_node.id, NodeStatus.connected) + + elif db_node.status in (NodeStatus.connecting, NodeStatus.error) and health in ( + Health.NOT_CONNECTED, + Health.BROKEN, + ): + await node_operator.connect_node(node_id=db_node.id) + + elif db_node.status == NodeStatus.connected and health is not Health.HEALTHY: + await check_node(db_node.id, node) + + async with GetDB() as db: + db_nodes = await get_nodes(db=db, enabled=True) + dict_nodes = await node_manager.get_nodes() + + check_tasks = [check_health(db_node, dict_nodes[db_node.id]) for db_node in db_nodes] + await asyncio.gather(*check_tasks, return_exceptions=True) + + +@on_startup +async def initialize_nodes(): + logger.info("Starting main and nodes' cores...") + + async with GetDB() as db: + db_nodes = await get_nodes(db=db, enabled=True) + + async def start_node(node: Node): + try: + await node_manager.update_node(node) + except NodeAPIError as e: + await node_operator.update_node_status(node.id, NodeStatus.error, err=e.detail) + return + + await node_operator.connect_node(node_id=node.id) + + start_tasks = [start_node(node=db_node) for db_node in db_nodes] + + await asyncio.gather(*start_tasks) + + logger.info("All nodes' cores have been started.") + + scheduler.add_job( + node_health_check, "interval", seconds=JOB_CORE_HEALTH_CHECK_INTERVAL, coalesce=True, max_instances=1 + ) + + +@on_shutdown +async def shutdown_nodes(): + logger.info("Stopping nodes' cores...") + + nodes: dict[int, PasarGuardNode] = await node_manager.get_nodes() + + stop_tasks = [node.stop() for node in nodes.values()] + + # Run all tasks concurrently and wait for them to complete + await asyncio.gather(*stop_tasks, return_exceptions=True) + + logger.info("All nodes' cores have been stopped.") diff --git a/app/jobs/node_stats.py b/app/jobs/node_stats.py new file mode 100644 index 000000000..17aef86e7 --- /dev/null +++ b/app/jobs/node_stats.py @@ -0,0 +1,52 @@ +import asyncio + +from PasarGuardNodeBridge import PasarGuardNode + +from app import scheduler +from app.db import GetDB +from app.db.models import NodeStat +from app.node import node_manager +from app.utils.logger import get_logger +from config import ENABLE_RECORDING_NODES_STATS, JOB_GHATER_NODES_STATS_INTERVAL + + +logger = get_logger("jobs") + + +async def get_stat(id: int, node: PasarGuardNode) -> NodeStat: + try: + stats = await node.get_system_stats() + except Exception: + return + + if not stats: + return + + return NodeStat( + node_id=id, + mem_total=stats.mem_total, + mem_used=stats.mem_used, + cpu_cores=stats.cpu_cores, + cpu_usage=stats.cpu_usage, + incoming_bandwidth_speed=stats.incoming_bandwidth_speed, + outgoing_bandwidth_speed=stats.outgoing_bandwidth_speed, + ) + + +async def gather_nodes_stats(): + nodes = await node_manager.get_healthy_nodes() + + stats_list = await asyncio.gather(*[get_stat(id, node) for id, node in nodes]) + + valid_stats = [stat for stat in stats_list if stat is not None] + + if valid_stats: + async with GetDB() as db: + db.add_all(valid_stats) + await db.commit() + + +if ENABLE_RECORDING_NODES_STATS: + scheduler.add_job( + gather_nodes_stats, "interval", seconds=JOB_GHATER_NODES_STATS_INTERVAL, coalesce=True, max_instances=1 + ) diff --git a/app/jobs/record_usages.py b/app/jobs/record_usages.py new file mode 100644 index 000000000..eb066f8d6 --- /dev/null +++ b/app/jobs/record_usages.py @@ -0,0 +1,305 @@ +import asyncio +from collections import defaultdict +from datetime import datetime as dt, timezone as tz +from operator import attrgetter + +from PasarGuardNodeBridge import PasarGuardNode, NodeAPIError +from PasarGuardNodeBridge.common.service_pb2 import StatType +from sqlalchemy import and_, bindparam, insert, select, update +from sqlalchemy.exc import DatabaseError, OperationalError +from sqlalchemy.sql.expression import Insert + +from app import scheduler +from app.db import AsyncSession, GetDB +from app.db.models import Admin, NodeUsage, NodeUserUsage, System, User +from app.node import node_manager as node_manager +from app.utils.logger import get_logger +from config import ( + DISABLE_RECORDING_NODE_USAGE, + JOB_RECORD_NODE_USAGES_INTERVAL, + JOB_RECORD_USER_USAGES_INTERVAL, +) + +logger = get_logger("record-usages") + + +async def safe_execute(db: AsyncSession, stmt, params=None, max_retries: int = 3): + """ + Safely execute database operations with deadlock and connection handling. + + Args: + db (AsyncSession): Async database session + stmt: SQLAlchemy statement to execute + params (list[dict], optional): Parameters for the statement + max_retries (int, optional): Maximum number of retry attempts + """ + dialect = db.bind.dialect.name + + # MySQL-specific IGNORE prefix + if dialect == "mysql" and isinstance(stmt, Insert): + stmt = stmt.prefix_with("IGNORE") + + for attempt in range(max_retries): + try: + await (await db.connection()).execute(stmt, params) + await db.commit() + return + except (OperationalError, DatabaseError) as err: + # Rollback the session + await db.rollback() + + # Specific error code handling + if dialect == "mysql": + # MySQL deadlock (Error 1213) + if err.orig.args[0] == 1213 and attempt < max_retries - 1: + continue + elif dialect == "postgresql": + # PostgreSQL deadlock (Error 40P01) + if err.orig.code == "40P01" and attempt < max_retries - 1: + continue + elif dialect == "sqlite": + # SQLite database locked error + if "database is locked" in str(err) and attempt < max_retries - 1: + await asyncio.sleep(0.1 * (attempt + 1)) # Exponential backoff + continue + + # If we've exhausted retries or it's not a retriable error, raise + raise + + +async def record_user_stats(params: list[dict], node_id: int, usage_coefficient: int = 1): + """ + Record user statistics for a specific node. + + Args: + params (list[dict]): User statistic parameters + node_id (int): Node identifier + usage_coefficient (int, optional): usage multiplier + """ + if not params: + return + + created_at = dt.now(tz.utc).replace(minute=0, second=0, microsecond=0) + + async with GetDB() as db: + # Find existing user entries for this node and time + select_stmt = select(NodeUserUsage.user_id).where( + and_(NodeUserUsage.node_id == node_id, NodeUserUsage.created_at == created_at) + ) + existing_users = set((await db.execute(select_stmt)).scalars().all()) + + # Prepare new user entries + new_users = [{"uid": int(p["uid"])} for p in params if int(p["uid"]) not in existing_users] + + # Insert missing user entries + if new_users: + insert_stmt = insert(NodeUserUsage).values( + user_id=bindparam("uid"), created_at=created_at, node_id=node_id, used_traffic=0 + ) + await safe_execute(db, insert_stmt, new_users) + + # Update user traffic - ensure uid is converted to int + update_params = [{"uid": int(p["uid"]), "value": p["value"]} for p in params] + update_stmt = ( + update(NodeUserUsage) + .values(used_traffic=NodeUserUsage.used_traffic + bindparam("value") * usage_coefficient) + .where( + and_( + NodeUserUsage.user_id == bindparam("uid"), + NodeUserUsage.node_id == node_id, + NodeUserUsage.created_at == created_at, + ) + ) + ) + await safe_execute(db, update_stmt, update_params) + + +async def record_node_stats(params: dict, node_id: int): + """ + Record node-level statistics. + + Args: + params (Dict): Node statistic parameters + node_id (int): Node identifier + """ + if not params: + return + + created_at = dt.now(tz.utc).replace(minute=0, second=0, microsecond=0) + + async with GetDB() as db: + # Check if node usage entry exists + select_stmt = select(NodeUsage.node_id).where( + and_(NodeUsage.node_id == node_id, NodeUsage.created_at == created_at) + ) + result = await db.execute(select_stmt) + node_exists = result.scalar() is not None # Correctly check if row exists + + # Insert node usage entry if not exists + if not node_exists: + insert_stmt = insert(NodeUsage).values(created_at=created_at, node_id=node_id, uplink=0, downlink=0) + await safe_execute(db, insert_stmt) + + # Update node usage + update_stmt = ( + update(NodeUsage) + .values(uplink=NodeUsage.uplink + bindparam("up"), downlink=NodeUsage.downlink + bindparam("down")) + .where(and_(NodeUsage.node_id == node_id, NodeUsage.created_at == created_at)) + ) + await safe_execute(db, update_stmt, params) + + +async def get_users_stats(node: PasarGuardNode): + try: + stats_respons = await node.get_stats(stat_type=StatType.UsersStat, reset=True, timeout=30) + params = defaultdict(int) + for stat in filter(attrgetter("value"), stats_respons.stats): + params[stat.name.split(".", 1)[0]] += stat.value + params = list({"uid": int(uid), "value": value} for uid, value in params.items()) + return params + except NodeAPIError as e: + logger.error("Failed to get outbounds stats, error: %s", e.detail) + return [] + except Exception as e: + logger.error("Failed to get outbounds stats, unknown error: %s", e) + return [] + + +async def get_outbounds_stats(node: PasarGuardNode): + try: + stats_respons = await node.get_stats(stat_type=StatType.Outbounds, reset=True, timeout=10) + params = [ + {"up": stat.value, "down": 0} if stat.link == "uplink" else {"up": 0, "down": stat.value} + for stat in filter(attrgetter("value"), stats_respons.stats) + ] + return params + except NodeAPIError as e: + logger.error("Failed to get outbounds stats, error: %s", e.detail) + return [] + except Exception as e: + logger.error("Failed to get outbounds stats, unknown error: %s", e) + return [] + + +async def calculate_admin_usage(users_usage: list) -> dict: + if not users_usage: + return {} + + # Get unique user IDs from users_usage + uids = {int(user_usage["uid"]) for user_usage in users_usage} + + async with GetDB() as db: + # Query only relevant users' admin IDs + stmt = select(User.id, User.admin_id).where(User.id.in_(uids)) + result = await db.execute(stmt) + user_admin_pairs = result.fetchall() + + user_admin_map = {uid: admin_id for uid, admin_id in user_admin_pairs} + + admin_usage = defaultdict(int) + for user_usage in users_usage: + admin_id = user_admin_map.get(int(user_usage["uid"])) + if admin_id: + admin_usage[admin_id] += user_usage["value"] + + return admin_usage + + +async def calculate_users_usage(api_params: dict, usage_coefficient: dict) -> list: + """Calculate aggregated user usage across all nodes with coefficients applied""" + users_usage = defaultdict(int) + + # Process all node data in a single pass + for node_id, params in api_params.items(): + coeff = usage_coefficient.get(node_id, 1) + # Use generator to avoid intermediate lists + node_usage = ((int(param["uid"]), int(param["value"] * coeff)) for param in params) + for uid, value in node_usage: + users_usage[uid] += value + + return [{"uid": uid, "value": value} for uid, value in users_usage.items()] + + +async def record_user_usages(): + nodes: tuple[int, PasarGuardNode] = await node_manager.get_healthy_nodes() + + node_data = await asyncio.gather(*[asyncio.create_task(node.get_extra()) for _, node in nodes]) + usage_coefficient = {node_id: data.get("usage_coefficient", 1) for (node_id, _), data in zip(nodes, node_data)} + + stats_tasks = [asyncio.create_task(get_users_stats(node)) for _, node in nodes] + await asyncio.gather(*stats_tasks) + + api_params = {nodes[i][0]: task.result() for i, task in enumerate(stats_tasks)} + + users_usage = await calculate_users_usage(api_params, usage_coefficient) + if not users_usage: + return + + async with GetDB() as db: + user_stmt = ( + update(User) + .where(User.id == bindparam("uid")) + .values(used_traffic=User.used_traffic + bindparam("value"), online_at=dt.now(tz.utc)) + .execution_options(synchronize_session=False) + ) + await safe_execute(db, user_stmt, users_usage) + + admin_usage = await calculate_admin_usage(users_usage) + if admin_usage: + admin_data = [{"admin_id": aid, "value": val} for aid, val in admin_usage.items()] + admin_stmt = ( + update(Admin) + .where(Admin.id == bindparam("admin_id")) + .values(used_traffic=Admin.used_traffic + bindparam("value")) + .execution_options(synchronize_session=False) + ) + await safe_execute(db, admin_stmt, admin_data) + + if DISABLE_RECORDING_NODE_USAGE: + return + + record_tasks = [ + asyncio.create_task( + record_user_stats(params=api_params[node_id], node_id=node_id, usage_coefficient=usage_coefficient[node_id]) + ) + for node_id in api_params + ] + await asyncio.gather(*record_tasks) + + +async def record_node_usages(): + # Create tasks for all nodes + tasks = { + node_id: asyncio.create_task(get_outbounds_stats(node)) + for node_id, node in await node_manager.get_healthy_nodes() + } + + await asyncio.gather(*tasks.values()) + + api_params = {node_id: task.result() for node_id, task in tasks.items()} + + total_up = sum(sum(param["up"] for param in params) for params in api_params.values()) + total_down = sum(sum(param["down"] for param in params) for params in api_params.values()) + + if not (total_up or total_down): + return + + async with GetDB() as db: + system_update_stmt = update(System).values( + uplink=System.uplink + total_up, downlink=System.downlink + total_down + ) + await safe_execute(db, system_update_stmt) + + if DISABLE_RECORDING_NODE_USAGE: + return + + record_tasks = [asyncio.create_task(record_node_stats(params, node_id)) for node_id, params in api_params.items()] + await asyncio.gather(*record_tasks) + + +scheduler.add_job( + record_user_usages, "interval", seconds=JOB_RECORD_USER_USAGES_INTERVAL, coalesce=True, max_instances=1 +) +scheduler.add_job( + record_node_usages, "interval", seconds=JOB_RECORD_NODE_USAGES_INTERVAL, coalesce=True, max_instances=1 +) diff --git a/app/jobs/remove_expired_users.py b/app/jobs/remove_expired_users.py new file mode 100644 index 000000000..2e177549a --- /dev/null +++ b/app/jobs/remove_expired_users.py @@ -0,0 +1,26 @@ +import asyncio + +from app import scheduler +from app.db import GetDB +from app.db.crud.user import autodelete_expired_users +from app import notification +from app.jobs.dependencies import SYSTEM_ADMIN +from app.utils.logger import get_logger +from config import USER_AUTODELETE_INCLUDE_LIMITED_ACCOUNTS, JOB_REMOVE_EXPIRED_USERS_INTERVAL + + +logger = get_logger("jobs") + + +async def remove_expired_users(): + async with GetDB() as db: + deleted_users = await autodelete_expired_users(db, USER_AUTODELETE_INCLUDE_LIMITED_ACCOUNTS) + + for user in deleted_users: + asyncio.create_task(notification.remove_user(user=user, by=SYSTEM_ADMIN)) + logger.info(f"User `{user.username}` has been deleted due to expiration.") + + +scheduler.add_job( + remove_expired_users, "interval", coalesce=True, seconds=JOB_REMOVE_EXPIRED_USERS_INTERVAL, max_instances=1 +) diff --git a/app/jobs/reset_user_data_usage.py b/app/jobs/reset_user_data_usage.py new file mode 100644 index 000000000..4a3b705d2 --- /dev/null +++ b/app/jobs/reset_user_data_usage.py @@ -0,0 +1,47 @@ +import asyncio +from datetime import datetime as dt, timedelta as td, timezone as tz + +from app import scheduler +from app.db import GetDB +from app.db.models import UserStatus +from app.db.crud.user import get_users_to_reset_data_usage, bulk_reset_user_data_usage +from app.models.user import UserNotificationResponse +from app import notification +from app.core.manager import core_manager +from app.node import node_manager +from app.jobs.dependencies import SYSTEM_ADMIN +from app.utils.logger import get_logger +from config import JOB_RESET_USER_DATA_USAGE_INTERVAL + +logger = get_logger("jobs") + + +async def reset_data_usage(): + async with GetDB() as db: + users = await get_users_to_reset_data_usage(db) + old_statuses = {user.id: user.status for user in users} + + updated_users = await bulk_reset_user_data_usage(db, users) + + for db_user in updated_users: + user = UserNotificationResponse.model_validate(db_user) + asyncio.create_task(notification.reset_user_data_usage(user, SYSTEM_ADMIN)) + + if old_statuses.get(user.id) != user.status: + asyncio.create_task(notification.user_status_change(user, SYSTEM_ADMIN)) + + # make user active if limited on usage reset + if user.status == UserStatus.active: + asyncio.create_task(node_manager.update_user(user=user, inbounds=await core_manager.get_inbounds())) + + logger.info(f'User data usage reset for User "{user.username}"') + + +scheduler.add_job( + reset_data_usage, + "interval", + seconds=JOB_RESET_USER_DATA_USAGE_INTERVAL, + coalesce=True, + start_date=dt.now(tz.utc) + td(minutes=1), + max_instances=1, +) diff --git a/app/jobs/review_users.py b/app/jobs/review_users.py new file mode 100644 index 000000000..769dc510a --- /dev/null +++ b/app/jobs/review_users.py @@ -0,0 +1,203 @@ +import asyncio +from datetime import datetime as dt, timedelta as td, timezone as tz + +from sqlalchemy.ext.asyncio import AsyncSession + +from app import notification, scheduler +from app.db import GetDB +from app.db.models import User, UserStatus, ReminderType +from app.db.crud.user import ( + get_active_to_expire_users, + get_active_to_limited_users, + get_days_left_reached_users, + get_on_hold_to_active_users, + get_usage_percentage_reached_users, + reset_user_by_next, + start_users_expire, + update_users_status, + bulk_create_notification_reminders, +) +from app.jobs.dependencies import SYSTEM_ADMIN +from app.models.settings import Webhook +from app.models.user import UserNotificationResponse +from app.node import node_manager as node_manager +from app.settings import webhook_settings +from app.utils.logger import get_logger +from config import JOB_REVIEW_USERS_INTERVAL + +logger = get_logger("review-users") + + +async def reset_user_by_next_report(db: AsyncSession, db_user: User): + db_user = await reset_user_by_next(db, db_user) + inbounds = await db_user.inbounds() + user = UserNotificationResponse.model_validate(db_user) + + await node_manager.update_user(user, inbounds) + asyncio.create_task(notification.user_data_reset_by_next(user, SYSTEM_ADMIN)) + + logger.info(f'User "{db_user.username}" next plan activated') + + +async def change_status(db: AsyncSession, db_user: User, status: UserStatus): + user = UserNotificationResponse.model_validate(db_user) + if user.status is not UserStatus.active: + await node_manager.remove_user(user) + asyncio.create_task(notification.user_status_change(user, SYSTEM_ADMIN)) + + logger.info(f'User "{db_user.username}" status changed to {status.value}') + + if db_user.next_plan and db_user.status is not UserStatus.active: + await reset_user_by_next_report(db, db_user) + + +async def expire_users_job(): + async with GetDB() as db: + if expired_users := await get_active_to_expire_users(db): + updated_users = await update_users_status(db, expired_users, UserStatus.expired) + for user in updated_users: + await change_status(db, user, UserStatus.expired) + + +async def limit_users_job(): + async with GetDB() as db: + if limited_users := await get_active_to_limited_users(db): + updated_users = await update_users_status(db, limited_users, UserStatus.limited) + for user in updated_users: + await change_status(db, user, UserStatus.limited) + + +async def on_hold_to_active_users_job(): + async with GetDB() as db: + if on_hold_users := await get_on_hold_to_active_users(db): + updated_users = await start_users_expire(db, on_hold_users) + for user in updated_users: + await change_status(db, user, UserStatus.active) + + +async def usage_percent_notification_job(): + settings: Webhook = await webhook_settings() + if not settings.enable: + return + async with GetDB() as db: + for percent in settings.usage_percent: + users = await get_usage_percentage_reached_users(db, percent) + + # Prepare webhook notifications first + webhook_tasks = [] + reminder_data = [] + + for user in users: + usage_percentage = user.usage_percentage + user_model = UserNotificationResponse.model_validate(user) + + # Queue webhook notification + webhook_tasks.append( + notification.wh.notify( + notification.wh.ReachedUsagePercent( + username=user_model.username, user=user_model, used_percent=usage_percentage + ) + ) + ) + + # Prepare reminder data for bulk insert + reminder_data.append( + { + "user_id": user.id, + "type": ReminderType.data_usage, + "threshold": percent, + "expires_at": user.expire if user.expire else None, + } + ) + + # Send webhooks first + if webhook_tasks: + await asyncio.gather(*webhook_tasks, return_exceptions=True) + + # Bulk create notification reminders + if reminder_data: + await bulk_create_notification_reminders(db, reminder_data) + + +async def days_left_notification_job(): + settings: Webhook = await webhook_settings() + if not settings.enable: + return + async with GetDB() as db: + for days in settings.days_left: + users = await get_days_left_reached_users(db, days) + + # Prepare webhook notifications first + webhook_tasks = [] + reminder_data = [] + + for user in users: + days_left = user.days_left + user_model = UserNotificationResponse.model_validate(user) + + # Queue webhook notification + webhook_tasks.append( + notification.wh.notify( + notification.wh.ReachedDaysLeft( + username=user_model.username, user=user_model, days_left=days_left + ) + ) + ) + + # Prepare reminder data for bulk insert + reminder_data.append( + { + "user_id": user.id, + "type": ReminderType.expiration_date, + "threshold": days, + "expires_at": user.expire, + } + ) + # Bulk create notification reminders + if reminder_data: + await bulk_create_notification_reminders(db, reminder_data) + + # Send webhooks first + if webhook_tasks: + await asyncio.gather(*webhook_tasks, return_exceptions=True) + + +now = dt.now(tz.utc) +interval = int(JOB_REVIEW_USERS_INTERVAL / 5) + +# Register each job separately +scheduler.add_job( + expire_users_job, "interval", seconds=JOB_REVIEW_USERS_INTERVAL, coalesce=True, max_instances=1, start_date=now +) +scheduler.add_job( + limit_users_job, + "interval", + seconds=JOB_REVIEW_USERS_INTERVAL, + coalesce=True, + max_instances=1, + start_date=now + td(seconds=interval), +) +scheduler.add_job( + on_hold_to_active_users_job, + "interval", + seconds=JOB_REVIEW_USERS_INTERVAL, + coalesce=True, + max_instances=1, + start_date=now + td(seconds=interval * 2), +) +scheduler.add_job( + usage_percent_notification_job, + "interval", + seconds=JOB_REVIEW_USERS_INTERVAL, + coalesce=True, + max_instances=1, + start_date=now + td(seconds=interval * 3), +) +scheduler.add_job( + days_left_notification_job, + "interval", + seconds=JOB_REVIEW_USERS_INTERVAL, + coalesce=True, + max_instances=1, + start_date=now + td(seconds=interval * 4), +) diff --git a/app/jobs/send_notifications.py b/app/jobs/send_notifications.py new file mode 100644 index 000000000..03e55f2ef --- /dev/null +++ b/app/jobs/send_notifications.py @@ -0,0 +1,115 @@ +import asyncio +from datetime import datetime as dt, timezone as tz, timedelta as td + +import httpx +from sqlalchemy import delete +from fastapi.encoders import jsonable_encoder + +from app import on_shutdown, scheduler +from app.db import GetDB +from app.db.models import NotificationReminder +from app.models.settings import Webhook +from app.settings import webhook_settings +from app.notification.webhook import queue +from app.utils.logger import get_logger +from config import JOB_SEND_NOTIFICATIONS_INTERVAL + +logger = get_logger("send-notification") + + +async def send_to_all_webhooks(client, notification, webhooks): + """ + Send the notification to all webhooks concurrently. + Returns True if at least one webhook succeeds. + """ + + async def send_one(webhook): + webhook_headers = {"x-webhook-secret": webhook.secret} if webhook.secret else None + try: + r = await client.post(webhook.url, json=jsonable_encoder(notification), headers=webhook_headers) + if r.status_code in [200, 201, 202, 204]: + return True + else: + logger.error(f"Webhook {webhook.url} failed: {r.status_code} - {r.text}") + except Exception as err: + logger.error(f"Webhook {webhook.url} exception: {err}") + return False + + results = await asyncio.gather(*(send_one(webhook) for webhook in webhooks)) + return any(results) + + +async def send_notifications(): + settings: Webhook = await webhook_settings() + if not settings.enable: + return + + logger.debug("Processing notifications batch") + + processed = 0 + failed_to_requeue = [] + current_time = dt.now(tz.utc).timestamp() + + try: + async with httpx.AsyncClient(http2=True, timeout=httpx.Timeout(10), proxy=settings.proxy_url) as client: + while True: + try: + notification = queue.get_nowait() + except asyncio.QueueEmpty: + break + + try: + if notification.tries >= settings.recurrent: + continue + + if notification.send_at > current_time: + failed_to_requeue.append(notification) + continue + + # Send to all webhooks in settings + success = await send_to_all_webhooks(client, notification, settings.webhooks) + + if not success: + notification.tries += 1 + if notification.tries < settings.recurrent: + notification.send_at = current_time + settings.timeout + failed_to_requeue.append(notification) + + processed += 1 + + except Exception: + failed_to_requeue.append(notification) + + finally: + # Don't requeue failed items if webhook disabled + if not settings.enable: + return + + # Requeue failed items at the end + for notif in failed_to_requeue: + await queue.put(notif) + + if processed or failed_to_requeue: + logger.debug(f"Processed {processed} notifications, requeued {len(failed_to_requeue)}") + + +async def delete_expired_reminders() -> None: + async with GetDB() as db: + # Get current UTC time and convert to naive datetime + now_utc = dt.now(tz=tz.utc) + now_naive = now_utc.replace(tzinfo=None) + + result = await db.execute(delete(NotificationReminder).where(NotificationReminder.expires_at < now_naive)) + logger.info(f"Cleaned up {result.rowcount} expired reminders") + + +async def send_pending_notifications_before_shutdown(): + logger.info("Webhook final flush before shutdown") + await send_notifications() + + +scheduler.add_job( + send_notifications, "interval", seconds=JOB_SEND_NOTIFICATIONS_INTERVAL, max_instances=1, coalesce=True +) +scheduler.add_job(delete_expired_reminders, "interval", hours=6, start_date=dt.now(tz.utc) + td(minutes=5)) +on_shutdown(send_pending_notifications_before_shutdown) diff --git a/app/models/admin.py b/app/models/admin.py new file mode 100644 index 000000000..168fd264c --- /dev/null +++ b/app/models/admin.py @@ -0,0 +1,99 @@ +from passlib.context import CryptContext +from pydantic import BaseModel, ConfigDict, field_validator + +from .validators import DiscordValidator, NumericValidatorMixin, PasswordValidator + +pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") + + +class Token(BaseModel): + access_token: str + token_type: str = "bearer" + + +class AdminBase(BaseModel): + """Minimal admin model containing only the username.""" + + username: str + + model_config = ConfigDict(from_attributes=True) + + +class AdminContactInfo(AdminBase): + """Base model containing the core admin identification fields.""" + + username: str + telegram_id: int | None = None + discord_webhook: str | None = None + sub_domain: str | None = None + + model_config = ConfigDict(from_attributes=True) + + +class AdminDetails(AdminContactInfo): + """Complete admin model with all fields for database representation and API responses.""" + + id: int | None = None + is_sudo: bool + total_users: int = 0 + used_traffic: int = 0 + is_disabled: bool = False + discord_id: int | None = None + sub_template: str | None = None + profile_title: str | None = None + support_url: str | None = None + lifetime_used_traffic: int | None = None + + model_config = ConfigDict(from_attributes=True) + + @field_validator("used_traffic", mode="before") + def cast_to_int(cls, v): + return NumericValidatorMixin.cast_to_int(v) + + +class AdminModify(BaseModel): + password: str | None = None + is_sudo: bool + telegram_id: int | None = None + discord_webhook: str | None = None + discord_id: int | None = None + is_disabled: bool | None = None + sub_template: str | None = None + sub_domain: str | None = None + profile_title: str | None = None + support_url: str | None = None + + @property + def hashed_password(self): + if self.password: + return pwd_context.hash(self.password) + + @field_validator("discord_webhook") + @classmethod + def validate_discord_webhook(cls, value): + return DiscordValidator.validate_webhook(value) + + @field_validator("password") + @classmethod + def validate_password(cls, value: str | None): + return PasswordValidator.validate_password(value) + + +class AdminCreate(AdminModify): + """Model for creating new admin accounts requiring username and password.""" + + username: str + password: str + + +class AdminInDB(AdminDetails): + hashed_password: str + + def verify_password(self, plain_password): + return pwd_context.verify(plain_password, self.hashed_password) + + +class AdminValidationResult(BaseModel): + username: str + is_sudo: bool + is_disabled: bool diff --git a/app/models/core.py b/app/models/core.py new file mode 100644 index 000000000..ab320c678 --- /dev/null +++ b/app/models/core.py @@ -0,0 +1,54 @@ +from datetime import datetime as dt + +from pydantic import BaseModel, ConfigDict, Field, field_validator + +from .validators import StringArrayValidator + + +class CoreBase(BaseModel): + name: str + config: dict + exclude_inbound_tags: set[str] + fallbacks_inbound_tags: set[str] + + @property + def exclude_tags(self) -> str: + if self.exclude_inbound_tags: + return ",".join(self.exclude_inbound_tags) + return "" + + @property + def fallback_tags(self) -> str: + if self.fallbacks_inbound_tags: + return ",".join(self.fallbacks_inbound_tags) + return "" + + +class CoreCreate(CoreBase): + name: str | None = Field(max_length=256, default=None) + exclude_inbound_tags: set | None = Field(default=None) + fallbacks_inbound_tags: set | None = Field(default=None) + + @field_validator("config", mode="before") + def validate_config(cls, v: dict) -> dict: + if not v: + raise ValueError("config dictionary cannot be empty") + return v + + @field_validator("exclude_inbound_tags", "fallbacks_inbound_tags", mode="after") + def validate_sets(cls, v: set): + return StringArrayValidator.len_check(v, 2048) + + +class CoreResponse(CoreBase): + id: int + created_at: dt + + model_config = ConfigDict(from_attributes=True) + + +class CoreResponseList(BaseModel): + count: int + cores: list[CoreResponse] = [] + + model_config = ConfigDict(from_attributes=True) diff --git a/app/models/group.py b/app/models/group.py new file mode 100644 index 000000000..0ea98c215 --- /dev/null +++ b/app/models/group.py @@ -0,0 +1,46 @@ +from pydantic import BaseModel, ConfigDict, Field, field_validator + +from .validators import ListValidator + + +class Group(BaseModel): + name: str = Field(min_length=3, max_length=64) + inbound_tags: list[str] | None = [] + is_disabled: bool = False + + model_config = ConfigDict(from_attributes=True) + + +class GroupCreate(Group): + inbound_tags: list[str] + + @field_validator("inbound_tags", mode="after") + @classmethod + def inbound_tags_validator(cls, v): + return ListValidator.not_null_list(v, "inbound") + + +class GroupModify(Group): + @field_validator("inbound_tags", mode="after") + @classmethod + def inbound_tags_validator(cls, v): + return ListValidator.nullable_list(v, "inbound") + + +class GroupResponse(Group): + id: int + total_users: int = 0 + + model_config = ConfigDict(from_attributes=True) + + +class GroupsResponse(BaseModel): + groups: list[GroupResponse] + total: int + + +class BulkGroup(BaseModel): + group_ids: set[int] + has_group_ids: set[int] = Field(default_factory=set) + admins: set[int] = Field(default_factory=set) + users: set[int] = Field(default_factory=set) diff --git a/app/models/host.py b/app/models/host.py new file mode 100644 index 000000000..be4828587 --- /dev/null +++ b/app/models/host.py @@ -0,0 +1,240 @@ +from enum import Enum + +from pydantic import BaseModel, ConfigDict, Field, field_validator + +from app.db.models import ProxyHostALPN, ProxyHostFingerprint, ProxyHostSecurity, UserStatus + +from .validators import ListValidator, StringArrayValidator + + +class XHttpModes(str, Enum): + auto = "auto" + packet_up = "packet-up" + stream_up = "stream-up" + stream_one = "stream-one" + + +class MultiplexProtocol(str, Enum): + smux = "smux" + yamux = "yamux" + h2mux = "h2mux" + + +class XUDP(str, Enum): + reject = "reject" + allow = "allow" + skip = "skip" + + +class XrayFragmentSettings(BaseModel): + packets: str = Field(pattern=r"^(:?tlshello|[\d-]{1,16})$") + length: str = Field(pattern=r"^[\d-]{1,16}$") + interval: str = Field(pattern=r"^[\d-]{1,16}$") + + +class SingBoxFragmentSettings(BaseModel): + fragment: bool = Field(default=False) + fragment_fallback_delay: str = Field("", pattern=r"^$|^\d+ms$") + record_fragment: bool = Field(default=False) + + +class FragmentSettings(BaseModel): + xray: XrayFragmentSettings | None = Field(default=None) + sing_box: SingBoxFragmentSettings | None = Field(default=None) + + +class XrayNoiseSettings(BaseModel): + type: str = Field(pattern=r"^(:?rand|str|base64|hex)$") + packet: str + delay: str = Field(pattern=r"^\d{1,16}(-\d{1,16})?$") + apply_to: str = Field(default="ip", pattern=r"ip|ipv4|ipv6") + + +class NoiseSettings(BaseModel): + xray: list[XrayNoiseSettings] | None = Field(default=None) + + +class XMuxSettings(BaseModel): + max_concurrency: str | int | None = Field( + None, pattern=r"^\d{1,16}(-\d{1,16})?$", serialization_alias="maxConcurrency" + ) + max_connections: str | int | None = Field( + None, pattern=r"^\d{1,16}(-\d{1,16})?$", serialization_alias="maxConnections" + ) + c_max_reuse_times: str | int | None = Field( + None, pattern=r"^\d{1,16}(-\d{1,16})?$", serialization_alias="cMaxReuseTimes" + ) + c_max_lifetime: str | int | None = Field( + None, pattern=r"^\d{1,16}(-\d{1,16})?$", serialization_alias="cMaxLifetime" + ) + h_max_request_times: str | int | None = Field( + None, pattern=r"^\d{1,16}(-\d{1,16})?$", serialization_alias="hMaxRequestTimes" + ) + h_keep_alive_period: int | None = Field(None, serialization_alias="hKeepAlivePeriod") + + +class XHttpSettings(BaseModel): + mode: XHttpModes = Field(default=XHttpModes.auto) + no_grpc_header: bool | None = Field(default=None) + x_padding_bytes: str | int | None = Field(default=None, pattern=r"^\d{1,16}(-\d{1,16})?$") + sc_max_each_post_bytes: str | int | None = Field(default=None, pattern=r"^\d{1,16}(-\d{1,16})?$") + sc_min_posts_interval_ms: str | int | None = Field(default=None, pattern=r"^\d{1,16}(-\d{1,16})?$") + xmux: XMuxSettings | None = Field(default=None) + download_settings: int | None = Field(default=None) + + +class HTTPBase(BaseModel): + version: str = Field("1.1", pattern=r"^(1(?:\.0|\.1)|2\.0|3\.0)$") + headers: dict[str, list[str]] | None = Field(default=None) + + +class HTTPResponse(HTTPBase): + status: str = Field("200", pattern=r"^[1-5]\d{2}$") + reason: str = Field( + "OK", + pattern=r"^(?i)(?:OK|Created|Accepted|Non-Authoritative Information|No Content|Reset Content|Partial Content|Multiple Choices|Moved Permanently|Found|See Other|Not Modified|Use Proxy|Temporary Redirect|Permanent Redirect|Bad Request|Unauthorized|Payment Required|Forbidden|Not Found|Method Not Allowed|Not Acceptable|Proxy Authentication Required|Request Timeout|Conflict|Gone|Length Required|Precondition Failed|Payload Too Large|URI Too Long|Unsupported Media Type|Range Not Satisfiable|Expectation Failed|I'm a teapot|Misdirected Request|Unprocessable Entity|Locked|Failed Dependency|Too Early|Upgrade Required|Precondition Required|Too Many Requests|Request Header Fields Too Large|Unavailable For Legal Reasons|Internal Server Error|Not Implemented|Bad Gateway|Service Unavailable|Gateway Timeout|HTTP Version Not Supported)$", + ) + + +class HTTPRequest(HTTPBase): + method: str = Field("GET", pattern=r"^(GET|POST|PUT|DELETE|HEAD|OPTIONS|PATCH|TRACE|CONNECT)$") + + +class TcpSettings(BaseModel): + header: str = Field("none", pattern=r"^(:?none|http)$") + request: HTTPRequest | None = Field(default=None) + response: HTTPResponse | None = Field(default=None) + + +class WebSocketSettings(BaseModel): + heartbeatPeriod: int | None = Field(default=None) + + +class KCPSettings(BaseModel): + header: str = Field(default="none", pattern=r"^(:?none|srtp|utp|wechat-video|dtls|wireguard)$") + mtu: int | None = Field(default=None) + tti: int | None = Field(default=None) + uplink_capacity: int | None = Field(default=None) + downlink_capacity: int | None = Field(default=None) + congestion: int | None = Field(default=None) + read_buffer_size: int | None = Field(default=None) + write_buffer_size: int | None = Field(default=None) + + +class GRPCSettings(BaseModel): + multi_mode: bool | None = Field(default=None) + idle_timeout: int | None = Field(default=None) + health_check_timeout: int | None = Field(default=None) + permit_without_stream: int | None = Field(default=None) + initial_windows_size: int | None = Field(default=None) + + +class Brutal(BaseModel): + enable: bool = Field(default=False) + up_mbps: int + down_mbps: int + + +class SingBoxMuxSettings(BaseModel): + enable: bool = False + protocol: MultiplexProtocol = MultiplexProtocol.smux + max_connections: int | None = Field(default=None) + max_streams: int | None = Field(default=None) + min_streams: int | None = Field(default=None) + padding: bool = False + brutal: Brutal | None = Field(default=None) + + +class ClashMuxSettings(SingBoxMuxSettings): + statistic: bool = False + only_tcp: bool = False + + +class XrayMuxSettings(BaseModel): + enable: bool = Field(default=False) + concurrency: int | None = Field(default=None) + xudp_concurrency: int | None = Field(None, serialization_alias="xudpConcurrency") + xudp_proxy_udp_443: XUDP = Field(default=XUDP.reject, serialization_alias="xudpProxyUDP443") + + +class MuxSettings(BaseModel): + sing_box: SingBoxMuxSettings | None = Field(default=None) + clash: ClashMuxSettings | None = Field(default=None) + xray: XrayMuxSettings | None = Field(default=None) + + +class TransportSettings(BaseModel): + xhttp_settings: XHttpSettings | None = Field(default=None) + grpc_settings: GRPCSettings | None = Field(default=None) + kcp_settings: KCPSettings | None = Field(default=None) + tcp_settings: TcpSettings | None = Field(default=None) + websocket_settings: WebSocketSettings | None = Field(default=None) + + +class FormatVariables(dict): + def __missing__(self, key): + return key.join("{}") + + +class BaseHost(BaseModel): + id: int | None = Field(default=None) + remark: str + address: set[str] = Field(default_factory=set) + inbound_tag: str | None = Field(default=None) + port: int | None = Field(default=None) + sni: set[str] | None = Field(default_factory=set) + host: set[str] | None = Field(default_factory=set) + path: str | None = Field(default=None) + security: ProxyHostSecurity = ProxyHostSecurity.inbound_default + alpn: list[ProxyHostALPN] | None = Field(default_factory=list) + fingerprint: ProxyHostFingerprint = ProxyHostFingerprint.none + allowinsecure: bool | None = Field(default=None) + is_disabled: bool = Field(default=False) + http_headers: dict[str, str] | None = Field(default=None) + transport_settings: TransportSettings | None = Field(default=None) + mux_settings: MuxSettings | None = Field(default=None) + fragment_settings: FragmentSettings | None = Field(default=None) + noise_settings: NoiseSettings | None = Field(default=None) + random_user_agent: bool = Field(default=False) + use_sni_as_host: bool = Field(default=False) + priority: int + status: set[UserStatus] | None = Field(default_factory=set) + ech_config_list: str | None = Field(default=None) + + model_config = ConfigDict(from_attributes=True) + + @property + def address_str(self) -> str: + if self.address: + return ",".join(self.address) + return "" + + +class CreateHost(BaseHost): + @field_validator("remark", mode="after") + def validate_remark(cls, v): + try: + v.format_map(FormatVariables()) + except ValueError: + raise ValueError("Invalid formatting variables") + + return v + + @field_validator("alpn", mode="after") + def remove_duplicates(cls, v): + if v: + return ListValidator.remove_duplicates_preserve_order(v) + + @field_validator("alpn", mode="after") + def sort_alpn_list(cls, v) -> list: + priority = {"h3": 0, "h2": 1, "http/1.1": 2} + if v: + return sorted(v, key=lambda x: priority[x]) + + @field_validator("address", mode="after") + def validate_address(cls, v): + return StringArrayValidator.len_check(v, 256) + + @field_validator("sni", "host", mode="after") + def validate_sets(cls, v: set): + return StringArrayValidator.len_check(v, 1000) diff --git a/app/models/node.py b/app/models/node.py new file mode 100644 index 000000000..6ba4b47d3 --- /dev/null +++ b/app/models/node.py @@ -0,0 +1,164 @@ +import re +from enum import Enum +from ipaddress import ip_address +from uuid import UUID + +from cryptography.x509 import load_pem_x509_certificate +from pydantic import BaseModel, ConfigDict, Field, field_validator + +from app.db.models import NodeConnectionType, NodeStatus + +# Basic PEM format validation +CERT_PATTERN = r"-----BEGIN CERTIFICATE-----(.*?)-----END CERTIFICATE-----" +KEY_PATTERN = r"-----BEGIN (?:RSA )?PRIVATE KEY-----" + + +class UsageTable(str, Enum): + node_user_usages = "node_user_usages" + node_usages = "node_usages" + + +class NodeSettings(BaseModel): + min_node_version: str = "v1.0.0" + + +class Node(BaseModel): + name: str + address: str + port: int = 62050 + usage_coefficient: float = Field(gt=0, default=1.0) + connection_type: NodeConnectionType + server_ca: str + keep_alive: int + max_logs: int = Field(gt=0, default=1000) + core_config_id: int + api_key: str + gather_logs: bool = Field(default=True) + + +class NodeCreate(Node): + model_config = ConfigDict( + json_schema_extra={ + "example": { + "name": "DE node", + "address": "192.168.1.1", + "port": 62050, + "usage_coefficient": 1, + "server_ca": "-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----", + "connection_type": "grpc", + "keep_alive": 60, + "max_logs": 1000, + "core_config_id": 1, + "api_key": "valid uuid", + "gather_logs": True, + } + } + ) + + @field_validator("address") + @classmethod + def validate_address(cls, v: str) -> str: + if not v: + return v + try: + ip_address(v) + return v + except ValueError: + # Regex for domain validation + if re.match(r"^(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}$", v): + return v + raise ValueError("Invalid address format, must be a valid IPv4/IPv6 or domain") + + @field_validator("port") + @classmethod + def validate_port(cls, v: int) -> int: + if not v: + return v + if not 1 <= v <= 65535: + raise ValueError("Port must be between 1 and 65535") + return v + + @field_validator("server_ca") + @classmethod + def validate_certificate(cls, v: str | None) -> str | None: + if v is None: + return None + + v = v.strip() + + # Check for PEM certificate format + if not re.search(CERT_PATTERN, v, re.DOTALL): + raise ValueError("Invalid certificate format - must contain PEM certificate blocks") + + # Check for private key material + if re.search(KEY_PATTERN, v): + raise ValueError("Certificate contains private key material") + + if len(v) > 2048: + raise ValueError("Certificate too large (max 2048 characters)") + + try: + load_pem_x509_certificate(v.encode("utf-8")) + pass + except Exception: + raise ValueError("Invalid certificate structure") + + return v + + @field_validator("api_key", mode="before") + @classmethod + def validate_api_key(cls, v) -> str: + if not v: + return + try: + UUID(v) + except ValueError: + raise ValueError("Invalid UUID format for api_key") + return v + + +class NodeModify(NodeCreate): + name: str | None = Field(default=None) + address: str | None = Field(default=None) + port: int | None = Field(default=None) + api_port: int | None = Field(default=None) + status: NodeStatus | None = Field(default=None) + usage_coefficient: float | None = Field(default=None) + server_ca: str | None = Field(default=None) + connection_type: NodeConnectionType | None = Field(default=None) + keep_alive: int | None = Field(default=None) + max_logs: int | None = Field(default=None) + core_config_id: int | None = Field(default=None) + api_key: str | None = Field(default=None) + gather_logs: bool | None = Field(default=None) + + model_config = ConfigDict( + json_schema_extra={ + "example": { + "name": "DE node", + "address": "192.168.1.1", + "port": 62050, + "status": "disabled", + "usage_coefficient": 1.0, + "connection_type": "grpc", + "server_ca": "-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----", + "keep_alive": 60, + "max_logs": 1000, + "core_config_id": 1, + "api_key": "valid uuid", + "gather_logs": True, + } + } + ) + + +class NodeResponse(Node): + id: int + api_key: str | None + core_config_id: int | None + xray_version: str | None + node_version: str | None + status: NodeStatus + message: str | None + + model_config = ConfigDict(from_attributes=True) diff --git a/app/models/proxy.py b/app/models/proxy.py new file mode 100644 index 000000000..db28a78fe --- /dev/null +++ b/app/models/proxy.py @@ -0,0 +1,49 @@ +import json +from uuid import uuid4, UUID +from enum import Enum + +from pydantic import BaseModel, Field + +from app.utils.system import random_password + + +class VMessSettings(BaseModel): + id: UUID = Field(default_factory=uuid4) + + +class XTLSFlows(str, Enum): + NONE = "" + VISION = "xtls-rprx-vision" + + +class VlessSettings(BaseModel): + id: UUID = Field(default_factory=uuid4) + flow: XTLSFlows = XTLSFlows.NONE + + +class TrojanSettings(BaseModel): + password: str = Field(default_factory=random_password) + + +class ShadowsocksMethods(str, Enum): # Already a str, Enum which is good + AES_128_GCM = "aes-128-gcm" + AES_256_GCM = "aes-256-gcm" + CHACHA20_POLY1305 = "chacha20-ietf-poly1305" + XCHACHA20_POLY1305 = "xchacha20-poly1305" + + +class ShadowsocksSettings(BaseModel): + password: str = Field(default_factory=random_password, min_length=22) + method: ShadowsocksMethods = ShadowsocksMethods.CHACHA20_POLY1305 + + +class ProxyTable(BaseModel): + vmess: VMessSettings = Field(default_factory=VMessSettings) + vless: VlessSettings = Field(default_factory=VlessSettings) + trojan: TrojanSettings = Field(default_factory=TrojanSettings) + shadowsocks: ShadowsocksSettings = Field(default_factory=ShadowsocksSettings) + + def dict(self, *, no_obj=True, **kwargs): + if no_obj: + return json.loads(self.model_dump_json()) + return super().model_dump(**kwargs) diff --git a/app/models/settings.py b/app/models/settings.py new file mode 100644 index 000000000..558312724 --- /dev/null +++ b/app/models/settings.py @@ -0,0 +1,222 @@ +import re +from enum import Enum, StrEnum + +from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator + +from app.models.proxy import ShadowsocksMethods, XTLSFlows + +from .validators import DiscordValidator, ProxyValidator, URLValidator + +TELEGRAM_TOKEN_PATTERN = r"^\d{8,12}:[A-Za-z0-9_-]{35}$" + + +class RunMethod(StrEnum): + WEBHOOK = "webhook" + LONGPOLLING = "long-polling" + + +class Telegram(BaseModel): + enable: bool = Field(default=False) + token: str | None = Field(default=None) + webhook_url: str | None = Field(default=None) + webhook_secret: str | None = Field(default=None) + proxy_url: str | None = Field(default=None) + method: RunMethod = Field(default=RunMethod.WEBHOOK) + + mini_app_login: bool = Field(default=True) + mini_app_web_url: str | None = Field(default="") + + for_admins_only: bool = Field(default=True) + + @field_validator("mini_app_web_url") + @classmethod + def validate_mini_app_web_url(cls, v): + return URLValidator.validate_url(v) + + @field_validator("webhook_url") + def validate_webhook_url(cls, v, values): + method = values.data.get("method", "webhook") + if method == "webhook": + return URLValidator.validate_url(v) + + @field_validator("proxy_url") + @classmethod + def validate_proxy_url(cls, v): + return ProxyValidator.validate_proxy_url(v) + + @field_validator("token") + @classmethod + def token_validation(cls, v): + if not v: + return v + if not re.match(TELEGRAM_TOKEN_PATTERN, v): + raise ValueError("Invalid telegram token format") + return v + + @model_validator(mode="after") + def check_enable_requires_token_and_url(self): + if self.enable and ( + (self.method == RunMethod.WEBHOOK and (not self.token or not self.webhook_url or not self.webhook_secret)) + or (self.method == RunMethod.LONGPOLLING and not self.token) + ): + if self.method == RunMethod.WEBHOOK: + raise ValueError("Telegram bot cannot be enabled without token, webhook_url and webhook_secret.") + elif self.method == RunMethod.LONGPOLLING: + raise ValueError("Telegram bot cannot be enabled without token.") + return self + + +class Discord(BaseModel): + enable: bool = Field(default=False) + token: str | None = Field(default=None) + proxy_url: str | None = Field(default=None) + + @field_validator("proxy_url") + @classmethod + def validate_proxy_url(cls, v): + return ProxyValidator.validate_proxy_url(v) + + @model_validator(mode="after") + def check_enable_requires_token(self): + if self.enable and not self.token: + raise ValueError("Discord bot cannot be enabled without token.") + return self + + +class WebhookInfo(BaseModel): + url: str + secret: str + + +class Webhook(BaseModel): + enable: bool = Field(default=False) + webhooks: list[WebhookInfo] = Field(default=[]) + days_left: list[int] = Field(default=[]) + usage_percent: list[int] = Field(default=[]) + timeout: int = Field(gt=0) + recurrent: int = Field(gt=0) + proxy_url: str | None = Field(default=None) + + @field_validator("proxy_url", mode="before") + @classmethod + def validate_proxy_url(cls, v): + return ProxyValidator.validate_proxy_url(v) + + @model_validator(mode="after") + def check_enable_requires_webhookinfo(self): + if self.enable and (not self.webhooks or len(self.webhooks) == 0): + raise ValueError("Webhook cannot be enabled without at least one WebhookInfo.") + return self + + +class NotificationSettings(BaseModel): + # Define Which Notfication System Work's + notify_telegram: bool = Field(default=False) + notify_discord: bool = Field(default=False) + + # Telegram Settings + telegram_api_token: str | None = Field(default=None) + telegram_admin_id: int | None = Field(default=None) + telegram_channel_id: int | None = Field(default=None) + telegram_topic_id: int | None = Field(default=None) + + # Discord Settings + discord_webhook_url: str | None = Field(default=None) + + # Proxy Settings + proxy_url: str | None = Field(default=None) + + max_retries: int = Field(gt=1) + + @field_validator("proxy_url", mode="before") + @classmethod + def validate_proxy_url(cls, v): + return ProxyValidator.validate_proxy_url(v) + + @field_validator("discord_webhook_url", mode="before") + @classmethod + def validate_discord_webhook(cls, value): + return DiscordValidator.validate_webhook(value) + + @model_validator(mode="after") + def check_notify_discord_requires_url(self): + if self.notify_discord and not self.discord_webhook_url: + raise ValueError("Discord notification cannot be enabled without webhook url.") + return self + + @model_validator(mode="after") + def check_notify_telegram_requires_token_and_id(self): + if self.notify_telegram and ( + not self.telegram_api_token or not (self.telegram_channel_id, self.telegram_admin_id) + ): + raise ValueError("Telegram notification cannot be enabled without token or admin/channel id.") + return self + + +class NotificationEnable(BaseModel): + admin: bool = Field(default=True) + core: bool = Field(default=True) + group: bool = Field(default=True) + host: bool = Field(default=True) + login: bool = Field(default=True) + node: bool = Field(default=True) + user: bool = Field(default=True) + user_template: bool = Field(default=True) + days_left: bool = Field(default=True) + percentage_reached: bool = Field(default=True) + + +class ConfigFormat(str, Enum): + links = "links" + links_base64 = "links_base64" + xray = "xray" + sing_box = "sing_box" + clash = "clash" + clash_meta = "clash_meta" + outline = "outline" + block = "block" + + +class SubRule(BaseModel): + pattern: str + target: ConfigFormat + + +class SubFormatEnable(BaseModel): + links: bool = Field(default=True) + links_base64: bool = Field(default=True) + xray: bool = Field(default=True) + sing_box: bool = Field(default=True) + clash: bool = Field(default=True) + clash_meta: bool = Field(default=True) + outline: bool = Field(default=True) + + +class Subscription(BaseModel): + url_prefix: str = Field(default="") + update_interval: int = Field(default=12) + support_url: str = Field(default="https://t.me/") + profile_title: str = Field(default="Subscription") + + host_status_filter: bool + + # Rules To Seperate Clients And Send Config As Needed + rules: list[SubRule] + manual_sub_request: SubFormatEnable = Field(default_factory=SubFormatEnable) + + +class General(BaseModel): + default_flow: XTLSFlows = Field(default=XTLSFlows.NONE) + default_method: ShadowsocksMethods = Field(default=ShadowsocksMethods.CHACHA20_POLY1305) + + +class SettingsSchema(BaseModel): + telegram: Telegram | None = Field(default=None) + discord: Discord | None = Field(default=None) + webhook: Webhook | None = Field(default=None) + notification_settings: NotificationSettings | None = Field(default=None) + notification_enable: NotificationEnable | None = Field(default=None) + subscription: Subscription | None = Field(default=None) + general: General | None = Field(default=None) + + model_config = ConfigDict(from_attributes=True) diff --git a/app/models/stats.py b/app/models/stats.py new file mode 100644 index 000000000..b775aa281 --- /dev/null +++ b/app/models/stats.py @@ -0,0 +1,77 @@ +from enum import Enum +from datetime import datetime as dt + +from pydantic import BaseModel, field_validator + +from .validators import NumericValidatorMixin + + +class Period(str, Enum): + minute = "minute" + hour = "hour" + day = "day" + month = "month" + + +class StatList(BaseModel): + period: Period | None = None + start: dt + end: dt + + +class UserUsageStat(BaseModel): + total_traffic: int + period_start: dt + + @field_validator("total_traffic", mode="before") + def cast_to_int(cls, v): + return NumericValidatorMixin.cast_to_int(v) + + +class UserUsageStatsList(StatList): + stats: dict[int, list[UserUsageStat]] + + +class NodeUsageStat(BaseModel): + uplink: int + downlink: int + period_start: dt + + @field_validator("downlink", "uplink", mode="before") + def cast_to_int(cls, v): + return NumericValidatorMixin.cast_to_int(v) + + +class NodeUsageStatsList(StatList): + stats: dict[int, list[NodeUsageStat]] + + +class NodeRealtimeStats(BaseModel): + mem_total: int + mem_used: int + cpu_cores: int + cpu_usage: float + incoming_bandwidth_speed: int + outgoing_bandwidth_speed: int + + +class NodeStats(BaseModel): + period_start: dt + mem_usage_percentage: float + cpu_usage_percentage: float + incoming_bandwidth_speed: float + outgoing_bandwidth_speed: float + + @field_validator( + "mem_usage_percentage", + "cpu_usage_percentage", + "incoming_bandwidth_speed", + "outgoing_bandwidth_speed", + mode="before", + ) + def cast_to_float(cls, v): + return NumericValidatorMixin.cast_to_float(v) + + +class NodeStatsList(StatList): + stats: list[NodeStats] diff --git a/app/models/system.py b/app/models/system.py new file mode 100644 index 000000000..e3e74245d --- /dev/null +++ b/app/models/system.py @@ -0,0 +1,18 @@ +from pydantic import BaseModel + + +class SystemStats(BaseModel): + version: str + mem_total: int | None = None + mem_used: int | None = None + cpu_cores: int | None = None + cpu_usage: float | None = None + total_user: int + online_users: int + active_users: int + on_hold_users: int + disabled_users: int + expired_users: int + limited_users: int + incoming_bandwidth: int + outgoing_bandwidth: int diff --git a/app/models/user.py b/app/models/user.py new file mode 100644 index 000000000..61f7c800e --- /dev/null +++ b/app/models/user.py @@ -0,0 +1,179 @@ +from datetime import datetime as dt +from enum import Enum + +from pydantic import BaseModel, ConfigDict, Field, field_validator + +from app.db.models import UserDataLimitResetStrategy, UserStatus, UserStatusCreate +from app.models.admin import AdminBase, AdminContactInfo +from app.models.proxy import ProxyTable, ShadowsocksMethods, XTLSFlows +from app.utils.helpers import fix_datetime_timezone + +from .validators import ListValidator, NumericValidatorMixin, UserValidator + + +class UserStatusModify(str, Enum): + active = "active" + disabled = "disabled" + on_hold = "on_hold" + + +class NextPlanModel(BaseModel): + user_template_id: int | None = Field(default=None) + data_limit: int | None = Field(default=None) + expire: int | None = Field(default=None) + add_remaining_traffic: bool = False + model_config = ConfigDict(from_attributes=True) + + +class User(BaseModel): + proxy_settings: ProxyTable = Field(default_factory=ProxyTable) + expire: dt | int | None = Field(default=None) + data_limit: int | None = Field(ge=0, default=None, description="data_limit can be 0 or greater") + data_limit_reset_strategy: UserDataLimitResetStrategy | None = Field(default=None) + note: str | None = Field(max_length=500, default=None) + on_hold_expire_duration: int | None = Field(default=None) + on_hold_timeout: dt | int | None = Field(default=None) + group_ids: list[int] | None = Field(default_factory=list) + auto_delete_in_days: int | None = Field(default=None) + + next_plan: NextPlanModel | None = Field(default=None) + + +class UserWithValidator(User): + @field_validator("on_hold_expire_duration") + @classmethod + def validate_timeout(cls, v): + # Check if expire is 0 or None and timeout is not 0 or None + if v in (0, None): + return None + return v + + @field_validator("on_hold_timeout", check_fields=False) + @classmethod + def validator_on_hold_timeout(cls, value): + return UserValidator.validator_on_hold_timeout(value) + + @field_validator("expire", check_fields=False) + @classmethod + def validator_expire(cls, value): + if not value: + return value + return fix_datetime_timezone(value) + + @field_validator("status", mode="before", check_fields=False) + def validate_status(cls, status, values): + return UserValidator.validate_status(status, values) + + +class UserCreate(UserWithValidator): + username: str + status: UserStatusCreate | None = Field(default=None) + + @field_validator("username", check_fields=False) + @classmethod + def validate_username(cls, v): + return UserValidator.validate_username(v) + + @field_validator("group_ids", mode="after") + @classmethod + def group_ids_validator(cls, v): + return ListValidator.not_null_list(v, "group") + + +class UserModify(UserWithValidator): + status: UserStatusModify | None = Field(default=None) + proxy_settings: ProxyTable | None = Field(default=None) + + @field_validator("group_ids", mode="after") + @classmethod + def group_ids_validator(cls, v): + return ListValidator.nullable_list(v, "group") + + +class UserNotificationResponse(User): + id: int + username: str + status: UserStatus + used_traffic: int + lifetime_used_traffic: int = 0 + created_at: dt + edit_at: dt | None = Field(default=None) + online_at: dt | None = Field(default=None) + subscription_url: str = Field(default="") + admin: AdminContactInfo | None = Field(default=None) + model_config = ConfigDict(from_attributes=True) + + @field_validator("used_traffic", "lifetime_used_traffic", "data_limit", mode="before") + @classmethod + def cast_to_int(cls, v): + return NumericValidatorMixin.cast_to_int(v) + + +class UserResponse(UserNotificationResponse): + admin: AdminBase | None = None + + +class SubscriptionUserResponse(UserResponse): + admin: AdminContactInfo | None = Field(default=None, exclude=True) + note: str | None = Field(None, exclude=True) + auto_delete_in_days: int | None = Field(None, exclude=True) + subscription_url: str | None = Field(None, exclude=True) + model_config = ConfigDict(from_attributes=True) + + +class UsersResponseWithInbounds(SubscriptionUserResponse): + inbounds: list[str] | None = Field(default_factory=list) + + model_config = ConfigDict(from_attributes=True) + + +class UsersResponse(BaseModel): + users: list[UserResponse] + total: int + + +class UserSubscriptionUpdateSchema(BaseModel): + created_at: dt + user_agent: str + + model_config = ConfigDict(from_attributes=True) + + +class UserSubscriptionUpdateList(BaseModel): + updates: list[UserSubscriptionUpdateSchema] = Field(default_factory=list) + count: int + + +class RemoveUsersResponse(BaseModel): + users: list[str] + count: int + + +class ModifyUserByTemplate(BaseModel): + user_template_id: int + note: str | None = Field(max_length=500, default=None) + + +class CreateUserFromTemplate(ModifyUserByTemplate): + username: str + + @field_validator("username", check_fields=False) + @classmethod + def validate_username(cls, v): + return UserValidator.validate_username(v) + + +class BulkUser(BaseModel): + amount: int + group_ids: set[int] = Field(default_factory=set) + admins: set[int] = Field(default_factory=set) + users: set[int] = Field(default_factory=set) + status: set[UserStatus] = Field(default_factory=set) + + +class BulkUsersProxy(BaseModel): + flow: XTLSFlows | None = Field(default=None) + method: ShadowsocksMethods | None = Field(default=None) + group_ids: set[int] = Field(default_factory=set) + admins: set[int] = Field(default_factory=set) + users: set[int] = Field(default_factory=set) diff --git a/app/models/user_template.py b/app/models/user_template.py new file mode 100644 index 000000000..a5bc90e6a --- /dev/null +++ b/app/models/user_template.py @@ -0,0 +1,68 @@ +import json + +from pydantic import BaseModel, ConfigDict, Field, field_validator + +from app.db.models import UserDataLimitResetStrategy, UserStatusCreate +from app.models.proxy import ShadowsocksMethods, XTLSFlows + +from .validators import ListValidator, UserValidator + + +class ExtraSettings(BaseModel): + flow: XTLSFlows | None = Field(XTLSFlows.NONE) + method: ShadowsocksMethods | None = Field(ShadowsocksMethods.CHACHA20_POLY1305) + + def dict(self, *, no_obj=True, **kwargs): + if no_obj: + return json.loads(self.model_dump_json()) + return super().model_dump(**kwargs) + + +class UserTemplate(BaseModel): + name: str | None = None + data_limit: int | None = Field(ge=0, default=None, description="data_limit can be 0 or greater") + expire_duration: int | None = Field( + ge=0, default=None, description="expire_duration can be 0 or greater in seconds" + ) + username_prefix: str | None = Field(max_length=20, default=None) + username_suffix: str | None = Field(max_length=20, default=None) + group_ids: list[int] + extra_settings: ExtraSettings | None = None + status: UserStatusCreate | None = None + reset_usages: bool | None = None + on_hold_timeout: int | None = None + data_limit_reset_strategy: UserDataLimitResetStrategy = Field(default=UserDataLimitResetStrategy.no_reset) + is_disabled: bool | None = None + + +class UserTemplateWithValidator(UserTemplate): + @field_validator("status", mode="before", check_fields=False) + def validate_status(cls, status, values): + return UserValidator.validate_status(status, values) + + @field_validator("username_prefix", "username_suffix", check_fields=False) + @classmethod + def validate_username(cls, v): + return UserValidator.validate_username(v, False, True) + + +class UserTemplateCreate(UserTemplateWithValidator): + @field_validator("group_ids", mode="after") + @classmethod + def group_ids_validator(cls, v): + return ListValidator.not_null_list(v, "group") + + +class UserTemplateModify(UserTemplateWithValidator): + group_ids: list[int] | None = None + + @field_validator("group_ids", mode="after") + @classmethod + def group_ids_validator(cls, v): + return ListValidator.nullable_list(v, "group") + + +class UserTemplateResponse(UserTemplate): + id: int + + model_config = ConfigDict(from_attributes=True) diff --git a/app/models/validators.py b/app/models/validators.py new file mode 100644 index 000000000..027f1e9e6 --- /dev/null +++ b/app/models/validators.py @@ -0,0 +1,226 @@ +import re +from datetime import datetime +from decimal import Decimal +from typing import Optional +from urllib.parse import urlparse + +from app.db.models import UserStatusCreate + + +class NumericValidatorMixin: + @staticmethod + def cast_to_int(v): + """ + Static method to validate and convert numeric values to integers. + + Args: + v: Input value to be converted + + Returns: + int or None: Converted integer value + + Raises: + ValueError: If the input cannot be converted to an integer + """ + if v is None: # Allow None values + return v + elif isinstance(v, float) or isinstance(v, Decimal): # Allow float or Decimal to int conversion + return int(v) + elif isinstance(v, int): # Allow integers directly + return v + + raise ValueError("must be an integer, Decimal or a float, not a string") # Reject strings + + @staticmethod + def cast_to_float(v): + """ + Static method to validate and convert numeric values to floats. + + Args: + v: Input value to be converted + + Returns: + float or None: Converted float value + + Raises: + ValueError: If the input cannot be converted to an float + """ + if v is None: + return v + elif isinstance(v, int) or isinstance(v, Decimal): + return float(v) + elif isinstance(v, float): + return v + + raise ValueError("must be an integer, Decimal or a float, not a string") + + +class ListValidator: + @staticmethod + def nullable_list(list: list | None, name: str) -> list: + if list and len(list) < 1: + raise ValueError(f"you must select at least one {name}") + return list + + @staticmethod + def not_null_list(list: list, name: str) -> list: + if not list or len(list) < 1: + raise ValueError(f"you must select at least one {name}") + return list + + @staticmethod + def remove_duplicates_preserve_order(list_: list) -> list: + """ + Remove duplicates from list while preserving order using dict.fromkeys() + """ + return list(dict.fromkeys(list_)) + + +class PasswordValidator: + @staticmethod + def validate_password(value: str | None, check_username: str | None = None): + if value is None: + return value # Allow None for optional passwords + + errors = [] + # Length check + if len(value) < 12: + errors.append("Password must be at least 12 characters long") + # At least 2 digits + if len(re.findall(r"\d", value)) < 2: + errors.append("Password must contain at least 2 digits") + # At least 2 uppercase letters + if len(re.findall(r"[A-Z]", value)) < 2: + errors.append("Password must contain at least 2 uppercase letters") + # At least 2 lowercase letters + if len(re.findall(r"[a-z]", value)) < 2: + errors.append("Password must contain at least 2 lowercase letters") + # At least 1 special character + if not re.search(r"[!@#$%^&*()\-_=+\[\]{}|;:,.<>?/~`]", value): + errors.append("Password must contain at least one special character") + # Check if password contains the username + if check_username and check_username.lower() in value.lower(): + errors.append("Password cannot contain the username") + + if errors: + raise ValueError("; ".join(errors)) + return value + + +class UserValidator: + @staticmethod + def validate_status(status, values): + on_hold_expire = values.data.get("on_hold_expire_duration") or values.data.get("expire_duration") + expire = values.data.get("expire") + if status == UserStatusCreate.on_hold: + if on_hold_expire == 0 or on_hold_expire is None: + raise ValueError("User cannot be on hold without a valid on_hold_expire_duration.") + if expire: + raise ValueError("User cannot be on hold with specified expire.") + return status + + @staticmethod + def validate_username(username: str, len_check: bool = True, accept_null: bool = False): + if accept_null and not username: + return username + + if len_check and not (3 <= len(username) <= 128): + raise ValueError("Username only can be 3 to 128 characters.") + + if not re.match(r"^[a-zA-Z0-9-_@.]+$", username): + raise ValueError("Username can only contain alphanumeric characters, -, _, @, and .") + + # Additional check to prevent consecutive special characters + if re.search(r"[-_@.]{2,}", username): + raise ValueError("Username cannot have consecutive special characters") + + return username + + @staticmethod + def validator_on_hold_timeout(value): + if value == 0 or isinstance(value, datetime) or value is None: + return value + else: + raise ValueError("on_hold_timeout can be datetime or 0") + + +class ProxyValidator: + @staticmethod + def validate_proxy_url(value: str | None) -> str | None: + """ + Validates a proxy URL. Accepts HTTP, HTTPS, SOCKS4, SOCKS5, with or without authentication. + Examples: + http://host:port + https://host:port + socks5://host:port + http://user:pass@host:port + socks5://user:pass@host:port + """ + if value is None: + return value + pattern = ( + r"^(?Phttp|https|socks4|socks5)://" + r"((?P[^\s:@]+):(?P[^\s:@]+)@)?" + r"(?P[a-zA-Z0-9\.-]+)" + r":(?P\d{1,5})$" + ) + if not re.match(pattern, value): + raise ValueError( + "proxy_url must be a valid proxy address (e.g., http://host:port, socks5://user:pass@host:port)" + ) + return value + + +class DiscordValidator: + @staticmethod + def validate_webhook(value: str | None): + if value: + parsed = urlparse(value) + # validate scheme and hostname + if parsed.scheme != "https" or parsed.hostname not in {"discord.com"}: + raise ValueError("Discord webhook must use https scheme and point to 'discord.com'") + return value + + +class URLValidator: + @staticmethod + def validate_url(value: Optional[str]) -> Optional[str]: + """ + Validates a general-purpose URL. + Examples: + http://example.com + https://example.com:8443 + """ + if not value: + return value + + pattern = ( + r"^(?Phttp|https)://" # Scheme + r"(:(?P\d{1,5}))?" # Optional port + r"(?P/[^\s?#]*)?" # Optional path + ) + + if not re.match(pattern, value): + raise ValueError(f"URL must be a valid address (e.g., https://example.com:8443/path): {value}") + + return value + + +class StringArrayValidator: + @staticmethod + def len_check(array: dict | list | set, max: int) -> set[str] | None: + if array is None: + return None + + # Ensure the input is a set for validation + if isinstance(array, set): + pass + elif isinstance(array, dict): + array = set(array.keys()) + else: + array = set(array) + + compiled_string = ",".join([str(v) for v in array]) + if len(compiled_string) > max: + raise ValueError(f"String can't be bigger that {max} charachter") + return array diff --git a/app/node/__init__.py b/app/node/__init__.py new file mode 100644 index 000000000..5cf3a9b5c --- /dev/null +++ b/app/node/__init__.py @@ -0,0 +1,113 @@ +import asyncio + +from PasarGuardNodeBridge import PasarGuardNode, create_node, Health, NodeType +from aiorwlock import RWLock + +from app.db.models import Node, NodeConnectionType, User +from app.node.user import serialize_user_for_node, core_users, serialize_users_for_node +from app.models.user import UserResponse + + +type_map = { + NodeConnectionType.rest: NodeType.rest, + NodeConnectionType.grpc: NodeType.grpc, +} + + +class NodeManager: + def __init__(self): + self._nodes: dict[int, PasarGuardNode] = {} + self._lock = RWLock(fast=True) + + async def update_node(self, node: Node) -> PasarGuardNode: + async with self._lock.writer_lock: + old_node: PasarGuardNode | None = self._nodes.get(node.id, None) + if old_node is not None: + try: + await old_node.set_health(Health.INVALID) + await old_node.stop() + except Exception: + pass + finally: + del self._nodes[node.id] + + new_node = create_node( + connection=type_map[node.connection_type], + address=node.address, + port=node.port, + server_ca=node.server_ca, + api_key=node.api_key, + max_logs=node.max_logs, + extra={"id": node.id, "usage_coefficient": node.usage_coefficient}, + ) + + self._nodes[node.id] = new_node + + return new_node + + async def remove_node(self, id: int) -> None: + async with self._lock.writer_lock: + old_node: PasarGuardNode | None = self._nodes.get(id, None) + if old_node is not None: + try: + await old_node.set_health(Health.INVALID) + await old_node.stop() + except Exception: + pass + finally: + del self._nodes[id] + + async def get_node(self, id: int) -> PasarGuardNode | None: + async with self._lock.reader_lock: + return self._nodes.get(id, None) + + async def get_nodes(self) -> dict[int, PasarGuardNode]: + async with self._lock.reader_lock: + return self._nodes + + async def get_healthy_nodes(self) -> list[tuple[int, PasarGuardNode]]: + async with self._lock.reader_lock: + nodes: list[tuple[int, PasarGuardNode]] = [ + (id, node) for id, node in self._nodes.items() if (await node.get_health() == Health.HEALTHY) + ] + return nodes + + async def get_broken_nodes(self) -> list[tuple[int, PasarGuardNode]]: + async with self._lock.reader_lock: + nodes: list[tuple[int, PasarGuardNode]] = [ + (id, node) for id, node in self._nodes.items() if (await node.get_health() == Health.BROKEN) + ] + return nodes + + async def get_not_connected_nodes(self) -> list[tuple[int, PasarGuardNode]]: + async with self._lock.reader_lock: + nodes: list[tuple[int, PasarGuardNode]] = [ + (id, node) for id, node in self._nodes.items() if (await node.get_health() == Health.NOT_CONNECTED) + ] + return nodes + + async def update_user(self, user: UserResponse, inbounds: list[str] = None): + proto_user = serialize_user_for_node(user.id, user.username, user.proxy_settings.dict(), inbounds) + + async with self._lock.reader_lock: + add_tasks = [node.update_user(proto_user) for node in self._nodes.values()] + await asyncio.gather(*add_tasks, return_exceptions=True) + + async def update_users(self, users: list[User]): + proto_users = await serialize_users_for_node(users) + async with self._lock.reader_lock: + add_tasks = [node.update_users(proto_users) for node in self._nodes.values()] + await asyncio.gather(*add_tasks, return_exceptions=True) + + async def remove_user(self, user: UserResponse): + proto_user = serialize_user_for_node(user.id, user.username, user.proxy_settings.dict()) + + async with self._lock.reader_lock: + remove_tasks = [node.update_user(proto_user) for node in self._nodes.values()] + await asyncio.gather(*remove_tasks, return_exceptions=True) + + +node_manager: NodeManager = NodeManager() + + +__all__ = ["core_users", "node_manager"] diff --git a/app/node/user.py b/app/node/user.py new file mode 100644 index 000000000..1b25e5721 --- /dev/null +++ b/app/node/user.py @@ -0,0 +1,60 @@ +from sqlalchemy.orm import load_only, selectinload +from sqlalchemy import select +from PasarGuardNodeBridge import create_user, create_proxy + +from app.db import AsyncSession +from app.db.models import ProxyInbound, Group, User, UserStatus + + +def serialize_user_for_node(id: int, username: str, user_settings: dict, inbounds: list[str] = None): + vmess_settings = user_settings.get("vmess", {}) + vless_settings = user_settings.get("vless", {}) + trojan_settings = user_settings.get("trojan", {}) + shadowsocks_settings = user_settings.get("shadowsocks", {}) + + return create_user( + f"{id}.{username}", + create_proxy( + vmess_id=vmess_settings.get("id"), + vless_id=vless_settings.get("id"), + vless_flow=vless_settings.get("flow"), + trojan_password=trojan_settings.get("password"), + shadowsocks_password=shadowsocks_settings.get("password"), + shadowsocks_method=shadowsocks_settings.get("method"), + ), + inbounds, + ) + + +async def core_users(db: AsyncSession): + stmt = ( + select(User) + .options( + load_only(User.id, User.username, User.proxy_settings), + selectinload(User.groups), + selectinload(User.groups).selectinload(Group.inbounds).load_only(ProxyInbound.tag), + ) + .filter(User.status.in_([UserStatus.active, UserStatus.on_hold])) + ) + users = (await db.execute(stmt)).unique().scalars().all() + bridge_users: list = [] + + for user in users: + inbounds_list = await user.inbounds() + if len(inbounds_list) > 0: + bridge_users.append(serialize_user_for_node(user.id, user.username, user.proxy_settings, inbounds_list)) + + return bridge_users + + +async def serialize_users_for_node(users: list[User]): + bridge_users: list = [] + + for user in users: + inbounds_list = [] + if user.status in [UserStatus.active, UserStatus.on_hold]: + inbounds_list = await user.inbounds() + + bridge_users.append(serialize_user_for_node(user.id, user.username, user.proxy_settings, inbounds_list)) + + return bridge_users diff --git a/app/notification/__init__.py b/app/notification/__init__.py new file mode 100644 index 000000000..a264e0080 --- /dev/null +++ b/app/notification/__init__.py @@ -0,0 +1,192 @@ +import asyncio + +from . import discord as ds +from . import telegram as tg +from . import webhook as wh +from app.models.host import BaseHost +from app.models.user_template import UserTemplateResponse +from app.models.node import NodeResponse +from app.models.group import GroupResponse +from app.models.core import CoreResponse +from app.models.admin import AdminDetails +from app.models.user import UserNotificationResponse +from app.settings import notification_enable + + +async def create_host(host: BaseHost, by: str): + if (await notification_enable()).host: + await asyncio.gather(ds.create_host(host, by), tg.create_host(host, by)) + + +async def modify_host(host: BaseHost, by: str): + if (await notification_enable()).host: + await asyncio.gather(ds.modify_host(host, by), tg.modify_host(host, by)) + + +async def remove_host(host: BaseHost, by: str): + if (await notification_enable()).host: + await asyncio.gather(ds.remove_host(host, by), tg.remove_host(host, by)) + + +async def modify_hosts(by: str): + if (await notification_enable()).host: + await asyncio.gather(ds.modify_hosts(by), tg.modify_hosts(by)) + + +async def create_user_template(user: UserTemplateResponse, by: str): + if (await notification_enable()).user_template: + await asyncio.gather(ds.create_user_template(user, by), tg.create_user_template(user, by)) + + +async def modify_user_template(user: UserTemplateResponse, by: str): + if (await notification_enable()).user_template: + await asyncio.gather(ds.modify_user_template(user, by), tg.modify_user_template(user, by)) + + +async def remove_user_template(name: str, by: str): + if (await notification_enable()).user_template: + await asyncio.gather(ds.remove_user_template(name, by), tg.remove_user_template(name, by)) + + +async def create_node(node: NodeResponse, by: str): + if (await notification_enable()).node: + await asyncio.gather(ds.create_node(node, by), tg.create_node(node, by)) + + +async def modify_node(node: NodeResponse, by: str): + if (await notification_enable()).node: + await asyncio.gather(ds.modify_node(node, by), tg.modify_node(node, by)) + + +async def remove_node(node: NodeResponse, by: str): + if (await notification_enable()).node: + await asyncio.gather(ds.remove_node(node, by), tg.remove_node(node, by)) + + +async def connect_node(node: NodeResponse): + if (await notification_enable()).node: + await asyncio.gather(ds.connect_node(node), tg.connect_node(node)) + + +async def error_node(node: NodeResponse): + if (await notification_enable()).node: + await asyncio.gather(ds.error_node(node), tg.error_node(node)) + + +async def create_group(group: GroupResponse, by: str): + if (await notification_enable()).group: + await asyncio.gather(ds.create_group(group, by), tg.create_group(group, by)) + + +async def modify_group(group: GroupResponse, by: str): + if (await notification_enable()).group: + await asyncio.gather(ds.modify_group(group, by), tg.modify_group(group, by)) + + +async def remove_group(group_id: int, by: str): + if (await notification_enable()).group: + await asyncio.gather(ds.remove_group(group_id, by), tg.remove_group(group_id, by)) + + +async def create_admin(admin: AdminDetails, by: str): + if (await notification_enable()).admin: + await asyncio.gather(ds.create_admin(admin, by), tg.create_admin(admin, by)) + + +async def modify_admin(admin: AdminDetails, by: str): + if (await notification_enable()).admin: + await asyncio.gather(ds.modify_admin(admin, by), tg.modify_admin(admin, by)) + + +async def remove_admin(username: str, by: str): + if (await notification_enable()).admin: + await asyncio.gather(ds.remove_admin(username, by), tg.remove_admin(username, by)) + + +async def admin_usage_reset(admin: AdminDetails, by: str): + if (await notification_enable()).admin: + await asyncio.gather(ds.admin_reset_usage(admin, by), tg.admin_reset_usage(admin, by)) + + +async def admin_login(username: str, password: str, client_ip: str, success: bool): + if (await notification_enable()).login: + await asyncio.gather( + ds.admin_login(username, password, client_ip, success), + tg.admin_login(username, password, client_ip, success), + ) + + +async def user_status_change(user: UserNotificationResponse, by: AdminDetails): + if (await notification_enable()).user: + await asyncio.gather( + ds.user_status_change(user, by.username), tg.user_status_change(user, by.username), wh.status_change(user) + ) + + +async def create_user(user: UserNotificationResponse, by: AdminDetails): + if (await notification_enable()).user: + await asyncio.gather( + ds.create_user(user, by.username), + tg.create_user(user, by.username), + wh.notify(wh.UserCreated(username=user.username, user=user, by=by)), + ) + + +async def modify_user(user: UserNotificationResponse, by: AdminDetails): + if (await notification_enable()).user: + await asyncio.gather( + ds.modify_user(user, by.username), + tg.modify_user(user, by.username), + wh.notify(wh.UserUpdated(username=user.username, user=user, by=by)), + ) + + +async def remove_user(user: UserNotificationResponse, by: AdminDetails): + if (await notification_enable()).user: + await asyncio.gather( + ds.remove_user(user, by.username), + tg.remove_user(user, by.username), + wh.notify(wh.UserDeleted(username=user.username, user=user, by=by)), + ) + + +async def reset_user_data_usage(user: UserNotificationResponse, by: AdminDetails): + if (await notification_enable()).user: + await asyncio.gather( + ds.reset_user_data_usage(user, by.username), + tg.reset_user_data_usage(user, by.username), + wh.notify(wh.UserDataUsageReset(username=user.username, user=user, by=by)), + ) + + +async def user_data_reset_by_next(user: UserNotificationResponse, by: AdminDetails): + if (await notification_enable()).user: + await asyncio.gather( + ds.user_data_reset_by_next(user, by.username), + tg.user_data_reset_by_next(user, by.username), + wh.notify(wh.UserDataResetByNext(username=user.username, user=user, by=by)), + ) + + +async def user_subscription_revoked(user: UserNotificationResponse, by: AdminDetails): + if (await notification_enable()).user: + await asyncio.gather( + ds.user_subscription_revoked(user, by.username), + tg.user_subscription_revoked(user, by.username), + wh.notify(wh.UserSubscriptionRevoked(username=user.username, user=user, by=by)), + ) + + +async def create_core(core: CoreResponse, by: str): + if (await notification_enable()).core: + await asyncio.gather(ds.create_core(core, by), tg.create_core(core, by)) + + +async def modify_core(core: CoreResponse, by: str): + if (await notification_enable()).core: + await asyncio.gather(ds.modify_core(core, by), tg.modify_core(core, by)) + + +async def remove_core(core_id: int, by: str): + if (await notification_enable()).core: + await asyncio.gather(ds.remove_core(core_id, by), tg.remove_core(core_id, by)) diff --git a/app/notification/client.py b/app/notification/client.py new file mode 100644 index 000000000..8bfb4b960 --- /dev/null +++ b/app/notification/client.py @@ -0,0 +1,113 @@ +import httpx +import asyncio + +from app.models.settings import NotificationSettings +from app.settings import notification_settings +from app.utils.logger import get_logger +from app import on_startup + + +client = None + + +async def define_client(): + """ + Re-create the global httpx.AsyncClient. + Call this function after changing the proxy setting. + """ + global client + if client and not client.is_closed: + asyncio.create_task(client.aclose()) + client = httpx.AsyncClient( + http2=True, + timeout=httpx.Timeout(10), + proxy=(await notification_settings()).proxy_url, + ) + + +on_startup(define_client) + +logger = get_logger("Notification") + + +async def send_discord_webhook(json_data, webhook): + max_retries = (await notification_settings()).max_retries + retries = 0 + while retries < max_retries: + try: + response = await client.post(webhook, json=json_data) + if response.status_code in [200, 204]: + logger.debug(f"Discord webhook payload delivered successfully, code {response.status_code}.") + return + elif response.status_code == 429: + retries += 1 + if retries < max_retries: + await asyncio.sleep(0.5) + continue + else: + response_text = response.text + logger.error(f"Discord webhook failed: {response.status_code} - {response_text}") + return + except Exception as err: + logger.error(f"Discord webhook failed Exception: {str(err)}") + return + + logger.error(f"Discord webhook failed after {max_retries} retries") + + +async def send_telegram_message( + message, chat_id: int | None = None, channel_id: int | None = None, topic_id: int | None = None +): + """ + Send a message to Telegram based on the available IDs. + Args: + message (str): The message to send + chat_id (int, optional): The chat ID for direct messages + channel_id (int, optional): The channel ID for channel messages + topic_id (int, optional): The topic ID for forum topics in channels + Returns: + bool: True if message was sent successfully, False otherwise + """ + # Ensure TELEGRAM_API_TOKEN is available + settings: NotificationSettings = await notification_settings() + if not settings.telegram_api_token: + logger.error("TELEGRAM_API_TOKEN is not defined") + return + + base_url = f"https://api.telegram.org/bot{settings.telegram_api_token}/sendMessage" + payload = {"parse_mode": "HTML", "text": message} + + # Determine the target chat/channel/topic + if topic_id and channel_id: + payload["chat_id"] = channel_id + payload["message_thread_id"] = topic_id + elif channel_id: + payload["chat_id"] = channel_id + elif chat_id: + payload["chat_id"] = chat_id + else: + logger.error("At least one of chat_id, channel_id must be provided") + return + + max_retries = settings.max_retries + retries = 0 + while retries < max_retries: + try: + response = await client.post(base_url, data=payload) + if response.status_code == 200: + logger.debug(f"Telegram message sent successfully, code {response.status_code}.") + return + elif response.status_code == 429: + retries += 1 + if retries < max_retries: + await asyncio.sleep(0.5) + continue + else: + response_text = response.text + logger.error(f"Telegram message failed: {response.status_code} - {response_text}") + return + except Exception as err: + logger.error(f"Telegram message failed: {str(err)}") + return + + logger.error(f"Telegram message failed after {max_retries} retries") diff --git a/app/notification/discord/__init__.py b/app/notification/discord/__init__.py new file mode 100644 index 000000000..94f5c9bd7 --- /dev/null +++ b/app/notification/discord/__init__.py @@ -0,0 +1,48 @@ +from .host import create_host, modify_host, remove_host, modify_hosts +from .user_template import create_user_template, modify_user_template, remove_user_template +from .node import create_node, modify_node, remove_node, connect_node, error_node +from .group import create_group, modify_group, remove_group +from .core import create_core, modify_core, remove_core +from .admin import create_admin, modify_admin, remove_admin, admin_reset_usage, admin_login +from .user import ( + user_status_change, + create_user, + modify_user, + remove_user, + reset_user_data_usage, + user_data_reset_by_next, + user_subscription_revoked, +) + +__all__ = [ + "create_host", + "modify_host", + "remove_host", + "modify_hosts", + "create_user_template", + "modify_user_template", + "remove_user_template", + "create_node", + "modify_node", + "remove_node", + "connect_node", + "error_node", + "create_group", + "modify_group", + "remove_group", + "create_core", + "modify_core", + "remove_core", + "create_admin", + "modify_admin", + "remove_admin", + "admin_reset_usage", + "admin_login", + "user_status_change", + "create_user", + "modify_user", + "remove_user", + "reset_user_data_usage", + "user_data_reset_by_next", + "user_subscription_revoked", +] diff --git a/app/notification/discord/admin.py b/app/notification/discord/admin.py new file mode 100644 index 000000000..ed26f146d --- /dev/null +++ b/app/notification/discord/admin.py @@ -0,0 +1,97 @@ +import copy + +from app.notification.client import send_discord_webhook +from app.models.admin import AdminDetails +from app.models.settings import NotificationSettings +from app.settings import notification_settings +from app.utils.helpers import escape_ds_markdown_list + +from . import colors, messages + + +async def create_admin(admin: AdminDetails, by: str): + username, by = escape_ds_markdown_list((admin.username, by)) + message = copy.deepcopy(messages.CREATE_ADMIN) + message["description"] = message["description"].format( + username=username, + is_sudo=admin.is_sudo, + is_disabled=admin.is_disabled, + used_traffic=admin.used_traffic, + ) + message["footer"]["text"] = message["footer"]["text"].format(by=by) + data = { + "content": "", + "embeds": [message], + } + data["embeds"][0]["color"] = colors.GREEN + settings: NotificationSettings = await notification_settings() + if settings.notify_discord: + await send_discord_webhook(data, settings.discord_webhook_url) + + +async def modify_admin(admin: AdminDetails, by: str): + username, by = escape_ds_markdown_list((admin.username, by)) + message = copy.deepcopy(messages.MODIFY_ADMIN) + message["description"] = message["description"].format( + username=username, + is_sudo=admin.is_sudo, + is_disabled=admin.is_disabled, + used_traffic=admin.used_traffic, + ) + message["footer"]["text"] = message["footer"]["text"].format(by=by) + data = { + "content": "", + "embeds": [message], + } + data["embeds"][0]["color"] = colors.YELLOW + settings: NotificationSettings = await notification_settings() + if settings.notify_discord: + await send_discord_webhook(data, settings.discord_webhook_url) + + +async def remove_admin(username: str, by: str): + username, by = escape_ds_markdown_list((username, by)) + message = copy.deepcopy(messages.REMOVE_ADMIN) + message["description"] = message["description"].format(username=username) + message["footer"]["text"] = message["footer"]["text"].format(by=by) + data = { + "content": "", + "embeds": [message], + } + data["embeds"][0]["color"] = colors.RED + settings: NotificationSettings = await notification_settings() + if settings.notify_discord: + await send_discord_webhook(data, settings.discord_webhook_url) + + +async def admin_reset_usage(admin: AdminDetails, by: str): + username, by = escape_ds_markdown_list((admin.username, by)) + message = copy.deepcopy(messages.ADMIN_RESET_USAGE) + message["description"] = message["description"].format(username=username) + message["footer"]["text"] = message["footer"]["text"].format(by=by) + data = { + "content": "", + "embeds": [message], + } + data["embeds"][0]["color"] = colors.CYAN + settings: NotificationSettings = await notification_settings() + if settings.notify_discord: + await send_discord_webhook(data, settings.discord_webhook_url) + + +async def admin_login(username: str, password: str, client_ip: str, success: bool): + username, password = escape_ds_markdown_list((username, password)) + message = copy.deepcopy(messages.ADMIN_LOGIN) + message["description"] = message["description"].format( + username=username, + password="🔒" if success else password, + client_ip=client_ip, + ) + message["footer"]["text"] = message["footer"]["text"].format(status="Successful" if success else "Failed") + data = { + "embeds": [message], + } + data["embeds"][0]["color"] = colors.GREEN if success else colors.RED + settings: NotificationSettings = await notification_settings() + if settings.notify_discord: + await send_discord_webhook(data, settings.discord_webhook_url) diff --git a/app/notification/discord/colors.py b/app/notification/discord/colors.py new file mode 100644 index 000000000..56294e2ca --- /dev/null +++ b/app/notification/discord/colors.py @@ -0,0 +1,7 @@ +RED = 0xFF4F4F +GREEN = 0x4FFF4F +BLUE = 0x4F4FFF +YELLOW = 0xFFFF4F +PURPLE = 0xFF4FFF +CYAN = 0x4FFFFF +WHITE = 0xFFFFFF diff --git a/app/notification/discord/core.py b/app/notification/discord/core.py new file mode 100644 index 000000000..8a573594b --- /dev/null +++ b/app/notification/discord/core.py @@ -0,0 +1,63 @@ +import copy + +from app.notification.client import send_discord_webhook +from app.models.core import CoreResponse +from app.models.settings import NotificationSettings +from app.settings import notification_settings +from app.utils.helpers import escape_ds_markdown + +from . import colors, messages +from .utils import escape_md_core + + +async def create_core(core: CoreResponse, by: str): + name, exclude_inbound_tags, fallbacks_inbound_tags, by = escape_md_core(core, by) + message = copy.deepcopy(messages.CREATE_CORE) + message["description"] = message["description"].format( + name=name, + exclude_inbound_tags=exclude_inbound_tags, + fallbacks_inbound_tags=fallbacks_inbound_tags, + ) + message["footer"]["text"] = message["footer"]["text"].format(id=core.id, by=by) + data = { + "content": "", + "embeds": [message], + } + data["embeds"][0]["color"] = colors.GREEN + settings: NotificationSettings = await notification_settings() + if settings.notify_discord: + await send_discord_webhook(data, settings.discord_webhook_url) + + +async def modify_core(core: CoreResponse, by: str): + name, exclude_inbound_tags, fallbacks_inbound_tags, by = escape_md_core(core, by) + message = copy.deepcopy(messages.MODIFY_CORE) + message["description"] = message["description"].format( + name=name, + exclude_inbound_tags=exclude_inbound_tags, + fallbacks_inbound_tags=fallbacks_inbound_tags, + ) + message["footer"]["text"] = message["footer"]["text"].format(id=core.id, by=by) + data = { + "content": "", + "embeds": [message], + } + data["embeds"][0]["color"] = colors.YELLOW + settings: NotificationSettings = await notification_settings() + if settings.notify_discord: + await send_discord_webhook(data, settings.discord_webhook_url) + + +async def remove_core(core_id: int, by: str): + by = escape_ds_markdown(by) + message = copy.deepcopy(messages.REMOVE_CORE) + message["description"] = message["description"].format(id=core_id) + message["footer"]["text"] = message["footer"]["text"].format(by=by) + data = { + "content": "", + "embeds": [message], + } + data["embeds"][0]["color"] = colors.RED + settings: NotificationSettings = await notification_settings() + if settings.notify_discord: + await send_discord_webhook(data, settings.discord_webhook_url) diff --git a/app/notification/discord/group.py b/app/notification/discord/group.py new file mode 100644 index 000000000..796fba2e4 --- /dev/null +++ b/app/notification/discord/group.py @@ -0,0 +1,62 @@ +import copy + +from app.notification.client import send_discord_webhook +from app.models.group import GroupResponse +from app.models.settings import NotificationSettings +from app.settings import notification_settings +from app.utils.helpers import escape_ds_markdown_list, escape_ds_markdown + +from . import colors, messages + + +async def create_group(group: GroupResponse, by: str): + name, by = escape_ds_markdown_list((group.name, by)) + message = copy.deepcopy(messages.CREATE_GROUP) + message["description"] = message["description"].format( + name=name, + inbound_tags=group.inbound_tags, + is_disabled=group.is_disabled, + ) + message["footer"]["text"] = message["footer"]["text"].format(id=group.id, by=by) + data = { + "content": "", + "embeds": [message], + } + data["embeds"][0]["color"] = colors.GREEN + settings: NotificationSettings = await notification_settings() + if settings.notify_discord: + await send_discord_webhook(data, settings.discord_webhook_url) + + +async def modify_group(group: GroupResponse, by: str): + name, by = escape_ds_markdown_list((group.name, by)) + message = copy.deepcopy(messages.MODIFY_GROUP) + message["description"] = message["description"].format( + name=name, + inbound_tags=group.inbound_tags, + is_disabled=group.is_disabled, + ) + message["footer"]["text"] = message["footer"]["text"].format(id=group.id, by=by) + data = { + "content": "", + "embeds": [message], + } + data["embeds"][0]["color"] = colors.YELLOW + settings: NotificationSettings = await notification_settings() + if settings.notify_discord: + await send_discord_webhook(data, settings.discord_webhook_url) + + +async def remove_group(group_id: int, by: str): + by = escape_ds_markdown(by) + message = copy.deepcopy(messages.REMOVE_GROUP) + message["description"] = message["description"].format(id=group_id) + message["footer"]["text"] = message["footer"]["text"].format(by=by) + data = { + "content": "", + "embeds": [message], + } + data["embeds"][0]["color"] = colors.RED + settings: NotificationSettings = await notification_settings() + if settings.notify_discord: + await send_discord_webhook(data, settings.discord_webhook_url) diff --git a/app/notification/discord/host.py b/app/notification/discord/host.py new file mode 100644 index 000000000..788baadb5 --- /dev/null +++ b/app/notification/discord/host.py @@ -0,0 +1,73 @@ +import copy + +from app.notification.client import send_discord_webhook +from app.models.host import BaseHost +from app.models.settings import NotificationSettings +from app.settings import notification_settings +from app.utils.helpers import escape_ds_markdown_list, escape_ds_markdown + +from .utils import escape_md_host +from . import colors, messages + + +async def create_host(host: BaseHost, by: str): + remark, address, inbound_tag, by = escape_md_host(host, by) + message = copy.deepcopy(messages.CREATE_HOST) + message["description"] = message["description"].format( + remark=remark, address=address, inbound_tag=inbound_tag, port=host.port + ) + message["footer"]["text"] = message["footer"]["text"].format(id=host.id, by=by) + data = { + "content": "", + "embeds": [message], + } + data["embeds"][0]["color"] = colors.GREEN + settings: NotificationSettings = await notification_settings() + if settings.notify_discord: + await send_discord_webhook(data, settings.discord_webhook_url) + + +async def modify_host(host: BaseHost, by: str): + remark, address, inbound_tag, by = escape_md_host(host, by) + message = copy.deepcopy(messages.MODIFY_HOST) + message["description"] = message["description"].format( + remark=remark, address=address, inbound_tag=inbound_tag, port=host.port + ) + message["footer"]["text"] = message["footer"]["text"].format(id=host.id, by=by) + data = { + "content": "", + "embeds": [message], + } + data["embeds"][0]["color"] = colors.YELLOW + settings: NotificationSettings = await notification_settings() + if settings.notify_discord: + await send_discord_webhook(data, settings.discord_webhook_url) + + +async def remove_host(host: BaseHost, by: str): + remark, by = escape_ds_markdown_list((host.remark, by)) + message = copy.deepcopy(messages.REMOVE_HOST) + message["description"] = message["description"].format(remark=remark) + message["footer"]["text"] = message["footer"]["text"].format(id=host.id, by=by) + data = { + "content": "", + "embeds": [message], + } + data["embeds"][0]["color"] = colors.RED + settings: NotificationSettings = await notification_settings() + if settings.notify_discord: + await send_discord_webhook(data, settings.discord_webhook_url) + + +async def modify_hosts(by: str): + by = escape_ds_markdown(by) + message = copy.deepcopy(messages.MODIFY_HOSTS) + message["description"] = message["description"].format(by=by) + data = { + "content": "", + "embeds": [message], + } + data["embeds"][0]["color"] = colors.CYAN + settings: NotificationSettings = await notification_settings() + if settings.notify_discord: + await send_discord_webhook(data, settings.discord_webhook_url) diff --git a/app/notification/discord/messages.py b/app/notification/discord/messages.py new file mode 100644 index 000000000..a27af4761 --- /dev/null +++ b/app/notification/discord/messages.py @@ -0,0 +1,252 @@ +# In this file, we define message templates for Discord notifications. +# Using templates helps to avoid string concatenation and improves code readability. + +USER_CREATED = { + "title": "New User Created", + "fields": [ + {"name": "Username", "value": "{username}", "inline": True}, + {"name": "Data Limit", "value": "{data_limit}", "inline": True}, + {"name": "Expire Date", "value": "{expire_date}", "inline": True}, + ], +} + +USER_UPDATED = { + "title": "User Updated", + "fields": [ + {"name": "Username", "value": "{username}", "inline": True}, + {"name": "Data Limit", "value": "{data_limit}", "inline": True}, + {"name": "Expire Date", "value": "{expire_date}", "inline": True}, + ], +} + +USER_DELETED = { + "title": "User Deleted", + "fields": [ + {"name": "Username", "value": "{username}", "inline": True}, + ], +} + +USER_EXPIRED = { + "title": "User Expired", + "fields": [ + {"name": "Username", "value": "{username}", "inline": True}, + ], +} + +USER_LIMITED = { + "title": "User Data Usage Limited", + "fields": [ + {"name": "Username", "value": "{username}", "inline": True}, + ], +} + +USER_STATUS_CHANGE = { + "title": "{status}", + "description": "**Username:** {username}\n", + "footer": {"text": "Belongs To:{admin_username}\nBy: {by}"}, +} + +CREATE_USER = { + "title": "🆕 Create User", + "description": "**Username:** {username}\n" + + "**Data Limit**: {data_limit}\n" + + "**Expire Date:** {expire_date}\n" + + "**Data Limit Reset Strategy:** {data_limit_reset_strategy}\n" + + "**Has Next Plan**: {has_next_plan}", + "footer": {"text": "Belongs To:{admin_username}\nBy: {by}"}, +} + +MODIFY_USER = { + "title": "✏️ Modify User", + "description": "**Username:** {username}\n" + + "**Data Limit**: {data_limit}\n" + + "**Expire Date:** {expire_date}\n" + + "**Data Limit Reset Strategy:** {data_limit_reset_strategy}\n" + + "**Has Next Plan**: {has_next_plan}", + "footer": {"text": "Belongs To:{admin_username}\nBy: {by}"}, +} + +REMOVE_USER = { + "title": "🗑️ Remove User", + "description": "**Username:** {username}\n", + "footer": {"text": "ID: {id}\nBelongs To:{admin_username}\nBy: {by}"}, +} + +RESET_USER_DATA_USAGE = { + "title": "🔁 Reset User Data Usage", + "description": "**Username:** {username}\n" + "**Data Limit**: {data_limit}\n", + "footer": {"text": "ID: {id}\nBelongs To:{admin_username}\nBy: {by}"}, +} + +USER_DATA_RESET_BY_NEXT = { + "title": "🔁 Reset User", + "description": "**Username:** {username}\n" + "**Data Limit**: {data_limit}\n" + "**Expire Date:** {expire_date}", + "footer": {"text": "ID: {id}\nBelongs To:{admin_username}\nBy: {by}"}, +} + +USER_SUBSCRIPTION_REVOKED = { + "title": "🛑 Revoke User Subscribtion", + "description": "**Username:** {username}\n", + "footer": {"text": "ID: {id}\nBelongs To:{admin_username}\nBy: {by}"}, +} + +CREATE_ADMIN = { + "title": "Create Admin", + "description": "**Username:** {username}\n" + + "**Is Sudo:** {is_sudo}\n" + + "**Is Disabled:** {is_disabled}\n" + + "**Used Traffic:** {used_traffic}\n", + "footer": {"text": "By: {by}"}, +} + +MODIFY_ADMIN = { + "title": "Modify Admin", + "description": "**Username:** {username}\n" + + "**Is Sudo:** {is_sudo}\n" + + "**Is Disabled:** {is_disabled}\n" + + "**Used Traffic:** {used_traffic}\n", + "footer": {"text": "By: {by}"}, +} + +REMOVE_ADMIN = { + "title": "Remove Admin", + "description": "**Username:** {username}\n", + "footer": {"text": "By: {by}"}, +} + +ADMIN_RESET_USAGE = { + "title": "Admin Reset Usage", + "description": "**Username:** {username}\n", + "footer": {"text": "By: {by}"}, +} + +ADMIN_LOGIN = { + "title": "Login Attempt", + "description": "**Username:** {username}\n**Password:** {password}\n**IP:** {client_ip}", + "footer": {"text": "{status}"}, +} + +CREATE_HOST = { + "title": "Create Host", + "description": "**Remark:** {remark}\n" + + "**Address:** {address}\n" + + "**Inbound Tag:** {inbound_tag}\n" + + "**Port:** {port}", + "footer": {"text": "ID: {id}\nBy: {by}"}, +} + +MODIFY_HOST = { + "title": "Modify Host", + "description": "**Remark:** {remark}\n" + + "**Address:** {address}\n" + + "**Inbound Tag:** {inbound_tag}\n" + + "**Port:** {port}", + "footer": {"text": "ID: {id}\nBy: {by}"}, +} + +REMOVE_HOST = { + "title": "Remove Host", + "description": "**Remark:** {remark}", + "footer": {"text": "ID: {id}\nBy: {by}"}, +} + +MODIFY_HOSTS = { + "title": "Modify Hosts", + "description": "All hosts has been updated by **{by}**", +} + +CREATE_NODE = { + "title": "Create Node", + "description": "**Name:** {name}\n**Address:** {address}\n**Port:** {port}", + "footer": {"text": "ID: {id}\nBy: {by}"}, +} + +MODIFY_NODE = { + "title": "Modify Node", + "description": "**Name:** {name}\n**Address:** {address}\n**Port:** {port}", + "footer": {"text": "ID: {id}\nBy: {by}"}, +} + +REMOVE_NODE = { + "title": "Remove Node", + "description": "**Name:** {name}\n**Address:** {address}\n**Port:** {port}", + "footer": {"text": "ID: {id}\nBy: {by}"}, +} + +CONNECT_NODE = { + "title": "Connect Node", + "description": "**Name:** {name}\n" + "**Node Version:** {node_version}\n" + "**Core Version:** {core_version}", + "footer": {"text": "ID: {id}"}, +} + +ERROR_NODE = { + "title": "Error Node", + "description": "**Name:** {name}\n**Error:** {error}", + "footer": {"text": "ID: {id}"}, +} + +CREATE_USER_TEMPLATE = { + "title": "Create User Template", + "description": "**Name:** {name}\n" + + "**Data Limit**: {data_limit}\n" + + "**Expire Duration**: {expire_duration}\n" + + "**Username Prefix**: {username_prefix}\n" + + "**Username Suffix**: {username_suffix}\n", + "footer": {"text": "By: {by}"}, +} + +MODIFY_USER_TEMPLATE = { + "title": "Modify User Template", + "description": "**Name:** {name}\n" + + "**Data Limit**: {data_limit}\n" + + "**Expire Duration**: {expire_duration}\n" + + "**Username Prefix**: {username_prefix}\n" + + "**Username Suffix**: {username_suffix}\n", + "footer": {"text": "By: {by}"}, +} + +REMOVE_USER_TEMPLATE = { + "title": "Remove User Template", + "description": "**Name:** {name}\n", + "footer": {"text": "By: {by}"}, +} + +CREATE_CORE = { + "title": "Create core", + "description": "**Name:** {name}\n" + + "**Exclude inbound tags:** {exclude_inbound_tags}\n" + + "**Fallbacks inbound tags:** {fallbacks_inbound_tags}\n", + "footer": {"text": "ID: {id}\nBy: {by}"}, +} + +MODIFY_CORE = { + "title": "Modify core", + "description": "**Name:** {name}\n" + + "**Exclude inbound tags:** {exclude_inbound_tags}\n" + + "**Fallbacks inbound tags:** {fallbacks_inbound_tags}\n", + "footer": {"text": "ID: {id}\nBy: {by}"}, +} + +REMOVE_CORE = { + "title": "Remove core", + "description": "**ID:** {id}", + "footer": {"text": "By: {by}"}, +} + +CREATE_GROUP = { + "title": "Create Group", + "description": "**Name:** {name}\n" + "**Inbound Tags:** {inbound_tags}\n" + "**Is Disabled:** {is_disabled}\n", + "footer": {"text": "ID: {id}\nBy: {by}"}, +} + +MODIFY_GROUP = { + "title": "Modify Group", + "description": "**Name:** {name}\n" + "**Inbound Tags:** {inbound_tags}\n" + "**Is Disabled:** {is_disabled}\n", + "footer": {"text": "ID: {id}\nBy: {by}"}, +} + +REMOVE_GROUP = { + "title": "Remove Group", + "description": "**ID:** {id}", + "footer": {"text": "By: {by}"}, +} diff --git a/app/notification/discord/node.py b/app/notification/discord/node.py new file mode 100644 index 000000000..2fbed9356 --- /dev/null +++ b/app/notification/discord/node.py @@ -0,0 +1,86 @@ +import copy + +from app.notification.client import send_discord_webhook +from app.models.node import NodeResponse +from app.models.settings import NotificationSettings +from app.settings import notification_settings +from app.utils.helpers import escape_ds_markdown_list, escape_ds_markdown + +from . import colors, messages + + +async def create_node(node: NodeResponse, by: str): + name, by = escape_ds_markdown_list((node.name, by)) + message = copy.deepcopy(messages.CREATE_NODE) + message["description"] = message["description"].format(name=name, address=node.address, port=node.port) + message["footer"]["text"] = message["footer"]["text"].format(id=node.id, by=by) + data = { + "content": "", + "embeds": [message], + } + data["embeds"][0]["color"] = colors.GREEN + settings: NotificationSettings = await notification_settings() + if settings.notify_discord: + await send_discord_webhook(data, settings.discord_webhook_url) + + +async def modify_node(node: NodeResponse, by: str): + name, by = escape_ds_markdown_list((node.name, by)) + message = copy.deepcopy(messages.MODIFY_NODE) + message["description"] = message["description"].format(name=name, address=node.address, port=node.port) + message["footer"]["text"] = message["footer"]["text"].format(id=node.id, by=by) + data = { + "content": "", + "embeds": [message], + } + data["embeds"][0]["color"] = colors.YELLOW + settings: NotificationSettings = await notification_settings() + if settings.notify_discord: + await send_discord_webhook(data, settings.discord_webhook_url) + + +async def remove_node(node: NodeResponse, by: str): + name, by = escape_ds_markdown_list((node.name, by)) + message = copy.deepcopy(messages.REMOVE_NODE) + message["description"] = message["description"].format(name=name, address=node.address, port=node.port) + message["footer"]["text"] = message["footer"]["text"].format(id=node.id, by=by) + data = { + "content": "", + "embeds": [message], + } + data["embeds"][0]["color"] = colors.RED + settings: NotificationSettings = await notification_settings() + if settings.notify_discord: + await send_discord_webhook(data, settings.discord_webhook_url) + + +async def connect_node(node: NodeResponse): + name = escape_ds_markdown(node.name) + message = copy.deepcopy(messages.CONNECT_NODE) + message["description"] = message["description"].format( + name=name, node_version=node.node_version, core_version=node.xray_version + ) + message["footer"]["text"] = message["footer"]["text"].format(id=node.id) + data = { + "content": "", + "embeds": [message], + } + data["embeds"][0]["color"] = colors.GREEN + settings: NotificationSettings = await notification_settings() + if settings.notify_discord: + await send_discord_webhook(data, settings.discord_webhook_url) + + +async def error_node(node: NodeResponse): + name, node_message = escape_ds_markdown_list((node.name, node.message)) + message = copy.deepcopy(messages.ERROR_NODE) + message["description"] = message["description"].format(name=name, error=node_message) + message["footer"]["text"] = message["footer"]["text"].format(id=node.id) + data = { + "content": "", + "embeds": [message], + } + data["embeds"][0]["color"] = colors.RED + settings: NotificationSettings = await notification_settings() + if settings.notify_discord: + await send_discord_webhook(data, settings.discord_webhook_url) diff --git a/app/notification/discord/user.py b/app/notification/discord/user.py new file mode 100644 index 000000000..374c56fa6 --- /dev/null +++ b/app/notification/discord/user.py @@ -0,0 +1,164 @@ +import copy + +from app.notification.client import send_discord_webhook +from app.models.user import UserNotificationResponse +from app.utils.system import readable_size +from app.models.settings import NotificationSettings +from app.settings import notification_settings + +from . import colors, messages +from .utils import escape_md_user + +_status = { + "active": "**✅ Activated**", + "on_hold": "**🕔 On Hold**", + "disabled": "**❌ Disabled**", + "limited": "**🪫 Limited**", + "expired": "**📅 Expired**", +} +_status_color = { + "active": colors.GREEN, + "on_hold": colors.PURPLE, + "disabled": colors.WHITE, + "limited": colors.RED, + "expired": colors.YELLOW, +} + + +async def user_status_change(user: UserNotificationResponse, by: str): + username, admin_username, by = escape_md_user(user, by) + message = copy.deepcopy(messages.USER_STATUS_CHANGE) + message["title"] = message["title"].format(status=_status[user.status.value]) + message["description"] = message["description"].format(username=username) + message["footer"]["text"] = message["footer"]["text"].format(admin_username=admin_username, by=by) + data = { + "content": "", + "embeds": [message], + } + data["embeds"][0]["color"] = _status_color[user.status.value] + settings: NotificationSettings = await notification_settings() + if settings.notify_discord: + await send_discord_webhook(data, settings.discord_webhook_url) + if user.admin and user.admin.discord_webhook: + await send_discord_webhook(data, user.admin.discord_webhook) + + +async def create_user(user: UserNotificationResponse, by: str): + username, admin_username, by = escape_md_user(user, by) + message = copy.deepcopy(messages.CREATE_USER) + message["description"] = message["description"].format( + username=username, + data_limit=readable_size(user.data_limit) if user.data_limit else "Unlimited", + expire_date=user.expire if user.expire else "Never", + data_limit_reset_strategy=user.data_limit_reset_strategy.value, + has_next_plan=bool(user.next_plan), + ) + message["footer"]["text"] = message["footer"]["text"].format(admin_username=admin_username, by=by) + data = { + "content": "", + "embeds": [message], + } + data["embeds"][0]["color"] = colors.GREEN + settings: NotificationSettings = await notification_settings() + if settings.notify_discord: + await send_discord_webhook(data, settings.discord_webhook_url) + if user.admin and user.admin.discord_webhook: + await send_discord_webhook(data, user.admin.discord_webhook) + + +async def modify_user(user: UserNotificationResponse, by: str): + username, admin_username, by = escape_md_user(user, by) + message = copy.deepcopy(messages.MODIFY_USER) + message["description"] = message["description"].format( + username=username, + data_limit=readable_size(user.data_limit) if user.data_limit else "Unlimited", + expire_date=user.expire if user.expire else "Never", + data_limit_reset_strategy=user.data_limit_reset_strategy.value, + has_next_plan=bool(user.next_plan), + ) + message["footer"]["text"] = message["footer"]["text"].format(admin_username=admin_username, by=by) + data = { + "content": "", + "embeds": [message], + } + data["embeds"][0]["color"] = colors.YELLOW + settings: NotificationSettings = await notification_settings() + if settings.notify_discord: + await send_discord_webhook(data, settings.discord_webhook_url) + if user.admin and user.admin.discord_webhook: + await send_discord_webhook(data, user.admin.discord_webhook) + + +async def remove_user(user: UserNotificationResponse, by: str): + username, admin_username, by = escape_md_user(user, by) + message = copy.deepcopy(messages.REMOVE_USER) + message["description"] = message["description"].format(username=username) + message["footer"]["text"] = message["footer"]["text"].format(id=user.id, admin_username=admin_username, by=by) + data = { + "content": "", + "embeds": [message], + } + data["embeds"][0]["color"] = colors.RED + settings: NotificationSettings = await notification_settings() + if settings.notify_discord: + await send_discord_webhook(data, settings.discord_webhook_url) + if user.admin and user.admin.discord_webhook: + await send_discord_webhook(data, user.admin.discord_webhook) + + +async def reset_user_data_usage(user: UserNotificationResponse, by: str): + username, admin_username, by = escape_md_user(user, by) + message = copy.deepcopy(messages.RESET_USER_DATA_USAGE) + message["description"] = message["description"].format( + username=username, + data_limit=readable_size(user.data_limit) if user.data_limit else "Unlimited", + ) + message["footer"]["text"] = message["footer"]["text"].format(id=user.id, admin_username=admin_username, by=by) + data = { + "content": "", + "embeds": [message], + } + data["embeds"][0]["color"] = colors.CYAN + settings: NotificationSettings = await notification_settings() + if settings.notify_discord: + await send_discord_webhook(data, settings.discord_webhook_url) + if user.admin and user.admin.discord_webhook: + await send_discord_webhook(data, user.admin.discord_webhook) + + +async def user_data_reset_by_next(user: UserNotificationResponse, by: str): + username, admin_username, by = escape_md_user(user, by) + message = copy.deepcopy(messages.USER_DATA_RESET_BY_NEXT) + message["description"] = message["description"].format( + username=username, + data_limit=readable_size(user.data_limit) if user.data_limit else "Unlimited", + expire_date=user.expire if user.expire else "Never", + ) + message["footer"]["text"] = message["footer"]["text"].format(id=user.id, admin_username=admin_username, by=by) + data = { + "content": "", + "embeds": [message], + } + data["embeds"][0]["color"] = colors.CYAN + settings: NotificationSettings = await notification_settings() + if settings.notify_discord: + await send_discord_webhook(data, settings.discord_webhook_url) + if user.admin and user.admin.discord_webhook: + await send_discord_webhook(data, user.admin.discord_webhook) + + +async def user_subscription_revoked(user: UserNotificationResponse, by: str): + username, admin_username, by = escape_md_user(user, by) + message = copy.deepcopy(messages.USER_SUBSCRIPTION_REVOKED) + message["description"] = message["description"].format(username=username) + message["footer"]["text"] = message["footer"]["text"].format(id=user.id, admin_username=admin_username, by=by) + data = { + "content": "", + "embeds": [message], + } + data["embeds"][0]["color"] = colors.RED + settings: NotificationSettings = await notification_settings() + if settings.notify_discord: + await send_discord_webhook(data, settings.discord_webhook_url) + if user.admin and user.admin.discord_webhook: + await send_discord_webhook(data, user.admin.discord_webhook) diff --git a/app/notification/discord/user_template.py b/app/notification/discord/user_template.py new file mode 100644 index 000000000..c7ee9aed0 --- /dev/null +++ b/app/notification/discord/user_template.py @@ -0,0 +1,67 @@ +import copy + +from app.notification.client import send_discord_webhook +from app.models.user_template import UserTemplateResponse +from app.models.settings import NotificationSettings +from app.settings import notification_settings +from app.utils.helpers import escape_ds_markdown_list + +from . import colors, messages +from .utils import escape_md_template + + +async def create_user_template(user_tempelate: UserTemplateResponse, by: str): + name, username_prefix, username_suffix, by = escape_md_template(user_tempelate, by) + message = copy.deepcopy(messages.CREATE_USER_TEMPLATE) + message["description"] = message["description"].format( + name=name, + data_limit=user_tempelate.data_limit, + expire_duration=user_tempelate.expire_duration, + username_prefix=username_prefix, + username_suffix=username_suffix, + ) + message["footer"]["text"] = message["footer"]["text"].format(by=by) + data = { + "content": "", + "embeds": [message], + } + data["embeds"][0]["color"] = colors.GREEN + settings: NotificationSettings = await notification_settings() + if settings.notify_discord: + await send_discord_webhook(data, settings.discord_webhook_url) + + +async def modify_user_template(user_template: UserTemplateResponse, by: str): + name, username_prefix, username_suffix, by = escape_md_template(user_template, by) + message = copy.deepcopy(messages.MODIFY_USER_TEMPLATE) + message["description"] = message["description"].format( + name=name, + data_limit=user_template.data_limit, + expire_duration=user_template.expire_duration, + username_prefix=username_prefix, + username_suffix=username_suffix, + ) + message["footer"]["text"] = message["footer"]["text"].format(by=by) + data = { + "content": "", + "embeds": [message], + } + data["embeds"][0]["color"] = colors.YELLOW + settings: NotificationSettings = await notification_settings() + if settings.notify_discord: + await send_discord_webhook(data, settings.discord_webhook_url) + + +async def remove_user_template(name: str, by: str): + name, by = escape_ds_markdown_list((name, by)) + message = copy.deepcopy(messages.REMOVE_USER_TEMPLATE) + message["description"] = message["description"].format(name=name) + message["footer"]["text"] = message["footer"]["text"].format(by=by) + data = { + "content": "", + "embeds": [message], + } + data["embeds"][0]["color"] = colors.RED + settings: NotificationSettings = await notification_settings() + if settings.notify_discord: + await send_discord_webhook(data, settings.discord_webhook_url) diff --git a/app/notification/discord/utils.py b/app/notification/discord/utils.py new file mode 100644 index 000000000..86ee3b5a0 --- /dev/null +++ b/app/notification/discord/utils.py @@ -0,0 +1,32 @@ +from app.utils.helpers import escape_ds_markdown_list +from app.models.user import UserNotificationResponse +from app.models.host import BaseHost +from app.models.user_template import UserTemplateResponse +from app.models.core import CoreResponse + + +def escape_md_user(user: UserNotificationResponse, by: str) -> tuple[str, str, str]: + """Escapes markdown special characters in user and by strings for Discord.""" + return escape_ds_markdown_list((user.username, user.admin.username if user.admin else "None", by)) + + +def escape_md_host(host: BaseHost, by: str) -> tuple[str, str, str, str]: + """Escapes markdown special characters in host and by strings for Discord.""" + return escape_ds_markdown_list((host.remark, host.address_str, host.inbound_tag, by)) + + +def escape_md_template(template: UserTemplateResponse, by: str) -> tuple[str, str, str, str]: + """Escapes markdown special characters in template and by strings for Discord.""" + return escape_ds_markdown_list( + ( + template.name, + template.username_prefix if template.username_prefix else "", + template.username_suffix if template.username_suffix else "", + by, + ) + ) + + +def escape_md_core(core: CoreResponse, by: str) -> tuple[str, str, str, str]: + """Escapes markdown special characters in core and by strings for Discord.""" + return escape_ds_markdown_list((core.name, core.exclude_tags, core.fallback_tags, by)) diff --git a/app/notification/telegram/__init__.py b/app/notification/telegram/__init__.py new file mode 100644 index 000000000..94f5c9bd7 --- /dev/null +++ b/app/notification/telegram/__init__.py @@ -0,0 +1,48 @@ +from .host import create_host, modify_host, remove_host, modify_hosts +from .user_template import create_user_template, modify_user_template, remove_user_template +from .node import create_node, modify_node, remove_node, connect_node, error_node +from .group import create_group, modify_group, remove_group +from .core import create_core, modify_core, remove_core +from .admin import create_admin, modify_admin, remove_admin, admin_reset_usage, admin_login +from .user import ( + user_status_change, + create_user, + modify_user, + remove_user, + reset_user_data_usage, + user_data_reset_by_next, + user_subscription_revoked, +) + +__all__ = [ + "create_host", + "modify_host", + "remove_host", + "modify_hosts", + "create_user_template", + "modify_user_template", + "remove_user_template", + "create_node", + "modify_node", + "remove_node", + "connect_node", + "error_node", + "create_group", + "modify_group", + "remove_group", + "create_core", + "modify_core", + "remove_core", + "create_admin", + "modify_admin", + "remove_admin", + "admin_reset_usage", + "admin_login", + "user_status_change", + "create_user", + "modify_user", + "remove_user", + "reset_user_data_usage", + "user_data_reset_by_next", + "user_subscription_revoked", +] diff --git a/app/notification/telegram/admin.py b/app/notification/telegram/admin.py new file mode 100644 index 000000000..10a594593 --- /dev/null +++ b/app/notification/telegram/admin.py @@ -0,0 +1,73 @@ +from app.notification.client import send_telegram_message +from app.models.admin import AdminDetails +from app.models.settings import NotificationSettings +from app.settings import notification_settings +from app.utils.helpers import escape_tg_html +from . import messages + + +async def create_admin(admin: AdminDetails, by: str): + username, by = escape_tg_html((admin.username, by)) + data = messages.CREATE_ADMIN.format( + username=username, + is_sudo=admin.is_sudo, + is_disabled=admin.is_disabled, + used_traffic=admin.used_traffic, + by=by, + ) + settings: NotificationSettings = await notification_settings() + if settings.notify_telegram: + await send_telegram_message( + data, settings.telegram_admin_id, settings.telegram_channel_id, settings.telegram_topic_id + ) + + +async def modify_admin(admin: AdminDetails, by: str): + username, by = escape_tg_html((admin.username, by)) + data = messages.MODIFY_ADMIN.format( + username=username, + is_sudo=admin.is_sudo, + is_disabled=admin.is_disabled, + used_traffic=admin.used_traffic, + by=by, + ) + settings: NotificationSettings = await notification_settings() + if settings.notify_telegram: + await send_telegram_message( + data, settings.telegram_admin_id, settings.telegram_channel_id, settings.telegram_topic_id + ) + + +async def remove_admin(username: str, by: str): + username, by = escape_tg_html((username, by)) + data = messages.REMOVE_ADMIN.format(username=username, by=by) + settings: NotificationSettings = await notification_settings() + if settings.notify_telegram: + await send_telegram_message( + data, settings.telegram_admin_id, settings.telegram_channel_id, settings.telegram_topic_id + ) + + +async def admin_reset_usage(admin: AdminDetails, by: str): + username, by = escape_tg_html((admin.username, by)) + data = messages.ADMIN_RESET_USAGE.format(username=username, by=by) + settings: NotificationSettings = await notification_settings() + if settings.notify_telegram: + await send_telegram_message( + data, settings.telegram_admin_id, settings.telegram_channel_id, settings.telegram_topic_id + ) + + +async def admin_login(username: str, password: str, client_ip: str, success: bool): + username, password = escape_tg_html((username, password)) + data = messages.ADMIN_LOGIN.format( + status="Successful" if success else "Failed", + username=username, + password="🔒" if success else password, + client_ip=client_ip, + ) + settings: NotificationSettings = await notification_settings() + if settings.notify_telegram: + await send_telegram_message( + data, settings.telegram_admin_id, settings.telegram_channel_id, settings.telegram_topic_id + ) diff --git a/app/notification/telegram/core.py b/app/notification/telegram/core.py new file mode 100644 index 000000000..e9f5af290 --- /dev/null +++ b/app/notification/telegram/core.py @@ -0,0 +1,46 @@ +from html import escape + +from app.notification.client import send_telegram_message +from app.models.core import CoreResponse +from app.models.settings import NotificationSettings +from app.settings import notification_settings + +from .utils import escape_html_core +from . import messages + + +async def create_core(core: CoreResponse, by: str): + name, exclude_tags, fallback_tags, by = escape_html_core(core, by) + data = messages.CREATE_CORE.format( + name=name, exclude_inbound_tags=exclude_tags, fallbacks_inbound_tags=fallback_tags, id=core.id, by=by + ) + settings: NotificationSettings = await notification_settings() + if settings.notify_telegram: + await send_telegram_message( + data, settings.telegram_admin_id, settings.telegram_channel_id, settings.telegram_topic_id + ) + + +async def modify_core(core: CoreResponse, by: str): + name, exclude_tags, fallback_tags, by = escape_html_core(core, by) + data = messages.MODIFY_CORE.format( + name=name, + exclude_inbound_tags=exclude_tags, + fallbacks_inbound_tags=fallback_tags, + id=core.id, + by=by, + ) + settings: NotificationSettings = await notification_settings() + if settings.notify_telegram: + await send_telegram_message( + data, settings.telegram_admin_id, settings.telegram_channel_id, settings.telegram_topic_id + ) + + +async def remove_core(core_id: int, by: str): + data = messages.REMOVE_CORE.format(id=core_id, by=escape(by)) + settings: NotificationSettings = await notification_settings() + if settings.notify_telegram: + await send_telegram_message( + data, settings.telegram_admin_id, settings.telegram_channel_id, settings.telegram_topic_id + ) diff --git a/app/notification/telegram/group.py b/app/notification/telegram/group.py new file mode 100644 index 000000000..a7dc716a3 --- /dev/null +++ b/app/notification/telegram/group.py @@ -0,0 +1,41 @@ +from html import escape + +from app.notification.client import send_telegram_message +from app.models.group import GroupResponse +from app.models.settings import NotificationSettings +from app.settings import notification_settings +from app.utils.helpers import escape_tg_html +from . import messages + + +async def create_group(group: GroupResponse, by: str): + name, by = escape_tg_html((group.name, by)) + data = messages.CREATE_GROUP.format( + name=name, inbound_tags=group.inbound_tags, is_disabled=group.is_disabled, id=group.id, by=by + ) + settings: NotificationSettings = await notification_settings() + if settings.notify_telegram: + await send_telegram_message( + data, settings.telegram_admin_id, settings.telegram_channel_id, settings.telegram_topic_id + ) + + +async def modify_group(group: GroupResponse, by: str): + name, by = escape_tg_html((group.name, by)) + data = messages.MODIFY_GROUP.format( + name=name, inbound_tags=group.inbound_tags, is_disabled=group.is_disabled, id=group.id, by=by + ) + settings: NotificationSettings = await notification_settings() + if settings.notify_telegram: + await send_telegram_message( + data, settings.telegram_admin_id, settings.telegram_channel_id, settings.telegram_topic_id + ) + + +async def remove_group(group_id: int, by: str): + data = messages.REMOVE_GROUP.format(id=group_id, by=escape(by)) + settings: NotificationSettings = await notification_settings() + if settings.notify_telegram: + await send_telegram_message( + data, settings.telegram_admin_id, settings.telegram_channel_id, settings.telegram_topic_id + ) diff --git a/app/notification/telegram/host.py b/app/notification/telegram/host.py new file mode 100644 index 000000000..fcd0b7919 --- /dev/null +++ b/app/notification/telegram/host.py @@ -0,0 +1,49 @@ +from html import escape + +from app.notification.client import send_telegram_message +from app.models.host import BaseHost +from app.models.settings import NotificationSettings +from app.settings import notification_settings +from app.utils.helpers import escape_tg_html + +from .utils import escape_html_host +from . import messages + + +async def create_host(host: BaseHost, by: str): + remark, address, tag, by = escape_html_host(host, by) + data = messages.CREATE_HOST.format(remark=remark, address=address, tag=tag, port=host.port, id=host.id, by=by) + settings: NotificationSettings = await notification_settings() + if settings.notify_telegram: + await send_telegram_message( + data, settings.telegram_admin_id, settings.telegram_channel_id, settings.telegram_topic_id + ) + + +async def modify_host(host: BaseHost, by: str): + remark, address, tag, by = escape_html_host(host, by) + data = messages.MODIFY_HOST.format(remark=remark, address=address, tag=tag, port=host.port, id=host.id, by=by) + settings: NotificationSettings = await notification_settings() + if settings.notify_telegram: + await send_telegram_message( + data, settings.telegram_admin_id, settings.telegram_channel_id, settings.telegram_topic_id + ) + + +async def remove_host(host: BaseHost, by: str): + remark, by = escape_tg_html((host.remark, by)) + data = messages.REMOVE_HOST.format(remark=remark, id=host.id, by=by) + settings: NotificationSettings = await notification_settings() + if settings.notify_telegram: + await send_telegram_message( + data, settings.telegram_admin_id, settings.telegram_channel_id, settings.telegram_topic_id + ) + + +async def modify_hosts(by: str): + data = messages.MODIFY_HOSTS.format(by=escape(by)) + settings: NotificationSettings = await notification_settings() + if settings.notify_telegram: + await send_telegram_message( + data, settings.telegram_admin_id, settings.telegram_channel_id, settings.telegram_topic_id + ) diff --git a/app/notification/telegram/messages.py b/app/notification/telegram/messages.py new file mode 100644 index 000000000..134b041e6 --- /dev/null +++ b/app/notification/telegram/messages.py @@ -0,0 +1,301 @@ +# In this file, we define message templates for Telegram notifications. +# Using templates helps to avoid string concatenation and improves code readability. + +USER_STATUS_CHANGE = """ +{status} +➖➖➖➖➖➖➖➖➖ +Username: {username} +➖➖➖➖➖➖➖➖➖ +Belongs To: {admin_username} +By: #{by} +""" + +CREATE_USER = """ +🆕 #Create_User +➖➖➖➖➖➖➖➖➖ +Username: {username} +Data Limit: {data_limit} +Expire Date: {expire_date} +Data Limit Reset Strategy: {data_limit_reset_strategy} +Has Next Plan: {has_next_plan} +➖➖➖➖➖➖➖➖➖ +Belongs To: {admin_username} +By: #{by} +""" + +MODIFY_USER = """ +✏️ #Modify_User +➖➖➖➖➖➖➖➖➖ +Username: {username} +Data Limit: {data_limit} +Expire Date: {expire_date} +Data Limit Reset Strategy: {data_limit_reset_strategy} +Has Next Plan: {has_next_plan} +➖➖➖➖➖➖➖➖➖ +Belongs To: {admin_username} +By: #{by} +""" + +REMOVE_USER = """ +🗑️ #Remove_User +➖➖➖➖➖➖➖➖➖ +Username: {username} +➖➖➖➖➖➖➖➖➖ +Belongs To: {admin_username} +By: #{by} +""" + +RESET_USER_DATA_USAGE = """ +🔁 #Reset_User_Data_Usage +➖➖➖➖➖➖➖➖➖ +Username: {username} +Data Limit: {data_limit} +➖➖➖➖➖➖➖➖➖ +Belongs To: {admin_username} +By: #{by} +""" + +USER_DATA_RESET_BY_NEXT = """ +🔁 #Reset_User_By_Next +➖➖➖➖➖➖➖➖➖ +Username: {username} +Data Limit: {data_limit} +Expire Date: {expire_date} +➖➖➖➖➖➖➖➖➖ +Belongs To: {admin_username} +By: #{by} +""" + +USER_SUBSCRIPTION_REVOKED = """ +🛑 #Revoke_User_Subscribtion +➖➖➖➖➖➖➖➖➖ +Username: {username} +➖➖➖➖➖➖➖➖➖ +Belongs To: {admin_username} +By: #{by} +""" + +CREATE_ADMIN = """ +#Create_Admin +➖➖➖➖➖➖➖➖➖ +Username: {username} +Is Sudo: {is_sudo} +Is Disabled: {is_disabled} +Used Traffic: {used_traffic} +➖➖➖➖➖➖➖➖➖ +By: #{by} +""" + +MODIFY_ADMIN = """ +#Modify_Admin +➖➖➖➖➖➖➖➖➖ +Username: {username} +Is Sudo: {is_sudo} +Is Disabled: {is_disabled} +Used Traffic: {used_traffic} +➖➖➖➖➖➖➖➖➖ +By: #{by} +""" + +REMOVE_ADMIN = """ +#Remove_Admin +Username: {username} +➖➖➖➖➖➖➖➖➖ +By: #{by} +""" + +ADMIN_RESET_USAGE = """ +#Admin_Usage_Reset +Username: {username} +➖➖➖➖➖➖➖➖➖ +By: #{by} +""" + +ADMIN_LOGIN = """ +#Login_Attempt +Status: {status} +➖➖➖➖➖➖➖➖➖ +Username: {username} +Password: {password} +IP: {client_ip} +""" + +CREATE_HOST = """ +#Create_Host +➖➖➖➖➖➖➖➖➖ +Remark: {remark} +Address: {address} +Inbound Tag: {tag} +Port: {port} +➖➖➖➖➖➖➖➖➖ +ID: {id} +By: #{by} +""" + +MODIFY_HOST = """ +#Modify_Host +➖➖➖➖➖➖➖➖➖ +Remark: {remark} +Address: {address} +Inbound Tag: {tag} +Port: {port} +➖➖➖➖➖➖➖➖➖ +ID: {id} +By: #{by} +""" + +REMOVE_HOST = """ +#Remove_Host +➖➖➖➖➖➖➖➖➖ +Remark: {remark} +➖➖➖➖➖➖➖➖➖ +ID: {id} +By: #{by} +""" + +MODIFY_HOSTS = """ +#Modify_Hosts +➖➖➖➖➖➖➖➖➖ +All hosts has been updated by #{by} +""" + +CREATE_NODE = """ +#Create_Node +➖➖➖➖➖➖➖➖➖ +ID: {id} +Name: {name} +Address: {address} +Port: {port} +➖➖➖➖➖➖➖➖➖ +By: #{by} +""" + +MODIFY_NODE = """ +#Modify_Node +➖➖➖➖➖➖➖➖➖ +ID: {id} +Name: {name} +Address: {address} +Port: {port} +➖➖➖➖➖➖➖➖➖ +By: #{by} +""" + +REMOVE_NODE = """ +#Remove_Node +➖➖➖➖➖➖➖➖➖ +ID: {id} +Name: {name} +➖➖➖➖➖➖➖➖➖ +By: #{by} +""" + +CONNECT_NODE = """ +#Connect_Node +➖➖➖➖➖➖➖➖➖ +Name: {name} +Node Version: {node_version} +Core Version: {core_version} +➖➖➖➖➖➖➖➖➖ +ID: {id} +""" + +ERROR_NODE = """ +#Error_Node +➖➖➖➖➖➖➖➖➖ +Name: {name} +Error: {error} +➖➖➖➖➖➖➖➖➖ +ID: {id} +""" + +CREATE_USER_TEMPLATE = """ +#Create_User_Template +➖➖➖➖➖➖➖➖➖ +Name: {name} +Data Limit: {data_limit} +Expire Duration: {expire_duration} +Username Prefix: {username_prefix} +Username Suffix: {username_suffix} +➖➖➖➖➖➖➖➖➖ +By: #{by} +""" + +MODIFY_USER_TEMPLATE = """ +#Modify_User_Template +➖➖➖➖➖➖➖➖➖ +Name: {name} +Data Limit: {data_limit} +Expire Duration: {expire_duration} +Username Prefix: {username_prefix} +Username Suffix: {username_suffix} +➖➖➖➖➖➖➖➖➖ +By: #{by} +""" + +REMOVE_USER_TEMPLATE = """ +#Remove_User_Template +Name: {name} +➖➖➖➖➖➖➖➖➖ +By: #{by} +""" + +CREATE_CORE = """ +#Create_core +➖➖➖➖➖➖➖➖➖ +Name: {name} +Exclude inbound tags: {exclude_inbound_tags} +Fallbacks inbound tags: {fallbacks_inbound_tags} +➖➖➖➖➖➖➖➖➖ +ID: {id} +By: #{by} +""" + +MODIFY_CORE = """ +#Modify_core +➖➖➖➖➖➖➖➖➖ +Name: {name} +Exclude inbound tags: {exclude_inbound_tags} +Fallbacks inbound tags: {fallbacks_inbound_tags} +➖➖➖➖➖➖➖➖➖ +ID: {id} +By: #{by} +""" + +REMOVE_CORE = """ +#Remove_core +➖➖➖➖➖➖➖➖➖ +ID: {id} +➖➖➖➖➖➖➖➖➖ +By: #{by} +""" + +CREATE_GROUP = """ +#Create_Group +➖➖➖➖➖➖➖➖➖ +Name: {name} +Inbound Tags: {inbound_tags} +Is Disabled: {is_disabled} +➖➖➖➖➖➖➖➖➖ +ID: {id} +By: #{by} +""" + +MODIFY_GROUP = """ +#Modify_Group +➖➖➖➖➖➖➖➖➖ +Name: {name} +Inbound Tags: {inbound_tags} +Is Disabled: {is_disabled} +➖➖➖➖➖➖➖➖➖ +ID: {id} +By: #{by} +""" + +REMOVE_GROUP = """ +#Remove_Group +➖➖➖➖➖➖➖➖➖ +ID: {id} +➖➖➖➖➖➖➖➖➖ +By: #{by} +""" diff --git a/app/notification/telegram/node.py b/app/notification/telegram/node.py new file mode 100644 index 000000000..d082064c7 --- /dev/null +++ b/app/notification/telegram/node.py @@ -0,0 +1,59 @@ +from html import escape + +from app.notification.client import send_telegram_message +from app.models.node import NodeResponse +from app.models.settings import NotificationSettings +from app.settings import notification_settings +from app.utils.helpers import escape_tg_html +from . import messages + + +async def create_node(node: NodeResponse, by: str): + name, by = escape_tg_html((node.name, by)) + data = messages.CREATE_NODE.format(id=node.id, name=name, address=node.address, port=node.port, by=by) + settings: NotificationSettings = await notification_settings() + if settings.notify_telegram: + await send_telegram_message( + data, settings.telegram_admin_id, settings.telegram_channel_id, settings.telegram_topic_id + ) + + +async def modify_node(node: NodeResponse, by: str): + name, by = escape_tg_html((node.name, by)) + data = messages.MODIFY_NODE.format(id=node.id, name=name, address=node.address, port=node.port, by=by) + settings: NotificationSettings = await notification_settings() + if settings.notify_telegram: + await send_telegram_message( + data, settings.telegram_admin_id, settings.telegram_channel_id, settings.telegram_topic_id + ) + + +async def remove_node(node: NodeResponse, by: str): + name, by = escape_tg_html((node.name, by)) + data = messages.REMOVE_NODE.format(id=node.id, name=name, by=by) + settings: NotificationSettings = await notification_settings() + if settings.notify_telegram: + await send_telegram_message( + data, settings.telegram_admin_id, settings.telegram_channel_id, settings.telegram_topic_id + ) + + +async def connect_node(node: NodeResponse): + data = messages.CONNECT_NODE.format( + name=escape(node.name), node_version=node.node_version, core_version=node.xray_version, id=node.id + ) + settings: NotificationSettings = await notification_settings() + if settings.notify_telegram: + await send_telegram_message( + data, settings.telegram_admin_id, settings.telegram_channel_id, settings.telegram_topic_id + ) + + +async def error_node(node: NodeResponse): + name, message = escape_tg_html((node.name, node.message)) + data = messages.ERROR_NODE.format(name=name, error=message, id=node.id) + settings: NotificationSettings = await notification_settings() + if settings.notify_telegram: + await send_telegram_message( + data, settings.telegram_admin_id, settings.telegram_channel_id, settings.telegram_topic_id + ) diff --git a/app/notification/telegram/user.py b/app/notification/telegram/user.py new file mode 100644 index 000000000..6153bb3a7 --- /dev/null +++ b/app/notification/telegram/user.py @@ -0,0 +1,140 @@ +from app.notification.client import send_telegram_message +from app.models.user import UserNotificationResponse +from app.utils.system import readable_size +from app.models.settings import NotificationSettings +from app.settings import notification_settings + +from .utils import escape_html_user +from . import messages + +_status = { + "active": "✅ #Activated", + "on_hold": "🕔 #On_Hold", + "disabled": "❌ #Disabled", + "limited": "🪫 #Limited", + "expired": "📅 #Expired", +} + + +async def user_status_change(user: UserNotificationResponse, by: str): + username, admin_username, by = escape_html_user(user, by) + data = messages.USER_STATUS_CHANGE.format( + status=_status[user.status.value], + username=username, + admin_username=admin_username, + by=by, + ) + settings: NotificationSettings = await notification_settings() + if settings.notify_telegram: + await send_telegram_message( + data, settings.telegram_admin_id, settings.telegram_channel_id, settings.telegram_topic_id + ) + if user.admin and user.admin.telegram_id: + await send_telegram_message(data, chat_id=user.admin.telegram_id) + + +async def create_user(user: UserNotificationResponse, by: str): + username, admin_username, by = escape_html_user(user, by) + data = messages.CREATE_USER.format( + username=username, + data_limit=readable_size(user.data_limit) if user.data_limit else "Unlimited", + expire_date=user.expire if user.expire else "Never", + data_limit_reset_strategy=user.data_limit_reset_strategy.value, + has_next_plan=bool(user.next_plan), + admin_username=admin_username, + by=by, + ) + settings: NotificationSettings = await notification_settings() + if settings.notify_telegram: + await send_telegram_message( + data, settings.telegram_admin_id, settings.telegram_channel_id, settings.telegram_topic_id + ) + if user.admin and user.admin.telegram_id: + await send_telegram_message(data, chat_id=user.admin.telegram_id) + + +async def modify_user(user: UserNotificationResponse, by: str): + username, admin_username, by = escape_html_user(user, by) + data = messages.MODIFY_USER.format( + username=username, + data_limit=readable_size(user.data_limit) if user.data_limit else "Unlimited", + expire_date=user.expire if user.expire else "Never", + data_limit_reset_strategy=user.data_limit_reset_strategy.value, + has_next_plan=bool(user.next_plan), + admin_username=admin_username, + by=by, + ) + settings: NotificationSettings = await notification_settings() + if settings.notify_telegram: + await send_telegram_message( + data, settings.telegram_admin_id, settings.telegram_channel_id, settings.telegram_topic_id + ) + if user.admin and user.admin.telegram_id: + await send_telegram_message(data, chat_id=user.admin.telegram_id) + + +async def remove_user(user: UserNotificationResponse, by: str): + username, admin_username, by = escape_html_user(user, by) + data = messages.REMOVE_USER.format( + username=username, + admin_username=admin_username, + by=by, + ) + settings: NotificationSettings = await notification_settings() + if settings.notify_telegram: + await send_telegram_message( + data, settings.telegram_admin_id, settings.telegram_channel_id, settings.telegram_topic_id + ) + if user.admin and user.admin.telegram_id: + await send_telegram_message(data, chat_id=user.admin.telegram_id) + + +async def reset_user_data_usage(user: UserNotificationResponse, by: str): + username, admin_username, by = escape_html_user(user, by) + data = messages.RESET_USER_DATA_USAGE.format( + username=username, + data_limit=readable_size(user.data_limit) if user.data_limit else "Unlimited", + admin_username=admin_username, + by=by, + ) + settings: NotificationSettings = await notification_settings() + if settings.notify_telegram: + await send_telegram_message( + data, settings.telegram_admin_id, settings.telegram_channel_id, settings.telegram_topic_id + ) + if user.admin and user.admin.telegram_id: + await send_telegram_message(data, chat_id=user.admin.telegram_id) + + +async def user_data_reset_by_next(user: UserNotificationResponse, by: str): + username, admin_username, by = escape_html_user(user, by) + data = messages.USER_DATA_RESET_BY_NEXT.format( + username=username, + data_limit=readable_size(user.data_limit) if user.data_limit else "Unlimited", + expire_date=user.expire if user.expire else "Never", + admin_username=admin_username, + by=by, + ) + settings: NotificationSettings = await notification_settings() + if settings.notify_telegram: + await send_telegram_message( + data, settings.telegram_admin_id, settings.telegram_channel_id, settings.telegram_topic_id + ) + if user.admin and user.admin.telegram_id: + await send_telegram_message(data, chat_id=user.admin.telegram_id) + + +async def user_subscription_revoked(user: UserNotificationResponse, by: str): + username, admin_username, by = escape_html_user(user, by) + data = messages.USER_SUBSCRIPTION_REVOKED.format( + username=username, + admin_username=admin_username, + by=by, + ) + settings: NotificationSettings = await notification_settings() + if settings.notify_telegram: + await send_telegram_message( + data, settings.telegram_admin_id, settings.telegram_channel_id, settings.telegram_topic_id + ) + if user.admin and user.admin.telegram_id: + await send_telegram_message(data, chat_id=user.admin.telegram_id) diff --git a/app/notification/telegram/user_template.py b/app/notification/telegram/user_template.py new file mode 100644 index 000000000..dddc8c2b9 --- /dev/null +++ b/app/notification/telegram/user_template.py @@ -0,0 +1,52 @@ +from app.notification.client import send_telegram_message +from app.models.user_template import UserTemplateResponse +from app.models.settings import NotificationSettings +from app.settings import notification_settings +from app.utils.helpers import escape_tg_html + +from .utils import escape_html_template +from . import messages + + +async def create_user_template(user_template: UserTemplateResponse, by: str): + name, prefix, suffix, by = escape_html_template(user_template, by) + data = messages.CREATE_USER_TEMPLATE.format( + name=name, + data_limit=user_template.data_limit, + expire_duration=user_template.expire_duration, + username_prefix=prefix, + username_suffix=suffix, + by=by, + ) + settings: NotificationSettings = await notification_settings() + if settings.notify_telegram: + await send_telegram_message( + data, settings.telegram_admin_id, settings.telegram_channel_id, settings.telegram_topic_id + ) + + +async def modify_user_template(user_template: UserTemplateResponse, by: str): + name, prefix, suffix, by = escape_html_template(user_template, by) + data = messages.MODIFY_USER_TEMPLATE.format( + name=name, + data_limit=user_template.data_limit, + expire_duration=user_template.expire_duration, + username_prefix=prefix, + username_suffix=suffix, + by=by, + ) + settings: NotificationSettings = await notification_settings() + if settings.notify_telegram: + await send_telegram_message( + data, settings.telegram_admin_id, settings.telegram_channel_id, settings.telegram_topic_id + ) + + +async def remove_user_template(name: str, by: str): + name, by = escape_tg_html((name, by)) + data = messages.REMOVE_USER_TEMPLATE.format(name=name, by=by) + settings: NotificationSettings = await notification_settings() + if settings.notify_telegram: + await send_telegram_message( + data, settings.telegram_admin_id, settings.telegram_channel_id, settings.telegram_topic_id + ) diff --git a/app/notification/telegram/utils.py b/app/notification/telegram/utils.py new file mode 100644 index 000000000..1d3cb6ed4 --- /dev/null +++ b/app/notification/telegram/utils.py @@ -0,0 +1,32 @@ +from app.utils.helpers import escape_tg_html +from app.models.user import UserNotificationResponse +from app.models.host import BaseHost +from app.models.user_template import UserTemplateResponse +from app.models.core import CoreResponse + + +def escape_html_user(user: UserNotificationResponse, by: str) -> tuple[str, str, str]: + """Escapes HTML special characters in user and by strings.""" + return escape_tg_html((user.username, user.admin.username if user.admin else "None", by)) + + +def escape_html_host(host: BaseHost, by: str) -> tuple[str, str, str, str]: + """Escapes HTML special characters in host and by strings.""" + return escape_tg_html((host.remark, host.address_str, host.inbound_tag, by)) + + +def escape_html_template(template: UserTemplateResponse, by: str) -> tuple[str, str, str, str]: + """Escapes HTML special characters in template and by strings.""" + return escape_tg_html( + ( + template.name, + template.username_prefix if template.username_prefix else "", + template.username_suffix if template.username_suffix else "", + by, + ) + ) + + +def escape_html_core(core: CoreResponse, by: str) -> tuple[str, str, str, str]: + """Escapes HTML special characters in core and by strings.""" + return escape_tg_html((core.name, core.exclude_tags, core.fallback_tags, by)) diff --git a/app/notification/webhook/__init__.py b/app/notification/webhook/__init__.py new file mode 100644 index 000000000..11edcec8f --- /dev/null +++ b/app/notification/webhook/__init__.py @@ -0,0 +1,129 @@ +from datetime import datetime as dt, timezone as tz +from enum import Enum +from typing import Type +import asyncio + +from pydantic import BaseModel, Field + +from app.settings import webhook_settings +from app.models.admin import AdminDetails +from app.models.user import UserNotificationResponse, UserStatus + +queue = asyncio.Queue() + + +def get_current_timestamp() -> float: + """Factory function to get current timestamp""" + return dt.now(tz.utc).timestamp() + + +class Notification(BaseModel): + class Type(str, Enum): + user_created = "user_created" + user_updated = "user_updated" + user_deleted = "user_deleted" + user_limited = "user_limited" + user_expired = "user_expired" + user_enabled = "user_enabled" + user_disabled = "user_disabled" + data_usage_reset = "data_usage_reset" + data_reset_by_next = "data_reset_by_next" + subscription_revoked = "subscription_revoked" + + reached_usage_percent = "reached_usage_percent" + reached_days_left = "reached_days_left" + + enqueued_at: float = Field(default_factory=get_current_timestamp) + send_at: float = Field(default_factory=get_current_timestamp) + tries: int = Field(default=0) + + +class UserNotification(Notification): + username: str + + +class ReachedUsagePercent(UserNotification): + action: Notification.Type = Notification.Type.reached_usage_percent + user: UserNotificationResponse + used_percent: float + + +class ReachedDaysLeft(UserNotification): + action: Notification.Type = Notification.Type.reached_days_left + user: UserNotificationResponse + days_left: int + + +class UserCreated(UserNotification): + action: Notification.Type = Notification.Type.user_created + by: AdminDetails + user: UserNotificationResponse + + +class UserUpdated(UserNotification): + action: Notification.Type = Notification.Type.user_updated + by: AdminDetails + user: UserNotificationResponse + + +class UserDeleted(UserNotification): + action: Notification.Type = Notification.Type.user_deleted + by: AdminDetails + + +class UserLimited(UserNotification): + action: Notification.Type = Notification.Type.user_limited + user: UserNotificationResponse + + +class UserExpired(UserNotification): + action: Notification.Type = Notification.Type.user_expired + user: UserNotificationResponse + + +class UserEnabled(UserNotification): + action: Notification.Type = Notification.Type.user_enabled + by: AdminDetails | None = None + user: UserNotificationResponse + + +class UserDisabled(UserNotification): + action: Notification.Type = Notification.Type.user_disabled + by: AdminDetails | None = None + user: UserNotificationResponse + reason: str | None = None + + +class UserDataUsageReset(UserNotification): + action: Notification.Type = Notification.Type.data_usage_reset + by: AdminDetails + user: UserNotificationResponse + + +class UserDataResetByNext(UserNotification): + action: Notification.Type = Notification.Type.data_usage_reset + user: UserNotificationResponse + + +class UserSubscriptionRevoked(UserNotification): + action: Notification.Type = Notification.Type.subscription_revoked + by: AdminDetails + user: UserNotificationResponse + + +async def status_change(user: UserNotificationResponse): + if user.status == UserStatus.limited: + await notify(UserLimited(username=user.username, user=user)) + elif user.status == UserStatus.expired: + await notify(UserExpired(username=user.username, user=user)) + elif user.status == UserStatus.disabled: + await notify(UserDisabled(username=user.username, user=user)) + elif user.status == UserStatus.active: + await notify(UserEnabled(username=user.username, user=user)) + elif user.status == UserStatus.on_hold: + await notify(UserEnabled(username=user.username, user=user)) + + +async def notify(message: Type[Notification]) -> None: + if (await webhook_settings()).enable: + await queue.put(message) diff --git a/app/operation/__init__.py b/app/operation/__init__.py new file mode 100644 index 000000000..08125f087 --- /dev/null +++ b/app/operation/__init__.py @@ -0,0 +1,158 @@ +from datetime import datetime as dt, timedelta as td, timezone as tz +from enum import IntEnum + +from fastapi import HTTPException + +from app.core.manager import core_manager +from app.db import AsyncSession +from app.db.crud import ( + get_admin, + get_core_config_by_id, + get_group_by_id, + get_host_by_id, + get_node_by_id, + get_user, + get_user_template, +) +from app.db.crud.user import get_user_by_id +from app.db.models import Admin as DBAdmin, CoreConfig, Group, Node, ProxyHost, User, UserTemplate +from app.models.admin import AdminDetails +from app.models.group import BulkGroup +from app.models.user import UserCreate, UserModify +from app.utils.helpers import fix_datetime_timezone +from app.utils.jwt import get_subscription_payload + + +class OperatorType(IntEnum): + SYSTEM = 0 + API = 1 + WEB = 2 + CLI = 3 + TELEGRAM = 4 + DISCORD = 5 + + +class BaseOperation: + def __init__(self, operator_type: OperatorType): + self.operator_type = operator_type + + async def raise_error(self, message: str, code: int, db: AsyncSession | None = None): + """Raise an error based on the operator type.""" + if db: + await db.rollback() + if code <= 0: + code = 408 + if self.operator_type in [OperatorType.API, OperatorType.WEB]: + raise HTTPException(status_code=code, detail=str(message)) + else: + raise ValueError(message) + + async def validate_dates(self, start: dt | None, end: dt | None) -> tuple[dt, dt]: + """Validate if start and end dates are correct and if end is after start.""" + try: + if start: + start_date = fix_datetime_timezone(start) + else: + start_date = dt.now(tz.utc) - td(days=30) + + if end: + end_date = fix_datetime_timezone(end) + else: + end_date = dt.now(tz.utc) + + # Compare dates only after both are set + if end_date < start_date: + await self.raise_error(message="Start date must be before end date", code=400) + + return start_date, end_date + except ValueError: + await self.raise_error(message="Invalid date range or format", code=400) + + async def get_validated_host(self, db: AsyncSession, host_id: int) -> ProxyHost: + db_host = await get_host_by_id(db, host_id) + if db_host is None: + await self.raise_error(message="Host not found", code=404) + return db_host + + async def get_validated_sub(self, db: AsyncSession, token: str) -> User: + sub = await get_subscription_payload(token) + if not sub: + await self.raise_error(message="Not Found", code=404) + + db_user = await get_user(db, sub["username"]) + if not db_user or db_user.created_at.astimezone(tz.utc) > sub["created_at"]: + await self.raise_error(message="Not Found", code=404) + + if db_user.sub_revoked_at and db_user.sub_revoked_at.astimezone(tz.utc) > sub["created_at"]: + await self.raise_error(message="Not Found", code=404) + + return db_user + + async def get_validated_user(self, db: AsyncSession, username: str, admin: AdminDetails) -> User: + db_user = await get_user(db, username) + if not db_user: + await self.raise_error(message="User not found", code=404) + + if not (admin.is_sudo or (db_user.admin and db_user.admin.username == admin.username)): + await self.raise_error(message="You're not allowed", code=403) + + return db_user + + async def get_validated_user_by_id(self, db: AsyncSession, user_id: int, admin: AdminDetails) -> User: + db_user = await get_user_by_id(db, user_id) + if not db_user: + await self.raise_error(message="User not found", code=404) + + if not (admin.is_sudo or (db_user.admin and db_user.admin.username == admin.username)): + await self.raise_error(message="You're not allowed", code=403) + + return db_user + + async def get_validated_admin(self, db: AsyncSession, username: str) -> DBAdmin: + db_admin = await get_admin(db, username) + if not db_admin: + await self.raise_error(message="Admin not found", code=404) + return db_admin + + async def get_validated_group(self, db: AsyncSession, group_id: int) -> Group: + db_group = await get_group_by_id(db, group_id) + if not db_group: + await self.raise_error("Group not found", 404) + return db_group + + async def validate_all_groups(self, db, model: UserCreate | UserModify | UserTemplate | BulkGroup) -> list[Group]: + all_groups: list[Group] = [] + if model.group_ids: + for group_id in model.group_ids: + db_group = await self.get_validated_group(db, group_id) + all_groups.append(db_group) + if hasattr(model, "has_group_ids") and model.has_group_ids: + for group_id in model.has_group_ids: + db_group = await self.get_validated_group(db, group_id) + all_groups.append(db_group) + return all_groups + + async def get_validated_user_template(self, db: AsyncSession, template_id: int) -> UserTemplate: + dbuser_template = await get_user_template(db, template_id) + if not dbuser_template: + await self.raise_error("User Template not found", 404) + return dbuser_template + + async def get_validated_node(self, db: AsyncSession, node_id) -> Node: + """Dependency: Fetch node or return not found error.""" + db_node = await get_node_by_id(db, node_id) + if not db_node: + await self.raise_error(message="Node not found", code=404) + return db_node + + async def check_inbound_tags(self, tags: list[str]) -> None: + for tag in tags: + if tag not in await core_manager.get_inbounds(): + await self.raise_error(f"{tag} not found", 400) + + async def get_validated_core_config(self, db: AsyncSession, core_id) -> CoreConfig: + """Dependency: Fetch core config or return not found error.""" + db_core_config = await get_core_config_by_id(db, core_id) + if not db_core_config: + await self.raise_error(message="Core config not found", code=404) + return db_core_config diff --git a/app/operation/admin.py b/app/operation/admin.py new file mode 100644 index 000000000..42e546db9 --- /dev/null +++ b/app/operation/admin.py @@ -0,0 +1,127 @@ +import asyncio + +from sqlalchemy.exc import IntegrityError + +from app import notification +from app.db import AsyncSession +from app.db.crud.admin import ( + create_admin, + get_admins, + get_admins_count, + remove_admin, + reset_admin_usage, + update_admin, +) +from app.db.crud.bulk import activate_all_disabled_users, disable_all_active_users +from app.db.crud.user import get_users +from app.db.models import Admin as DBAdmin +from app.models.admin import AdminCreate, AdminDetails, AdminModify +from app.node import node_manager +from app.operation import BaseOperation, OperatorType +from app.utils.logger import get_logger + +logger = get_logger("admin-operation") + + +class AdminOperation(BaseOperation): + async def create_admin(self, db: AsyncSession, new_admin: AdminCreate, admin: AdminDetails) -> AdminDetails: + """Create a new admin if the current admin has sudo privileges.""" + try: + db_admin = await create_admin(db, new_admin) + except IntegrityError: + await self.raise_error(message="Admin already exists", code=409, db=db) + + if self.operator_type != OperatorType.CLI: + logger.info(f'New admin "{db_admin.username}" with id "{db_admin.id}" added by admin "{admin.username}"') + new_admin = AdminDetails.model_validate(db_admin) + asyncio.create_task(notification.create_admin(new_admin, admin.username)) + + return db_admin + + async def modify_admin( + self, db: AsyncSession, username: str, modified_admin: AdminModify, current_admin: AdminDetails + ) -> AdminDetails: + """Modify an existing admin's details.""" + db_admin = await self.get_validated_admin(db, username=username) + if self.operator_type != OperatorType.CLI and db_admin.username == current_admin.username and db_admin.is_sudo: + await self.raise_error( + message="You're not allowed to edit another sudoer's account. Use pasarguard-cli instead.", code=403 + ) + + db_admin = await update_admin(db, db_admin, modified_admin) + + if self.operator_type != OperatorType.CLI: + logger.info( + f'Admin "{db_admin.username}" with id "{db_admin.id}" modified by admin "{current_admin.username}"' + ) + + modified_admin = AdminDetails.model_validate(db_admin) + asyncio.create_task(notification.modify_admin(modified_admin, current_admin.username)) + return modified_admin + + async def remove_admin(self, db: AsyncSession, username: str, current_admin: AdminDetails | None = None): + """Remove an admin from the database.""" + db_admin = await self.get_validated_admin(db, username=username) + if ( + self.operator_type != OperatorType.CLI + and (db_admin.username == current_admin.username) + and db_admin.is_sudo + ): + await self.raise_error( + message="You're not allowed to delete sudoer's account. Use pasarguard-cli instead.", code=403 + ) + + await remove_admin(db, db_admin) + if self.operator_type != OperatorType.CLI: + logger.info( + f'Admin "{db_admin.username}" with id "{db_admin.id}" deleted by admin "{current_admin.username}"' + ) + asyncio.create_task(notification.remove_admin(username, current_admin.username)) + + async def get_admins( + self, db: AsyncSession, username: str | None = None, offset: int | None = None, limit: int | None = None + ) -> list[DBAdmin]: + return await get_admins(db, offset, limit, username) + + async def get_admins_count(self, db: AsyncSession) -> int: + return await get_admins_count(db) + + async def disable_all_active_users(self, db: AsyncSession, username: str, admin: AdminDetails): + """Disable all active users under a specific admin""" + db_admin = await self.get_validated_admin(db, username=username) + + if db_admin.is_sudo: + await self.raise_error(message="You're not allowed to disable sudo admin users.", code=403) + + await disable_all_active_users(db=db, admin=db_admin) + + users = await get_users(db, admin=db_admin) + await node_manager.update_users(users) + + logger.info(f'Admin "{username}" users has been disabled by admin "{admin.username}"') + + async def activate_all_disabled_users(self, db: AsyncSession, username: str, admin: AdminDetails): + """Enable all active users under a specific admin""" + db_admin = await self.get_validated_admin(db, username=username) + + if db_admin.is_sudo: + await self.raise_error(message="You're not allowed to enable sudo admin users.", code=403) + + await activate_all_disabled_users(db=db, admin=db_admin) + + users = await get_users(db, admin=db_admin) + await node_manager.update_users(users) + + logger.info(f'Admin "{username}" users has been activated by admin "{admin.username}"') + + async def reset_admin_usage(self, db: AsyncSession, username: str, admin: AdminDetails) -> AdminDetails: + db_admin = await self.get_validated_admin(db, username=username) + + db_admin = await reset_admin_usage(db, db_admin=db_admin) + if self.operator_type != OperatorType.CLI: + logger.info(f'Admin "{username}" usage has been reset by admin "{admin.username}"') + + reseted_admin = AdminDetails.model_validate(db_admin) + asyncio.create_task(notification.admin_usage_reset(reseted_admin, admin.username)) + + return reseted_admin diff --git a/app/operation/core.py b/app/operation/core.py new file mode 100644 index 000000000..2e3ec7675 --- /dev/null +++ b/app/operation/core.py @@ -0,0 +1,75 @@ +import asyncio + +from app.db import AsyncSession +from app.db.crud.core import create_core_config, modify_core_config, remove_core_config, get_core_configs +from app.models.admin import AdminDetails +from app.models.core import CoreCreate, CoreResponseList, CoreResponse +from app.core.manager import core_manager +from app.operation import BaseOperation +from app import notification +from app.core.hosts import hosts as hosts_storage +from app.utils.logger import get_logger + + +logger = get_logger("core-operation") + + +class CoreOperation(BaseOperation): + async def create_core(self, db: AsyncSession, new_core: CoreCreate, admin: AdminDetails) -> CoreResponse: + try: + core_manager.validate_core(new_core.config, new_core.exclude_inbound_tags, new_core.fallbacks_inbound_tags) + db_core = await create_core_config(db, new_core) + except Exception as e: + await self.raise_error(message=e, code=400, db=db) + + await core_manager.update_core(db_core) + logger.info(f'Core config "{db_core.id}" created by admin "{admin.username}"') + + core = CoreResponse.model_validate(db_core) + asyncio.create_task(notification.create_core(core, admin.username)) + + await hosts_storage.update(db) + + return core + + async def get_all_cores(self, db: AsyncSession, offset: int, limit: int) -> CoreResponseList: + db_cores, count = await get_core_configs(db, offset, limit) + return CoreResponseList(cores=db_cores, count=count) + + async def modify_core( + self, db: AsyncSession, core_id: int, modified_core: CoreCreate, admin: AdminDetails + ) -> CoreResponse: + db_core = await self.get_validated_core_config(db, core_id) + try: + core_manager.validate_core( + modified_core.config, modified_core.exclude_inbound_tags, modified_core.fallbacks_inbound_tags + ) + db_core = await modify_core_config(db, db_core, modified_core) + except Exception as e: + await self.raise_error(message=e, code=400, db=db) + + await core_manager.update_core(db_core) + + logger.info(f'Core config "{db_core.name}" modified by admin "{admin.username}"') + + core = CoreResponse.model_validate(db_core) + asyncio.create_task(notification.modify_core(core, admin.username)) + + await hosts_storage.update(db) + + return core + + async def delete_core(self, db: AsyncSession, core_id: int, admin: AdminDetails) -> None: + if core_id == 1: + return await self.raise_error(message="Cannot delete default core config", code=403) + + db_core = await self.get_validated_core_config(db, core_id) + + await remove_core_config(db, db_core) + await core_manager.remove_core(db_core.id) + + asyncio.create_task(notification.remove_core(db_core.id, admin.username)) + + logger.info(f'core config "{db_core.name}" deleted by admin "{admin.username}"') + + await hosts_storage.update(db) diff --git a/app/operation/group.py b/app/operation/group.py new file mode 100644 index 000000000..8ad4ae807 --- /dev/null +++ b/app/operation/group.py @@ -0,0 +1,87 @@ +import asyncio + +from app import notification +from app.db import AsyncSession +from app.db.crud.bulk import add_groups_to_users, remove_groups_from_users +from app.db.crud.group import create_group, get_group, modify_group, remove_group +from app.db.crud.user import get_users +from app.db.models import Admin +from app.models.group import BulkGroup, Group, GroupCreate, GroupModify, GroupResponse, GroupsResponse +from app.node import node_manager +from app.operation import BaseOperation, OperatorType +from app.utils.logger import get_logger + +logger = get_logger("group-operation") + + +class GroupOperation(BaseOperation): + async def create_group(self, db: AsyncSession, new_group: GroupCreate, admin: Admin) -> Group: + await self.check_inbound_tags(new_group.inbound_tags) + + db_group = await create_group(db, new_group) + + group = GroupResponse.model_validate(db_group) + + asyncio.create_task(notification.create_group(group, admin.username)) + + logger.info(f'Group "{group.name}" created by admin "{admin.username}"') + return group + + async def get_all_groups( + self, db: AsyncSession, offset: int | None = None, limit: int | None = None + ) -> GroupsResponse: + db_groups, count = await get_group(db, offset, limit) + return GroupsResponse(groups=db_groups, total=count) + + async def modify_group(self, db: AsyncSession, group_id: int, modified_group: GroupModify, admin: Admin) -> Group: + db_group = await self.get_validated_group(db, group_id) + if modified_group.inbound_tags: + await self.check_inbound_tags(modified_group.inbound_tags) + db_group = await modify_group(db, db_group, modified_group) + + users = await get_users(db, group_ids=[db_group.id]) + await node_manager.update_users(users) + + group = GroupResponse.model_validate(db_group) + + asyncio.create_task(notification.modify_group(group, admin.username)) + + logger.info(f'Group "{group.name}" modified by admin "{admin.username}"') + return group + + async def remove_group(self, db: AsyncSession, group_id: int, admin: Admin) -> None: + db_group = await self.get_validated_group(db, group_id) + + users = await get_users(db, group_ids=[db_group.id]) + username_list = [user.username for user in users] + + await remove_group(db, db_group) + users = await get_users(db, usernames=username_list) + + await node_manager.update_users(users) + + logger.info(f'Group "{db_group.name}" deleted by admin "{admin.username}"') + + asyncio.create_task(notification.remove_group(db_group.id, admin.username)) + + async def bulk_add_groups(self, db: AsyncSession, bulk_model: BulkGroup): + await self.validate_all_groups(db, bulk_model) + + users, users_count = await add_groups_to_users(db, bulk_model) + + await node_manager.update_users(users) + + if self.operator_type in (OperatorType.API, OperatorType.WEB): + return {"detail": f"operation has been successfuly done on {users_count} users"} + return users_count + + async def bulk_remove_groups(self, db: AsyncSession, bulk_model: BulkGroup): + await self.validate_all_groups(db, bulk_model) + + users, users_count = await remove_groups_from_users(db, bulk_model) + + await node_manager.update_users(users) + + if self.operator_type in (OperatorType.API, OperatorType.WEB): + return {"detail": f"operation has been successfuly done on {users_count} users"} + return users_count diff --git a/app/operation/host.py b/app/operation/host.py new file mode 100644 index 000000000..8b8a6d4ec --- /dev/null +++ b/app/operation/host.py @@ -0,0 +1,109 @@ +import asyncio + +from app.db import AsyncSession +from app.db.models import ProxyHost +from app.models.host import CreateHost, BaseHost +from app.models.admin import AdminDetails +from app.operation import BaseOperation +from app.db.crud.host import create_host, get_host_by_id, remove_host, get_hosts, modify_host +from app.core.hosts import hosts as hosts_storage +from app.utils.logger import get_logger + +from app import notification + + +logger = get_logger("host-operation") + + +class HostOperation(BaseOperation): + async def get_hosts(self, db: AsyncSession, offset: int = 0, limit: int = 0) -> list[BaseHost]: + return await get_hosts(db=db, offset=offset, limit=limit) + + async def validate_ds_host(self, db: AsyncSession, host: CreateHost, host_id: int | None = None) -> ProxyHost: + if ( + host.transport_settings + and host.transport_settings.xhttp_settings + and (nested_host := host.transport_settings.xhttp_settings.download_settings) + ): + if host_id and nested_host == host_id: + return await self.raise_error("download host cannot be the same as the host", 400, db=db) + ds_host = await get_host_by_id(db, nested_host) + if not ds_host: + return await self.raise_error("download host not found", 404, db=db) + if ( + ds_host.transport_settings + and ds_host.transport_settings.get("xhttp_settings") + and ds_host.transport_settings.get("xhttp_settings").get("download_settings") + ): + return await self.raise_error("download host cannot have a download host", 400, db=db) + + async def create_host(self, db: AsyncSession, new_host: CreateHost, admin: AdminDetails) -> BaseHost: + await self.validate_ds_host(db, new_host) + + await self.check_inbound_tags([new_host.inbound_tag]) + + db_host = await create_host(db, new_host) + + logger.info(f'Host "{db_host.id}" added by admin "{admin.username}"') + + host = BaseHost.model_validate(db_host) + asyncio.create_task(notification.create_host(host, admin.username)) + + await hosts_storage.update(db) + + return host + + async def modify_host( + self, db: AsyncSession, host_id: int, modified_host: CreateHost, admin: AdminDetails + ) -> BaseHost: + await self.validate_ds_host(db, modified_host, host_id) + + if modified_host.inbound_tag: + await self.check_inbound_tags([modified_host.inbound_tag]) + + db_host = await self.get_validated_host(db, host_id) + + db_host = await modify_host(db=db, db_host=db_host, modified_host=modified_host) + + logger.info(f'Host "{db_host.id}" modified by admin "{admin.username}"') + + host = BaseHost.model_validate(db_host) + asyncio.create_task(notification.modify_host(host, admin.username)) + + await hosts_storage.update(db) + + return host + + async def remove_host(self, db: AsyncSession, host_id: int, admin: AdminDetails): + db_host = await self.get_validated_host(db, host_id) + await remove_host(db, db_host) + logger.info(f'Host "{db_host.id}" deleted by admin "{admin.username}"') + + host = BaseHost.model_validate(db_host) + + asyncio.create_task(notification.remove_host(host, admin.username)) + + await hosts_storage.update(db) + + async def modify_hosts( + self, db: AsyncSession, modified_hosts: list[CreateHost], admin: AdminDetails + ) -> list[BaseHost]: + for host in modified_hosts: + await self.validate_ds_host(db, host, host.id) + + old_host: ProxyHost | None = None + if host.id is not None: + old_host = await get_host_by_id(db, host.id) + + if old_host is None: + await create_host(db, host) + else: + await modify_host(db, old_host, host) + + await hosts_storage.update(db) + + logger.info(f'Host\'s has been modified by admin "{admin.username}"') + + asyncio.create_task(notification.modify_hosts(admin.username)) + + return await get_hosts(db=db) diff --git a/app/operation/node.py b/app/operation/node.py new file mode 100644 index 000000000..bbb018e67 --- /dev/null +++ b/app/operation/node.py @@ -0,0 +1,350 @@ +import asyncio +from datetime import datetime as dt + +from PasarGuardNodeBridge import PasarGuardNode, NodeAPIError +from sqlalchemy.exc import IntegrityError + +from app import notification +from app.core.manager import core_manager +from app.db import AsyncSession +from app.db.base import GetDB +from app.db.crud.node import ( + clear_usage_data, + create_node, + get_node_by_id, + get_node_stats, + get_nodes, + get_nodes_usage, + modify_node, + remove_node, + update_node_status, +) +from app.db.crud.user import get_user +from app.db.models import Node, NodeStatus +from app.models.admin import AdminDetails +from app.models.node import NodeCreate, NodeModify, NodeResponse, UsageTable +from app.models.stats import NodeRealtimeStats, NodeStatsList, NodeUsageStatsList, Period +from app.node import core_users, node_manager +from app.operation import BaseOperation +from app.utils.logger import get_logger + +MAX_MESSAGE_LENGTH = 128 + +logger = get_logger("node-operation") + + +class NodeOperation(BaseOperation): + async def get_db_nodes( + self, db: AsyncSession, core_id: int | None = None, offset: int | None = None, limit: int | None = None + ) -> list[Node]: + return await get_nodes(db=db, core_id=core_id, offset=offset, limit=limit) + + @staticmethod + async def update_node_status( + node_id: int, + status: NodeStatus, + core_version: str = "", + node_version: str = "", + err: str = "", + notify_err: bool = True, + ): + async with GetDB() as db: + db_node = await get_node_by_id(db, node_id) + + if db_node is None: + return + + old_status = db_node.status + + if status == NodeStatus.error: + logger.error(f"Failed to connect node {db_node.name} with id {db_node.id}, Error: {err}") + + db_node = await update_node_status( + db=db, + db_node=db_node, + status=status, + xray_version=core_version, + node_version=node_version, + message=err, + ) + + node_response = NodeResponse.model_validate(db_node) + if status is NodeStatus.connected: + asyncio.create_task(notification.connect_node(node_response)) + + if notify_err and status is NodeStatus.error and old_status is not NodeStatus.error: + err = err[: MAX_MESSAGE_LENGTH - 3] + "..." + asyncio.create_task(notification.error_node(node_response)) + + @staticmethod + async def connect_node(node_id: int) -> None: + gozargah_node: PasarGuardNode | None = await node_manager.get_node(node_id) + if gozargah_node is None: + return + + async with GetDB() as db: + db_node = await get_node_by_id(db, node_id) + + if db_node is None: + return + + notify_err = True if db_node.status is not NodeStatus.error else False + + logger.info(f'Connecting to "{db_node.name}" node') + await NodeOperation.update_node_status(db_node.id, NodeStatus.connecting) + + core = await core_manager.get_core(db_node.core_config_id if db_node.core_config_id else 1) + + try: + info = await gozargah_node.start( + config=core.to_str(), + backend_type=0, + users=await core_users(db=db), + keep_alive=db_node.keep_alive, + ghather_logs=db_node.gather_logs, + exclude_inbounds=core.exclude_inbound_tags, + timeout=10, + ) + await NodeOperation.update_node_status( + node_id=db_node.id, + status=NodeStatus.connected, + core_version=info.core_version, + node_version=info.node_version, + ) + logger.info( + f'Connected to "{db_node.name}" node v{info.node_version}, xray run on v{info.core_version}' + ) + except NodeAPIError as e: + if e.code == -4: + return + + detail = e.detail + + if len(detail) > 1024: + detail = detail[:1020] + "..." + else: + detail = detail + + await NodeOperation.update_node_status( + node_id=db_node.id, status=NodeStatus.error, err=detail, notify_err=notify_err + ) + + async def create_node(self, db: AsyncSession, new_node: NodeCreate, admin: AdminDetails) -> NodeResponse: + await self.get_validated_core_config(db, new_node.core_config_id) + try: + db_node = await create_node(db, new_node) + except IntegrityError: + await self.raise_error(message=f'Node "{new_node.name}" already exists', code=409, db=db) + + try: + await node_manager.update_node(db_node) + asyncio.create_task(self.connect_node(node_id=db_node.id)) + except NodeAPIError as e: + await self.update_node_status(db_node.id, NodeStatus.error, err=e.detail) + + logger.info(f'New node "{db_node.name}" with id "{db_node.id}" added by admin "{admin.username}"') + + node = NodeResponse.model_validate(db_node) + + asyncio.create_task(notification.create_node(node, admin.username)) + + return node + + async def modify_node( + self, db: AsyncSession, node_id: Node, modified_node: NodeModify, admin: AdminDetails + ) -> Node: + db_node = await self.get_validated_node(db=db, node_id=node_id) + if modified_node.core_config_id is not None: + await self.get_validated_core_config(db, modified_node.core_config_id) + + try: + db_node = await modify_node(db, db_node, modified_node) + except IntegrityError: + await self.raise_error(message=f'Node "{db_node.name}" already exists', code=409, db=db) + + if db_node.status is NodeStatus.disabled: + await node_manager.remove_node(db_node.id) + else: + try: + await node_manager.update_node(db_node) + asyncio.create_task(self.connect_node(node_id=db_node.id)) + except NodeAPIError as e: + await self.update_node_status(db_node.id, NodeStatus.error, err=e.detail) + + logger.info(f'Node "{db_node.name}" with id "{db_node.id}" modified by admin "{admin.username}"') + + node = NodeResponse.model_validate(db_node) + + asyncio.create_task(notification.modify_node(node, admin.username)) + + return node + + async def remove_node(self, db: AsyncSession, node_id: Node, admin: AdminDetails) -> None: + db_node: Node = await self.get_validated_node(db=db, node_id=node_id) + + await node_manager.remove_node(db_node.id) + await remove_node(db=db, db_node=db_node) + + logger.info(f'Node "{db_node.name}" with id "{db_node.id}" deleted by admin "{admin.username}"') + + asyncio.create_task(notification.remove_node(db_node, admin.username)) + + async def restart_node(self, node_id: Node, admin: AdminDetails) -> None: + asyncio.create_task(self.connect_node(node_id)) + logger.info(f'Node "{node_id}" restarted by admin "{admin.username}"') + + async def restart_all_node(self, db: AsyncSession, admin: AdminDetails, core_id: int | None = None) -> None: + nodes: list[Node] = await self.get_db_nodes(db, core_id) + await asyncio.gather(*[NodeOperation.connect_node(node.id) for node in nodes]) + + logger.info(f'All nodes restarted by admin "{admin.username}"') + + async def get_usage( + self, + db: AsyncSession, + start: dt = None, + end: dt = None, + period: Period = Period.hour, + node_id: int | None = None, + group_by_node: bool = False, + ) -> NodeUsageStatsList: + start, end = await self.validate_dates(start, end) + return await get_nodes_usage(db, start, end, period=period, node_id=node_id, group_by_node=group_by_node) + + async def get_logs(self, node_id: Node) -> asyncio.Queue: + node = await node_manager.get_node(node_id) + + if node is None: + await self.raise_error(message="Node not found", code=404) + + try: + logs_queue = await node.get_logs() + except NodeAPIError as e: + await self.raise_error(message=e.detail, code=e.code) + + return logs_queue + + async def get_node_stats_periodic( + self, db: AsyncSession, node_id: id, start: dt = None, end: dt = None, period: Period = Period.hour + ) -> NodeStatsList: + start, end = await self.validate_dates(start, end) + + return await get_node_stats(db, node_id, start, end, period=period) + + async def get_node_system_stats(self, node_id: Node) -> NodeRealtimeStats: + node = await node_manager.get_node(node_id) + + if node is None: + await self.raise_error(message="Node not found", code=404) + + try: + stats = await node.get_system_stats() + except NodeAPIError as e: + await self.raise_error(message=e.detail, code=e.code) + + if stats is None: + await self.raise_error(message="Stats not found", code=404) + + return NodeRealtimeStats( + mem_total=stats.mem_total, + mem_used=stats.mem_used, + cpu_cores=stats.cpu_cores, + cpu_usage=stats.cpu_usage, + incoming_bandwidth_speed=stats.incoming_bandwidth_speed, + outgoing_bandwidth_speed=stats.outgoing_bandwidth_speed, + ) + + async def get_nodes_system_stats(self) -> dict[int, NodeRealtimeStats | None]: + nodes = await node_manager.get_healthy_nodes() + stats_tasks = {id: asyncio.create_task(self._get_node_stats_safe(id)) for id, _ in nodes} + + await asyncio.gather(*stats_tasks.values(), return_exceptions=True) + + results = {} + for node_id, task in stats_tasks.items(): + if task.exception(): + results[node_id] = None + else: + results[node_id] = task.result() + + return results + + async def _get_node_stats_safe(self, node_id: Node) -> NodeRealtimeStats | None: + """Wrapper method that returns None instead of raising exceptions""" + try: + return await self.get_node_system_stats(node_id) + except Exception as e: + logger.error(f"Error getting system stats for node {node_id}: {e}") + return None + + async def get_user_online_stats_by_node(self, db: AsyncSession, node_id: Node, username: str) -> dict[int, int]: + db_user = await get_user(db, username=username) + if db_user is None: + await self.raise_error(message="User not found", code=404) + + node = await node_manager.get_node(node_id) + + if node is None: + await self.raise_error(message="Node not found", code=404) + + try: + stats = await node.get_user_online_stats(email=f"{db_user.id}.{db_user.username}") + except NodeAPIError as e: + await self.raise_error(message=e.detail, code=e.code) + + if stats is None: + await self.raise_error(message="Stats not found", code=404) + + return {node_id: stats.value} + + async def get_user_ip_list_by_node( + self, db: AsyncSession, node_id: Node, username: str + ) -> dict[int, dict[str, int]]: + db_user = await get_user(db, username=username) + if db_user is None: + await self.raise_error(message="User not found", code=404) + + node = await node_manager.get_node(node_id) + + if node is None: + await self.raise_error(message="Node not found", code=404) + + try: + stats = await node.get_user_online_ip_list(email=f"{db_user.id}.{db_user.username}") + except NodeAPIError as e: + await self.raise_error(message=e.detail, code=e.code) + + if stats is None: + await self.raise_error(message="Stats not found", code=404) + + return {node_id: stats.ips} + + async def sync_node_users(self, db: AsyncSession, node_id: int, flush_users: bool = False) -> NodeResponse: + db_node = await self.get_validated_node(db, node_id=node_id) + + if db_node.status != NodeStatus.connected: + await self.raise_error(message="Node is not connected", code=406) + + gozargah_node = await node_manager.get_node(node_id) + if gozargah_node is None: + await self.raise_error(message="Node is not connected", code=409) + + try: + await gozargah_node.sync_users(await core_users(db=db), flush_queue=flush_users) + except NodeAPIError as e: + await update_node_status(db=db, db_node=db_node, status=NodeStatus.error, message=e.detail) + await self.raise_error(message=e.detail, code=e.code) + + return NodeResponse.model_validate(db_node) + + async def clear_usage_data( + self, db: AsyncSession, table: UsageTable, start: dt | None = None, end: dt | None = None + ): + if start and end and start >= end: + await self.raise_error(code=400, message="Start time must be before end time.") + + try: + await clear_usage_data(db, table, start, end) + return {"detail": f"All data from '{table}' has been deleted successfully."} + except Exception as e: + await self.raise_error(code=400, message=f"Deletion failed due to server error: {str(e)}") diff --git a/app/operation/settings.py b/app/operation/settings.py new file mode 100644 index 000000000..16e6fe395 --- /dev/null +++ b/app/operation/settings.py @@ -0,0 +1,44 @@ +import asyncio + +from sqlalchemy.ext.asyncio import AsyncSession + +from app.db.models import Settings +from app.db.crud.settings import get_settings, modify_settings +from app.models.settings import SettingsSchema +from app.settings import refresh_caches +from app.notification.client import define_client +from app.notification.webhook import queue as webhook_queue +from app.telegram import startup_telegram_bot +from . import BaseOperation + + +class SettingsOperation(BaseOperation): + @staticmethod + async def reset_services(old_settings: SettingsSchema, new_settings: SettingsSchema): + if new_settings.telegram != old_settings.telegram: + await startup_telegram_bot() + if new_settings.discord != old_settings.discord: + pass + if old_settings.webhook and new_settings.webhook is None or not new_settings.webhook.enable: + webhook_queue.empty() + if old_settings.notification_settings.proxy_url != new_settings.notification_settings.proxy_url: + await define_client() + + async def get_settings(self, db: AsyncSession) -> Settings: + return await get_settings(db) + + async def modify_settings(self, db: AsyncSession, modify: SettingsSchema) -> SettingsSchema: + db_settings = await get_settings(db) + old_settings = SettingsSchema.model_validate(db_settings) + + db_settings = await modify_settings(db, db_settings, modify) + new_settings = SettingsSchema.model_validate(db_settings) + + await refresh_caches() + asyncio.create_task(self.reset_services(old_settings, new_settings)) + + return new_settings + + async def get_general_settings(self, db: AsyncSession): + settings = await self.get_settings(db) + return settings.general diff --git a/app/operation/subscription.py b/app/operation/subscription.py new file mode 100644 index 000000000..a32d603aa --- /dev/null +++ b/app/operation/subscription.py @@ -0,0 +1,157 @@ +import re +from datetime import datetime as dt + +from fastapi import Response +from fastapi.responses import HTMLResponse + +from app.db import AsyncSession +from app.db.crud.user import get_user_usages, user_sub_update +from app.db.models import User +from app.models.settings import ConfigFormat, SubRule, Subscription as SubSettings +from app.models.stats import Period, UserUsageStatsList +from app.models.user import SubscriptionUserResponse, UsersResponseWithInbounds +from app.settings import subscription_settings +from app.subscription.share import encode_title, generate_subscription +from app.templates import render_template +from config import SUBSCRIPTION_PAGE_TEMPLATE + +from . import BaseOperation + +client_config = { + ConfigFormat.clash_meta: {"config_format": "clash-meta", "media_type": "text/yaml", "as_base64": False}, + ConfigFormat.clash: {"config_format": "clash", "media_type": "text/yaml", "as_base64": False}, + ConfigFormat.sing_box: {"config_format": "sing-box", "media_type": "application/json", "as_base64": False}, + ConfigFormat.links_base64: {"config_format": "links", "media_type": "text/plain", "as_base64": True}, + ConfigFormat.links: {"config_format": "links", "media_type": "text/plain", "as_base64": False}, + ConfigFormat.outline: {"config_format": "outline", "media_type": "application/json", "as_base64": False}, + ConfigFormat.xray: {"config_format": "xray", "media_type": "application/json", "as_base64": False}, +} + + +class SubscriptionOperation(BaseOperation): + @staticmethod + async def validated_user(db_user: User) -> UsersResponseWithInbounds: + user = UsersResponseWithInbounds.model_validate(db_user.__dict__) + user.inbounds = await db_user.inbounds() + user.expire = db_user.expire + + return user + + @staticmethod + async def detect_client_type(user_agent: str, rules: list[SubRule]) -> ConfigFormat | None: + """Detect the appropriate client configuration based on the user agent.""" + for rule in rules: + if re.match(rule.pattern, user_agent): + return rule.target + + @staticmethod + def create_response_headers(user: UsersResponseWithInbounds, request_url: str, sub_settings: SubSettings) -> dict: + """Create response headers for subscription responses, including user subscription info.""" + # Generate user subscription info + user_info = {"upload": 0, "download": user.used_traffic} + + if user.data_limit: + user_info["total"] = user.data_limit + if user.expire: + user_info["expire"] = int(user.expire.timestamp()) + + # Create and return headers + return { + "content-disposition": f'attachment; filename="{user.username}"', + "profile-web-page-url": request_url, + "support-url": user.admin.support_url + if user.admin and user.admin.support_url + else sub_settings.support_url, + "profile-title": encode_title(user.admin.profile_title) + if user.admin and user.admin.profile_title + else encode_title(sub_settings.profile_title), + "profile-update-interval": str(sub_settings.update_interval), + "subscription-userinfo": "; ".join(f"{key}={val}" for key, val in user_info.items()), + } + + async def fetch_config(self, user: UsersResponseWithInbounds, client_type: ConfigFormat) -> tuple[str, str]: + # Get client configuration + config = client_config.get(client_type) + + # Generate subscription content + return ( + await generate_subscription( + user=user, + config_format=config["config_format"], + as_base64=config["as_base64"], + ), + config["media_type"], + ) + + async def user_subscription( + self, + db: AsyncSession, + token: str, + accept_header: str = "", + user_agent: str = "", + request_url: str = "", + ): + """Provides a subscription link based on the user agent (Clash, V2Ray, etc.).""" + # Handle HTML request (subscription page) + sub_settings: SubSettings = await subscription_settings() + db_user = await self.get_validated_sub(db, token) + response_headers = self.create_response_headers(db_user, request_url, sub_settings) + + user = await self.validated_user(db_user) + + if "text/html" in accept_header: + template = ( + db_user.admin.sub_template + if db_user.admin and db_user.admin.sub_template + else SUBSCRIPTION_PAGE_TEMPLATE + ) + conf, media_type = await self.fetch_config(user, ConfigFormat.links) + + return HTMLResponse(render_template(template, {"user": user, "links": conf.split("\n")})) + else: + client_type = await self.detect_client_type(user_agent, sub_settings.rules) + if client_type == ConfigFormat.block or not client_type: + await self.raise_error(message="Client not supported", code=406) + + # Update user subscription info + await user_sub_update(db, db_user.id, user_agent) + conf, media_type = await self.fetch_config(user, client_type) + + # Create response with appropriate headers + return Response(content=conf, media_type=media_type, headers=response_headers) + + async def user_subscription_with_client_type( + self, db: AsyncSession, token: str, client_type: ConfigFormat, request_url: str = "" + ): + """Provides a subscription link based on the specified client type (e.g., Clash, V2Ray).""" + sub_settings: SubSettings = await subscription_settings() + + if client_type == ConfigFormat.block or not getattr(sub_settings.manual_sub_request, client_type): + await self.raise_error(message="Client not supported", code=406) + db_user = await self.get_validated_sub(db, token=token) + response_headers = self.create_response_headers(db_user, request_url, sub_settings) + + user = await self.validated_user(db_user) + conf, media_type = await self.fetch_config(user, client_type) + + # Create response headers + return Response(content=conf, media_type=media_type, headers=response_headers) + + async def user_subscription_info(self, db: AsyncSession, token: str) -> SubscriptionUserResponse: + """Retrieves detailed information about the user's subscription.""" + return await self.get_validated_sub(db, token=token) + + async def get_user_usage( + self, + db: AsyncSession, + token: str, + start: dt = None, + end: dt = None, + period: Period = Period.hour, + ) -> UserUsageStatsList: + """Fetches the usage statistics for the user within a specified date range.""" + start, end = await self.validate_dates(start, end) + + db_user = await self.get_validated_sub(db, token=token) + + return await get_user_usages(db, db_user.id, start, end, period) diff --git a/app/operation/system.py b/app/operation/system.py new file mode 100644 index 000000000..e9d8d2727 --- /dev/null +++ b/app/operation/system.py @@ -0,0 +1,65 @@ +from datetime import timedelta + +from app import __version__ +from app.core.manager import core_manager +from app.db import AsyncSession +from app.db.crud.admin import get_admin +from app.db.crud.general import get_system_usage +from app.db.crud.user import count_online_users, get_users_count_by_status +from app.db.models import UserStatus +from app.models.admin import AdminDetails +from app.models.system import SystemStats +from app.utils.system import cpu_usage, memory_usage + +from . import BaseOperation + + +class SystemOperation(BaseOperation): + @staticmethod + async def get_system_stats(db: AsyncSession, admin: AdminDetails, admin_username: str | None = None) -> SystemStats: + """Fetch system stats including memory, CPU, and user metrics.""" + # Run sync functions + mem = memory_usage() + cpu = cpu_usage() + + admin_param = None + if admin.is_sudo and admin_username: + admin_param = await get_admin(db, admin_username) + elif not admin.is_sudo: + admin_param = admin + + if not admin_param: + system = await get_system_usage(db) + uplink = system.uplink + downlink = system.downlink + else: + uplink = 0 + downlink = admin_param.used_traffic + + admin_id = admin_param.id if admin_param else None + + # Get user counts by status in a single query and online users count + statuses = [UserStatus.active, UserStatus.disabled, UserStatus.on_hold, UserStatus.expired, UserStatus.limited] + user_counts = await get_users_count_by_status(db, statuses, admin_id) + online_users = await count_online_users(db, timedelta(minutes=2), admin_id) + + return SystemStats( + version=__version__, + mem_total=mem.total, + mem_used=mem.used, + cpu_cores=cpu.cores, + cpu_usage=cpu.percent, + total_user=user_counts["total"], + online_users=online_users, + active_users=user_counts[UserStatus.active.value], + disabled_users=user_counts[UserStatus.disabled.value], + expired_users=user_counts[UserStatus.expired.value], + limited_users=user_counts[UserStatus.limited.value], + on_hold_users=user_counts[UserStatus.on_hold.value], + incoming_bandwidth=uplink, + outgoing_bandwidth=downlink, + ) + + @staticmethod + async def get_inbounds() -> list[str]: + return await core_manager.get_inbounds() diff --git a/app/operation/user.py b/app/operation/user.py new file mode 100644 index 000000000..c14f8461c --- /dev/null +++ b/app/operation/user.py @@ -0,0 +1,509 @@ +import asyncio +import secrets +from datetime import datetime as dt, timedelta as td, timezone as tz + +from pydantic import ValidationError +from sqlalchemy.exc import IntegrityError + +from app import notification +from app.db import AsyncSession +from app.db.crud.admin import get_admin +from app.db.crud.bulk import ( + reset_all_users_data_usage, + update_users_datalimit, + update_users_expire, + update_users_proxy_settings, +) +from app.db.crud.user import ( + UsersSortingOptions, + create_user, + get_all_users_usages, + get_expired_users, + get_user_sub_update_list, + get_user_usages, + get_users, + modify_user, + remove_user, + remove_users, + reset_user_by_next, + reset_user_data_usage, + revoke_user_sub, + set_owner, +) +from app.db.models import User, UserStatus, UserTemplate +from app.models.admin import AdminDetails +from app.models.stats import Period, UserUsageStatsList +from app.models.user import ( + BulkUser, + BulkUsersProxy, + CreateUserFromTemplate, + ModifyUserByTemplate, + RemoveUsersResponse, + UserCreate, + UserModify, + UserNotificationResponse, + UserResponse, + UsersResponse, + UserSubscriptionUpdateList, +) +from app.node import node_manager +from app.operation import BaseOperation, OperatorType +from app.utils.logger import get_logger +from app.utils.jwt import create_subscription_token +from app.settings import subscription_settings +from config import SUBSCRIPTION_PATH + + +logger = get_logger("user-operation") + + +class UserOperation(BaseOperation): + @staticmethod + async def generate_subscription_url(user: UserNotificationResponse): + salt = secrets.token_hex(8) + settings = await subscription_settings() + url_prefix = ( + user.admin.sub_domain.replace("*", salt) + if user.admin and user.admin.sub_domain + else (settings.url_prefix).replace("*", salt) + ) + token = await create_subscription_token(user.username) + return f"{url_prefix}/{SUBSCRIPTION_PATH}/{token}" + + async def validate_user(self, db_user: User) -> UserNotificationResponse: + user = UserNotificationResponse.model_validate(db_user) + user.subscription_url = await self.generate_subscription_url(user) + return user + + async def update_user(self, db_user: User) -> UserNotificationResponse: + user = await self.validate_user(db_user) + + if db_user.status in (UserStatus.active, UserStatus.on_hold): + user_inbounds = await db_user.inbounds() + await node_manager.update_user(user, inbounds=user_inbounds) + else: + await node_manager.remove_user(user) + + return user + + async def create_user(self, db: AsyncSession, new_user: UserCreate, admin: AdminDetails) -> UserResponse: + if new_user.next_plan is not None and new_user.next_plan.user_template_id is not None: + await self.get_validated_user_template(db, new_user.next_plan.user_template_id) + + all_groups = await self.validate_all_groups(db, new_user) + db_admin = await get_admin(db, admin.username) + + try: + db_user = await create_user(db, new_user, all_groups, db_admin) + except IntegrityError: + await self.raise_error(message="User already exists", code=409, db=db) + + user = await self.update_user(db_user) + + logger.info(f'New user "{db_user.username}" with id "{db_user.id}" added by admin "{admin.username}"') + + asyncio.create_task(notification.create_user(user, admin)) + + return user + + async def _modify_user( + self, db: AsyncSession, db_user: User, modified_user: UserModify, admin: AdminDetails + ) -> UserResponse: + if modified_user.group_ids: + await self.validate_all_groups(db, modified_user) + + if modified_user.next_plan is not None and modified_user.next_plan.user_template_id is not None: + await self.get_validated_user_template(db, modified_user.next_plan.user_template_id) + + old_status = db_user.status + + db_user = await modify_user(db, db_user, modified_user) + user = await self.update_user(db_user) + + logger.info(f'User "{user.username}" with id "{db_user.id}" modified by admin "{admin.username}"') + + asyncio.create_task(notification.modify_user(user, admin)) + + if user.status != old_status: + asyncio.create_task(notification.user_status_change(user, admin)) + + logger.info(f'User "{db_user.username}" status changed from "{old_status.value}" to "{user.status.value}"') + + return user + + async def modify_user( + self, db: AsyncSession, username: str, modified_user: UserModify, admin: AdminDetails + ) -> UserResponse: + db_user = await self.get_validated_user(db, username, admin) + + return await self._modify_user(db, db_user, modified_user, admin) + + async def remove_user(self, db: AsyncSession, username: str, admin: AdminDetails): + db_user = await self.get_validated_user(db, username, admin) + + user = await self.validate_user(db_user) + await remove_user(db, db_user) + node_manager.remove_user(user) + + asyncio.create_task(notification.remove_user(user, admin)) + + logger.info(f'User "{db_user.username}" with id "{db_user.id}" deleted by admin "{admin.username}"') + return {} + + async def _reset_user_data_usage(self, db: AsyncSession, db_user: User, admin: AdminDetails): + old_status = db_user.status + + db_user = await reset_user_data_usage(db=db, db_user=db_user) + user = await self.update_user(db_user) + + if user.status != old_status: + asyncio.create_task(notification.user_status_change(user, admin)) + + asyncio.create_task(notification.reset_user_data_usage(user, admin)) + + logger.info(f'User "{db_user.username}" usage was reset by admin "{admin.username}"') + + return user + + async def reset_user_data_usage(self, db: AsyncSession, username: str, admin: AdminDetails): + db_user = await self.get_validated_user(db, username, admin) + + return await self._reset_user_data_usage(db, db_user, admin) + + async def revoke_user_sub(self, db: AsyncSession, username: str, admin: AdminDetails) -> UserResponse: + db_user = await self.get_validated_user(db, username, admin) + + db_user = await revoke_user_sub(db=db, db_user=db_user) + user = await self.update_user(db_user) + + asyncio.create_task(notification.user_subscription_revoked(user, admin)) + + logger.info(f'User "{db_user.username}" subscription was revoked by admin "{admin.username}"') + + return user + + async def reset_users_data_usage(self, db: AsyncSession, admin: AdminDetails): + """Reset all users data usage""" + db_admin = await self.get_validated_admin(db, admin.username) + await reset_all_users_data_usage(db=db, admin=db_admin) + + async def active_next_plan(self, db: AsyncSession, username: str, admin: AdminDetails) -> UserResponse: + """Reset user by next plan""" + db_user = await self.get_validated_user(db, username, admin) + + if db_user is None or db_user.next_plan is None: + await self.raise_error(message="User doesn't have next plan", code=404) + + old_status = db_user.status + + db_user = await reset_user_by_next(db=db, db_user=db_user) + + user = await self.update_user(db_user) + + if user.status != old_status: + asyncio.create_task(notification.user_status_change(user, admin)) + + asyncio.create_task(notification.user_data_reset_by_next(user, admin)) + + logger.info(f'User "{db_user.username}"\'s usage was reset by next plan by admin "{admin.username}"') + + return user + + async def set_owner( + self, db: AsyncSession, username: str, admin_username: str, admin: AdminDetails + ) -> UserResponse: + """Set a new owner (admin) for a user.""" + new_admin = await self.get_validated_admin(db, username=admin_username) + db_user = await self.get_validated_user(db, username, admin) + + db_user = await set_owner(db, db_user, new_admin) + user = await self.validate_user(db_user) + logger.info(f'{user.username}"owner successfully set to{new_admin.username} by admin "{admin.username}"') + + return user + + async def get_user_usage( + self, + db: AsyncSession, + username: str, + admin: AdminDetails, + start: dt = None, + end: dt = None, + period: Period = Period.hour, + node_id: int | None = None, + group_by_node: bool = False, + ) -> UserUsageStatsList: + start, end = await self.validate_dates(start, end) + db_user = await self.get_validated_user(db, username, admin) + + if not admin.is_sudo: + node_id = None + group_by_node = False + + return await get_user_usages(db, db_user.id, start, end, period, node_id=node_id, group_by_node=group_by_node) + + async def get_user(self, db: AsyncSession, username: str, admin: AdminDetails) -> UserNotificationResponse: + db_user = await self.get_validated_user(db, username, admin) + return await self.validate_user(db_user) + + async def get_user_by_id(self, db: AsyncSession, user_id: int, admin: AdminDetails) -> UserNotificationResponse: + db_user = await self.get_validated_user_by_id(db, user_id, admin) + return await self.validate_user(db_user) + + async def get_users( + self, + db: AsyncSession, + admin: AdminDetails, + offset: int = None, + limit: int = None, + username: list[str] = None, + search: str | None = None, + owner: list[str] | None = None, + status: UserStatus | None = None, + sort: str | None = None, + proxy_id: str | None = None, + load_sub: bool = False, + group_ids: list[int] | None = None, + ) -> UsersResponse: + """Get all users""" + sort_list = [] + if sort is not None: + opts = sort.strip(",").split(",") + for opt in opts: + try: + enum_member = UsersSortingOptions[opt] + sort_list.append(enum_member.value) + except KeyError: + await self.raise_error(message=f'"{opt}" is not a valid sort option', code=400) + + users, count = await get_users( + db=db, + offset=offset, + limit=limit, + search=search, + usernames=username, + status=status, + sort=sort_list, + proxy_id=proxy_id, + admins=owner if admin.is_sudo else [admin.username], + return_with_count=True, + group_ids=group_ids, + ) + + if load_sub: + tasks = [self.generate_subscription_url(user) for user in users] + urls = await asyncio.gather(*tasks) + + for user, url in zip(users, urls): + user.subscription_url = url + + response = UsersResponse(users=users, total=count) + + return response + + async def get_users_usage( + self, + db: AsyncSession, + admin: AdminDetails, + start: dt = None, + end: dt = None, + owner: list[str] | None = None, + period: Period = Period.hour, + node_id: int | None = None, + group_by_node: bool = False, + ) -> UserUsageStatsList: + """Get all users usage""" + start, end = await self.validate_dates(start, end) + + if not admin.is_sudo: + node_id = None + group_by_node = False + + return await get_all_users_usages( + db=db, + start=start, + end=end, + period=period, + node_id=node_id, + admin=owner if admin.is_sudo else [admin.username], + group_by_node=group_by_node, + ) + + @staticmethod + async def remove_users_logger(users: list[str], by: str): + for user in users: + logger.info(f'User "{user}" deleted by admin "{by}"') + + async def get_expired_users( + self, + db: AsyncSession, + expired_after: dt = None, + expired_before: dt = None, + admin_username: str = None, + ) -> list[str]: + """ + Get users who have expired within the specified date range. + + - **expired_after** UTC datetime (optional) + - **expired_before** UTC datetime (optional) + - At least one of expired_after or expired_before must be provided for filtering + - If both are omitted, returns all expired users + """ + + expired_after, expired_before = await self.validate_dates(expired_after, expired_before) + if admin_username: + admin_id = (await self.get_validated_admin(db, admin_username)).id + else: + admin_id = None + users = await get_expired_users(db, expired_after, expired_before, admin_id) + return [row.username for row in users] + + async def delete_expired_users( + self, + db: AsyncSession, + admin: AdminDetails, + expired_after: dt = None, + expired_before: dt = None, + admin_username: str = None, + ) -> RemoveUsersResponse: + """ + Delete users who have expired within the specified date range. + + - **expired_after** UTC datetime (optional) + - **expired_before** UTC datetime (optional) + - At least one of expired_after or expired_before must be provided + """ + + expired_after, expired_before = await self.validate_dates(expired_after, expired_before) + if admin_username: + admin_id = (await self.get_validated_admin(db, admin_username)).id + else: + admin_id = None + users = await get_expired_users(db, expired_after, expired_before, admin_id) + await remove_users(db, users) + + username_list = [row.username for row in users] + self.remove_users_logger(users=username_list, by=admin.username) + + return RemoveUsersResponse(users=username_list, count=len(username_list)) + + @staticmethod + def load_base_user_args(template: UserTemplate) -> dict: + user_args = { + "data_limit": template.data_limit, + "group_ids": template.group_ids, + "data_limit_reset_strategy": template.data_limit_reset_strategy, + "status": template.status, + } + + if template.status == UserStatus.active: + if template.expire_duration: + user_args["expire"] = dt.now(tz.utc) + td(seconds=template.expire_duration) + else: + user_args["expire"] = None + else: + user_args["expire"] = 0 + user_args["on_hold_expire_duration"] = template.expire_duration + if template.on_hold_timeout: + user_args["on_hold_timeout"] = dt.now(tz.utc) + td(seconds=template.on_hold_timeout) + else: + user_args["on_hold_timeout"] = None + + return user_args + + @staticmethod + def apply_settings(user_args: UserCreate | UserModify, template: UserTemplate) -> dict: + if template.extra_settings: + flow = template.extra_settings.get("flow", None) + method = template.extra_settings.get("method", None) + + if flow is not None: + user_args.proxy_settings.vless.flow = flow + + if method is not None: + user_args.proxy_settings.shadowsocks.method = method + + return user_args + + async def create_user_from_template( + self, db: AsyncSession, new_template_user: CreateUserFromTemplate, admin: AdminDetails + ) -> UserResponse: + user_template = await self.get_validated_user_template(db, new_template_user.user_template_id) + + if user_template.is_disabled: + await self.raise_error("this template is disabled", 403) + + new_user_args = self.load_base_user_args(user_template) + new_user_args["username"] = ( + f"{user_template.username_prefix if user_template.username_prefix else ''}{new_template_user.username}{user_template.username_suffix if user_template.username_suffix else ''}" + ) + + try: + new_user = UserCreate(**new_user_args, note=new_template_user.note) + except ValidationError as e: + error_messages = "; ".join([f"{err['loc'][0]}: {err['msg']}" for err in e.errors()]) + await self.raise_error(message=error_messages, code=400) + + new_user = self.apply_settings(new_user, user_template) + + return await self.create_user(db, new_user, admin) + + async def modify_user_with_template( + self, db: AsyncSession, username: str, modified_template: ModifyUserByTemplate, admin: AdminDetails + ) -> UserResponse: + db_user = await self.get_validated_user(db, username, admin) + user_template = await self.get_validated_user_template(db, modified_template.user_template_id) + + if user_template.is_disabled: + await self.raise_error("this template is disabled", 403) + + user_args = self.load_base_user_args(user_template) + user_args["proxy_settings"] = db_user.proxy_settings + + try: + modify_user = UserModify(**user_args, note=modified_template.note) + except ValidationError as e: + error_messages = "; ".join([f"{err['loc'][0]}: {err['msg']}" for err in e.errors()]) + await self.raise_error(message=error_messages, code=400) + + modify_user = self.apply_settings(modify_user, user_template) + + if user_template.reset_usages: + await self._reset_user_data_usage(db, db_user, admin) + + return await self._modify_user(db, db_user, modify_user, admin) + + async def bulk_modify_expire(self, db: AsyncSession, bulk_model: BulkUser): + users, users_count = await update_users_expire(db, bulk_model) + + await node_manager.update_users(users) + + if self.operator_type in (OperatorType.API, OperatorType.WEB): + return {"detail": f"operation has been successfuly done on {users_count} users"} + return users_count + + async def bulk_modify_datalimit(self, db: AsyncSession, bulk_model: BulkUser): + users, users_count = await update_users_datalimit(db, bulk_model) + + await node_manager.update_users(users) + + if self.operator_type in (OperatorType.API, OperatorType.WEB): + return {"detail": f"operation has been successfuly done on {users_count} users"} + return users_count + + async def bulk_modify_proxy_settings(self, db: AsyncSession, bulk_model: BulkUsersProxy): + users, users_count = await update_users_proxy_settings(db, bulk_model) + + await node_manager.update_users(users) + + if self.operator_type in (OperatorType.API, OperatorType.WEB): + return {"detail": f"operation has been successfuly done on {users_count} users"} + return users_count + + async def get_user_sub_update_list( + self, db: AsyncSession, username: str, admin: AdminDetails, offset: int = 0, limit: int = 10 + ) -> UserSubscriptionUpdateList: + db_user = await self.get_validated_user(db, username, admin) + user_sub_data, count = await get_user_sub_update_list(db, user_id=db_user.id, offset=offset, limit=limit) + + return UserSubscriptionUpdateList(updates=user_sub_data, count=count) diff --git a/app/operation/user_template.py b/app/operation/user_template.py new file mode 100644 index 000000000..da959b49e --- /dev/null +++ b/app/operation/user_template.py @@ -0,0 +1,68 @@ +from sqlalchemy.exc import IntegrityError + +from app.db import AsyncSession +import asyncio + +from app.db.models import Admin +from app.db.crud.user_template import ( + create_user_template, + modify_user_template, + remove_user_template, + get_user_templates, +) +from app.operation import BaseOperation +from app.models.user_template import UserTemplateCreate, UserTemplateModify, UserTemplateResponse +from app.utils.logger import get_logger +from app import notification + +logger = get_logger("user-template-operation") + + +class UserTemplateOperation(BaseOperation): + async def create_user_template( + self, db: AsyncSession, new_user_template: UserTemplateCreate, admin: Admin + ) -> UserTemplateResponse: + for group_id in new_user_template.group_ids: + await self.get_validated_group(db, group_id) + try: + db_user_template = await create_user_template(db, new_user_template) + except IntegrityError: + await self.raise_error("Template by this name already exists", 409, db=db) + + user_template = UserTemplateResponse.model_validate(db_user_template) + + asyncio.create_task(notification.create_user_template(user_template, admin.username)) + + logger.info(f'User template "{db_user_template.name}" created by admin "{admin.username}"') + return db_user_template + + async def modify_user_template( + self, db: AsyncSession, template_id: int, modified_user_template: UserTemplateModify, admin: Admin + ) -> UserTemplateResponse: + db_user_template = await self.get_validated_user_template(db, template_id) + if modified_user_template.group_ids: + for group_id in modified_user_template.group_ids: + await self.get_validated_group(db, group_id) + try: + db_user_template = await modify_user_template(db, db_user_template, modified_user_template) + except IntegrityError: + await self.raise_error("Template by this name already exists", 409, db=db) + + user_template = UserTemplateResponse.model_validate(db_user_template) + + asyncio.create_task(notification.modify_user_template(user_template, admin.username)) + + logger.info(f'User template "{db_user_template.name}" modified by admin "{admin.username}"') + return db_user_template + + async def remove_user_template(self, db: AsyncSession, template_id: int, admin: Admin) -> None: + db_user_template = await self.get_validated_user_template(db, template_id) + await remove_user_template(db, db_user_template) + logger.info(f'User template "{db_user_template.name}" deleted by admin "{admin.username}"') + + asyncio.create_task(notification.remove_user_template(db_user_template.name, admin.username)) + + async def get_user_templates( + self, db: AsyncSession, offset: int = None, limit: int = None + ) -> list[UserTemplateResponse]: + return await get_user_templates(db, offset, limit) diff --git a/app/routers/__init__.py b/app/routers/__init__.py new file mode 100644 index 000000000..ccf06c431 --- /dev/null +++ b/app/routers/__init__.py @@ -0,0 +1,24 @@ +from fastapi import APIRouter + +from . import admin, core, group, home, host, node, settings, subscription, system, user, user_template + +api_router = APIRouter() + +routers = [ + home.router, + admin.router, + system.router, + settings.router, + group.router, + core.router, + host.router, + node.router, + user.router, + subscription.router, + user_template.router, +] + +for router in routers: + api_router.include_router(router) + +__all__ = ["api_router"] diff --git a/app/routers/admin.py b/app/routers/admin.py new file mode 100644 index 000000000..c2a5a7f27 --- /dev/null +++ b/app/routers/admin.py @@ -0,0 +1,154 @@ +import asyncio +from fastapi import APIRouter, Depends, HTTPException, Request, status, Header +from fastapi.security import OAuth2PasswordRequestForm +from app import notification +from app.db import AsyncSession, get_db +from app.models.admin import AdminCreate, AdminDetails, AdminModify, Token +from app.operation import OperatorType +from app.operation.admin import AdminOperation +from app.utils import responses +from app.utils.jwt import create_admin_token +from .authentication import check_sudo_admin, get_current, validate_admin, validate_mini_app_admin + +router = APIRouter(tags=["Admin"], prefix="/api/admin", responses={401: responses._401, 403: responses._403}) +admin_operator = AdminOperation(operator_type=OperatorType.API) + + +def get_client_ip(request: Request) -> str: + """Extract the client's IP address from the request headers or client.""" + forwarded_for = request.headers.get("X-Forwarded-For") + if forwarded_for: + return forwarded_for.split(",")[0].strip() + if request.client: + return request.client.host + return "Unknown" + + +@router.post("/token", response_model=Token) +async def admin_token( + request: Request, form_data: OAuth2PasswordRequestForm = Depends(), db: AsyncSession = Depends(get_db) +): + """Authenticate an admin and issue a token.""" + client_ip = get_client_ip(request) + + db_admin = await validate_admin(db, form_data.username, form_data.password) + if not db_admin: + asyncio.create_task(notification.admin_login(form_data.username, form_data.password, client_ip, False)) + raise HTTPException( + status_code=401, + detail="Incorrect username or password", + headers={"WWW-Authenticate": "Bearer"}, + ) + if db_admin.is_disabled: + asyncio.create_task(notification.admin_login(form_data.username, form_data.password, client_ip, False)) + raise HTTPException( + status_code=403, + detail="your account has been disabled", + headers={"WWW-Authenticate": "Bearer"}, + ) + asyncio.create_task(notification.admin_login(db_admin.username, "", client_ip, True)) + return Token(access_token=await create_admin_token(form_data.username, db_admin.is_sudo)) + + +@router.post("/miniapp/token") +async def admin_mini_app_token( + request: Request, x_telegram_authorization: str = Header(), db: AsyncSession = Depends(get_db) +): + """Authenticate an admin and issue a token.""" + + client_ip = get_client_ip(request) + + db_admin = await validate_mini_app_admin(db, x_telegram_authorization) + if not db_admin: + raise HTTPException( + status_code=401, + detail="admin not found.", + headers={"WWW-Authenticate": "Bearer"}, + ) + if db_admin.is_disabled: + raise HTTPException( + status_code=403, + detail="your account has been disabled", + headers={"WWW-Authenticate": "Bearer"}, + ) + asyncio.create_task(notification.admin_login(db_admin.username, "", client_ip, True)) + return Token(access_token=await create_admin_token(db_admin.username, db_admin.is_sudo)) + + +@router.post( + "", + response_model=AdminDetails, + responses={201: {"description": "Admin created successfully"}, 409: responses._409}, + status_code=status.HTTP_201_CREATED, +) +async def create_admin( + new_admin: AdminCreate, db: AsyncSession = Depends(get_db), admin: AdminDetails = Depends(check_sudo_admin) +): + """Create a new admin if the current admin has sudo privileges.""" + return await admin_operator.create_admin(db, new_admin=new_admin, admin=admin) + + +@router.put("/{username}", response_model=AdminDetails, responses={403: responses._403, 404: responses._404}) +async def modify_admin( + username: str, + modified_admin: AdminModify, + db: AsyncSession = Depends(get_db), + current_admin: AdminDetails = Depends(check_sudo_admin), +): + """Modify an existing admin's details.""" + return await admin_operator.modify_admin( + db, username=username, modified_admin=modified_admin, current_admin=current_admin + ) + + +@router.delete("/{username}", status_code=status.HTTP_204_NO_CONTENT) +async def remove_admin( + username: str, db: AsyncSession = Depends(get_db), current_admin: AdminDetails = Depends(check_sudo_admin) +): + """Remove an admin from the database.""" + await admin_operator.remove_admin(db, username=username, current_admin=current_admin) + return {} + + +@router.get("", response_model=AdminDetails) +def get_current_admin(admin: AdminDetails = Depends(get_current)): + """Retrieve the current authenticated admin.""" + return admin + + +@router.get("s", response_model=list[AdminDetails]) +async def get_admins( + username: str | None = None, + offset: int | None = None, + limit: int | None = None, + db: AsyncSession = Depends(get_db), + _: AdminDetails = Depends(check_sudo_admin), +): + """Fetch a list of admins with optional filters for pagination and username.""" + return await admin_operator.get_admins(db, username=username, offset=offset, limit=limit) + + +@router.post("/{username}/users/disable", responses={404: responses._404}) +async def disable_all_active_users( + username: str, db: AsyncSession = Depends(get_db), admin: AdminDetails = Depends(check_sudo_admin) +): + """Disable all active users under a specific admin""" + await admin_operator.disable_all_active_users(db, username=username, admin=admin) + return {} + + +@router.post("/{username}/users/activate", responses={404: responses._404}) +async def activate_all_disabled_users( + username: str, db: AsyncSession = Depends(get_db), admin: AdminDetails = Depends(check_sudo_admin) +): + """Activate all disabled users under a specific admin""" + await admin_operator.activate_all_disabled_users(db, username=username, admin=admin) + return {} + + +@router.post("/{username}/reset", response_model=AdminDetails, responses={404: responses._404}) +async def reset_admin_usage( + username: str, db: AsyncSession = Depends(get_db), admin: AdminDetails = Depends(check_sudo_admin) +): + """Resets usage of admin.""" + return await admin_operator.reset_admin_usage(db, username=username, admin=admin) diff --git a/app/routers/authentication.py b/app/routers/authentication.py new file mode 100644 index 000000000..a6236f659 --- /dev/null +++ b/app/routers/authentication.py @@ -0,0 +1,100 @@ +from datetime import timezone as tz + +from aiogram.utils.web_app import WebAppInitData, safe_parse_webapp_init_data +from fastapi import Depends, HTTPException, status +from fastapi.security import OAuth2PasswordBearer + +from app.db import AsyncSession, get_db +from app.db.crud.admin import get_admin as get_admin_by_username, get_admin_by_telegram_id +from app.models.admin import AdminDetails, AdminInDB, AdminValidationResult +from app.models.settings import Telegram +from app.settings import telegram_settings +from app.utils.jwt import get_admin_payload +from config import DEBUG, SUDOERS + +oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/api/admin/token") + + +async def get_admin(db: AsyncSession, token: str) -> AdminDetails | None: + payload = await get_admin_payload(token) + if not payload: + return + + db_admin = await get_admin_by_username(db, payload["username"]) + if db_admin: + if db_admin.password_reset_at: + if not payload.get("created_at"): + return + if db_admin.password_reset_at.astimezone(tz.utc) > payload.get("created_at"): + return + + return AdminDetails.model_validate(db_admin) + + elif payload["username"] in SUDOERS and payload["is_sudo"] is True: + return AdminDetails(username=payload["username"], is_sudo=True) + + +async def get_current(db: AsyncSession = Depends(get_db), token: str = Depends(oauth2_scheme)): + admin: AdminDetails | None = await get_admin(db, token) + if not admin: + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail="Could not validate credentials", + headers={"WWW-Authenticate": "Bearer"}, + ) + if admin.is_disabled: + raise HTTPException( + status_code=status.HTTP_403_FORBIDDEN, + detail="your account has been disabled", + headers={"WWW-Authenticate": "Bearer"}, + ) + + return admin + + +async def check_sudo_admin(admin: AdminDetails = Depends(get_current)): + if not admin.is_sudo: + raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="You're not allowed") + return admin + + +async def validate_admin(db: AsyncSession, username: str, password: str) -> AdminValidationResult | None: + """Validate admin credentials with environment variables or database.""" + + db_admin = await get_admin_by_username(db, username) + if db_admin and AdminInDB.model_validate(db_admin).verify_password(password): + return AdminValidationResult( + username=db_admin.username, is_sudo=db_admin.is_sudo, is_disabled=db_admin.is_disabled + ) + + if not db_admin and SUDOERS.get(username) == password: + if not DEBUG: + raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="env admin not allowed in production") + + return AdminValidationResult(username=username, is_sudo=True, is_disabled=False) + + +async def validate_mini_app_admin(db: AsyncSession, token: str) -> AdminValidationResult | None: + """Validate raw MiniApp init data and return it as AdminValidationResult object""" + settings: Telegram = await telegram_settings() + + if not settings.mini_app_login or not settings.enable: + raise HTTPException( + status_code=status.HTTP_503_SERVICE_UNAVAILABLE, + detail="service unavailable", + ) + + try: + data: WebAppInitData = safe_parse_webapp_init_data(token=settings.token, init_data=token) + except ValueError: + raise HTTPException( + status_code=status.HTTP_403_FORBIDDEN, + detail="invalid token", + headers={"WWW-Authenticate": "Bearer"}, + ) + + db_admin = await get_admin_by_telegram_id(db, data.user.id) + if db_admin: + return AdminValidationResult( + username=db_admin.username, is_sudo=db_admin.is_sudo, is_disabled=db_admin.is_disabled + ) diff --git a/app/routers/core.py b/app/routers/core.py new file mode 100644 index 000000000..acbf89c30 --- /dev/null +++ b/app/routers/core.py @@ -0,0 +1,85 @@ +from fastapi import APIRouter, Depends, status + +from app.db import AsyncSession, get_db +from app.models.admin import AdminDetails +from app.models.core import CoreCreate, CoreResponse, CoreResponseList +from app.operation import OperatorType +from app.operation.core import CoreOperation +from app.operation.node import NodeOperation +from app.utils import responses + +from .authentication import check_sudo_admin + +core_operator = CoreOperation(operator_type=OperatorType.API) +node_operator = NodeOperation(operator_type=OperatorType.API) +router = APIRouter(tags=["Core"], prefix="/api/core", responses={401: responses._401, 403: responses._403}) + + +@router.post("", response_model=CoreResponse, status_code=status.HTTP_201_CREATED) +async def create_core_config( + new_core: CoreCreate, admin: AdminDetails = Depends(check_sudo_admin), db: AsyncSession = Depends(get_db) +): + """Create a new core configuration.""" + return await core_operator.create_core(db, new_core, admin) + + +@router.get("/{core_id}", response_model=CoreResponse) +async def get_core_config( + core_id: int, _: AdminDetails = Depends(check_sudo_admin), db: AsyncSession = Depends(get_db) +) -> dict: + """Get a core configuration by its ID.""" + return await core_operator.get_validated_core_config(db, core_id) + + +@router.put("/{core_id}", response_model=CoreResponse) +async def modify_core_config( + core_id: int, + restart_nodes: bool, + modified_core: CoreCreate, + admin: AdminDetails = Depends(check_sudo_admin), + db: AsyncSession = Depends(get_db), +): + """Update an existing core configuration.""" + response = await core_operator.modify_core(db, core_id, modified_core, admin) + + if restart_nodes: + await node_operator.restart_all_node(db=db, core_id=core_id, admin=admin) + + return response + + +@router.delete("/{core_id}", status_code=status.HTTP_204_NO_CONTENT) +async def delete_core_config( + core_id: int, + restart_nodes: bool = False, + admin: AdminDetails = Depends(check_sudo_admin), + db: AsyncSession = Depends(get_db), +): + """Delete a core configuration.""" + await core_operator.delete_core(db, core_id, admin) + + if restart_nodes: + await node_operator.restart_all_node(db=db, core_id=core_id, admin=admin) + + return {} + + +@router.get("s", response_model=CoreResponseList) +async def get_all_cores( + offset: int | None = None, + limit: int | None = None, + _: AdminDetails = Depends(check_sudo_admin), + db: AsyncSession = Depends(get_db), +): + """Get a list of all core configurations.""" + return await core_operator.get_all_cores(db, offset, limit) + + +@router.post("/{core_id}/restart", status_code=status.HTTP_204_NO_CONTENT) +async def restart_core( + core_id: int, admin: AdminDetails = Depends(check_sudo_admin), db: AsyncSession = Depends(get_db) +): + """restart nodes related to the core config""" + + await node_operator.restart_all_node(db=db, core_id=core_id, admin=admin) + return {} diff --git a/app/routers/group.py b/app/routers/group.py new file mode 100644 index 000000000..8343aad75 --- /dev/null +++ b/app/routers/group.py @@ -0,0 +1,205 @@ +from fastapi import APIRouter, Depends, status + +from app.db import AsyncSession, get_db +from app.models.admin import AdminDetails +from app.models.group import BulkGroup, GroupCreate, GroupModify, GroupResponse, GroupsResponse +from app.operation import OperatorType +from app.operation.group import GroupOperation +from app.utils import responses + +from .authentication import check_sudo_admin, get_current + +router = APIRouter(prefix="/api/group", tags=["Groups"], responses={401: responses._401, 403: responses._403}) +group_operator = GroupOperation(OperatorType.API) + + +@router.post( + "", + response_model=GroupResponse, + status_code=status.HTTP_201_CREATED, + summary="Create a new group", + description="Creates a new group in the system. Only sudo administrators can create groups.", +) +async def create_group( + new_group: GroupCreate, db: AsyncSession = Depends(get_db), admin: AdminDetails = Depends(check_sudo_admin) +): + """ + Create a new group in the system. + + The group model has the following properties: + - **name**: String (3-64 chars) containing only a-z and 0-9 + - **inbound_tags**: List of inbound tags that this group can access + - **is_disabled**: Boolean flag to disable/enable the group + + Returns: + GroupResponse: The created group data with additional fields: + - **id**: Unique identifier for the group + - **total_users**: Number of users in this group + + Raises: + 401: Unauthorized - If not authenticated + 403: Forbidden - If not sudo admin + """ + return await group_operator.create_group(db, new_group, admin) + + +@router.get( + "s", + response_model=GroupsResponse, + summary="List all groups", + description="Retrieves a paginated list of all groups in the system. Requires admin authentication.", +) +async def get_all_groups( + offset: int = None, limit: int = None, db: AsyncSession = Depends(get_db), _: AdminDetails = Depends(get_current) +): + """ + Retrieve a list of all groups with optional pagination. + + The response includes: + - **groups**: List of GroupResponse objects containing: + - **id**: Unique identifier + - **name**: Group name + - **inbound_tags**: List of allowed inbound tags + - **is_disabled**: Group status + - **total_users**: Number of users in group + - **total**: Total count of groups + + Returns: + GroupsResponse: List of groups and total count + + Raises: + 401: Unauthorized - If not authenticated + """ + return await group_operator.get_all_groups(db, offset, limit) + + +@router.get( + "/{group_id}", + response_model=GroupResponse, + summary="Get group details", + description="Retrieves detailed information about a specific group by its ID.", + responses={404: responses._404}, +) +async def get_group(group_id: int, db: AsyncSession = Depends(get_db), _: AdminDetails = Depends(get_current)): + """ + Get a specific group by its **ID**. + + The response includes: + - **id**: Unique identifier + - **name**: Group name (3-64 chars, a-z, 0-9) + - **inbound_tags**: List of allowed inbound tags + - **is_disabled**: Group status + - **total_users**: Number of users in group + + Returns: + GroupResponse: The requested group data + + Raises: + 404: Not Found - If group doesn't exist + """ + return await group_operator.get_validated_group(db, group_id) + + +@router.put( + "/{group_id}", + response_model=GroupResponse, + summary="Modify group", + description="Updates an existing group's information. Only sudo administrators can modify groups.", + responses={404: responses._404}, +) +async def modify_group( + group_id: int, + modified_group: GroupModify, + db: AsyncSession = Depends(get_db), + admin: AdminDetails = Depends(check_sudo_admin), +): + """ + Modify an existing group's information. + + The group model can be modified with: + - **name**: String (3-64 chars) containing only a-z and 0-9 + - **inbound_tags**: List of inbound tags that this group can access + - **is_disabled**: Boolean flag to disable/enable the group + + Returns: + GroupResponse: The modified group data with additional fields: + - **id**: Unique identifier for the group + - **total_users**: Number of users in this group + + Raises: + 401: Unauthorized - If not authenticated + 403: Forbidden - If not sudo admin + 404: Not Found - If group doesn't exist + """ + return await group_operator.modify_group(db, group_id, modified_group, admin) + + +@router.delete( + "/{group_id}", + status_code=status.HTTP_204_NO_CONTENT, + summary="Remove group", + description="Deletes a group from the system. Only sudo administrators can delete groups.", + responses={404: responses._404}, +) +async def remove_group( + group_id: int, db: AsyncSession = Depends(get_db), admin: AdminDetails = Depends(check_sudo_admin) +): + """ + Remove a group by its **ID**. + + Returns: + dict: Empty dictionary on successful deletion + + Raises: + 401: Unauthorized - If not authenticated + 403: Forbidden - If not sudo admin + 404: Not Found - If group doesn't exist + """ + await group_operator.remove_group(db, group_id, admin) + return {} + + +@router.post( + "s/bulk/add", + summary="Bulk add groups to users", + response_description="Success confirmation", +) +async def bulk_add_groups_to_users( + bulk_group: BulkGroup, db: AsyncSession = Depends(get_db), _: AdminDetails = Depends(get_current) +): + """ + Bulk assign groups to multiple users, users under specific admins, or all users. + + - **group_ids**: List of group IDs to add (required) + - **users**: Optional list of user IDs to assign the groups to + - **admins**: Optional list of admin IDs — their users will be targeted + + Notes: + - If neither 'users' nor 'admins' are provided, groups will be added to *all users* + - Existing user-group associations will be ignored (no duplication) + - Returns list of affected users (those who received new group associations) + """ + return await group_operator.bulk_add_groups(db, bulk_group) + + +@router.post( + "s/bulk/remove", + summary="Bulk remove groups from users", + response_description="Success confirmation", +) +async def bulk_remove_users_from_groups( + bulk_group: BulkGroup, db: AsyncSession = Depends(get_db), _: AdminDetails = Depends(get_current) +): + """ + Bulk remove groups from multiple users, users under specific admins, or all users. + + - **group_ids**: List of group IDs to remove (required) + - **users**: Optional list of user IDs to remove the groups from + - **admins**: Optional list of admin IDs — their users will be targeted + + Notes: + - If neither 'users' nor 'admins' are provided, groups will be removed from *all users* + - Only existing user-group associations will be removed + - Returns list of affected users (those who had groups removed) + """ + return await group_operator.bulk_remove_groups(db, bulk_group) diff --git a/app/routers/home.py b/app/routers/home.py new file mode 100644 index 000000000..7e07d385f --- /dev/null +++ b/app/routers/home.py @@ -0,0 +1,52 @@ +from typing import Optional + +from fastapi import APIRouter, Request +from fastapi.responses import HTMLResponse, JSONResponse + +from app.templates import render_template +from config import DASHBOARD_PATH, HOME_PAGE_TEMPLATE + +DASHBOARD_ROUTE = DASHBOARD_PATH.rstrip("/") +router = APIRouter() + + +@router.get("/", response_class=HTMLResponse) +async def base(): + return render_template(HOME_PAGE_TEMPLATE) + + +@router.get("/manifest.json") +async def get_manifest(request: Request, start_url: Optional[str] = None): + """ + Dynamic PWA manifest generator + """ + # Get the base URL + # base_url = str(request.base_url).rstrip("/") + + # Determine start URL - prioritize query param, then dashboard path, then root + if start_url: + # Validate that start_url is within the dashboard path for security + if start_url.startswith(DASHBOARD_ROUTE): + resolved_start_url = start_url + else: + resolved_start_url = DASHBOARD_ROUTE + else: + resolved_start_url = DASHBOARD_ROUTE or "/" + + manifest = { + "name": "PasarGuard", + "short_name": "PasarGuard", + "description": "PasarGuard: Modern dashboard for managing proxies and users.", + "theme_color": "#1b1b1d", + "background_color": "#1b1b1d", + "display": "standalone", + "start_url": resolved_start_url, + "scope": DASHBOARD_ROUTE or "/", + "icons": [ + {"src": "/statics/favicon/logo-pwa.png", "sizes": "192x192", "type": "image/png"}, + {"src": "/statics/favicon/logo-pwa.png", "sizes": "512x512", "type": "image/png"}, + {"src": "/statics/favicon/logo-pwa.png", "sizes": "180x180", "type": "image/png"}, + ], + } + + return JSONResponse(content=manifest) diff --git a/app/routers/host.py b/app/routers/host.py new file mode 100644 index 000000000..f7a5fcb2e --- /dev/null +++ b/app/routers/host.py @@ -0,0 +1,85 @@ +from fastapi import APIRouter, Depends, status + +from app.db import AsyncSession, get_db +from app.models.admin import AdminDetails +from app.models.host import BaseHost, CreateHost +from app.operation import OperatorType +from app.operation.host import HostOperation +from app.utils import responses + +from .authentication import check_sudo_admin + +host_operator = HostOperation(operator_type=OperatorType.API) +router = APIRouter(tags=["Host"], prefix="/api/host", responses={401: responses._401, 403: responses._403}) + + +@router.get("/{host_id}", response_model=BaseHost) +async def get_host(host_id: int, db: AsyncSession = Depends(get_db), _: AdminDetails = Depends(check_sudo_admin)): + """ + get host by **id** + """ + return await host_operator.get_validated_host(db=db, host_id=host_id) + + +@router.get("s", response_model=list[BaseHost]) +async def get_hosts( + offset: int = 0, limit: int = 0, db: AsyncSession = Depends(get_db), _: AdminDetails = Depends(check_sudo_admin) +): + """ + Get proxy hosts. + """ + return await host_operator.get_hosts(db=db, offset=offset, limit=limit) + + +@router.post("/", response_model=BaseHost, status_code=status.HTTP_201_CREATED) +async def create_host( + new_host: CreateHost, db: AsyncSession = Depends(get_db), admin: AdminDetails = Depends(check_sudo_admin) +): + """ + create a new host + + **inbound_tag** must be available in one of xray config + """ + return await host_operator.create_host(db, new_host=new_host, admin=admin) + + +@router.put("/{host_id}", response_model=BaseHost, responses={404: responses._404}) +async def modify_host( + host_id: int, + modified_host: CreateHost, + db: AsyncSession = Depends(get_db), + admin: AdminDetails = Depends(check_sudo_admin), +): + """ + modify host by **id** + + **inbound_tag** must be available in one of xray configs + """ + return await host_operator.modify_host(db, host_id=host_id, modified_host=modified_host, admin=admin) + + +@router.delete( + "/{host_id}", + responses={404: responses._404}, + status_code=status.HTTP_204_NO_CONTENT, +) +async def remove_host( + host_id: int, db: AsyncSession = Depends(get_db), admin: AdminDetails = Depends(check_sudo_admin) +): + """ + remove host by **id** + """ + await host_operator.remove_host(db, host_id=host_id, admin=admin) + return {} + + +@router.put("s", response_model=list[BaseHost]) +async def modify_hosts( + modified_hosts: list[CreateHost], + db: AsyncSession = Depends(get_db), + admin: AdminDetails = Depends(check_sudo_admin), +): + """ + Modify proxy hosts and update the configuration. + """ + return await host_operator.modify_hosts(db=db, modified_hosts=modified_hosts, admin=admin) diff --git a/app/routers/node.py b/app/routers/node.py new file mode 100644 index 000000000..e89d61f73 --- /dev/null +++ b/app/routers/node.py @@ -0,0 +1,205 @@ +import asyncio +from datetime import datetime as dt +from typing import AsyncGenerator + +from fastapi import APIRouter, Depends, Query, Request, status +from sse_starlette.sse import EventSourceResponse + +from app.db import AsyncSession, get_db +from app.models.admin import AdminDetails +from app.models.node import NodeCreate, NodeModify, NodeResponse, NodeSettings, UsageTable +from app.models.stats import NodeRealtimeStats, NodeStatsList, NodeUsageStatsList, Period +from app.operation import OperatorType +from app.operation.node import NodeOperation +from app.utils import responses + +from .authentication import check_sudo_admin + +node_operator = NodeOperation(operator_type=OperatorType.API) +router = APIRouter(tags=["Node"], prefix="/api/node", responses={401: responses._401, 403: responses._403}) + + +@router.get("/settings", response_model=NodeSettings) +async def get_node_settings(_: AdminDetails = Depends(check_sudo_admin)): + """Retrieve the current node settings.""" + return NodeSettings() + + +@router.get("/usage", response_model=NodeUsageStatsList) +async def get_usage( + db: AsyncSession = Depends(get_db), + start: dt | None = Query(None, example="2024-01-01T00:00:00+03:30"), + end: dt | None = Query(None, example="2024-01-31T23:59:59+03:30"), + period: Period = Period.hour, + node_id: int | None = None, + group_by_node: bool = False, + _: AdminDetails = Depends(check_sudo_admin), +): + """Retrieve usage statistics for nodes within a specified date range.""" + return await node_operator.get_usage( + db=db, start=start, end=end, period=period, node_id=node_id, group_by_node=group_by_node + ) + + +@router.get("s", response_model=list[NodeResponse]) +async def get_nodes( + backend_id: int | None = None, + offset: int = None, + limit: int = None, + db: AsyncSession = Depends(get_db), + _: AdminDetails = Depends(check_sudo_admin), +): + """Retrieve a list of all nodes. Accessible only to sudo admins.""" + return await node_operator.get_db_nodes(db=db, core_id=backend_id, offset=offset, limit=limit) + + +@router.post( + "", + response_model=NodeResponse, + responses={409: responses._409}, + status_code=status.HTTP_201_CREATED, +) +async def create_node( + new_node: NodeCreate, db: AsyncSession = Depends(get_db), admin: AdminDetails = Depends(check_sudo_admin) +): + """Create a new node to the database.""" + return await node_operator.create_node(db, new_node, admin) + + +@router.get("/{node_id}", response_model=NodeResponse) +async def get_node(node_id: int, db: AsyncSession = Depends(get_db), _: AdminDetails = Depends(check_sudo_admin)): + """Retrieve details of a specific node by its ID.""" + return await node_operator.get_validated_node(db=db, node_id=node_id) + + +@router.put("/{node_id}", response_model=NodeResponse) +async def modify_node( + modified_node: NodeModify, + node_id: int, + db: AsyncSession = Depends(get_db), + admin: AdminDetails = Depends(check_sudo_admin), +): + """Modify a node's details. Only accessible to sudo admins.""" + return await node_operator.modify_node(db, node_id=node_id, modified_node=modified_node, admin=admin) + + +@router.post("/{node_id}/reconnect") +async def reconnect_node(node_id: int, admin: AdminDetails = Depends(check_sudo_admin)): + """Trigger a reconnection for the specified node. Only accessible to sudo admins.""" + await node_operator.restart_node(node_id=node_id, admin=admin) + return {} + + +@router.put("/{node_id}/sync") +async def sync_node( + node_id: int, + flush_users: bool = False, + db: AsyncSession = Depends(get_db), + _: AdminDetails = Depends(check_sudo_admin), +): + return await node_operator.sync_node_users(db, node_id=node_id, flush_users=flush_users) + + +@router.delete("/{node_id}", status_code=status.HTTP_204_NO_CONTENT) +async def remove_node( + node_id: int, db: AsyncSession = Depends(get_db), admin: AdminDetails = Depends(check_sudo_admin) +): + """Remove a node and remove it from xray in the background.""" + await node_operator.remove_node(db=db, node_id=node_id, admin=admin) + return {} + + +@router.get("/{node_id}/logs") +async def node_logs(node_id: int, request: Request, _: AdminDetails = Depends(check_sudo_admin)): + """ + Stream logs for a specific node as Server-Sent Events. + """ + log_queue = await node_operator.get_logs(node_id=node_id) + + async def event_generator() -> AsyncGenerator[str, None]: + try: + while True: + # Check if client disconnected + if await request.is_disconnected(): + break + + try: + log = await log_queue.get() + if log is None: + break + yield f"{log}" + + except Exception as e: + yield f"Error retrieving logs: {str(e)}\n" + break + except asyncio.CancelledError: + pass + + return EventSourceResponse(event_generator()) + + +@router.get("/{node_id}/stats", response_model=NodeStatsList) +async def get_node_stats_periodic( + node_id: int, + start: dt | None = Query(None, example="2024-01-01T00:00:00+03:30"), + end: dt | None = Query(None, example="2024-01-31T23:59:59+03:30"), + period: Period = Period.hour, + db: AsyncSession = Depends(get_db), + _: AdminDetails = Depends(check_sudo_admin), +): + return await node_operator.get_node_stats_periodic(db, node_id=node_id, start=start, end=end, period=period) + + +@router.get("/{node_id}/realtime_stats", response_model=NodeRealtimeStats) +async def realtime_node_stats(node_id: int, _: AdminDetails = Depends(check_sudo_admin)): + """Retrieve node real-time statistics.""" + return await node_operator.get_node_system_stats(node_id=node_id) + + +@router.get("s/realtime_stats", response_model=dict[int, NodeRealtimeStats | None]) +async def realtime_nodes_stats(_: AdminDetails = Depends(check_sudo_admin)): + """Retrieve nodes real-time statistics.""" + return await node_operator.get_nodes_system_stats() + + +@router.get("/{node_id}/online_stats/{username}", response_model=dict[int, int]) +async def user_online_stats( + node_id: int, username: str, db: AsyncSession = Depends(get_db), _: AdminDetails = Depends(check_sudo_admin) +): + """Retrieve user online stats by node.""" + return await node_operator.get_user_online_stats_by_node(db=db, node_id=node_id, username=username) + + +@router.get("/{node_id}/online_stats/{username}/ip", response_model=dict[int, dict[str, int]]) +async def user_online_ip_list( + node_id: int, username: str, db: AsyncSession = Depends(get_db), _: AdminDetails = Depends(check_sudo_admin) +): + """Retrieve user ips by node.""" + return await node_operator.get_user_ip_list_by_node(db=db, node_id=node_id, username=username) + + +@router.delete( + "s/clear_usage_data/{table}", + summary="Clear usage data from a specified table", +) +async def clear_usage_data( + table: UsageTable, + start: dt | None = Query(None), + end: dt | None = Query(None), + db: AsyncSession = Depends(get_db), + _: AdminDetails = Depends(check_sudo_admin), +): + """ + Deletes **all rows** from the selected usage data table. Use with caution. + + Allowed tables: + - `node_user_usages`: Deletes user-specific node usage traffic records. + - `node_usages`: Deletes node-level aggregated traffic (uplink/downlink) records. + + **Optional filters:** + - `start`: ISO 8601 timestamp to filter from (inclusive) + - `end`: ISO 8601 timestamp to filter to (exclusive) + + ⚠️ This operation is irreversible. Ensure correct usage in production environments. + """ + return await node_operator.clear_usage_data(db, table, start, end) diff --git a/app/routers/settings.py b/app/routers/settings.py new file mode 100644 index 000000000..57991bcf3 --- /dev/null +++ b/app/routers/settings.py @@ -0,0 +1,27 @@ +from fastapi import APIRouter, Depends + +from app.db import AsyncSession, get_db +from app.models.settings import General, SettingsSchema +from app.operation import OperatorType +from app.operation.settings import SettingsOperation +from app.utils import responses + +from .authentication import check_sudo_admin, get_current + +settings_operator = SettingsOperation(operator_type=OperatorType.API) +router = APIRouter(tags=["Settings"], prefix="/api/settings", responses={401: responses._401, 403: responses._403}) + + +@router.get("", response_model=SettingsSchema) +async def get_settings(db: AsyncSession = Depends(get_db), _=Depends(check_sudo_admin)): + return await settings_operator.get_settings(db) + + +@router.get("/general", response_model=General) +async def get_general_settings(db: AsyncSession = Depends(get_db), _=Depends(get_current)): + return await settings_operator.get_general_settings(db) + + +@router.put("", response_model=SettingsSchema) +async def modify_settings(modify: SettingsSchema, db: AsyncSession = Depends(get_db), _=Depends(check_sudo_admin)): + return await settings_operator.modify_settings(db, modify) diff --git a/app/routers/subscription.py b/app/routers/subscription.py new file mode 100644 index 000000000..3afc03b85 --- /dev/null +++ b/app/routers/subscription.py @@ -0,0 +1,63 @@ +from datetime import datetime as dt + +from fastapi import APIRouter, Depends, Header, Query, Request + +from app.db import AsyncSession, get_db +from app.models.settings import ConfigFormat +from app.models.stats import Period, UserUsageStatsList +from app.models.user import SubscriptionUserResponse +from app.operation import OperatorType +from app.operation.subscription import SubscriptionOperation +from config import SUBSCRIPTION_PATH + +router = APIRouter(tags=["Subscription"], prefix=f"/{SUBSCRIPTION_PATH}") +subscription_operator = SubscriptionOperation(operator_type=OperatorType.API) + + +@router.get("/{token}/") +@router.get("/{token}", include_in_schema=False) +async def user_subscription( + request: Request, + token: str, + db: AsyncSession = Depends(get_db), + user_agent: str = Header(default=""), +): + """Provides a subscription link based on the user agent (Clash, V2Ray, etc.).""" + return await subscription_operator.user_subscription( + db, + token=token, + accept_header=request.headers.get("Accept", ""), + user_agent=user_agent, + request_url=str(request.url), + ) + + +@router.get("/{token}/info", response_model=SubscriptionUserResponse) +async def user_subscription_info(token: str, db: AsyncSession = Depends(get_db)): + """Retrieves detailed information about the user's subscription.""" + return await subscription_operator.user_subscription_info(db, token=token) + + +@router.get("/{token}/usage", response_model=UserUsageStatsList) +async def get_sub_user_usage( + token: str, + start: dt | None = Query(None, example="2024-01-01T00:00:00+03:30"), + end: dt | None = Query(None, example="2024-01-31T23:59:59+03:30"), + period: Period = Period.hour, + db: AsyncSession = Depends(get_db), +): + """Fetches the usage statistics for the user within a specified date range.""" + return await subscription_operator.get_user_usage(db, token=token, start=start, end=end, period=period) + + +@router.get("/{token}/{client_type}") +async def user_subscription_with_client_type( + request: Request, + token: str, + client_type: ConfigFormat, + db: AsyncSession = Depends(get_db), +): + """Provides a subscription link based on the specified client type (e.g., Clash, V2Ray).""" + return await subscription_operator.user_subscription_with_client_type( + db, token=token, client_type=client_type, request_url=str(request.url) + ) diff --git a/app/routers/system.py b/app/routers/system.py new file mode 100644 index 000000000..edf6b3853 --- /dev/null +++ b/app/routers/system.py @@ -0,0 +1,61 @@ +import asyncio + +from aiogram.types import Update +from fastapi import APIRouter, Depends, Header, HTTPException, Request +from fastapi.responses import JSONResponse + +from app.db import AsyncSession, get_db +from app.models.admin import AdminDetails +from app.models.settings import Telegram +from app.models.system import SystemStats +from app.operation import OperatorType +from app.operation.system import SystemOperation +from app.settings import telegram_settings +from app.telegram import get_bot, get_dispatcher +from app.utils import responses +from app.utils.logger import EndpointFilter, get_logger +from config import DO_NOT_LOG_TELEGRAM_BOT + +from .authentication import get_current + +system_operator = SystemOperation(operator_type=OperatorType.API) +router = APIRouter(tags=["System"], prefix="/api", responses={401: responses._401}) + +TELEGRAM_WEBHOOK_PATH = "/tghook" +if DO_NOT_LOG_TELEGRAM_BOT: + uvicorn_access_logger = get_logger("uvicorn.access") + uvicorn_access_logger.addFilter(EndpointFilter([f"{router.prefix}{TELEGRAM_WEBHOOK_PATH}"])) + + +@router.get("/system", response_model=SystemStats) +async def get_system_stats( + admin_username: str | None = None, db: AsyncSession = Depends(get_db), admin: AdminDetails = Depends(get_current) +): + """Fetch system stats including memory, CPU, and user metrics.""" + return await system_operator.get_system_stats(db, admin=admin, admin_username=admin_username) + + +@router.get("/inbounds", response_model=list[str]) +async def get_inbounds(_: AdminDetails = Depends(get_current)): + """Retrieve inbound configurations grouped by protocol.""" + return await system_operator.get_inbounds() + + +@router.post(TELEGRAM_WEBHOOK_PATH, include_in_schema=False) +async def webhook_handler(request: Request, X_Telegram_Bot_Api_Secret_Token: str = Header()): + """Telegram webhook handler""" + settings: Telegram = await telegram_settings() + + if not settings.enable: + raise HTTPException(status_code=404, detail="not found") + + if X_Telegram_Bot_Api_Secret_Token != settings.webhook_secret: + raise HTTPException(status_code=403, detail="Forbidden: Invalid secret key") + + bot = get_bot() + dp = get_dispatcher() + + update_data = await request.json() + update = Update.model_validate(update_data, context={"bot": bot}) + asyncio.create_task(dp.feed_update(bot, update)) + return JSONResponse(status_code=200, content={"status": "ok"}) diff --git a/app/routers/user.py b/app/routers/user.py new file mode 100644 index 000000000..3d0f0ba8d --- /dev/null +++ b/app/routers/user.py @@ -0,0 +1,358 @@ +from datetime import datetime as dt + +from fastapi import APIRouter, Depends, Query, status + +from app.db import AsyncSession, get_db +from app.db.models import UserStatus +from app.models.admin import AdminDetails +from app.models.stats import Period, UserUsageStatsList +from app.models.user import ( + BulkUser, + BulkUsersProxy, + CreateUserFromTemplate, + ModifyUserByTemplate, + RemoveUsersResponse, + UserCreate, + UserModify, + UserResponse, + UsersResponse, + UserSubscriptionUpdateList, +) +from app.operation import OperatorType +from app.operation.node import NodeOperation +from app.operation.user import UserOperation +from app.utils import responses + +from .authentication import check_sudo_admin, get_current + +user_operator = UserOperation(operator_type=OperatorType.API) +node_operator = NodeOperation(operator_type=OperatorType.API) +router = APIRouter(tags=["User"], prefix="/api/user", responses={401: responses._401}) + + +@router.post( + "", + response_model=UserResponse, + responses={400: responses._400, 409: responses._409}, + status_code=status.HTTP_201_CREATED, +) +async def create_user( + new_user: UserCreate, db: AsyncSession = Depends(get_db), admin: AdminDetails = Depends(get_current) +): + """ + Create a new user + + - **username**: 3 to 32 characters, can include a-z, 0-9, and underscores. + - **status**: User's status, defaults to `active`. Special rules if `on_hold`. + - **expire**: UTC datetime for account expiration. Use `0` for unlimited. + - **data_limit**: Max data usage in bytes (e.g., `1073741824` for 1GB). `0` means unlimited. + - **data_limit_reset_strategy**: Defines how/if data limit resets. `no_reset` means it never resets. + - **proxy_settings**: Dictionary of protocol settings (e.g., `vmess`, `vless`) will generate data for all protocol by default. + - **group_ids**: List of group IDs to assign to the user. + - **note**: Optional text field for additional user information or notes. + - **on_hold_timeout**: UTC timestamp when `on_hold` status should start or end. + - **on_hold_expire_duration**: Duration (in seconds) for how long the user should stay in `on_hold` status. + - **next_plan**: Next user plan (resets after use). + """ + + return await user_operator.create_user(db, new_user=new_user, admin=admin) + + +@router.put( + "/{username}", + response_model=UserResponse, + responses={400: responses._400, 403: responses._403, 404: responses._404}, +) +async def modify_user( + username: str, + modified_user: UserModify, + db: AsyncSession = Depends(get_db), + admin: AdminDetails = Depends(get_current), +): + """ + Modify an existing user + + - **username**: Cannot be changed. Used to identify the user. + - **status**: User's new status. Can be 'active', 'disabled', 'on_hold', 'limited', or 'expired'. + - **expire**: UTC datetime for new account expiration. Set to `0` for unlimited, `null` for no change. + - **data_limit**: New max data usage in bytes (e.g., `1073741824` for 1GB). Set to `0` for unlimited, `null` for no change. + - **data_limit_reset_strategy**: New strategy for data limit reset. Options include 'daily', 'weekly', 'monthly', or 'no_reset'. + - **proxies**: Dictionary of new protocol settings (e.g., `vmess`, `vless`). Empty dictionary means no change. + - **group_ids**: List of new group IDs to assign to the user. Empty list means no change. + - **note**: New optional text for additional user information or notes. `null` means no change. + - **on_hold_timeout**: New UTC timestamp for when `on_hold` status should start or end. Only applicable if status is changed to 'on_hold'. + - **on_hold_expire_duration**: New duration (in seconds) for how long the user should stay in `on_hold` status. Only applicable if status is changed to 'on_hold'. + - **next_plan**: Next user plan (resets after use). + + Note: Fields set to `null` or omitted will not be modified. + """ + return await user_operator.modify_user(db, username=username, modified_user=modified_user, admin=admin) + + +@router.delete( + "/{username}", responses={403: responses._403, 404: responses._404}, status_code=status.HTTP_204_NO_CONTENT +) +async def remove_user(username: str, db: AsyncSession = Depends(get_db), admin: AdminDetails = Depends(get_current)): + """Remove a user""" + return await user_operator.remove_user(db, username=username, admin=admin) + + +@router.post("/{username}/reset", response_model=UserResponse, responses={403: responses._403, 404: responses._404}) +async def reset_user_data_usage( + username: str, db: AsyncSession = Depends(get_db), admin: AdminDetails = Depends(get_current) +): + """Reset user data usage""" + return await user_operator.reset_user_data_usage(db, username=username, admin=admin) + + +@router.post( + "/{username}/revoke_sub", response_model=UserResponse, responses={403: responses._403, 404: responses._404} +) +async def revoke_user_subscription( + username: str, db: AsyncSession = Depends(get_db), admin: AdminDetails = Depends(get_current) +): + """Revoke users subscription (Subscription link and proxies)""" + return await user_operator.revoke_user_sub(db, username=username, admin=admin) + + +@router.post("s/reset", responses={403: responses._403, 404: responses._404}) +async def reset_users_data_usage(db: AsyncSession = Depends(get_db), admin: AdminDetails = Depends(check_sudo_admin)): + """Reset all users data usage""" + await user_operator.reset_users_data_usage(db, admin) + await node_operator.restart_all_node(db, admin) + return {} + + +@router.put("/{username}/set_owner", response_model=UserResponse, responses={403: responses._403}) +async def set_owner( + username: str, + admin_username: str, + db: AsyncSession = Depends(get_db), + admin: AdminDetails = Depends(check_sudo_admin), +): + """Set a new owner (admin) for a user.""" + return await user_operator.set_owner(db, username=username, admin_username=admin_username, admin=admin) + + +@router.post( + "/{username}/active_next", response_model=UserResponse, responses={403: responses._403, 404: responses._404} +) +async def active_next_plan( + username: str, db: AsyncSession = Depends(get_db), admin: AdminDetails = Depends(get_current) +): + """Reset user by next plan""" + return await user_operator.active_next_plan(db, username=username, admin=admin) + + +@router.get("/{username}", response_model=UserResponse, responses={403: responses._403, 404: responses._404}) +async def get_user(username: str, db: AsyncSession = Depends(get_db), admin: AdminDetails = Depends(get_current)): + """Get user information""" + return await user_operator.get_user(db=db, username=username, admin=admin) + + +@router.get( + "/{username}/sub_update", + response_model=UserSubscriptionUpdateList, + responses={403: responses._403, 404: responses._404}, +) +async def get_user_sub_update_list( + username: str, + offset: int = 0, + limit: int = 10, + db: AsyncSession = Depends(get_db), + admin: AdminDetails = Depends(get_current), +): + """Get user subscription agent list""" + return await user_operator.get_user_sub_update_list(db, username=username, admin=admin, offset=offset, limit=limit) + + +@router.get( + "s", response_model=UsersResponse, responses={400: responses._400, 403: responses._403, 404: responses._404} +) +async def get_users( + offset: int = None, + limit: int = None, + username: list[str] = Query(None), + owner: list[str] | None = Query(None, alias="admin"), + group_ids: list[int] | None = Query(None, alias="group"), + search: str | None = None, + status: UserStatus | None = None, + sort: str | None = None, + proxy_id: str | None = None, + load_sub: bool = False, + db: AsyncSession = Depends(get_db), + admin: AdminDetails = Depends(get_current), +): + """Get all users""" + return await user_operator.get_users( + db=db, + admin=admin, + offset=offset, + limit=limit, + username=username, + search=search, + owner=owner, + status=status, + sort=sort, + load_sub=load_sub, + proxy_id=proxy_id, + group_ids=group_ids, + ) + + +@router.get( + "/{username}/usage", response_model=UserUsageStatsList, responses={403: responses._403, 404: responses._404} +) +async def get_user_usage( + username: str, + period: Period, + node_id: int | None = None, + group_by_node: bool = False, + start: dt | None = Query(None, example="2024-01-01T00:00:00+03:30"), + end: dt | None = Query(None, example="2024-01-31T23:59:59+03:30"), + db: AsyncSession = Depends(get_db), + admin: AdminDetails = Depends(get_current), +): + """Get users usage""" + return await user_operator.get_user_usage( + db, + username=username, + admin=admin, + start=start, + end=end, + period=period, + node_id=node_id, + group_by_node=group_by_node, + ) + + +@router.get("s/usage", response_model=UserUsageStatsList) +async def get_users_usage( + period: Period, + node_id: int | None = None, + group_by_node: bool = False, + start: dt | None = Query(None, example="2024-01-01T00:00:00+03:30"), + end: dt | None = Query(None, example="2024-01-31T23:59:59+03:30"), + db: AsyncSession = Depends(get_db), + owner: list[str] | None = Query(None, alias="admin"), + admin: AdminDetails = Depends(get_current), +): + """Get all users usage""" + return await user_operator.get_users_usage( + db, + admin=admin, + start=start, + end=end, + owner=owner, + period=period, + node_id=node_id, + group_by_node=group_by_node, + ) + + +@router.get("s/expired", response_model=list[str]) +async def get_expired_users( + db: AsyncSession = Depends(get_db), + _: AdminDetails = Depends(check_sudo_admin), + admin_username: str | None = None, + expired_after: dt | None = Query(None, example="2024-01-01T00:00:00+03:30"), + expired_before: dt | None = Query(None, example="2024-01-31T23:59:59+03:30"), +): + """ + Get users who have expired within the specified date range. + + - **expired_after** UTC datetime (optional) + - **expired_before** UTC datetime (optional) + - At least one of expired_after or expired_before must be provided for filtering + - If both are omitted, returns all expired users + """ + + return await user_operator.get_expired_users(db, expired_after, expired_before, admin_username) + + +@router.delete("s/expired", response_model=RemoveUsersResponse) +async def delete_expired_users( + db: AsyncSession = Depends(get_db), + admin: AdminDetails = Depends(check_sudo_admin), + admin_username: str | None = None, + expired_after: dt | None = Query(None, example="2024-01-01T00:00:00+03:30"), + expired_before: dt | None = Query(None, example="2024-01-31T23:59:59+03:30"), +): + """ + Delete users who have expired within the specified date range. + + - **expired_after** UTC datetime (optional) + - **expired_before** UTC datetime (optional) + - At least one of expired_after or expired_before must be provided + """ + return await user_operator.delete_expired_users( + db, admin, expired_after, expired_before, admin_username=admin_username + ) + + +@router.post("/from_template", status_code=status.HTTP_201_CREATED, response_model=UserResponse) +async def create_user_from_template( + new_template_user: CreateUserFromTemplate, + db: AsyncSession = Depends(get_db), + admin: AdminDetails = Depends(get_current), +): + return await user_operator.create_user_from_template(db, new_template_user, admin) + + +@router.put("/from_template/{username}", response_model=UserResponse) +async def modify_user_with_template( + username: str, + modify_template_user: ModifyUserByTemplate, + db: AsyncSession = Depends(get_db), + admin: AdminDetails = Depends(get_current), +): + return await user_operator.modify_user_with_template(db, username, modify_template_user, admin) + + +@router.post("s/bulk/expire", summary="Bulk sum/sub to expire of users", response_description="Success confirmation") +async def bulk_modify_users_expire( + bulk_model: BulkUser, + db: AsyncSession = Depends(get_db), + _: AdminDetails = Depends(check_sudo_admin), +): + """ + Bulk expire users based on the provided criteria. + + - **amount**: amount to adjust the user's quota (in seconds, positive to increase, negative to decrease) required + - **user_ids**: Optional list of user IDs to modify + - **admins**: Optional list of admin IDs — their users will be targeted + - **status**: Optional status to filter users (e.g., "expired", "active"), Empty means no filtering + - **group_ids**: Optional list of group IDs to filter users by their group membership + """ + return await user_operator.bulk_modify_expire(db, bulk_model) + + +@router.post( + "s/bulk/data_limit", summary="Bulk sum/sub to data limit of users", response_description="Success confirmation" +) +async def bulk_modify_users_datalimit( + bulk_model: BulkUser, + db: AsyncSession = Depends(get_db), + _: AdminDetails = Depends(check_sudo_admin), +): + """ + Bulk modify users' data limit based on the provided criteria. + + - **amount**: amount to adjust the user's quota (positive to increase, negative to decrease) required + - **user_ids**: Optional list of user IDs to modify + - **admins**: Optional list of admin IDs — their users will be targeted + - **status**: Optional status to filter users (e.g., "expired", "active"), Empty means no filtering + - **group_ids**: Optional list of group IDs to filter users by their group membership + """ + return await user_operator.bulk_modify_datalimit(db, bulk_model) + + +@router.post( + "s/bulk/proxy_settings", summary="Bulk modify users proxy settings", response_description="Success confirmation" +) +async def bulk_modify_users_proxy_settings( + bulk_model: BulkUsersProxy, + db: AsyncSession = Depends(get_db), + _: AdminDetails = Depends(check_sudo_admin), +): + return await user_operator.bulk_modify_proxy_settings(db, bulk_model) diff --git a/app/routers/user_template.py b/app/routers/user_template.py new file mode 100644 index 000000000..e7293afc3 --- /dev/null +++ b/app/routers/user_template.py @@ -0,0 +1,75 @@ +from fastapi import Depends, APIRouter, status + +from app.db import AsyncSession, get_db +from app.models.admin import AdminDetails +from .authentication import check_sudo_admin, get_current +from app.models.user_template import UserTemplateCreate, UserTemplateModify, UserTemplateResponse +from app.operation import OperatorType +from app.operation.user_template import UserTemplateOperation +from app.utils import responses + + +router = APIRouter(tags=["User Template"], prefix="/api/user_template") +template_operator = UserTemplateOperation(OperatorType.API) + + +@router.post( + "", response_model=UserTemplateResponse, status_code=status.HTTP_201_CREATED, responses={403: responses._403} +) +async def create_user_template( + new_user_template: UserTemplateCreate, + db: AsyncSession = Depends(get_db), + admin: AdminDetails = Depends(check_sudo_admin), +): + """ + Create a new user template + + - **name** can be up to 64 characters + - **data_limit** must be in bytes and larger or equal to 0 + - **expire_duration** must be in seconds and larger or equat to 0 + - **group_ids** list of group ids + """ + return await template_operator.create_user_template(db, new_user_template, admin) + + +@router.get("/{template_id}", response_model=UserTemplateResponse) +async def get_user_template( + template_id: int, db: AsyncSession = Depends(get_db), _: AdminDetails = Depends(get_current) +): + """Get User Template information with id""" + return await template_operator.get_validated_user_template(db, template_id) + + +@router.put("/{template_id}", response_model=UserTemplateResponse, responses={403: responses._403}) +async def modify_user_template( + template_id: int, + modify_user_template: UserTemplateModify, + db: AsyncSession = Depends(get_db), + admin: AdminDetails = Depends(check_sudo_admin), +): + """ + Modify User Template + + - **name** can be up to 64 characters + - **data_limit** must be in bytes and larger or equal to 0 + - **expire_duration** must be in seconds and larger or equat to 0 + - **group_ids** list of group ids + """ + return await template_operator.modify_user_template(db, template_id, modify_user_template, admin) + + +@router.delete("/{template_id}", status_code=status.HTTP_204_NO_CONTENT, responses={403: responses._403}) +async def remove_user_template( + template_id: int, db: AsyncSession = Depends(get_db), admin: AdminDetails = Depends(check_sudo_admin) +): + """Remove a User Template by its ID""" + await template_operator.remove_user_template(db, template_id, admin) + return {} + + +@router.get("s", response_model=list[UserTemplateResponse]) +async def get_user_templates( + offset: int = None, limit: int = None, db: AsyncSession = Depends(get_db), _: AdminDetails = Depends(get_current) +): + """Get a list of User Templates with optional pagination""" + return await template_operator.get_user_templates(db, offset, limit) diff --git a/app/settings/__init__.py b/app/settings/__init__.py new file mode 100644 index 000000000..735bce553 --- /dev/null +++ b/app/settings/__init__.py @@ -0,0 +1,68 @@ +from aiocache import cached + +from app.db import GetDB +from app.db.crud.settings import get_settings +from app.models import settings + + +@cached() +async def telegram_settings() -> settings.Telegram: + async with GetDB() as db: + db_settings = await get_settings(db) + + validated_settings = settings.Telegram.model_validate(db_settings.telegram) + return validated_settings + + +@cached() +async def discord_settings() -> settings.Discord: + async with GetDB() as db: + db_settings = await get_settings(db) + + validated_settings = settings.Discord.model_validate(db_settings.discord) + return validated_settings + + +@cached() +async def webhook_settings() -> settings.Webhook: + async with GetDB() as db: + db_settings = await get_settings(db) + + validated_settings = settings.Webhook.model_validate(db_settings.webhook) + return validated_settings + + +@cached() +async def notification_settings() -> settings.NotificationSettings: + async with GetDB() as db: + db_settings = await get_settings(db) + + validated_settings = settings.NotificationSettings.model_validate(db_settings.notification_settings) + return validated_settings + + +@cached() +async def notification_enable() -> settings.NotificationEnable: + async with GetDB() as db: + db_settings = await get_settings(db) + + validated_settings = settings.NotificationEnable.model_validate(db_settings.notification_enable) + return validated_settings + + +@cached() +async def subscription_settings() -> settings.Subscription: + async with GetDB() as db: + db_settings = await get_settings(db) + + validated_settings = settings.Subscription.model_validate(db_settings.subscription) + return validated_settings + + +async def refresh_caches(): + await telegram_settings.cache.clear() + await discord_settings.cache.clear() + await webhook_settings.cache.clear() + await notification_settings.cache.clear() + await notification_enable.cache.clear() + await subscription_settings.cache.clear() diff --git a/app/subscription/__init__.py b/app/subscription/__init__.py new file mode 100644 index 000000000..18b5115b0 --- /dev/null +++ b/app/subscription/__init__.py @@ -0,0 +1,16 @@ +from .base import BaseSubscription +from .links import StandardLinks +from .xray import XrayConfiguration +from .singbox import SingBoxConfiguration +from .outline import OutlineConfiguration +from .clash import ClashConfiguration, ClashMetaConfiguration + +__all__ = [ + "BaseSubscription", + "XrayConfiguration", + "StandardLinks", + "SingBoxConfiguration", + "OutlineConfiguration", + "ClashConfiguration", + "ClashMetaConfiguration", +] diff --git a/app/subscription/base.py b/app/subscription/base.py new file mode 100644 index 000000000..d43ac122c --- /dev/null +++ b/app/subscription/base.py @@ -0,0 +1,47 @@ +import json + +from app.templates import render_template +from config import GRPC_USER_AGENT_TEMPLATE, USER_AGENT_TEMPLATE + + +class BaseSubscription: + def __init__(self): + self.proxy_remarks = [] + user_agent_data = json.loads(render_template(USER_AGENT_TEMPLATE)) + if "list" in user_agent_data and isinstance(user_agent_data["list"], list): + self.user_agent_list = user_agent_data["list"] + else: + self.user_agent_list = [] + + grpc_user_agent_data = json.loads(render_template(GRPC_USER_AGENT_TEMPLATE)) + + if "list" in grpc_user_agent_data and isinstance(grpc_user_agent_data["list"], list): + self.grpc_user_agent_data = grpc_user_agent_data["list"] + else: + self.grpc_user_agent_data = [] + + del user_agent_data, grpc_user_agent_data + + def _remark_validation(self, remark): + if remark not in self.proxy_remarks: + return remark + c = 2 + while True: + new = f"{remark} ({c})" + if new not in self.proxy_remarks: + return new + c += 1 + + def _remove_none_values(self, data: dict) -> dict: + def clean_dict(d: dict) -> dict: + new_dict = {} + for k, v in d.items(): + if v not in (None, "", 0): + if isinstance(v, dict): + if cleaned_dict := clean_dict(v): + new_dict[k] = cleaned_dict + else: + new_dict[k] = v + return new_dict + + return clean_dict(data) diff --git a/app/subscription/clash.py b/app/subscription/clash.py new file mode 100644 index 000000000..f28437ded --- /dev/null +++ b/app/subscription/clash.py @@ -0,0 +1,392 @@ +from random import choice +from uuid import UUID + +import yaml + +from app.subscription.funcs import detect_shadowsocks_2022, get_grpc_gun +from app.templates import render_template +from app.utils.helpers import yml_uuid_representer +from config import ( + CLASH_SUBSCRIPTION_TEMPLATE, +) + +from . import BaseSubscription + + +class ClashConfiguration(BaseSubscription): + def __init__(self): + super().__init__() + self.data = { + "proxies": [], + "proxy-groups": [], + # Some clients rely on "rules" option and will fail without it. + "rules": [], + } + + def render(self, reverse=False): + if reverse: + self.data["proxies"].reverse() + + yaml.add_representer(UUID, yml_uuid_representer) + return yaml.dump( + yaml.load( + render_template(CLASH_SUBSCRIPTION_TEMPLATE, {"conf": self.data, "proxy_remarks": self.proxy_remarks}), + Loader=yaml.SafeLoader, + ), + sort_keys=False, + allow_unicode=True, + ) + + def __str__(self) -> str: + return self.render() + + def __repr__(self) -> str: + return self.render() + + def http_config( + self, + path="", + host="", + random_user_agent: bool = False, + request: dict | None = None, + ): + config = { + "path": [path] if path else None, + "Host": host, + "headers": {}, + } + if request: + config.update(request) + + if random_user_agent: + config["headers"]["User-Agent"] = choice(self.user_agent_list) + + return self._remove_none_values(config) + + def ws_config( + self, + path="", + host="", + max_early_data=None, + early_data_header_name="", + is_httpupgrade: bool = False, + random_user_agent: bool = False, + http_headers: dict | None = None, + ): + config = { + "path": path, + "headers": {**http_headers, "Host": host} if http_headers else {"Host": host}, + "v2ray-http-upgrade": is_httpupgrade, + "v2ray-http-upgrade-fast-open": is_httpupgrade, + "max-early-data": max_early_data if max_early_data and not is_httpupgrade else None, + "early-data-header-name": early_data_header_name if max_early_data and not is_httpupgrade else None, + } + if random_user_agent: + config["headers"]["User-Agent"] = choice(self.user_agent_list) + + return self._remove_none_values(config) + + def grpc_config(self, path=""): + config = {"grpc-service-name": path} + return self._remove_none_values(config) + + def h2_config(self, path="", host=""): + config = { + "path": path, + "host": [host] if host else None, + } + return self._remove_none_values(config) + + def tcp_config( + self, + path="", + host="", + http_headers: dict | None = None, + ): + config = { + "path": [path] if path else None, + "headers": {**http_headers, "Host": host} if http_headers else {"Host": host}, + } + return self._remove_none_values(config) + + def make_node( + self, + remark: str, + type: str, + server: str, + port: int, + network: str, + tls: bool, + sni: str, + host: str, + path: str, + headers: str = "", + udp: bool = True, + alpn: list | None = None, + ais: bool = "", + random_user_agent: bool = False, + http_headers: dict | None = None, + mux_settings: dict | None = None, + request: dict | None = None, + ): + if network in ["grpc", "gun"]: + path = get_grpc_gun(path) + + if type == "shadowsocks": + type = "ss" + if network in ("http", "h2", "h3"): + network = "h2" + if network in ("tcp", "raw") and headers == "http": + network = "http" + if network == "httpupgrade": + network = "ws" + is_httpupgrade = True + else: + is_httpupgrade = False + node = {"name": remark, "type": type, "server": server, "port": port, "network": network, "udp": udp} + + if "?ed=" in path: + path, max_early_data = path.split("?ed=") + (max_early_data,) = max_early_data.split("/") + max_early_data = int(max_early_data) + early_data_header_name = "Sec-WebSocket-Protocol" + else: + max_early_data = None + early_data_header_name = "" + + if type == "ss": # shadowsocks + return node + + if tls: + node["tls"] = True + if type == "trojan": + node["sni"] = sni + else: + node["servername"] = sni + if alpn: + node["alpn"] = alpn + if ais: + node["skip-cert-verify"] = ais + + if network == "http": + net_opts = self.http_config( + path=path, + host=host, + random_user_agent=random_user_agent, + request=request, + ) + + elif network == "ws": + net_opts = self.ws_config( + path=path, + host=host, + max_early_data=max_early_data, + early_data_header_name=early_data_header_name, + is_httpupgrade=is_httpupgrade, + random_user_agent=random_user_agent, + http_headers=http_headers, + ) + + elif network == "grpc" or network == "gun": + net_opts = self.grpc_config(path=path) + + elif network == "h2": + net_opts = self.h2_config(path=path, host=host) + + elif network in ("tcp", "raw"): + net_opts = self.tcp_config( + path=path, + host=host, + ) + + else: + net_opts = {} + + node[f"{network}-opts"] = net_opts + + if mux_settings and (clash_mux := mux_settings.get("clash")): + clash_mux = { + "enabled": clash_mux.get("enable"), + "protocol": clash_mux.get("protocol"), + "max-connections": clash_mux.get("max_connections"), + "min-streams": clash_mux.get("min_streams"), + "max-streams": clash_mux.get("max_streams"), + "statistic": clash_mux.get("statistic"), + "only-tcp": clash_mux.get("only_tcp"), + "padding": clash_mux.get("padding"), + "brutal-opts": { + "enabled": clash_mux.get("brutal", {}).get("enable"), + "up": clash_mux["brutal"]["up_mbps"], + "down": clash_mux["brutal"]["down_mbps"], + } + if clash_mux.get("brutal") + else None, + } + node["smux"] = self._remove_none_values(clash_mux) + + return node + + def add(self, remark: str, address: str, inbound: dict, settings: dict): + # not supported by clash + if inbound["network"] in ("kcp", "splithttp", "xhttp"): + return + + proxy_remark = self._remark_validation(remark) + + node = self.make_node( + remark=proxy_remark, + type=inbound["protocol"], + server=address, + port=inbound["port"], + network=inbound["network"], + tls=(inbound["tls"] == "tls"), + sni=inbound["sni"], + host=inbound["host"], + path=inbound["path"], + headers=inbound["header_type"], + udp=True, + alpn=inbound.get("alpn", None), + ais=inbound.get("ais", False), + random_user_agent=inbound.get("random_user_agent"), + http_headers=inbound.get("http_headers"), + request=inbound.get("request"), + mux_settings=inbound.get("mux_settings", {}), + ) + + if inbound["protocol"] == "vmess": + node["uuid"] = settings["id"] + node["alterId"] = 0 + node["cipher"] = "auto" + + elif inbound["protocol"] == "trojan": + node["password"] = settings["password"] + + elif inbound["protocol"] == "shadowsocks": + node["password"] = settings["password"] + node["cipher"] = settings["method"] + + else: + return + + self.data["proxies"].append(node) + self.proxy_remarks.append(proxy_remark) + + +class ClashMetaConfiguration(ClashConfiguration): + def make_node( + self, + remark: str, + type: str, + server: str, + port: int, + network: str, + tls: bool, + sni: str, + host: str, + path: str, + headers: str = "", + udp: bool = True, + alpn: list | None = None, + fp: str = "", + pbk: str = "", + sid: str = "", + ais: bool = "", + random_user_agent: bool = False, + http_headers: dict | None = None, + mux_settings: dict | None = None, + request: dict | None = None, + ): + node = super().make_node( + remark=remark, + type=type, + server=server, + port=port, + network=network, + tls=tls, + sni=sni, + host=host, + path=path, + headers=headers, + udp=udp, + alpn=alpn, + ais=ais, + random_user_agent=random_user_agent, + http_headers=http_headers, + request=request, + mux_settings=mux_settings, + ) + if fp: + node["client-fingerprint"] = fp + if pbk: + node["reality-opts"] = {"public-key": pbk, "short-id": sid} + + return node + + def add(self, remark: str, address: str, inbound: dict, settings: dict): + # not supported by clash-meta + if inbound["network"] in ("kcp", "splithttp", "xhttp") or ( + inbound["network"] == "quic" and inbound["header_type"] != "none" + ): + return + + proxy_remark = self._remark_validation(remark) + + node = self.make_node( + remark=proxy_remark, + type=inbound["protocol"], + server=address, + port=inbound["port"], + network=inbound["network"], + tls=(inbound["tls"] in ("tls", "reality")), + sni=inbound["sni"], + host=inbound["host"], + path=inbound["path"], + headers=inbound["header_type"], + udp=True, + alpn=inbound.get("alpn", None), + fp=inbound.get("fp", ""), + pbk=inbound.get("pbk", ""), + sid=inbound.get("sid", ""), + ais=inbound.get("ais", False), + random_user_agent=inbound.get("random_user_agent"), + http_headers=inbound.get("http_headers"), + request=inbound.get("request"), + mux_settings=inbound.get("mux_settings", {}), + ) + + if inbound["protocol"] == "vmess": + node["uuid"] = settings["id"] + node["alterId"] = 0 + node["cipher"] = "auto" + + elif inbound["protocol"] == "vless": + node["uuid"] = settings["id"] + + node["encryption"] = ( + "" if (vless_encryption := inbound.get("encryption", "") == "none") else vless_encryption + ) + + if ( + inbound["network"] in ("tcp", "raw", "kcp") + and inbound["header_type"] != "http" + and inbound["tls"] != "none" + ): + node["flow"] = settings.get("flow", "") + + elif inbound["protocol"] == "trojan": + node["password"] = settings["password"] + + elif inbound["protocol"] == "shadowsocks": + node["method"], node["cipher"] = detect_shadowsocks_2022( + inbound.get("is_2022", False), + inbound.get("method", ""), + settings["method"], + inbound.get("password"), + settings["password"], + ) + + else: + return + + self.data["proxies"].append(node) + self.proxy_remarks.append(proxy_remark) diff --git a/app/subscription/funcs.py b/app/subscription/funcs.py new file mode 100644 index 000000000..aca664956 --- /dev/null +++ b/app/subscription/funcs.py @@ -0,0 +1,76 @@ +import base64 +import hashlib + + +def get_grpc_gun(path: str) -> str: + if not path.startswith("/"): + return path + + servicename = path.rsplit("/", 1)[0] + streamname = path.rsplit("/", 1)[1].split("|")[0] + + if streamname == "Tun": + return servicename[1:] + + return "%s%s%s" % (servicename, "/", streamname) + + +def get_grpc_multi(path: str) -> str: + if not path.startswith("/"): + return path + + servicename = path.rsplit("/", 1)[0] + streamname = path.rsplit("/", 1)[1].split("|")[1] + + return "%s%s%s" % (servicename, "/", streamname) + + +def ensure_base64_password(password: str, method: str) -> str: + """ + Ensure password is base64 encoded with correct length for the method: + - aes-128-gcm: 16 bytes key (22 chars in base64) + - aes-256-gcm and chacha20-poly1305: 32 bytes key (44 chars in base64) + """ + try: + # Check if it's already a valid base64 string + decoded_bytes = base64.b64decode(password) + # Check if length is appropriate + if ("aes-128-gcm" in method and len(decoded_bytes) == 16) or ( + ("aes-256-gcm" in method or "chacha20-poly1305" in method) and len(decoded_bytes) == 32 + ): + # Already correct length + return password + except Exception: + # Not a valid base64 string + pass + + # Hash the password to get a consistent byte array + hash_bytes = hashlib.sha256(password.encode("utf-8")).digest() + + if "aes-128-gcm" in method: + key_bytes = hash_bytes[:16] # First 16 bytes for AES-128 + else: + key_bytes = hash_bytes[:32] # First 32 bytes for AES-256 or ChaCha20 + + return base64.b64encode(key_bytes).decode("ascii") + + +def password_to_2022(inbound_password: str, user_password: str, method: str) -> str: + """ + Convert a password to the format required for 2022-blake3 methods, + ensuring correct key length. + """ + base64_string = ensure_base64_password(user_password, method) + return f"{inbound_password}:{base64_string}" + + +def detect_shadowsocks_2022( + is_2022: bool, inbound_method: str, user_method: str, inbound_password: str, user_password: str +) -> tuple[str, str]: + if is_2022: + password = password_to_2022(inbound_password, user_password, inbound_method) + method = inbound_method + else: + password = user_password + method = user_method + return method, password diff --git a/app/subscription/links.py b/app/subscription/links.py new file mode 100644 index 000000000..35e0d7eef --- /dev/null +++ b/app/subscription/links.py @@ -0,0 +1,460 @@ +import base64 +import json +import urllib.parse as urlparse +from enum import Enum +from random import choice +from typing import Union +from urllib.parse import quote +from uuid import UUID + +from app.subscription.funcs import detect_shadowsocks_2022, get_grpc_gun, get_grpc_multi +from config import EXTERNAL_CONFIG + +from . import BaseSubscription + + +class StandardLinks(BaseSubscription): + def __init__(self): + super().__init__() + self.links = [] + + def add_link(self, link): + self.links.append(link) + + def render(self, reverse=False): + if EXTERNAL_CONFIG: + self.links.append(EXTERNAL_CONFIG) + if reverse: + self.links.reverse() + return "\n".join((self.links)) + + def add(self, remark: str, address: str, inbound: dict, settings: dict): + net = inbound["network"] + multi_mode = inbound.get("multi_mode", False) + old_path: str = inbound["path"] + + if net in ("grpc", "gun"): + if multi_mode: + path = get_grpc_multi(old_path) + else: + path = get_grpc_gun(old_path) + if old_path.startswith("/"): + path = quote(path, safe="-_.!~*'()") + + else: + path = old_path + func_args = dict( + remark=remark, + address=address, + port=inbound["port"], + net=net, + tls=inbound["tls"], + sni=inbound.get("sni", ""), + fp=inbound.get("fp", ""), + alpn=inbound.get("alpn", None), + pbk=inbound.get("pbk", ""), + sid=inbound.get("sid", ""), + spx=inbound.get("spx", ""), + host=inbound["host"], + path=path, + type=inbound["header_type"], + ais=inbound.get("ais", ""), + fs=inbound.get("fragment_settings", ""), + multiMode=multi_mode, + sc_max_each_post_bytes=inbound.get("sc_max_each_post_bytes"), + sc_max_concurrent_posts=inbound.get("sc_max_concurrent_posts"), + sc_min_posts_interval_ms=inbound.get("sc_min_posts_interval_ms"), + x_padding_bytes=inbound.get("x_padding_bytes"), + mode=inbound.get("mode", ""), + noGRPCHeader=inbound.get("no_grpc_header"), + heartbeatPeriod=inbound.get("heartbeat_period", 0), + scStreamUpServerSecs=inbound.get("sc_stream_up_server_secs"), + xmux=inbound.get("xmux"), + downloadSettings=inbound.get("downloadSettings"), + http_headers=inbound.get("http_headers"), + ech_config_list=inbound.get("ech_config_list"), + mldsa65_verify=inbound.get("mldsa65Verify"), + ) + if inbound["protocol"] == "vmess": + link = self.vmess( + id=settings["id"], + **func_args, + ) + + elif inbound["protocol"] == "vless": + link = self.vless( + id=settings["id"], + flow=settings.get("flow", ""), + encryption=inbound.get("encryption", "none"), + **func_args, + ) + + elif inbound["protocol"] == "trojan": + link = self.trojan( + password=settings["password"], + flow=settings.get("flow", ""), + **func_args, + ) + + elif inbound["protocol"] == "shadowsocks": + method, password = detect_shadowsocks_2022( + inbound.get("is_2022", False), + inbound.get("method", ""), + settings["method"], + inbound.get("password"), + settings["password"], + ) + + link = self.shadowsocks( + remark=remark, + address=address, + port=inbound["port"], + password=password, + method=method, + ) + else: + return + + self.add_link(link=link) + + def _make_net_settings( + self, + payload: dict, + protocol: str, + net: str, + multiMode: bool, + path: str, + host: str, + sc_max_each_post_bytes: int | None = None, + sc_max_concurrent_posts: int | None = None, + sc_min_posts_interval_ms: int | None = None, + x_padding_bytes: str | None = None, + mode: str = "", + noGRPCHeader: bool | None = None, + heartbeatPeriod: int | None = None, + scStreamUpServerSecs: int | None = None, + xmux: dict | None = None, + downloadSettings: dict | None = None, + random_user_agent: bool = False, + http_headers: dict | None = None, + ): + if net == "grpc": + if protocol == "vmess": + if multiMode: + payload["type"] = "multi" + else: + payload["type"] = "gun" + else: + payload["serviceName"] = path + payload["authority"] = host + if multiMode: + payload["mode"] = "multi" + else: + payload["mode"] = "gun" + elif net in ("splithttp", "xhttp"): + payload["path"] = path + payload["host"] = host + mode = mode.value if isinstance(mode, Enum) else mode + if protocol == "vmess": + payload["type"] = mode + else: + payload["mode"] = mode + extra = { + "scMaxEachPostBytes": sc_max_each_post_bytes, + "scMaxConcurrentPosts": sc_max_concurrent_posts, + "scMinPostsIntervalMs": sc_min_posts_interval_ms, + "xPaddingBytes": x_padding_bytes, + "noGRPCHeader": noGRPCHeader, + "scStreamUpServerSecs": scStreamUpServerSecs, + "xmux": xmux, + "headers": http_headers if http_headers is not None else {}, + "downloadSettings": downloadSettings, + } + if random_user_agent: + if mode in ("stream-one", "stream-up") and not noGRPCHeader: + extra["headers"]["User-Agent"] = choice(self.grpc_user_agent_data) + else: + extra["headers"]["User-Agent"] = choice(self.user_agent_list) + + extra = self._remove_none_values(extra) + + if extra: + payload["extra"] = (json.dumps(extra)).replace(" ", "") + elif net == "ws": + if heartbeatPeriod: + payload["heartbeatPeriod"] = heartbeatPeriod + payload["path"] = path + payload["host"] = host + + elif net == "quic": + if protocol != "vmess": + payload["key"] = path + payload["quicSecurity"] = host + elif net == "kcp": + if protocol != "vmess": + payload["seed"] = path + payload["host"] = host + else: + payload["path"] = path + payload["host"] = host + + def _make_tls_settings( + self, + payload: dict, + tls: str, + sni: str, + fp: str, + alpn: list | None, + pbk: str, + sid: str, + spx: str, + fs: str, + ais: bool, + ech_config_list: str, + mldsa65_verify: str, + ): + payload["sni"] = sni + payload["fp"] = fp + if alpn: + payload["alpn"] = ",".join(alpn) + if fs: + xray_fragment = fs["xray"] + payload["fragment"] = ( + f"{xray_fragment['length']},{xray_fragment['interval']},{xray_fragment['packets']}" + if xray_fragment + else "" + ) + + if ech_config_list: + payload["echConfigList"] = ech_config_list + + if tls == "reality": + payload["pbk"] = pbk + payload["sid"] = sid + if spx: + payload["spx"] = spx + if mldsa65_verify: + payload["pqv"] = mldsa65_verify + + if ais: + payload["allowInsecure"] = 1 + + def vmess( + self, + remark: str, + address: str, + port: int, + id: Union[str, UUID], + host="", + net="tcp", + path="", + type="", + tls="none", + sni="", + fp="", + alpn=None, + pbk="", + sid="", + spx="", + ais="", + fs="", + multiMode: bool = False, + sc_max_each_post_bytes: int | None = None, + sc_max_concurrent_posts: int | None = None, + sc_min_posts_interval_ms: int | None = None, + x_padding_bytes: str | None = None, + mode: str = "", + noGRPCHeader: bool | None = None, + heartbeatPeriod: int | None = None, + scStreamUpServerSecs: int | None = None, + xmux: dict | None = None, + downloadSettings: dict | None = None, + random_user_agent: bool = False, + http_headers: dict | None = None, + ech_config_list: str | None = None, + mldsa65_verify: str | None = None, + ): + payload = { + "add": address, + "aid": "0", + "host": host, + "id": str(id), + "net": net, + "path": path, + "port": port, + "ps": remark, + "scy": "auto", + "tls": tls, + "type": type, + "v": "2", + } + self._make_net_settings( + payload=payload, + protocol="vmess", + net=net, + multiMode=multiMode, + path=path, + host=host, + sc_max_each_post_bytes=sc_max_each_post_bytes, + sc_max_concurrent_posts=sc_max_concurrent_posts, + sc_min_posts_interval_ms=sc_min_posts_interval_ms, + x_padding_bytes=x_padding_bytes, + mode=mode, + noGRPCHeader=noGRPCHeader, + heartbeatPeriod=heartbeatPeriod, + scStreamUpServerSecs=scStreamUpServerSecs, + http_headers=http_headers, + xmux=xmux, + random_user_agent=random_user_agent, + downloadSettings=downloadSettings, + ) + if tls in ("tls", "reality"): + self._make_tls_settings( + payload, tls, sni, fp, alpn, pbk, sid, spx, fs, ais, ech_config_list, mldsa65_verify + ) + return "vmess://" + base64.b64encode(json.dumps(payload, sort_keys=True).encode("utf-8")).decode() + + def vless( + self, + remark: str, + address: str, + port: int, + id: Union[str, UUID], + encryption: str = "none", + net="ws", + path="", + host="", + type="", + flow="", + tls="none", + sni="", + fp="", + alpn=None, + pbk="", + sid="", + spx="", + ais="", + fs="", + multiMode: bool = False, + sc_max_each_post_bytes: int | None = None, + sc_max_concurrent_posts: int | None = None, + sc_min_posts_interval_ms: int | None = None, + x_padding_bytes: str | None = None, + mode: str = "", + noGRPCHeader: bool | None = None, + heartbeatPeriod: int | None = None, + scStreamUpServerSecs: int | None = None, + http_headers: dict | None = None, + xmux: dict | None = None, + random_user_agent: bool = False, + downloadSettings: dict | None = None, + ech_config_list: str | None = None, + mldsa65_verify: str | None = None, + ): + payload = {"encryption": encryption, "security": tls, "type": net, "headerType": type} + if flow and (tls in ("tls", "reality") and net in ("tcp", "raw", "kcp") and type != "http"): + payload["flow"] = flow + + self._make_net_settings( + payload=payload, + protocol="vless", + net=net, + multiMode=multiMode, + path=path, + host=host, + sc_max_each_post_bytes=sc_max_each_post_bytes, + sc_max_concurrent_posts=sc_max_concurrent_posts, + sc_min_posts_interval_ms=sc_min_posts_interval_ms, + x_padding_bytes=x_padding_bytes, + mode=mode, + noGRPCHeader=noGRPCHeader, + heartbeatPeriod=heartbeatPeriod, + scStreamUpServerSecs=scStreamUpServerSecs, + http_headers=http_headers, + xmux=xmux, + random_user_agent=random_user_agent, + downloadSettings=downloadSettings, + ) + if tls in ("tls", "reality"): + self._make_tls_settings( + payload, tls, sni, fp, alpn, pbk, sid, spx, fs, ais, ech_config_list, mldsa65_verify + ) + return "vless://" + f"{id}@{address}:{port}?" + urlparse.urlencode(payload) + f"#{(urlparse.quote(remark))}" + + def trojan( + self, + remark: str, + address: str, + port: int, + password: str, + net="tcp", + path="", + host="", + type="", + flow="", + tls="none", + sni="", + fp="", + alpn=None, + pbk="", + sid="", + spx="", + ais="", + fs="", + multiMode: bool = False, + sc_max_each_post_bytes: int | None = None, + sc_max_concurrent_posts: int | None = None, + sc_min_posts_interval_ms: int | None = None, + x_padding_bytes: str | None = None, + mode: str = "", + noGRPCHeader: bool | None = None, + heartbeatPeriod: int | None = None, + scStreamUpServerSecs: int | None = None, + http_headers: dict | None = None, + xmux: dict | None = None, + random_user_agent: bool = False, + downloadSettings: dict | None = None, + ech_config_list: str | None = None, + mldsa65_verify: str | None = None, + ): + payload = {"security": tls, "type": net, "headerType": type} + if flow and (tls in ("tls", "reality") and net in ("tcp", "raw", "kcp") and type != "http"): + payload["flow"] = flow + + self._make_net_settings( + payload=payload, + protocol="trojan", + net=net, + multiMode=multiMode, + path=path, + host=host, + sc_max_each_post_bytes=sc_max_each_post_bytes, + sc_max_concurrent_posts=sc_max_concurrent_posts, + sc_min_posts_interval_ms=sc_min_posts_interval_ms, + x_padding_bytes=x_padding_bytes, + mode=mode, + noGRPCHeader=noGRPCHeader, + heartbeatPeriod=heartbeatPeriod, + scStreamUpServerSecs=scStreamUpServerSecs, + http_headers=http_headers, + xmux=xmux, + random_user_agent=random_user_agent, + downloadSettings=downloadSettings, + ) + if tls in ("tls", "reality"): + self._make_tls_settings( + payload, tls, sni, fp, alpn, pbk, sid, spx, fs, ais, ech_config_list, mldsa65_verify + ) + return ( + "trojan://" + + f"{urlparse.quote(password, safe=':')}@{address}:{port}?" + + urlparse.urlencode(payload) + + f"#{urlparse.quote(remark)}" + ) + + def shadowsocks(self, remark: str, address: str, port: int, password: str, method: str): + return ( + "ss://" + + base64.b64encode(f"{method}:{password}".encode()).decode() + + f"@{address}:{port}#{urlparse.quote(remark)}" + ) diff --git a/app/subscription/outline.py b/app/subscription/outline.py new file mode 100644 index 000000000..3d3ced184 --- /dev/null +++ b/app/subscription/outline.py @@ -0,0 +1,48 @@ +import json +from .funcs import detect_shadowsocks_2022 + + +class OutlineConfiguration: + def __init__(self): + self.config = {} + + def add_directly(self, data: dict): + self.config.update(data) + + def render(self, reverse=False): + if reverse: + items = list(self.config.items()) + items.reverse() + self.config = dict(items) + return json.dumps(self.config, indent=0) + + def make_outbound(self, remark: str, address: str, port: int, password: str, method: str): + config = { + "method": method, + "password": password, + "server": address, + "server_port": port, + "tag": remark, + } + return config + + def add(self, remark: str, address: str, inbound: dict, settings: dict): + if inbound["protocol"] != "shadowsocks": + return + + method, password = detect_shadowsocks_2022( + inbound.get("is_2022", False), + inbound.get("method", ""), + settings["method"], + inbound.get("password"), + settings["password"], + ) + + outbound = self.make_outbound( + remark=remark, + address=address, + port=inbound["port"], + password=password, + method=method, + ) + self.add_directly(outbound) diff --git a/app/subscription/share.py b/app/subscription/share.py new file mode 100644 index 000000000..2d88cd56c --- /dev/null +++ b/app/subscription/share.py @@ -0,0 +1,292 @@ +import base64 +import random +import secrets +from collections import defaultdict +from datetime import datetime as dt, timedelta, timezone + +from jdatetime import date as jd + +from app.core.hosts import hosts as hosts_storage +from app.core.manager import core_manager +from app.db.models import UserStatus +from app.models.user import UsersResponseWithInbounds +from app.settings import subscription_settings +from app.utils.system import get_public_ip, get_public_ipv6, readable_size + +from . import ( + ClashConfiguration, + ClashMetaConfiguration, + OutlineConfiguration, + SingBoxConfiguration, + StandardLinks, + XrayConfiguration, +) + +SERVER_IP = get_public_ip() +SERVER_IPV6 = get_public_ipv6() + +STATUS_EMOJIS = { + "active": "✅", + "expired": "⌛️", + "limited": "🪫", + "disabled": "❌", + "on_hold": "🔌", +} + + +async def generate_subscription( + user: UsersResponseWithInbounds, config_format: str, as_base64: bool, reverse: bool = False +) -> str: + conf = None + if config_format == "links": + conf = StandardLinks() + elif config_format == "clash-meta": + conf = ClashMetaConfiguration() + elif config_format == "clash": + conf = ClashConfiguration() + elif config_format == "sing-box": + conf = SingBoxConfiguration() + elif config_format == "outline": + conf = OutlineConfiguration() + elif config_format == "xray": + conf = XrayConfiguration() + else: + raise ValueError(f'Unsupported format "{config_format}"') + + format_variables = setup_format_variables(user) + + config = await process_inbounds_and_tags(user, format_variables, conf, reverse) + + if as_base64: + config = base64.b64encode(config.encode()).decode() + + return config + + +def format_time_left(seconds_left: int) -> str: + if not seconds_left or seconds_left <= 0: + return "∞" + + minutes, seconds = divmod(seconds_left, 60) + hours, minutes = divmod(minutes, 60) + days, hours = divmod(hours, 24) + months, days = divmod(days, 30) + + result = [] + if months: + result.append(f"{months}m") + if days: + result.append(f"{days}d") + if hours and (days < 7): + result.append(f"{hours}h") + if minutes and not (months or days): + result.append(f"{minutes}m") + if seconds and not (months or days): + result.append(f"{seconds}s") + return " ".join(result) + + +def setup_format_variables(user: UsersResponseWithInbounds) -> dict: + user_status = user.status + expire = user.expire + on_hold_expire_duration = user.on_hold_expire_duration + now = dt.now(timezone.utc) + + admin_username = "" + if admin_data := user.admin: + admin_username = admin_data.username + + if user_status != UserStatus.on_hold: + if expire is not None: + seconds_left = (expire - now).total_seconds() + expire_date = expire.date() + jalali_expire_date = jd.fromgregorian( + year=expire_date.year, month=expire_date.month, day=expire_date.day + ).strftime("%Y-%m-%d") + if now < expire: + days_left = (expire - now).days + 1 + time_left = format_time_left(seconds_left) + else: + days_left = "0" + time_left = "0" + + else: + days_left = "∞" + time_left = "∞" + expire_date = "∞" + jalali_expire_date = "∞" + else: + if on_hold_expire_duration: + days_left = timedelta(seconds=on_hold_expire_duration).days + time_left = format_time_left(on_hold_expire_duration) + expire_date = "-" + jalali_expire_date = "-" + else: + days_left = "∞" + time_left = "∞" + expire_date = "∞" + jalali_expire_date = "∞" + + if user.data_limit: + data_limit = readable_size(user.data_limit) + data_left = user.data_limit - user.used_traffic + usage_Percentage = round((user.used_traffic / user.data_limit) * 100.0, 2) + + if data_left < 0: + data_left = 0 + data_left = readable_size(data_left) + else: + data_limit = "∞" + data_left = "∞" + usage_Percentage = "∞" + + status_emoji = STATUS_EMOJIS.get(user.status.value) + + format_variables = defaultdict( + lambda: "", + { + "SERVER_IP": SERVER_IP, + "SERVER_IPV6": SERVER_IPV6, + "USERNAME": user.username, + "DATA_USAGE": readable_size(user.used_traffic), + "DATA_LIMIT": data_limit, + "DATA_LEFT": data_left, + "DAYS_LEFT": days_left, + "EXPIRE_DATE": expire_date, + "JALALI_EXPIRE_DATE": jalali_expire_date, + "TIME_LEFT": time_left, + "STATUS_EMOJI": status_emoji, + "USAGE_PERCENTAGE": usage_Percentage, + "ADMIN_USERNAME": admin_username, + }, + ) + + return format_variables + + +async def filter_hosts(hosts: list, user_status: UserStatus) -> list: + if not (await subscription_settings()).host_status_filter: + return hosts + + return [host for host in hosts if not host["status"] or user_status in host["status"]] + + +async def process_host( + host: dict, format_variables: dict, inbounds: list[str], proxies: dict, conf +) -> tuple[dict, dict, str]: + tag = host["inbound_tag"] + + if tag not in inbounds: + return + + host_inbound: dict = await core_manager.get_inbound_by_tag(tag) + protocol = host_inbound["protocol"] + + settings = proxies.get(protocol) + if not settings: + return + + if "flow" in host_inbound: + if settings["flow"] == "": + settings["flow"] = "" if host_inbound["flow"] == "none" else host_inbound["flow"] + + format_variables.update({"PROTOCOL": protocol}) + format_variables.update({"TRANSPORT": host_inbound["network"]}) + sni = "" + sni_list = host["sni"] or host_inbound["sni"] + if sni_list: + salt = secrets.token_hex(8) + sni = random.choice(sni_list).replace("*", salt) + + req_host = "" + req_host_list = host["host"] or host_inbound["host"] + if req_host_list: + salt = secrets.token_hex(8) + req_host = random.choice(req_host_list).replace("*", salt) + + address = "" + address_list = host["address"] + if host["address"]: + salt = secrets.token_hex(8) + address = random.choice(address_list).replace("*", salt) + + if sids := host_inbound.get("sids"): + host_inbound["sid"] = random.choice(sids) + + if host["path"] is not None: + path = host["path"].format_map(format_variables) + else: + path = host_inbound.get("path", "").format_map(format_variables) + + if host.get("use_sni_as_host", False) and sni: + req_host = sni + + host_inbound.update( + { + "port": host["port"] or host_inbound["port"], + "sni": sni, + "host": req_host, + "tls": host_inbound["tls"] if host["tls"] is None else host["tls"], + "alpn": host["alpn"] if host["alpn"] else None, + "path": path, + "fp": host["fingerprint"] or host_inbound.get("fp", ""), + "ais": host["allowinsecure"] or host_inbound.get("allowinsecure", ""), + "fragment_settings": host["fragment_settings"], + "noise_settings": host["noise_settings"], + "random_user_agent": host["random_user_agent"], + "http_headers": host["http_headers"], + "mux_settings": host["mux_settings"], + "ech_config_list": host["ech_config_list"], + }, + ) + if ts := host["transport_settings"]: + for v in ts.values(): + if v: + if "type" in v: + v["header_type"] = v["type"] + host_inbound.update(v) + + if host.get("downloadSettings"): + ds_data = await process_host(host["downloadSettings"], format_variables, inbounds, proxies, conf) + if ds_data and ds_data[0]: + ds_data[0]["address"] = ds_data[2].format_map(format_variables) + if isinstance(conf, StandardLinks): + xc = XrayConfiguration() + host_inbound["downloadSettings"] = xc.download_config(ds_data[0], True) + else: + host_inbound["downloadSettings"] = ds_data[0] + + return host_inbound, settings, address + + +async def process_inbounds_and_tags( + user: UsersResponseWithInbounds, + format_variables: dict, + conf: StandardLinks + | XrayConfiguration + | SingBoxConfiguration + | ClashConfiguration + | ClashMetaConfiguration + | OutlineConfiguration, + reverse=False, +) -> list | str: + proxy_settings = user.proxy_settings.dict() + for host in await filter_hosts(hosts_storage.values(), user.status): + host_data = await process_host(host, format_variables, user.inbounds, proxy_settings, conf) + if not host_data: + continue + host_inbound, settings, address = host_data + + if host_inbound: + conf.add( + remark=host["remark"].format_map(format_variables), + address=address.format_map(format_variables), + inbound=host_inbound, + settings=settings, + ) + + return conf.render(reverse=reverse) + + +def encode_title(text: str) -> str: + return f"base64:{base64.b64encode(text.encode()).decode()}" diff --git a/app/subscription/singbox.py b/app/subscription/singbox.py new file mode 100644 index 000000000..8a02de15a --- /dev/null +++ b/app/subscription/singbox.py @@ -0,0 +1,345 @@ +import json +from random import choice + +from app.subscription.funcs import detect_shadowsocks_2022, get_grpc_gun +from app.templates import render_template +from app.utils.helpers import UUIDEncoder +from config import SINGBOX_SUBSCRIPTION_TEMPLATE + +from . import BaseSubscription + + +class SingBoxConfiguration(BaseSubscription): + def __init__(self): + super().__init__() + self.config = json.loads(render_template(SINGBOX_SUBSCRIPTION_TEMPLATE)) + + def add_outbound(self, outbound_data): + self.config["outbounds"].append(outbound_data) + + def render(self, reverse=False): + urltest_types = ["vmess", "vless", "trojan", "shadowsocks", "hysteria2", "tuic", "http", "ssh"] + urltest_tags = [outbound["tag"] for outbound in self.config["outbounds"] if outbound["type"] in urltest_types] + selector_types = ["vmess", "vless", "trojan", "shadowsocks", "hysteria2", "tuic", "http", "ssh", "urltest"] + selector_tags = [outbound["tag"] for outbound in self.config["outbounds"] if outbound["type"] in selector_types] + + for outbound in self.config["outbounds"]: + if outbound.get("type") == "urltest": + outbound["outbounds"] = urltest_tags + + for outbound in self.config["outbounds"]: + if outbound.get("type") == "selector": + outbound["outbounds"] = selector_tags + + if reverse: + self.config["outbounds"].reverse() + return json.dumps(self.config, indent=4, cls=UUIDEncoder) + + def tls_config( + self, sni=None, fp=None, tls=None, pbk=None, sid=None, alpn=None, ais=None, fragment=None, ech_config_list=None + ): + config = { + "enabled": tls in ("tls", "reality"), + "server_name": sni, + "insecure": ais, + "utls": {"enabled": bool(fp), "fingerprint": fp} if fp else None, + "alpn": alpn if alpn else None, + "ech": { + "enabled": True, + "config": [], + "config_path": "", + } + if ech_config_list + else None, + "reality": { + "enabled": tls == "reality", + "public_key": pbk, + "short_id": sid, + } + if tls == "reality" + else None, + } + if fragment and (singbox_fragment := fragment.get("sing_box")): + config.update(singbox_fragment) + + return self._remove_none_values(config) + + def http_config( + self, + host="", + path="", + random_user_agent: bool = False, + request: dict | None = None, + http_headers: dict | None = None, + headers="none", + ): + config = { + "idle_timeout": "15s", + "ping_timeout": "15s", + "path": path, + } + + if headers == "http" and request: + config.update(request) + else: + config["headers"] = {k: [v] for k, v in http_headers.items()} if http_headers else {} + config["host"] = [host] if host else None + if random_user_agent: + config["headers"]["User-Agent"] = choice(self.user_agent_list) + + return self._remove_none_values(config) + + def ws_config( + self, + host="", + path="", + random_user_agent: bool = False, + max_early_data=None, + early_data_header_name=None, + http_headers: dict | None = None, + ): + config = { + "headers": {k: [v] for k, v in http_headers.items()} if http_headers else {}, + "path": path, + "max_early_data": max_early_data, + "early_data_header_name": early_data_header_name, + } + config["headers"]["host"] = [host] if host else None + if random_user_agent: + config["headers"]["User-Agent"] = [choice(self.user_agent_list)] + + return self._remove_none_values(config) + + def grpc_config(self, path="", idle_timeout: str = "", ping_timeout: str = "", permit_without_stream: bool = False): + config = { + "service_name": path, + "idle_timeout": f"{idle_timeout}s" if idle_timeout else "15s", + "ping_timeout": f"{ping_timeout}s" if ping_timeout else "15s", + "permit_without_stream": permit_without_stream, + } + return self._remove_none_values(config) + + def httpupgrade_config(self, host="", path="", random_user_agent: bool = False, http_headers: dict | None = None): + config = { + "headers": {k: [v] for k, v in http_headers.items()} if http_headers else {}, + "host": host, + "path": path, + } + if random_user_agent: + config["headers"]["User-Agent"] = choice(self.user_agent_list) + return self._remove_none_values(config) + + def transport_config( + self, + transport_type="", + host="", + path="", + ping_timeout="", + idle_timeout="", + max_early_data=None, + early_data_header_name=None, + random_user_agent: bool = False, + http_headers: dict | None = None, + permit_without_stream: bool = False, + request: dict | None = None, + headers="none", + ): + transport_config = {} + + if transport_type: + if transport_type == "http": + transport_config = self.http_config( + host=host, + path=path, + random_user_agent=random_user_agent, + request=request, + http_headers=http_headers, + headers=headers, + ) + + elif transport_type == "ws": + transport_config = self.ws_config( + host=host, + path=path, + random_user_agent=random_user_agent, + max_early_data=max_early_data, + early_data_header_name=early_data_header_name, + http_headers=http_headers, + ) + + elif transport_type == "grpc": + transport_config = self.grpc_config( + path=path, + idle_timeout=idle_timeout, + ping_timeout=ping_timeout, + permit_without_stream=permit_without_stream, + ) + + elif transport_type == "httpupgrade": + transport_config = self.httpupgrade_config( + host=host, + path=path, + random_user_agent=random_user_agent, + http_headers=http_headers, + ) + + transport_config["type"] = transport_type + return transport_config + + def make_outbound( + self, + type: str, + remark: str, + address: str, + port: int, + net="", + path="", + host="", + flow="", + tls="", + sni="", + fp="", + alpn=None, + pbk="", + sid="", + headers="", + ais="", + ping_timeout="", + idle_timeout="", + http_headers: dict | None = None, + mux_settings: dict | None = None, + request: dict | None = None, + random_user_agent: bool = False, + permit_without_stream: bool = False, + fragment: dict | None = None, + ech_config_list: str | None = None, + ): + if isinstance(port, str): + ports = port.split(",") + port = int(choice(ports)) + + config = { + "type": type, + "tag": remark, + "server": address, + "server_port": port, + } + + if net in ("tcp", "raw", "kcp") and headers != "http" and (tls or tls != "none"): + if flow: + config["flow"] = flow + + if net == "h2": + net = "http" + alpn = ["h2"] + elif net == "h3": + net = "http" + alpn = ["h3"] + elif net in ("tcp", "raw") and headers == "http": + net = "http" + + if net in ("http", "ws", "quic", "grpc", "httpupgrade"): + max_early_data = None + early_data_header_name = None + + if "?ed=" in path: + path, max_early_data = path.split("?ed=") + (max_early_data,) = max_early_data.split("/") + max_early_data = int(max_early_data) + early_data_header_name = "Sec-WebSocket-Protocol" + + config["transport"] = self.transport_config( + transport_type=net, + host=host, + path=path, + max_early_data=max_early_data, + early_data_header_name=early_data_header_name, + random_user_agent=random_user_agent, + ping_timeout=ping_timeout, + idle_timeout=idle_timeout, + permit_without_stream=permit_without_stream, + http_headers=http_headers, + request=request, + headers=headers, + ) + + if tls in ("tls", "reality"): + config["tls"] = self.tls_config( + sni=sni, + fragment=fragment, + fp=fp, + tls=tls, + pbk=pbk, + sid=sid, + alpn=alpn, + ais=ais, + ech_config_list=ech_config_list, + ) + + if mux_settings and (singbox_mux := mux_settings.get("sing_box")): + singbox_mux = self._remove_none_values(singbox_mux) + config["multiplex"] = singbox_mux + + return config + + def add(self, remark: str, address: str, inbound: dict, settings: dict): + net = inbound["network"] + path = inbound["path"] + + # not supported by sing-box + if net in ("kcp", "splithttp", "xhttp") or (net == "quic" and inbound["header_type"] != "none"): + return + + if net in ("grpc", "gun"): + path = get_grpc_gun(path) + + remark = self._remark_validation(remark) + self.proxy_remarks.append(remark) + + outbound = self.make_outbound( + remark=remark, + type=inbound["protocol"], + address=address, + port=inbound["port"], + net=net, + tls=(inbound["tls"]), + flow=settings.get("flow", ""), + sni=inbound["sni"], + host=inbound["host"], + path=path, + alpn=inbound.get("alpn", None), + fp=inbound.get("fp", ""), + pbk=inbound.get("pbk", ""), + sid=inbound.get("sid", ""), + headers=inbound["header_type"], + ais=inbound.get("ais", ""), + random_user_agent=inbound.get("random_user_agent", False), + idle_timeout=inbound.get("idle_timeout", ""), + ping_timeout=inbound.get("health_check_timeout", ""), + permit_without_stream=inbound.get("permit_without_stream", False), + http_headers=inbound.get("http_headers"), + request=inbound.get("request"), + mux_settings=inbound.get("mux_settings", {}), + fragment=inbound.get("fragment_settings", {}), + ech_config_list=inbound.get("ech_config_list"), + ) + + if inbound["protocol"] == "vmess": + outbound["uuid"] = settings["id"] + + elif inbound["protocol"] == "vless": + outbound["uuid"] = settings["id"] + + elif inbound["protocol"] == "trojan": + outbound["password"] = settings["password"] + + elif inbound["protocol"] == "shadowsocks": + outbound["method"], outbound["password"] = detect_shadowsocks_2022( + inbound.get("is_2022", False), + inbound.get("method", ""), + settings["method"], + inbound.get("password"), + settings["password"], + ) + + self.add_outbound(outbound) diff --git a/app/subscription/xray.py b/app/subscription/xray.py new file mode 100644 index 000000000..0c0c03ee1 --- /dev/null +++ b/app/subscription/xray.py @@ -0,0 +1,680 @@ +import json +from enum import Enum +from random import choice +from typing import Union + +from app.subscription.funcs import detect_shadowsocks_2022, get_grpc_gun, get_grpc_multi +from app.templates import render_template +from app.utils.helpers import UUIDEncoder +from config import XRAY_SUBSCRIPTION_TEMPLATE + +from . import BaseSubscription + + +class XrayConfiguration(BaseSubscription): + def __init__(self): + super().__init__() + self.config = [] + self.template = render_template(XRAY_SUBSCRIPTION_TEMPLATE) + + def add_config(self, remarks, outbounds): + json_template = json.loads(self.template) + json_template["remarks"] = remarks + json_template["outbounds"] = outbounds + json_template["outbounds"] + self.config.append(json_template) + + def render(self, reverse=False): + if reverse: + self.config.reverse() + return json.dumps(self.config, indent=4, cls=UUIDEncoder) + + def tls_config(self, sni=None, fp=None, alpn=None, ais=False, ech_config_list=None) -> dict: + tls_settings = { + "serverName": sni, + "allowInsecure": ais if ais else False, + "show": False, + "fingerprint": fp, + "echConfigList": ech_config_list, + } + if alpn: + tls_settings["alpn"] = alpn + + return self._remove_none_values(tls_settings) + + def reality_config(self, sni=None, fp=None, pbk=None, sid=None, spx=None, mldsa65_verify=None) -> dict: + reality_settings = { + "serverName": sni, + "fingerprint": fp, + "show": False, + "publicKey": pbk, + "shortId": sid, + "spiderX": spx, + "mldsa65Verify": mldsa65_verify, + } + + return self._remove_none_values(reality_settings) + + def ws_config( + self, + path: str = "", + host: str = "", + random_user_agent: bool = False, + heartbeat_period: int | None = None, + http_headers: dict | None = None, + ) -> dict: + ws_settings = { + "headers": http_headers if http_headers is not None else {}, + "heartbeatPeriod": heartbeat_period, + "path": path, + "host": host, + } + if random_user_agent: + ws_settings["headers"]["User-Agent"] = choice(self.user_agent_list) + return self._remove_none_values(ws_settings) + + def httpupgrade_config( + self, path: str = "", host: str = "", random_user_agent: bool = False, http_headers=None + ) -> dict: + httpupgrade_settings = { + "headers": http_headers if http_headers is not None else {}, + "path": path, + "host": host, + } + if random_user_agent: + httpupgrade_settings["headers"]["User-Agent"] = choice(self.user_agent_list) + + return self._remove_none_values(httpupgrade_settings) + + def xhttp_config( + self, + path: str = "", + host: str = "", + random_user_agent: bool = False, + sc_max_each_post_bytes: int | None = None, + sc_max_concurrent_posts: int | None = None, + sc_min_posts_interval_ms: int | None = None, + x_padding_bytes: str | None = None, + xmux: dict | None = None, + download_settings: dict | None = None, + mode: str = "", + no_grpc_header: bool | None = None, + http_headers: dict | None = None, + ) -> dict: + xhttp_settings = {} + + mode = mode.value if isinstance(mode, Enum) else mode + xhttp_settings["mode"] = mode + if path: + xhttp_settings["path"] = path + if host: + xhttp_settings["host"] = host + extra = { + "headers": http_headers if http_headers is not None else {}, + "scMaxEachPostBytes": sc_max_each_post_bytes, + "scMaxConcurrentPosts": sc_max_concurrent_posts, + "scMinPostsIntervalMs": sc_min_posts_interval_ms, + "xPaddingBytes": x_padding_bytes, + "noGRPCHeader": no_grpc_header, + "xmux": xmux, + "downloadSettings": self.download_config(download_settings, False) if download_settings else None, + } + if random_user_agent: + if mode in ("stream-one", "stream-up") and not no_grpc_header: + extra["headers"]["User-Agent"] = choice(self.grpc_user_agent_data) + else: + extra["headers"]["User-Agent"] = choice(self.user_agent_list) + + xhttp_settings["extra"] = extra + return self._remove_none_values(xhttp_settings) + + def grpc_config( + self, + path: str = "", + host: str = "", + multi_mode: bool = False, + random_user_agent: bool = False, + idle_timeout=None, + health_check_timeout=None, + permit_without_stream=False, + initial_windows_size=None, + http_headers=None, + ) -> dict: + grpc_settings = { + "idle_timeout": idle_timeout if idle_timeout is not None else 60, + "health_check_timeout": health_check_timeout if health_check_timeout is not None else 20, + "permit_without_stream": permit_without_stream, + "initial_windows_size": initial_windows_size if initial_windows_size is not None else 35538, + "serviceName": path, + "authority": host, + "multiMode": multi_mode, + } + if http_headers and "user-agent" in http_headers: + grpc_settings["user_agent"] = http_headers["user-agent"] + if random_user_agent: + grpc_settings["user_agent"] = choice(self.grpc_user_agent_data) + return self._remove_none_values(grpc_settings) + + def tcp_config( + self, + headers="none", + path: str = "", + host: str = "", + random_user_agent: bool = False, + request: dict | None = None, + response: dict | None = None, + ) -> dict: + if headers == "http": + tcp_settings = { + "header": { + "type": headers, + "request": request + if request + else { + "version": "1.1", + "method": "GET", + "path": ["/"], + "headers": { + "Host": [], + "User-Agent": [], + "Accept-Encoding": ["gzip, deflate"], + "Connection": ["keep-alive"], + "Pragma": "no-cache", + }, + }, + "response": response + if response + else { + "version": "1.1", + "status": "200", + "reason": "OK", + "headers": { + "Content-Type": ["application/octet-stream", "video/mpeg"], + "Transfer-Encoding": ["chunked"], + "Connection": ["keep-alive"], + "Pragma": "no-cache", + }, + }, + } + } + + else: + tcp_settings = {"header": {"type": headers}} + + if any((path, host, random_user_agent)): + if "request" not in tcp_settings["header"]: + tcp_settings["header"]["request"] = {} + + if any((random_user_agent, host)): + if ( + "headers" not in tcp_settings["header"]["request"] + or tcp_settings["header"]["request"]["headers"] is None + ): + tcp_settings["header"]["request"]["headers"] = {} + + if path: + tcp_settings["header"]["request"]["path"] = [path] + + if host: + tcp_settings["header"]["request"]["headers"]["Host"] = [host] + + if random_user_agent: + tcp_settings["header"]["request"]["headers"]["User-Agent"] = [choice(self.user_agent_list)] + + return self._remove_none_values(tcp_settings) + + def http_config( + self, path: str = "", host: str = "", random_user_agent: bool = False, http_headers: dict | None = None + ) -> dict: + http_settings = { + "headers": {k: [v] for k, v in http_headers.items()} if http_headers is not None else {}, + "path": path, + "host": [host] if host else [], + } + if random_user_agent: + http_settings["headers"]["User-Agent"] = [choice(self.user_agent_list)] + return self._remove_none_values(http_settings) + + def quic_config(self, path=None, host=None, header="none") -> dict: + quicSettings = {"security": host, "header": {"type": header}, "key": path} + return self._remove_none_values(quicSettings) + + def kcp_config( + self, + seed=None, + host=None, + header="none", + mtu=None, + tti=None, + uplinkCapacity=None, + downlinkCapacity=None, + congestion=False, + readBufferSize=None, + writeBufferSize=None, + ) -> dict: + kcp_settings = { + "header": {"type": header, "domain": host}, + "mtu": mtu if mtu else 1350, + "tti": tti if tti else 50, + "uplinkCapacity": uplinkCapacity if uplinkCapacity else 12, + "downlinkCapacity": downlinkCapacity if downlinkCapacity else 100, + "congestion": congestion, + "readBufferSize": readBufferSize if readBufferSize else 2, + "writeBufferSize": writeBufferSize if writeBufferSize else 2, + "seed": seed, + } + return self._remove_none_values(kcp_settings) + + @staticmethod + def stream_setting_config( + network=None, security=None, network_setting=None, tls_settings=None, sockopt=None + ) -> dict: + stream_settings = {"network": network} + + if security and security != "none": + stream_settings["security"] = security + stream_settings[f"{security}Settings"] = tls_settings + + if network and network_setting: + stream_settings[f"{network}Settings"] = network_setting + + if sockopt: + stream_settings["sockopt"] = sockopt + + return stream_settings + + def download_config(self, inbound: dict, link_format: bool = False) -> dict: + net = inbound["network"] + port = inbound["port"] + if isinstance(port, str): + ports = port.split(",") + port = int(choice(ports)) + + address = inbound["address"] + tls = inbound["tls"] + headers = inbound["header_type"] + fragment = inbound["fragment_settings"] + noise = inbound["noise_settings"] + path = inbound["path"] + multi_mode = inbound.get("multi_mode", False) + + if net in ("grpc", "gun"): + if multi_mode: + path = get_grpc_multi(path) + else: + path = get_grpc_gun(path) + + dialer_proxy = "" + if (fragment or noise) and not link_format: + dialer_proxy = "dsdialer" + + download_settings = self.make_stream_setting( + net=net, + tls=tls, + sni=inbound["sni"], + host=inbound["host"], + path=path, + alpn=inbound.get("alpn", None), + fp=inbound.get("fp", ""), + pbk=inbound.get("pbk", ""), + sid=inbound.get("sid", ""), + spx=inbound.get("spx", ""), + headers=headers, + ais=inbound.get("ais", ""), + multi_mode=multi_mode, + random_user_agent=inbound.get("random_user_agent", False), + sc_max_each_post_bytes=inbound.get("sc_max_each_post_bytes"), + sc_max_concurrent_posts=inbound.get("sc_max_concurrent_posts"), + sc_min_posts_interval_ms=inbound.get("sc_min_posts_interval_ms"), + x_padding_bytes=inbound.get("x_padding_bytes"), + xmux=inbound.get("xmux", {}), + download_settings=inbound.get("downloadSettings"), + mode=inbound.get("mode", "auto"), + no_grpc_header=inbound.get("no_grpc_header"), + heartbeat_period=inbound.get("heartbeat_period"), + http_headers=inbound.get("http_headers"), + request=inbound.get("request"), + response=inbound.get("response"), + mtu=inbound.get("mtu"), + tti=inbound.get("tti"), + uplink_capacity=inbound.get("uplink_capacity"), + downlink_capacity=inbound.get("downlink_capacity"), + congestion=inbound.get("congestion"), + read_buffer_size=inbound.get("read_buffer_size"), + write_buffer_size=inbound.get("write_buffer_size"), + idle_timeout=inbound.get("idle_timeout"), + health_check_timeout=inbound.get("health_check_timeout"), + permit_without_stream=inbound.get("permit_without_stream", False), + initial_windows_size=inbound.get("initial_windows_size"), + dialer_proxy=dialer_proxy, + ech_config_list=inbound.get("ech_config_list"), + ) + + return { + "address": address, + "port": port, + **download_settings, + } + + @staticmethod + def vmess_config(address=None, port=None, id=None) -> dict: + return { + "vnext": [ + { + "address": address, + "port": port, + "users": [{"id": id, "alterId": 0, "email": "t@t.com", "security": "auto"}], + } + ] + } + + @staticmethod + def vless_config(address=None, port=None, id=None, flow="", encryption="none") -> dict: + return { + "vnext": [ + { + "address": address, + "port": port, + "users": [ + { + "id": id, + "security": "auto", + "encryption": encryption, + "email": "t@t.com", + "alterId": 0, + "flow": flow, + } + ], + } + ] + } + + @staticmethod + def trojan_config(address=None, port=None, password=None) -> dict: + return { + "servers": [ + { + "address": address, + "port": port, + "password": password, + "email": "t@t.com", + } + ] + } + + @staticmethod + def shadowsocks_config(address=None, port=None, password=None, method=None) -> dict: + return { + "servers": [ + { + "address": address, + "port": port, + "password": password, + "email": "t@t.com", + "method": method, + "uot": False, + } + ] + } + + def make_dialer_outbound( + self, fragment: dict | None = None, noises: dict | None = None, dialer_tag: str = "dialer" + ) -> Union[dict, None]: + xray_noises = noises.get("xray", []) if noises else [] + dialer_settings = { + "fragment": fragment.get("xray") if fragment else None, + "noises": [ + { + "type": noise["type"], + "packet": noise["packet"], + "delay": noise["delay"], + "applyTo": noise["apply_to"], + } + for noise in xray_noises + ] + or None, + } + dialer_settings = self._remove_none_values(dialer_settings) + + if dialer_settings: + return {"tag": dialer_tag, "protocol": "freedom", "settings": dialer_settings} + + def make_stream_setting( + self, + net="", + path="", + host="", + tls="", + sni="", + fp="", + alpn=None, + pbk="", + sid="", + spx="", + headers="", + ais="", + dialer_proxy="", + multi_mode: bool = False, + random_user_agent: bool = False, + sc_max_each_post_bytes: int | None = None, + sc_max_concurrent_posts: int | None = None, + sc_min_posts_interval_ms: int | None = None, + x_padding_bytes: str | None = None, + xmux: dict = {}, + download_settings: dict = {}, + mode: str = "", + no_grpc_header: bool | None = None, + heartbeat_period: int = 0, + http_headers: dict | None = None, + idle_timeout=None, + health_check_timeout=None, + permit_without_stream=False, + initial_windows_size=None, + request: dict | None = None, + response: dict | None = None, + mtu=None, + tti=None, + uplink_capacity=None, + downlink_capacity=None, + congestion=False, + read_buffer_size=None, + write_buffer_size=None, + ech_config_list=None, + mldsa65_verify=None, + ) -> dict: + if net == "ws": + network_setting = self.ws_config( + path=path, + host=host, + random_user_agent=random_user_agent, + heartbeat_period=heartbeat_period, + http_headers=http_headers, + ) + elif net == "grpc": + network_setting = self.grpc_config( + path=path, + host=host, + multi_mode=multi_mode, + random_user_agent=random_user_agent, + idle_timeout=idle_timeout, + health_check_timeout=health_check_timeout, + permit_without_stream=permit_without_stream, + initial_windows_size=initial_windows_size, + http_headers=http_headers, + ) + elif net in ("h3", "h2", "http"): + network_setting = self.http_config( + path=path, host=host, random_user_agent=random_user_agent, http_headers=http_headers + ) + elif net == "kcp": + network_setting = self.kcp_config( + seed=path, + host=host, + header=headers, + mtu=mtu, + tti=tti, + uplinkCapacity=uplink_capacity, + downlinkCapacity=downlink_capacity, + congestion=congestion, + readBufferSize=read_buffer_size, + writeBufferSize=write_buffer_size, + ) + elif net in ("tcp", "raw") and tls != "reality": + network_setting = self.tcp_config( + headers=headers, + path=path, + host=host, + random_user_agent=random_user_agent, + request=request, + response=response, + ) + elif net == "quic": + network_setting = self.quic_config(path=path, host=host, header=headers) + elif net == "httpupgrade": + network_setting = self.httpupgrade_config( + path=path, host=host, random_user_agent=random_user_agent, http_headers=http_headers + ) + elif net in ("splithttp", "xhttp"): + network_setting = self.xhttp_config( + path=path, + host=host, + random_user_agent=random_user_agent, + sc_max_each_post_bytes=sc_max_each_post_bytes, + sc_max_concurrent_posts=sc_max_concurrent_posts, + sc_min_posts_interval_ms=sc_min_posts_interval_ms, + x_padding_bytes=x_padding_bytes, + xmux=xmux, + download_settings=download_settings, + mode=mode, + no_grpc_header=no_grpc_header, + http_headers=http_headers, + ) + else: + network_setting = {} + + if tls == "tls": + tls_settings = self.tls_config(sni=sni, fp=fp, alpn=alpn, ais=ais, ech_config_list=ech_config_list) + elif tls == "reality": + tls_settings = self.reality_config(sni=sni, fp=fp, pbk=pbk, sid=sid, spx=spx, mldsa65_verify=mldsa65_verify) + else: + tls_settings = None + + if dialer_proxy: + sockopt = {"dialerProxy": dialer_proxy} + else: + sockopt = None + + return self.stream_setting_config( + network=net, security=tls, network_setting=network_setting, tls_settings=tls_settings, sockopt=sockopt + ) + + def add(self, remark: str, address: str, inbound: dict, settings: dict): + net = inbound["network"] + protocol = inbound["protocol"] + port = inbound["port"] + if isinstance(port, str): + ports = port.split(",") + port = int(choice(ports)) + + tls = inbound["tls"] + headers = inbound["header_type"] + fragment = inbound["fragment_settings"] + noise = inbound["noise_settings"] + path = inbound["path"] + multi_mode = inbound.get("multi_mode", False) + + if net in ("grpc", "gun"): + if multi_mode: + path = get_grpc_multi(path) + else: + path = get_grpc_gun(path) + + outbound = {"tag": "proxy", "protocol": protocol} + + if inbound["protocol"] == "vmess": + outbound["settings"] = self.vmess_config(address=address, port=port, id=settings["id"]) + + elif inbound["protocol"] == "vless": + if net in ("tcp", "raw", "kcp") and headers != "http" and tls in ("tls", "reality"): + flow = settings.get("flow", "") + else: + flow = None + encryption = inbound.get("encryption", "none") + + outbound["settings"] = self.vless_config( + address=address, port=port, id=settings["id"], flow=flow, encryption=encryption + ) + + elif inbound["protocol"] == "trojan": + outbound["settings"] = self.trojan_config(address=address, port=port, password=settings["password"]) + + elif inbound["protocol"] == "shadowsocks": + method, password = detect_shadowsocks_2022( + inbound.get("is_2022", False), + inbound.get("method", ""), + settings["method"], + inbound.get("password"), + settings["password"], + ) + outbound["settings"] = self.shadowsocks_config(address=address, port=port, password=password, method=method) + + outbounds = [outbound] + dialer_proxy = "" + extra_outbound = self.make_dialer_outbound(fragment, noise) + if extra_outbound: + dialer_proxy = extra_outbound["tag"] + outbounds.append(extra_outbound) + + if (ds := inbound.get("downloadSettings", {})) and (ds.get("fragment_settings") or ds.get("noise_settings")): + ds_outbound = self.make_dialer_outbound(ds.get("fragment_settings"), ds.get("noise_settings"), "dsdialer") + if ds_outbound: + outbounds.append(ds_outbound) + + outbound["streamSettings"] = self.make_stream_setting( + net=net, + tls=tls, + sni=inbound["sni"], + host=inbound["host"], + path=path, + alpn=inbound.get("alpn", None), + fp=inbound.get("fp", ""), + pbk=inbound.get("pbk", ""), + sid=inbound.get("sid", ""), + spx=inbound.get("spx", ""), + headers=headers, + ais=inbound.get("ais", ""), + dialer_proxy=dialer_proxy, + multi_mode=multi_mode, + random_user_agent=inbound.get("random_user_agent", False), + sc_max_each_post_bytes=inbound.get("sc_max_each_post_bytes"), + sc_max_concurrent_posts=inbound.get("sc_max_concurrent_posts"), + sc_min_posts_interval_ms=inbound.get("sc_min_posts_interval_ms"), + x_padding_bytes=inbound.get("x_padding_bytes"), + xmux=inbound.get("xmux", {}), + download_settings=inbound.get("downloadSettings"), + mode=inbound.get("mode", "auto"), + no_grpc_header=inbound.get("no_grpc_header"), + heartbeat_period=inbound.get("heartbeat_period"), + http_headers=inbound.get("http_headers"), + request=inbound.get("request"), + response=inbound.get("response"), + mtu=inbound.get("mtu"), + tti=inbound.get("tti"), + uplink_capacity=inbound.get("uplink_capacity"), + downlink_capacity=inbound.get("downlink_capacity"), + congestion=inbound.get("congestion"), + read_buffer_size=inbound.get("read_buffer_size"), + write_buffer_size=inbound.get("write_buffer_size"), + idle_timeout=inbound.get("idle_timeout"), + health_check_timeout=inbound.get("health_check_timeout"), + permit_without_stream=inbound.get("permit_without_stream", False), + initial_windows_size=inbound.get("initial_windows_size"), + ech_config_list=inbound.get("ech_config_list"), + mldsa65_verify=inbound.get("mldsa65Verify"), + ) + + mux_settings: dict = inbound.get("mux_settings", {}) + if mux_settings and (xray_mux := mux_settings.get("xray")): + xray_mux = self._remove_none_values(xray_mux) + outbound["mux"] = xray_mux + + self.add_config(remarks=remark, outbounds=outbounds) diff --git a/app/telegram/__init__.py b/app/telegram/__init__.py new file mode 100644 index 000000000..2551d13bc --- /dev/null +++ b/app/telegram/__init__.py @@ -0,0 +1,125 @@ +import asyncio +from asyncio import Lock + +from aiogram import Bot, Dispatcher +from aiogram.client.default import DefaultBotProperties +from aiogram.client.session.aiohttp import AiohttpSession +from aiogram.enums import ParseMode +from aiogram.exceptions import TelegramBadRequest, TelegramNetworkError, TelegramRetryAfter, TelegramUnauthorizedError +from python_socks._errors import ProxyConnectionError + +from app import on_shutdown, on_startup +from app.models.settings import RunMethod, Telegram +from app.settings import telegram_settings +from app.utils.logger import get_logger + +from .handlers import include_routers +from .middlewares import setup_middlewares + +logger = get_logger("telegram-bot") + + +_bot = None +_polling_task: asyncio.Task = None +_lock = Lock() +_dp = Dispatcher() + + +def get_bot(): + return _bot + + +def get_dispatcher(): + return _dp + + +async def startup_telegram_bot(): + restart = False + global _bot + global _dp + global _polling_task + + if _bot: + await shutdown_telegram_bot() + restart = True + + async with _lock: + settings: Telegram = await telegram_settings() + if settings.enable: + logger.info("Telegram bot starting") + session = AiohttpSession(proxy=settings.proxy_url) + _bot = Bot(token=settings.token, session=session, default=DefaultBotProperties(parse_mode=ParseMode.HTML)) + + try: + if not restart: + # register handlers + include_routers(_dp) + # register middlewares + setup_middlewares(_dp) + except RuntimeError: + pass + + try: + if settings.method == RunMethod.LONGPOLLING: + _polling_task = asyncio.create_task(_dp.start_polling(_bot, handle_signals=False)) + else: + # register webhook + webhook_address = f"{settings.webhook_url}/api/tghook" + logger.info(webhook_address) + await _bot.set_webhook( + webhook_address, + secret_token=settings.webhook_secret, + allowed_updates=["message", "callback_query", "inline_query"], + drop_pending_updates=True, + ) + logger.info("Telegram bot started successfully.") + except ( + TelegramNetworkError, + ProxyConnectionError, + TelegramBadRequest, + TelegramUnauthorizedError, + ) as err: + if hasattr(err, "message"): + logger.error(err.message) + else: + logger.error(err) + + +async def shutdown_telegram_bot(): + global _bot + global _dp + global _polling_task + + async with _lock: + if isinstance(_bot, Bot): + logger.info("Shutting down telegram bot") + try: + if _polling_task is not None and not _polling_task.done(): + logger.info("stopping long polling") + # Force stop the dispatcher first + await _dp.stop_polling() + # Cancel the polling task + _polling_task.cancel() + _polling_task = None + else: + await _bot.delete_webhook(drop_pending_updates=True) + except ( + TelegramNetworkError, + TelegramRetryAfter, + ProxyConnectionError, + TelegramUnauthorizedError, + ) as err: + if hasattr(err, "message"): + logger.error(err.message) + else: + logger.error(err) + + if _bot.session: + await _bot.session.close() + + _bot = None + logger.info("Telegram bot shut down successfully.") + + +on_startup(startup_telegram_bot) +on_shutdown(shutdown_telegram_bot) diff --git a/app/telegram/handlers/__init__.py b/app/telegram/handlers/__init__.py new file mode 100644 index 000000000..1d74283b8 --- /dev/null +++ b/app/telegram/handlers/__init__.py @@ -0,0 +1,11 @@ +from aiogram import Dispatcher + +from . import admin, base, error_handler, client + + +def include_routers(dp: Dispatcher) -> None: + dp.include_router(base.router) + dp.include_router(admin.router) # keep these last one + dp.include_router(client.router) # and before error_handler + + dp.include_router(error_handler.router) diff --git a/app/telegram/handlers/admin/__init__.py b/app/telegram/handlers/admin/__init__.py new file mode 100644 index 000000000..be527b5e7 --- /dev/null +++ b/app/telegram/handlers/admin/__init__.py @@ -0,0 +1,17 @@ +from aiogram import Router + +from app.telegram.utils.filters import IsAdminFilter +from . import main_menu, user, confirm_action, bulk_actions + + +router = Router(name="admin") + +router.message.filter(IsAdminFilter()) +router.callback_query.filter(IsAdminFilter()) +router.inline_query.filter(IsAdminFilter()) + +router.include_router(main_menu.router) +router.include_router(confirm_action.router) +router.include_router(bulk_actions.router) + +router.include_router(user.router) # keep this as last one diff --git a/app/telegram/handlers/admin/bulk_actions.py b/app/telegram/handlers/admin/bulk_actions.py new file mode 100644 index 000000000..98967ee34 --- /dev/null +++ b/app/telegram/handlers/admin/bulk_actions.py @@ -0,0 +1,163 @@ +from datetime import datetime as dt, timezone as tz, timedelta as td + +from aiogram import Router, F +from aiogram.exceptions import TelegramBadRequest +from aiogram.fsm.context import FSMContext +from aiogram.types import CallbackQuery, Message +from sqlalchemy.ext.asyncio import AsyncSession + +from app.models.admin import AdminDetails +from app.models.user import BulkUser +from app.operation import OperatorType +from app.operation.user import UserOperation +from app.telegram.keyboards.admin import AdminPanel, AdminPanelAction +from app.telegram.keyboards.base import CancelKeyboard +from app.telegram.keyboards.bulk_actions import BulkActionPanel, BulkAction +from app.telegram.keyboards.confim_action import ConfirmAction +from app.telegram.utils import forms +from app.telegram.utils.shared import add_to_messages_to_delete, delete_messages +from app.telegram.utils.texts import Message as Texts + +user_operations = UserOperation(OperatorType.TELEGRAM) + +router = Router(name="bulk_actions") + + +@router.callback_query(AdminPanel.Callback.filter(AdminPanelAction.bulk_actions == F.action)) +async def bulk_actions(event: CallbackQuery): + await event.message.edit_text(Texts.choose_action, reply_markup=BulkActionPanel().as_markup()) + + +@router.callback_query(BulkActionPanel.Callback.filter((BulkAction.delete_expired == F.action) & ~F.amount)) +async def delete_expired(event: CallbackQuery, state: FSMContext): + try: + await event.message.delete() + except TelegramBadRequest: + pass + await state.set_state(forms.DeleteExpired.expired_before) + msg = await event.message.answer(Texts.enter_expire_before, reply_markup=CancelKeyboard().as_markup()) + await state.update_data(messages_to_delete=[msg.message_id]) + + +@router.message(forms.DeleteExpired.expired_before) +async def process_expire_before(event: Message, state: FSMContext): + await delete_messages(event, state) + await add_to_messages_to_delete(state, event) + + if not event.text or not event.text.isnumeric(): + msg = await event.reply(text=Texts.duration_not_valid, reply_markup=CancelKeyboard().as_markup()) + await add_to_messages_to_delete(state, msg) + return + + await state.clear() + + await event.answer( + Texts.confirm_delete_expired(event.text), + reply_markup=ConfirmAction( + confirm_action=BulkActionPanel.Callback(action=BulkAction.delete_expired, amount=event.text).pack(), + cancel_action=AdminPanel.Callback( + action=AdminPanelAction.bulk_actions, + ).pack(), + ).as_markup(), + ) + + +@router.callback_query(BulkActionPanel.Callback.filter((BulkAction.delete_expired == F.action) & F.amount)) +async def delete_expired_done( + event: CallbackQuery, db: AsyncSession, admin: AdminDetails, callback_data: BulkActionPanel.Callback +): + expire_before = dt.now(tz.utc) - td(days=int(callback_data.amount)) + result = await user_operations.delete_expired_users( + db, + admin, + expired_before=expire_before, + expired_after=dt.fromtimestamp(0, tz.utc), + ) + await event.answer(Texts.users_deleted(result.count)) + await event.message.edit_text(Texts.choose_action, reply_markup=BulkActionPanel().as_markup()) + + +@router.callback_query(BulkActionPanel.Callback.filter((BulkAction.modify_expiry == F.action) & ~F.amount)) +async def modify_expiry(event: CallbackQuery, state: FSMContext): + try: + await event.message.delete() + except TelegramBadRequest: + pass + await state.set_state(forms.BulkModify.expiry) + msg = await event.message.answer(Texts.enter_bulk_expiry, reply_markup=CancelKeyboard().as_markup()) + await state.update_data(messages_to_delete=[msg.message_id]) + + +@router.message(forms.BulkModify.expiry) +async def process_expiry(event: Message, state: FSMContext): + await delete_messages(event, state) + await add_to_messages_to_delete(state, event) + + try: + amount = int(event.text) + except ValueError: + msg = await event.reply(text=Texts.duration_not_valid, reply_markup=CancelKeyboard().as_markup()) + await add_to_messages_to_delete(state, msg) + return + + await state.clear() + + await event.answer( + Texts.confirm_modify_expiry(amount), + reply_markup=ConfirmAction( + confirm_action=BulkActionPanel.Callback(action=BulkAction.modify_expiry, amount=str(amount)).pack(), + cancel_action=AdminPanel.Callback( + action=AdminPanelAction.bulk_actions, + ).pack(), + ).as_markup(), + ) + + +@router.callback_query(BulkActionPanel.Callback.filter((BulkAction.modify_expiry == F.action) & F.amount)) +async def modify_expiry_done(event: CallbackQuery, db: AsyncSession, callback_data: BulkActionPanel.Callback): + result = await user_operations.bulk_modify_expire(db, BulkUser(amount=int(callback_data.amount) * 86400)) + await event.answer(Texts.users_expiry_changed(result, int(callback_data.amount))) + await event.message.edit_text(Texts.choose_action, reply_markup=BulkActionPanel().as_markup()) + + +@router.callback_query(BulkActionPanel.Callback.filter((BulkAction.modify_data_limit == F.action) & ~F.amount)) +async def modify_data_limit(event: CallbackQuery, state: FSMContext): + try: + await event.message.delete() + except TelegramBadRequest: + pass + await state.set_state(forms.BulkModify.data_limit) + msg = await event.message.answer(Texts.enter_bulk_data_limit, reply_markup=CancelKeyboard().as_markup()) + await state.update_data(messages_to_delete=[msg.message_id]) + + +@router.message(forms.BulkModify.data_limit) +async def process_data_limit(event: Message, state: FSMContext): + await delete_messages(event, state) + await add_to_messages_to_delete(state, event) + + try: + amount = int(event.text) + except ValueError: + msg = await event.reply(text=Texts.data_limit_not_valid, reply_markup=CancelKeyboard().as_markup()) + await add_to_messages_to_delete(state, msg) + return + + await state.clear() + + await event.answer( + Texts.confirm_modify_data_limit(amount), + reply_markup=ConfirmAction( + confirm_action=BulkActionPanel.Callback(action=BulkAction.modify_data_limit, amount=str(amount)).pack(), + cancel_action=AdminPanel.Callback( + action=AdminPanelAction.bulk_actions, + ).pack(), + ).as_markup(), + ) + + +@router.callback_query(BulkActionPanel.Callback.filter((BulkAction.modify_data_limit == F.action) & F.amount)) +async def modify_data_limit_done(event: CallbackQuery, db: AsyncSession, callback_data: BulkActionPanel.Callback): + result = await user_operations.bulk_modify_datalimit(db, BulkUser(amount=int(callback_data.amount) * (1024**3))) + await event.answer(Texts.users_data_limit_changed(result, int(callback_data.amount))) + await event.message.edit_text(Texts.choose_action, reply_markup=BulkActionPanel().as_markup()) diff --git a/app/telegram/handlers/admin/confirm_action.py b/app/telegram/handlers/admin/confirm_action.py new file mode 100644 index 000000000..dad00a7c5 --- /dev/null +++ b/app/telegram/handlers/admin/confirm_action.py @@ -0,0 +1,43 @@ +from aiogram import Router +from aiogram.types import CallbackQuery +from sqlalchemy.ext.asyncio.session import AsyncSession + +from app.models.admin import AdminDetails +from app.operation import OperatorType +from app.operation.user import UserOperation +from app.telegram.keyboards.confim_action import ConfirmAction +from app.telegram.keyboards.user import UserPanel, UserPanelAction +from app.telegram.utils.texts import Message as Texts + + +router = Router(name="confirm_action") + +user_operations = UserOperation(OperatorType.TELEGRAM) + + +@router.callback_query(ConfirmAction.Callback.filter()) +async def confirm_action( + event: CallbackQuery, callback_data: ConfirmAction.Callback, db: AsyncSession, admin: AdminDetails +): + text = Texts.confirm + if callback_data.action.startswith(UserPanel.Callback.__prefix__): + action = UserPanel.Callback.unpack(callback_data.action) + user = await user_operations.get_user_by_id(db, action.user_id, admin) + match action.action: + case UserPanelAction.disable: + text = Texts.confirm_disable_user(user.username) + case UserPanelAction.enable: + text = Texts.confirm_enable_user(user.username) + case UserPanelAction.delete: + text = Texts.confirm_delete_user(user.username) + case UserPanelAction.revoke_sub: + text = Texts.confirm_revoke_sub(user.username) + case UserPanelAction.reset_usage: + text = Texts.confirm_reset_usage(user.username) + case UserPanelAction.activate_next_plan: + text = Texts.confirm_activate_next_plan(user.username) + + await event.message.edit_text( + text, + reply_markup=ConfirmAction(confirm_action=callback_data.action, cancel_action=callback_data.cancel).as_markup(), + ) diff --git a/app/telegram/handlers/admin/main_menu.py b/app/telegram/handlers/admin/main_menu.py new file mode 100644 index 000000000..892dba612 --- /dev/null +++ b/app/telegram/handlers/admin/main_menu.py @@ -0,0 +1,56 @@ +from aiogram import Router, F +from aiogram.exceptions import TelegramBadRequest +from aiogram.types import CallbackQuery +from sqlalchemy.ext.asyncio import AsyncSession + +from app.operation import OperatorType +from app.operation.node import NodeOperation +from app.models.admin import AdminDetails +from app.operation.system import SystemOperation +from app.settings import telegram_settings +from app.telegram.utils.filters import IsAdminSUDO, IsAdminFilter +from app.telegram.keyboards.admin import AdminPanel, AdminPanelAction +from app.telegram.utils.texts import Message as Texts + + +system_operator = SystemOperation(OperatorType.TELEGRAM) +node_operator = NodeOperation(OperatorType.TELEGRAM) + +router = Router(name="main_menu") + + +@router.callback_query(IsAdminFilter(), AdminPanel.Callback.filter(AdminPanelAction.refresh == F.action)) +async def reload_data(event: CallbackQuery, db: AsyncSession, admin: AdminDetails): + stats = await system_operator.get_system_stats(db, admin) + try: + settings = await telegram_settings() + await event.message.edit_text( + text=Texts.start(stats), + reply_markup=AdminPanel( + is_sudo=admin.is_sudo, panel_url=settings.mini_app_web_url if settings.mini_app_login else None + ).as_markup(), + ) + except TelegramBadRequest: + pass + + await event.answer(Texts.refreshed) + + +@router.callback_query(IsAdminSUDO(), AdminPanel.Callback.filter(AdminPanelAction.sync_users == F.action)) +async def sync_users(event: CallbackQuery, db: AsyncSession, admin: AdminDetails): + await event.answer(Texts.syncing) + for node in await node_operator.get_db_nodes(db): + await node_operator.sync_node_users(db, node.id, flush_users=True) + try: + stats = await system_operator.get_system_stats(db, admin) + settings = await telegram_settings() + await event.message.edit_text( + text=Texts.start(stats), + reply_markup=AdminPanel( + is_sudo=admin.is_sudo, panel_url=settings.mini_app_web_url if settings.mini_app_login else None + ).as_markup(), + ) + except TelegramBadRequest: + pass + + await event.answer(Texts.synced) diff --git a/app/telegram/handlers/admin/user.py b/app/telegram/handlers/admin/user.py new file mode 100644 index 000000000..6e4e79532 --- /dev/null +++ b/app/telegram/handlers/admin/user.py @@ -0,0 +1,622 @@ +import random +from datetime import datetime as dt, timedelta as td + +from aiogram import Router, F +from aiogram.types import CallbackQuery, Message, InlineQuery, InlineQueryResultArticle, InputTextMessageContent +from aiogram.fsm.context import FSMContext +from sqlalchemy.ext.asyncio import AsyncSession +from aiogram.exceptions import TelegramBadRequest + +from app.db.models import UserStatus +from app.models.user import UserCreate, UserModify, UserStatusModify, CreateUserFromTemplate, ModifyUserByTemplate +from app.models.validators import UserValidator +from app.operation import OperatorType +from app.operation.user import UserOperation +from app.operation.group import GroupOperation +from app.operation.user_template import UserTemplateOperation +from app.telegram.keyboards.group import SelectGroupAction, GroupsSelector +from app.telegram.utils import forms +from app.models.admin import AdminDetails +from app.telegram.keyboards.admin import AdminPanel, AdminPanelAction, InlineQuerySearch +from app.telegram.keyboards.base import CancelKeyboard +from app.telegram.utils.texts import Message as Texts +from app.telegram.keyboards.user import UserPanel, UserPanelAction, ChooseStatus, ChooseTemplate, RandomUsername +from app.telegram.utils.shared import add_to_messages_to_delete, delete_messages + +user_operations = UserOperation(OperatorType.TELEGRAM) +group_operations = GroupOperation(OperatorType.TELEGRAM) +user_templates = UserTemplateOperation(OperatorType.TELEGRAM) + +router = Router(name="user") + + +@router.callback_query( + AdminPanel.Callback.filter(AdminPanelAction.create_user == F.action), +) +async def create_user(event: CallbackQuery, state: FSMContext): + try: + await event.message.delete() + except TelegramBadRequest: + pass + await state.set_state(forms.CreateUser.username) + msg = await event.message.answer(Texts.enter_username, reply_markup=RandomUsername().as_markup()) + await state.update_data(messages_to_delete=[msg.message_id]) + + +@router.message(forms.CreateUser.username) +@router.callback_query(RandomUsername.Callback.filter(~F.with_template)) +async def process_username(event: Message | CallbackQuery, state: FSMContext, db: AsyncSession, admin: AdminDetails): + await delete_messages(event, state) + if isinstance(event, Message): + await add_to_messages_to_delete(state, event) + username = event.text + try: + UserValidator.validate_username(username) + except ValueError as e: + msg = await event.reply(f"❌ {e}", reply_markup=RandomUsername().as_markup()) + await add_to_messages_to_delete(state, msg) + return + else: + await add_to_messages_to_delete(state, event.message) + username = "".join(random.choices("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", k=5)) + + try: + await user_operations.get_validated_user(db, username, admin) + if isinstance(event, Message): + msg = await event.reply(Texts.username_already_exist, reply_markup=RandomUsername().as_markup()) + await add_to_messages_to_delete(state, msg) + else: + await event.answer(Texts.username_already_exist) + return + except ValueError: + pass + + await delete_messages(event, state) + await state.update_data(username=username) + await state.set_state(forms.CreateUser.data_limit) + if isinstance(event, Message): + msg = await event.answer(Texts.enter_data_limit, reply_markup=CancelKeyboard().as_markup()) + else: + msg = await event.message.answer(Texts.enter_data_limit, reply_markup=CancelKeyboard().as_markup()) + await add_to_messages_to_delete(state, msg) + + +@router.message(forms.CreateUser.data_limit) +async def process_data_limit(event: Message, state: FSMContext): + await delete_messages(event, state) + await add_to_messages_to_delete(state, event) + + try: + data_limit = float(event.text) + if data_limit < 0: + raise ValueError + await state.update_data(data_limit=data_limit) + + await state.set_state(forms.CreateUser.expire) + + await add_to_messages_to_delete(state, event) + await delete_messages(event, state) + + msg = await event.answer(Texts.enter_duration, reply_markup=CancelKeyboard().as_markup()) + await add_to_messages_to_delete(state, msg) + return + + except ValueError: + msg = await event.reply(Texts.data_limit_not_valid, reply_markup=CancelKeyboard().as_markup()) + await add_to_messages_to_delete(state, msg) + return + + +@router.message(forms.CreateUser.expire) +async def process_expire(event: Message, state: FSMContext, db: AsyncSession): + await delete_messages(event, state) + await add_to_messages_to_delete(state, event) + + try: + duration = int(event.text) + if duration < 0: + raise ValueError + except ValueError: + msg = await event.reply(text=Texts.duration_not_valid, reply_markup=CancelKeyboard().as_markup()) + await add_to_messages_to_delete(state, msg) + return + + await state.update_data(duration=duration) + await delete_messages(event, state) + if duration: + await state.set_state(forms.CreateUser.status) + return await event.answer(Texts.choose_status, reply_markup=ChooseStatus().as_markup()) + else: + await state.update_data(status=UserStatus.active.value) + await state.set_state(forms.CreateUser.group_ids) + groups = await group_operations.get_all_groups(db) + return await event.answer(Texts.select_groups, reply_markup=GroupsSelector(groups).as_markup()) + + +@router.callback_query(ChooseStatus.Callback.filter()) +async def process_status( + event: CallbackQuery, db: AsyncSession, state: FSMContext, callback_data: ChooseStatus.Callback +): + await state.update_data(status=callback_data.status) + + await add_to_messages_to_delete(state, event.message) + await delete_messages(event, state) + + if callback_data.status == UserStatus.on_hold.value: + await state.set_state(forms.CreateUser.on_hold_timeout) + msg = await event.message.answer(Texts.enter_on_hold_timeout, reply_markup=CancelKeyboard().as_markup()) + await add_to_messages_to_delete(state, msg) + else: + await state.set_state(forms.CreateUser.group_ids) + groups = await group_operations.get_all_groups(db) + await event.message.answer(Texts.select_groups, reply_markup=GroupsSelector(groups).as_markup()) + + +@router.message(forms.CreateUser.on_hold_timeout) +async def process_on_hold_timeout(event: Message, state: FSMContext, db: AsyncSession): + await delete_messages(event, state) + await add_to_messages_to_delete(state, event) + + try: + timeout = int(event.text) + if timeout < 0: + raise ValueError + except ValueError: + msg = await event.reply(text=Texts.duration_not_valid, reply_markup=CancelKeyboard().as_markup()) + await add_to_messages_to_delete(state, msg) + return + + await state.update_data(on_hold_timeout=timeout) + groups = await group_operations.get_all_groups(db) + + await add_to_messages_to_delete(state, event) + await delete_messages(event, state) + + await event.answer(Texts.select_groups, reply_markup=GroupsSelector(groups).as_markup()) + + +@router.callback_query(GroupsSelector.Callback.filter(SelectGroupAction.select == F.action)) +async def select_groups( + event: CallbackQuery, db: AsyncSession, state: FSMContext, callback_data: GroupsSelector.Callback +): + group_ids = await state.get_value("group_ids") + if isinstance(group_ids, list): + if callback_data.group_id in group_ids: + group_ids.remove(callback_data.group_id) + else: + group_ids.append(callback_data.group_id) + else: + group_ids = [callback_data.group_id] + + await state.update_data(group_ids=group_ids) + all_groups = await group_operations.get_all_groups(db) + + await event.message.edit_reply_markup( + reply_markup=GroupsSelector( + groups=all_groups, selected_groups=group_ids, user_id=callback_data.user_id + ).as_markup() + ) + + +@router.callback_query(GroupsSelector.Callback.filter(SelectGroupAction.create == F.action)) +async def process_done(event: CallbackQuery, db: AsyncSession, admin: AdminDetails, state: FSMContext): + data = await state.get_data() + if not data.get("group_ids", []): + return await event.answer(Texts.select_a_group, show_alert=True) + + duration = data.get("duration") + if data.get("status") == UserStatus.on_hold.value: + data["status"] = UserStatus.on_hold + data["on_hold_expire_duration"] = td(days=duration).total_seconds() if duration else 0 + timeout = data.get("on_hold_timeout") + data["on_hold_timeout"] = (dt.now() + td(days=timeout)) if timeout else None + else: + data["status"] = UserStatus.active + data["expire"] = (dt.now() + td(days=duration)) if duration else None + + data["data_limit"] *= 1024**3 + + await delete_messages(event, state) + await state.clear() + + del data["messages_to_delete"] + del data["duration"] + + new_user = UserCreate(**data) + user = await user_operations.create_user(db, new_user, admin) + groups = await user_operations.validate_all_groups(db, user) + await event.answer(Texts.user_created) + return await event.message.edit_text(Texts.user_details(user, groups), reply_markup=UserPanel(user).as_markup()) + + +@router.callback_query(UserPanel.Callback.filter(UserPanelAction.modify_groups == F.action)) +async def modify_groups( + event: CallbackQuery, db: AsyncSession, state: FSMContext, callback_data: UserPanel.Callback, admin: AdminDetails +): + try: + user = await user_operations.get_user_by_id(db, callback_data.user_id, admin) + except ValueError: + return await event.answer(Texts.user_not_found) + + groups = await user_operations.validate_all_groups(db, user) + all_groups = await group_operations.get_all_groups(db) + await state.clear() + await state.update_data(user_id=user.id, group_ids=[group.id for group in groups]) + await event.message.edit_text( + Texts.select_groups, + reply_markup=GroupsSelector( + all_groups, selected_groups=[group.id for group in groups], user_id=user.id + ).as_markup(), + ) + + +@router.callback_query(GroupsSelector.Callback.filter(SelectGroupAction.modify == F.action)) +async def modify_groups_done(event: CallbackQuery, db: AsyncSession, admin: AdminDetails, state: FSMContext): + data = await state.get_data() + if not data.get("group_ids", []): + return await event.answer(Texts.select_a_group, show_alert=True) + + user_id = data.get("user_id") + try: + user = await user_operations.get_user_by_id(db, user_id, admin) + except ValueError: + return await event.answer(Texts.user_not_found) + + modified_user = UserModify(group_ids=data["group_ids"]) + user = await user_operations.modify_user(db, user.username, modified_user, admin) + groups = await user_operations.validate_all_groups(db, user) + await delete_messages(event, state) + await state.clear() + await event.message.edit_text(Texts.user_details(user, groups), reply_markup=UserPanel(user).as_markup()) + + +@router.callback_query(UserPanel.Callback.filter(UserPanelAction.modify_expiry == F.action)) +async def modify_expiry(event: CallbackQuery, callback_data: UserPanel.Callback, state: FSMContext): + await state.set_state(forms.ModifyUser.new_expiry) + await state.update_data(user_id=callback_data.user_id) + try: + await event.message.delete() + except TelegramBadRequest: + pass + msg = await event.message.answer( + Texts.enter_modify_expiry, + reply_markup=CancelKeyboard(UserPanel.Callback(user_id=callback_data.user_id)).as_markup(), + ) + await add_to_messages_to_delete(state, msg) + + +@router.message(forms.ModifyUser.new_expiry) +async def modify_expiry_done(event: Message, state: FSMContext, db: AsyncSession, admin: AdminDetails): + await delete_messages(event, state) + await add_to_messages_to_delete(state, event) + try: + duration = int(event.text) + if duration < 0: + raise ValueError + except ValueError: + msg = await event.reply(text=Texts.duration_not_valid, reply_markup=CancelKeyboard().as_markup()) + await add_to_messages_to_delete(state, msg) + return + user_id = await state.get_value("user_id") + await state.clear() + await delete_messages(event, state) + try: + user = await user_operations.get_user_by_id(db, user_id, admin) + except ValueError: + return await event.answer(Texts.user_not_found) + if user.status == UserStatus.on_hold: + if duration: + modified_user = UserModify(on_hold_expire_duration=int(td(days=duration).total_seconds())) + else: + modified_user = UserModify(status=UserStatusModify.active, expire=0) + else: + modified_user = UserModify(expire=(dt.now() + td(days=duration)) if duration else 0) + user = await user_operations.modify_user(db, user.username, modified_user, admin) + groups = await user_operations.validate_all_groups(db, user) + await event.answer(Texts.user_details(user, groups), reply_markup=UserPanel(user).as_markup()) + + +@router.callback_query(UserPanel.Callback.filter(UserPanelAction.modify_data_limit == F.action)) +async def modify_data_limit(event: CallbackQuery, callback_data: UserPanel.Callback, state: FSMContext): + await state.set_state(forms.ModifyUser.new_data_limit) + await state.update_data(user_id=callback_data.user_id) + try: + await event.message.delete() + except TelegramBadRequest: + pass + msg = await event.message.answer( + Texts.enter_modify_data_limit, + reply_markup=CancelKeyboard(UserPanel.Callback(user_id=callback_data.user_id)).as_markup(), + ) + await add_to_messages_to_delete(state, msg) + + +@router.message(forms.ModifyUser.new_data_limit) +async def modify_data_limit_done(event: Message, state: FSMContext, db: AsyncSession, admin: AdminDetails): + await delete_messages(event, state) + await add_to_messages_to_delete(state, event) + try: + data_limit = float(event.text) + if data_limit < 0: + raise ValueError + except ValueError: + msg = await event.reply(text=Texts.data_limit_not_valid, reply_markup=CancelKeyboard().as_markup()) + await add_to_messages_to_delete(state, msg) + return + user_id = await state.get_value("user_id") + await state.clear() + await delete_messages(event, state) + try: + user = await user_operations.get_user_by_id(db, user_id, admin) + except ValueError: + return await event.answer(Texts.user_not_found) + modified_user = UserModify(data_limit=data_limit * 1024**3) + user = await user_operations.modify_user(db, user.username, modified_user, admin) + groups = await user_operations.validate_all_groups(db, user) + await event.answer(Texts.user_details(user, groups), reply_markup=UserPanel(user).as_markup()) + + +@router.callback_query(UserPanel.Callback.filter(UserPanelAction.modify_note == F.action)) +async def modify_note(event: CallbackQuery, callback_data: UserPanel.Callback, state: FSMContext): + await state.set_state(forms.ModifyUser.new_note) + await state.update_data(user_id=callback_data.user_id) + try: + await event.message.delete() + except TelegramBadRequest: + pass + msg = await event.message.answer( + Texts.enter_modify_note, + reply_markup=CancelKeyboard(UserPanel.Callback(user_id=callback_data.user_id)).as_markup(), + ) + await add_to_messages_to_delete(state, msg) + + +@router.message(forms.ModifyUser.new_note) +async def modify_note_done(event: Message, state: FSMContext, db: AsyncSession, admin: AdminDetails): + await delete_messages(event, state) + await add_to_messages_to_delete(state, event) + note = event.text + user_id = await state.get_value("user_id") + await state.clear() + await delete_messages(event, state) + try: + user = await user_operations.get_user_by_id(db, user_id, admin) + except ValueError: + return await event.answer(Texts.user_not_found) + modified_user = UserModify(note=note) + user = await user_operations.modify_user(db, user.username, modified_user, admin) + groups = await user_operations.validate_all_groups(db, user) + await event.answer(Texts.user_details(user, groups), reply_markup=UserPanel(user).as_markup()) + + +@router.callback_query(UserPanel.Callback.filter(UserPanelAction.disable == F.action)) +async def disable_user(event: CallbackQuery, admin: AdminDetails, db: AsyncSession, callback_data: UserPanel.Callback): + user = await user_operations.get_user_by_id(db, callback_data.user_id, admin) + modified_user = UserModify(**user.model_dump()) + modified_user.status = UserStatusModify.disabled + user = await user_operations.modify_user(db, user.username, modified_user, admin) + await event.answer(f"User {user.username} has been disabled.") + groups = await user_operations.validate_all_groups(db, user) + await event.message.edit_text(Texts.user_details(user, groups), reply_markup=UserPanel(user).as_markup()) + + +@router.callback_query(UserPanel.Callback.filter(UserPanelAction.delete == F.action)) +async def delete_user(event: CallbackQuery, admin: AdminDetails, db: AsyncSession, callback_data: UserPanel.Callback): + user = await user_operations.get_user_by_id(db, callback_data.user_id, admin) + await user_operations.remove_user(db, user.username, admin) + await event.answer(Texts.user_deleted(user.username)) + await event.message.edit_text(Texts.user_deleted(user.username), reply_markup=AdminPanel(admin.is_sudo).as_markup()) + + +@router.callback_query(UserPanel.Callback.filter(UserPanelAction.enable == F.action)) +async def enable_user(event: CallbackQuery, admin: AdminDetails, db: AsyncSession, callback_data: UserPanel.Callback): + user = await user_operations.get_user_by_id(db, callback_data.user_id, admin) + modified_user = UserModify(**user.model_dump()) + modified_user.status = UserStatusModify.active + user = await user_operations.modify_user(db, user.username, modified_user, admin) + await event.answer(Texts.user_enabled(user.username)) + groups = await user_operations.validate_all_groups(db, user) + await event.message.edit_text(Texts.user_details(user, groups), reply_markup=UserPanel(user).as_markup()) + + +@router.callback_query(UserPanel.Callback.filter(UserPanelAction.revoke_sub == F.action)) +async def revoke_sub(event: CallbackQuery, admin: AdminDetails, db: AsyncSession, callback_data: UserPanel.Callback): + user = await user_operations.get_user_by_id(db, callback_data.user_id, admin) + user = await user_operations.revoke_user_sub(db, user.username, admin) + await event.answer(Texts.user_sub_revoked(user.username)) + groups = await user_operations.validate_all_groups(db, user) + await event.message.edit_text(Texts.user_details(user, groups), reply_markup=UserPanel(user).as_markup()) + + +@router.callback_query(UserPanel.Callback.filter(UserPanelAction.reset_usage == F.action)) +async def reset_usage(event: CallbackQuery, admin: AdminDetails, db: AsyncSession, callback_data: UserPanel.Callback): + user = await user_operations.get_user_by_id(db, callback_data.user_id, admin) + user = await user_operations.reset_user_data_usage(db, user.username, admin) + await event.answer(Texts.user_reset_usage(user.username)) + groups = await user_operations.validate_all_groups(db, user) + await event.message.edit_text(Texts.user_details(user, groups), reply_markup=UserPanel(user).as_markup()) + + +@router.callback_query(UserPanel.Callback.filter(UserPanelAction.activate_next_plan == F.action)) +async def activate_next_plan( + event: CallbackQuery, admin: AdminDetails, db: AsyncSession, callback_data: UserPanel.Callback +): + user = await user_operations.get_user_by_id(db, callback_data.user_id, admin) + user = await user_operations.active_next_plan(db, user.username, admin) + await event.answer(Texts.user_next_plan_activated(user.username)) + groups = await user_operations.validate_all_groups(db, user) + await event.message.edit_text(Texts.user_details(user, groups), reply_markup=UserPanel(user).as_markup()) + + +@router.callback_query(UserPanel.Callback.filter(UserPanelAction.modify_with_template == F.action)) +async def modify_with_template(event: CallbackQuery, db: AsyncSession, callback_data: UserPanel.Callback): + templates = await user_templates.get_user_templates(db) + if not templates: + return await event.answer(Texts.there_is_no_template) + + await event.message.edit_text( + Texts.choose_a_template, reply_markup=ChooseTemplate(templates, user_id=callback_data.user_id).as_markup() + ) + + +@router.callback_query(ChooseTemplate.Callback.filter(F.username)) +async def modify_with_template_done( + event: CallbackQuery, db: AsyncSession, admin: AdminDetails, callback_data: ChooseTemplate.Callback +): + user = await user_operations.get_user_by_id(db, callback_data.user_id, admin) + user = await user_operations.modify_user_with_template( + db, + user.username, + ModifyUserByTemplate(user_template_id=callback_data.template_id), + admin, + ) + groups = await user_operations.validate_all_groups(db, user) + return await event.message.edit_text(Texts.user_details(user, groups), reply_markup=UserPanel(user).as_markup()) + + +@router.callback_query(AdminPanel.Callback.filter(AdminPanelAction.create_user_from_template == F.action)) +async def create_user_from_template(event: CallbackQuery, db: AsyncSession): + templates = await user_templates.get_user_templates(db) + if not templates: + return await event.answer(Texts.there_is_no_template) + await event.message.edit_text(Texts.choose_a_template, reply_markup=ChooseTemplate(templates).as_markup()) + + +@router.callback_query(ChooseTemplate.Callback.filter(~F.username)) +async def create_user_from_template_username( + event: CallbackQuery, state: FSMContext, callback_data: ChooseTemplate.Callback +): + try: + await event.message.delete() + except TelegramBadRequest: + pass + + await state.set_state(forms.CreateUserFromTemplate.username) + msg = await event.message.answer(Texts.enter_username, reply_markup=RandomUsername(with_template=True).as_markup()) + await state.update_data(template_id=callback_data.template_id, messages_to_delete=[msg.message_id]) + + +@router.message(forms.CreateUserFromTemplate.username) +@router.callback_query(RandomUsername.Callback.filter(F.with_template)) +async def create_user_from_template_choose( + event: Message | CallbackQuery, state: FSMContext, db: AsyncSession, admin: AdminDetails +): + await delete_messages(event, state) + + if isinstance(event, Message): + await add_to_messages_to_delete(state, event) + + username = event.text + try: + UserValidator.validate_username(username) + except ValueError as e: + msg = await event.reply(f"❌ {e}", reply_markup=RandomUsername(with_template=True).as_markup()) + await add_to_messages_to_delete(state, msg) + return + else: + await add_to_messages_to_delete(state, event.message) + username = "".join(random.choices("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", k=5)) + + template_id = await state.get_value("template_id") + template = await user_templates.get_validated_user_template(db, template_id) + + try: + actual_username = username + if template.username_prefix: + actual_username = template.username_prefix + username + if template.username_suffix: + actual_username = username + template.username_suffix + + await user_operations.get_validated_user(db, actual_username, admin) + if isinstance(event, Message): + msg = await event.reply( + Texts.username_already_exist, reply_markup=RandomUsername(with_template=True).as_markup() + ) + await add_to_messages_to_delete(state, msg) + else: + await event.answer(Texts.username_already_exist) + return + except ValueError: + pass + + await state.clear() + await delete_messages(event, state) + + user = await user_operations.create_user_from_template( + db, CreateUserFromTemplate(username=username, user_template_id=template_id), admin + ) + groups = await user_operations.validate_all_groups(db, user) + if isinstance(event, Message): + return await event.answer(Texts.user_details(user, groups), reply_markup=UserPanel(user).as_markup()) + else: + return await event.message.answer(Texts.user_details(user, groups), reply_markup=UserPanel(user).as_markup()) + + +@router.message(F.text.contains("/sub/")) +async def get_user_by_sub(event: Message, db: AsyncSession, admin: AdminDetails): + """get exact user by subscription token, otherwise not found""" + token = event.text.strip("/").split("/")[-1] + try: + db_user = await user_operations.get_validated_sub(db, token) + user = await user_operations.validate_user(db_user) + if user.admin and user.admin.username != admin.username and not admin.is_sudo: + return await event.reply(Texts.user_not_found) + except ValueError: + return await event.reply(Texts.user_not_found) + + groups = await user_operations.validate_all_groups(db, user) + await event.reply(Texts.user_details(user, groups), reply_markup=UserPanel(user).as_markup()) + + +@router.message(F.text) +@router.callback_query(UserPanel.Callback.filter(UserPanelAction.show == F.action)) +async def get_user(event: Message | CallbackQuery, admin: AdminDetails, db: AsyncSession, **kwargs): + """get exact user, otherwise not found""" + try: + if isinstance(event, Message): + user = await user_operations.get_user(db, event.text, admin) + else: + user = await user_operations.get_user_by_id(db, kwargs["callback_data"].user_id, admin) + except ValueError: + if isinstance(event, Message): + return await event.reply(Texts.user_not_found, reply_markup=InlineQuerySearch(event.text).as_markup()) + else: + return await event.answer(Texts.user_not_found) + + groups = await user_operations.validate_all_groups(db, user) + if isinstance(event, Message): + await event.reply(Texts.user_details(user, groups), reply_markup=UserPanel(user).as_markup()) + else: + await event.message.edit_text(Texts.user_details(user, groups), reply_markup=UserPanel(user).as_markup()) + + +@router.inline_query() +async def search_user(event: InlineQuery, admin: AdminDetails, db: AsyncSession): + search = await user_operations.get_users(db, admin, search=event.query.strip(), limit=50) + result = [ + InlineQueryResultArticle( + id=str(user.id), + title=f"{Texts.status_emoji(user.status)}{user.username}", + description=Texts.user_short_detail(user), + url=user.subscription_url if user.subscription_url.startswith("https://") else None, + input_message_content=InputTextMessageContent(message_text=user.username), + ) + for user in search.users + ] + if not result: + result = [ + InlineQueryResultArticle( + id="1", + title=Texts.user_not_found, + input_message_content=InputTextMessageContent(message_text="/start"), + ) + ] + try: + await event.answer(result, cache_time=5) + except TelegramBadRequest: # in case of query too old + pass + + +@router.callback_query() +async def debug(event: CallbackQuery): + await event.answer(event.data, show_alert=True) diff --git a/app/telegram/handlers/base.py b/app/telegram/handlers/base.py new file mode 100644 index 000000000..b4036e4cf --- /dev/null +++ b/app/telegram/handlers/base.py @@ -0,0 +1,60 @@ +from aiogram import Router, types, F +from aiogram.exceptions import TelegramBadRequest +from aiogram.filters import CommandStart +from sqlalchemy.ext.asyncio import AsyncSession + +from app.models.admin import AdminDetails +from app.telegram.keyboards.admin import AdminPanel +from app.telegram.keyboards.base import CancelAction, CancelKeyboard +from aiogram.fsm.context import FSMContext +from app.operation import OperatorType +from app.operation.system import SystemOperation +from app.telegram.utils.texts import Message as Texts +from app.telegram.utils.shared import delete_messages +from app.settings import telegram_settings + +system_operator = SystemOperation(OperatorType.TELEGRAM) + +router = Router(name="base") + + +@router.callback_query(CancelKeyboard.Callback.filter(CancelAction.cancel == F.action)) +@router.message(CommandStart()) +async def command_start_handler( + event: types.Message | types.CallbackQuery, + admin: AdminDetails | None, + state: FSMContext | None = None, + db: AsyncSession | None = None, +): + """ + This handler receives messages with `/start` command + """ + message = event.message if isinstance(event, types.CallbackQuery) else event + + if state is not None and (await state.get_state() is not None): + await delete_messages(event, state) + await state.clear() + + settings = await telegram_settings() + + if admin: + stats = await system_operator.get_system_stats(db, admin) + if isinstance(event, types.CallbackQuery): + try: + return await message.edit_text( + text=Texts.start(stats), + reply_markup=AdminPanel( + is_sudo=admin.is_sudo, + panel_url=settings.mini_app_web_url if settings.mini_app_login else None, + ).as_markup(), + ) + except TelegramBadRequest: + pass + await message.answer( + text=Texts.start(stats), + reply_markup=AdminPanel( + is_sudo=admin.is_sudo, panel_url=settings.mini_app_web_url if settings.mini_app_login else None + ).as_markup(), + ) + else: + await message.answer(f"Hello, {event.from_user.full_name}!") diff --git a/app/telegram/handlers/client/__init__.py b/app/telegram/handlers/client/__init__.py new file mode 100644 index 000000000..51db2c729 --- /dev/null +++ b/app/telegram/handlers/client/__init__.py @@ -0,0 +1,7 @@ +from aiogram import Router +from . import show_info + + +router = Router(name="client") + +router.include_router(show_info.router) diff --git a/app/telegram/handlers/client/show_info.py b/app/telegram/handlers/client/show_info.py new file mode 100644 index 000000000..25922dc69 --- /dev/null +++ b/app/telegram/handlers/client/show_info.py @@ -0,0 +1,42 @@ +from io import BytesIO + +from aiogram import Router, F +from aiogram.types import BufferedInputFile +from aiogram.types import Message +from sqlalchemy.ext.asyncio import AsyncSession + +from app.models.settings import ConfigFormat +from app.operation import OperatorType +from app.operation.subscription import SubscriptionOperation +from app.operation.user import UserOperation +from app.telegram.utils.texts import Message as Texts + +user_operations = UserOperation(OperatorType.TELEGRAM) +subscription_operations = SubscriptionOperation(OperatorType.TELEGRAM) + +router = Router(name="show_info") + + +@router.message(F.text) +async def get_user(event: Message, db: AsyncSession): + """get exact user, otherwise not found""" + token = event.text.strip("/").split("/")[-1] + try: + db_user = await user_operations.get_validated_sub(db, token) + user = await user_operations.validate_user(db_user) + user_with_inbounds = await subscription_operations.validated_user(db_user) + configs = (await subscription_operations.fetch_config(user_with_inbounds, ConfigFormat.links))[0] + except ValueError: + return await event.reply(Texts.user_not_found) + + if configs: + if len(configs) < 4085: # Telegram message limit (including formatting) + await event.reply(Texts.client_user_details(user)) + await event.answer(f"
{configs}
") + else: + file = BytesIO(configs.encode("utf-8")) + await event.answer_document( + BufferedInputFile(file.read(), f"{user.username}.txt"), caption=Texts.client_user_details(user) + ) + else: + await event.reply(Texts.client_user_details(user)) diff --git a/app/telegram/handlers/error_handler.py b/app/telegram/handlers/error_handler.py new file mode 100644 index 000000000..b4dce5e01 --- /dev/null +++ b/app/telegram/handlers/error_handler.py @@ -0,0 +1,40 @@ +from aiogram import Router, F +from aiogram.filters import ExceptionTypeFilter +from aiogram.fsm.context import FSMContext +from aiogram.types import ErrorEvent +from aiogram.exceptions import TelegramAPIError +from pydantic import ValidationError + +from app.utils.helpers import format_validation_error + +router = Router(name="error_handler") + + +@router.error(ExceptionTypeFilter(ValueError, ValidationError), F.update.message | F.update.callback_query) +async def handle_exception(event: ErrorEvent, state: FSMContext = None): + update = event.update + + if state: + chat_id = update.callback_query.message.chat.id if update.callback_query else update.message.chat.id + messages_to_delete = await state.get_value("messages_to_delete", []) + try: + await update.bot.delete_messages(chat_id, messages_to_delete) + except TelegramAPIError: + pass + await state.clear() + + error = "❌ Error: " + if isinstance(event.exception, ValidationError): + error += format_validation_error(event.exception) + else: + error += str(event.exception) + + if update.message: + msg = await update.message.answer(error) + if state: + await state.update_data(messages_to_delete=[msg.message_id]) + + if update.callback_query: + if len(error) > 200: + error = error[:197] + "..." + await update.callback_query.answer(error, show_alert=True) diff --git a/app/telegram/keyboards/__init__.py b/app/telegram/keyboards/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/app/telegram/keyboards/admin.py b/app/telegram/keyboards/admin.py new file mode 100644 index 000000000..31a97e598 --- /dev/null +++ b/app/telegram/keyboards/admin.py @@ -0,0 +1,49 @@ +from enum import Enum + +from aiogram.utils.keyboard import InlineKeyboardBuilder, WebAppInfo +from aiogram.filters.callback_data import CallbackData + +from app.telegram.utils.texts import Button as Texts + + +class AdminPanelAction(str, Enum): + sync_users = "sync_users" + refresh = "refresh" + create_user = "create_user" + create_user_from_template = "create_user_from_template" + bulk_actions = "bulk_actions" + + +class AdminPanel(InlineKeyboardBuilder): + class Callback(CallbackData, prefix="panel"): + action: AdminPanelAction + + def __init__(self, is_sudo: bool = False, panel_url: str = None, *args, **kwargs): + super().__init__(*args, **kwargs) + adjust = [] + if panel_url and panel_url.startswith("https://"): + self.button(text=Texts.open_panel, web_app=WebAppInfo(url=panel_url)) + adjust.append(1) + + self.button(text=Texts.refresh_data, callback_data=self.Callback(action=AdminPanelAction.refresh)) + if is_sudo: + self.button(text=Texts.sync_users, callback_data=self.Callback(action=AdminPanelAction.sync_users)) + self.button(text=Texts.users, switch_inline_query_current_chat="") + self.button(text=Texts.bulk_actions, callback_data=self.Callback(action=AdminPanelAction.bulk_actions)) + adjust = adjust + [2] * 2 + else: + self.button(text=Texts.users, switch_inline_query_current_chat="") + adjust = adjust + [1] * 2 + self.button(text=Texts.create_user, callback_data=self.Callback(action=AdminPanelAction.create_user)) + self.button( + text=Texts.create_user_from_template, + callback_data=self.Callback(action=AdminPanelAction.create_user_from_template), + ) + adjust = adjust + [1] * 2 + self.adjust(*adjust) + + +class InlineQuerySearch(InlineKeyboardBuilder): + def __init__(self, query: str, *args, **kwargs): + super().__init__(*args, **kwargs) + self.button(text=Texts.search, switch_inline_query_current_chat=query) diff --git a/app/telegram/keyboards/base.py b/app/telegram/keyboards/base.py new file mode 100644 index 000000000..93060a979 --- /dev/null +++ b/app/telegram/keyboards/base.py @@ -0,0 +1,19 @@ +from enum import StrEnum +from aiogram.utils.keyboard import InlineKeyboardBuilder +from aiogram.filters.callback_data import CallbackData + +from app.telegram.utils.texts import Button as Texts + + +class CancelAction(StrEnum): + cancel = "cancel" + + +class CancelKeyboard(InlineKeyboardBuilder): + def __init__(self, action: CallbackData = CancelAction.cancel, *args, **kwargs): + super().__init__(*args, **kwargs) + self.button(text=Texts.cancel, callback_data=action or self.Callback()) + self.adjust(1, 1) + + class Callback(CallbackData, prefix=""): + action: CancelAction = CancelAction.cancel diff --git a/app/telegram/keyboards/bulk_actions.py b/app/telegram/keyboards/bulk_actions.py new file mode 100644 index 000000000..029aa1c00 --- /dev/null +++ b/app/telegram/keyboards/bulk_actions.py @@ -0,0 +1,33 @@ +from enum import Enum + +from aiogram.utils.keyboard import InlineKeyboardBuilder +from aiogram.filters.callback_data import CallbackData + +from app.telegram.keyboards.base import CancelKeyboard, CancelAction +from app.telegram.utils.texts import Button as Texts + + +class BulkAction(str, Enum): + delete_expired = "delete_expired" + modify_expiry = "modify_expiry" + modify_data_limit = "modify_data_limit" + + +class BulkActionPanel(InlineKeyboardBuilder): + class Callback(CallbackData, prefix="bulk"): + action: BulkAction + amount: str = "" + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + self.button(text=Texts.delete_expired, callback_data=self.Callback(action=BulkAction.delete_expired)) + self.button(text=Texts.modify_expiry, callback_data=self.Callback(action=BulkAction.modify_expiry)) + self.button(text=Texts.modify_data_limit, callback_data=self.Callback(action=BulkAction.modify_data_limit)) + + self.button( + text=Texts.back, + callback_data=CancelKeyboard.Callback(action=CancelAction.cancel), + ) + + self.adjust(1, repeat=True) diff --git a/app/telegram/keyboards/confim_action.py b/app/telegram/keyboards/confim_action.py new file mode 100644 index 000000000..fe6201c57 --- /dev/null +++ b/app/telegram/keyboards/confim_action.py @@ -0,0 +1,16 @@ +from aiogram.utils.keyboard import InlineKeyboardBuilder +from aiogram.filters.callback_data import CallbackData + +from app.telegram.utils.texts import Button as Texts + + +class ConfirmAction(InlineKeyboardBuilder): + class Callback(CallbackData, prefix="confirm", sep="|"): + action: str + cancel: str + + def __init__(self, confirm_action: str, cancel_action: str, *args, **kwargs): + super().__init__(*args, **kwargs) + self.button(text=Texts.confirm, callback_data=confirm_action) + self.button(text=Texts.cancel, callback_data=cancel_action) + self.adjust(2, repeat=True) diff --git a/app/telegram/keyboards/group.py b/app/telegram/keyboards/group.py new file mode 100644 index 000000000..d71361bdd --- /dev/null +++ b/app/telegram/keyboards/group.py @@ -0,0 +1,41 @@ +from enum import StrEnum +from aiogram.utils.keyboard import InlineKeyboardBuilder +from app.models.group import GroupsResponse +from aiogram.filters.callback_data import CallbackData + +from app.telegram.keyboards.base import CancelKeyboard, CancelAction +from app.telegram.keyboards.user import UserPanel +from app.telegram.utils.texts import Button as Texts + + +class SelectGroupAction(StrEnum): + select = "select" + create = "create" + modify = "modify" + + +class GroupsSelector(InlineKeyboardBuilder): + def __init__(self, groups: GroupsResponse, selected_groups: list[int] = None, user_id: int = 0, *args, **kwargs): + selected_groups = selected_groups or [] + super().__init__(*args, **kwargs) + for group in groups.groups: + self.button( + text=("✅" if group.id in selected_groups else "❌") + f" {group.name}", + callback_data=self.Callback(group_id=group.id, user_id=user_id), + ) + self.button( + text=Texts.cancel, + callback_data=UserPanel.Callback(user_id=user_id) + if user_id + else CancelKeyboard.Callback(action=CancelAction.cancel), + ) + self.button( + text=Texts.done, + callback_data=self.Callback(action=SelectGroupAction.modify if user_id else SelectGroupAction.create), + ) + self.adjust(*[1 for i in groups.groups], 2) + + class Callback(CallbackData, prefix="select_group"): + action: SelectGroupAction = SelectGroupAction.select + group_id: int = 0 + user_id: int = 0 diff --git a/app/telegram/keyboards/user.py b/app/telegram/keyboards/user.py new file mode 100644 index 000000000..23854c460 --- /dev/null +++ b/app/telegram/keyboards/user.py @@ -0,0 +1,157 @@ +from enum import Enum +from typing import List + +from aiogram.types import CopyTextButton +from aiogram.utils.keyboard import InlineKeyboardBuilder +from aiogram.filters.callback_data import CallbackData + +from app.models.user import UserResponse, UserStatus +from app.models.user_template import UserTemplate +from app.telegram.utils.texts import Button as Texts +from .base import CancelAction, CancelKeyboard + +from .confim_action import ConfirmAction + + +class UserPanelAction(str, Enum): + show = "show" + disable = "disable" + enable = "enable" + delete = "delete" + revoke_sub = "revoke_sub" + reset_usage = "reset_usage" + activate_next_plan = "activate_next_plan" + modify_with_template = "modify_with_template" + modify_data_limit = "modify_data_limit" + modify_expiry = "modify_expiry" + modify_note = "modify_note" + modify_groups = "modify_groups" + + +class UserPanel(InlineKeyboardBuilder): + class Callback(CallbackData, prefix="user"): + user_id: int + action: UserPanelAction = UserPanelAction.show + + def __init__(self, user: UserResponse, *args, **kwargs): + super().__init__(*args, **kwargs) + if user.status == UserStatus.active: + self.button( + text=Texts.disable, + callback_data=ConfirmAction.Callback( + action=self.Callback(action=UserPanelAction.disable, user_id=user.id).pack(), + cancel=self.Callback(user_id=user.id).pack(), + ), + ) + else: + self.button( + text=Texts.enable, + callback_data=ConfirmAction.Callback( + action=self.Callback(action=UserPanelAction.enable, user_id=user.id).pack(), + cancel=self.Callback(user_id=user.id).pack(), + ), + ) + self.button( + text=Texts.delete, + callback_data=ConfirmAction.Callback( + action=self.Callback(action=UserPanelAction.delete, user_id=user.id).pack(), + cancel=self.Callback(user_id=user.id).pack(), + ), + ) + self.button( + text=Texts.revoke_sub, + callback_data=ConfirmAction.Callback( + action=self.Callback(action=UserPanelAction.revoke_sub, user_id=user.id).pack(), + cancel=self.Callback(user_id=user.id).pack(), + ), + ) + self.button( + text=Texts.reset_usage, + callback_data=ConfirmAction.Callback( + action=self.Callback(action=UserPanelAction.reset_usage, user_id=user.id).pack(), + cancel=self.Callback(user_id=user.id).pack(), + ), + ) + self.button( + text=Texts.modify_data_limit, + callback_data=self.Callback(action=UserPanelAction.modify_data_limit, user_id=user.id), + ) + self.button( + text=Texts.modify_expiry, + callback_data=self.Callback(action=UserPanelAction.modify_expiry, user_id=user.id), + ) + self.button( + text=Texts.modify_note, callback_data=self.Callback(action=UserPanelAction.modify_note, user_id=user.id) + ) + self.button( + text=Texts.modify_groups, callback_data=self.Callback(action=UserPanelAction.modify_groups, user_id=user.id) + ) + if not user.next_plan: + self.button( + text=Texts.activate_next_plan, + callback_data=ConfirmAction.Callback( + action=self.Callback(action=UserPanelAction.activate_next_plan, user_id=user.id).pack(), + cancel=self.Callback(user_id=user.id).pack(), + ), + ) + + self.button( + text=Texts.modify_with_template, + callback_data=self.Callback(action=UserPanelAction.modify_with_template, user_id=user.id), + ) + + self.button(text=Texts.subscription_url, copy_text=CopyTextButton(text=user.subscription_url)) + + self.button( + text=Texts.back, + callback_data=CancelKeyboard.Callback(action=CancelAction.cancel), + ) + + self.adjust(2, 2, 2, 2, 1, 1) + + +class ChooseStatus(InlineKeyboardBuilder): + class Callback(CallbackData, prefix="user"): + status: str + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.button(text=Texts.on_hold, callback_data=self.Callback(status=UserStatus.on_hold.value)) + self.button(text=Texts.enable, callback_data=self.Callback(status=UserStatus.active.value)) + self.adjust(2, repeat=True) + + +class ChooseTemplate(InlineKeyboardBuilder): + class Callback(CallbackData, prefix="choose_template"): + template_id: int + user_id: int = 0 # in case choose template for modify + + def __init__(self, templates: List[UserTemplate], user_id: int = 0, *args, **kwargs): + super().__init__(*args, **kwargs) + + for template in templates: + self.button( + text=template.name, + callback_data=self.Callback(template_id=template.id, user_id=user_id).pack(), + ) + + self.button( + text=Texts.back, + callback_data=UserPanel.Callback(user_id=user_id).pack(), + ) + self.adjust(1, repeat=True) + + +class RandomUsername(InlineKeyboardBuilder): + class Callback(CallbackData, prefix="random_username"): + with_template: bool = False + + def __init__(self, with_template: bool = False, *args, **kwargs): + super().__init__(*args, **kwargs) + + self.button(text=Texts.random_username, callback_data=self.Callback(with_template=with_template)) + self.button( + text=Texts.back, + callback_data=CancelKeyboard.Callback(action=CancelAction.cancel), + ) + self.adjust(1, repeat=True) diff --git a/app/telegram/middlewares/__init__.py b/app/telegram/middlewares/__init__.py new file mode 100644 index 000000000..c4936c2d9 --- /dev/null +++ b/app/telegram/middlewares/__init__.py @@ -0,0 +1,9 @@ +from aiogram import Dispatcher +from aiogram.utils.chat_action import ChatActionMiddleware + +from .acl import ACLMiddleware + + +def setup_middlewares(dp: Dispatcher) -> None: + dp.update.outer_middleware(ACLMiddleware()) + dp.message.middleware.register(ChatActionMiddleware()) diff --git a/app/telegram/middlewares/acl.py b/app/telegram/middlewares/acl.py new file mode 100644 index 000000000..631166b61 --- /dev/null +++ b/app/telegram/middlewares/acl.py @@ -0,0 +1,36 @@ +from typing import Any, Awaitable, Callable, Dict + +from aiogram import BaseMiddleware +from aiogram.types import Update + +from app.db import GetDB +from app.db.crud.admin import get_admin_by_telegram_id +from app.models.admin import AdminDetails +from app.settings import telegram_settings +from app.models.settings import Telegram + + +class ACLMiddleware(BaseMiddleware): + async def __call__( + self, handler: Callable[[Update, Dict[str, Any]], Awaitable[Any]], event: Update, data: Dict[str, Any] + ) -> Any: + message_obj = event.message or event.callback_query or event.inline_query + user_id = message_obj.from_user.id + async with GetDB() as db: + settings: Telegram = await telegram_settings() + admin = await get_admin_by_telegram_id(db, user_id) + if admin: + if admin.is_disabled: + if settings.for_admins_only: + return + data["admin"] = None + else: + admin = AdminDetails.model_validate(admin) + data["admin"] = admin + else: + if settings.for_admins_only: + return + data["admin"] = None + + data["db"] = db + return await handler(event, data) diff --git a/app/telegram/utils/filters.py b/app/telegram/utils/filters.py new file mode 100644 index 000000000..b3fda4272 --- /dev/null +++ b/app/telegram/utils/filters.py @@ -0,0 +1,13 @@ +from aiogram.filters import Filter + +from app.models.admin import AdminDetails + + +class IsAdminFilter(Filter): + async def __call__(self, _, admin: AdminDetails | None = None) -> bool: + return bool(admin) + + +class IsAdminSUDO(Filter): + async def __call__(self, _, admin: AdminDetails | None = None) -> bool: + return admin.is_sudo if admin else False diff --git a/app/telegram/utils/forms.py b/app/telegram/utils/forms.py new file mode 100644 index 000000000..7531ee519 --- /dev/null +++ b/app/telegram/utils/forms.py @@ -0,0 +1,29 @@ +from aiogram.fsm.state import State, StatesGroup + + +class CreateUser(StatesGroup): + username = State() + data_limit = State() + expire = State() + status = State() + on_hold_timeout = State() + group_ids = State() + + +class CreateUserFromTemplate(StatesGroup): + username = State() + + +class DeleteExpired(StatesGroup): + expired_before = State() + + +class BulkModify(StatesGroup): + expiry = State() + data_limit = State() + + +class ModifyUser(StatesGroup): + new_data_limit = State() + new_expiry = State() + new_note = State() diff --git a/app/telegram/utils/shared.py b/app/telegram/utils/shared.py new file mode 100644 index 000000000..aaaa22d8a --- /dev/null +++ b/app/telegram/utils/shared.py @@ -0,0 +1,39 @@ +import math +from typing import List +from aiogram.exceptions import TelegramAPIError +from aiogram.fsm.context import FSMContext +from aiogram.types import CallbackQuery, Message + + +def readable_size(size_bytes: int): + if int(size_bytes) == 0: + return "0 Bytes" + + is_negative = False + if size_bytes < 0: + size_bytes = size_bytes * -1 + is_negative = True + + size_name = ("Bytes", "KB", "MB", "GB", "TB", "PT") + i = int(math.floor(math.log(size_bytes, 1024))) + s = round(size_bytes / (1024**i), 1) + return f"{'-' if is_negative else ''}{int(s) if s.is_integer() else s} {size_name[i]}" + + +async def add_to_messages_to_delete(state: FSMContext, *messages: Message): + messages_to_delete = await state.get_value("messages_to_delete", []) + for message in messages: + messages_to_delete.append(message.message_id) + await state.update_data(messages_to_delete=messages_to_delete) + + +async def delete_messages(event: Message | CallbackQuery, state: FSMContext = None, message_ids: List[int] = None): + message_ids = message_ids or [] + if state: + message_ids += await state.get_value("messages_to_delete", []) + + chat_id = event.chat.id if isinstance(event, Message) else event.message.chat.id + try: + await event.bot.delete_messages(chat_id, message_ids) + except TelegramAPIError: + pass diff --git a/app/telegram/utils/texts.py b/app/telegram/utils/texts.py new file mode 100644 index 000000000..6610d1986 --- /dev/null +++ b/app/telegram/utils/texts.py @@ -0,0 +1,263 @@ +from aiogram.utils.formatting import html_decoration + +from app.models.group import Group +from app.models.user import UserResponse, UserStatus +from app.models.system import SystemStats +from app.telegram.utils.shared import readable_size +from app.subscription.share import STATUS_EMOJIS + +from datetime import datetime as dt, timedelta as td, timezone as tz +from html import escape + + +b = html_decoration.bold +c = html_decoration.code +i = html_decoration.italic +u = html_decoration.underline +ln = html_decoration.link +p = html_decoration.pre +pl = html_decoration.pre_language +sp = html_decoration.spoiler +st = html_decoration.strikethrough +bl = html_decoration.blockquote +ebl = html_decoration.expandable_blockquote + + +class Button: + modify_groups = "👥 Modify Groups" + subscription_url = "🔗 Subscription URL" + modify_note = "📝 Modify Note" + random_username = "🎲 Random Username" + modify_data_limit = "📶 Modify Data Limit" + modify_expiry = "📅 Modify Expiry" + delete_expired = "⌛ Delete Expired" + bulk_actions = "🔧 Bulk Actions" + open_panel = "🎛 Open Panel" + done = "✅ Done" + search = "🔎 Search" + enable = "✅ Enable" + disable = "❌ Disable" + revoke_sub = "📵 Revoke Sub" + reset_usage = "🔄 Reset Usage" + delete = "🗑 Delete" + activate_next_plan = "☑ Activate Next Plan" + confirm = "✅ Confirm" + cancel = "❌ Cancel" + create_user = "👤 Create User" + create_user_from_template = "👤 Create User From Template" + modify_with_template = "📦 Modify with Template" + sync_users = "🔄 Sync Users" + refresh_data = "♻ Refresh" + users = "👥 Users" + on_hold = "🔘 On-Hold" + back = "🔙 Back" + + +class Message: + enter_modify_note = "📝 Enter new Note:" + enter_modify_data_limit = "📶 Enter new Data Limit (GB):\nSend 0 for unlimited." + enter_modify_expiry = "📅 Enter new Expiry (days):\nSend 0 for unlimited." + enter_bulk_data_limit = "📶 Enter data limit change (GB):\nPositive and Negative values are allowed." + enter_bulk_expiry = "📅 Enter Expiry change (days):\nPositive and Negative values are allowed." + enter_expire_before = "📅 Delete Users expired before (days):\nSend 0 for all." + choose_action = "🔧 Choose an Action:" + there_is_no_template = "❌ There is no Template!" + user_not_found = "❌ User not found!" + confirm = "⚠ Are you sure you want to proceed?" + enter_username = "🗣 Enter new user's Username:" + username_already_exist = "❌ Username already exists." + enter_data_limit = "🌐 Enter Data Limit (GB):\nSend 0 for unlimited." + data_limit_not_valid = "❌ Data limit is not valid." + enter_duration = "📅 Enter duration (days):\nSend 0 for unlimited." + duration_not_valid = "❌ Duration is not valid." + choose_status = "Do you want to enable it or keep it on-hold?" + enter_on_hold_timeout = "🔌 Enter On-Hold timeout duration (days):\nSend 0 for Never." + select_groups = "👥 Select Groups:" + select_a_group = "❌ You have to select at least one group." + canceled = "💢 Operation Canceled" + user_created = "✅ User created successfully" + refreshed = "♻ Refreshed successfully" + syncing = "🔄 Syncing..." + synced = "✅ Users successfully Synced" + choose_a_template = "📦 Choose a Template:" + + @staticmethod + def start(stats: SystemStats): + memory_percentage = int(stats.mem_used / stats.mem_total * 100) + return f"""\ +⚙ {b("PasarGuard Version")}: {c(stats.version)} + +📊 {b("CPU Usage")}: {c(stats.cpu_usage)} % +🎛 {b("CPU Cores")}: {c(stats.cpu_cores)} +📈 {b("Memory")}: {c(readable_size(stats.mem_used))} / {c(readable_size(stats.mem_total))} ({c(memory_percentage)} %) +🌐 {b("Total Data Usage")}: {c(readable_size(stats.outgoing_bandwidth + stats.incoming_bandwidth))} + +👥 {b("Total Users")}: {c(stats.total_user)} +🟢 {b("Online Users")}: {c(stats.online_users)} +🔘 {b("Active Users")}: {c(stats.active_users)} +🔌 {b("On-Hold Users")}: {c(stats.on_hold_users)} +⌛ {b("Expired Users")}: {c(stats.expired_users)} +🪫 {b("Limited Users")}: {c(stats.limited_users)} +🔴 {b("Disabled Users")}: {c(stats.disabled_users)} +""" + + @staticmethod + def status_emoji(status: UserStatus): + return STATUS_EMOJIS[status.value] + + @staticmethod + def user_details(user: UserResponse, groups: list[Group]) -> str: + data_limit = c(readable_size(user.data_limit)) if user.data_limit else "∞" + used_traffic = c(readable_size(user.used_traffic)) + expire = user.expire.strftime("%Y-%m-%d %H:%M") if user.expire else "∞" + days_left = (user.expire - dt.now(tz.utc)).days if user.expire else "∞" + on_hold_timeout = user.on_hold_timeout.strftime("%Y-%m-%d %H:%M") if user.on_hold_timeout else "-" + on_hold_expire_duration = td(seconds=user.on_hold_expire_duration).days if user.on_hold_expire_duration else "0" + online_at = bl(user.online_at.strftime("%Y-%m-%d %H:%M:%S")) if user.online_at else "-" + admin = ln(user.admin.username, f"tg://user?id={user.admin.telegram_id}") + note = bl(escape(user.note)) if user.note else "-" + emojy_status = Message.status_emoji(user.status) + groups = ", ".join([g.name for g in groups]) + + if user.status == UserStatus.on_hold: + expire_text = f"{b('On Hold Duration: ')} {c(on_hold_expire_duration)} days\n" + expire_text += f"{b('On Hold Timeout:')} {c(on_hold_timeout)}" + else: + expire_text = f"{b('Expire: ')} {c(expire)}\n" + expire_text += f"{b('Days left: ')} {c(days_left)}" + + return f"""\ +👤 {b("User Information")} + +{b("Status:")} {emojy_status} {user.status.value.replace("_", " ").title()} +{b("Username:")} {c(user.username)} + +{b("Data Limit:")} {data_limit} +{b("Used Traffic:")} {used_traffic} +{b("Data Limit Strategy:")} {user.data_limit_reset_strategy.value.replace("_", " ").title()} +{expire_text} +{b("Online At:")} {online_at} +{b("Groups:")} {c(groups)} +{b("Admin:")} {admin} +{b("Note:")} {note}""" + + @staticmethod + def user_short_detail(user: UserResponse) -> str: + data_limit = readable_size(user.data_limit) if user.data_limit else "∞" + used_traffic = readable_size(user.used_traffic) + if user.status == UserStatus.on_hold: + expiry = int(user.on_hold_expire_duration / 24 / 60 / 60) + else: + expiry = (user.expire - dt.now(tz.utc)).days if user.expire else "∞" + return f"{used_traffic} / {data_limit} | {expiry} days\n{user.note or ''}" + + @classmethod + def client_user_details(cls, user: UserResponse) -> str: + data_limit = c(readable_size(user.data_limit)) if user.data_limit else "∞" + used_traffic = c(readable_size(user.used_traffic)) + expire = user.expire.strftime("%Y-%m-%d %H:%M") if user.expire else "∞" + days_left = (user.expire - dt.now(tz.utc)).days if user.expire else "∞" + online_at = bl(user.online_at.strftime("%Y-%m-%d %H:%M:%S")) if user.online_at else "-" + emojy_status = cls.status_emoji(user.status) + + return f"""\ +👤 {b("User Information")} + +{b("Status:")} {emojy_status} {user.status.value.replace("_", " ").title()} +{b("Username:")} {c(user.username)} +{b("Data Limit:")} {data_limit} +{b("Used Traffic:")} {used_traffic} +{b("Data Limit Strategy:")} {user.data_limit_reset_strategy.value.replace("_", " ").title()} +{b("Expire:")} {c(expire)} +{b("Days left:")} {c(days_left)} +{b("Online At:")} {online_at} +{b("Subscription URL:")} +{p(user.subscription_url)} +""" + + @staticmethod + def confirm_disable_user(username: str) -> str: + return f"⚠ Are you sure you want to {b('Disable')} {c(username)}?" + + @staticmethod + def confirm_enable_user(username: str) -> str: + return f"⚠ Are you sure you want to {b('Enable')} {c(username)}?" + + @staticmethod + def confirm_delete_user(username: str) -> str: + return f"⚠ Are you sure you want to {b('Delete')} {c(username)}?" + + @staticmethod + def confirm_revoke_sub(username: str) -> str: + return f"⚠ Are you sure you want to {b('Revoke Subscription')} of {c(username)}?" + + @staticmethod + def confirm_reset_usage(username: str) -> str: + return f"⚠ Are you sure you want to {b('Reset Usage')} of {c(username)}?" + + @staticmethod + def confirm_activate_next_plan(username: str) -> str: + return f"⚠ Are you sure you want to {b('Activate Next Plan')} for {c(username)}?" + + @classmethod + def confirm_delete_expired(cls, expired_before_days: int | str) -> str: + return f"⚠ Are you sure you want to delete all users expired before {expired_before_days} days ago?" + + @staticmethod + def user_disabled(username: str) -> str: + return f"✅ {username} has been successfully disabled." + + @staticmethod + def user_enabled(username: str) -> str: + return f"✅ {username} has been successfully enabled." + + @staticmethod + def user_deleted(username: str) -> str: + return f"✅ {username} has been successfully deleted." + + @staticmethod + def user_sub_revoked(username: str) -> str: + return f"✅ {username}'s subscription has been successfully revoked." + + @staticmethod + def user_reset_usage(username: str) -> str: + return f"✅ {username}'s usage has been successfully reset." + + @staticmethod + def user_next_plan_activated(username: str) -> str: + return f"✅ {username}'s next plan has been successfully activated." + + @classmethod + def users_deleted(cls, count): + return f"✅ {count} users successfully deleted." + + @classmethod + def confirm_modify_expiry(cls, days: int) -> str: + if days > 0: + return f"⚠ Are you sure you want to extend users expiry by {c(days)} days?" + else: + return f"⚠ Are you sure you want to subtract {c(abs(days))} days from users expiry?" + + @classmethod + def users_expiry_changed(cls, result: int, amount: int): + if amount > 0: + return f"✅ {result} users successfully extended by {amount} days." + else: + return f"✅ {result} users successfully subtracted by {abs(amount)} days." + + @classmethod + def confirm_modify_data_limit(cls, amount: int) -> str: + if amount > 0: + return f"⚠ Are you sure you want to increase users data limit by {c(amount)} GB?" + else: + return f"⚠ Are you sure you want to decrease users data limit by {c(abs(amount))} GB?" + + @classmethod + def users_data_limit_changed(cls, result: int, amount: int): + if amount > 0: + return f"✅ {result} users successfully increased by {amount} GB." + else: + return f"✅ {result} users successfully decreased by {abs(amount)} GB." + + +__all__ = ["Button", "Message"] diff --git a/app/templates/__init__.py b/app/templates/__init__.py new file mode 100644 index 000000000..02a9d0b54 --- /dev/null +++ b/app/templates/__init__.py @@ -0,0 +1,21 @@ +from datetime import datetime as dt, timezone as tz +from typing import Union + +import jinja2 + +from config import CUSTOM_TEMPLATES_DIRECTORY + +from .filters import CUSTOM_FILTERS + +template_directories = ["app/templates"] +if CUSTOM_TEMPLATES_DIRECTORY: + # User's templates have priority over default templates + template_directories.insert(0, CUSTOM_TEMPLATES_DIRECTORY) + +env = jinja2.Environment(loader=jinja2.FileSystemLoader(template_directories)) +env.filters.update(CUSTOM_FILTERS) +env.globals["now"] = lambda: dt.now(tz.utc) + + +def render_template(template: str, context: Union[dict, None] = None) -> str: + return env.get_template(template).render(context or {}) diff --git a/app/templates/clash/README.md b/app/templates/clash/README.md new file mode 100644 index 000000000..c8751d3d6 --- /dev/null +++ b/app/templates/clash/README.md @@ -0,0 +1,42 @@ +# Clash Template + +## Usage + +- Can be used to send completely prepared config to users depend on your usage. + +## Config Template + +- With the config template, you can change things like routing and rules. + +## How To Use + +First of all, you need to set a directory for all of your templates (home, subscription page, etc.). + +```shell +CUSTOM_TEMPLATES_DIRECTORY="/var/lib/marzban/templates/" +``` + +Make sure you put all of your templates in this folder.\ +If you are using Docker, make sure Docker has access to this folder.\ +Then, we need to make a directory for our Clash template. + +```shell +mkdir /var/lib/marzban/templates/v2ray +``` + +After that, put your templates (config and settings) in the directory.\ +Now, change these variables with your files' names. + +```shell +CLASH_SUBSCRIPTION_TEMPLATE = "clash/default.yml") +``` + +Now, restart your Marzban and enjoy. + +If you have already changed your env variables, and you want to just update the template files, there is no need to restart Marzban. + +## Docs + +you can use these docs to find out how to modify template files + +[Mihomo Docs](https://wiki.metacubex.one/en/) diff --git a/app/templates/clash/default.yml b/app/templates/clash/default.yml new file mode 100644 index 000000000..bb7126db3 --- /dev/null +++ b/app/templates/clash/default.yml @@ -0,0 +1,13 @@ +mode: Global +port: 7890 + +{{ conf | except("proxy-groups", "port", "mode") | yaml }} + +proxy-groups: +- name: '♻️ Automatic' + type: 'url-test' + url: 'http://www.gstatic.com/generate_204' + interval: 300 + proxies: + {{ proxy_remarks | yaml | indent(2) }} +{{ conf.get("proxy-groups", []) | yaml }} diff --git a/app/templates/filters.py b/app/templates/filters.py new file mode 100644 index 000000000..b9b01da2c --- /dev/null +++ b/app/templates/filters.py @@ -0,0 +1,41 @@ +import os +from datetime import datetime + +import yaml + +from app.utils.system import readable_size + + +def to_yaml(obj): + if not obj: + return "" + + return yaml.dump(obj, allow_unicode=True, indent=2) + + +def exclude_keys(obj, *target_keys): + return {key: val for key, val in obj.items() if key not in target_keys} + + +def only_keys(obj, *target_keys): + return {key: val for key, val in obj.items() if key in target_keys} + + +def datetimeformat(dt): + if isinstance(dt, int): + dt = datetime.fromtimestamp(dt) + formatted_datetime = dt.strftime("%Y-%m-%d %H:%M:%S") + return formatted_datetime + + +def env_override(value, key): + return os.getenv(key, value) + + +CUSTOM_FILTERS = { + "yaml": to_yaml, + "except": exclude_keys, + "only": only_keys, + "datetime": datetimeformat, + "bytesformat": readable_size, +} diff --git a/app/templates/home/index.html b/app/templates/home/index.html new file mode 100644 index 000000000..1bb31bc69 --- /dev/null +++ b/app/templates/home/index.html @@ -0,0 +1,1942 @@ + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file diff --git a/app/templates/singbox/README.md b/app/templates/singbox/README.md new file mode 100644 index 000000000..d73ee8be8 --- /dev/null +++ b/app/templates/singbox/README.md @@ -0,0 +1,42 @@ +# Sing-box Template + +## Usage + +- Can be used to send completely prepared config to users depend on your usage. + +## Config Template + +- With the config template, you can change things like routing and rules. + +## How To Use + +First of all, you need to set a directory for all of your templates (home, subscription page, etc.). + +```shell +CUSTOM_TEMPLATES_DIRECTORY="/var/lib/marzban/templates/" +``` + +Make sure you put all of your templates in this folder.\ +If you are using Docker, make sure Docker has access to this folder.\ +Then, we need to make a directory for our Sing-box template. + +```shell +mkdir /var/lib/marzban/templates/sing-box +``` + +After that, put your templates (config and settings) in the directory.\ +Now, change these variables with your files' names. + +```shell +SINGBOX_SUBSCRIPTION_TEMPLATE="singbox/default.json" +``` + +Now, restart your Marzban and enjoy. + +If you have already changed your env variables, and you want to just update the template files, there is no need to restart Marzban. + +## Docs + +you can use sing-box official documentation to find out how to modify template files + +[Sing-Box documentation](https://sing-box.sagernet.org/configuration/) diff --git a/app/templates/singbox/default.json b/app/templates/singbox/default.json new file mode 100644 index 000000000..e5594628d --- /dev/null +++ b/app/templates/singbox/default.json @@ -0,0 +1,85 @@ +{ + "log": { + "level": "warn", + "timestamp": false + }, + "dns": { + "servers": [ + { + "tag": "dns-remote", + "address": "1.1.1.2", + "detour": "proxy" + }, + { + "tag": "dns-local", + "address": "local", + "detour": "direct" + } + ], + "rules": [ + { + "outbound": "any", + "server": "dns-local" + } + ], + "final": "dns-remote" + }, + "inbounds": [ + { + "type": "tun", + "tag": "tun-in", + "interface_name": "sing-tun", + "address": [ + "172.19.0.1/30", + "fdfe:dcba:9876::1/126" + ], + "auto_route": true, + "route_exclude_address": [ + "192.168.0.0/16", + "10.0.0.0/8", + "169.254.0.0/16", + "172.16.0.0/12", + "fe80::/10", + "fc00::/7" + ] + } + ], + "outbounds": [ + { + "type": "selector", + "tag": "proxy", + "outbounds": null, + "interrupt_exist_connections": true + }, + { + "type": "urltest", + "tag": "Best Latency", + "outbounds": null + }, + { + "type": "direct", + "tag": "direct" + } + ], + "route": { + "rules": [ + { + "inbound": "tun-in", + "action": "sniff" + }, + { + "protocol": "dns", + "action": "hijack-dns" + } + ], + "final": "proxy", + "auto_detect_interface": true, + "override_android_vpn": true + }, + "experimental": { + "cache_file": { + "enabled": true, + "store_rdrc": true + } + } +} diff --git a/app/templates/subscription/index.html b/app/templates/subscription/index.html new file mode 100644 index 000000000..d5ab9d210 --- /dev/null +++ b/app/templates/subscription/index.html @@ -0,0 +1,203 @@ + + + + Subscription Information + + + + + +

User Information

+

Username: {{ user.username }}

+

+ Status: + {{ user.status.value }} +

+

+ Data Limit: {% if not user.data_limit %}∞{% else %}{{ + user.data_limit | bytesformat }}{% endif %} +

+

+ Data Used: {{ user.used_traffic | bytesformat }}{% if + user.data_limit_reset_strategy != 'no_reset' %} (resets every {{ + user.data_limit_reset_strategy.value }}){% endif %} +

+

+ {% if user.status.value == 'on_hold' %} + On Hold For: {% if not user.on_hold_expire_duration %}∞{% else %}{{ (user.on_hold_expire_duration / 86400) | int }} days{% endif %} +

+ On Hold Until: {% if user.on_hold_timeout %}{{ user.on_hold_timeout | datetime }}{% else %}∞{% endif %} +

+ {% else %} + Expiration Date: {% if not user.expire %} ∞ {% else %} {% set + current_datetime = now() %} {% set remaining_days = ((user.expire - + current_datetime).days) %} {{ user.expire | datetime }} ({{ + remaining_days | int }} days remaining) {% endif %} + {% endif %} +

+ + {% if user.status in ('active','on_hold') %} +

Links:

+
    + {% for link in links %} +
  • + + + +
  • + {% endfor %} +
+ +
+
+ +
+
+
+ {% endif %} + + + + diff --git a/app/templates/user_agent/default.json b/app/templates/user_agent/default.json new file mode 100644 index 000000000..abb85644c --- /dev/null +++ b/app/templates/user_agent/default.json @@ -0,0 +1,104 @@ +{ + "list":[ + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36", + "Mozilla/5.0 (iPhone; CPU iPhone OS 17_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4.1 Mobile/15E148 Safari/604.1", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36 PageSpeedPlus/1.0.0", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0", + "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Mobile Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0", + "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Mobile Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36", + "Mozilla/5.0 (iPhone; CPU iPhone OS 17_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4.1 Safari/605.1.15", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 11.6; rv:92.0) Gecko/20100101 Firefox/92.0", + "Mozilla/5.0 (iPhone; CPU iPhone OS 16_6_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36", + "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) obsidian/1.4.14 Chrome/114.0.5735.289 Electron/25.8.1 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36", + "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:126.0) Gecko/20100101 Firefox/126.0", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Safari/605.1.15", + "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Mobile Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36", + "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36", + "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36", + "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/25.0 Chrome/121.0.0.0 Mobile Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:125.0) Gecko/20100101 Firefox/125.0", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", + "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Mobile Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:125.0) Gecko/20100101 Firefox/125.0", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) obsidian/1.4.16 Chrome/114.0.5735.289 Electron/25.8.1 Safari/537.36", + "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Mobile Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36", + "Mozilla/5.0 (iPhone; CPU iPhone OS 17_2_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Mobile/15E148 Safari/604.1", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 Edg/123.0.0.0", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Safari/605.1.15", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", + "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) obsidian/1.5.3 Chrome/114.0.5735.289 Electron/25.8.1 Safari/537.36", + "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Safari/605.1.15", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36", + "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2.1 Safari/605.1.15", + "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) obsidian/1.5.12 Chrome/120.0.6099.283 Electron/28.2.3 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) obsidian/1.4.16 Chrome/114.0.5735.289 Electron/25.8.1 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36", + "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Mobile Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 OPR/109.0.0.0", + "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36", + "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", + "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Mobile Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.1 Safari/605.1.15", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.3.1 Safari/605.1.15", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) obsidian/1.4.13 Chrome/114.0.5735.289 Electron/25.8.1 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Safari/605.1.15", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Safari/605.1.15", + "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:109.0) Gecko/20100101 Firefox/115.0", + "Mozilla/5.0 (iPhone; CPU iPhone OS 17_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Mobile/15E148 Safari/604.1", + "Mozilla/5.0 (iPhone; CPU iPhone OS 17_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.3 Mobile/15E148 Safari/604.1", + "Mozilla/5.0 (iPhone; CPU iPhone OS 16_1_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.1 Mobile/15E148 Safari/604.1", + "Mozilla/5.0 (iPhone; CPU iPhone OS 17_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.3.1 Mobile/15E148 Safari/604.1", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:124.0) Gecko/20100101 Firefox/124.0", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.3 Safari/605.1.15", + "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) obsidian/1.4.13 Chrome/114.0.5735.289 Electron/25.8.1 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4 Safari/605.1.15", + "Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.6.1 Safari/605.1.15", + "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36", + "Mozilla/5.0 (iPhone; CPU iPhone OS 17_1_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1.1 Mobile/15E148 Safari/604.1", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0", + "Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Mobile/15E148 Safari/604.1", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) obsidian/1.5.12 Chrome/120.0.6099.283 Electron/28.2.3 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1.2 Safari/605.1.15", + "Mozilla/5.0 (iPhone; CPU iPhone OS 16_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.2 Mobile/15E148 Safari/604.1", + "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Mobile Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Safari/605.1.15", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36 Edg/121.0.0.0", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:124.0) Gecko/20100101 Firefox/124.0", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) obsidian/1.5.3 Chrome/114.0.5735.289 Electron/25.8.1 Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.67 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.3 Safari/605.1.15", + "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36", + "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36", + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0", + "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Mobile Safari/537.36", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36", + "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/24.0 Chrome/117.0.0.0 Mobile Safari/537.36" + ] +} \ No newline at end of file diff --git a/app/templates/user_agent/grpc.json b/app/templates/user_agent/grpc.json new file mode 100644 index 000000000..821671ea4 --- /dev/null +++ b/app/templates/user_agent/grpc.json @@ -0,0 +1,20 @@ +{ + "list": [ + "grpc-dotnet/2.41.0 (.NET 6.0.1; CLR 6.0.1; net6.0; windows; x64)", + "grpc-dotnet/2.41.0 (.NET 6.0.0-preview.7.21377.19; CLR 6.0.0; net6.0; osx; x64)", + "grpc-dotnet/2.41.0 (Mono 6.12.0.140; CLR 4.0.30319; netstandard2.0; osx; x64)", + "grpc-dotnet/2.41.0 (.NET 6.0.0-rc.1.21380.1; CLR 6.0.0; net6.0; linux; arm64)", + "grpc-dotnet/2.41.0 (.NET 5.0.8; CLR 5.0.8; net5.0; linux; arm64)", + "grpc-dotnet/2.41.0 (.NET Core; CLR 3.1.4; netstandard2.1; linux; arm64)", + "grpc-dotnet/2.41.0 (.NET Framework; CLR 4.0.30319.42000; netstandard2.0; windows; x86)", + "grpc-dotnet/2.41.0 (.NET 6.0.0-rc.1.21380.1; CLR 6.0.0; net6.0; windows; x64)", + "grpc-python-asyncio/1.62.1 grpc-c/39.0.0 (linux; chttp2)", + "grpc-go/1.58.1", + "grpc-java-okhttp/1.55.1", + "grpc-node/1.7.1 grpc-c/1.7.1 (osx; chttp2)", + "grpc-node/1.24.2 grpc-c/8.0.0 (linux; chttp2; ganges)", + "grpc-c++/1.16.0 grpc-c/6.0.0 (linux; nghttp2; hw)", + "grpc-node/1.19.0 grpc-c/7.0.0 (linux; chttp2; gold)", + "grpc-ruby/1.62.0 grpc-c/39.0.0 (osx; chttp2)]" + ] +} \ No newline at end of file diff --git a/app/templates/xray/README.md b/app/templates/xray/README.md new file mode 100644 index 000000000..ef2403cdb --- /dev/null +++ b/app/templates/xray/README.md @@ -0,0 +1,44 @@ +# V2ray Template + +## Usage + +- Can be used to send completely prepared config to users and avoid application default values. + +## Config Template + +- With the config template, you can change things like routing and rules. + +## How To Use + +First of all, you need to set a directory for all of your templates (home, subscription page, etc.). + +```shell +CUSTOM_TEMPLATES_DIRECTORY="/var/lib/marzban/templates/" +``` + +Make sure you put all of your templates in this folder.\ +If you are using Docker, make sure Docker has access to this folder.\ +Then, we need to make a directory for our V2ray template. + +```shell +mkdir /var/lib/marzban/templates/v2ray +``` + +After that, put your templates (config and settings) in the directory.\ +Now, change these variables with your files' names. + +```shell +V2RAY_SUBSCRIPTION_TEMPLATE="v2ray/default.json" +``` + +Now, restart your Marzban and enjoy. + +If you have already changed your env variables, and you want to just update the template files, there is no need to restart Marzban. + +## Docs + +you can use these docs to find out how to modify template files + +[Xray Docs](https://xtls.github.io/en/) \ +[Xray Examples](https://github.com/XTLS/Xray-examples) \ +[Xray Examples](https://github.com/chika0801/Xray-examples) Unofficial diff --git a/app/templates/xray/default.json b/app/templates/xray/default.json new file mode 100644 index 000000000..d842a9f79 --- /dev/null +++ b/app/templates/xray/default.json @@ -0,0 +1,58 @@ +{ + "log": { + "access": "", + "error": "", + "loglevel": "warning" + }, + "inbounds": [ + { + "tag": "socks", + "port": 10808, + "listen": "0.0.0.0", + "protocol": "socks", + "sniffing": { + "enabled": true, + "destOverride": [ + "http", + "tls" + ], + "routeOnly": false + }, + "settings": { + "auth": "noauth", + "udp": true, + "allowTransparent": false + } + }, + { + "tag": "http", + "port": 10809, + "listen": "0.0.0.0", + "protocol": "http", + "sniffing": { + "enabled": true, + "destOverride": [ + "http", + "tls" + ], + "routeOnly": false + }, + "settings": { + "auth": "noauth", + "udp": true, + "allowTransparent": false + } + } + ], + "outbounds": [], + "dns": { + "servers": [ + "1.1.1.1", + "8.8.8.8" + ] + }, + "routing": { + "domainStrategy": "AsIs", + "rules": [] + } +} \ No newline at end of file diff --git a/app/utils/crypto.py b/app/utils/crypto.py new file mode 100644 index 000000000..ea5448070 --- /dev/null +++ b/app/utils/crypto.py @@ -0,0 +1,76 @@ +import base64 +import binascii + +from cryptography import x509 +from cryptography.hazmat.backends import default_backend +from cryptography.hazmat.primitives import serialization +from cryptography.hazmat.primitives.asymmetric import x25519 +from OpenSSL import crypto + + +def get_cert_SANs(cert: bytes): + cert = x509.load_pem_x509_certificate(cert, default_backend()) + san_list = [] + for extension in cert.extensions: + if isinstance(extension.value, x509.SubjectAlternativeName): + san = extension.value + for name in san: + san_list.append(name.value) + return san_list + + +def generate_certificate(): + k = crypto.PKey() + k.generate_key(crypto.TYPE_RSA, 4096) + cert = crypto.X509() + cert.get_subject().CN = "Gozargah" + cert.gmtime_adj_notBefore(0) + cert.gmtime_adj_notAfter(100 * 365 * 24 * 60 * 60) + cert.set_issuer(cert.get_subject()) + cert.set_pubkey(k) + cert.sign(k, "sha512") + cert_pem = crypto.dump_certificate(crypto.FILETYPE_PEM, cert).decode("utf-8") + key_pem = crypto.dump_privatekey(crypto.FILETYPE_PEM, k).decode("utf-8") + + return {"cert": cert_pem, "key": key_pem} + + +def add_base64_padding(b64_string: str) -> str: + """Adds missing Base64 padding if necessary.""" + missing_padding = len(b64_string) % 4 + return b64_string + ("=" * (4 - missing_padding)) if missing_padding else b64_string + + +def get_x25519_public_key(private_key_b64: str) -> str: + """ + Converts an X25519 private key (URL-safe Base64) into a public key (URL-safe Base64 format). + + :param private_key_b64: The private key in URL-safe Base64 format (without padding). + :return: The corresponding public key as a URL-safe Base64 string (without padding). + """ + try: + # Decode Base64 (URL-safe) Add padding if needed + private_key_bytes = base64.urlsafe_b64decode(add_base64_padding(private_key_b64)) + + # Ensure the private key is 32 bytes + if len(private_key_bytes) != 32: + raise ValueError("Invalid private key length. Must be 32 bytes after decoding.") + + # Load the private key + private_key = x25519.X25519PrivateKey.from_private_bytes(private_key_bytes) + + # Derive the public key + public_key = private_key.public_key() + + # Convert the public key to bytes + public_key_bytes = public_key.public_bytes( + encoding=serialization.Encoding.Raw, format=serialization.PublicFormat.Raw + ) + + # Encode the public key as URL-safe Base64 (without padding) + public_key_b64 = base64.urlsafe_b64encode(public_key_bytes).decode().rstrip("=") + + return public_key_b64 + + except (ValueError, binascii.Error): + raise ValueError("Invalid private key.") diff --git a/app/utils/helpers.py b/app/utils/helpers.py new file mode 100644 index 000000000..13e10b96d --- /dev/null +++ b/app/utils/helpers.py @@ -0,0 +1,76 @@ +import re +import json +import html +from datetime import datetime as dt, timezone as tz +from typing import Union +from uuid import UUID + +from pydantic import ValidationError + + +def yml_uuid_representer(dumper, data): + return dumper.represent_scalar("tag:yaml.org,2002:str", str(data)) + + +def readable_datetime(date_time: Union[dt, int, None], include_date: bool = True, include_time: bool = True): + def get_datetime_format(): + dt_format = "" + if include_date: + dt_format += "%d %B %Y" + if include_time: + if dt_format: + dt_format += ", " + dt_format += "%H:%M:%S" + + return dt_format + + if isinstance(date_time, int): + date_time = dt.fromtimestamp(date_time) + + return date_time.strftime(get_datetime_format()) if date_time else "-" + + +def fix_datetime_timezone(value: dt | int): + if isinstance(value, dt): + # If datetime is naive (no timezone), assume it's UTC + if value.tzinfo is None: + return value.replace(tzinfo=tz.utc) + # If datetime has timezone, convert to UTC + else: + return value.astimezone(tz.utc) + elif isinstance(value, int): + # Timestamp will be assume it's UTC + return dt.fromtimestamp(value, tz=tz.utc) + + raise ValueError("input can be datetime or timestamp") + + +class UUIDEncoder(json.JSONEncoder): + def default(self, obj): + if isinstance(obj, UUID): + # if the obj is uuid, we simply return the value of uuid + return str(obj) + return super().default(self, obj) + + +def format_validation_error(error: ValidationError) -> str: + return "\n".join([e["loc"][0].replace("_", " ").capitalize() + ": " + e["msg"] for e in error.errors()]) + + +def escape_tg_html(list: tuple[str]) -> tuple[str]: + """Escapes HTML special characters for the telegram HTML parser.""" + return tuple(html.escape(text) for text in list) + + +def escape_ds_markdown(text: str) -> str: + """Escapes markdown special characters for Discord.""" + # Other characters like >, |, [, ], (, ) are often handled by Discord's parser + # or are part of specific markdown constructs (e.g., links, blockquotes) + # that might not need general escaping. + escape_chars = r"[*_`~]" + return re.sub(escape_chars, r"\\\g<0>", text) + + +def escape_ds_markdown_list(list: tuple[str]) -> tuple[str]: + """Escapes markdown special characters for Discord.""" + return tuple(escape_ds_markdown(text) for text in list) diff --git a/app/utils/jwt.py b/app/utils/jwt.py new file mode 100644 index 000000000..54adf2c99 --- /dev/null +++ b/app/utils/jwt.py @@ -0,0 +1,93 @@ +import time +import jwt +from base64 import b64decode, b64encode +from datetime import datetime, timedelta, timezone +from hashlib import sha256 +from math import ceil + +from aiocache import cached +from app.db import GetDB +from app.db.crud.general import get_jwt_secret_key +from config import JWT_ACCESS_TOKEN_EXPIRE_MINUTES + + +@cached() +async def get_secret_key(): + async with GetDB() as db: + key = await get_jwt_secret_key(db=db) + return key + + +async def create_admin_token(username: str, is_sudo=False) -> str: + data = {"sub": username, "access": "sudo" if is_sudo else "admin", "iat": datetime.utcnow()} + if JWT_ACCESS_TOKEN_EXPIRE_MINUTES > 0: + expire = datetime.now(timezone.utc) + timedelta(minutes=JWT_ACCESS_TOKEN_EXPIRE_MINUTES) + data["exp"] = expire + encoded_jwt = jwt.encode(data, await get_secret_key(), algorithm="HS256") + return encoded_jwt + + +async def get_admin_payload(token: str) -> dict | None: + try: + payload = jwt.decode(token, await get_secret_key(), algorithms=["HS256"]) + username: str = payload.get("sub") + access: str = payload.get("access") + if not username or access not in ("admin", "sudo"): + return + try: + created_at = datetime.fromtimestamp(payload["iat"], tz=timezone.utc) + except KeyError: + created_at = None + + return {"username": username, "is_sudo": access == "sudo", "created_at": created_at} + except jwt.exceptions.PyJWTError: + return + + +async def create_subscription_token(username: str) -> str: + data = username + "," + str(ceil(time.time())) + data_b64_str = b64encode(data.encode("utf-8"), altchars=b"-_").decode("utf-8").rstrip("=") + data_b64_sign = b64encode( + sha256((data_b64_str + await get_secret_key()).encode("utf-8")).digest(), altchars=b"-_" + ).decode("utf-8")[:10] + data_final = data_b64_str + data_b64_sign + return data_final + + +async def get_subscription_payload(token: str) -> dict | None: + try: + if len(token) < 15: + return + + if token.startswith("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9."): + payload = jwt.decode(token, await get_secret_key(), algorithms=["HS256"]) + if payload.get("access") == "subscription": + return { + "username": payload["sub"], + "created_at": datetime.fromtimestamp(payload["iat"], tz=timezone.utc), + } + else: + return + else: + u_token = token[:-10] + u_signature = token[-10:] + try: + u_token_dec = b64decode( + (u_token.encode("utf-8") + b"=" * (-len(u_token.encode("utf-8")) % 4)), + altchars=b"-_", + validate=True, + ) + u_token_dec_str = u_token_dec.decode("utf-8") + except Exception: + return + u_token_resign = b64encode( + sha256((u_token + await get_secret_key()).encode("utf-8")).digest(), altchars=b"-_" + ).decode("utf-8")[:10] + if u_signature == u_token_resign: + u_username = u_token_dec_str.split(",")[0] + u_created_at = int(u_token_dec_str.split(",")[1]) + return {"username": u_username, "created_at": datetime.fromtimestamp(u_created_at, tz=timezone.utc)} + else: + return + except jwt.exceptions.PyJWTError: + return diff --git a/app/utils/logger.py b/app/utils/logger.py new file mode 100644 index 000000000..f81cc0fee --- /dev/null +++ b/app/utils/logger.py @@ -0,0 +1,94 @@ +import logging +from copy import copy +from urllib.parse import unquote + +import click +from uvicorn.config import LOGGING_CONFIG +from uvicorn.logging import DefaultFormatter + +from config import ( + ECHO_SQL_QUERIES, + LOG_BACKUP_COUNT, + LOG_FILE_PATH, + LOG_MAX_BYTES, + LOG_ROTATION_ENABLED, + LOG_ROTATION_INTERVAL, + LOG_ROTATION_UNIT, + SAVE_LOGS_TO_FILE, +) + + +class CustomLoggingFormatter(DefaultFormatter): + def formatMessage(self, record: logging.LogRecord) -> str: + recordcopy = copy(record) + recordcopy.__dict__["nameprefix"] = click.style(record.name.capitalize(), fg="blue") + return super().formatMessage(recordcopy) + + +LOGGING_CONFIG["formatters"]["custom"] = { + "()": CustomLoggingFormatter, + "fmt": "%(levelprefix)s %(asctime)s - %(nameprefix)s - %(message)s", + "use_colors": None, +} +LOGGING_CONFIG["handlers"]["custom"] = { + "class": LOGGING_CONFIG["handlers"]["default"]["class"], + "formatter": "custom", + "stream": LOGGING_CONFIG["handlers"]["default"]["stream"], +} + +LOGGING_CONFIG["formatters"]["default"]["fmt"] = "%(levelprefix)s %(asctime)s - %(message)s" +LOGGING_CONFIG["formatters"]["access"]["fmt"] = ( + '%(levelprefix)s %(asctime)s - %(client_addr)s - "%(request_line)s" %(status_code)s' +) + + +if SAVE_LOGS_TO_FILE: + if LOG_ROTATION_ENABLED: + LOGGING_CONFIG["handlers"]["file"] = { + "class": "logging.handlers.TimedRotatingFileHandler", + "formatter": "default", + "filename": LOG_FILE_PATH, + "interval": LOG_ROTATION_INTERVAL, + "when": LOG_ROTATION_UNIT, + "backupCount": LOG_BACKUP_COUNT, + } + else: + LOGGING_CONFIG["handlers"]["file"] = { + "class": "logging.handlers.RotatingFileHandler", + "formatter": "default", + "filename": LOG_FILE_PATH, + "maxBytes": LOG_MAX_BYTES, + "backupCount": LOG_BACKUP_COUNT, + } + LOGGING_CONFIG["loggers"]["uvicorn"]["handlers"].append("file") + LOGGING_CONFIG["loggers"]["uvicorn.access"]["handlers"].append("file") + + +def get_logger(name: str = "uvicorn.error") -> logging.Logger: + if not LOGGING_CONFIG["loggers"].get(name): + handlers = ["custom"] + if SAVE_LOGS_TO_FILE: + handlers.append("file") + LOGGING_CONFIG["loggers"][name] = { + "handlers": handlers, + "level": LOGGING_CONFIG["loggers"]["uvicorn"]["level"], + } + logging.config.dictConfig(LOGGING_CONFIG) + + logger = logging.getLogger(name) + return logger + + +if ECHO_SQL_QUERIES: + _ = get_logger("sqlalchemy.engine") + + +class EndpointFilter(logging.Filter): + def __init__(self, excluded_endpoints: list[str]): + self.excluded_endpoints = excluded_endpoints + + def filter(self, record: logging.LogRecord) -> bool: + if record.args and len(record.args) >= 2: + path = unquote(record.args[2]) + return path not in self.excluded_endpoints + return True diff --git a/app/utils/responses.py b/app/utils/responses.py new file mode 100644 index 000000000..bcd8a5fb3 --- /dev/null +++ b/app/utils/responses.py @@ -0,0 +1,43 @@ +"""Documented Error responses for API routes""" + +from pydantic import BaseModel + + +class HTTPException(BaseModel): + detail: str + + +class Unauthorized(HTTPException): + detail: str = "Not authenticated" + + +class Forbidden(HTTPException): + detail: str = "You are not allowed to ..." + + +class NotFound(HTTPException): + detail: str = "Entity {} not found" + + +class Conflict(HTTPException): + detail: str = "Entity already exists" + + +_400 = {"description": "BadRequest Error", "model": HTTPException} + +_401 = { + "description": "Unauthorized Error", + "model": Unauthorized, + "headers": { + "WWW-Authenticate": { + "description": "Authentication type", + "schema": {"type": "string"}, + }, + }, +} + +_403 = {"description": "Forbidden Error", "model": Forbidden} + +_404 = {"description": "NotFound Error", "model": NotFound} + +_409 = {"description": "Conflict Error", "model": Conflict} diff --git a/app/utils/store.py b/app/utils/store.py new file mode 100644 index 000000000..25e323bf3 --- /dev/null +++ b/app/utils/store.py @@ -0,0 +1,28 @@ +from sqlalchemy.ext.asyncio import AsyncSession + + +class DictStorage(dict): + def __init__(self, update_func): + super().__init__() + self.update_func = update_func + + def __getitem__(self, key): + return super().__getitem__(key) + + def __iter__(self): + return super().__iter__() + + def __str__(self): + return super().__str__() + + def values(self): + return super().values() + + def keys(self): + return super().keys() + + def get(self, key, default=None): + return super().get(key, default) + + async def update(self, db: AsyncSession): + await self.update_func(self, db) diff --git a/app/utils/system.py b/app/utils/system.py new file mode 100644 index 000000000..68b0be637 --- /dev/null +++ b/app/utils/system.py @@ -0,0 +1,114 @@ +import ipaddress +import math +import secrets +import socket +from dataclasses import dataclass + +import httpx +import psutil + + +@dataclass +class MemoryStat: + total: int + used: int + free: int + + +@dataclass +class CPUStat: + cores: int + percent: float + + +def cpu_usage() -> CPUStat: + return CPUStat(cores=psutil.cpu_count(), percent=psutil.cpu_percent()) + + +def memory_usage() -> MemoryStat: + mem = psutil.virtual_memory() + return MemoryStat(total=mem.total, used=mem.used, free=mem.available) + + +def random_password() -> str: + return secrets.token_urlsafe(24) + + +def check_port(port: int) -> bool: + s = socket.socket() + try: + s.connect(("127.0.0.1", port)) + return True + except socket.error: + return False + finally: + s.close() + + +def get_public_ip(): + try: + resp = httpx.get("http://api4.ipify.org/", timeout=5).text.strip() + if ipaddress.IPv4Address(resp).is_global: + return resp + except Exception: + pass + + try: + resp = httpx.get("http://ipv4.icanhazip.com/", timeout=5).text.strip() + if ipaddress.IPv4Address(resp).is_global: + return resp + except Exception: + pass + + # Disable IPv6 for this request + transport = httpx.HTTPTransport(local_address="0.0.0.0") + with httpx.Client(transport=transport) as client: + try: + resp = client.get("https://ifconfig.io/ip", timeout=5).text.strip() + if ipaddress.IPv4Address(resp).is_global: + return resp + except httpx.RequestError: + pass + + sock = None + try: + sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + sock.connect(("8.8.8.8", 80)) + resp = sock.getsockname()[0] + if ipaddress.IPv4Address(resp).is_global: + return resp + except (socket.error, IndexError): + pass + finally: + if sock: + sock.close() + + return "127.0.0.1" + + +def get_public_ipv6(): + try: + resp = httpx.get("http://api6.ipify.org/", timeout=5).text.strip() + if ipaddress.IPv6Address(resp).is_global: + return "[%s]" % resp + except Exception: + pass + + try: + resp = httpx.get("http://ipv6.icanhazip.com/", timeout=5).text.strip() + if ipaddress.IPv6Address(resp).is_global: + return "[%s]" % resp + except Exception: + pass + + return "[::1]" + + +def readable_size(size_bytes): + if not size_bytes or size_bytes <= 0: + return "0 B" + size_name = ("B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB") + i = int(math.floor(math.log(size_bytes, 1024))) + p = math.pow(1024, i) + s = round(size_bytes / p, 2) + return f"{s} {size_name[i]}" diff --git a/build_dashboard.sh b/build_dashboard.sh new file mode 100755 index 000000000..e750a1902 --- /dev/null +++ b/build_dashboard.sh @@ -0,0 +1,5 @@ +#! /bin/bash +set -e +cd "$(dirname "$0")/dashboard" +VITE_BASE_API=/ bun run build +cp ./build/index.html ./build/404.html diff --git a/cli/README.md b/cli/README.md new file mode 100644 index 000000000..529542f84 --- /dev/null +++ b/cli/README.md @@ -0,0 +1,60 @@ +# PasarGuard CLI + +A modern, type-safe command-line interface for managing PasarGuard, built with Typer. + +## Features + +- 🎯 Type-safe CLI with rich output +- 📊 Beautiful tables and panels +- 🔒 Secure admin management +- 📈 System status monitoring +- ⌨️ Interactive prompts and confirmations + +## Installation + +The CLI is included with PasarGuard and can be used directly: + +```bash +PasarGuard cli --help + +# Or from the project root +uv run PasarGuard-cli.py --help +``` + +## Usage + +### General Commands + +```bash +# Show version +pasarguard cli version + +# Show help +pasarguard cli --help +``` + +### Admin Management + +```bash +# List all admins +pasarguard cli admins --list + +# Create new admin +pasarguard cli admins --create username + +# Delete admin +pasarguard cli admins --delete username + +# Modify admin (password and sudo status) +PasarGuard cli admins --modify username + +# Reset admin usage +pasarguard cli admins --reset-usage username +``` + +### System Information + +```bash +# Show system status +PasarGuard cli system +``` diff --git a/cli/__init__.py b/cli/__init__.py new file mode 100644 index 000000000..abcb32581 --- /dev/null +++ b/cli/__init__.py @@ -0,0 +1,49 @@ +""" +PasarGuard CLI Package + +A modern, type-safe CLI built with Typer for managing PasarGuard instances. +""" + +from pydantic import ValidationError +from rich.console import Console +from rich.table import Table + +from app.models.admin import AdminDetails +from app.operation import OperatorType +from app.operation.admin import AdminOperation +from app.operation.system import SystemOperation + +# Initialize console for rich output +console = Console() + +# system admin for CLI operations +SYSTEM_ADMIN = AdminDetails(username="cli", is_sudo=True, telegram_id=None, discord_webhook=None) + + +def get_admin_operation() -> AdminOperation: + """Get admin operation instance.""" + return AdminOperation(OperatorType.CLI) + + +def get_system_operation() -> SystemOperation: + """Get node operation instance.""" + return SystemOperation(OperatorType.CLI) + + +class BaseCLI: + """Base class for CLI operations.""" + + def __init__(self): + self.console = console + + def create_table(self, title: str, columns: list) -> Table: + """Create a rich table with given columns.""" + table = Table(title=title) + for column in columns: + table.add_column(column["name"], style=column.get("style", "white")) + return table + + def format_cli_validation_error(self, errors: ValidationError): + for error in errors.errors(): + for err in error["msg"].split(";"): + self.console.print(f"[red]Error: {err}[/red]") diff --git a/cli/admin.py b/cli/admin.py new file mode 100644 index 000000000..83529d29d --- /dev/null +++ b/cli/admin.py @@ -0,0 +1,226 @@ +""" +Admin CLI Module + +Handles admin account management through the command line interface. +""" + +import typer +from pydantic import ValidationError + +from app.db.base import GetDB +from app.models.admin import AdminCreate, AdminModify +from app.utils.system import readable_size +from cli import SYSTEM_ADMIN, BaseCLI, console, get_admin_operation + + +class AdminCLI(BaseCLI): + """Admin CLI operations.""" + + async def list_admins(self, db): + """List all admin accounts.""" + admin_op = get_admin_operation() + admins = await admin_op.get_admins(db) + + if not admins: + self.console.print("[yellow]No admins found[/yellow]") + return + + table = self.create_table( + "Admin Accounts", + [ + {"name": "Username", "style": "cyan"}, + {"name": "Is Sudo", "style": "green"}, + {"name": "Used Traffic", "style": "blue"}, + {"name": "Is Disabled", "style": "red"}, + ], + ) + + for admin in admins: + table.add_row( + admin.username, + "✓" if admin.is_sudo else "✗", + readable_size(admin.used_traffic), + "✓" if admin.is_disabled else "✗", + ) + + self.console.print(table) + + async def create_admin(self, db, username: str): + """Create a new admin account.""" + admin_op = get_admin_operation() + + # Check if admin already exists + admins = await admin_op.get_admins(db) + if any(admin.username == username for admin in admins): + self.console.print(f"[red]Admin '{username}' already exists[/red]") + return + + while True: + # Get password + password = typer.prompt("Password", hide_input=True) + if not password: + self.console.print("[red]Password is required[/red]") + continue + + confirm_password = typer.prompt("Confirm Password", hide_input=True) + if password != confirm_password: + self.console.print("[red]Passwords do not match[/red]") + continue + + try: + # Create admin + new_admin = AdminCreate(username=username, password=password, is_sudo=False) + await admin_op.create_admin(db, new_admin, SYSTEM_ADMIN) + self.console.print(f"[green]Admin '{username}' created successfully[/green]") + break + except ValidationError as e: + self.format_cli_validation_error(e) + continue + except Exception as e: + self.console.print(f"[red]Error creating admin: {e}[/red]") + break + + async def delete_admin(self, db, username: str): + """Delete an admin account.""" + admin_op = get_admin_operation() + + # Check if admin exists + admins = await admin_op.get_admins(db) + if not any(admin.username == username for admin in admins): + self.console.print(f"[red]Admin '{username}' not found[/red]") + return + + if typer.confirm(f"Are you sure you want to delete admin '{username}'?"): + try: + await admin_op.remove_admin(db, username, SYSTEM_ADMIN) + self.console.print(f"[green]Admin '{username}' deleted successfully[/green]") + except Exception as e: + self.console.print(f"[red]Error deleting admin: {e}[/red]") + + async def modify_admin(self, db, username: str): + """Modify an admin account.""" + admin_op = get_admin_operation() + + # Check if admin exists + admins = await admin_op.get_admins(db) + if not any(admin.username == username for admin in admins): + self.console.print(f"[red]Admin '{username}' not found[/red]") + return + + # Get the current admin details + current_admin = next(admin for admin in admins if admin.username == username) + + self.console.print(f"[yellow]Modifying admin '{username}'[/yellow]") + self.console.print("[cyan]Current settings:[/cyan]") + self.console.print(f" Username: {current_admin.username}") + self.console.print(f" Is Sudo: {'✓' if current_admin.is_sudo else '✗'}") + + new_password = None + is_sudo = current_admin.is_sudo + # Password modification + if typer.confirm("Do you want to change the password?"): + new_password = typer.prompt("New password", hide_input=True) + confirm_password = typer.prompt("Confirm Password", hide_input=True) + if new_password != confirm_password: + self.console.print("[red]Passwords do not match[/red]") + return + + # Sudo status modification + if typer.confirm(f"Do you want to change sudo status? (Current: {'✓' if current_admin.is_sudo else '✗'})"): + is_sudo = typer.confirm("Make this admin a sudo admin?") + + # Confirm changes + self.console.print("\n[cyan]Summary of changes:[/cyan]") + if new_password: + self.console.print(" Password: [yellow]Will be updated[/yellow]") + if is_sudo != current_admin.is_sudo: + self.console.print(f" Is Sudo: {'✓' if is_sudo else '✗'} [yellow](changed)[/yellow]") + + if typer.confirm("Do you want to apply these changes?"): + try: + # Interactive modification + modified_admin = AdminModify(is_sudo=is_sudo, password=new_password) + await admin_op.modify_admin(db, username, modified_admin, SYSTEM_ADMIN) + self.console.print(f"[green]Admin '{username}' modified successfully[/green]") + except Exception as e: + self.console.print(f"[red]Error modifying admin: {e}[/red]") + else: + self.console.print("[yellow]Modification cancelled[/yellow]") + + async def reset_admin_usage(self, db, username: str): + """Reset admin usage statistics.""" + admin_op = get_admin_operation() + + # Check if admin exists + admins = await admin_op.get_admins(db) + if not any(admin.username == username for admin in admins): + self.console.print(f"[red]Admin '{username}' not found[/red]") + return + + if typer.confirm(f"Are you sure you want to reset usage for admin '{username}'?"): + try: + await admin_op.reset_admin_usage(db, username, SYSTEM_ADMIN) + self.console.print(f"[green]Usage reset for admin '{username}'[/green]") + except Exception as e: + self.console.print(f"[red]Error resetting usage: {e}[/red]") + + +# CLI commands +async def list_admins(): + """List all admin accounts.""" + admin_cli = AdminCLI() + async with GetDB() as db: + try: + await admin_cli.list_admins(db) + except Exception as e: + console.print(f"[red]Error: {e}[/red]") + finally: + return + + +async def create_admin(username: str): + """Create a new admin account.""" + admin_cli = AdminCLI() + async with GetDB() as db: + try: + await admin_cli.create_admin(db, username) + except Exception as e: + console.print(f"[red]Error: {e}[/red]") + finally: + return + + +async def delete_admin(username: str): + """Delete an admin account.""" + admin_cli = AdminCLI() + async with GetDB() as db: + try: + await admin_cli.delete_admin(db, username) + except Exception as e: + console.print(f"[red]Error: {e}[/red]") + finally: + return + + +async def modify_admin(username: str): + """Modify an admin account.""" + admin_cli = AdminCLI() + async with GetDB() as db: + try: + await admin_cli.modify_admin(db, username) + except Exception as e: + console.print(f"[red]Error: {e}[/red]") + finally: + return + + +async def reset_admin_usage(username: str): + """Reset admin usage statistics.""" + admin_cli = AdminCLI() + async with GetDB() as db: + try: + await admin_cli.reset_admin_usage(db, username) + except Exception as e: + console.print(f"[red]Error: {e}[/red]") + finally: + return diff --git a/cli/main.py b/cli/main.py new file mode 100644 index 000000000..cbd3fdb79 --- /dev/null +++ b/cli/main.py @@ -0,0 +1,63 @@ +#!/usr/bin/env python3 +""" +PasarGuard CLI - Command Line Interface for PasarGuard Management + +A modern, type-safe CLI built with Typer for managing PasarGuard instances. +""" + +import asyncio +from typing import Optional + +import typer + +from cli import console +from cli.admin import create_admin, delete_admin, list_admins, modify_admin, reset_admin_usage +from cli.system import show_status + +# Initialize Typer app +app = typer.Typer( + name="PasarGuard", + help="PasarGuard CLI - Command Line Interface for PasarGuard Management", + add_completion=False, + rich_markup_mode="rich", +) + + +@app.command() +def version(): + """Show PasarGuard version.""" + from app import __version__ + + console.print(f"[bold blue]PasarGuard[/bold blue] version [bold green]{__version__}[/bold green]") + + +@app.command() +def admins( + list: bool = typer.Option(False, "--list", "-l", help="List all admins"), + create: Optional[str] = typer.Option(None, "--create", "-c", help="Create new admin"), + delete: Optional[str] = typer.Option(None, "--delete", "-d", help="Delete admin"), + modify: Optional[str] = typer.Option(None, "--modify", "-m", help="Modify admin"), + reset_usage: Optional[str] = typer.Option(None, "--reset-usage", "-r", help="Reset admin usage"), +): + """List & manage admin accounts.""" + + if list or not any([create, delete, modify, reset_usage]): + asyncio.run(list_admins()) + elif create: + asyncio.run(create_admin(create)) + elif delete: + asyncio.run(delete_admin(delete)) + elif modify: + asyncio.run(modify_admin(modify)) + elif reset_usage: + asyncio.run(reset_admin_usage(reset_usage)) + + +@app.command() +def system(): + """Show system status.""" + asyncio.run(show_status()) + + +if __name__ == "__main__": + app() diff --git a/cli/system.py b/cli/system.py new file mode 100644 index 000000000..a36416b06 --- /dev/null +++ b/cli/system.py @@ -0,0 +1,58 @@ +""" +System CLI Module + +Handles system status and information through the command line interface. +""" + +from rich.panel import Panel + +from app.db.base import GetDB +from app.utils.system import readable_size +from cli import SYSTEM_ADMIN, BaseCLI, console, get_system_operation + + +class SystemCLI(BaseCLI): + """System CLI operations.""" + + async def show_status(self, db): + """Show system status.""" + system_op = get_system_operation() + stats = await system_op.get_system_stats(db, SYSTEM_ADMIN) + + status_text = ( + f"[bold]System Statistics[/bold]\n\n" + f"CPU Usage: [green]{stats.cpu_usage:.1f}%[/green]\n" + f"Memory Usage: [green]{stats.mem_used / stats.mem_total * 100:.1f}%[/green] " + f"([cyan]{readable_size(stats.mem_used)}[/cyan] / [cyan]{readable_size(stats.mem_total)}[/cyan])\n" + f"CPU Cores: [magenta]{stats.cpu_cores}[/magenta]\n" + f"Total Users: [blue]{stats.total_user}[/blue]\n" + f"Active Users: [green]{stats.active_users}[/green]\n" + f"Online Users: [yellow]{stats.online_users}[/yellow]\n" + f"On Hold Users: [yellow]{stats.on_hold_users}[/yellow]\n" + f"Disabled Users: [red]{stats.disabled_users}[/red]\n" + f"Expired Users: [red]{stats.expired_users}[/red]\n" + f"Limited Users: [yellow]{stats.limited_users}[/yellow]\n" + f"Data Usage (In): [blue]{readable_size(stats.incoming_bandwidth)}[/blue]\n" + f"Data Usage (Out): [blue]{readable_size(stats.outgoing_bandwidth)}[/blue]" + ) + + panel = Panel( + status_text, + title="System Information", + border_style="blue", + ) + + self.console.print(panel) + + +# CLI commands +async def show_status(): + """Show system status.""" + system_cli = SystemCLI() + async with GetDB() as db: + try: + await system_cli.show_status(db) + except Exception as e: + console.print(f"[red]Error: {e}[/red]") + finally: + return diff --git a/cli_wrapper.sh b/cli_wrapper.sh new file mode 100644 index 000000000..dff723d88 --- /dev/null +++ b/cli_wrapper.sh @@ -0,0 +1,2 @@ +#!/bin/bash +python /code/pasarguard-cli.py "$@" diff --git a/config.py b/config.py new file mode 100644 index 000000000..4bf079076 --- /dev/null +++ b/config.py @@ -0,0 +1,99 @@ +import os + +from decouple import config +from dotenv import load_dotenv + +TESTING = os.getenv("TESTING", False) + +if not TESTING: + load_dotenv() + + +SQLALCHEMY_DATABASE_URL = config("SQLALCHEMY_DATABASE_URL", default="sqlite+aiosqlite:///db.sqlite3") +SQLALCHEMY_POOL_SIZE = config("SQLALCHEMY_POOL_SIZE", cast=int, default=10) +SQLALCHEMY_MAX_OVERFLOW = config("SQLALCHEMY_MAX_OVERFLOW", cast=int, default=30) +ECHO_SQL_QUERIES = config("ECHO_SQL_QUERIES", cast=bool, default=False) + +UVICORN_HOST = config("UVICORN_HOST", default="0.0.0.0") +UVICORN_PORT = config("UVICORN_PORT", cast=int, default=8000) +UVICORN_UDS = config("UVICORN_UDS", default=None) +UVICORN_SSL_CERTFILE = config("UVICORN_SSL_CERTFILE", default=None) +UVICORN_SSL_KEYFILE = config("UVICORN_SSL_KEYFILE", default=None) +UVICORN_SSL_CA_TYPE = config("UVICORN_SSL_CA_TYPE", default="public").lower() +DASHBOARD_PATH = config("DASHBOARD_PATH", default="/dashboard/") +UVICORN_LOOP = config("UVICORN_LOOP", default="auto", cast=str) + +DEBUG = config("DEBUG", default=False, cast=bool) +DOCS = config("DOCS", default=False, cast=bool) + +ALLOWED_ORIGINS = config("ALLOWED_ORIGINS", default="*").split(",") + +VITE_BASE_API = ( + f"{'https' if UVICORN_SSL_CERTFILE and UVICORN_SSL_KEYFILE else 'http'}://127.0.0.1:{UVICORN_PORT}/" + if DEBUG and config("VITE_BASE_API", default="/") == "/" + else config("VITE_BASE_API", default="/") +) + +# For backward compatibility +SUBSCRIPTION_PATH = config("XRAY_SUBSCRIPTION_PATH", default="").strip("/") +if not SUBSCRIPTION_PATH: + SUBSCRIPTION_PATH = config("SUBSCRIPTION_PATH", default="sub").strip("/") + +USER_SUBSCRIPTION_CLIENTS_LIMIT = config("USER_SUBSCRIPTION_CLIENTS_LIMIT", cast=int, default=10) + +JWT_ACCESS_TOKEN_EXPIRE_MINUTES = config("JWT_ACCESS_TOKEN_EXPIRE_MINUTES", cast=int, default=1440) + +CUSTOM_TEMPLATES_DIRECTORY = config("CUSTOM_TEMPLATES_DIRECTORY", default=None) +SUBSCRIPTION_PAGE_TEMPLATE = config("SUBSCRIPTION_PAGE_TEMPLATE", default="subscription/index.html") +HOME_PAGE_TEMPLATE = config("HOME_PAGE_TEMPLATE", default="home/index.html") + +CLASH_SUBSCRIPTION_TEMPLATE = config("CLASH_SUBSCRIPTION_TEMPLATE", default="clash/default.yml") + +SINGBOX_SUBSCRIPTION_TEMPLATE = config("SINGBOX_SUBSCRIPTION_TEMPLATE", default="singbox/default.json") + +XRAY_SUBSCRIPTION_TEMPLATE = config("XRAY_SUBSCRIPTION_TEMPLATE", default="xray/default.json") + +USER_AGENT_TEMPLATE = config("USER_AGENT_TEMPLATE", default="user_agent/default.json") +GRPC_USER_AGENT_TEMPLATE = config("GRPC_USER_AGENT_TEMPLATE", default="user_agent/grpc.json") + +EXTERNAL_CONFIG = config("EXTERNAL_CONFIG", default="", cast=str) + +USERS_AUTODELETE_DAYS = config("USERS_AUTODELETE_DAYS", default=-1, cast=int) +USER_AUTODELETE_INCLUDE_LIMITED_ACCOUNTS = config("USER_AUTODELETE_INCLUDE_LIMITED_ACCOUNTS", default=False, cast=bool) + +DO_NOT_LOG_TELEGRAM_BOT = config("DO_NOT_LOG_TELEGRAM_BOT", default=True, cast=bool) + +SAVE_LOGS_TO_FILE = config("SAVE_LOGS_TO_FILE", default=False, cast=bool) +LOG_FILE_PATH = config("LOG_FILE_PATH", default="pasarguard.log") +LOG_BACKUP_COUNT = config("LOG_BACKUP_COUNT", cast=int, default=72) +LOG_ROTATION_ENABLED = config("LOG_ROTATION_ENABLED", default=False, cast=bool) +LOG_ROTATION_INTERVAL = config("LOG_ROTATION_INTERVAL", cast=int, default=1) +LOG_ROTATION_UNIT = config("LOG_ROTATION_UNIT", default="H") +LOG_MAX_BYTES = config("LOG_MAX_BYTES", cast=int, default=10485760) # default: 10 MB + +# USERNAME: PASSWORD +SUDOERS = ( + {config("SUDO_USERNAME"): config("SUDO_PASSWORD")} + if config("SUDO_USERNAME", default="") and config("SUDO_PASSWORD", default="") + else {} +) + +DISABLE_RECORDING_NODE_USAGE = config("DISABLE_RECORDING_NODE_USAGE", cast=bool, default=False) + +# due to high amout of data this job is only available for postgresql and timescaledb +if SQLALCHEMY_DATABASE_URL.startswith("postgresql"): + ENABLE_RECORDING_NODES_STATS = config("ENABLE_RECORDING_NODES_STATS", cast=bool, default=False) +else: + ENABLE_RECORDING_NODES_STATS = False + +# Interval jobs, all values are in seconds +JOB_CORE_HEALTH_CHECK_INTERVAL = config("JOB_CORE_HEALTH_CHECK_INTERVAL", cast=int, default=10) +JOB_RECORD_NODE_USAGES_INTERVAL = config("JOB_RECORD_NODE_USAGES_INTERVAL", cast=int, default=30) +JOB_RECORD_USER_USAGES_INTERVAL = config("JOB_RECORD_USER_USAGES_INTERVAL", cast=int, default=10) +JOB_REVIEW_USERS_INTERVAL = config("JOB_REVIEW_USERS_INTERVAL", cast=int, default=30) +JOB_SEND_NOTIFICATIONS_INTERVAL = config("JOB_SEND_NOTIFICATIONS_INTERVAL", cast=int, default=30) +JOB_GHATER_NODES_STATS_INTERVAL = config("JOB_GHATER_NODES_STATS_INTERVAL", cast=int, default=25) +JOB_REMOVE_OLD_INBOUNDS_INTERVAL = config("JOB_REMOVE_OLD_INBOUNDS_INTERVAL", cast=int, default=600) +JOB_REMOVE_EXPIRED_USERS_INTERVAL = config("JOB_REMOVE_EXPIRED_USERS_INTERVAL", cast=int, default=3600) +JOB_RESET_USER_DATA_USAGE_INTERVAL = config("JOB_RESET_USER_DATA_USAGE_INTERVAL", cast=int, default=600) +JOB_CLEANUP_SUBSCRIPTION_UPDATES_INTERVAL = config("JOB_CLEANUP_SUBSCRIPTION_UPDATES_INTERVAL", cast=int, default=600) diff --git a/dashboard/.env.example b/dashboard/.env.example new file mode 100644 index 000000000..fab1fb2ae --- /dev/null +++ b/dashboard/.env.example @@ -0,0 +1 @@ +VITE_BASE_API= \ No newline at end of file diff --git a/dashboard/.gitignore b/dashboard/.gitignore new file mode 100644 index 000000000..ad63c13bc --- /dev/null +++ b/dashboard/.gitignore @@ -0,0 +1,25 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +bun-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local +build + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/dashboard/.prettierrc.json b/dashboard/.prettierrc.json new file mode 100644 index 000000000..91172deb4 --- /dev/null +++ b/dashboard/.prettierrc.json @@ -0,0 +1,21 @@ +{ + "printWidth": 200, + "semi": false, + "singleQuote": true, + "arrowParens": "avoid", + "bracketSameLine": false, + "bracketSpacing": true, + "embeddedLanguageFormatting": "auto", + "endOfLine": "lf", + "htmlWhitespaceSensitivity": "css", + "insertPragma": false, + "jsxSingleQuote": false, + "proseWrap": "always", + "quoteProps": "as-needed", + "requirePragma": false, + "singleAttributePerLine": false, + "tabWidth": 2, + "trailingComma": "all", + "useTabs": false, + "plugins": ["prettier-plugin-tailwindcss"] +} diff --git a/dashboard/README.md b/dashboard/README.md new file mode 100644 index 000000000..90169c3af --- /dev/null +++ b/dashboard/README.md @@ -0,0 +1,42 @@ +# Dashboard UI for pasargaurd + +## Requirements + +For development, you will only need Node.js installed on your environement. + +### Node + +[Node](http://nodejs.org/) is really easy to install & now include [NPM](https://npmjs.org/). This project has been developed on the Nodejs v20.x so if you faced any issue during installation that may +related to the node version, install Node with version >= v20 + +## Install + + Install the latest LTS version of Node.js + git clone https://github.com/PasarGuard/panel.git + `bash cd panel/dashboard` + `bash curl -fsSL https://bun.sh/install | bash` + `bash bun install` + +### Configure app + +Copy `example.env` to `.env` then set the backend api address: + + VITE_BASE_API=https://somewhere.com/ + +#### Environment variables + +| Name | Description | +| ------------- | ------------------------------------------------------------------------------------ | +| VITE_BASE_API | The api url of the deployed backend ([PasarGuard](https://github.com/PasarGuard/panel.git)) | + +## Start development server + + bun dev + +## Simple build for production + + bun build + +## Contribution + +Feel free to contribute. Go on and fork the project. After commiting the changes, make a PR. It means a lot to us. diff --git a/dashboard/__init__.py b/dashboard/__init__.py new file mode 100644 index 000000000..fe59c52e1 --- /dev/null +++ b/dashboard/__init__.py @@ -0,0 +1,62 @@ +import atexit +import os +import subprocess +from pathlib import Path + +from fastapi.staticfiles import StaticFiles + +from app import app, on_startup +from config import DASHBOARD_PATH, DEBUG, UVICORN_PORT, VITE_BASE_API + +base_dir = Path(__file__).parent +build_dir = base_dir / "build" +statics_dir = build_dir / "statics" + + +def build_api_interface(): + subprocess.Popen( + ["bun", "run", "wait-port-gen-api"], + env={**os.environ, "UVICORN_PORT": str(UVICORN_PORT)}, + cwd=base_dir, + stdout=subprocess.DEVNULL, + ) + + +def build(): + proc = subprocess.Popen( + ["bun", "run", "build", "--outDir", build_dir, "--assetsDir", "statics"], + env={**os.environ, "VITE_BASE_API": VITE_BASE_API}, + cwd=base_dir, + ) + proc.wait() + with open(build_dir / "index.html", "r") as file: + html = file.read() + with open(build_dir / "404.html", "w") as file: + file.write(html) + + +def run_dev(): + build_api_interface() + proc = subprocess.Popen( + ["bun", "run", "dev", "--base", os.path.join(DASHBOARD_PATH, "")], + env={**os.environ, "VITE_BASE_API": VITE_BASE_API, "DEBUG": "false"}, + cwd=base_dir, + ) + + atexit.register(proc.terminate) + + +def run_build(): + if not build_dir.is_dir(): + build() + + app.mount(DASHBOARD_PATH, StaticFiles(directory=build_dir, html=True), name="dashboard") + app.mount("/statics/", StaticFiles(directory=statics_dir, html=True), name="statics") + + +@on_startup +def run_dashboard(): + if DEBUG: + run_dev() + else: + run_build() diff --git a/dashboard/build.zip b/dashboard/build.zip new file mode 100644 index 0000000000000000000000000000000000000000..13cb6a925483bcf15558b989da9a944dd0e391ad GIT binary patch literal 1785169 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

f8fZoy66ZSC8L3CC5W?Oo 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 qmNZVvF9=jl$81ufw$IXK5A~zS;;(ljD3iUs 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 z�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

Y?G=83%WU6iV46cGCW0h>uElS2A5~YnG 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

G)U`#|4-9&6 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%0AVQ4aWzuZDHYHsG-`u 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%0D#jop;YHps-)#pCi(;-)Mzl7nqdGaLekwMcBYPv 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

h#1kkv?7c?+J+K~tx)dS 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�buONI2xNe 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 r`n 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�P3TCX!rs8pubAad0 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

G*UJ#uaMYkiALAMTugI@3z+{51XuuX76&!u>j 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ξfnQLZs(Lad69m~{?f{EkT9g}~i-ImQE`e)?Qk?)s`ms~bR zOfG9<7B{ZukTP`K_A&9&pTOX+*4(7t*u*-sIb4Se@;Gy@s9=!L4c)$4EXe19q|DyF z66$*}pPQct&UTA|#|7w3fhD7?I5Itw zkqJG5&z6q?=gOe z>07p`edCkr7B_ZEj)Lu3wYjO6qRV4TwvA(mZ9f8EJh!4Njg^eNIb$n+etd~k<1M(>?eB?hI(ityLhiA@+{-NJiHaGuI-m^b7jwAiA45_)4 zU5G5q-QEw*X;Xk1V1WgaWtsU>sg&bKVo2W5nD?&_{`@cx$WO1ZoRJ!>6UvNIqY=B9cQ>J@XOgK(9+i6_|vjz8DPQ%?+j=Ri1d zEhLjc*-m^xmS_b5pnDdP1*b>@vU{(S_{qN%<7OR#tVDRD0|n-Q$02-oV2L3@2EL@G zlD2@u9E?Kv?!ybYNTBll{l$D_taAS2m7HXx@_zqnUgD|T|9nGkvV!~@SZGTMm)z9K z8i4q@{MVqlWNT~DUG5#|X7|fp6RYK$S5@yqix+rJGbf6ZCU0V&)p(6H%E@9iy*yu# zVcV36L@_vcku$~vKgvnlnvVpzoPU2QCmHAR{^RAmY~BjNDPhGgOn}3r3e*z@>Is5+ zk_Yvq*OV;@Xv3QZa3N0Y6i_ja3W%7odxvk3Id(EGTP)}LZ!5W9D4CzU5*d&J-c}Oe z^(486&zPQtUyFIm9uG#wLp#wzX(+J*QUHG#_XxnqWwc(ea7-Z6@4z+7Ok|*Rj4lsE z&HOH%B)U(G=uUw>4X6yn)_h`f^u*@KSTTCU+5nH%>opVJcJKqVvR;qtb$k=8?C@5m zoHId+*_3$EDhz;5HKUQ%6fQkZt*n0=4LDVRKOB!QxAP)N!qb+a2z`OfXTSh9XS|Km z^9d;|p&+2!7e+3t<9XSF$*)4p<_F=@XG?~?oItB5jK9nvEAbmbvZeElag;KF_b8R0 zaOaiU6lB~c?vCG$Z5sPVYIBM0k`HKXlaDFQlwRl=_bQ&JKDL!=V(ne@rc=zj=o>o4 z#4#)3FR;JpDdx!j>z!iWR-a-{?eZz+$o^wbG4IpT`NQp3J%6~>&L6zW^M||WZ@Qh;*99g&Z+)X`(zg zxP@ewFxDciFUB+|BnP0KYD|E@o}q;}nw$+B_mORHMup6yCV-*PX)tnhTCIwdEjEwc zp3)NFpy)g+E{BP)d`vVIsr*%_6mUFrERw|V@VRO%)Dsyi2Z|}$f>7o^nIfl{g$N#7 z7;)xTMcLT~u{%#IPBO4`I*sE1xtpO%us?&?NjzkDRm(?i%q!d8fgQS#n+)V^ z@nHTcXqQ?`RI#kiEq2riiJJK#6%3i`^;c$6*wN+D1MQ?B(hH-1$748hLOXjC4YikO zrM=2WSFUKKTO3$VkByyD!${~NjJ$YZQmKtk6hYuWR?JfSDOZ_n zAWv4r;TnTJd)wJBx+U^W$<~B3Y1wbEc_Lx?>j82_CdGuHu#Qk|9m+!v#>}M_MKR)u zT{M-9zWX4!cvZ-C5tw9Y`9-70S!1~uS_u!=()gaN%2^TwW#fBm)>!R@;z+WTD`J&k z(%ykQtgNVsr|cbAktTil3;jl{%VWg3JS11*c;TE|9;RRHX5p0Qu>gVYokuX1E25)lhI zi^gy={C8IlKQsICb1t0BP((Ql2}nff0KpLty8^gbQMMIWN;5h3EbQb=S*Z)Qe4#50 zRUs;%yTnk5E*N2gD{@8%+8nk41lgI-viC82cM!58fF*dxNI}8n$v0G-M0AAl(nc6B z%|pWBHCEi`iIfBv>JoGJ8KQix;I;sJav&DdMpHzey=^;o_APD4&hp!_yKmVE`Y8M& zPSEe(;skwQe^n>wcYlf#^g(G0OPBW7++HqiMa37D+sm_8wwDXFy*&Gp+sm`)uM?m7 zT0sqX7VtHGD+yWNERM&saEh`#bO{-sbOVM~_gn%~QFO>W`*eSFtk4M=6@eFvHf)|Z6PPRlFV-iz@-V^dc+Fq0id4(`j z7|zfW0ZU^ZajMpF;l@yM485uGXkj%6?_w35`mD$kby0>M(PBY!MPruSf1j~b%yZ7r2qp*Cz=2=VXsoo zXs+n9i{55e)_`KGLr`;}8F3El> zTFrZA>!-ZUyhny+>FVPX8FC#?-=^Ifc&w=PNC%$XQ8@MzKZ1ZjvO)HYf)r?BP#D9o zL8~#38Z?Xu2G{Fh$RO_SHG^v;AZ zCd&NGuQuLr4#mjULOdMiE;}CnmdlQw&u3+x_02_+qRwT*tU}$+sVy&Joo%nYgVoL9=?Y$M~~G#y65ak|LM%VeWk-$2<|G5 zRPOs~EHzQ88A%}zvk$vkTP#1{C!nGUFD{i;`6^?DoV8uOqZ;IoIxLTi{Yku7-7ir1 zu|m<~{WZst{k3I$Z;t2QZZFCC;Ts%eH2Tcf5_`5g?p2s344n->N#wpiJHvHf@gy>HQ`bmbnIo5}X(PnfMDz{U=3d+V(U!$qy>EksL|4gtw@dzK zjb+unJl1-1l}(y`@P-;TrKSX-zNn!Y;j6Tc6c)Q8Q!c}Pq~2v>NzUFXNem!KC=J&* z8sy2l_rW{IXzx&qGlOh#9D=|RvvfmOU0vU>!D1RvJxS#it|#>*MCJ9phiU}W-f72& z5;Upfi+Ky5&7N^I$}XgU7naYJo1|f(&8cGKp~1U*8{zh#8g$`3^=36~z*)SSJ&~y^ ziZ}?WO(qBT4h0(;!Hf$i(GO`AS+)g=-y8etg5F?3%i#A9 zT4!=XdS_ZL@M^C4_Dkn^qm;q2!O7P;CCo(?0uHUNvO{XZ;^2r!C+5{3>wFy72%i`) zTpxweJp3P5)u>EnQ76{=R-f4wz#tPJ*OS~M&$?i5>mWByA2;a z?XlsED-l2&0zLqCk;!egh+DPO-&A@YU;tzA8K%Ub63j3x0`UP}jr7Kn^-se3h|c!H zxd8t#?zu7hwyc|3$^l)iNWT@&LIqF0NOSbpkCM14S;R=(am?Q{jhF>DG+$rRstjnp zXQQF4bPFRN+Y_PDpW?}^Ws_}Tzgi;AGKOkIBo>QGAyL5ZImnCR-7z>!x$CYjD7W{q zuo!elNoh0@5y{La!<;F<#VZv=br!WeFZKCmF zHnKd93A`&1(j~%qK@q$0ynHszJ*?H+pXFmaGiO}On%Oi7!E^!r8*GThcAFhrMCz-?oNUj3p~pSZONMi%&vz?Sr&CzWijll`w&@VbGo&`8c8DNmJ@T=w%0{_cel~qE+QrV*if9H*H#+J-g_VBlzNV>55 zG$W7*SJ~W<2I1|G+{y*AX$P@MKU+h^d}*VssOF|sMRSdDxj_WdScHv@A=0JFidoO~ z9ar4h4{bDZ6KBP0oYp8XFCqD(v&ChS@M1IB1#4B%6^|`gXc^N(H#s_HRp)H-7JB}X z-L^KTliTdyZP8f~rZORoV{TJ9E%L`=E7QMh0Lj%i-29DkGQK}KK8MgHqbDcg&-*30 zY|gmTp!)5_1HeI7QP3IgevevYaePUH!n1WL)*}Sssr&Er>X+{&nY#FsQX+QxW=_X zr)>6L3}S~s38D%xA^?TD>puzy-5X%7FSDs2N(1ULT-mv%yRVZxA)0>nMUmiI3b)OJ(=Uwp zLXx~3imyXCL8n4(ZhdfS$x&*_!7=s6u#_I1sa>-%r)vVb4X9pKN85^INQB^GWiHme zw}(<^57FYJb6(Z|;9S)=?{&09J|-L^YzcK*e12?$CzIkX9sZU?tgD08=$bID!T40k zzd2`noK|2d&V&_%ZINZA7GeoCcSsgHVCwzR)0shV*V#w01mR0UK;~`7A{Y%UcpAoA zFLK*MzQ$xDSqVo$;3r#84kjt$wjnQmTFUH`!>#r{5{=6>EGl<$?o}zWnZtHcJQl8J z2Bx(Y8Dl0Uu7W!6Da+8Cd|f5e1WBp+~BSTZqZIo0Gqw+Kdi*@*Wij zmPD0_Ra(;KXA4hKk|peV1HR#lV2|A7iylq@Sm!yY`nTw3i;(k2FjlN3-v~~z-ieCo zY(`)p_>If6h7Hd|k25OOEN^huo5ir?TF6ic@B7n&weN$VC|w0zJW(VG?R8qmNE2b- zduYsWbQP{NKSe`*&xJ&s?uRPO>j-0t_#BxS86T&Vqn4zpmZ*DLRw&m{OsS@+vgSJ} zFDcQLDM61kLm8r~FNz`h!UfT!Ea5U=FaAsb7M@WIzI7W$8N!kAF|C(8=-g+|4@nHO z!CH`9-Hfseva&Ym}FiU zeHx)3{$p2~bL#zvxh zZ4jgw7chUJLL}c<<1kzqNRL0Q2A>7k&G!^vcFP>LyJi5PLxW^GtJ}?^057v=R$*{_ ztJ|rB2ENb(CReWzGm=;^TP8bWc%3olxHKtx31NVKk2$YjG=WZMQB)2ib1sBs0;6&4 z4aL*%I)P6YC8QWm_b8+oTfkPJ)Rg@Bzu?DK*0;uz8|c|zp%Q2?A_U%YUO^NWY2 zRwn#N#d(##i`wGOw=Lq+?Zl|;Z}U(sakI{sN0ImST5 zV@+ojLt#AgKqw;IC2UABvh@X?iQqjy7c&szt&=uQR{ZmZUE7zx^tV|-(SLV|^Uhs+ ze7B!Ib6@9Kq`tsgd0xd~VP)-Y{>8^D+zMcRoxQi}?OX9^(i97Vv4r!mZcL2{_^4z4 zdg*Js_qNROD8sZA7ua91+gD6}j4I4OacZY^wjw@-_cRvwdod0>?h+EFy!z`jM8?>&w!^g<^#qm%CXtO4jF zAbQymdurA_SSI$x2+^#c&?3{uy^egE5A&?w+LFu`#`)|x(e+okO1VD+B3fAKBGex? z(4lsV@c}%D!JVgu&&Y?P$*=sj8SGTATf|@%j$sDIWzq?xY1Au%Ot??=9b5Tfyl{VM zH&0{}Brzy23TdomlpG#xx0F*f+m<8Cg zk#K@h0ii8JI+~2pWD2@iEI}gRcA>-^h1ETonW{ZYT)Y&1CfM>Le%BkyMT8>@m2ol3 zJ}Mq&nmL!uHN_d?>wy<9wCw~D{b~@i!{dlq?9Gm%XFr-Vxg4$Glk*?&=i;FLqexN> z`tDX2ED(BH79Am}It^NilCkI*o33*v@=~B@kB+|V>Z>TrR=O0)r1mzRTD5ax8v#j0 z1s=;zAakN4L=%kRiK;$uJ#F6QwOa&;jmr~H>@>SKh7b*iFd#%gWCIi& zpO?M1jdKJl-C2a*>S&p$%%$Xj>y}CHr&X(< zmQd$0R1Cke4Z8_J=~I0&X=xy#L%d3YoQEImRt9+XxHE~qpvyqQA0!)8$60acHewb0 zLj^6qouE670*bpD(zPArfHR|}E_VbY*ah)2m}`?@8hkB5*VNG~Okw315=Iebj$Htm ze=#-IqYxmrHRqcvrZeALh=|;79y9+1xMbz1DJ&LCa-I$WrILOj=UZ#Pq@!zwcX$nY*-Yo>Z z!kMq&t(u+uGtqJdv`GK*2=TH!cKxBA0pFV}G;=iEA5DuY#2@FytvtJOkfmldM<_Fx zy6%-sx+=4?8XIfO&o^eahpTS{$;#J$X&C4tlf}%2nd=c5v{hZ3J}~9O2!#2Ns$5Q> zw4dfw5uxb@LN<3JVe^Jh-;^{4GrQEX|DVdAc4Icu>^H6m;^mSP^25>URr_c-%*xm( zF7F!#0}qB5)z728iXZ=qn$-{6ls-Hg-yef~ueXMy6M(;Gtsd@{EvhcM7R&`=)*9_H zEXnBE!(sQ^L@C1IuI@ut5bUVxw@n*1Y@6@C=iD8fuQj^-6skR@W?``PcV>+p0nQ9k z2kSPMKRP`W(T1ueBfUh~`V|q9$_XDo)4I0KMC?f4zCVLYD@#)~Q@vZqe9=Yi{sVeO z5XcZ+7wtMIYloWk132!h4xvB3|Ll5ZqGX*Ub$i#C6XRKws=AiH%2T$+zqaH1LcbZ^$M`UD(k3){@XlQqG3)hN=y>9Nro`V?fiUb_ zB_FXQik2bzS71-zMd3X*@#+4p_x>_k>={RYM=^`M8XPa8{W=OOeJo&``>Y1g$TfK! zsVe@&*Jr3we@GEIU0jzGX2oK2;@ zhL{4YWAXT?bIro=2w9ZgTK;4lDr5;L3`YTxdPVVuiNHdZo`_LJH7NcpU%NqV*#Jty z0uZeNGFJ4?4=Q-aA66IShb_LS?-gd z5FUn4&Yt~?v#~9#`LYqSjh(HeZ+c$zDcEKMP@8y`38mOKd4sZv{yEN_Ao%^qkch3d(>H?n*L3RD0gNT*Rd$ZJgN}4dx@9mr@(hBr zIbZ|FwF0U|d47PQ%T}Ppcj^YC>DxZk;bo@4;-&OE`*aIi6!tXsEZTU0#l4)`OYVKF zwYdFVEaPZuBe|C&b_P#rZln*~_4Hs>1b@}Z<)qYtiYg};A?aT?-0w~Gj0*wdyj4S4 z*v9eQ^iNrhA@@brj{cD#Pz0{W53p5~zYaU4cndsnIji+#8KI1xQ7zRnJNrvEpj2z| zce$;BmzNp-qAZ>vD?dRjZ4^d)$VnJc3E)u&L+D#v>lY@rQN=Nc;+dD&q6_#Qy7EzC zYgz`Ph3{N(FizzKiJ*jS9`gF@ynD7?@tsK>J@^&LlO9})yWQng&Yz1>10_DFZqf+? z(8ke=JS|5&lF91Q#0^vBAvu@P2>KC>Ru&B#{@Lwy>|7cuG&Rj!cr{1b;4k(Qps|@N zCd)5NXj4Qcy-JPCcDA-uSmZC%kCVFR3*@z%a6gvq z6#$m)k^2mF@?;04qpO}(!ug^W5-u3{n@4wuQsDM54i3%#Ikx2;FdM&5wRf(AX0Sba zn`uE<=aOgT7lF&B1s5-ggXm|>@Fj_h%PFV=JPDi>p+q}F_bPX~d1~@$VZ%$aY+z>s zy-`Gr{k?$zafJtI*#m7LsbQ;AryQ)+_;8gyDm%awgMZ{`u#I~my=hPGHV*5)Vi#$~ zycd(f7SK10s$=?BMB2q#_eEbM3Ut;I1pEVVZD!+%mu<(rX;+tY^~{E-vLvx5A}SuH zJc^WngJNkb%)yq45LeL7VzL=H{Y1Ck2rC8FHD}jfCKWATSWh<9V8s*x*!1P*Ld^`4`k*;-=vU7>@T(?g)n^!L}SgB%!Fgdd$@ zKD_VaEGo^vgJC`!o~jem{CK#%+31WB$06rZ4`X-hpdKxmMt=tY18`@}e=_klgI}6L z-Y^i2y>H&NFese3J3=@!G#dLfkh;lA?v2KENV#Nm!x#)Pbx26d52SwHd#QLoul>Hc z!mXr*_V};4z+Ahaq|QwGL>qHhwk^VZy&MgR!f$^vS~hEfvAEvkl?YgJS4bYw8Lz9H%ON?lhrm@qSlnyeb6 ztiJ$;19Zz$NHt#gRDHk*Pt+W9eR_WPS zgcrx~dJ+>p^r_I~^)5fgSKoL#yeg8HQ0_PmlrjHV+H2L`CP%xnla(W zij-p&9@#ZBUb)GBY~SkM$Fcu-R;e=r+?q$uZi#(kz#Xyd^>y>!N#&e{lda;mFSH(c zwy<6-EE}xEwD=0V^q>a3RGw&w{YdVXqIITKQ69461|R`Pt+%?uzSxoqf29s^lJsfc zQYR=f@degzb*-06b77HNM`je<4UcMJ0=QT|K+SV-u`WAq0ffDqTW;+ zqnS%-;54y1VZq75al&_Yu4}5Wh#lMOZ)369}&M8I2)iKf<33lf$Vg)#BzZ zDHvUQdL)Fa#RWc<e$F_>OihCJ0aI$=OR#`S2nibKkUIyrIi*SZzMNB;lA|Rk)SF2S4FgaAjck_GiR_!lZXT%6Muh?}1cauLrXZrb&$*!#N|h19 zkyJK*sYDKUuyB6JtE_q?EQ`5a+l_|IcIK2L^94LAgL%0D=Pbs*+qBWHLfX4M{rS{a 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


AgE$ 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
+ + + diff --git a/dashboard/orval.config.ts b/dashboard/orval.config.ts new file mode 100644 index 000000000..8fe8c259b --- /dev/null +++ b/dashboard/orval.config.ts @@ -0,0 +1,24 @@ +import { defineConfig } from 'orval' + +export default defineConfig({ + app: { + output: { + client: 'react-query', + target: './src/service/api/index.ts', + mode: 'single', + clean: false, + prettier: true, + tslint: true, + headers: false, + override: { + mutator: { + path: './src/service/http.ts', + name: 'orvalFetcher', + }, + }, + }, + input: { + target: `http://127.0.0.1:${process.env.UVICORN_PORT || 8000}/openapi.json`, + }, + }, +}) diff --git a/dashboard/package-lock.json b/dashboard/package-lock.json new file mode 100644 index 000000000..630cd788e --- /dev/null +++ b/dashboard/package-lock.json @@ -0,0 +1,12735 @@ +{ + "name": "pasargaurd-ui", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "pasargaurd-ui", + "version": "0.0.0", + "dependencies": { + "@dnd-kit/core": "^6.3.1", + "@dnd-kit/sortable": "^10.0.0", + "@dnd-kit/utilities": "^3.2.2", + "@hookform/resolvers": "^3.10.0", + "@monaco-editor/react": "^4.6.0", + "@radix-ui/react-accordion": "^1.2.3", + "@radix-ui/react-alert-dialog": "^1.1.4", + "@radix-ui/react-avatar": "^1.1.2", + "@radix-ui/react-checkbox": "^1.1.4", + "@radix-ui/react-collapsible": "^1.1.2", + "@radix-ui/react-dialog": "^1.1.4", + "@radix-ui/react-dropdown-menu": "^2.1.4", + "@radix-ui/react-hover-card": "^1.1.6", + "@radix-ui/react-label": "^2.1.1", + "@radix-ui/react-popover": "^1.1.6", + "@radix-ui/react-progress": "^1.1.1", + "@radix-ui/react-radio-group": "^1.3.6", + "@radix-ui/react-scroll-area": "^1.2.2", + "@radix-ui/react-select": "^2.1.4", + "@radix-ui/react-separator": "^1.1.1", + "@radix-ui/react-slot": "^1.1.1", + "@radix-ui/react-switch": "^1.1.2", + "@radix-ui/react-tabs": "^1.1.3", + "@radix-ui/react-toast": "^1.2.4", + "@radix-ui/react-toggle": "^1.1.2", + "@radix-ui/react-toggle-group": "^1.1.2", + "@radix-ui/react-tooltip": "^1.1.6", + "@stablelib/base64": "^2.0.1", + "@stablelib/x25519": "^2.0.1", + "@tanstack/react-query": "^5.64.0", + "@tanstack/react-table": "^8.20.6", + "@vitejs/plugin-react": "^4.3.4", + "axios": "^1.8.4", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "cmdk": "^1.1.1", + "cross-env": "^7.0.3", + "date-fns": "^4.1.0", + "date-fns-jalali": "4.1.0-0", + "dayjs": "^1.11.13", + "embla-carousel-react": "^8.5.2", + "es-toolkit": "^1.31.0", + "eventsource": "^3.0.7", + "i18next": "^24.2.1", + "i18next-browser-languagedetector": "^8.0.2", + "i18next-http-backend": "^3.0.1", + "isbot": "^5.1.21", + "lodash.debounce": "^4.0.8", + "lucide-react": "^0.465.0", + "next-themes": "^0.4.6", + "ofetch": "^1.4.1", + "qrcode.react": "^3.2.0", + "react": "^18.3.1", + "react-day-picker": "9.7.0", + "react-dom": "^18.3.1", + "react-github-btn": "^1.4.0", + "react-hook-form": "^7.54.2", + "react-i18next": "^15.4.0", + "react-router": "^7.1.1", + "react-use-websocket": "^4.13.0", + "recharts": "^2.15.1", + "sonner": "^2.0.3", + "tailwind-merge": "^2.6.0", + "tailwindcss-animate": "^1.0.7", + "ufo": "^1.5.4", + "uuid": "^11.1.0", + "vaul": "^1.1.2", + "vite-tsconfig-paths": "^5.1.4", + "zod": "^3.24.1", + "zustand": "^5.0.3" + }, + "devDependencies": { + "@react-router/dev": "^7.1.1", + "@react-router/fs-routes": "^7.1.1", + "@svgr/webpack": "^8.1.0", + "@types/lodash.debounce": "^4.0.9", + "@types/node": "^20.17.28", + "@types/react": "^18.3.18", + "@types/react-dom": "^18.3.5", + "ajv": "^8.17.1", + "autoprefixer": "^10.4.20", + "eslint": "^9.18.0", + "eslint-plugin-react-hooks": "^5.1.0", + "eslint-plugin-react-refresh": "^0.4.18", + "orval": "7.4.1", + "postcss": "^8.4.49", + "prettier": "^3.6.2", + "prettier-plugin-tailwindcss": "^0.6.13", + "tailwindcss": "^3.4.17", + "typescript": "~5.6.3", + "typescript-eslint": "^8.19.1", + "vite": "^6.2.4", + "vite-plugin-pwa": "^1.0.1", + "vite-plugin-svgr": "^4.3.0", + "wait-port": "^1.1.0" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@apideck/better-ajv-errors": { + "version": "0.3.6", + "dev": true, + "license": "MIT", + "dependencies": { + "json-schema": "^0.4.0", + "jsonpointer": "^5.0.0", + "leven": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "ajv": ">=8" + } + }, + "node_modules/@apidevtools/json-schema-ref-parser": { + "version": "11.7.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.15", + "js-yaml": "^4.1.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/philsturgeon" + } + }, + "node_modules/@apidevtools/openapi-schemas": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/@apidevtools/swagger-methods": { + "version": "3.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@apidevtools/swagger-parser": { + "version": "10.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@apidevtools/json-schema-ref-parser": "11.7.2", + "@apidevtools/openapi-schemas": "^2.1.0", + "@apidevtools/swagger-methods": "^3.0.2", + "@jsdevtools/ono": "^7.1.3", + "ajv": "^8.17.1", + "ajv-draft-04": "^1.0.0", + "call-me-maybe": "^1.0.2" + }, + "peerDependencies": { + "openapi-types": ">=7" + } + }, + "node_modules/@asyncapi/specs": { + "version": "6.8.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.11" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.0", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.0", + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.0", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.27.3", + "@babel/helpers": "^7.27.6", + "@babel/parser": "^7.28.0", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.0", + "@babel/types": "^7.28.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.0", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.0", + "@babel/types": "^7.28.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.27.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "regexpu-core": "^6.2.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "debug": "^4.4.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.22.10" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.27.3", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.1", + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.27.6", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.0", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.28.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.28.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.28.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-globals": "^7.28.0", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/traverse": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/template": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.28.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.28.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.28.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.27.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.28.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.28.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.28.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.28.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.0", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.27.1", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.27.1", + "@babel/plugin-syntax-import-attributes": "^7.27.1", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.28.0", + "@babel/plugin-transform-async-to-generator": "^7.27.1", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.0", + "@babel/plugin-transform-class-properties": "^7.27.1", + "@babel/plugin-transform-class-static-block": "^7.27.1", + "@babel/plugin-transform-classes": "^7.28.0", + "@babel/plugin-transform-computed-properties": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-dotall-regex": "^7.27.1", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.0", + "@babel/plugin-transform-exponentiation-operator": "^7.27.1", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.27.1", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.27.1", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", + "@babel/plugin-transform-numeric-separator": "^7.27.1", + "@babel/plugin-transform-object-rest-spread": "^7.28.0", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/plugin-transform-private-methods": "^7.27.1", + "@babel/plugin-transform-private-property-in-object": "^7.27.1", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.28.0", + "@babel/plugin-transform-regexp-modifiers": "^7.27.1", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.27.1", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.27.1", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "core-js-compat": "^3.43.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-transform-react-display-name": "^7.27.1", + "@babel/plugin-transform-react-jsx": "^7.27.1", + "@babel/plugin-transform-react-jsx-development": "^7.27.1", + "@babel/plugin-transform-react-pure-annotations": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.27.6", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.0", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.0", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.1", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@date-fns/tz": { + "version": "1.2.0", + "license": "MIT" + }, + "node_modules/@dnd-kit/accessibility": { + "version": "3.1.1", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@dnd-kit/core": { + "version": "6.3.1", + "license": "MIT", + "dependencies": { + "@dnd-kit/accessibility": "^3.1.1", + "@dnd-kit/utilities": "^3.2.2", + "tslib": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@dnd-kit/sortable": { + "version": "10.0.0", + "license": "MIT", + "dependencies": { + "@dnd-kit/utilities": "^3.2.2", + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@dnd-kit/core": "^6.3.0", + "react": ">=16.8.0" + } + }, + "node_modules/@dnd-kit/utilities": { + "version": "3.2.2", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.6", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.7.0", + "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", + "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", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch/node_modules/brace-expansion": { + "version": "1.1.12", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.3.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.15.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "dev": true, + "license": "MIT", + "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/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", + "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/@eslint/eslintrc/node_modules/ajv/node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch/node_modules/brace-expansion": { + "version": "1.1.12", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/js": { + "version": "9.31.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.3.3", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.15.1", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@exodus/schemasafe": { + "version": "1.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@floating-ui/core": { + "version": "1.7.2", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.2", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.2", + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.4", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.7.2" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.10", + "license": "MIT" + }, + "node_modules/@hookform/resolvers": { + "version": "3.10.0", + "license": "MIT", + "peerDependencies": { + "react-hook-form": "^7.0.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "dev": true, + "license": "Apache-2.0", + "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", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@ibm-cloud/openapi-ruleset": { + "version": "1.31.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@ibm-cloud/openapi-ruleset-utilities": "1.9.0", + "@stoplight/spectral-formats": "^1.8.2", + "@stoplight/spectral-functions": "^1.9.3", + "@stoplight/spectral-rulesets": "^1.21.3", + "chalk": "^4.1.2", + "jsonschema": "^1.5.0", + "lodash": "^4.17.21", + "loglevel": "^1.9.2", + "loglevel-plugin-prefix": "0.8.4", + "minimatch": "^6.2.0", + "validator": "^13.11.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ibm-cloud/openapi-ruleset-utilities": { + "version": "1.9.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@ibm-cloud/openapi-ruleset/node_modules/minimatch": { + "version": "6.2.0", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/string-width/node_modules/emoji-regex": { + "version": "9.2.2", + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "6.1.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.12", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.10", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.4", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.29", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jsdevtools/ono": { + "version": "7.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@jsep-plugin/assignment": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.16.0" + }, + "peerDependencies": { + "jsep": "^0.4.0||^1.0.0" + } + }, + "node_modules/@jsep-plugin/regex": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.16.0" + }, + "peerDependencies": { + "jsep": "^0.4.0||^1.0.0" + } + }, + "node_modules/@jsep-plugin/ternary": { + "version": "1.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.16.0" + }, + "peerDependencies": { + "jsep": "^0.4.0||^1.0.0" + } + }, + "node_modules/@mjackson/node-fetch-server": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@monaco-editor/loader": { + "version": "1.5.0", + "license": "MIT", + "dependencies": { + "state-local": "^1.0.6" + } + }, + "node_modules/@monaco-editor/react": { + "version": "4.7.0", + "license": "MIT", + "dependencies": { + "@monaco-editor/loader": "^1.5.0" + }, + "peerDependencies": { + "monaco-editor": ">= 0.25.0 < 1", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "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", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/git": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/promise-spawn": "^6.0.0", + "lru-cache": "^7.4.4", + "npm-pick-manifest": "^8.0.0", + "proc-log": "^3.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git/node_modules/lru-cache": { + "version": "7.18.3", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/@npmcli/git/node_modules/which": { + "version": "3.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/package-json": { + "version": "4.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^4.1.0", + "glob": "^10.2.2", + "hosted-git-info": "^6.1.1", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^5.0.0", + "proc-log": "^3.0.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/promise-spawn": { + "version": "6.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "which": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/which": { + "version": "3.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@orval/angular": { + "version": "7.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@orval/core": "7.4.1" + } + }, + "node_modules/@orval/axios": { + "version": "7.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@orval/core": "7.4.1" + } + }, + "node_modules/@orval/core": { + "version": "7.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@apidevtools/swagger-parser": "^10.1.0", + "@ibm-cloud/openapi-ruleset": "^1.26.0", + "acorn": "^8.14.0", + "ajv": "^8.17.1", + "chalk": "^4.1.2", + "compare-versions": "^6.1.1", + "debug": "^4.3.7", + "esbuild": "^0.24.2", + "esutils": "2.0.3", + "fs-extra": "^11.2.0", + "globby": "11.1.0", + "lodash.get": "^4.4.2", + "lodash.isempty": "^4.4.0", + "lodash.omit": "^4.5.0", + "lodash.uniq": "^4.5.0", + "lodash.uniqby": "^4.7.0", + "lodash.uniqwith": "^4.5.0", + "micromatch": "^4.0.8", + "openapi3-ts": "4.4.0", + "swagger2openapi": "^7.0.8" + } + }, + "node_modules/@orval/core/node_modules/esbuild": { + "version": "0.24.2", + "dev": 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/@orval/core/node_modules/esbuild/node_modules/@esbuild/win32-x64": { + "version": "0.24.2", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@orval/core/node_modules/openapi3-ts": { + "version": "4.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "yaml": "^2.5.0" + } + }, + "node_modules/@orval/fetch": { + "version": "7.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@orval/core": "7.4.1" + } + }, + "node_modules/@orval/hono": { + "version": "7.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@orval/core": "7.4.1", + "@orval/zod": "7.4.1", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/@orval/mock": { + "version": "7.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@orval/core": "7.4.1", + "lodash.get": "^4.4.2", + "lodash.omit": "^4.5.0", + "openapi3-ts": "^4.2.2" + } + }, + "node_modules/@orval/mock/node_modules/openapi3-ts": { + "version": "4.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "yaml": "^2.5.0" + } + }, + "node_modules/@orval/query": { + "version": "7.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@orval/core": "7.4.1", + "@orval/fetch": "7.4.1", + "lodash.omitby": "^4.6.0" + } + }, + "node_modules/@orval/swr": { + "version": "7.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@orval/core": "7.4.1", + "@orval/fetch": "7.4.1" + } + }, + "node_modules/@orval/zod": { + "version": "7.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@orval/core": "7.4.1", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@radix-ui/number": { + "version": "1.1.1", + "license": "MIT" + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.2", + "license": "MIT" + }, + "node_modules/@radix-ui/react-accordion": { + "version": "1.2.11", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-collapsible": "1.1.11", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-alert-dialog": { + "version": "1.1.14", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dialog": "1.1.14", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.1.7", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-avatar": { + "version": "1.1.10", + "license": "MIT", + "dependencies": { + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-is-hydrated": "0.1.0", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-checkbox": { + "version": "1.3.2", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-presence": "1.1.4", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collapsible": { + "version": "1.1.11", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.4", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.1.7", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.2", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.2", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.14", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.10", + "@radix-ui/react-focus-guards": "1.1.2", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.4", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.1", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.10", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-escape-keydown": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dropdown-menu": { + "version": "2.1.15", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-menu": "2.1.15", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.2", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.7", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-hover-card": { + "version": "1.1.14", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.10", + "@radix-ui/react-popper": "1.2.7", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.4", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-label": { + "version": "2.1.7", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu": { + "version": "2.1.15", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.10", + "@radix-ui/react-focus-guards": "1.1.2", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.7", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.4", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.10", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover": { + "version": "1.1.14", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.10", + "@radix-ui/react-focus-guards": "1.1.2", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.7", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.4", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper": { + "version": "1.2.7", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-rect": "1.1.1", + "@radix-ui/react-use-size": "1.1.1", + "@radix-ui/rect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.1.9", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.4", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.1.3", + "license": "MIT", + "dependencies": { + "@radix-ui/react-slot": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-progress": { + "version": "1.1.7", + "license": "MIT", + "dependencies": { + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-radio-group": { + "version": "1.3.7", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-presence": "1.1.4", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.10", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.10", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-scroll-area": { + "version": "1.2.9", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-presence": "1.1.4", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select": { + "version": "2.2.5", + "license": "MIT", + "dependencies": { + "@radix-ui/number": "1.1.1", + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-dismissable-layer": "1.1.10", + "@radix-ui/react-focus-guards": "1.1.2", + "@radix-ui/react-focus-scope": "1.1.7", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.7", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-visually-hidden": "1.2.3", + "aria-hidden": "^1.2.4", + "react-remove-scroll": "^2.6.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-separator": { + "version": "1.1.7", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.2.3", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.2" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-switch": { + "version": "1.2.5", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-previous": "1.1.1", + "@radix-ui/react-use-size": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tabs": { + "version": "1.1.12", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-presence": "1.1.4", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.10", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toast": { + "version": "1.2.14", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-collection": "1.1.7", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.10", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.4", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-callback-ref": "1.1.1", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-use-layout-effect": "1.1.1", + "@radix-ui/react-visually-hidden": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toggle": { + "version": "1.1.9", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toggle-group": { + "version": "1.1.10", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-direction": "1.1.1", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-roving-focus": "1.1.10", + "@radix-ui/react-toggle": "1.1.9", + "@radix-ui/react-use-controllable-state": "1.2.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tooltip": { + "version": "1.2.7", + "license": "MIT", + "dependencies": { + "@radix-ui/primitive": "1.1.2", + "@radix-ui/react-compose-refs": "1.1.2", + "@radix-ui/react-context": "1.1.2", + "@radix-ui/react-dismissable-layer": "1.1.10", + "@radix-ui/react-id": "1.1.1", + "@radix-ui/react-popper": "1.2.7", + "@radix-ui/react-portal": "1.1.9", + "@radix-ui/react-presence": "1.1.4", + "@radix-ui/react-primitive": "2.1.3", + "@radix-ui/react-slot": "1.2.3", + "@radix-ui/react-use-controllable-state": "1.2.2", + "@radix-ui/react-visually-hidden": "1.2.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.1", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.2.2", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-effect-event": "0.0.2", + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-effect-event": { + "version": "0.0.2", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-is-hydrated": { + "version": "0.1.0", + "license": "MIT", + "dependencies": { + "use-sync-external-store": "^1.5.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.1", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-previous": { + "version": "1.1.1", + "license": "MIT", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-rect": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "@radix-ui/rect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-size": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-visually-hidden": { + "version": "1.2.3", + "license": "MIT", + "dependencies": { + "@radix-ui/react-primitive": "2.1.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/rect": { + "version": "1.1.1", + "license": "MIT" + }, + "node_modules/@react-router/dev": { + "version": "7.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.8", + "@babel/generator": "^7.21.5", + "@babel/parser": "^7.21.8", + "@babel/plugin-syntax-decorators": "^7.22.10", + "@babel/plugin-syntax-jsx": "^7.21.4", + "@babel/preset-typescript": "^7.21.5", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.22.5", + "@npmcli/package-json": "^4.0.1", + "@react-router/node": "7.6.3", + "arg": "^5.0.1", + "babel-dead-code-elimination": "^1.0.6", + "chokidar": "^4.0.0", + "dedent": "^1.5.3", + "es-module-lexer": "^1.3.1", + "exit-hook": "2.2.1", + "jsesc": "3.0.2", + "lodash": "^4.17.21", + "pathe": "^1.1.2", + "picocolors": "^1.1.1", + "prettier": "^2.7.1", + "react-refresh": "^0.14.0", + "semver": "^7.3.7", + "set-cookie-parser": "^2.6.0", + "tinyglobby": "^0.2.14", + "valibot": "^0.41.0", + "vite-node": "^3.1.4" + }, + "bin": { + "react-router": "bin.js" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "@react-router/serve": "^7.6.3", + "react-router": "^7.6.3", + "typescript": "^5.1.0", + "vite": "^5.1.0 || ^6.0.0 || ^7.0.0", + "wrangler": "^3.28.2 || ^4.0.0" + }, + "peerDependenciesMeta": { + "@react-router/serve": { + "optional": true + }, + "typescript": { + "optional": true + }, + "wrangler": { + "optional": true + } + } + }, + "node_modules/@react-router/dev/node_modules/prettier": { + "version": "2.8.8", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/@react-router/fs-routes": { + "version": "7.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "minimatch": "^9.0.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "@react-router/dev": "^7.6.3", + "typescript": "^5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@react-router/node": { + "version": "7.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@mjackson/node-fetch-server": "^0.2.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react-router": "7.6.3", + "typescript": "^5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.19", + "license": "MIT" + }, + "node_modules/@rollup/plugin-babel": { + "version": "5.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.10.4", + "@rollup/pluginutils": "^3.1.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "@types/babel__core": "^7.1.9", + "rollup": "^1.20.0||^2.0.0" + }, + "peerDependenciesMeta": { + "@types/babel__core": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-babel/node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/plugin-babel/node_modules/@rollup/pluginutils/node_modules/@types/estree": { + "version": "0.0.39", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/plugin-babel/node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/plugin-babel/node_modules/@rollup/pluginutils/node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "15.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.78.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-replace": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" + }, + "peerDependencies": { + "rollup": "^1.20.0 || ^2.0.0" + } + }, + "node_modules/@rollup/plugin-replace/node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/plugin-replace/node_modules/@rollup/pluginutils/node_modules/@types/estree": { + "version": "0.0.39", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/plugin-replace/node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/plugin-replace/node_modules/@rollup/pluginutils/node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@rollup/plugin-terser": { + "version": "0.4.4", + "dev": true, + "license": "MIT", + "dependencies": { + "serialize-javascript": "^6.0.1", + "smob": "^1.0.0", + "terser": "^5.17.4" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.45.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.45.0.tgz", + "integrity": "sha512-2o/FgACbji4tW1dzXOqAV15Eu7DdgbKsF2QKcxfG4xbh5iwU7yr5RRP5/U+0asQliSYv5M4o7BevlGIoSL0LXg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.45.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.45.0.tgz", + "integrity": "sha512-PSZ0SvMOjEAxwZeTx32eI/j5xSYtDCRxGu5k9zvzoY77xUNssZM+WV6HYBLROpY5CkXsbQjvz40fBb7WPwDqtQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.45.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.45.0.tgz", + "integrity": "sha512-BA4yPIPssPB2aRAWzmqzQ3y2/KotkLyZukVB7j3psK/U3nVJdceo6qr9pLM2xN6iRP/wKfxEbOb1yrlZH6sYZg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.45.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.45.0.tgz", + "integrity": "sha512-Pr2o0lvTwsiG4HCr43Zy9xXrHspyMvsvEw4FwKYqhli4FuLE5FjcZzuQ4cfPe0iUFCvSQG6lACI0xj74FDZKRA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.45.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.45.0.tgz", + "integrity": "sha512-lYE8LkE5h4a/+6VnnLiL14zWMPnx6wNbDG23GcYFpRW1V9hYWHAw9lBZ6ZUIrOaoK7NliF1sdwYGiVmziUF4vA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.45.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.45.0.tgz", + "integrity": "sha512-PVQWZK9sbzpvqC9Q0GlehNNSVHR+4m7+wET+7FgSnKG3ci5nAMgGmr9mGBXzAuE5SvguCKJ6mHL6vq1JaJ/gvw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.45.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.45.0.tgz", + "integrity": "sha512-hLrmRl53prCcD+YXTfNvXd776HTxNh8wPAMllusQ+amcQmtgo3V5i/nkhPN6FakW+QVLoUUr2AsbtIRPFU3xIA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.45.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.45.0.tgz", + "integrity": "sha512-XBKGSYcrkdiRRjl+8XvrUR3AosXU0NvF7VuqMsm7s5nRy+nt58ZMB19Jdp1RdqewLcaYnpk8zeVs/4MlLZEJxw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.45.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.45.0.tgz", + "integrity": "sha512-fRvZZPUiBz7NztBE/2QnCS5AtqLVhXmUOPj9IHlfGEXkapgImf4W9+FSkL8cWqoAjozyUzqFmSc4zh2ooaeF6g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.45.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.45.0.tgz", + "integrity": "sha512-Btv2WRZOcUGi8XU80XwIvzTg4U6+l6D0V6sZTrZx214nrwxw5nAi8hysaXj/mctyClWgesyuxbeLylCBNauimg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.45.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.45.0.tgz", + "integrity": "sha512-Li0emNnwtUZdLwHjQPBxn4VWztcrw/h7mgLyHiEI5Z0MhpeFGlzaiBHpSNVOMB/xucjXTTcO+dhv469Djr16KA==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.45.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.45.0.tgz", + "integrity": "sha512-sB8+pfkYx2kvpDCfd63d5ScYT0Fz1LO6jIb2zLZvmK9ob2D8DeVqrmBDE0iDK8KlBVmsTNzrjr3G1xV4eUZhSw==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.45.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.45.0.tgz", + "integrity": "sha512-5GQ6PFhh7E6jQm70p1aW05G2cap5zMOvO0se5JMecHeAdj5ZhWEHbJ4hiKpfi1nnnEdTauDXxPgXae/mqjow9w==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.45.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.45.0.tgz", + "integrity": "sha512-N/euLsBd1rekWcuduakTo/dJw6U6sBP3eUq+RXM9RNfPuWTvG2w/WObDkIvJ2KChy6oxZmOSC08Ak2OJA0UiAA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.45.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.45.0.tgz", + "integrity": "sha512-2l9sA7d7QdikL0xQwNMO3xURBUNEWyHVHfAsHsUdq+E/pgLTUcCE+gih5PCdmyHmfTDeXUWVhqL0WZzg0nua3g==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.45.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.45.0.tgz", + "integrity": "sha512-XZdD3fEEQcwG2KrJDdEQu7NrHonPxxaV0/w2HpvINBdcqebz1aL+0vM2WFJq4DeiAVT6F5SUQas65HY5JDqoPw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.45.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.45.0.tgz", + "integrity": "sha512-7ayfgvtmmWgKWBkCGg5+xTQ0r5V1owVm67zTrsEY1008L5ro7mCyGYORomARt/OquB9KY7LpxVBZes+oSniAAQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.45.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.45.0.tgz", + "integrity": "sha512-B+IJgcBnE2bm93jEW5kHisqvPITs4ddLOROAcOc/diBgrEiQJJ6Qcjby75rFSmH5eMGrqJryUgJDhrfj942apQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.45.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.45.0.tgz", + "integrity": "sha512-+CXwwG66g0/FpWOnP/v1HnrGVSOygK/osUbu3wPRy8ECXjoYKjRAyfxYpDQOfghC5qPJYLPH0oN4MCOjwgdMug==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.45.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.45.0.tgz", + "integrity": "sha512-SRf1cytG7wqcHVLrBc9VtPK4pU5wxiB/lNIkNmW2ApKXIg+RpqwHfsaEK+e7eH4A1BpI6BX/aBWXxZCIrJg3uA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@shikijs/core": { + "version": "1.29.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/engine-javascript": "1.29.2", + "@shikijs/engine-oniguruma": "1.29.2", + "@shikijs/types": "1.29.2", + "@shikijs/vscode-textmate": "^10.0.1", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.4" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "1.29.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "1.29.2", + "@shikijs/vscode-textmate": "^10.0.1", + "oniguruma-to-es": "^2.2.0" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "1.29.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "1.29.2", + "@shikijs/vscode-textmate": "^10.0.1" + } + }, + "node_modules/@shikijs/langs": { + "version": "1.29.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "1.29.2" + } + }, + "node_modules/@shikijs/themes": { + "version": "1.29.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "1.29.2" + } + }, + "node_modules/@shikijs/types": { + "version": "1.29.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.1", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@stablelib/base64": { + "version": "2.0.1", + "license": "MIT" + }, + "node_modules/@stablelib/binary": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "@stablelib/int": "^2.0.1" + } + }, + "node_modules/@stablelib/bytes": { + "version": "2.0.1", + "license": "MIT" + }, + "node_modules/@stablelib/int": { + "version": "2.0.1", + "license": "MIT" + }, + "node_modules/@stablelib/keyagreement": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "@stablelib/bytes": "^2.0.1" + } + }, + "node_modules/@stablelib/random": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "@stablelib/binary": "^2.0.1", + "@stablelib/wipe": "^2.0.1" + } + }, + "node_modules/@stablelib/wipe": { + "version": "2.0.1", + "license": "MIT" + }, + "node_modules/@stablelib/x25519": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "@stablelib/keyagreement": "^2.0.1", + "@stablelib/random": "^2.0.1", + "@stablelib/wipe": "^2.0.1" + } + }, + "node_modules/@stoplight/better-ajv-errors": { + "version": "1.0.3", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "jsonpointer": "^5.0.0", + "leven": "^3.1.0" + }, + "engines": { + "node": "^12.20 || >= 14.13" + }, + "peerDependencies": { + "ajv": ">=8" + } + }, + "node_modules/@stoplight/json": { + "version": "3.21.7", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@stoplight/ordered-object-literal": "^1.0.3", + "@stoplight/path": "^1.3.2", + "@stoplight/types": "^13.6.0", + "jsonc-parser": "~2.2.1", + "lodash": "^4.17.21", + "safe-stable-stringify": "^1.1" + }, + "engines": { + "node": ">=8.3.0" + } + }, + "node_modules/@stoplight/json-ref-readers": { + "version": "1.2.2", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-fetch": "^2.6.0", + "tslib": "^1.14.1" + }, + "engines": { + "node": ">=8.3.0" + } + }, + "node_modules/@stoplight/json-ref-readers/node_modules/tslib": { + "version": "1.14.1", + "dev": true, + "license": "0BSD" + }, + "node_modules/@stoplight/json-ref-resolver": { + "version": "3.1.6", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@stoplight/json": "^3.21.0", + "@stoplight/path": "^1.3.2", + "@stoplight/types": "^12.3.0 || ^13.0.0", + "@types/urijs": "^1.19.19", + "dependency-graph": "~0.11.0", + "fast-memoize": "^2.5.2", + "immer": "^9.0.6", + "lodash": "^4.17.21", + "tslib": "^2.6.0", + "urijs": "^1.19.11" + }, + "engines": { + "node": ">=8.3.0" + } + }, + "node_modules/@stoplight/ordered-object-literal": { + "version": "1.0.5", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/@stoplight/path": { + "version": "1.3.2", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/@stoplight/spectral-core": { + "version": "1.20.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@stoplight/better-ajv-errors": "1.0.3", + "@stoplight/json": "~3.21.0", + "@stoplight/path": "1.3.2", + "@stoplight/spectral-parsers": "^1.0.0", + "@stoplight/spectral-ref-resolver": "^1.0.4", + "@stoplight/spectral-runtime": "^1.1.2", + "@stoplight/types": "~13.6.0", + "@types/es-aggregate-error": "^1.0.2", + "@types/json-schema": "^7.0.11", + "ajv": "^8.17.1", + "ajv-errors": "~3.0.0", + "ajv-formats": "~2.1.1", + "es-aggregate-error": "^1.0.7", + "jsonpath-plus": "^10.3.0", + "lodash": "~4.17.21", + "lodash.topath": "^4.5.2", + "minimatch": "3.1.2", + "nimma": "0.2.3", + "pony-cause": "^1.1.1", + "simple-eval": "1.0.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": "^16.20 || ^18.18 || >= 20.17" + } + }, + "node_modules/@stoplight/spectral-core/node_modules/@stoplight/types": { + "version": "13.6.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.4", + "utility-types": "^3.10.0" + }, + "engines": { + "node": "^12.20 || >=14.13" + } + }, + "node_modules/@stoplight/spectral-core/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@stoplight/spectral-core/node_modules/minimatch/node_modules/brace-expansion": { + "version": "1.1.12", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@stoplight/spectral-formats": { + "version": "1.8.2", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@stoplight/json": "^3.17.0", + "@stoplight/spectral-core": "^1.19.2", + "@types/json-schema": "^7.0.7", + "tslib": "^2.8.1" + }, + "engines": { + "node": "^16.20 || ^18.18 || >= 20.17" + } + }, + "node_modules/@stoplight/spectral-functions": { + "version": "1.10.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@stoplight/better-ajv-errors": "1.0.3", + "@stoplight/json": "^3.17.1", + "@stoplight/spectral-core": "^1.19.4", + "@stoplight/spectral-formats": "^1.8.1", + "@stoplight/spectral-runtime": "^1.1.2", + "ajv": "^8.17.1", + "ajv-draft-04": "~1.0.0", + "ajv-errors": "~3.0.0", + "ajv-formats": "~2.1.1", + "lodash": "~4.17.21", + "tslib": "^2.8.1" + }, + "engines": { + "node": "^16.20 || ^18.18 || >= 20.17" + } + }, + "node_modules/@stoplight/spectral-parsers": { + "version": "1.0.5", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@stoplight/json": "~3.21.0", + "@stoplight/types": "^14.1.1", + "@stoplight/yaml": "~4.3.0", + "tslib": "^2.8.1" + }, + "engines": { + "node": "^16.20 || ^18.18 || >= 20.17" + } + }, + "node_modules/@stoplight/spectral-parsers/node_modules/@stoplight/types": { + "version": "14.1.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.4", + "utility-types": "^3.10.0" + }, + "engines": { + "node": "^12.20 || >=14.13" + } + }, + "node_modules/@stoplight/spectral-ref-resolver": { + "version": "1.0.5", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@stoplight/json-ref-readers": "1.2.2", + "@stoplight/json-ref-resolver": "~3.1.6", + "@stoplight/spectral-runtime": "^1.1.2", + "dependency-graph": "0.11.0", + "tslib": "^2.8.1" + }, + "engines": { + "node": "^16.20 || ^18.18 || >= 20.17" + } + }, + "node_modules/@stoplight/spectral-rulesets": { + "version": "1.22.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@asyncapi/specs": "^6.8.0", + "@stoplight/better-ajv-errors": "1.0.3", + "@stoplight/json": "^3.17.0", + "@stoplight/spectral-core": "^1.19.4", + "@stoplight/spectral-formats": "^1.8.1", + "@stoplight/spectral-functions": "^1.9.1", + "@stoplight/spectral-runtime": "^1.1.2", + "@stoplight/types": "^13.6.0", + "@types/json-schema": "^7.0.7", + "ajv": "^8.17.1", + "ajv-formats": "~2.1.1", + "json-schema-traverse": "^1.0.0", + "leven": "3.1.0", + "lodash": "~4.17.21", + "tslib": "^2.8.1" + }, + "engines": { + "node": "^16.20 || ^18.18 || >= 20.17" + } + }, + "node_modules/@stoplight/spectral-runtime": { + "version": "1.1.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@stoplight/json": "^3.20.1", + "@stoplight/path": "^1.3.2", + "@stoplight/types": "^13.6.0", + "abort-controller": "^3.0.0", + "lodash": "^4.17.21", + "node-fetch": "^2.7.0", + "tslib": "^2.8.1" + }, + "engines": { + "node": "^16.20 || ^18.18 || >= 20.17" + } + }, + "node_modules/@stoplight/types": { + "version": "13.20.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.4", + "utility-types": "^3.10.0" + }, + "engines": { + "node": "^12.20 || >=14.13" + } + }, + "node_modules/@stoplight/yaml": { + "version": "4.3.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@stoplight/ordered-object-literal": "^1.0.5", + "@stoplight/types": "^14.1.1", + "@stoplight/yaml-ast-parser": "0.0.50", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=10.8" + } + }, + "node_modules/@stoplight/yaml-ast-parser": { + "version": "0.0.50", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@stoplight/yaml/node_modules/@stoplight/types": { + "version": "14.1.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.4", + "utility-types": "^3.10.0" + }, + "engines": { + "node": "^12.20 || >=14.13" + } + }, + "node_modules/@surma/rollup-plugin-off-main-thread": { + "version": "2.2.3", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "ejs": "^3.1.6", + "json5": "^2.2.0", + "magic-string": "^0.25.0", + "string.prototype.matchall": "^4.0.6" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/core": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.21.3", + "entities": "^4.4.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "@svgr/hast-util-to-babel-ast": "8.0.0", + "svg-parser": "^2.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "cosmiconfig": "^8.1.3", + "deepmerge": "^4.3.1", + "svgo": "^3.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/webpack": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@babel/plugin-transform-react-constant-elements": "^7.21.3", + "@babel/preset-env": "^7.20.2", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.21.0", + "@svgr/core": "8.1.0", + "@svgr/plugin-jsx": "8.1.0", + "@svgr/plugin-svgo": "8.1.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@tanstack/query-core": { + "version": "5.83.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-query": { + "version": "5.83.0", + "license": "MIT", + "dependencies": { + "@tanstack/query-core": "5.83.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^18 || ^19" + } + }, + "node_modules/@tanstack/react-table": { + "version": "8.21.3", + "license": "MIT", + "dependencies": { + "@tanstack/table-core": "8.21.3" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/@tanstack/table-core": { + "version": "8.21.3", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.7", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.1", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-shape": { + "version": "3.1.7", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "license": "MIT" + }, + "node_modules/@types/es-aggregate-error": { + "version": "1.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/lodash": { + "version": "4.17.20", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/lodash.debounce": { + "version": "4.0.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/node": { + "version": "20.19.7", + "devOptional": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.23", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "devOptional": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@types/resolve": { + "version": "1.20.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/urijs": { + "version": "1.19.25", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.36.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.36.0", + "@typescript-eslint/type-utils": "8.36.0", + "@typescript-eslint/utils": "8.36.0", + "@typescript-eslint/visitor-keys": "8.36.0", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.36.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.36.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.36.0", + "@typescript-eslint/types": "8.36.0", + "@typescript-eslint/typescript-estree": "8.36.0", + "@typescript-eslint/visitor-keys": "8.36.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.36.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.36.0", + "@typescript-eslint/types": "^8.36.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.36.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.36.0", + "@typescript-eslint/visitor-keys": "8.36.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.36.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.36.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "8.36.0", + "@typescript-eslint/utils": "8.36.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.36.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.36.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.36.0", + "@typescript-eslint/tsconfig-utils": "8.36.0", + "@typescript-eslint/types": "8.36.0", + "@typescript-eslint/visitor-keys": "8.36.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.36.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.36.0", + "@typescript-eslint/types": "8.36.0", + "@typescript-eslint/typescript-estree": "8.36.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.36.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.36.0", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "dev": true, + "license": "ISC" + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.6.0", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.27.4", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.19", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" + } + }, + "node_modules/@vitejs/plugin-react/node_modules/react-refresh": { + "version": "0.17.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "devOptional": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "8.17.1", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-draft-04": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^8.5.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-errors": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^8.0.1" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-hidden": { + "version": "1.2.6", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/astring": { + "version": "1.9.0", + "dev": true, + "license": "MIT", + "bin": { + "astring": "bin/astring" + } + }, + "node_modules/async": { + "version": "3.2.6", + "dev": true, + "license": "MIT" + }, + "node_modules/async-function": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "license": "MIT" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.21", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axios": { + "version": "1.10.0", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/babel-dead-code-elimination": { + "version": "1.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.23.7", + "@babel/parser": "^7.23.6", + "@babel/traverse": "^7.23.7", + "@babel/types": "^7.23.6" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.14", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.7", + "@babel/helper-define-polyfill-provider": "^0.6.5", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.13.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.25.1", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001726", + "electron-to-chromium": "^1.5.173", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "devOptional": true, + "license": "MIT" + }, + "node_modules/cac": { + "version": "6.7.14", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-me-maybe": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/callsites": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001727", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/ccount": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "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/character-entities-html4": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/class-variance-authority": { + "version": "0.7.1", + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cmdk": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "@radix-ui/react-compose-refs": "^1.1.1", + "@radix-ui/react-dialog": "^1.1.6", + "@radix-ui/react-id": "^1.1.0", + "@radix-ui/react-primitive": "^2.0.2" + }, + "peerDependencies": { + "react": "^18 || ^19 || ^19.0.0-rc", + "react-dom": "^18 || ^19 || ^19.0.0-rc" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "9.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/common-tags": { + "version": "1.8.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/compare-versions": { + "version": "6.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.0.2", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/core-js-compat": { + "version": "3.44.0", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.25.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "dev": true, + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cross-env": { + "version": "7.0.3", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/cross-fetch": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "node-fetch": "^2.6.12" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/css-select": { + "version": "5.2.2", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree/node_modules/mdn-data": { + "version": "2.0.28", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/csstype": { + "version": "3.1.3", + "license": "MIT" + }, + "node_modules/d3-array": { + "version": "3.2.4", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/date-fns": { + "version": "4.1.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/date-fns-jalali": { + "version": "4.1.0-0", + "license": "MIT" + }, + "node_modules/dayjs": { + "version": "1.11.13", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.1", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js-light": { + "version": "2.5.1", + "license": "MIT" + }, + "node_modules/dedent": { + "version": "1.6.0", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dependency-graph": { + "version": "0.11.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/destr": { + "version": "2.0.5", + "license": "MIT" + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/devlop": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "license": "Apache-2.0" + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "license": "MIT" + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "license": "MIT" + }, + "node_modules/ejs": { + "version": "3.1.10", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.182", + "license": "ISC" + }, + "node_modules/embla-carousel": { + "version": "8.6.0", + "license": "MIT" + }, + "node_modules/embla-carousel-react": { + "version": "8.6.0", + "license": "MIT", + "dependencies": { + "embla-carousel": "8.6.0", + "embla-carousel-reactive-utils": "8.6.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.1 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + } + }, + "node_modules/embla-carousel-reactive-utils": { + "version": "8.6.0", + "license": "MIT", + "peerDependencies": { + "embla-carousel": "8.6.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "node_modules/emoji-regex-xs": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/enquirer": { + "version": "2.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/error-ex": { + "version": "1.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.24.0", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-aggregate-error": { + "version": "1.0.14", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "globalthis": "^1.0.4", + "has-property-descriptors": "^1.0.2", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-toolkit": { + "version": "1.39.7", + "license": "MIT", + "workspaces": [ + "docs", + "benchmarks" + ] + }, + "node_modules/es6-promise": { + "version": "3.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.25.6", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.6", + "@esbuild/android-arm": "0.25.6", + "@esbuild/android-arm64": "0.25.6", + "@esbuild/android-x64": "0.25.6", + "@esbuild/darwin-arm64": "0.25.6", + "@esbuild/darwin-x64": "0.25.6", + "@esbuild/freebsd-arm64": "0.25.6", + "@esbuild/freebsd-x64": "0.25.6", + "@esbuild/linux-arm": "0.25.6", + "@esbuild/linux-arm64": "0.25.6", + "@esbuild/linux-ia32": "0.25.6", + "@esbuild/linux-loong64": "0.25.6", + "@esbuild/linux-mips64el": "0.25.6", + "@esbuild/linux-ppc64": "0.25.6", + "@esbuild/linux-riscv64": "0.25.6", + "@esbuild/linux-s390x": "0.25.6", + "@esbuild/linux-x64": "0.25.6", + "@esbuild/netbsd-arm64": "0.25.6", + "@esbuild/netbsd-x64": "0.25.6", + "@esbuild/openbsd-arm64": "0.25.6", + "@esbuild/openbsd-x64": "0.25.6", + "@esbuild/openharmony-arm64": "0.25.6", + "@esbuild/sunos-x64": "0.25.6", + "@esbuild/win32-arm64": "0.25.6", + "@esbuild/win32-ia32": "0.25.6", + "@esbuild/win32-x64": "0.25.6" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.31.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.3.0", + "@eslint/core": "^0.15.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.31.0", + "@eslint/plugin-kit": "^0.3.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@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.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.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-react-hooks": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.20", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=8.40" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "dev": true, + "license": "BSD-2-Clause", + "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.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", + "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/eslint/node_modules/ajv/node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint/node_modules/minimatch/node_modules/brace-expansion": { + "version": "1.1.12", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "license": "MIT" + }, + "node_modules/eventsource": { + "version": "3.0.7", + "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.0.3", + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit-hook": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-equals": { + "version": "5.2.2", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "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", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-memoize": { + "version": "2.5.2", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.0.6", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastq": { + "version": "1.19.1", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fdir": { + "version": "6.4.6", + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.3", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fs-extra": { + "version": "11.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "dev": true, + "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/function-bind": { + "version": "1.1.2", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "dev": true, + "license": "ISC" + }, + "node_modules/get-proto": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/github-buttons": { + "version": "2.29.1", + "license": "BSD-2-Clause" + }, + "node_modules/glob": { + "version": "10.4.5", + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "14.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globrex": { + "version": "0.1.2", + "license": "MIT" + }, + "node_modules/gopd": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-to-html": { + "version": "9.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hosted-git-info": { + "version": "6.1.3", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^7.5.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "7.18.3", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/html-parse-stringify": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "void-elements": "3.1.0" + } + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/http2-client": { + "version": "1.3.5", + "dev": true, + "license": "MIT" + }, + "node_modules/human-signals": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/i18next": { + "version": "24.2.3", + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.26.10" + }, + "peerDependencies": { + "typescript": "^5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/i18next-browser-languagedetector": { + "version": "8.2.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.2" + } + }, + "node_modules/i18next-http-backend": { + "version": "3.0.2", + "license": "MIT", + "dependencies": { + "cross-fetch": "4.0.0" + } + }, + "node_modules/idb": { + "version": "7.1.1", + "dev": true, + "license": "ISC" + }, + "node_modules/ignore": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immer": { + "version": "9.0.21", + "devOptional": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "dev": true, + "license": "ISC" + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/internmap": { + "version": "2.0.3", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/isbot": { + "version": "5.1.28", + "license": "Unlicense", + "engines": { + "node": ">=18" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jake": { + "version": "10.9.2", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jake/node_modules/minimatch/node_modules/brace-expansion": { + "version": "1.1.12", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/jiti": { + "version": "1.21.7", + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsep": { + "version": "1.4.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.16.0" + } + }, + "node_modules/jsesc": { + "version": "3.0.2", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/json-schema": { + "version": "0.4.0", + "dev": true, + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "2.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonpath-plus": { + "version": "10.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jsep-plugin/assignment": "^1.3.0", + "@jsep-plugin/regex": "^1.0.4", + "jsep": "^1.4.0" + }, + "bin": { + "jsonpath": "bin/jsonpath-cli.js", + "jsonpath-plus": "bin/jsonpath-cli.js" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/jsonpointer": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jsonschema": { + "version": "1.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "license": "MIT" + }, + "node_modules/linkify-it": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "uc.micro": "^2.0.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "license": "MIT" + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isempty": { + "version": "4.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.omit": { + "version": "4.5.0", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.omitby": { + "version": "4.6.0", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.topath": { + "version": "4.5.2", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.uniqby": { + "version": "4.7.0", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.uniqwith": { + "version": "4.5.0", + "dev": true, + "license": "MIT" + }, + "node_modules/loglevel": { + "version": "1.9.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, + "node_modules/loglevel-plugin-prefix": { + "version": "0.8.4", + "dev": true, + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lucide-react": { + "version": "0.465.0", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc" + } + }, + "node_modules/lunr": { + "version": "2.3.9", + "dev": true, + "license": "MIT" + }, + "node_modules/magic-string": { + "version": "0.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/markdown-it": { + "version": "14.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/mdurl": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/monaco-editor": { + "version": "0.52.2", + "license": "MIT", + "peer": true + }, + "node_modules/ms": { + "version": "2.1.3", + "license": "MIT" + }, + "node_modules/mz": { + "version": "2.7.0", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "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", + "dev": true, + "license": "MIT" + }, + "node_modules/next-themes": { + "version": "0.4.6", + "license": "MIT", + "peerDependencies": { + "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" + } + }, + "node_modules/nimma": { + "version": "0.2.3", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jsep-plugin/regex": "^1.0.1", + "@jsep-plugin/ternary": "^1.0.2", + "astring": "^1.8.1", + "jsep": "^1.2.0" + }, + "engines": { + "node": "^12.20 || >=14.13" + }, + "optionalDependencies": { + "jsonpath-plus": "^6.0.1 || ^10.1.0", + "lodash.topath": "^4.5.2" + } + }, + "node_modules/no-case": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch-h2": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "http2-client": "^1.2.5" + }, + "engines": { + "node": "4.x || >=6.0.0" + } + }, + "node_modules/node-fetch-native": { + "version": "1.6.6", + "license": "MIT" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/node-fetch/node_modules/whatwg-url/node_modules/tr46": { + "version": "0.0.3", + "license": "MIT" + }, + "node_modules/node-fetch/node_modules/whatwg-url/node_modules/webidl-conversions": { + "version": "3.0.1", + "license": "BSD-2-Clause" + }, + "node_modules/node-readfiles": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es6-promise": "^3.2.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.19", + "license": "MIT" + }, + "node_modules/normalize-package-data": { + "version": "5.0.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^6.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-install-checks": { + "version": "6.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg": { + "version": "10.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^6.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-pick-manifest": { + "version": "8.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^10.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/oas-kit-common": { + "version": "1.0.8", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "fast-safe-stringify": "^2.0.7" + } + }, + "node_modules/oas-linter": { + "version": "3.2.2", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@exodus/schemasafe": "^1.0.0-rc.2", + "should": "^13.2.1", + "yaml": "^1.10.0" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/oas-linter/node_modules/yaml": { + "version": "1.10.2", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/oas-resolver": { + "version": "2.5.6", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "node-fetch-h2": "^2.3.0", + "oas-kit-common": "^1.0.8", + "reftools": "^1.1.9", + "yaml": "^1.10.0", + "yargs": "^17.0.1" + }, + "bin": { + "resolve": "resolve.js" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/oas-resolver/node_modules/yaml": { + "version": "1.10.2", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/oas-schema-walker": { + "version": "1.1.5", + "dev": true, + "license": "BSD-3-Clause", + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/oas-validator": { + "version": "5.0.8", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "call-me-maybe": "^1.0.1", + "oas-kit-common": "^1.0.8", + "oas-linter": "^3.2.2", + "oas-resolver": "^2.5.6", + "oas-schema-walker": "^1.1.5", + "reftools": "^1.1.9", + "should": "^13.2.1", + "yaml": "^1.10.0" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/oas-validator/node_modules/yaml": { + "version": "1.10.2", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ofetch": { + "version": "1.4.1", + "license": "MIT", + "dependencies": { + "destr": "^2.0.3", + "node-fetch-native": "^1.6.4", + "ufo": "^1.5.4" + } + }, + "node_modules/once": { + "version": "1.4.0", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/oniguruma-to-es": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex-xs": "^1.0.0", + "regex": "^5.1.1", + "regex-recursion": "^5.1.1" + } + }, + "node_modules/openapi-types": { + "version": "12.1.3", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/openapi3-ts": { + "version": "4.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "yaml": "^2.3.4" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "dev": true, + "license": "MIT", + "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/orval": { + "version": "7.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@apidevtools/swagger-parser": "^10.1.0", + "@orval/angular": "7.4.1", + "@orval/axios": "7.4.1", + "@orval/core": "7.4.1", + "@orval/fetch": "7.4.1", + "@orval/hono": "7.4.1", + "@orval/mock": "7.4.1", + "@orval/query": "7.4.1", + "@orval/swr": "7.4.1", + "@orval/zod": "7.4.1", + "ajv": "^8.17.1", + "cac": "^6.7.14", + "chalk": "^4.1.2", + "chokidar": "^4.0.1", + "enquirer": "^2.4.1", + "execa": "^5.1.1", + "find-up": "5.0.0", + "fs-extra": "^11.2.0", + "lodash.uniq": "^4.5.0", + "openapi3-ts": "4.2.2", + "string-argv": "^0.3.2", + "tsconfck": "^2.0.1", + "typedoc": "0.26.11", + "typedoc-plugin-markdown": "4.2.10", + "typescript": "^5.6.3" + }, + "bin": { + "orval": "dist/bin/orval.js" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "license": "BlueOak-1.0.0" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-json/node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "license": "ISC" + }, + "node_modules/path-type": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.2", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pony-cause": { + "version": "1.1.1", + "dev": true, + "license": "0BSD", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "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.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "license": "MIT" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.6.2", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-plugin-tailwindcss": { + "version": "0.6.14", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.21.3" + }, + "peerDependencies": { + "@ianvs/prettier-plugin-sort-imports": "*", + "@prettier/plugin-hermes": "*", + "@prettier/plugin-oxc": "*", + "@prettier/plugin-pug": "*", + "@shopify/prettier-plugin-liquid": "*", + "@trivago/prettier-plugin-sort-imports": "*", + "@zackad/prettier-plugin-twig": "*", + "prettier": "^3.0", + "prettier-plugin-astro": "*", + "prettier-plugin-css-order": "*", + "prettier-plugin-import-sort": "*", + "prettier-plugin-jsdoc": "*", + "prettier-plugin-marko": "*", + "prettier-plugin-multiline-arrays": "*", + "prettier-plugin-organize-attributes": "*", + "prettier-plugin-organize-imports": "*", + "prettier-plugin-sort-imports": "*", + "prettier-plugin-style-order": "*", + "prettier-plugin-svelte": "*" + }, + "peerDependenciesMeta": { + "@ianvs/prettier-plugin-sort-imports": { + "optional": true + }, + "@prettier/plugin-hermes": { + "optional": true + }, + "@prettier/plugin-oxc": { + "optional": true + }, + "@prettier/plugin-pug": { + "optional": true + }, + "@shopify/prettier-plugin-liquid": { + "optional": true + }, + "@trivago/prettier-plugin-sort-imports": { + "optional": true + }, + "@zackad/prettier-plugin-twig": { + "optional": true + }, + "prettier-plugin-astro": { + "optional": true + }, + "prettier-plugin-css-order": { + "optional": true + }, + "prettier-plugin-import-sort": { + "optional": true + }, + "prettier-plugin-jsdoc": { + "optional": true + }, + "prettier-plugin-marko": { + "optional": true + }, + "prettier-plugin-multiline-arrays": { + "optional": true + }, + "prettier-plugin-organize-attributes": { + "optional": true + }, + "prettier-plugin-organize-imports": { + "optional": true + }, + "prettier-plugin-sort-imports": { + "optional": true + }, + "prettier-plugin-style-order": { + "optional": true + }, + "prettier-plugin-svelte": { + "optional": true + } + } + }, + "node_modules/pretty-bytes": { + "version": "6.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/proc-log": { + "version": "3.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "license": "MIT" + }, + "node_modules/property-information": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/punycode.js": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qrcode.react": { + "version": "3.2.0", + "license": "ISC", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "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/randombytes": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/react": { + "version": "18.3.1", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-day-picker": { + "version": "9.7.0", + "license": "MIT", + "dependencies": { + "@date-fns/tz": "1.2.0", + "date-fns": "4.1.0", + "date-fns-jalali": "4.1.0-0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/gpbl" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-github-btn": { + "version": "1.4.0", + "license": "BSD-2-Clause", + "dependencies": { + "github-buttons": "^2.22.0" + }, + "peerDependencies": { + "react": ">=16.3.0" + } + }, + "node_modules/react-hook-form": { + "version": "7.60.0", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-hook-form" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18 || ^19" + } + }, + "node_modules/react-i18next": { + "version": "15.6.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.27.6", + "html-parse-stringify": "^3.0.1" + }, + "peerDependencies": { + "i18next": ">= 23.2.3", + "react": ">= 16.8.0", + "typescript": "^5" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/react-is": { + "version": "18.3.1", + "license": "MIT" + }, + "node_modules/react-refresh": { + "version": "0.14.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-remove-scroll": { + "version": "2.7.1", + "license": "MIT", + "dependencies": { + "react-remove-scroll-bar": "^2.3.7", + "react-style-singleton": "^2.2.3", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.3", + "use-sidecar": "^1.1.3" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.8", + "license": "MIT", + "dependencies": { + "react-style-singleton": "^2.2.2", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-router": { + "version": "7.6.3", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-smooth": { + "version": "4.0.4", + "license": "MIT", + "dependencies": { + "fast-equals": "^5.0.1", + "prop-types": "^15.8.1", + "react-transition-group": "^4.4.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.3", + "license": "MIT", + "dependencies": { + "get-nonce": "^1.0.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/react-use-websocket": { + "version": "4.13.0", + "license": "MIT" + }, + "node_modules/read-cache": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/recharts": { + "version": "2.15.4", + "license": "MIT", + "dependencies": { + "clsx": "^2.0.0", + "eventemitter3": "^4.0.1", + "lodash": "^4.17.21", + "react-is": "^18.3.1", + "react-smooth": "^4.0.4", + "recharts-scale": "^0.4.4", + "tiny-invariant": "^1.3.1", + "victory-vendor": "^36.6.8" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/recharts-scale": { + "version": "0.4.5", + "license": "MIT", + "dependencies": { + "decimal.js-light": "^2.4.1" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reftools": { + "version": "1.1.9", + "dev": true, + "license": "BSD-3-Clause", + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regex": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-recursion": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "regex": "^5.1.1", + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "6.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.12.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "dev": true, + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.12.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.0.2" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.10", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "2.79.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", + "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", + "dev": true, + "license": "MIT", + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "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/safe-array-concat": { + "version": "1.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "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/safe-push-apply": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-stable-stringify": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/scheduler": { + "version": "0.23.2", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "7.7.2", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.1", + "license": "MIT" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shiki": { + "version": "1.29.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/core": "1.29.2", + "@shikijs/engine-javascript": "1.29.2", + "@shikijs/engine-oniguruma": "1.29.2", + "@shikijs/langs": "1.29.2", + "@shikijs/themes": "1.29.2", + "@shikijs/types": "1.29.2", + "@shikijs/vscode-textmate": "^10.0.1", + "@types/hast": "^3.0.4" + } + }, + "node_modules/should": { + "version": "13.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "should-equal": "^2.0.0", + "should-format": "^3.0.3", + "should-type": "^1.4.0", + "should-type-adaptors": "^1.0.1", + "should-util": "^1.0.0" + } + }, + "node_modules/should-equal": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "should-type": "^1.4.0" + } + }, + "node_modules/should-format": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "should-type": "^1.3.0", + "should-type-adaptors": "^1.0.1" + } + }, + "node_modules/should-type": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/should-type-adaptors": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "should-type": "^1.3.0", + "should-util": "^1.0.0" + } + }, + "node_modules/should-util": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/side-channel": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "dev": true, + "license": "ISC" + }, + "node_modules/simple-eval": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "jsep": "^1.3.6" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/smob": { + "version": "1.5.0", + "dev": true, + "license": "MIT" + }, + "node_modules/snake-case": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/sonner": { + "version": "2.0.6", + "license": "MIT", + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", + "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" + } + }, + "node_modules/source-map": { + "version": "0.8.0-beta.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "whatwg-url": "^7.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "devOptional": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "devOptional": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "dev": true, + "license": "MIT" + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.21", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/state-local": { + "version": "1.0.7", + "license": "MIT" + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string-argv": { + "version": "0.3.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-comments": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sucrase": { + "version": "3.35.0", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/svgo": { + "version": "3.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/swagger2openapi": { + "version": "7.0.8", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "call-me-maybe": "^1.0.1", + "node-fetch": "^2.6.1", + "node-fetch-h2": "^2.3.0", + "node-readfiles": "^0.2.0", + "oas-kit-common": "^1.0.8", + "oas-resolver": "^2.5.6", + "oas-schema-walker": "^1.1.5", + "oas-validator": "^5.0.8", + "reftools": "^1.1.9", + "yaml": "^1.10.0", + "yargs": "^17.0.1" + }, + "bin": { + "boast": "boast.js", + "oas-validate": "oas-validate.js", + "swagger2openapi": "swagger2openapi.js" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/swagger2openapi/node_modules/yaml": { + "version": "1.10.2", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/tailwind-merge": { + "version": "2.6.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.17", + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.6", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss-animate": { + "version": "1.0.7", + "license": "MIT", + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders" + } + }, + "node_modules/tailwindcss/node_modules/chokidar": { + "version": "3.6.0", + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/tailwindcss/node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tailwindcss/node_modules/chokidar/node_modules/readdirp": { + "version": "3.6.0", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/tailwindcss/node_modules/chokidar/node_modules/readdirp/node_modules/picomatch": { + "version": "2.3.1", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/temp-dir": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/tempy": { + "version": "0.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser": { + "version": "5.43.1", + "devOptional": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.14.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "devOptional": true, + "license": "MIT" + }, + "node_modules/thenify": { + "version": "3.3.1", + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.14", + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tr46": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "license": "Apache-2.0" + }, + "node_modules/tsconfck": { + "version": "2.1.2", + "dev": true, + "license": "MIT", + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^14.13.1 || ^16 || >=18" + }, + "peerDependencies": { + "typescript": "^4.3.5 || ^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.16.0", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedoc": { + "version": "0.26.11", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "lunr": "^2.3.9", + "markdown-it": "^14.1.0", + "minimatch": "^9.0.5", + "shiki": "^1.16.2", + "yaml": "^2.5.1" + }, + "bin": { + "typedoc": "bin/typedoc" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x" + } + }, + "node_modules/typedoc-plugin-markdown": { + "version": "4.2.10", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "typedoc": "0.26.x" + } + }, + "node_modules/typescript": { + "version": "5.6.3", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.36.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.36.0", + "@typescript-eslint/parser": "8.36.0", + "@typescript-eslint/utils": "8.36.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <5.9.0" + } + }, + "node_modules/uc.micro": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/ufo": { + "version": "1.6.1", + "license": "MIT" + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "devOptional": true, + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/upath": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urijs": { + "version": "1.19.11", + "dev": true, + "license": "MIT" + }, + "node_modules/use-callback-ref": { + "version": "1.3.3", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.3", + "license": "MIT", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sync-external-store": { + "version": "1.5.0", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/utility-types": { + "version": "3.11.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/uuid": { + "version": "11.1.0", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "node_modules/valibot": { + "version": "0.41.0", + "dev": true, + "license": "MIT", + "peerDependencies": { + "typescript": ">=5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validate-npm-package-name": { + "version": "5.0.1", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/validator": { + "version": "13.15.15", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vaul": { + "version": "1.1.2", + "license": "MIT", + "dependencies": { + "@radix-ui/react-dialog": "^1.1.1" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/victory-vendor": { + "version": "36.9.2", + "license": "MIT AND ISC", + "dependencies": { + "@types/d3-array": "^3.0.3", + "@types/d3-ease": "^3.0.0", + "@types/d3-interpolate": "^3.0.1", + "@types/d3-scale": "^4.0.2", + "@types/d3-shape": "^3.1.0", + "@types/d3-time": "^3.0.0", + "@types/d3-timer": "^3.0.0", + "d3-array": "^3.1.6", + "d3-ease": "^3.0.1", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "d3-shape": "^3.1.0", + "d3-time": "^3.0.0", + "d3-timer": "^3.0.1" + } + }, + "node_modules/vite": { + "version": "6.3.5", + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "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-node": { + "version": "3.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.4.1", + "es-module-lexer": "^1.7.0", + "pathe": "^2.0.3", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite-node/node_modules/pathe": { + "version": "2.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/vite-plugin-pwa": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.6", + "pretty-bytes": "^6.1.1", + "tinyglobby": "^0.2.10", + "workbox-build": "^7.3.0", + "workbox-window": "^7.3.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vite-pwa/assets-generator": "^1.0.0", + "vite": "^3.1.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", + "workbox-build": "^7.3.0", + "workbox-window": "^7.3.0" + }, + "peerDependenciesMeta": { + "@vite-pwa/assets-generator": { + "optional": true + } + } + }, + "node_modules/vite-plugin-svgr": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.1.3", + "@svgr/core": "^8.1.0", + "@svgr/plugin-jsx": "^8.1.0" + }, + "peerDependencies": { + "vite": ">=2.6.0" + } + }, + "node_modules/vite-tsconfig-paths": { + "version": "5.1.4", + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^3.0.3" + }, + "peerDependencies": { + "vite": "*" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/vite-tsconfig-paths/node_modules/tsconfck": { + "version": "3.1.6", + "license": "MIT", + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^18 || >=20" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/rollup": { + "version": "4.45.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.45.0.tgz", + "integrity": "sha512-WLjEcJRIo7i3WDDgOIJqVI2d+lAC3EwvOGy+Xfq6hs+GQuAA4Di/H72xmXkOhrIWFg2PFYSKZYfH0f4vfKXN4A==", + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.45.0", + "@rollup/rollup-android-arm64": "4.45.0", + "@rollup/rollup-darwin-arm64": "4.45.0", + "@rollup/rollup-darwin-x64": "4.45.0", + "@rollup/rollup-freebsd-arm64": "4.45.0", + "@rollup/rollup-freebsd-x64": "4.45.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.45.0", + "@rollup/rollup-linux-arm-musleabihf": "4.45.0", + "@rollup/rollup-linux-arm64-gnu": "4.45.0", + "@rollup/rollup-linux-arm64-musl": "4.45.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.45.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.45.0", + "@rollup/rollup-linux-riscv64-gnu": "4.45.0", + "@rollup/rollup-linux-riscv64-musl": "4.45.0", + "@rollup/rollup-linux-s390x-gnu": "4.45.0", + "@rollup/rollup-linux-x64-gnu": "4.45.0", + "@rollup/rollup-linux-x64-musl": "4.45.0", + "@rollup/rollup-win32-arm64-msvc": "4.45.0", + "@rollup/rollup-win32-ia32-msvc": "4.45.0", + "@rollup/rollup-win32-x64-msvc": "4.45.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/void-elements": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wait-port": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "commander": "^9.3.0", + "debug": "^4.3.4" + }, + "bin": { + "wait-port": "bin/wait-port.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/webidl-conversions": { + "version": "4.0.2", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/which": { + "version": "2.0.2", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workbox-background-sync": { + "version": "7.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "idb": "^7.0.1", + "workbox-core": "7.3.0" + } + }, + "node_modules/workbox-broadcast-update": { + "version": "7.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "workbox-core": "7.3.0" + } + }, + "node_modules/workbox-build": { + "version": "7.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@apideck/better-ajv-errors": "^0.3.1", + "@babel/core": "^7.24.4", + "@babel/preset-env": "^7.11.0", + "@babel/runtime": "^7.11.2", + "@rollup/plugin-babel": "^5.2.0", + "@rollup/plugin-node-resolve": "^15.2.3", + "@rollup/plugin-replace": "^2.4.1", + "@rollup/plugin-terser": "^0.4.3", + "@surma/rollup-plugin-off-main-thread": "^2.2.3", + "ajv": "^8.6.0", + "common-tags": "^1.8.0", + "fast-json-stable-stringify": "^2.1.0", + "fs-extra": "^9.0.1", + "glob": "^7.1.6", + "lodash": "^4.17.20", + "pretty-bytes": "^5.3.0", + "rollup": "^2.43.1", + "source-map": "^0.8.0-beta.0", + "stringify-object": "^3.3.0", + "strip-comments": "^2.0.1", + "tempy": "^0.6.0", + "upath": "^1.2.0", + "workbox-background-sync": "7.3.0", + "workbox-broadcast-update": "7.3.0", + "workbox-cacheable-response": "7.3.0", + "workbox-core": "7.3.0", + "workbox-expiration": "7.3.0", + "workbox-google-analytics": "7.3.0", + "workbox-navigation-preload": "7.3.0", + "workbox-precaching": "7.3.0", + "workbox-range-requests": "7.3.0", + "workbox-recipes": "7.3.0", + "workbox-routing": "7.3.0", + "workbox-strategies": "7.3.0", + "workbox-streams": "7.3.0", + "workbox-sw": "7.3.0", + "workbox-window": "7.3.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/workbox-build/node_modules/fs-extra": { + "version": "9.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/workbox-build/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "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/workbox-build/node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/workbox-build/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion": { + "version": "1.1.12", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/workbox-build/node_modules/pretty-bytes": { + "version": "5.6.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/workbox-cacheable-response": { + "version": "7.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "workbox-core": "7.3.0" + } + }, + "node_modules/workbox-core": { + "version": "7.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/workbox-expiration": { + "version": "7.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "idb": "^7.0.1", + "workbox-core": "7.3.0" + } + }, + "node_modules/workbox-google-analytics": { + "version": "7.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "workbox-background-sync": "7.3.0", + "workbox-core": "7.3.0", + "workbox-routing": "7.3.0", + "workbox-strategies": "7.3.0" + } + }, + "node_modules/workbox-navigation-preload": { + "version": "7.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "workbox-core": "7.3.0" + } + }, + "node_modules/workbox-precaching": { + "version": "7.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "workbox-core": "7.3.0", + "workbox-routing": "7.3.0", + "workbox-strategies": "7.3.0" + } + }, + "node_modules/workbox-range-requests": { + "version": "7.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "workbox-core": "7.3.0" + } + }, + "node_modules/workbox-recipes": { + "version": "7.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "workbox-cacheable-response": "7.3.0", + "workbox-core": "7.3.0", + "workbox-expiration": "7.3.0", + "workbox-precaching": "7.3.0", + "workbox-routing": "7.3.0", + "workbox-strategies": "7.3.0" + } + }, + "node_modules/workbox-routing": { + "version": "7.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "workbox-core": "7.3.0" + } + }, + "node_modules/workbox-strategies": { + "version": "7.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "workbox-core": "7.3.0" + } + }, + "node_modules/workbox-streams": { + "version": "7.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "workbox-core": "7.3.0", + "workbox-routing": "7.3.0" + } + }, + "node_modules/workbox-sw": { + "version": "7.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/workbox-window": { + "version": "7.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/trusted-types": "^2.0.2", + "workbox-core": "7.3.0" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wrap-ansi/node_modules/string-width/node_modules/emoji-regex": { + "version": "9.2.2", + "license": "MIT" + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "6.1.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "dev": true, + "license": "ISC" + }, + "node_modules/y18n": { + "version": "5.0.8", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.8.0", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.25.76", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zustand": { + "version": "5.0.6", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@types/react": ">=18.0.0", + "immer": ">=9.0.6", + "react": ">=18.0.0", + "use-sync-external-store": ">=1.2.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + }, + "use-sync-external-store": { + "optional": true + } + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/dashboard/package.json b/dashboard/package.json new file mode 100644 index 000000000..9f742daf5 --- /dev/null +++ b/dashboard/package.json @@ -0,0 +1,114 @@ +{ + "name": "pasargaurd-ui", + "private": true, + "version": "0.0.0", + "scripts": { + "dev": "vite dev", + "build": "vite build", + "preview": "vite preview", + "gen:api": "orval", + "wait-port": "wait-port http://localhost:$UVICORN_PORT/openapi.json", + "wait-port-gen-api": "bun run wait-port && bun run gen:api" + }, + "dependencies": { + "@dnd-kit/core": "^6.3.1", + "@dnd-kit/sortable": "^10.0.0", + "@dnd-kit/utilities": "^3.2.2", + "@hookform/resolvers": "^3.10.0", + "@monaco-editor/react": "^4.6.0", + "@radix-ui/react-accordion": "^1.2.3", + "@radix-ui/react-alert-dialog": "^1.1.4", + "@radix-ui/react-avatar": "^1.1.2", + "@radix-ui/react-checkbox": "^1.1.4", + "@radix-ui/react-collapsible": "^1.1.2", + "@radix-ui/react-dialog": "^1.1.4", + "@radix-ui/react-dropdown-menu": "^2.1.4", + "@radix-ui/react-hover-card": "^1.1.6", + "@radix-ui/react-label": "^2.1.1", + "@radix-ui/react-popover": "^1.1.6", + "@radix-ui/react-progress": "^1.1.1", + "@radix-ui/react-radio-group": "^1.3.6", + "@radix-ui/react-scroll-area": "^1.2.2", + "@radix-ui/react-select": "^2.1.4", + "@radix-ui/react-separator": "^1.1.1", + "@radix-ui/react-slot": "^1.1.1", + "@radix-ui/react-switch": "^1.1.2", + "@radix-ui/react-tabs": "^1.1.3", + "@radix-ui/react-toast": "^1.2.4", + "@radix-ui/react-toggle": "^1.1.2", + "@radix-ui/react-toggle-group": "^1.1.2", + "@radix-ui/react-tooltip": "^1.1.6", + "@stablelib/base64": "^2.0.1", + "@stablelib/x25519": "^2.0.1", + "@tanstack/react-query": "^5.64.0", + "@tanstack/react-table": "^8.20.6", + "@telegram-apps/sdk": "^3.11.4", + "@vitejs/plugin-react": "^4.3.4", + "axios": "^1.8.4", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "cmdk": "^1.1.1", + "cross-env": "^7.0.3", + "date-fns": "^4.1.0", + "date-fns-jalali": "4.1.0-0", + "dayjs": "^1.11.13", + "embla-carousel-react": "^8.5.2", + "es-toolkit": "^1.31.0", + "eventsource": "^3.0.7", + "fancy-ansi": "^0.1.3", + "i18next": "^24.2.1", + "i18next-browser-languagedetector": "^8.0.2", + "i18next-http-backend": "^3.0.1", + "isbot": "^5.1.21", + "lodash.debounce": "^4.0.8", + "lucide-react": "^0.465.0", + "next-themes": "^0.4.6", + "ofetch": "^1.4.1", + "qrcode.react": "^3.2.0", + "react": "^18.3.1", + "react-day-picker": "9.7.0", + "react-dom": "^18.3.1", + "react-github-btn": "^1.4.0", + "react-hook-form": "^7.54.2", + "react-i18next": "^15.4.0", + "react-router": "^7.1.1", + "react-top-loading-bar": "^3.0.2", + "react-use-websocket": "^4.13.0", + "recharts": "^2.15.1", + "sonner": "^2.0.3", + "tailwind-merge": "^2.6.0", + "tailwindcss-animate": "^1.0.7", + "ufo": "^1.5.4", + "uuid": "^11.1.0", + "vaul": "^1.1.2", + "vite-tsconfig-paths": "^5.1.4", + "zod": "^3.24.1", + "zustand": "^5.0.3" + }, + "devDependencies": { + "@react-router/dev": "^7.1.1", + "@react-router/fs-routes": "^7.1.1", + "@svgr/webpack": "^8.1.0", + "@types/lodash.debounce": "^4.0.9", + "@types/node": "^20.17.28", + "@types/react": "^18.3.18", + "@types/react-dom": "^18.3.5", + "ajv": "^8.17.1", + "autoprefixer": "^10.4.20", + "eslint": "^9.18.0", + "eslint-plugin-react-hooks": "^5.1.0", + "eslint-plugin-react-refresh": "^0.4.18", + "orval": "7.4.1", + "postcss": "^8.4.49", + "prettier": "^3.6.2", + "prettier-plugin-tailwindcss": "^0.6.13", + "tailwindcss": "^3.4.17", + "typescript": "~5.6.3", + "typescript-eslint": "^8.19.1", + "vite": "^6.2.4", + "vite-plugin-pwa": "^1.0.1", + "vite-plugin-svgr": "^4.3.0", + "wait-port": "^1.1.0" + }, + "packageManager": "bun@1.0.0" +} diff --git a/dashboard/public/statics/favicon/android-chrome-192x192.png b/dashboard/public/statics/favicon/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..68a1e99b0b24c0aafdc0a3104d62288bddf4d0f8 GIT binary patch literal 16698 zcmZ@<^;aA3*IeA)-GVf@7k5aYcyO2ER$Ph{ihJK<$!( z211@VZ>(@5fRwmP_vF&A4Y7?1qU+(A8v%(mij)_fBzXTp#R*3>y~zl0=~(r~rf zVBYch!=Y7L)|LRUgpvO}x3M*c)^1oqhBjq8bE4E;u#fm;UnH%FIB7W_MY_IAA_Ik< z13eGM;>5q>HJQ+dKc33jfff<9)$R|BpxjH^rkS23u%!FjG$!YXIt%tq=(tng?`<{; ziZ18H3s%wf85j!(2f0uRViBd$-+lIu&IWkKJ1hgWnG^@ujY+fiv{Dd|(cq4J8soo2}zb^7=ycKwJ;6<}?wtUA9r6 zz34mKjVjO*3O)Bc-qh*Ng=~)W&rWEOg7-2pq|-W)GS(q`Gu0sYN8_eXGi{8~&qtPF z*R^lWEN=&L%L{$@>wU%>4TNgKIfL>fFWaJYoyt&S_u%Fg-cKexlmSL}-9};D!#jn% ze=|{Rft_VH=)eIhbZ5D+HCI0C%3bM{5q<^@W8KS@&n!!At8Y{~KeN9*|92ut2@G$Y zz5x}p-+&QlbtIq6IR&;Uz-?7rKih~zbYEZ^$08Mf0iZSVOO5H40U)X!wV*`rjm8E> z8ogDs2vL6}&L{CHL%POMOoA6Ce(k{z3hPC-C*@6n&B)JKP=Us!)2_Ivxy&VSU7iNCuJu#(smK z-+(UE^&sFZS&;uP4A%zJHR&JfL{%=CawyO3)E!M{es+Z#WUW%lv$U;EzFRiuZp< zHFreO>}~w!?OylRwPd1(5#2LkoL^xj3MptqSDyW^)(bjixjn7w8BVYG#yV&~RQAMy z^0HhBmW;k@v71Qnz z5o(Gr;A<3l^n&(n7IJ%7Ca-4mvKek(ddaJjR6?_<0#8lr%18D>9%GSb5_hp@ft6zB z6>;B)YvrEmQ@V4Iw@N5h)tG4eOM35OILOe;BrW1R68NB*NBWS}%DAQimVZYqHx}@p z@Z}=pLeiceE@)l1ENrDR&a!xZ#N`+rq12j=4{#ecEaW2bZI<6e@!kkiTcaY3p6@F# z?QOJbg-uLTw~HTF&d5*f7AxinSS_~(i~ zCJXNTM6RUV47UPXpweyL?H8M9+lZ5~4oWoqsnbqTgm4rK9Z9u2Fu(nv&J>`)Dz)>- zFZ35T^i{NR)XRaPN7uR5fg>xbgb%i1?tKC9w`7R;2L&%)OzL~(wq!_8NyVicgz;(r z%Xmr(nwDtU0G3*f!v?#h%4dC&o_|E;=3V+vWZx6e|J)?b<}%Bs-X9T=iU*pGosc6M zKM-g$Zrh#MYL(R2p|*C(KV)uuwY+jNvNs>om_B!dn;GclDE5p~ZvJuHm;%`78pUZ&ilMN zYUND}kb4LD&F@xnbBMQhO!Lzpn$;rLJEbk>G#uId@0oJRQGTB-m^utXSXBe{KE}L~ zTLet-kLR8rYzY-4qO#|xAcW;d&&MY zwpvun%`U}nNNe`u(fibOqf^)~qhKn=8V=AfWyLvD<3T)F z^#mZl@yOp{%>QADVz41_NkQ+W1V=4o+$&Y|(7=0*#&4|Pjv31wBM!UT;x!4b=$N^N zuQA%|2Y?51;>5=*!;=F~%394muK&a#V`~Iig9Pe7!dY4A;mZ_&!*~(H<-b?c=V&0J z_+3i3@Fjr+l)?13FKi>wX2X7}jh{3>FHnAr=+x((EbYZ7aJ<|qeik_z%ew#8@Y@f_ z@e1`u(_4R=k|G7cK4V1mlng+q2i6${0@`qGC&Iai0lhqPZYMlTYl!0ap^(bBB}BoB zbyAQB(UXrrkwU^7^)2rkrD#PP(g?a_LGDa-JIL-P8BrerX*So%ZP~R!e<2753s~5LO@to>z=I}0)W`Nt zFca4v89pk}>pqnrZcn^#imwy0&n?=jlCCUHYZn}YOWr~3zaH+RRlP z!Q7_?u_Rn)wR;6E^vo0(x&6FG3N%yOSk_eV9VV#dJJ8I~@@fWxMy|m2 zJCF8+Ct4D4HPq{jRxYkrdWpD~+R_fRc0G0PItzTNIiRN&Fxrsz8mf62fKjEA=)0^7 zW46eiMAuc#6#F0{En5F!-<;E1zQ{G1ezFe*6KZdMJsPfBnUFjb1EZK9srz0E+Ka1C zpKF~EvTxq;qqOHD(SS!I7(Mo6_$aloT2lZuc)eRI_fM9COhT(zfF(MYn>CI6ziztc zN_ShabRC8I1R-?om{l~0iOT5Kf2ut_1Di(s?`Se?wB5n7PX()c7iXejQCw4>Or{rY zA_~{=$rj+Jvr8Zm{s>L7#&~h70dUl$h@_%k#|dsDALVE3T|sTpNiA<*-cGb zZ*&EnNq$}OklHE8rzf$UrtU+V#gA9eeb>-68v0zH`k7!NuLob3#&F6t9XbTuvwZMDJhpR7=6p%(cVA?- z1jNd6-#mV-Lub0R2h`Bo<##c99Fu}{)N(`4n%+C50v|u^a(ChPk+Otw@(pJqo#32k zFUk92YD9{Ai26KzX=9hi+0^m4xK%%p|8mrKi-=_kqn6Uln~E#*#Qf~$b%g!pljts; z7K(9Jnfez-_!{}Y6|Zk^-kWzDH&qJjhm%tb?SmJ}OzhYZ!k;8bnl#~m7s=uMTsQYB znIFGuSP8_ygv|427x_8lly^wE<{fKo9xn%8Tk~hB=DA|?>lJCGbzu= zleG{&V})^iQPXRjzibqt{tBvvc`Pm%q48O}eV#O865s=M6bWt@NDFHuP2vb~mPSv* z-wo0Kg2d1fQ*fD|V*rUj11H&}L!%5`7Nz{0>0ZU;n{I@45WY?#j+8CN6xGkX>2gh&ADCop5`6Uq$ zR;m-YUmDBkB0hKyT+<@j5MT=LxG7o%d70iNl=f((RFYu8l^BcH?o4e%RCa*VhI|Hg`2c4+9fCY~*`ts;5f^M=0=u zI{YQ&61}4Rs0=phl@Ub(Pd4s%-_}qOoMja26JYMXKG^&CerS@Qc19O!-@jq@+W`?x zD}ljLd065it*d|d{G>13eK7aw{QR7LZgTRCRD>UFbSnxJ?vm6Y{uxV=_lNFjN^t+c ztqjndMo&<}X*X+34xJLGvpZyy7^ME9cbxdukZ(pPf?EeCG7C2Cp(?iI1gN3DR8C>Q zTE~Q|(b{dF54M`IQP>{qRU3r<1ECmCwSEKzHL9MtB!80+T+&g1hZ%L@zT9bwH$pK; zyw9)sKKM-(s`!N1z)|;0g1%48qkcjSpK3)k;t(-h~$Wp!b2G ze+v@X;_54Me8vC)%{ad84$li8S-f?A7eb@gSqVM&YVdFjFXQ7fW7kwr$2-Ao3cpur zRdmX?*H;kPSoPSOXQtP#CC`o&tV%>?0kWK=p=dxG{JtCF#l=7M+uhw=T*K|hEJRiK zlzuH!@*iG>yc26gVzOYY*gj2g_xVm*|1?j|$TSQioYoKQoIIbJuS~jx@1&x1I)UFj z@g^NfB>8Yb;ydKRb1Cwm=ljaIV_u&-K(Jhxpi)?~luCe0A@WHa6)7Y7RU_C2jouuC z{;CN@Et>erhgEXb5(tY^CsZ#36&)!>r_wll3+=vRz+6|f8&!)=i}Jl-t@WgMde~;I zYz%xI*1V%?c^SzCZ3gw+YGi;qbY=*t8kg~)jA-kau*Hvg+LK& z=u+Q9JW*b{x)Vi=Q`>Dz?eJ;Bk$1LAFM%95{p+L-E`hLev3FW64Te0zPTcPljlzss z*xFQ!IxAqo8iV)IlnwK$kkRl_mv7aE5eCK;V;#*#uC^p82Zx76Jk&LdsZ3tloZAav z6otbbiBvyoV6<2+JX10N+Q=hU6T@f3M(8zRZ5>6q>&DD5<@l6iPXx|Ou{1ePHFeEV zU3Qsua8Zs+Ct+9B`sOX#EzM6*#+Zs;p4GT2;z8xE0yw$4F5%RVaQ?XqmA!qEtY3Sm z`+LNX8JNU6O)$IdKoR=&RGs3D>_&9_6F< zArTq+z)zHGL9kzc>GriSs13s_LC^teSrPKQr&|q8ge%lp(a_^w-A@lEZ?ns6q7CMT z#3o=>k!%vZAbca<@v~Md8lV4=`P?JT`izw0>!?&F=Y?bcQkQ%n)EqG-6@74RS zx#FpNQ*i7D7`|DS&@wmV)L@eNj>+(Ka6l{W^4=|yXNNbp$(r|0Lhk6@(O&L23_U4* zJ1od2nmAkp0uq@sPvsp95hY9b^x@GST6-j5O)ojSO);urO7Z z+VP*3?6^L~8_b0Za=6=Povq&eT}gIU4$at${^ht&W=kKA=2g&h_AnYnK}zJH<3aj5AJDn$FX{6_DpHIGk8ogRIgPQqL3jv@y98c z$LJB96#83Db5OW6z2J0DS=$#XE-F{$-mJ+2$ft)xz<+ReGoQv}Ds-$sB3I0P@mM)V zAIIkmS$VHpmof}=wfb9}SQqfc`Ud#>2LoaI3!ikb?M0`pq@<+&b^m;RZh1z(XYq`x z|7o76IyySGSGzt|9x>0%}ckz#EWH8oyfg*uH9{rbf z8P8o27mH7{t=n1&));<}lkx!i6Q~0#f**K^k%iu%m}2t>Yh-N+3B%UMIG-&+Wjale z6r+yT&+6@B=u;ZZ-N}0Arh`)^!-I{#SF>)8710a46xPdeQS6f13CjV+kFCojB0WLJ zm){JSiJNM~dQrR-2Rp1-Z`x~Y$4gNArJ#p<20*wwvEnNJh)5pSOfMrsA7ZI=8Z?_4 z;7*r1fUqhX2{#KnqP*Inc%zvAVdP2G^ZCSWps*(s`V2{*VS6v+$tYJ z`?W&xh=!DP_X}bgC->GV>d*UeJpH)(#rNDx%Vd#z?j}DxZJR*Ym(*bI?;QM zV1t)O1;S{A$qPxBilrt|?-5qaLA}(WFCzL)J13}p80LgBod>x7u*MjtPiJj&!N7fr z>F(W^WmjA!lY%2vc8ox~Z_?>PbQg$&A9igYwmS)_5c9N;)XKaw)BepxerT_MEAOK>pO+fVu4A z&(AW4Il~8!;Ha^x^V^Y3OQuzXcv)E?6l7%<9lyD(1Zw*r7yeiiycQ~&Z|}bq#MEqy zRv_)>7D21$*b_)6+rX?KEANdFF-~Lm?Z1j&dBQ)n^2OXiwQ|leEoRgQU!jAgWXhG; ze>Mb)QQfuR2ZOnK&&48o9Vu)or#j9|xV>SV)#agMa^UmzqrHb0ru>7zgF)_K+fSTWq-D?@A%Fz9q zth1N!*OR>TJRWkvPVH7d!c|417pja3++00bcG)x%ljtxo3xV4>#%g>#_CG?0@$;|aYvMzEc zF8{odO<}4&P7uW$$2#2~tIGM-8V<6gX`{;-*;)aXYrFWlyRT&C7Spa_<+7*$m24>wZVA^f_iFYGw>%9c8-=BaOk=4ioz zd}R-EB|MpV&`iT~d$39?|HEOZt$apv6$YPu35x_vp)D+i^wzdsT5RIrjNG%rf-eS1 z*JdUz>Q%#)4C}6B`)a2{CKh)wPH1FseEEf9ap@&=P=>y#e$S3Axc(1ixyCIUy>D_b zcP}eohZpeBch|@%heHD34JD-vyO)Ex7$yqU!7|FXg=zOVV3}BbjBqqSjoQwG5|iL^ z&J1{kb!=xhT6~IX6?DY{@!G5DM}$+`QKIynZjFf3OZo4^Fn;$u!;tISCY||`eN8zx z!>BH}H2Xs&mh~ex>ZqumC&Z&c;S=)CjGec`;~zCc zc+u$s#?gduB-Q(Z&yakUjR4r%QrXn7Vo_VeoTteSvxJLr17HwLip8(?q3Yk`v!3V= zVi^}2G{5dcBl6`l`CJiK%0x5fmQJfj0|~>(nu&zbq*+t=PR;*BZ5q2x@6f@9<)*V}{ou?7*QayW$FkqX#BYW+{R0+HiPHx(P%JP`~85`hc61QEOzghwe*CViTp z5(%}+m`#6fM-zYb4{U%RQQ#{CQ+H=Oos7h zDNOpu`%2}@FM5UlJseiU+D?IMx?%9gz?qLn_7$fNe3bmq7m+qy?3&Zl2?Lu=8aaH0 zAV&QB*g*khcNFfgeQXJR!!+_=-qj3p*PM%*(o5_-s(N?rUscs$+U@XQ){qTLD;LR? zWAh4p&pD+Hi3@v7O`_Cr=Kt!Q#hY9<{lp^iRaa6#iQG)CMp0N71?e~3>roy9=a)yqU^KR4n=E{e8EZ`i$yzv8}SWn;RM8sMH0bDiU1 zqP5Jpe+fRwmSnx#NEgxU#qOiTjh1_HVHa*UdSC*6cUc0nLwzT6Ll`m69o~iUF<^N? z31wdk-K(giUz79#k#P0P&>0ekxx`Tk7{=usX9O{RvdMwdz6_jeFuA<`llmkZp{=GM z%*OB7&f|7fKE*P{onvPmlZw)AOwvM9ekJp~CAY^4mpCp{(jTsrEB`vFWm!`%R{Gal z5@G;M7+xk5ds*jetJG&sQ86ctz@?FjAkmO;hcvmgpx%7?gL_M!?I)*amn#fVLWN7vFUamj>d4^Ph@p9yEmTE=bv8LFY+rXUN1uRQahl#`VNLc8{% zsjhlH-?oci_3FB%<^3;}|MV|S$^^2-*gNnL;*^O47Oz9fMaY)(kmPVr<_@KRXZc6Z zl1{08sliED)ixu+IF=$Z7vEZVQcz0g1p`mqp{t*=vCAu?e+Q-AdMP8n(5Uyi<;G2= zR8=a9NsE2*hx1PSX4+6AG~g8seXa2KRjyvi2~ne{UP%f4!8i9*5z|S6L}0r3UHXvV zqts7xj7jROW(uP1?Y~SztRou8{q|rISDJ&l<-1M`42Pc>`q*kjP>4RoU(wn%H5oS5 zmTl0LMuI{?;H^@QpAOS5T0JoUFT6K3x zaSD_hjsLvOcUF(aOTPBN*2_d5&Ek56G^*0k)b}~UG^03!LPh7xO;P6XAXKY&s!J`H zp5qOx?S5+J77mzjVPL)I?r`ty?9~U67wMS9`dwF7+_jm3N6mM)^SzIUFZ8Q&A1;@g z?N+;j!X7T>uK(1rE|r z-1JoL-@3UE=H56)JkVgu1`(h&U7WfKp?V8LwOkwye6vp=r}7vq zjQC4gr&lTlN#o45y$rvZOi2A+ATESX0~etlx&zETFCrD>xSD6{hmR7@K4^hDq8Er~ z>xMX>7sl;7Y%!r9UDM*bb?T|DC}KU;PqUJc9~~>ZPJWF%dvU4uYEdMcAUu3-r4{3G zi2xJjuC_FKqhA1ie|ptFM+1~F=Dw1tXh#WC6moJH)V8ex(p(N}VP+ni9C&!P48>wu zIKiH?bw$0PpJHXnHDUHDa48Wpf*;r;Ut4JOWVGcNw7qwp`z#TJHvIm>RF;y@9-2W- zcfsUm-%o)`+oB(3IHn%%P5-)`KJbE`!0!c`ig?C{4uYa>k?pT{=_!H;SF4Ka9>(Hj zbU8WM_W+_9{XOo^^5>7Y zO$1J?v)D4VbFCE#ur;l3srT=Z3?Qpvfp$g;&uE88B}mV6N6vCNfxqzc3TA_<-?(HO z#fOAG3xp8(4&H_f+TEX0rR34+wOR0qu*xze@C?!(x+kMdsJbINl{EE)&_@9!8Qe%$ z9z=EBsJ@QETF+dqe8S%h@SSg5Pdf!-MI}~NH+#?Z{YMQ0(z*n&lV8qhK2~iz0YXlc zh1w|L(#qV`#Hi;e=B)6C3-!a1n@Ryn?Vta411t{w{8RxvH7$r1$ zN|=}N>R1?n{e$jeUd(x+lQ+*<8|oJ;QZ!k#i;Y{Rp+PhUfCp;_5%^_cGv3Y>d#iYY z_CP;gwj*)uxZY(KOF=u#Bx0be3g4;qt^g2w_ zdf|#p*_DVn>l#r_aUVt(qp$ncN*Z)}stD{r0M6i}YG^w4t~^5=8aD^)wSXncF+Esk z?F>cQz0ra%nJF?8&tq^2Smq#g;-*NVV-Q3w^nt)ZkLP0&#ULn6R@a9uMXoJ*{J(Mq zQzGqRy3Vb>iMTH8HJRo`%0l~|fE$0kjUZ8+e2F#cb@s_>PD5)>IV!8s?rs zY9DcME3+W)E5NJiK4@eSXw0qIx{I2G)9-DlY*n4p1a~Apw&`X6J*sjJ?s~t%i9cYy z49FX4aY%?qiu2dr;EMf7PnT@(Y1jF${ROI0zK$kFJ!)=iEA{=|&{rx18*DK!4@sxm zK*e<$b;Qm0#dx0Yb)c>HcN*UreH{vp9fL&YKf#y#zgx{KO$6Vowkf+iq~%(-oTC_L z3kKLc9;TYNnIS^FJ{1x#@e(Zm%!lRAb_rSumeQn$1)o@jD`Z=Zq*Z4O+p5YS(GtKCu2X+oapxIXCE;WG>!H#vLpW8R*GzjS>=o@ZN zvg417Uz2E4{?}MVAvQkSG0zgD^-NE5;FpzqIpHK78v1b0H)DlVDgkSTY%E&;HSLqD zzhpBI8pn{*!-mlB;#Qb=Z9ZN|UHf+%8Lou*&muNTOYtJ2>FDyxU@ zEb|Lv-}sokZ?GKApVh!73syz~O-Rxi@s8^uu?UVZFSGv0zHI}zZj4bszCqJF^tXMnvpi-f?=h->cf(Cz^ zCBIBdT>SwL+{q1n>>wP)C5B6DfO|KC-{Vz?1#7@N;mc;nuc~pbzuS=BOPYt}zuYu0 zPDl%9Bsq1h^O7bTjYnR(JTXU)QKuh%dQ5$GkN>%5ZCAeBGCk-FC$~1Qz-}P`EW>WL zKB>$2C0tX%-#S{oBT-Gl)6!X?RAY?sG=vhQbgQUreWw<-O)CE$kGaOs9oshWH9{}S zurnV)S0?h;0xFwUdbC#B^_;-z!%^?Q{9j>oaenTm=3UROk^PE3-FZAAO*>v1&qD9r zYwu-e7WUhXIFz1A_+w}Y)iX62V0?Z1q3V;RCxuq6N6=kf&8L-9{H&dyv~%pHCUaD& z<9b=LD{MEW1%^##1~Qf@a= z>&2=KbwlDTsy;qNCEfnn0?DP#D#>qu=Ed4~Lk5SF@1z>B2iyD(E#})DGZEEF=D3-B zM>whqU4-sbhY&=*^1pIMOsUi+Gh^ z1F!4b)yuj>ajSeYmb=tNJ`ravVo)u8XC^ywPnK)9U6R_5FD{AHwMLkMd<8(+v+=#MR@o zGMQ0^T^v=7cJ$D6D?Qc`PVhb$Sl5Ml1sLU!%T7ZAIsAGeh57yHWPD?O%KH7~+4+Y8+2F z*fe+UE#8B@oLhf*u}53YajVtB7CU>-m0IuDNNQbTFR+z=|>}+e^;?8-T?BiP88{eV#vedk99AP#Q z3uqf#?2X2sYzI^yNI<&tZ_5+JLMFAPF!h)Wl)u%sCnr+)DvWz~+<)!C1}+NnarL7+ z2x_JnPJ=9vPXX#%H(yEyW>rcOP*&@m`y{TIKAnu|lI-ZL^ zf=H*V1X{y7s6C?}F{x&BkTkS?Ed;yD1{+vv@_yFk-uX!}892Gr_Luh!7iKPPqc>IE znk-#6w?*;EtZI}2n9A9=5BHaR)AZDnBij$W3J%{kE}A;>VRBdMzG`JM;cB^x$Y6!< zf2W;$mqZj75}>!E#0fY}sd3w1SF;W3I%LE?Eb*)9NhY%%jn`P`9T33q0P^RgT%k`Q z`D9L6(zFDr$yc`TXyn@dP!(^rSroGCN(k-KH@R~~ziwgHvUc5rFC>WWX%QKPic?N# zSP~MaQtw|QdBrNUBQAsvNZFs34z?h1EXU zL*kLvreY;Zwoo_6EkrPuDgN_IqXho7^V7Ff&ZWqL&PjBRn8S?Z#P9coeI@<<3LmHzwpXr zp@}Q$#O<<8vekjTlsYkfF@9D#G2CLgq#*e3DY5SFH=`!=-)RaB+m|W${MyC@lYYh)y+&VKy>>G!yKgb$X;v{VW9UJIB{?iW5k-qhJsytv&vJ-W}i ztOCjsXzhC*@EshknOyo8G+nRUPdic)Rxvs5l+g|$E7kkyTtZfcwH#8daDsfbdv_9h ze}k4aE>|z-8A+#~4pr#b>5bg)4{U!>$z5Q8*7&%l|CIZyl&hq!SR`CjC;oI$pb%J{ zZzLS+aD47MGwz+9U4I!Y4LQ|U*f%0ZBE!Jh&NvghWnu2`otkYLw(M)H+wUBK0mzz3oJcyf1a?eZJ%`Y0vtaK$ zep@P5@_S)(_@M@}MLefz(JAB?PmF~{nX`7Bo_)1E!S{VMh*=;{>>&7b{|o3qjXRC_`|`1ffe# zR$h=#EH}96Ypv}0CeR1<${)U(K)g+Nn>7T0g%|1-!G^TW7qz;k@;sCR^W0^7d}zl{ zNrJEcsauU@yeHWdL?a)fG;^C|5Tt#M5d-a*eWITw_X*eKVYEZtP{UZoLEMem?#9VC z76)eg(dsqhB(hOhgKg9$9rz!khYxvx!0*)h4O5%4_nz~AkAil$Ze%YRA%#A@Epr}~ z-(GS6V`78SoZTqH$(JIlZ_j@5XBJ$C1MMUf3rA_+X(Sc>QQ9rOp4p4O6$Vq^grF{v zWHlfzU2>7DY1t(qZTc@M7~x9u|sJW?KE+{5o5Yz9^ya50ud;v4%C~ zqv)8NDK)Z!%i&WCBT=4KwEtLl%U7Ykh>Dzq9*?f8CDr-Ry2WmU#s>~C)amw~CqgZF z4+ZzOtKEv9s+F@wkFpOdS#Ufq7#Z^K@POP?FH)V3rQEHs&cZxNaEv-50Zi8BZ$ZH; zHt0)dm;J0NV0vYk*P~l^T|J5uG^DV*x{rIg6p9v1m*l9Td_4mS&RT2!-jfw&(bW%*Si3Ll^$4&bXRr3b8M_xn_Izmcb6=2 z0pT!iFT3tDkeEtuWnRMpSSN6!)5b4H6$r%4Dj^YqCF{fnr_AJ6c{h)vUaPV3NuCVr zpjuR;v=jDmNvxtcovl96^kGFCcL@$&eYUY!2$!=M!C!ww>~j*By-+Ec}0%hd(PgOie8P=lXC*95RtIOmtf*A#dT;+0?TG6lN&gL~%&L+E;Ri z5O!c)pWO8KC?)%F>aBEs`~5+NfxPiNnRu}g;|HpNJ>4&i;;7Cm`hJS9*ko>K4X!PS zE8^GdLR(3sX`_ofsz39ZH^Rp`>hr==_A9MsA)=|%r6H%Qny%-+xROX#q!BA+p+80z zo(Y#<<>NbJIan;6VEji9J{`$03GiWVsbPXOeYoOp&f5>sm~qFu5UOx#5&ysAFB7GI zBGLu#TEK4N28TCwLoyFHlxQMUA*Unh=i%l76uQbG_A?ZquAx0wh!7q0fe8K8S zek`UqF6n^zfj?`{AMeD{%u(kBo0osennA=AcK0jY|;KFj0X>1UO4 zJ`OXfou*-@(+2Ku4)2$5uLtVR+$jC{Oqv8dUlDA|ftB3vX5>lWdQq~B|IXTG-nGB+ z?+1jRVCSK9rZ*h+s6aK!;>i6Vio;i~#PXD=R?q?oM^G5ERJ`d<<9^jCL z*nrY$lx}fIR+wl!dq>dT8Sn>p)$u#1ir+X+i9F=OC!iEBnpjY+5+)eLn#(OWB9lU1 zI+c{yD$IJ1JxF~R4*>f1e}BP~5L>(}Gx!tG2=TJh@MO_iXT52~-+XGDx^u@AdXu)k zg!E;^Ck>!Sbh6rSdL_RG^=f$+2D3;D=~2H`#beG;y6?27?#Us*M0rtqx&o=}5Kz0& zfcctBy?AVUo<0i4k;0ispS#nCH^IOMwH0snSuM(s+_E=nBsDClX!74#H?wtwz9J_0 zJARaiy|EUA+3@YDSNZC+OQ4m(iAO_aB36yNuUj(s^Nc#h_W9WU>#7B zDN`y$vK@!cc()_+;af<*pTmCa>&r5*Xx-Kj@q@SJjJW3XxT^A1VZjfQvqjhDMz&DL zLcKm2J(yF{+uf0hV?-PDRU)#9D7 z!nB=&r5EKlD%2xe57BF?qIkXlTP?>+^3sfD+WIe2Uxcupv!qhMTK2a^5Sku{c$RRo z``(Bws|(;9{L5)T;EK{mFqq2(P1nE)g>ayG1;Uu_#O+=MK*mNS{5uwzR_{(U-@E+V z3lt$0$*7+pD zfB4xA^18CMBH{jUEY0r}f7EToH2Xy%r%W$`$OK1f9uxELl@?O;e1@S6`$UE&=0keK zlpU^Z8i?O1=2KoeVF_JNVMcUnxj@8V+-mdDUVapfvR>VYO?s%eL6NJ(4=jSQ#Dh6Z z?X&~7cT_N+7*L&wUr_LIfrQTwzv`M`tHw5tZ@CzKHmvDNgim^aoExdX=Fr9yV+4lx zqYl3pBf?-oo`g`xHpv8MU9HaY9Wa(=@H`7}g1+%dp#{!2`U%DMeUA=Xw=P9~=>Sj{ zxKzvAsCsSlDqoEE?TWDJ*CT`kk}ZLYAYzTy&hk)mBbcxzOK`9Ycis5tLFgS8e*ZBZ zTn&eeT!?z7x(3!p@jm@$(9w9#8DZ6V0qMho4na(iWS#Aj_wz94cfQPCHkThC&5~&N zbs{Y$PrJ;9#9hAb>VUIW%k&aPK;7gMN5vaOn*CXKt4SZCLa|=Z(nsN-2b`ox)UpeL z{k_z}xtrevxt_}y4PjrV9FjgJdBm4nj>fWCTrvVxax-{-zaH2*N}`k!69+ak@vVa6 zw8m5J51*PagJ;JhD=iXiezePtbLflx_oz$uLyEktje(?aG1iz_vwA%k-iwGQf07l6 zV20upm^d4m{&gR3lsr6|NTM&UhI&v!P2DE~)PC0#8)-J-(TM4P>4aip8XKXkPDunf z7TK}Zm6(w?(%u=qvxA!APu>wGk--+K1EkagK`Fid+h#TlT7wN;mvE`gEKWA=7IK9zSC9|a8G3K7@Zg;P%QnIiacHej z7Ar2ahB{ur3rtnodZ0JIL$j94X@X2DG_50<90b14vsHZs(|wgvPpcPuWb6LHAr_UJ z+0$dvG8}XF2-TAA8-8m=H*0@|{MDIR&$wtCIoL(^W^=ZSw)R`>>tCT-Z1H=+OCsMe z?@Qi{t>Qa}ft#}IJwny{9??e-EkY@zADT6PFX0>SC)s-3tsCSl| z>wG)yXYR-M?E5Jz=fhr@ah3UjI-mbJ#uB~prKVQJq za@H9`weYnLz7lZ%_=js*xyV%;Vzp|7+)L^(d-g8!M@@7jdf^${jk9Iq@OyH^2xOJ3 zZd_?tr9leTL{6M|$`8uuQPA%nJOBI!QhE7O7Q z!p1s8gc6!Z_17RC{1yxRl#1VmC9XnHK7KP0P@?HzVoFZl=cw`OR2e)Nb-9=fI^*bd zXC3Y4^1fSL0GHKfq*dJ6=mx!joGyTm8D{%FijgBK&fa{mgx7%X&XaD}{yWVr8I+i3 zztNplDp`2N!}7YsvtpAL6r{%RfF{Dz`3t+`xwk-b-`k(Gjg-ujKYzu5bq(Qtd34N5 zzN!=3&P|l?VW3;l`)x+I;`iz4s&6f^yKPvuyap;gS3QVsw9+Lx=J(v9XZn4?tEPDd{O+rk zxm_3D6>!UX_YojqQp^v93;ylJHzitEgbgcZMEp!u->dSNwMdsJq*mH(F?w2)9G)nA z-_urA_O=St2@5_4!Su#+G@sEiYt(2cq~wZm&J=$Bxz|W@_`l`n0Rku2gO@ie!AC!h zUDY-&y!Lo8hiZ&z%RfHZG_DBdY`R@gh~BOsTOQr!u$?EuQ3RN>S~k*@dNs+mt7@;B z!KX#Q$Ha3&C$x`6Zq4~?re_QXR8uoHjedBPJjacgG=Ai6FLxMWQ!`M$(Ar_cq_5Xk zurV?hOv6k4|9W-sr_t6ood^q;)w=WbNe!FbFtbi498!vhgO>6O{&*^u#H86? zi}stP0mPN1uI=mVD?L#RhsY?=frlu|ku-4c4!7r6mkWtOU0ijA8|vEZ?5vFc{sPtA zpD?9+h2MP1|F^Qq%Wv(8Dh*Ed+4=NYW{s-EwCD1DGc5nkU2QD$n)!@C0@H2&?+@9z zCb_J1Ue^EWywv~K=clfgmtG{i_M#L79ZvdFZ|-218~^D@H}FgZ22WQ%mvv4FO#qo8 B?w9}o literal 0 HcmV?d00001 diff --git a/dashboard/public/statics/favicon/android-chrome-512x512.png b/dashboard/public/statics/favicon/android-chrome-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..eb7f368fe4b955de5a30d4c2dbd35484e839774d GIT binary patch literal 58809 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 N002ovPDHLkV1g#A0QUd@ literal 0 HcmV?d00001 diff --git a/dashboard/public/statics/favicon/logo-dark.png b/dashboard/public/statics/favicon/logo-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..a0759f3008cd64579e13493c022f7f015c8c5e10 GIT binary patch literal 264842 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 HI9dcMkj0Q;^&5xE(>6uY^ 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
+ + +
+ + + ) +} diff --git a/dashboard/src/assets/react.svg b/dashboard/src/assets/react.svg new file mode 100644 index 000000000..6c87de9bb --- /dev/null +++ b/dashboard/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dashboard/src/components/ActionButtons.tsx b/dashboard/src/components/ActionButtons.tsx new file mode 100644 index 000000000..2abe531ea --- /dev/null +++ b/dashboard/src/components/ActionButtons.tsx @@ -0,0 +1,560 @@ +import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle } from '@/components/ui/alert-dialog' +import { Button } from '@/components/ui/button' +import { useClipboard } from '@/hooks/use-clipboard' +import useDirDetection from '@/hooks/use-dir-detection' +import { cn } from '@/lib/utils' +import { UseEditFormValues, UseFormValues } from '@/pages/_dashboard.users' +import { useActiveNextPlan, useGetCurrentAdmin, useRemoveUser, useResetUserDataUsage, useRevokeUserSubscription, UserResponse } from '@/service/api' +import { useQueryClient } from '@tanstack/react-query' +import { Check, Copy, Cpu, EllipsisVertical, ListStart, Pencil, PieChart, QrCode, RefreshCcw, Trash2, User, Users } from 'lucide-react' +import { FC, useCallback, useEffect, useState } from 'react' +import { useForm } from 'react-hook-form' +import { useTranslation } from 'react-i18next' +import { toast } from 'sonner' +import { CopyButton } from './CopyButton' +import QRCodeModal from './dialogs/QRCodeModal' +import SetOwnerModal from './dialogs/SetOwnerModal' +import UsageModal from './dialogs/UsageModal' +import UserModal from './dialogs/UserModal' +import { UserSubscriptionClientsModal } from './dialogs/UserSubscriptionClientsModal' +import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger } from './ui/dropdown-menu' +import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from './ui/tooltip' + +type ActionButtonsProps = { + user: UserResponse +} + +export interface SubscribeLink { + protocol: string + link: string + icon: string +} + +const ActionButtons: FC = ({ user }) => { + const [subscribeUrl, setSubscribeUrl] = useState('') + const [subscribeLinks, setSubscribeLinks] = useState([]) + const [showQRModal, setShowQRModal] = useState(false) + const [isEditModalOpen, setEditModalOpen] = useState(false) + const [isDeleteDialogOpen, setDeleteDialogOpen] = useState(false) + const [isResetUsageDialogOpen, setResetUsageDialogOpen] = useState(false) + const [isRevokeSubDialogOpen, setRevokeSubDialogOpen] = useState(false) + const [isUsageModalOpen, setUsageModalOpen] = useState(false) + const [isSetOwnerModalOpen, setSetOwnerModalOpen] = useState(false) + const [isActiveNextPlanModalOpen, setIsActiveNextPlanModalOpen] = useState(false) + const [isSubscriptionClientsModalOpen, setSubscriptionClientsModalOpen] = useState(false) + const queryClient = useQueryClient() + const { t } = useTranslation() + const dir = useDirDetection() + const removeUserMutation = useRemoveUser() + const resetUserDataUsageMutation = useResetUserDataUsage() + const revokeUserSubscriptionMutation = useRevokeUserSubscription() + const activeNextMutation = useActiveNextPlan() + const { data: currentAdmin } = useGetCurrentAdmin({ + query: { + // Cache for 5 minutes to avoid repeated calls + staleTime: 5 * 60 * 1000, + // Keep in cache for 10 minutes + gcTime: 10 * 60 * 1000, + // Don't refetch on mount if we have cached data + refetchOnMount: false, + // Only refetch on window focus if data is stale + refetchOnWindowFocus: false, + }, + }) + + // Create form for user editing + const userForm = useForm({ + defaultValues: { + username: user.username, + status: user.status === "expired" || user.status === "limited" ? "active" : user.status, + data_limit: user.data_limit ? Math.round((Number(user.data_limit) / (1024 * 1024 * 1024)) * 100) / 100 : undefined, // Convert bytes to GB + expire: user.expire, + note: user.note || '', + data_limit_reset_strategy: user.data_limit_reset_strategy || undefined, + group_ids: user.group_ids || [], // Add group_ids + on_hold_expire_duration: user.on_hold_expire_duration || undefined, + next_plan: user.next_plan + ? { + user_template_id: user.next_plan.user_template_id ? Number(user.next_plan.user_template_id) : undefined, + data_limit: user.next_plan.data_limit ? Number(user.next_plan.data_limit) : undefined, + expire: user.next_plan.expire ? Number(user.next_plan.expire) : undefined, + add_remaining_traffic: user.next_plan.add_remaining_traffic || false, + } + : undefined, + }, + }) + + // Update form when user data changes + useEffect(() => { + const values: UseFormValues = { + username: user.username, + status: user.status === 'active' || user.status === 'on_hold' || user.status === 'disabled' ? user.status as any : 'active', + data_limit: user.data_limit ? Math.round((Number(user.data_limit) / (1024 * 1024 * 1024)) * 100) / 100 : 0, + expire: user.expire, // Pass raw expire value (timestamp) + note: user.note || '', + data_limit_reset_strategy: user.data_limit_reset_strategy || undefined, + group_ids: user.group_ids || [], + on_hold_expire_duration: user.on_hold_expire_duration || undefined, + proxy_settings: user.proxy_settings || undefined, + next_plan: user.next_plan + ? { + user_template_id: user.next_plan.user_template_id ? Number(user.next_plan.user_template_id) : undefined, + data_limit: user.next_plan.data_limit ? Number(user.next_plan.data_limit) : undefined, + expire: user.next_plan.expire ? Number(user.next_plan.expire) : undefined, + add_remaining_traffic: user.next_plan.add_remaining_traffic || false, + } + : undefined, + } + + // Update form with current values + userForm.reset(values) + }, [user, userForm]) + + const onOpenQRModal = useCallback(() => { + setSubscribeUrl(user.subscription_url ? user.subscription_url : '') + setShowQRModal(true) + }, [user.subscription_url]) + + const onCloseQRModal = useCallback(() => { + setSubscribeUrl('') + setShowQRModal(false) + }, []) + + useEffect(() => { + if (user.subscription_url) { + const subURL = user.subscription_url.startsWith('/') ? window.location.origin + user.subscription_url : user.subscription_url + + const links = [ + { protocol: 'links', link: `${subURL}/links`, icon: '🔗' }, + { protocol: 'links (base64)', link: `${subURL}/links_base64`, icon: '📝' }, + { protocol: 'xray', link: `${subURL}/xray`, icon: '⚡' }, + { protocol: 'clash', link: `${subURL}/clash`, icon: '⚔️' }, + { protocol: 'clash-meta', link: `${subURL}/clash_meta`, icon: '🛡️' }, + { protocol: 'outline', link: `${subURL}/outline`, icon: '🔒' }, + { protocol: 'sing-box', link: `${subURL}/sing_box`, icon: '📦' }, + ] + setSubscribeLinks(links) + } + }, [user.subscription_url]) + + const { copy, copied } = useClipboard({ timeout: 1500 }) + + // Refresh user data function + const refreshUserData = () => { + queryClient.invalidateQueries({ queryKey: ['/api/users'] }) + } + + // Handlers for menu items + const handleEdit = () => { + // Only need to open modal since form values are already updated via useEffect + setEditModalOpen(true) + } + + const handleSetOwner = () => { + setSetOwnerModalOpen(true) + } + + const handleRevokeSubscription = () => { + setRevokeSubDialogOpen(true) + } + + const confirmRevokeSubscription = async () => { + try { + await revokeUserSubscriptionMutation.mutateAsync({ username: user.username }) + toast.success(t('userDialog.revokeSubSuccess', { name: user.username })) + setRevokeSubDialogOpen(false) + refreshUserData() + } catch (error: any) { + toast.error(t('revokeUserSub.error', { name: user.username, error: error?.message || '' })) + } + } + + const handleActiveNextPlan = () => { + setIsActiveNextPlanModalOpen(true) + } + + const activeNextPlan = async () => { + try { + await activeNextMutation.mutateAsync({ username: user.username }) + toast.success(t('userDialog.activeNextPlanSuccess', { name: user.username })) + refreshUserData() + } catch (error: any) { + toast.error(t('userDialog.activeNextPlanError', { name: user.username, error: error?.message || '' })) + } + } + + const handleResetUsage = () => { + setResetUsageDialogOpen(true) + } + + const confirmResetUsage = async () => { + try { + await resetUserDataUsageMutation.mutateAsync({ username: user.username }) + toast.success(t('usersTable.resetUsageSuccess', { name: user.username })) + setResetUsageDialogOpen(false) + refreshUserData() + } catch (error: any) { + toast.error(t('usersTable.resetUsageFailed', { name: user.username, error: error?.message || '' })) + } + } + + const handleUsageState = () => { + setUsageModalOpen(true) + } + + const handleDelete = () => { + setDeleteDialogOpen(true) + } + + const confirmDelete = async () => { + try { + await removeUserMutation.mutateAsync({ username: user.username }) + toast.success(t('usersTable.deleteSuccess', { name: user.username })) + setDeleteDialogOpen(false) + refreshUserData() + } catch (error: any) { + toast.error(t('usersTable.deleteFailed', { name: user.username, error: error?.message || '' })) + } + } + + // Utility functions + const isIOS = () => { + return /iPad|iPhone|iPod/.test(navigator.userAgent) || (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1) + } + + const copyToClipboardIOS = async (content: string): Promise => { + try { + // Try modern clipboard API first + if (navigator.clipboard && window.isSecureContext) { + await navigator.clipboard.writeText(content) + return true + } + + // Fallback: create temporary textarea + const textArea = document.createElement('textarea') + textArea.value = content + textArea.style.position = 'fixed' + textArea.style.left = '-999999px' + textArea.style.top = '-999999px' + document.body.appendChild(textArea) + textArea.focus() + textArea.select() + + const success = document.execCommand('copy') + document.body.removeChild(textArea) + return success + } catch (error) { + console.error('iOS clipboard copy failed:', error) + return false + } + } + + const showManualCopyAlert = (content: string, type: 'content' | 'url') => { + const message = + type === 'content' ? t('copyFailed', { defaultValue: 'Failed to copy automatically. Please copy manually:' }) : t('downloadFailed', { defaultValue: 'Download blocked. Please copy manually:' }) + alert(`${message}\n\n${content}`) + } + + const fetchContent = async (url: string): Promise => { + const response = await fetch(url) + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`) + } + return response.text() + } + + const handleLinksCopy = async (subLink: SubscribeLink) => { + try { + const content = await fetchContent(subLink.link) + + if (isIOS()) { + const success = await copyToClipboardIOS(content) + if (success) { + toast.success(t('usersTable.copied', { defaultValue: 'Copied to clipboard' })) + } else { + showManualCopyAlert(content, 'content') + } + } else { + await copy(content) + toast.success(t('usersTable.copied', { defaultValue: 'Copied to clipboard' })) + } + } catch (error) { + console.error('Failed to fetch and copy content:', error) + // Fallback: copy the URL instead + await handleUrlCopy(subLink.link) + } + } + + const handleUrlCopy = async (url: string) => { + try { + if (isIOS()) { + const success = await copyToClipboardIOS(url) + if (success) { + toast.success(t('usersTable.copied', { defaultValue: 'URL copied to clipboard' })) + } else { + showManualCopyAlert(url, 'url') + } + } else { + await copy(url) + toast.success(t('usersTable.copied', { defaultValue: 'URL copied to clipboard' })) + } + } catch (error) { + toast.error(t('copyFailed', { defaultValue: 'Failed to copy content' })) + } + } + + const handleCopyCoreUsername = () => handleUrlCopy(`${user.id}.${user.username}`) + + const handleConfigDownload = async (subLink: SubscribeLink) => { + try { + if (isIOS()) { + // iOS: open in new tab or show content + const newWindow = window.open(subLink.link, '_blank') + if (!newWindow) { + const content = await fetchContent(subLink.link) + showManualCopyAlert(content, 'url') + } else { + toast.success(t('downloadSuccess', { defaultValue: 'Configuration opened in new tab' })) + } + } else { + // Non-iOS: regular download + const response = await fetch(subLink.link) + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`) + } + + const blob = await response.blob() + const url = window.URL.createObjectURL(blob) + const a = document.createElement('a') + a.href = url + a.download = `${user.username}-${subLink.protocol}.txt` + document.body.appendChild(a) + a.click() + window.URL.revokeObjectURL(url) + document.body.removeChild(a) + toast.success(t('downloadSuccess', { defaultValue: 'Configuration downloaded successfully' })) + } + } catch (error) { + console.error('Failed to download configuration:', error) + toast.error(t('downloadFailed', { defaultValue: 'Failed to download configuration' })) + } + } + + const handleCopyOrDownload = async (subLink: SubscribeLink) => { + const isLinksProtocol = subLink.protocol === 'links' || subLink.protocol === 'links (base64)' + + if (isLinksProtocol) { + await handleLinksCopy(subLink) + } else { + await handleConfigDownload(subLink) + } + } + + return ( +
e.stopPropagation()}> +
+ + + + + + + + + + + + {subscribeLinks.map(subLink => ( + + + + ))} + + + {copied ? t('usersTable.copied') : t('usersTable.copyConfigs')} + + + + + + + + {/* Edit */} + + + {t('edit')} + + + {/* QR Code */} + + + Qr Code + + + {/* Set Owner: only for sudo admins */} + {currentAdmin?.is_sudo && ( + + + {t('setOwnerModal.title')} + + )} + + {/* Copy Core Username for sudo admins */} + {currentAdmin?.is_sudo && ( + + + {t('coreUsername')} + + )} + + + + {/* Revoke Sub */} + + + {t('userDialog.revokeSubscription')} + + + {/* Reset Usage */} + + + {t('userDialog.resetUsage')} + + + {/* Usage State */} + + + {t('userDialog.usage')} + + + {/* Active Next Plan */} + {user.next_plan && ( + + + {t('usersTable.activeNextPlanSubmit')} + + )} + + {/* Subscription Info */} + setSubscriptionClientsModalOpen(true)}> + + {t('subscriptionClients.viewAllClients', { defaultValue: 'View All Clients' })} + + + + + {/* Trash */} + + + {t('remove')} + + + +
+ + {/* QR Code Modal */} + {showQRModal && subscribeUrl && } + + {/* Active Next Plan Confirm Dialog */} + + + + {t('usersTable.activeNextPlanTitle')} + {t('usersTable.activeNextPlanPrompt', { name: user.username })} + + + setDeleteDialogOpen(false)}>{t('usersTable.cancel')} + + {t('usersTable.activeNextPlanSubmit')} + + + + + + {/* Delete User Confirm Dialog */} + + + + {t('usersTable.deleteUserTitle')} + {t('usersTable.deleteUserPrompt', { name: user.username })} + + + setDeleteDialogOpen(false)}>{t('usersTable.cancel')} + + {t('usersTable.delete')} + + + + + + {/* Reset Usage Confirm Dialog */} + + + + {t('usersTable.resetUsageTitle')} + {t('usersTable.resetUsagePrompt', { name: user.username })} + + + setResetUsageDialogOpen(false)}>{t('usersTable.cancel')} + + {t('usersTable.resetUsageSubmit')} + + + + + + {/* Revoke Subscription Confirm Dialog */} + + + + {t('revokeUserSub.title')} + {t('revokeUserSub.prompt', { username: user.username })} + + + setRevokeSubDialogOpen(false)}>{t('usersTable.cancel')} + + {t('revokeUserSub.title')} + + + + + + {/* Edit User Modal */} + + + setUsageModalOpen(false)} username={user.username} /> + + {/* SetOwnerModal: only for sudo admins */} + {currentAdmin?.is_sudo && ( + setSetOwnerModalOpen(false)} username={user.username} currentOwner={user.admin?.username} onSuccess={refreshUserData} /> + )} + + {/* UserSubscriptionClientsModal */} + +
+ ) +} + +export default ActionButtons diff --git a/dashboard/src/components/AdminStatistics.tsx b/dashboard/src/components/AdminStatistics.tsx new file mode 100644 index 000000000..660fa1983 --- /dev/null +++ b/dashboard/src/components/AdminStatistics.tsx @@ -0,0 +1,73 @@ +import useDirDetection from '@/hooks/use-dir-detection' +import { cn } from '@/lib/utils.ts' +import { numberWithCommas } from '@/utils/formatByte' +import { useTranslation } from 'react-i18next' +import { Card, CardTitle } from '@/components/ui/card' +import { type AdminDetails } from '@/service/api' +import { User, UserCheck, UserX } from 'lucide-react' +import React from 'react' + +interface AdminsStatisticsProps { + data: AdminDetails[] +} + +export default function AdminStatisticsSection({ data }: AdminsStatisticsProps) { + const { t } = useTranslation() + const dir = useDirDetection() + const total = data.length + const disabled = data.filter(a => a.is_disabled).length + const active = total - disabled + + const stats = [ + { + icon: User, + label: t('admins.total'), + value: total, + color: '' + }, + { + icon: UserCheck, + label: t('admins.active'), + value: active, + color: '' + }, + { + icon: UserX, + label: t('admins.disable'), + value: disabled, + color: '' + } + ] + + return ( +
+ {stats.map((stat, idx) => ( + +
+ +
+ {React.createElement(stat.icon, { className: "h-6 w-6" })} + {stat.label} +
+ {numberWithCommas(stat.value)} +
+ + ))} +
+ ) +} diff --git a/dashboard/src/components/AdminStatusBadge.tsx b/dashboard/src/components/AdminStatusBadge.tsx new file mode 100644 index 000000000..963e73efa --- /dev/null +++ b/dashboard/src/components/AdminStatusBadge.tsx @@ -0,0 +1,59 @@ +import { Badge } from '@/components/ui/badge' +import { statusColors } from '@/constants/UserSettings' +import { cn } from '@/lib/utils' +import { FC } from 'react' +import { useTranslation } from 'react-i18next' +import { UserRound, Shield } from 'lucide-react' + +type AdminStatusProps = { + isSudo: boolean + isDisabled: boolean +} + +export const AdminStatusBadge: FC = ({ isSudo, isDisabled }) => { + const { t } = useTranslation() + + const getStatusInfo = () => { + if (isDisabled) { + return { + color: statusColors['disabled']?.statusColor || 'bg-gray-400 text-white', + icon: null, + text: t('disabled') + } + } + + if (isSudo) { + return { + color: 'bg-violet-500 text-white', + icon: Shield, + text: t('sudo') + } + } + + return { + color: statusColors['active']?.statusColor || 'bg-green-500 text-white', + icon: UserRound, + text: t('admin') + } + } + + const statusInfo = getStatusInfo() + const StatusIcon = statusInfo.icon + + return ( + +
+ {StatusIcon && } + + {statusInfo.text} + +
+
+ ) +} \ No newline at end of file diff --git a/dashboard/src/components/CopyButton.tsx b/dashboard/src/components/CopyButton.tsx new file mode 100644 index 000000000..e1ec4d8f7 --- /dev/null +++ b/dashboard/src/components/CopyButton.tsx @@ -0,0 +1,45 @@ +import { Button } from '@/components/ui/button' +import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip' +import { useClipboard } from '@/hooks/use-clipboard' +import { Check, Copy, Link } from 'lucide-react' +import { useCallback } from 'react' +import { useTranslation } from 'react-i18next' + +interface CopyButtonProps { + value: string + className?: string + copiedMessage?: string + defaultMessage?: string + icon?: 'copy' | 'link' + onClick?: (e: React.MouseEvent) => void +} + +export function CopyButton({ value, className, copiedMessage = 'Copied!', defaultMessage = 'Click to copy', icon = 'copy', onClick }: CopyButtonProps) { + const { t } = useTranslation() + + const { copy, copied } = useClipboard({ timeout: 1500 }) + const handleCopy = useCallback( + (e: React.MouseEvent) => { + e.preventDefault() + e.stopPropagation() + copy(value) + onClick?.(e) + }, + [copy, value, onClick], + ) + + return ( + + +
+ +
+
+ +

{copied ? t(copiedMessage) : t(defaultMessage)}

+
+
+ ) +} diff --git a/dashboard/src/components/Footer.tsx b/dashboard/src/components/Footer.tsx new file mode 100644 index 000000000..2228e8d2f --- /dev/null +++ b/dashboard/src/components/Footer.tsx @@ -0,0 +1,23 @@ +import { REPO_URL } from '@/constants/Project' +import { FC } from 'react' + +const FooterContent = () => { + + + return ( +

+ Made with ❤️ in   + + PasarGuard Team + +

+ ) +} + +export const Footer: FC = ({ ...props }) => { + return ( +
+ +
+ ) +} \ No newline at end of file diff --git a/dashboard/src/components/Language.tsx b/dashboard/src/components/Language.tsx new file mode 100644 index 000000000..33af50eee --- /dev/null +++ b/dashboard/src/components/Language.tsx @@ -0,0 +1,41 @@ +import { Button } from '@/components/ui/button' +import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@/components/ui/dropdown-menu' +import { LanguagesIcon } from 'lucide-react' +import { useTranslation } from 'react-i18next' + +export const Language: React.FC = () => { + const { i18n } = useTranslation() + const supportedLangs = ['en', 'fa', 'zh', 'ru'] + + const changeLanguage = async (lang: string) => { + if (lang === 'system') { + // detect browser language and change without reload + const detectedLang = navigator.language.split('-')[0] // e.g., 'en-US' -> 'en' + const langToSet = supportedLangs.includes(detectedLang) ? detectedLang : 'en' + await i18n.changeLanguage(langToSet) + document.documentElement.lang = i18n.language + document.documentElement.setAttribute('dir', i18n.dir()) + } else { + await i18n.changeLanguage(lang) + document.documentElement.lang = lang + document.documentElement.setAttribute('dir', i18n.dir()) + } + } + + return ( + + + + + + changeLanguage('system')}>System + changeLanguage('en')}>English + changeLanguage('fa')}>فارسی + changeLanguage('zh')}>简体中文 + changeLanguage('ru')}>Русский + + + ) +} diff --git a/dashboard/src/components/LineCountFilter.tsx b/dashboard/src/components/LineCountFilter.tsx new file mode 100644 index 000000000..cdfb6a9d8 --- /dev/null +++ b/dashboard/src/components/LineCountFilter.tsx @@ -0,0 +1,52 @@ +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select"; +import { useTranslation } from "react-i18next"; +import { toPersianNumerals } from "@/utils/formatByte"; +import useDirDetection from "@/hooks/use-dir-detection"; + +interface LineCountFilterProps { + value: number; + onValueChange: (value: number) => void; +} + +export function LineCountFilter({ value, onValueChange }: LineCountFilterProps) { + const { t, i18n } = useTranslation(); + const dir = useDirDetection(); + + const LINE_COUNT_OPTIONS = [ + { label: i18n.language === 'fa' ? `${toPersianNumerals(50)} خط` : '50 lines', value: 50 }, + { label: i18n.language === 'fa' ? `${toPersianNumerals(100)} خط` : '100 lines', value: 100 }, + { label: i18n.language === 'fa' ? `${toPersianNumerals(200)} خط` : '200 lines', value: 200 }, + { label: i18n.language === 'fa' ? `${toPersianNumerals(500)} خط` : '500 lines', value: 500 }, + { label: i18n.language === 'fa' ? `${toPersianNumerals(1000)} خط` : '1000 lines', value: 1000 }, + { label: i18n.language === 'fa' ? `${toPersianNumerals(2000)} خط` : '2000 lines', value: 2000 }, + { label: i18n.language === 'fa' ? `${toPersianNumerals(5000)} خط` : '5000 lines', value: 5000 }, + ]; + + return ( +
+ {t('nodes.logs.linesLabel', { defaultValue: 'Lines:' })} + +
+ ); +} diff --git a/dashboard/src/components/LoadingSpinner.tsx b/dashboard/src/components/LoadingSpinner.tsx new file mode 100644 index 000000000..c730c2ccc --- /dev/null +++ b/dashboard/src/components/LoadingSpinner.tsx @@ -0,0 +1,27 @@ +import React from 'react' +import { Spinner } from './spinner' +import { useTranslation } from 'react-i18next' + +interface LoadingSpinnerProps { + text?: string + size?: 'small' | 'medium' | 'large' + className?: string +} + +export function LoadingSpinner({ + text = 'loading', + size = 'medium', + className = '' +}: LoadingSpinnerProps) { + const { t } = useTranslation() + return ( +
+ + {text && ( +

+ {t(text)} +

+ )} +
+ ) +} \ No newline at end of file diff --git a/dashboard/src/components/OnlineBadge.tsx b/dashboard/src/components/OnlineBadge.tsx new file mode 100644 index 000000000..01a5e4016 --- /dev/null +++ b/dashboard/src/components/OnlineBadge.tsx @@ -0,0 +1,82 @@ +import { FC } from 'react' +import { dateUtils } from '../utils/dateFormatter' +import { Tooltip, TooltipContent, TooltipTrigger, TooltipProvider } from './ui/tooltip' +import { useTranslation } from 'react-i18next' +import dayjs from '@/lib/dayjs' + +type UserStatusProps = { + lastOnline?: string | null +} + +export const OnlineBadge: FC = ({ lastOnline }) => { + const { t } = useTranslation() + + const getTooltipText = () => { + if (!lastOnline) { + return t('notConnectedYet') + } + + const currentTime = dayjs() + const lastOnlineTime = dateUtils.toDayjs(lastOnline) + const diffInSeconds = currentTime.diff(lastOnlineTime, 'seconds') + + const isOnline = diffInSeconds <= 60 + + if (isOnline) { + return t('online') + } else { + // Format the time difference for offline status + const duration = dayjs.duration(diffInSeconds, 'seconds') + let timeText = '' + + if (duration.years() > 0) { + timeText = `${duration.years()} ${t(`time.${duration.years() !== 1 ? 'years' : 'year'}`)} ${t('time.ago')}` + } else if (duration.months() > 0) { + timeText = `${duration.months()} ${t(`time.${duration.months() !== 1 ? 'months' : 'month'}`)} ${t('time.ago')}` + } else if (duration.days() > 0) { + timeText = `${duration.days()} ${t(`time.${duration.days() !== 1 ? 'days' : 'day'}`)} ${t('time.ago')}` + } else if (duration.hours() > 0) { + timeText = `${duration.hours()} ${t(`time.${duration.hours() !== 1 ? 'hours' : 'hour'}`)} ${t('time.ago')}` + } else if (duration.minutes() > 0) { + timeText = `${duration.minutes()} ${t(`time.${duration.minutes() !== 1 ? 'mins' : 'min'}`)} ${t('time.ago')}` + } else { + timeText = `${duration.seconds()} ${t(`time.${duration.seconds() !== 1 ? 'seconds' : 'second'}`)} ${t('time.ago')}` + } + + return timeText + } + } + + const renderBadge = () => { + if (!lastOnline) { + return
+ } + + const currentTime = dayjs() + const lastOnlineTime = dateUtils.toDayjs(lastOnline) + const diffInSeconds = currentTime.diff(lastOnlineTime, 'seconds') + + const isOnline = diffInSeconds <= 60 + + if (isOnline) { + // Online - green dot + return
+ } else { + // Offline - gray dot + return
+ } + } + + return ( + + + + {renderBadge()} + + +

{getTooltipText()}

+
+
+
+ ) +} diff --git a/dashboard/src/components/OnlineStatus.tsx b/dashboard/src/components/OnlineStatus.tsx new file mode 100644 index 000000000..77bba692d --- /dev/null +++ b/dashboard/src/components/OnlineStatus.tsx @@ -0,0 +1,61 @@ +import useDirDetection from '@/hooks/use-dir-detection' +import { cn } from '@/lib/utils' +import { dateUtils } from '@/utils/dateFormatter' +import { FC } from 'react' +import { useTranslation } from 'react-i18next' +import dayjs from '@/lib/dayjs' + +type UserStatusProps = { + lastOnline: string | number | null | undefined +} + +export const OnlineStatus: FC = ({ lastOnline }) => { + const { t } = useTranslation() + const dir = useDirDetection() + + if (!lastOnline) { + return ( + + {t('notConnectedYet')} + + ) + } + + const currentTime = dayjs() + const lastOnlineTime = dateUtils.toDayjs(lastOnline) + const diffInSeconds = currentTime.diff(lastOnlineTime, 'seconds') + + const isOnline = diffInSeconds <= 60 + + if (isOnline) { + return ( + + {t('online')} + + ) + } else { + // Format the time difference for offline status + const duration = dayjs.duration(diffInSeconds, 'seconds') + let timeText = '' + + if (duration.years() > 0) { + timeText = `${duration.years()} ${t(`time.${duration.years() !== 1 ? 'years' : 'year'}`)} ${t('time.ago')}` + } else if (duration.months() > 0) { + timeText = `${duration.months()} ${t(`time.${duration.months() !== 1 ? 'months' : 'month'}`)} ${t('time.ago')}` + } else if (duration.days() > 0) { + timeText = `${duration.days()} ${t(`time.${duration.days() !== 1 ? 'days' : 'day'}`)} ${t('time.ago')}` + } else if (duration.hours() > 0) { + timeText = `${duration.hours()} ${t(`time.${duration.hours() !== 1 ? 'hours' : 'hour'}`)} ${t('time.ago')}` + } else if (duration.minutes() > 0) { + timeText = `${duration.minutes()} ${t(`time.${duration.minutes() !== 1 ? 'mins' : 'min'}`)} ${t('time.ago')}` + } else { + timeText = `${duration.seconds()} ${t(`time.${duration.seconds() !== 1 ? 'seconds' : 'second'}`)} ${t('time.ago')}` + } + + return ( + + {timeText} + + ) + } +} diff --git a/dashboard/src/components/PageTransition.tsx b/dashboard/src/components/PageTransition.tsx new file mode 100644 index 000000000..67b4614c3 --- /dev/null +++ b/dashboard/src/components/PageTransition.tsx @@ -0,0 +1,237 @@ +import { ReactNode, useEffect, useState, useRef } from 'react' +import { useLocation, useNavigationType } from 'react-router' +import { cn } from '@/lib/utils' + +interface PageTransitionProps { + children: ReactNode + duration?: number // in milliseconds + delay?: number // in milliseconds + isContentTransition?: boolean // Flag to indicate if this is an inner content transition +} + +export default function PageTransition({ + children, + duration = 300, + delay = 0, + isContentTransition = false, // Default to false for backward compatibility +}: PageTransitionProps) { + const location = useLocation() + const navigationType = useNavigationType() + const [displayChildren, setDisplayChildren] = useState(children) + const [isPageTransitioning, setIsPageTransitioning] = useState(false) + const [isShaking, setIsShaking] = useState(false) + const previousLocationRef = useRef({ + pathname: location.pathname, + search: location.search, + hash: location.hash, + key: location.key, + state: location.state, + }) + const isFirstRenderRef = useRef(true) + const hasNavigatedRef = useRef(false) + const transitionTimeoutRef = useRef(null) + const shakeTimeoutRef = useRef(null) + + // Clean up timeouts on unmount + useEffect(() => { + return () => { + if (transitionTimeoutRef.current) { + window.clearTimeout(transitionTimeoutRef.current) + } + if (shakeTimeoutRef.current) { + window.clearTimeout(shakeTimeoutRef.current) + } + } + }, []) + + // Update children when they change, but only if not transitioning + useEffect(() => { + if (!isShaking && !isPageTransitioning) { + setDisplayChildren(children) + } + }, [children, isShaking, isPageTransitioning]) + + // For hash router, we need to consider the full URL including the hash + const getPathWithHash = () => { + return `${location.pathname}${location.hash}` + } + + const previousPathWithHash = () => { + return `${previousLocationRef.current.pathname}${previousLocationRef.current.hash}` + } + + // Detect actual location change for hash router + const isSameLocation = () => { + // In hash router, the location.key changes for each navigation attempt + // even if the URL is the same, so we can use it to detect navigation attempts + return getPathWithHash() === previousPathWithHash() && location.key !== previousLocationRef.current.key + } + + // Check if we're coming from login page + const isComingFromLogin = () => { + const prevPath = previousPathWithHash() + const currentPath = getPathWithHash() + return prevPath.includes('/login') && (currentPath === '/' || currentPath === '/#/') + } + + // Check if this is a tab navigation within dashboard sections + const isTabNavigation = () => { + // Check if navigation is between tabs in settings or nodes sections + const currentPath = location.pathname + const previousPath = previousLocationRef.current.pathname + + // Check for tab navigation patterns + return ( + // Settings tab navigation + (currentPath.startsWith('/settings') && previousPath.startsWith('/settings')) || + // Nodes tab navigation + (currentPath.startsWith('/nodes') && previousPath.startsWith('/nodes')) + ) + } + + // Reset location ref without animation + const resetLocationRef = () => { + previousLocationRef.current = { + pathname: location.pathname, + search: location.search, + hash: location.hash, + key: location.key, + state: location.state, + } + } + + // Handle navigation effects + useEffect(() => { + // Skip on first render + if (isFirstRenderRef.current) { + isFirstRenderRef.current = false + return + } + + // Clear any existing timeouts + if (transitionTimeoutRef.current) { + window.clearTimeout(transitionTimeoutRef.current) + transitionTimeoutRef.current = null + } + if (shakeTimeoutRef.current) { + window.clearTimeout(shakeTimeoutRef.current) + shakeTimeoutRef.current = null + } + + // Skip animations on browser actions like refresh (POP) + if (navigationType === 'POP') { + setDisplayChildren(children) + resetLocationRef() + return + } + + // Check if we're navigating to the same location + const isSameLocationAttempt = isSameLocation() + + // Special case: Tab navigation - handle differently based on isContentTransition + if (isTabNavigation()) { + if (isContentTransition) { + // For content inside tabs + if (isSameLocationAttempt) { + // Same page navigation inside tabs - trigger shake for content + setIsShaking(true) + + // Reset shake after animation completes + shakeTimeoutRef.current = window.setTimeout(() => { + setIsShaking(false) + }, duration) + } else { + // Different tab - use transition + setIsPageTransitioning(true) + + transitionTimeoutRef.current = window.setTimeout(() => { + setDisplayChildren(children) + // Small delay before removing transition class to ensure smooth animation + requestAnimationFrame(() => { + requestAnimationFrame(() => { + setIsPageTransitioning(false) + }) + }) + resetLocationRef() + }, 100) // Shorter transition for better responsiveness + } + } else { + // For the main page wrapper, skip animations + setDisplayChildren(children) + resetLocationRef() + } + return + } + + // Special case: coming from login - no shake, just fade + if (isComingFromLogin()) { + // Just do a simple fade transition + setIsPageTransitioning(true) + + transitionTimeoutRef.current = window.setTimeout(() => { + setDisplayChildren(children) + // Small delay before removing transition class + requestAnimationFrame(() => { + requestAnimationFrame(() => { + setIsPageTransitioning(false) + }) + }) + resetLocationRef() + hasNavigatedRef.current = true + }, 100) + + return + } + + // Same path but different navigation attempt - trigger shake + if (isSameLocationAttempt) { + setIsShaking(true) + + // Reset shake after animation completes + shakeTimeoutRef.current = window.setTimeout(() => { + setIsShaking(false) + }, duration) + + return + } + + // Different location - fade transition + const isRealLocationChange = getPathWithHash() !== previousPathWithHash() + + if (isRealLocationChange) { + // Different page navigation - fade transition + setIsPageTransitioning(true) + + // Wait for fade-out, then update content + transitionTimeoutRef.current = window.setTimeout(() => { + setDisplayChildren(children) + // Small delay before removing transition class + requestAnimationFrame(() => { + requestAnimationFrame(() => { + setIsPageTransitioning(false) + }) + }) + resetLocationRef() + hasNavigatedRef.current = true + }, 100) + } else { + // Same location but different children - update without transition + setDisplayChildren(children) + resetLocationRef() + } + }, [location, navigationType, children, duration, isContentTransition]) + + return ( +
0 ? `${delay}ms` : undefined, + animationFillMode: isShaking ? 'both' : undefined, + transition: 'opacity 100ms cubic-bezier(0.4, 0, 0.2, 1), transform 100ms cubic-bezier(0.4, 0, 0.2, 1)', + }} + > + {displayChildren} +
+ ) +} diff --git a/dashboard/src/components/RouteGuard.tsx b/dashboard/src/components/RouteGuard.tsx new file mode 100644 index 000000000..8e1fc7541 --- /dev/null +++ b/dashboard/src/components/RouteGuard.tsx @@ -0,0 +1,53 @@ +import { useAdmin } from '@/hooks/use-admin' +import { useEffect } from 'react' +import { useLocation, useNavigate } from 'react-router' + +export default function RouteGuard({ children }: { children: React.ReactNode }) { + const { admin } = useAdmin() + const location = useLocation() + const navigate = useNavigate() + const is_sudo = admin?.is_sudo || false + + useEffect(() => { + if (!admin) return // Wait for admin data to load + + if (!is_sudo) { + const currentPath = location.pathname + + // Define allowed routes for non-sudo admins + const allowedRoutes = ['/', '/users', '/settings', '/settings/theme'] + const isAllowedRoute = allowedRoutes.some(route => currentPath === route || (route === '/settings' && currentPath.startsWith('/settings/theme'))) + + // If current route is allowed, don't redirect + if (isAllowedRoute) { + return + } + + // Define restricted routes for non-sudo admins + const restrictedRoutes = ['/statistics', '/hosts', '/groups', '/templates', '/admins', '/nodes'] + const isRestrictedRoute = restrictedRoutes.some(route => currentPath.startsWith(route)) + + if (isRestrictedRoute) { + navigate('/users', { replace: true }) + return + } + + // Handle settings routes + if (currentPath === '/settings') { + navigate('/settings/theme', { replace: true }) + return + } + + // Redirect from restricted settings pages + const restrictedSettingsRoutes = ['/settings/general', '/settings/notifications', '/settings/subscriptions', '/settings/telegram', '/settings/discord', '/settings/webhook', '/settings/cleanup'] + + if (restrictedSettingsRoutes.includes(currentPath)) { + // Redirecting non-sudo admin from restricted settings + navigate('/settings/theme', { replace: true }) + return + } + } + }, [admin, is_sudo, location.pathname, navigate]) + + return <>{children} +} diff --git a/dashboard/src/components/SinceLogsFilter.tsx b/dashboard/src/components/SinceLogsFilter.tsx new file mode 100644 index 000000000..d81e10984 --- /dev/null +++ b/dashboard/src/components/SinceLogsFilter.tsx @@ -0,0 +1,72 @@ +import { Clock } from "lucide-react"; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select"; +import { Switch } from "@/components/ui/switch"; +import { useTranslation } from "react-i18next"; +import useDirDetection from "@/hooks/use-dir-detection"; + +export type TimeFilter = "all" | "1m" | "5m" | "15m" | "30m" | "1h" | "2h" | "6h" | "12h" | "24h"; + +interface SinceLogsFilterProps { + value: TimeFilter; + onValueChange: (value: TimeFilter) => void; + showTimestamp: boolean; + onTimestampChange: (show: boolean) => void; +} + +export function SinceLogsFilter({ + value, + onValueChange, + showTimestamp, + onTimestampChange +}: SinceLogsFilterProps) { + const { t } = useTranslation(); + const dir = useDirDetection(); + + const TIME_FILTER_OPTIONS: { label: string; value: TimeFilter }[] = [ + { label: t('nodes.logs.timeFilters.all'), value: "all" }, + { label: t('nodes.logs.timeFilters.1m'), value: "1m" }, + { label: t('nodes.logs.timeFilters.5m'), value: "5m" }, + { label: t('nodes.logs.timeFilters.15m'), value: "15m" }, + { label: t('nodes.logs.timeFilters.30m'), value: "30m" }, + { label: t('nodes.logs.timeFilters.1h'), value: "1h" }, + { label: t('nodes.logs.timeFilters.2h'), value: "2h" } + ]; + + return ( +
+
+ {t('nodes.logs.sinceLabel')} + +
+
+ + {t('nodes.logs.timestamps')} + +
+
+ ); +} diff --git a/dashboard/src/components/Statistics.tsx b/dashboard/src/components/Statistics.tsx new file mode 100644 index 000000000..0f35ac50e --- /dev/null +++ b/dashboard/src/components/Statistics.tsx @@ -0,0 +1,74 @@ +import { Card } from '@/components/ui/card' +import { useGetSystemStats } from '@/service/api' +import { formatBytes, numberWithCommas } from '@/utils/formatByte' +import { BarChart, PieChart, User } from 'lucide-react' +import { FC, PropsWithChildren, ReactElement, ReactNode } from 'react' +import { useTranslation } from 'react-i18next' +import { Textarea } from './ui/textarea' + +const TotalUsersIcon = User +const NetworkIcon = BarChart +const MemoryIcon = PieChart + +type StatisticCardProps = { + title: string + content: ReactNode + icon: ReactElement +} + +const StatisticCard: FC> = ({ title, content, icon }) => { + return ( + +
+
+ {icon} +
+ +
+
{content}
+
+ ) +} + +export const StatisticsQueryKey = ['systemStats'] + +export const Statistics = () => { + const { t } = useTranslation() + const { data: systemData } = useGetSystemStats(undefined, { + query: { + refetchInterval: 5000 + } + }) + + return ( +
+ + {numberWithCommas(systemData.active_users)} + / {numberWithCommas(systemData.total_user)} +
+ ) + } + icon={} + /> + } /> + + {formatBytes(systemData?.mem_used ?? 0, 1, true)[0]} + + {formatBytes(systemData?.mem_used ?? 0, 1, true)[1]} / {formatBytes(systemData?.mem_total ?? 0, 1)} + +
+ ) + } + icon={} + /> +
+ ) +} diff --git a/dashboard/src/components/StatusBadge.tsx b/dashboard/src/components/StatusBadge.tsx new file mode 100644 index 000000000..efde429b5 --- /dev/null +++ b/dashboard/src/components/StatusBadge.tsx @@ -0,0 +1,75 @@ +import { Badge } from '@/components/ui/badge' +import { statusColors } from '@/constants/UserSettings' +import useDirDetection from '@/hooks/use-dir-detection' +import { cn } from '@/lib/utils' +import { UserStatus } from '@/service/api' +import { useRelativeExpiryDate } from '@/utils/dateFormatter' +import { FC } from 'react' +import { useTranslation } from 'react-i18next' + +type UserStatusProps = { + expiryDate?: string | number | null | undefined + status: UserStatus + showExpiry?: boolean + showOnlyExpiry?: boolean // Added prop to only show expiry date without badge +} + +export const StatusBadge: FC = ({ expiryDate = null, status: userStatus, showExpiry, showOnlyExpiry }) => { + const { t } = useTranslation() + const dir = useDirDetection() + const convertDateFormat = (expire: UserStatusProps['expiryDate']) => { + if (!expire) return null + // If it's already a number, return it + if (typeof expire === 'number') return expire + // If it's a string that's a number, convert it + if (typeof expire === 'string') { + const num = Number(expire) + if (!isNaN(num)) return num + } + // For date strings, convert to timestamp + const date = new Date(expire) + return Math.floor(date.getTime() / 1000) + } + const unixTime = convertDateFormat(expiryDate) + + const dateInfo = useRelativeExpiryDate(unixTime) + const StatusIcon = statusColors[userStatus]?.icon + + if (showOnlyExpiry) { + return ( +
+
+
+ + {t(dateInfo.status, { time: dateInfo.time })} + +
+
+
+ ) + } + + return ( +
+ +
+ {StatusIcon && } + +
+
+
+
+ + {t(dateInfo.status, { time: dateInfo.time })} + +
+
+
+ ) +} diff --git a/dashboard/src/components/StatusLogsFilter.tsx b/dashboard/src/components/StatusLogsFilter.tsx new file mode 100644 index 000000000..8d092c820 --- /dev/null +++ b/dashboard/src/components/StatusLogsFilter.tsx @@ -0,0 +1,168 @@ +import { CheckIcon } from "lucide-react"; +import type React from "react"; +import { Badge } from "@/components/ui/badge"; +import { Button } from "@/components/ui/button"; +import { + Command, + CommandGroup, + CommandItem, + CommandList, +} from "@/components/ui/command"; +import { + Popover, + PopoverContent, + PopoverTrigger, +} from "@/components/ui/popover"; +import { Separator } from "@/components/ui/separator"; +import { cn } from "@/lib/utils"; +import { useTranslation } from "react-i18next"; + +interface StatusLogsFilterProps { + value?: string[]; + setValue?: (value: string[]) => void; + title?: string; + options: { + label: string; + value: string; + icon?: React.ComponentType<{ className?: string }>; + }[]; +} + +export function StatusLogsFilter({ + value = [], + setValue, + title, + options, +}: StatusLogsFilterProps) { + const { t } = useTranslation(); + const selectedValues = new Set(value as string[]); + const allSelected = selectedValues.size === 0; + + const getSelectedBadges = () => { + if (allSelected) { + return ( + + {t('nodes.logs.all')} + + ); + } + + if (selectedValues.size >= 1) { + const selected = options.find((opt) => selectedValues.has(opt.value)); + return ( + <> + + {t(selected?.label || '')} + + {selectedValues.size > 1 && ( + + +{selectedValues.size - 1} + + )} + + ); + } + + return null; + }; + + return ( + + + + + + + + + { + setValue?.([]); // Empty array means "All" + }} + > +
+ +
+ {t('nodes.logs.all')} +
+ {options.map((option) => { + const isSelected = selectedValues.has(option.value); + return ( + { + const newValues = new Set(selectedValues); + if (isSelected) { + newValues.delete(option.value); + } else { + newValues.add(option.value); + } + setValue?.(Array.from(newValues)); + }} + > +
+ +
+ {option.icon && ( + + )} + + {t(option.label)} + +
+ ); + })} +
+
+
+
+
+ ); +} diff --git a/dashboard/src/components/TerminalLine.tsx b/dashboard/src/components/TerminalLine.tsx new file mode 100644 index 000000000..7797fa74d --- /dev/null +++ b/dashboard/src/components/TerminalLine.tsx @@ -0,0 +1,127 @@ +import { FancyAnsi } from "fancy-ansi"; +import { escapeRegExp } from "lodash"; +import { Badge } from "@/components/ui/badge"; +import { + Tooltip, + TooltipContent, + TooltipPortal, + TooltipProvider, + TooltipTrigger, +} from "@/components/ui/tooltip"; +import { cn } from "@/lib/utils"; +import { getLogType, type LogLine } from "@/utils/logsUtils"; +import { useTranslation } from "react-i18next"; + +interface LogLineProps { + log: LogLine; + noTimestamp?: boolean; + searchTerm?: string; +} + +const fancyAnsi = new FancyAnsi(); + +export function TerminalLine({ log, noTimestamp, searchTerm }: LogLineProps) { + const { timestamp, message, rawTimestamp } = log; + const { type, variant, color } = getLogType(message); + const { t, i18n } = useTranslation(); + const locale = i18n.language; + + const formattedTime = timestamp + ? timestamp.toLocaleTimeString([], { + hour: '2-digit', + minute: '2-digit', + second: '2-digit', + hour12: false + }) + : ""; + + const highlightMessage = (text: string, term: string) => { + if (!term) { + return ( + + ); + } + + const htmlContent = fancyAnsi.toHtml(text); + const searchRegex = new RegExp(`(${escapeRegExp(term)})`, "gi"); + + const modifiedContent = htmlContent.replace( + searchRegex, + (match) => + `${match}`, + ); + + return ( + + ); + }; + + const tooltip = (color: string, timestamp: string | null) => { + const square = ( +
+ ); + return timestamp ? ( + + + {square} + + +

+

{timestamp}
+

+
+
+
+
+ ) : ( + square + ); + }; + + return ( +
+
+ {/* Icon to expand the log item maybe implement a colapsible later */} + {/* */} + {tooltip(color, rawTimestamp)} + {!noTimestamp && ( + + {formattedTime} + + )} + + + {t(`nodes.logs.${type}`)} + +
+ + {highlightMessage(message, searchTerm || "")} + +
+ ); +} diff --git a/dashboard/src/components/TopLoadingBar.tsx b/dashboard/src/components/TopLoadingBar.tsx new file mode 100644 index 000000000..7142b35f3 --- /dev/null +++ b/dashboard/src/components/TopLoadingBar.tsx @@ -0,0 +1,234 @@ +import { useEffect, useRef, useCallback, useMemo, useState, memo } from 'react' +import { useLocation } from 'react-router' +import { useTheme } from '@/components/theme-provider' +import { useTopLoadingBar } from '@/hooks/use-top-loading-bar' +import LoadingBar from 'react-top-loading-bar' + +const shouldIgnoreRoute = (pathname: string): boolean => { + const IGNORED_ROUTE_PATTERNS = [ + /^\/settings\/(general|notifications|subscriptions|telegram|discord|webhook|cleanup|theme)$/, + /^\/nodes\/(cores|logs)$/, + /^\/settings\//, + /^\/nodes\//, + ] + + const shouldIgnore = IGNORED_ROUTE_PATTERNS.some(pattern => pattern.test(pathname)) + + if (process.env.NODE_ENV === 'development') { + } + + return shouldIgnore +} + +let lastLocation = '' + +declare global { + interface Window { + resetLoadingBarInitialState?: () => void + } +} + +interface TopLoadingBarProps { + height?: number + color?: string + shadow?: boolean + className?: string +} + +function TopLoadingBar({ + height = 3, + color, + shadow = true, + className = '', +}: TopLoadingBarProps) { + const ref = useRef(null) + const maxTimeoutRef = useRef() + const { resolvedTheme } = useTheme() + const { isLoading, progress } = useTopLoadingBar() + const location = useLocation() + + const [themeKey, setThemeKey] = useState(resolvedTheme) + const [colorThemeKey, setColorThemeKey] = useState(() => { + try { + return localStorage.getItem('color-theme') || 'default' + } catch { + return 'default' + } + }) + + useEffect(() => { + setThemeKey(resolvedTheme) + }, [resolvedTheme]) + + useEffect(() => { + const handleStorageChange = (e: StorageEvent) => { + if (e.key === 'color-theme') { + setColorThemeKey(e.newValue || 'default') + } + } + + window.addEventListener('storage', handleStorageChange) + + const checkColorTheme = () => { + try { + const current = localStorage.getItem('color-theme') || 'default' + if (current !== colorThemeKey) { + setColorThemeKey(current) + } + } catch { + // ignore + } + } + + const interval = setInterval(checkColorTheme, 100) + + return () => { + window.removeEventListener('storage', handleStorageChange) + clearInterval(interval) + } + }, [colorThemeKey]) + + const pathname = useMemo(() => location.pathname, [location.pathname]) + + const primaryColor = useMemo(() => { + if (color) return color + + const root = document.documentElement + const primaryColorValue = getComputedStyle(root).getPropertyValue('--primary').trim() + + if (primaryColorValue) { + const hslValues = primaryColorValue.split(' ').map(v => parseFloat(v)) + if (hslValues.length === 3) { + const [h, s, l] = hslValues + const hNorm = h / 360 + const sNorm = s / 100 + const lNorm = l / 100 + + const c = (1 - Math.abs(2 * lNorm - 1)) * sNorm + const x = c * (1 - Math.abs((hNorm * 6) % 2 - 1)) + const m = lNorm - c / 2 + + let r, g, b + if (hNorm < 1 / 6) { + [r, g, b] = [c, x, 0] + } else if (hNorm < 2 / 6) { + [r, g, b] = [x, c, 0] + } else if (hNorm < 3 / 6) { + [r, g, b] = [0, c, x] + } else if (hNorm < 4 / 6) { + [r, g, b] = [0, x, c] + } else if (hNorm < 5 / 6) { + [r, g, b] = [x, 0, c] + } else { + [r, g, b] = [c, 0, x] + } + + const rFinal = Math.round((r + m) * 255) + const gFinal = Math.round((g + m) * 255) + const bFinal = Math.round((b + m) * 255) + + return `rgb(${rFinal}, ${gFinal}, ${bFinal})` + } + } + + return resolvedTheme === 'dark' ? '#3b82f6' : '#2563eb' + }, [color, resolvedTheme, themeKey, colorThemeKey]) + + const handleLoadingStart = useCallback(() => { + if (isLoading && ref.current) { + ref.current.continuousStart() + } + }, [isLoading]) + + const handleLoadingComplete = useCallback(() => { + if (!isLoading && ref.current) { + ref.current.complete() + } + }, [isLoading]) + + const handleProgressUpdate = useCallback(() => { + if (progress !== undefined && ref.current) { + ref.current.complete(progress) + } + }, [progress]) + + useEffect(() => { + if (isLoading && ref.current) { + if (maxTimeoutRef.current) { + clearTimeout(maxTimeoutRef.current) + } + + maxTimeoutRef.current = setTimeout(() => { + if (ref.current) { + ref.current.complete() + } + maxTimeoutRef.current = undefined + }, 3000) + } else if (!isLoading && maxTimeoutRef.current) { + clearTimeout(maxTimeoutRef.current) + maxTimeoutRef.current = undefined + } + + return () => { + if (maxTimeoutRef.current) { + clearTimeout(maxTimeoutRef.current) + } + } + }, [isLoading]) + + useEffect(() => { + handleLoadingStart() + }, [handleLoadingStart]) + + useEffect(() => { + handleLoadingComplete() + }, [handleLoadingComplete]) + + useEffect(() => { + handleProgressUpdate() + }, [handleProgressUpdate]) + + useEffect(() => { + const currentPath = location.pathname + location.search + + if (currentPath !== lastLocation && lastLocation !== '') { + if ((window as any).resetLoadingBarInitialState) { + (window as any).resetLoadingBarInitialState() + } + } + + lastLocation = currentPath + + if (!shouldIgnoreRoute(pathname) && ref.current) { + ref.current.continuousStart() + } + }, [pathname, location.search]) + + useEffect(() => { + return () => { + if (maxTimeoutRef.current) { + clearTimeout(maxTimeoutRef.current) + } + } + }, []) + + const loadingBarProps = useMemo(() => ({ + ref, + color: primaryColor, + height, + shadow, + className: `${className} [direction:ltr]`, + waitingTime: 0, + transitionTime: 50, + }), [primaryColor, height, shadow, className]) + + return ( +
+ +
+ ) +} + +export { TopLoadingBar } + +export default memo(TopLoadingBar) diff --git a/dashboard/src/components/UsageSliderCompact.tsx b/dashboard/src/components/UsageSliderCompact.tsx new file mode 100644 index 000000000..fe3d9979c --- /dev/null +++ b/dashboard/src/components/UsageSliderCompact.tsx @@ -0,0 +1,34 @@ +import { statusColors } from '@/constants/UserSettings' +import { cn } from '@/lib/utils' +import { formatBytes } from '@/utils/formatByte' +import { useTranslation } from 'react-i18next' +import { Progress } from './ui/progress' + +type UsageSliderProps = { + used: number + total: number | null | undefined + totalUsedTraffic: number | undefined + status: string + isMobile?: boolean +} + +const UsageSliderCompact: React.FC = ({ used, total = 0, status, totalUsedTraffic, isMobile }) => { + const isUnlimited = total === 0 || total === null + const progressValue = isUnlimited ? 100 : (used / total) * 100 + const color = statusColors[status]?.sliderColor + const { t } = useTranslation() + return ( +
+ +
+ + {formatBytes(used)} / {isUnlimited ? : formatBytes(total)} + +
+ {t('usersTable.total')}: {formatBytes(totalUsedTraffic || 0)} +
+
+
+ ) +} +export default UsageSliderCompact diff --git a/dashboard/src/components/UsersStatistics.tsx b/dashboard/src/components/UsersStatistics.tsx new file mode 100644 index 000000000..d9f0e6f51 --- /dev/null +++ b/dashboard/src/components/UsersStatistics.tsx @@ -0,0 +1,134 @@ +import useDirDetection from '@/hooks/use-dir-detection' +import { cn } from '@/lib/utils' +import { useGetSystemStats } from '@/service/api' +import { numberWithCommas } from '@/utils/formatByte' +import { Users, Wifi } from 'lucide-react' +import { useEffect, useState } from 'react' +import { useTranslation } from 'react-i18next' +import { Card, CardTitle } from './ui/card' + +const CountUp = ({ end, duration = 1500 }: { end: number; duration?: number }) => { + const [count, setCount] = useState(0) + + useEffect(() => { + if (!end) return + + let startTimestamp: number | null = null + const startValue = count + const step = (timestamp: number) => { + if (!startTimestamp) startTimestamp = timestamp + const progress = Math.min((timestamp - startTimestamp) / duration, 1) + // Using easeOutQuad for a softer animation + const eased = progress < 0.5 ? 2 * progress * progress : 1 - Math.pow(-2 * progress + 2, 2) / 2 + const currentCount = Math.floor(eased * (end - startValue) + startValue) + + setCount(currentCount) + + if (progress < 1) { + window.requestAnimationFrame(step) + } else { + setCount(end) + } + } + + window.requestAnimationFrame(step) + }, [end, duration]) + + return <>{numberWithCommas(count)} +} + +const UsersStatistics = () => { + const { t } = useTranslation() + const dir = useDirDetection() + const [prevData, setPrevData] = useState(null) + const [isIncreased, setIsIncreased] = useState>({}) + + const { data } = useGetSystemStats(undefined, { + query: { + refetchInterval: 5000, + }, + }) + + useEffect(() => { + if (prevData && data) { + setIsIncreased({ + online_users: data.online_users > prevData.online_users, + active_users: data.active_users > prevData.active_users, + total_user: data.total_user > prevData.total_user, + }) + } + setPrevData(data) + }, [data]) + + return ( +
+
+ {/* Online Users */} +
+ +
+ +
+
+ {t('statistics.onlineUsers')} +
+ + {data ? : 0} + + + +
+ +
+ +
+ +
+ + {t('statistics.activeUsers')} +
+ + {data ? : 0} + +
+ +
+ +
+ +
+ +
+ + {t('statistics.users')} +
+ + {data ? : 0} + +
+ +
+
+
+ ) +} + +export default UsersStatistics diff --git a/dashboard/src/components/admins/AdminsTable.tsx b/dashboard/src/components/admins/AdminsTable.tsx new file mode 100644 index 000000000..0edabd6cf --- /dev/null +++ b/dashboard/src/components/admins/AdminsTable.tsx @@ -0,0 +1,281 @@ +import { useTranslation } from 'react-i18next' +import type { AdminDetails } from '@/service/api' +import { useGetAdmins } from '@/service/api' +import { DataTable } from './data-table' +import { setupColumns } from './columns' +import { Filters } from './filters' +import { useEffect, useState } from 'react' +import { PaginationControls } from './filters.tsx' +import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle } from '@/components/ui/alert-dialog' +import { cn } from '@/lib/utils' +import useDirDetection from '@/hooks/use-dir-detection' +import { Checkbox } from '@/components/ui/checkbox.tsx' + +interface AdminFilters { + sort: string + username?: string | null + limit: number + offset: number +} + +interface AdminsTableProps { + data: AdminDetails[] + onEdit: (admin: AdminDetails) => void + onDelete: (admin: AdminDetails) => void + onToggleStatus: (admin: AdminDetails, checked: boolean) => void + onResetUsage: (adminUsername: string) => void +} + +const DeleteAlertDialog = ({ admin, isOpen, onClose, onConfirm }: { admin: AdminDetails; isOpen: boolean; onClose: () => void; onConfirm: () => void }) => { + const { t } = useTranslation() + const dir = useDirDetection() + + return ( + + + + {t('admins.deleteAdmin')} + + + + + + {t('cancel')} + + {t('delete')} + + + + + ) +} + +const ToggleAdminStatusModal = ({ admin, isOpen, onClose, onConfirm }: { admin: AdminDetails; isOpen: boolean; onClose: () => void; onConfirm: (clicked: boolean) => void }) => { + const { t } = useTranslation() + const dir = useDirDetection() + const [adminUsersToggle, setAdminUsersToggle] = useState(false) + + useEffect(() => { + if (!isOpen) { + setAdminUsersToggle(false) + } + }, [isOpen]) + + return ( + + + + {t(admin.is_disabled ? 'admin.enable' : 'admin.disable')} + + setAdminUsersToggle(!adminUsersToggle)} /> + + + + + {t('cancel')} + onConfirm(adminUsersToggle)}>{t('confirm')} + + + + ) +} + +const ResetUsersUsageConfirmationDialog = ({ adminUsername, isOpen, onClose, onConfirm }: { adminUsername: string; isOpen: boolean; onClose: () => void; onConfirm: () => void }) => { + const { t } = useTranslation() + const dir = useDirDetection() + + return ( + + + + {t('admins.resetUsersUsage')} + + + + + + {t('cancel')} + {t('confirm')} + + + + ) +} + +export default function AdminsTable({ onEdit, onDelete, onToggleStatus, onResetUsage }: AdminsTableProps) { + const { t } = useTranslation() + const [currentPage, setCurrentPage] = useState(0) + const [itemsPerPage, setItemsPerPage] = useState(10) + const [isChangingPage, setIsChangingPage] = useState(false) + const [filters, setFilters] = useState({ + sort: '-created_at', + limit: itemsPerPage, + offset: 0, + username: null, + }) + const [deleteDialogOpen, setDeleteDialogOpen] = useState(false) + const [statusToggleDialogOpen, setStatusToggleDialogOpen] = useState(false) + const [resetUsersUsageDialogOpen, setResetUsersUsageDialogOpen] = useState(false) + const [adminToDelete, setAdminToDelete] = useState(null) + const [adminToToggleStatus, setAdminToToggleStatus] = useState(null) + const [adminToReset, setAdminToReset] = useState(null) + + const { data : totalAdmins} = useGetAdmins() + const { data: adminsData, refetch, isLoading, isFetching } = useGetAdmins(filters) + + // Update filters when pagination changes + useEffect(() => { + setFilters(prev => ({ + ...prev, + limit: itemsPerPage, + offset: currentPage * itemsPerPage, + })) + }, [currentPage, itemsPerPage]) + + // When filters change (e.g., search), reset page if needed + const handleFilterChange = (newFilters: Partial) => { + setFilters(prev => { + const resetPage = newFilters.username !== undefined && newFilters.username !== prev.username + return { + ...prev, + ...newFilters, + offset: resetPage ? 0 : (newFilters.offset !== undefined ? newFilters.offset : prev.offset), + } + }) + // Reset page if search changes + if (newFilters.username !== undefined) { + setCurrentPage(0) + } + } + + const handleDeleteClick = (admin: AdminDetails) => { + setAdminToDelete(admin) + setDeleteDialogOpen(true) + } + + const handleStatusToggleClick = (admin: AdminDetails) => { + setAdminToToggleStatus(admin) + setStatusToggleDialogOpen(true) + } + + const handleResetUsersUsageClick = (adminUsername: string) => { + setAdminToReset(adminUsername) + setResetUsersUsageDialogOpen(true) + } + const handleConfirmResetUsersUsage = async () => { + if (adminToReset) { + onResetUsage(adminToReset) + setResetUsersUsageDialogOpen(false) + setAdminToReset(null) + } + } + const handleConfirmDelete = async () => { + if (adminToDelete) { + onDelete(adminToDelete) + setDeleteDialogOpen(false) + setAdminToDelete(null) + } + } + + const handleConfirmStatusToggle = async (clicked: boolean) => { + if (adminToToggleStatus) { + onToggleStatus(adminToToggleStatus, clicked) + setStatusToggleDialogOpen(false) + setAdminToToggleStatus(null) + } + } + + const handlePageChange = async (newPage: number) => { + if (newPage === currentPage || isChangingPage) return + + setIsChangingPage(true) + setCurrentPage(newPage) + + try { + // Immediate refetch without delay + await refetch() + } finally { + // Minimal delay for instant response + setTimeout(() => { + setIsChangingPage(false) + }, 50) + } + } + + const handleItemsPerPageChange = async (value: number) => { + setIsChangingPage(true) + setItemsPerPage(value) + setCurrentPage(0) // Reset to first page when items per page changes + + try { + // Immediate refetch without delay + await refetch() + } finally { + // Minimal delay for instant response + setTimeout(() => { + setIsChangingPage(false) + }, 50) + } + } + + const handleSort = (column: string) => { + let newSort: string + if (filters.sort === column) { + newSort = '-' + column + } else if (filters.sort === '-' + column) { + newSort = '-username' + } else { + newSort = column + } + setFilters(prev => ({ ...prev, sort: newSort })) + } + + const columns = setupColumns({ + t, + handleSort, + filters, + onEdit, + onDelete: handleDeleteClick, + toggleStatus: handleStatusToggleClick, + onResetUsage: handleResetUsersUsageClick, + }) + + + return ( +
+ + + + {adminToDelete && setDeleteDialogOpen(false)} onConfirm={handleConfirmDelete} />} + {adminToToggleStatus && ( + setStatusToggleDialogOpen(false)} onConfirm={handleConfirmStatusToggle} /> + )} + {adminToReset && ( + setResetUsersUsageDialogOpen(false)} + /> + )} +
+ ) +} diff --git a/dashboard/src/components/admins/columns.tsx b/dashboard/src/components/admins/columns.tsx new file mode 100644 index 000000000..110f736ab --- /dev/null +++ b/dashboard/src/components/admins/columns.tsx @@ -0,0 +1,174 @@ +import { AdminDetails } from '@/service/api' +import { ColumnDef } from '@tanstack/react-table' +import { ChartPie, ChevronDown, MoreVertical, Pen, Power, PowerOff, RefreshCw, Trash2, User } from 'lucide-react' +import { Button } from '@/components/ui/button' +import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger } from '@/components/ui/dropdown-menu.tsx' +import { formatBytes } from '@/utils/formatByte.ts' +import { AdminStatusBadge } from '@/components/AdminStatusBadge' + +interface ColumnSetupProps { + t: (key: string) => string + handleSort: (column: string) => void + filters: { sort: string } + onEdit: (admin: AdminDetails) => void + onDelete: (admin: AdminDetails) => void + toggleStatus: (admin: AdminDetails) => void + onResetUsage: (adminUsername: string) => void +} + +const createSortButton = ( + column: string, + label: string, + t: (key: string) => string, + handleSort: (column: string) => void, + filters: { + sort: string + }, +) => ( + +) + +export const setupColumns = ({ t, handleSort, filters, onEdit, onDelete, toggleStatus, onResetUsage }: ColumnSetupProps): ColumnDef[] => [ + { + accessorKey: 'username', + header: () => createSortButton('username', 'username', t, handleSort, filters), + cell: ({ row }) => ( +
+
+
+ {row.original.is_disabled ? ( +
+ ) : ( +
+ )} +
+
+ {row.getValue('username')} +
+
+
+ ), + }, + { + accessorKey: 'used_traffic', + header: () => createSortButton('used_traffic', 'admins.used.traffic', t, handleSort, filters), + cell: ({ row }) => { + const traffic = row.getValue('used_traffic') as number | null + return ( +
+ + {traffic ? formatBytes(traffic) : '0 B'} +
+ ) + }, + }, + { + accessorKey: 'lifetime_used_traffic', + header: () => createSortButton('lifetime_used_traffic', 'admins.lifetime.used.traffic', t, handleSort, filters), + cell: ({ row }) => { + const total = row.getValue('lifetime_used_traffic') as number | null + return ( +
+ {formatBytes(total || 0)} +
+ ) + }, + }, + { + accessorKey: 'is_sudo', + header: () =>
{t('admins.role')}
, + cell: ({ row }) => { + const isSudo = row.getValue('is_sudo') + const isDisabled = row.original.is_disabled + return ( +
+ +
+ ) + }, + }, + { + accessorKey: 'total_users', + header: () => createSortButton('total_users', 'admins.total.users', t, handleSort, filters), + cell: ({ row }) => ( +
+ + {row.getValue('total_users') || 0} +
+ ), + }, + { + id: 'actions', + cell: ({ row }) => ( +
+ + + + + + { + e.preventDefault() + e.stopPropagation() + onEdit(row.original) + }} + > + + {t('edit')} + + + { + e.preventDefault() + e.stopPropagation() + toggleStatus(row.original) + }} + > + {row.original.is_disabled ? : } + {row.original.is_disabled ? t('enable') : t('disable')} + + { + e.preventDefault() + e.stopPropagation() + onResetUsage(row.original.username) + }} + > + + {t('admins.reset')} + + { + e.preventDefault() + e.stopPropagation() + onDelete(row.original) + }} + > + + {t('delete')} + + + +
+ ), + }, + { + id: 'chevron', + cell: () =>
, + }, +] diff --git a/dashboard/src/components/admins/data-table.tsx b/dashboard/src/components/admins/data-table.tsx new file mode 100644 index 000000000..9524aff01 --- /dev/null +++ b/dashboard/src/components/admins/data-table.tsx @@ -0,0 +1,211 @@ +import { ColumnDef, flexRender, getCoreRowModel, useReactTable } from '@tanstack/react-table' +import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table' +import { cn } from '@/lib/utils' +import useDirDetection from '@/hooks/use-dir-detection' +import React, { useState, useMemo, useEffect, memo, useCallback } from 'react' +import { ChevronDown, Edit2, Power, PowerOff, RefreshCw, Trash2, User, UserRound, LoaderCircle } from 'lucide-react' +import { Button } from '@/components/ui/button' +import { AdminDetails } from '@/service/api' +import { useTranslation } from 'react-i18next' +import { Badge } from '@/components/ui/badge' +import { statusColors } from '@/constants/UserSettings' +import { useIsMobile } from '@/hooks/use-mobile' + +interface DataTableProps { + columns: ColumnDef[] + data: TData[] + onEdit: (admin: AdminDetails) => void + onDelete: (admin: AdminDetails) => void + onToggleStatus: (admin: AdminDetails) => void + setStatusToggleDialogOpen: (isOpen: boolean) => void + onResetUsage: (adminUsername: string) => void + isLoading?: boolean + isFetching?: boolean +} + +const ExpandedRowContent = memo(({ + row, + onEdit, + onDelete, + onToggleStatus, + onResetUsage, +}: { + row: AdminDetails + onEdit: (admin: AdminDetails) => void + onDelete: (admin: AdminDetails) => void + onToggleStatus: (admin: AdminDetails) => void + onResetUsage: (adminUsername: string) => void +}) => { + const { t } = useTranslation() + const isMobile = useIsMobile() + const isSudo = row.is_sudo + + return ( +
+
+
+ +
{isMobile ? : {isSudo ? t(`sudo`) : t('admin')}}
+
+
+ | +
+ + {row.total_users ? row.total_users : 0} +
+
+
+ + + + +
+
+ ) +}) + +export function DataTable({ columns, data, onEdit, onDelete, onToggleStatus, onResetUsage, isLoading = false, isFetching = false }: DataTableProps) { + const [expandedRow, setExpandedRow] = useState(null) + const { t } = useTranslation() + const table = useReactTable({ + data, + columns, + getCoreRowModel: getCoreRowModel(), + }) + const dir = useDirDetection() + const isRTL = dir === 'rtl' + const isLoadingData = isLoading || isFetching + + const LoadingState = useMemo(() => ( + + +
+ + {t('loading')} +
+
+
+ ), [columns.length, dir, t]) + + const EmptyState = useMemo(() => ( + + + {t('noResults')} + + + ), [columns.length, t]) + + const handleRowToggle = useCallback((rowId: string) => { + setExpandedRow(expandedRow === rowId ? null : rowId) + }, [expandedRow]) + + const handleEditModal = useCallback((cellId: string, rowData: AdminDetails) => { + const isChevron = cellId === 'chevron' + const isSmallScreen = window.innerWidth < 768 + if (!isSmallScreen && !isChevron) { + onEdit(rowData) + } + }, [onEdit]) + + return ( +
+ + + {table.getHeaderGroups().map(headerGroup => ( + + {headerGroup.headers.map((header, index) => ( + = 3 && 'hidden md:table-cell', + header.id === 'chevron' && 'table-cell md:hidden', + )} + > + {header.isPlaceholder ? null : flexRender(header.column.columnDef.header, header.getContext())} + + ))} + + ))} + + + {isLoadingData ? LoadingState : table.getRowModel().rows?.length ? ( + table.getRowModel().rows.map((row) => ( + + window.innerWidth < 768 && handleRowToggle(row.id)} + data-state={row.getIsSelected() && 'selected'} + > + {row.getVisibleCells().map((cell, index) => ( + { + const target = e.target as HTMLElement + if (target.closest('button') || target.closest('[role="menuitem"]')) return + handleEditModal(cell.column.id, row.original) + }} + className={cn( + 'py-4 text-sm', + index === 5 && 'hidden md:w-[85px]', + index >= 3 && 'hidden md:table-cell', + cell.column.id === 'chevron' && 'table-cell md:hidden', + dir === 'rtl' ? 'pl-3' : 'pr-3', + )} + > + {cell.column.id === 'chevron' ? ( +
handleRowToggle(row.id)}> + +
+ ) : ( + flexRender(cell.column.columnDef.cell, cell.getContext()) + )} +
+ ))} +
+ {expandedRow === row.id && ( + + + + + + )} +
+ )) + ) : EmptyState} +
+
+
+ ) +} diff --git a/dashboard/src/components/admins/filters.tsx b/dashboard/src/components/admins/filters.tsx new file mode 100644 index 000000000..f776e10fb --- /dev/null +++ b/dashboard/src/components/admins/filters.tsx @@ -0,0 +1,207 @@ +import { Button } from '@/components/ui/button' +import { Input } from '@/components/ui/input' +import { Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious } from '@/components/ui/pagination' +import { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select' +import useDirDetection from '@/hooks/use-dir-detection' +import { cn } from '@/lib/utils' +import { debounce } from 'es-toolkit' +import { RefreshCw, SearchIcon, X } from 'lucide-react' +import { useCallback, useState } from 'react' +import { useTranslation } from 'react-i18next' +import { useGetAdmins } from '@/service/api' +import { LoaderCircle } from 'lucide-react' + +interface BaseFilters { + sort: string + username?: string | null + limit?: number + offset?: number +} + +interface FiltersProps { + filters: T + onFilterChange: (filters: Partial) => void + onRefresh?: () => void + totalItems?: number +} + +export function Filters({ filters, onFilterChange }: FiltersProps) { + const { t } = useTranslation() + const dir = useDirDetection() + const { refetch } = useGetAdmins(filters) + const [search, setSearch] = useState(filters.username || '') + + // Debounced search function + const setSearchField = useCallback( + debounce((value: string) => { + onFilterChange({ + username: value ? value : null, + offset: 0, // Reset to first page when search is updated + } as Partial) + }, 50), + [onFilterChange], + ) + + // Handle input change + const handleSearchChange = (e: React.ChangeEvent) => { + setSearch(e.target.value) + setSearchField(e.target.value) + } + + // Clear search field + const clearSearch = () => { + setSearch('') + onFilterChange({ + username: null, + offset: 0, + } as Partial) + } + + return ( +
+ {/* Search Input */} +
+ + + {search && ( + + )} +
+ {/* Refresh Button */} +
+ +
+
+ ) +} + +// Add props interface for PaginationControls +interface PaginationControlsProps { + currentPage: number + totalPages: number + itemsPerPage: number + totalItems: number + isLoading: boolean + onPageChange: (page: number) => Promise + onItemsPerPageChange: (value: number) => Promise +} + +// Update PaginationControls to use props +export const PaginationControls = ({ currentPage, totalPages, itemsPerPage, isLoading, onPageChange, onItemsPerPageChange }: PaginationControlsProps) => { + const { t } = useTranslation() + const dir = useDirDetection() + + const getPaginationRange = (currentPage: number, totalPages: number) => { + const delta = 2 // Number of pages to show on each side of current page + const range = [] + + // Handle small number of pages + if (totalPages <= 5) { + for (let i = 0; i < totalPages; i++) { + range.push(i) + } + return range + } + + // Always include first and last page + range.push(0) + + // Calculate start and end of range + let start = Math.max(1, currentPage - delta) + let end = Math.min(totalPages - 2, currentPage + delta) + + // Adjust range if current page is near start or end + if (currentPage - delta <= 1) { + end = Math.min(totalPages - 2, start + 2 * delta) + } + if (currentPage + delta >= totalPages - 2) { + start = Math.max(1, totalPages - 3 - 2 * delta) + } + + // Add ellipsis if needed + if (start > 1) { + range.push(-1) // -1 represents ellipsis + } + + // Add pages in range + for (let i = start; i <= end; i++) { + range.push(i) + } + + // Add ellipsis if needed + if (end < totalPages - 2) { + range.push(-1) // -1 represents ellipsis + } + + // Add last page + if (totalPages > 1) { + range.push(totalPages - 1) + } + + return range + } + + const paginationRange = getPaginationRange(currentPage, totalPages) + + return ( +
+
+ + {t('itemsPerPage')} +
+ + + + + onPageChange(currentPage - 1)} disabled={currentPage === 0 || isLoading} /> + + {paginationRange.map((pageNumber, i) => + pageNumber === -1 ? ( + + + + ) : ( + + onPageChange(pageNumber as number)} + disabled={isLoading} + className={isLoading && currentPage === pageNumber ? 'opacity-70' : ''} + > + {isLoading && currentPage === pageNumber ? ( +
+ + {(pageNumber as number) + 1} +
+ ) : ( + (pageNumber as number) + 1 + )} +
+
+ ), + )} + + onPageChange(currentPage + 1)} disabled={currentPage === totalPages - 1 || totalPages === 0 || isLoading} /> + +
+
+
+ ) +} \ No newline at end of file diff --git a/dashboard/src/components/bulk/SelectorPanel.tsx b/dashboard/src/components/bulk/SelectorPanel.tsx new file mode 100644 index 000000000..356d41bd1 --- /dev/null +++ b/dashboard/src/components/bulk/SelectorPanel.tsx @@ -0,0 +1,169 @@ +import { Button } from "@/components/ui/button" +import { Input } from "@/components/ui/input" +import { Badge } from "@/components/ui/badge" +import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" +import type { TFunction } from "i18next" +import { Search } from "lucide-react" +import type { LucideIcon } from "lucide-react" +import { cn } from "@/lib/utils" + +// Types for selector items +interface GroupResponse { + id: number + name: string +} +interface UserResponse { + id: number + username: string +} +interface AdminDetails { + id: number + username: string +} + +type SelectorItem = GroupResponse | UserResponse | AdminDetails + +type SelectorPanelProps = { + icon: LucideIcon + title: string + items: SelectorItem[] + selected: number[] + setSelected: (ids: number[]) => void + search: string + setSearch: (s: string) => void + searchPlaceholder: string + selectAllLabel: string + deselectAllLabel: string + itemLabelKey: "name" | "username" + itemValueKey: "id" + searchKey: "name" | "username" + t: TFunction +} + +export function SelectorPanel({ + icon: Icon, + title, + items, + selected, + setSelected, + search, + setSearch, + searchPlaceholder, + selectAllLabel, + deselectAllLabel, + itemLabelKey, + itemValueKey, + searchKey, + t, +}: SelectorPanelProps) { + const handleSelectAll = () => + setSelected( + items + .map((item) => (typeof item[itemValueKey] === "number" ? (item[itemValueKey] as number) : -1)) + .filter((id) => id !== -1), + ) + const handleDeselectAll = () => setSelected([]) + const filteredItems = items.filter((item) => { + const value = + searchKey === "name" && "name" in item && typeof item.name === "string" + ? item.name + : searchKey === "username" && "username" in item && typeof item.username === "string" + ? item.username + : "" + return value.toLowerCase().includes(search.toLowerCase()) + }) + + const handleItemToggle = (id: number) => { + if (selected.includes(id)) { + setSelected(selected.filter((selectedId) => selectedId !== id)) + } else { + setSelected([...selected, id]) + } + } + + return ( + + {/* Header */} + +
+ + + {title} + +
+
+ + {t("selectedCount", { count: selected.length, defaultValue: "{{count}} selected" })} + +
+ + +
+
+
+ + + {/* Search */} +
+ + setSearch(e.target.value)} + className="pl-8 sm:pl-9 h-8 sm:h-9 bg-background text-xs sm:text-sm" + /> +
+ + {/* Items List */} +
+ {filteredItems.map((item) => { + const id = typeof item[itemValueKey] === "number" ? (item[itemValueKey] as number) : undefined + let label = "" + if (itemLabelKey === "name" && "name" in item && typeof item.name === "string") label = item.name + if (itemLabelKey === "username" && "username" in item && typeof item.username === "string") + label = item.username + if (id === undefined) return null + + const isSelected = selected.includes(id) + + return ( +
handleItemToggle(id)} + className={cn( + "flex items-center gap-2 sm:gap-3 px-2 sm:px-3 py-1.5 sm:py-2 rounded-md cursor-pointer transition-colors hover:bg-accent", + isSelected && "bg-accent border border-primary", + )} + > +
+
+ {isSelected && ( +
+ )} +
+
+ {label} +
+ ) + })} + {filteredItems.length === 0 && ( +
+ {t("noResults", { defaultValue: "No results found." })} +
+ )} +
+ + + ) +} diff --git a/dashboard/src/components/charts/AllNodesStackedBarChart.tsx b/dashboard/src/components/charts/AllNodesStackedBarChart.tsx new file mode 100644 index 000000000..431ba0e31 --- /dev/null +++ b/dashboard/src/components/charts/AllNodesStackedBarChart.tsx @@ -0,0 +1,563 @@ +import { useEffect, useState, useMemo, useCallback } from 'react' +import { Bar, BarChart, CartesianGrid, XAxis, YAxis } from 'recharts' +import { DateRange } from 'react-day-picker' +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card' +import { type ChartConfig, ChartContainer, ChartTooltip } from '@/components/ui/chart' +import { useTranslation } from 'react-i18next' +import useDirDetection from '@/hooks/use-dir-detection' +import { getUsage, Period, type NodeUsageStat } from '@/service/api' +import { formatBytes } from '@/utils/formatByte' +import { Skeleton } from '@/components/ui/skeleton' +import { TimeRangeSelector } from '@/components/common/TimeRangeSelector' +import { EmptyState } from './EmptyState' +import { TrendingUp, Upload, Download, Calendar } from 'lucide-react' +import { dateUtils } from '@/utils/dateFormatter' +import { TooltipProps } from 'recharts' +import { useGetNodes, NodeResponse } from '@/service/api' +import { useTheme } from '@/components/theme-provider' +import TimeSelector from './TimeSelector' + + +// Helper function to determine period (copied from CostumeBarChart) +const getPeriodFromDateRange = (range?: DateRange): Period => { + if (!range?.from || !range?.to) { + return Period.hour // Default to hour if no range + } + const diffTime = Math.abs(range.to.getTime() - range.from.getTime()) + const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)) + if (diffDays <= 2) { + return Period.hour + } + return Period.day +} + +function CustomTooltip({ active, payload, chartConfig, dir, period }: TooltipProps & { chartConfig?: ChartConfig, dir: string, period?: string }) { + const { t, i18n } = useTranslation() + if (!active || !payload || !payload.length) return null + + const data = payload[0].payload + const d = dateUtils.toDayjs(data._period_start) + + // Check if this is today's data + const today = dateUtils.toDayjs(new Date()) + const isToday = d.isSame(today, 'day') + + let formattedDate + if (i18n.language === 'fa') { + // Use Persian (Jalali) calendar and Persian locale + try { + // If you have dayjs with jalali plugin, use it: + // formattedDate = d.locale('fa').format('YYYY/MM/DD HH:mm') + // Otherwise, fallback to toLocaleString + if (period === 'day' && isToday) { + formattedDate = new Date().toLocaleString('fa-IR', { + year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', hour12: false + }).replace(',', '') + } else if (period === 'day') { + const localDate = new Date(d.year(), d.month(), d.date(), 0, 0, 0) + formattedDate = localDate.toLocaleString('fa-IR', { + year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', hour12: false + }).replace(',', '') + } else { + // hourly or other: use actual time from data + formattedDate = d.toDate().toLocaleString('fa-IR', { + year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', hour12: false + }).replace(',', '') + } + } catch { + formattedDate = d.format('YYYY/MM/DD HH:mm') + } + } else { + if (period === 'day' && isToday) { + const now = new Date() + formattedDate = now.toLocaleString('en-US', { + year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', hour12: false + }).replace(',', '') + } else if (period === 'day') { + const localDate = new Date(d.year(), d.month(), d.date(), 0, 0, 0) + formattedDate = localDate.toLocaleString('en-US', { + year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', hour12: false + }).replace(',', '') + } else { + // hourly or other: use actual time from data + formattedDate = d.toDate().toLocaleString('en-US', { + year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', hour12: false + }).replace(',', '') + } + } + + // Get node color from chart config + const getNodeColor = (nodeName: string) => { + return chartConfig?.[nodeName]?.color || 'hsl(var(--chart-1))' + } + + const isRTL = dir === 'rtl' + + return ( +
+
+ {formattedDate} +
+
+ {t('statistics.totalUsage', { defaultValue: 'Total' })}: + + {Object.keys(data).reduce((sum, key) => { + if (key.startsWith('_uplink_') || key.startsWith('_downlink_') || key === 'time' || key === '_period_start') return sum + return sum + (data[key] || 0) + }, 0).toFixed(2)} GB + +
+
!key.startsWith('_') && key !== 'time' && key !== '_period_start').length > 6 ? 'grid-cols-2' : 'grid-cols-1'}`}> + {Object.keys(data).map(key => { + if (key.startsWith('_uplink_') || key.startsWith('_downlink_') || key === 'time' || key === '_period_start') return null + const nodeName = key + const uplinkKey = `_uplink_${nodeName}` + const downlinkKey = `_downlink_${nodeName}` + const usage = data[key] || 0 + if (usage === 0) return null + return ( +
+ +
+ {nodeName} + + + + {formatBytes(data[uplinkKey] || 0)} + | + + {formatBytes(data[downlinkKey] || 0)} + +
+ ) + })} +
+
+ ) +} + +export function AllNodesStackedBarChart() { + const [dateRange, setDateRange] = useState(undefined) + const [selectedTime, setSelectedTime] = useState('1w') + const [showCustomRange, setShowCustomRange] = useState(false) + const [chartData, setChartData] = useState(null) + const [isLoading, setIsLoading] = useState(false) + const [error, setError] = useState(null) + const [totalUsage, setTotalUsage] = useState('0') + + const { t } = useTranslation() + const dir = useDirDetection() + const { data: nodesData } = useGetNodes(undefined, { query: { enabled: true } }) + const { resolvedTheme } = useTheme() + + // Build color palette for nodes + const nodeList: NodeResponse[] = useMemo(() => (Array.isArray(nodesData) ? nodesData : []), [nodesData]) + + + // Function to generate distinct colors based on theme + const generateDistinctColor = useCallback((index: number, _totalNodes: number, isDark: boolean): string => { + // Define a more distinct color palette with better contrast + const distinctHues = [ + 0, // Red + 30, // Orange + 60, // Yellow + 120, // Green + 180, // Cyan + 210, // Blue + 240, // Indigo + 270, // Purple + 300, // Magenta + 330, // Pink + 15, // Red-orange + 45, // Yellow-orange + 75, // Yellow-green + 150, // Green-cyan + 200, // Cyan-blue + 225, // Blue-indigo + 255, // Indigo-purple + 285, // Purple-magenta + 315, // Magenta-pink + 345, // Pink-red + ] + + const hue = distinctHues[index % distinctHues.length] + + // Create more distinct saturation and lightness values + const saturationVariations = [65, 75, 85, 70, 80, 60, 90, 55, 95, 50] + const lightnessVariations = isDark ? [45, 55, 35, 50, 40, 60, 30, 65, 25, 70] : [40, 50, 30, 45, 35, 55, 25, 60, 20, 65] + + const saturation = saturationVariations[index % saturationVariations.length] + const lightness = lightnessVariations[index % lightnessVariations.length] + + return `hsl(${hue}, ${saturation}%, ${lightness}%)` + }, []) + + // Build chart config dynamically based on nodes + const chartConfig = useMemo(() => { + const config: ChartConfig = {} + const isDark = resolvedTheme === 'dark' + nodeList.forEach((node, idx) => { + let color + if (idx === 0) { + // First node uses primary color like CostumeBarChart + color = 'hsl(var(--primary))' + } else if (idx < 5) { + // Use palette colors for nodes 2-5: --chart-2, --chart-3, ... + color = `hsl(var(--chart-${idx + 1}))` + } else { + // Generate distinct colors for nodes beyond palette + color = generateDistinctColor(idx, nodeList.length, isDark) + } + config[node.name] = { + label: node.name, + color: color, + } + }) + return config + }, [nodeList, resolvedTheme, generateDistinctColor]) + + useEffect(() => { + let isCancelled = false + let timeoutId: NodeJS.Timeout + + const fetchUsageData = async () => { + if (!dateRange?.from || !dateRange?.to) { + setChartData(null) + setTotalUsage('0') + return + } + setIsLoading(true) + setError(null) + try { + const startDate = dateRange.from + const endDate = dateRange.to + const period = getPeriodFromDateRange(dateRange) + + // Always use end of day for daily period to avoid extra bars + const endTime = period === Period.day ? dateUtils.toDayjs(endDate).endOf('day').toISOString() : new Date().toISOString() + + const params: Parameters[0] = { + period: period, + start: startDate.toISOString(), + end: endTime, + group_by_node: true, + } + const response = await getUsage(params) + + // Check if component is still mounted + if (isCancelled) return + + // API response and nodes list logged + + // Handle the response format exactly like CostumeBarChart + let statsByNode: Record = {} + if (response && response.stats) { + if (typeof response.stats === 'object' && !Array.isArray(response.stats)) { + // This is the expected format when no node_id is provided + statsByNode = response.stats + } else if (Array.isArray(response.stats)) { + // fallback: old format - not expected for all nodes + console.warn('Unexpected array format for all nodes usage') + } + } + + // Stats by node processed + + // Build a map from node id to node name for quick lookup + const nodeIdToName = nodeList.reduce((acc, node) => { + acc[node.id] = node.name + return acc + }, {} as Record) + + // Node ID to name mapping created + + // Check if we have data for individual nodes or aggregated data + const hasIndividualNodeData = Object.keys(statsByNode).some(key => key !== '-1') + + if (!hasIndividualNodeData && statsByNode['-1']) { + // API returned aggregated data for all nodes combined + // Using aggregated data for all nodes + const aggregatedStats = statsByNode['-1'] + + if (aggregatedStats.length > 0) { + const data = aggregatedStats.map((point: NodeUsageStat) => { + const d = dateUtils.toDayjs(point.period_start) + let timeFormat + if (period === Period.hour) { + timeFormat = d.format('HH:mm') + } else { + timeFormat = d.format('MM/DD') + } + const usageInGB = (point.uplink + point.downlink) / (1024 * 1024 * 1024) + + // Create entry with all nodes having the same usage (aggregated) + const entry: any = { + time: timeFormat, + _period_start: point.period_start + } + nodeList.forEach((node) => { + // Distribute usage equally among nodes or show as total + const nodeUsage = parseFloat((usageInGB / nodeList.length).toFixed(2)) + entry[node.name] = nodeUsage + // Store uplink and downlink for tooltip (distributed equally) + entry[`_uplink_${node.name}`] = point.uplink / nodeList.length + entry[`_downlink_${node.name}`] = point.downlink / nodeList.length + }) + return entry + }) + + // Final chart data (aggregated) processed + if (!isCancelled) { + setChartData(data) + + // Calculate total usage + const total = aggregatedStats.reduce((sum: number, point: NodeUsageStat) => sum + point.uplink + point.downlink, 0) + const formattedTotal = formatBytes(total, 2) + if (typeof formattedTotal === 'string') setTotalUsage(formattedTotal) + } + } else { + setChartData(null) + setTotalUsage('0') + } + } else { + // Handle individual node data (existing logic) + // Build a set of all period_start values + const allPeriods = new Set() + Object.values(statsByNode).forEach((arr) => arr.forEach((stat) => allPeriods.add(stat.period_start))) + // Sort periods + const sortedPeriods = Array.from(allPeriods).sort() + + // All periods and period type processed + + if (sortedPeriods.length > 0) { + // Build chart data: [{ time, [nodeName]: usage, ... }] + const data = sortedPeriods.map((periodStart) => { + const d = dateUtils.toDayjs(periodStart) + let timeFormat + if (period === Period.hour) { + timeFormat = d.format('HH:mm') + } else { + timeFormat = d.format('MM/DD') + } + const entry: any = { + time: timeFormat, + _period_start: periodStart + } + + Object.entries(statsByNode).forEach(([nodeId, statsArr]) => { + if (nodeId === '-1') return // Skip aggregated data + const nodeName = nodeIdToName[nodeId] + if (!nodeName) { + console.warn('No node name found for ID:', nodeId) + return + } + const nodeStats = statsArr.find((s) => s.period_start === periodStart) + if (nodeStats) { + const usageInGB = (nodeStats.uplink + nodeStats.downlink) / (1024 * 1024 * 1024) + entry[nodeName] = parseFloat(usageInGB.toFixed(2)) + // Store uplink and downlink for tooltip + entry[`_uplink_${nodeName}`] = nodeStats.uplink + entry[`_downlink_${nodeName}`] = nodeStats.downlink + // Node usage processed + } else { + entry[nodeName] = 0 + entry[`_uplink_${nodeName}`] = 0 + entry[`_downlink_${nodeName}`] = 0 + } + }) + return entry + }) + + // Final chart data processed + if (!isCancelled) { + setChartData(data) + + // Calculate total usage + let total = 0 + Object.values(statsByNode).forEach((arr) => arr.forEach((stat) => { total += stat.uplink + stat.downlink })) + const formattedTotal = formatBytes(total, 2) + if (typeof formattedTotal === 'string') setTotalUsage(formattedTotal) + } + } else { + // No periods found, setting empty data + setChartData(null) + setTotalUsage('0') + } + } + } catch (err) { + setError(err as Error) + setChartData(null) + setTotalUsage('0') + console.error('Error fetching usage data:', err) + } finally { + if (!isCancelled) { + setIsLoading(false) + } + } + } + + // Debounce the API call to prevent excessive requests during zoom + timeoutId = setTimeout(() => { + fetchUsageData() + }, 300) + + return () => { + isCancelled = true + if (timeoutId) { + clearTimeout(timeoutId) + } + } + }, [dateRange, nodeList]) + + // Add effect to update dateRange when selectedTime changes + useEffect(() => { + if (!showCustomRange) { + const now = new Date() + let from: Date | undefined + if (selectedTime === '12h') { + from = new Date(now.getTime() - 12 * 60 * 60 * 1000) + } else if (selectedTime === '24h') { + from = new Date(now.getTime() - 24 * 60 * 60 * 1000) + } else if (selectedTime === '3d') { + from = new Date(now.getTime() - 2 * 24 * 60 * 60 * 1000) + } else if (selectedTime === '1w') { + from = new Date(now.getTime() - 6 * 24 * 60 * 60 * 1000) + } + if (from) { + // For 1w and 3d, set to end of current day to avoid extra bar + const to = (selectedTime === '1w' || selectedTime === '3d') ? dateUtils.toDayjs(now).endOf('day').toDate() : now + setDateRange({ from, to }) + } + } + }, [selectedTime, showCustomRange]) + + return ( + + +
+
+ {t('statistics.trafficUsage')} + {t('statistics.trafficUsageDescription')} +
+
+
+ {showCustomRange ? ( + { setDateRange(range); setShowCustomRange(true); }} initialRange={dateRange} /> + ) : ( + { setSelectedTime(v); setShowCustomRange(false); }} /> + )} + +
+
+
+
+ {t('statistics.usageDuringPeriod')} + {isLoading ? : totalUsage} +
+
+ + {isLoading ? ( +
+ +
+ ) : error ? ( + + ) : !dateRange ? ( + } + className="max-h-[400px] min-h-[200px]" + /> + ) : ( +
+ + {chartData && chartData.length > 0 ? ( + + + + `${value.toFixed(2)} GB`} + tick={{ + fill: 'hsl(var(--muted-foreground))', + fontSize: 9, + fontWeight: 500, + }} + width={32} + tickMargin={2} + /> + {/* When using ChartTooltip, pass period as a prop */} + } /> + {nodeList.map((node, idx) => ( + + ))} + + ) : ( + + )} + + {/* Separate scrollable legend */} + {chartData && chartData.length > 0 && ( +
+
+ {nodeList.map((node) => { + const itemConfig = chartConfig[node.name] + return ( +
+
+ {node.name} +
+ ) + })} +
+
+ )} +
+ )} + + + ) +} \ No newline at end of file diff --git a/dashboard/src/components/charts/AreaCostumeChart.tsx b/dashboard/src/components/charts/AreaCostumeChart.tsx new file mode 100644 index 000000000..33a71542d --- /dev/null +++ b/dashboard/src/components/charts/AreaCostumeChart.tsx @@ -0,0 +1,526 @@ +import { Area, AreaChart, CartesianGrid, XAxis, YAxis, ResponsiveContainer, Tooltip } from 'recharts' +import { useState, useEffect } from 'react' +import { DateRange } from 'react-day-picker' +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card' +import { ChartConfig, ChartContainer } from '@/components/ui/chart' +import { useTranslation } from 'react-i18next' +import { SystemStats, Period, getNodeStatsPeriodic, NodeStats, NodeRealtimeStats } from '@/service/api' +import { Skeleton } from '@/components/ui/skeleton' +import { TimeRangeSelector } from '@/components/common/TimeRangeSelector' +import { EmptyState } from './EmptyState' +import { Button } from '@/components/ui/button' +import { Clock, History } from 'lucide-react' +import { dateUtils } from '@/utils/dateFormatter' + +type DataPoint = { + time: string + cpu: number + ram: number +} + +const chartConfig = { + cpu: { + label: 'CPU Usage', + color: 'hsl(210, 100%, 56%)', // Blue + }, + ram: { + label: 'RAM Usage', + color: 'hsl(200, 100%, 70%)', // Light blue/cyan + }, +} satisfies ChartConfig + +// Custom gradient definitions for the chart +const gradientDefs = { + cpu: { + id: 'cpuGradient', + color1: 'hsl(210, 100%, 56%)', + color2: 'rgba(0, 120, 255, 0.2)', + color3: 'rgba(0, 120, 255, 0.05)', + color4: 'rgba(0, 120, 255, 0)', + }, + ram: { + id: 'ramGradient', + color1: 'hsl(200, 100%, 70%)', + color2: 'rgba(0, 200, 255, 0.2)', + color3: 'rgba(0, 200, 255, 0.05)', + color4: 'rgba(0, 200, 255, 0)', + }, +} + +// Custom tooltip component +const CustomTooltip = ({ active, payload, label }: any) => { + if (active && payload && payload.length) { + // Parse the label as a date if possible + let formattedDate = label + try { + const today = new Date() + // Try to parse label as MM/DD or HH:mm + if (/\d{2}\/\d{2}/.test(label)) { + // MM/DD format, treat as past day + const [month, day] = label.split('/') + const localDate = new Date(today.getFullYear(), parseInt(month) - 1, parseInt(day), 0, 0, 0) + formattedDate = localDate.toLocaleString('en-US', { + year: 'numeric', + month: '2-digit', + day: '2-digit', + hour: '2-digit', + minute: '2-digit', + hour12: false + }).replace(',', '') + } else if (/\d{2}:\d{2}/.test(label)) { + // HH:mm format, treat as today + const now = new Date() + formattedDate = now.toLocaleString('en-US', { + year: 'numeric', + month: '2-digit', + day: '2-digit', + hour: '2-digit', + minute: '2-digit', + hour12: false + }).replace(',', '') + } + } catch {} + return ( +
+

{formattedDate}

+
+ {payload.map((entry: any, index: number) => ( +
+
+ {entry.name}: + {entry.value.toFixed(1)}% +
+ ))} +
+
+ ) + } + return null +} + +interface AreaCostumeChartProps { + nodeId?: number + currentStats?: SystemStats | NodeRealtimeStats | null + realtimeStats?: SystemStats | NodeRealtimeStats +} + +// Helper function to determine period +const getPeriodFromDateRange = (range?: DateRange): Period => { + if (!range?.from || !range?.to) { + return Period.hour // Default to hour if no range + } + const diffTime = Math.abs(range.to.getTime() - range.from.getTime()) + const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)) + + if (diffDays <= 2) { + // Up to 2 days, use hourly data + return Period.hour + } + return Period.day // More than 2 days, use daily data +} + +// Type guard functions +const isSystemStats = (stats: SystemStats | NodeRealtimeStats): stats is SystemStats => { + return 'total_user' in stats +} + +const isNodeRealtimeStats = (stats: SystemStats | NodeRealtimeStats): stats is NodeRealtimeStats => { + return 'incoming_bandwidth_speed' in stats +} + +export function AreaCostumeChart({ nodeId, currentStats, realtimeStats }: AreaCostumeChartProps) { + const { t } = useTranslation() + const [statsHistory, setStatsHistory] = useState([]) + const [isLoading, setIsLoading] = useState(true) + const [error, setError] = useState(null) + const [dateRange, setDateRange] = useState(undefined) + const [viewMode, setViewMode] = useState<'realtime' | 'historical'>('realtime') + + // Clear stats when node changes + useEffect(() => { + setStatsHistory([]) + setDateRange(undefined) + setViewMode('realtime') + }, [nodeId]) + + // Toggle between real-time and historical view + const toggleViewMode = () => { + if (viewMode === 'realtime') { + setViewMode('historical') + } else { + setViewMode('realtime') + setDateRange(undefined) + setStatsHistory([]) + } + } + + // Effect for Real-time Stats + useEffect(() => { + if (!realtimeStats || viewMode !== 'realtime') return + + try { + const now = new Date() + const timeStr = `${now.getHours().toString().padStart(2, '0')}:${now.getMinutes().toString().padStart(2, '0')}:${now.getSeconds().toString().padStart(2, '0')}` + + let cpuUsage = 0 + let ramUsage = 0 + + if (isSystemStats(realtimeStats)) { + // Master server stats + cpuUsage = Number(realtimeStats.cpu_usage ?? 0) + const memUsed = Number(realtimeStats.mem_used ?? 0) + const memTotal = Number(realtimeStats.mem_total ?? 1) + ramUsage = parseFloat(((memUsed / memTotal) * 100).toFixed(1)) + } else if (isNodeRealtimeStats(realtimeStats)) { + // Node stats + cpuUsage = Number(realtimeStats.cpu_usage ?? 0) + const memUsed = Number(realtimeStats.mem_used ?? 0) + const memTotal = Number(realtimeStats.mem_total ?? 1) + ramUsage = parseFloat(((memUsed / memTotal) * 100).toFixed(1)) + } + + setStatsHistory(prev => { + const newHistory = [ + ...prev, + { + time: timeStr, + cpu: cpuUsage, + ram: ramUsage, + }, + ] + + // Improved cleanup logic for real-time data + const MAX_HISTORY = 120 + const CLEANUP_THRESHOLD = 150 + + if (newHistory.length > CLEANUP_THRESHOLD) { + const cleanedHistory = newHistory.filter((_, index) => { + if (index >= newHistory.length - 60) return true + return index % 2 === 0 + }) + + if (cleanedHistory.length > MAX_HISTORY) { + return cleanedHistory.slice(-MAX_HISTORY) + } + + return cleanedHistory + } + + return newHistory + }) + + setIsLoading(false) + } catch (err) { + setError(err as Error) + setIsLoading(false) + console.error('Error processing real-time stats:', err) + } + }, [realtimeStats, viewMode]) + + // Effect for Historical Stats + useEffect(() => { + if (nodeId === undefined || viewMode !== 'historical' || !dateRange?.from || !dateRange?.to) return + + const fetchNodeHistoricalStats = async () => { + setIsLoading(true) + setError(null) + try { + const period = getPeriodFromDateRange(dateRange) + const data = await getNodeStatsPeriodic(nodeId, { + start: dateRange.from!.toISOString(), + end: dateRange.to!.toISOString(), + period: period, + }) + + const statsArray = data?.stats + + if (Array.isArray(statsArray)) { + const formattedData = statsArray.map((point: NodeStats) => { + const d = dateUtils.toDayjs(point.period_start) + let timeFormat + if (period === Period.hour) { + timeFormat = d.format('HH:mm') + } else { + timeFormat = d.format('MM/DD') + } + return { + time: timeFormat, + cpu: point.cpu_usage_percentage, + ram: point.mem_usage_percentage, + } + }) + setStatsHistory(formattedData) + } else { + console.error('Invalid historical stats format received:', data) + setStatsHistory([]) + setError(new Error('Invalid data format received')) + } + } catch (err) { + setError(err as Error) + console.error(`Error fetching historical stats for node ${nodeId}:`, err) + setStatsHistory([]) + } finally { + setIsLoading(false) + } + } + + fetchNodeHistoricalStats() + }, [nodeId, dateRange, viewMode]) + + // --- Header Display Logic --- + let displayCpuUsage: string | JSX.Element = + let displayRamUsage: string | JSX.Element = + + if (currentStats) { + if (isSystemStats(currentStats)) { + // Master server stats + const cpuUsage = Number(currentStats.cpu_usage ?? 0) + const memUsed = Number(currentStats.mem_used ?? 0) + const memTotal = Number(currentStats.mem_total ?? 1) + const ramPercentage = ((memUsed / memTotal) * 100) + + displayCpuUsage = `${cpuUsage.toFixed(1)}%` + displayRamUsage = `${ramPercentage.toFixed(1)}%` + } else if (isNodeRealtimeStats(currentStats)) { + // Node stats + const cpuUsage = Number(currentStats.cpu_usage ?? 0) + const memUsed = Number(currentStats.mem_used ?? 0) + const memTotal = Number(currentStats.mem_total ?? 1) + const ramPercentage = ((memUsed / memTotal) * 100) + + displayCpuUsage = `${cpuUsage.toFixed(1)}%` + displayRamUsage = `${ramPercentage.toFixed(1)}%` + } + } else if (!isLoading && error) { + displayCpuUsage = t('error') + displayRamUsage = t('error') + } + + return ( + + {/* Header - Mobile First Design */} + + {/* Title and Button Row */} +
+
+
+ {viewMode === 'realtime' ? ( + + ) : ( + + )} + + {viewMode === 'realtime' ? t('statistics.realTimeData') : t('statistics.historicalData')} + +
+
+ + {/* Toggle Button - Always visible on mobile */} + {nodeId !== undefined && ( + + )} +
+ + {/* Description */} + + {viewMode === 'realtime' + ? t('statistics.realtimeDescription') + : t('statistics.historicalDescription') + } + + + {/* Stats Display - Responsive Grid */} +
+
+ + {t('statistics.cpuUsage')} + + + {displayCpuUsage} + +
+
+ + {t('statistics.ramUsage')} + + + {displayRamUsage} + +
+
+
+ + {/* Time Range Selector - Only show in historical mode */} + {viewMode === 'historical' && nodeId !== undefined && ( +
+
+
+

+ {t('statistics.selectTimeRange')} +

+

+ {t('statistics.selectTimeRangeDescription')} +

+
+
+ +
+
+
+ )} + + {/* Chart Content */} + + {isLoading ? ( +
+ +
+ ) : error ? ( + + ) : statsHistory.length === 0 ? ( + + ) : ( +
+ + + + + + + + + + + + + + + + + + + + + + + `${value.toFixed(0)}%`} + axisLine={false} + tickMargin={2} + domain={[0, 100]} + tick={{ + fill: 'hsl(var(--muted-foreground))', + fontSize: 9, + fontWeight: 500, + }} + width={32} + /> + + } + cursor={{ + stroke: 'hsl(var(--border))', + strokeWidth: 1, + strokeDasharray: '4 4', + opacity: 0.3, + }} + /> + + + + + + + +
+ )} +
+
+ ) +} diff --git a/dashboard/src/components/charts/CostumeBarChart.tsx b/dashboard/src/components/charts/CostumeBarChart.tsx new file mode 100644 index 000000000..5aa3b9aac --- /dev/null +++ b/dashboard/src/components/charts/CostumeBarChart.tsx @@ -0,0 +1,345 @@ +import { useEffect, useState } from 'react' +import { Bar, BarChart, CartesianGrid, XAxis, YAxis } from 'recharts' +import { DateRange } from 'react-day-picker' +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card' +import { type ChartConfig, ChartContainer, ChartTooltip } from '@/components/ui/chart' +import { useTranslation } from 'react-i18next' +import useDirDetection from '@/hooks/use-dir-detection' +import { getUsage, Period, type NodeUsageStat } from '@/service/api' +import { formatBytes } from '@/utils/formatByte' +import { Skeleton } from '@/components/ui/skeleton' +import { TimeRangeSelector } from '@/components/common/TimeRangeSelector' +import { EmptyState } from './EmptyState' +import { TrendingUp, Upload, Download, Calendar } from 'lucide-react' +import { dateUtils } from '@/utils/dateFormatter' +import { TooltipProps } from 'recharts' +import TimeSelector from './TimeSelector' + +type DataPoint = { + time: string + usage: number +} + +const chartConfig = { + usage: { + label: 'Traffic Usage (GB)', + color: 'hsl(var(--primary))', + }, +} satisfies ChartConfig + +// Define props interface +interface CostumeBarChartProps { + nodeId?: number +} + +// Helper function to determine period (copied from AreaCostumeChart) +const getPeriodFromDateRange = (range?: DateRange): Period => { + if (!range?.from || !range?.to) { + return Period.hour // Default to hour if no range + } + const diffTime = Math.abs(range.to.getTime() - range.from.getTime()) + const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)) + + if (diffDays <= 2) { + // Up to 2 days, use hourly data + return Period.hour + } + return Period.day // More than 2 days, use daily data +} + +function CustomBarTooltip({ active, payload, period }: TooltipProps & { period?: string }) { + const { t, i18n } = useTranslation() + if (!active || !payload || !payload.length) return null + const data = payload[0].payload + const d = dateUtils.toDayjs(data._period_start) + const today = dateUtils.toDayjs(new Date()) + const isToday = d.isSame(today, 'day') + + let formattedDate + if (i18n.language === 'fa') { + try { + if (period === 'day' && isToday) { + formattedDate = new Date().toLocaleString('fa-IR', { + year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', hour12: false + }).replace(',', '') + } else if (period === 'day') { + const localDate = new Date(d.year(), d.month(), d.date(), 0, 0, 0) + formattedDate = localDate.toLocaleString('fa-IR', { + year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', hour12: false + }).replace(',', '') + } else { + formattedDate = d.toDate().toLocaleString('fa-IR', { + year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', hour12: false + }).replace(',', '') + } + } catch { + formattedDate = d.format('YYYY/MM/DD HH:mm') + } + } else { + if (period === 'day' && isToday) { + const now = new Date() + formattedDate = now.toLocaleString('en-US', { + year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', hour12: false + }).replace(',', '') + } else if (period === 'day') { + const localDate = new Date(d.year(), d.month(), d.date(), 0, 0, 0) + formattedDate = localDate.toLocaleString('en-US', { + year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', hour12: false + }).replace(',', '') + } else { + formattedDate = d.toDate().toLocaleString('en-US', { + year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', hour12: false + }).replace(',', '') + } + } + + const isRTL = i18n.language === 'fa' + + return ( +
+
+ {formattedDate} +
+
+ {t('statistics.totalUsage', { defaultValue: 'Total' })}: + {data.usage} GB +
+
+
+ + {formatBytes(data._uplink)} + | + + {formatBytes(data._downlink)} +
+
+
+ ) +} + +export function CostumeBarChart({ nodeId }: CostumeBarChartProps) { + const [dateRange, setDateRange] = useState(undefined) + const [selectedTime, setSelectedTime] = useState('1w') + const [showCustomRange, setShowCustomRange] = useState(false) + const [chartData, setChartData] = useState(null) + const [isLoading, setIsLoading] = useState(false) + const [error, setError] = useState(null) + const [totalUsage, setTotalUsage] = useState('0') + + const { t } = useTranslation() + const dir = useDirDetection() + + useEffect(() => { + const fetchUsageData = async () => { + if (!dateRange?.from || !dateRange?.to) { + setChartData(null) + setTotalUsage('0') + return + } + + setIsLoading(true) + setError(null) + + try { + const startDate = dateRange.from + const endDate = dateRange.to + // Determine period based on range + const period = getPeriodFromDateRange(dateRange) + + // Prepare API parameters + const params: Parameters[0] = { + period: period, + start: startDate.toISOString(), + end: dateUtils.toDayjs(endDate).endOf('day').toISOString(), + ...(nodeId !== undefined && { node_id: nodeId }), + } + + const response = await getUsage(params) + + let statsArr: NodeUsageStat[] = [] + if (response && response.stats) { + if (typeof response.stats === 'object' && !Array.isArray(response.stats)) { + // If nodeId is provided, use that key + const key = nodeId !== undefined ? String(nodeId) : '-1' + if (response.stats[key] && Array.isArray(response.stats[key])) { + statsArr = response.stats[key] + } else { + // fallback: use first available key + const firstKey = Object.keys(response.stats)[0] + if (firstKey && Array.isArray(response.stats[firstKey])) { + statsArr = response.stats[firstKey] + } + } + } else if (Array.isArray(response.stats)) { + // fallback: old format + statsArr = response.stats + } + } + + if (statsArr.length > 0) { + const formattedData = statsArr.map((point: NodeUsageStat) => { + const d = dateUtils.toDayjs(point.period_start) + let timeFormat + if (period === Period.hour) { + timeFormat = d.format('HH:mm') + } else { + timeFormat = d.format('MM/DD') + } + const usageInGB = (point.uplink + point.downlink) / (1024 * 1024 * 1024) + return { + time: timeFormat, + usage: parseFloat(usageInGB.toFixed(2)), + _uplink: point.uplink, + _downlink: point.downlink, + _period_start: point.period_start, + } + }) + + setChartData(formattedData) + + const total = statsArr.reduce((sum: number, point: NodeUsageStat) => sum + point.uplink + point.downlink, 0) + const formattedTotal = formatBytes(total, 2) + if (typeof formattedTotal === 'string') { + setTotalUsage(formattedTotal) + } + } else { + setChartData(null) + setTotalUsage('0') + } + } catch (err) { + setError(err as Error) + setChartData(null) + setTotalUsage('0') + console.error('Error fetching usage data:', err) + } finally { + setIsLoading(false) + } + } + + fetchUsageData() + }, [dateRange, nodeId]) + + // Add effect to update dateRange when selectedTime changes + useEffect(() => { + if (!showCustomRange) { + const now = new Date() + let from: Date | undefined + if (selectedTime === '12h') { + from = new Date(now.getTime() - 12 * 60 * 60 * 1000) + } else if (selectedTime === '24h') { + from = new Date(now.getTime() - 24 * 60 * 60 * 1000) + } else if (selectedTime === '3d') { + from = new Date(now.getTime() - 3 * 24 * 60 * 60 * 1000) + } else if (selectedTime === '1w') { + from = new Date(now.getTime() - 6 * 24 * 60 * 60 * 1000) + } + if (from) { + // For 1w and 3d, set to end of current day to avoid extra bar + const to = (selectedTime === '1w' || selectedTime === '3d') ? dateUtils.toDayjs(now).endOf('day').toDate() : now + setDateRange({ from, to }) + } + } + }, [selectedTime, showCustomRange]) + + return ( + + +
+
+ {t('statistics.trafficUsage')} + {t('statistics.trafficUsageDescription')} +
+
+
+ {showCustomRange ? ( + { setDateRange(range); setShowCustomRange(true); }} initialRange={dateRange} /> + ) : ( + { setSelectedTime(v); setShowCustomRange(false); }} /> + )} + +
+
+
+
+ {t('statistics.usageDuringPeriod')} + {isLoading ? : totalUsage} +
+
+ + {isLoading ? ( +
+ +
+ ) : error ? ( + + ) : !dateRange ? ( + } + className="max-h-[300px] sm:max-h-[400px] min-h-[150px] sm:min-h-[200px]" + /> + ) : ( +
+ + {chartData && chartData.length > 0 ? ( + + + + `${value.toFixed(2)} GB`} + tick={{ + fill: 'hsl(var(--muted-foreground))', + fontSize: 8, + fontWeight: 500, + }} + width={28} + tickMargin={2} + /> + } /> + + + ) : ( + + )} + +
+ )} +
+
+ ) +} diff --git a/dashboard/src/components/charts/EmptyState.tsx b/dashboard/src/components/charts/EmptyState.tsx new file mode 100644 index 000000000..4546a7a78 --- /dev/null +++ b/dashboard/src/components/charts/EmptyState.tsx @@ -0,0 +1,92 @@ +import { CardContent } from '@/components/ui/card' +import { TrendingUp, Database, Wifi, Activity } from 'lucide-react' +import { useTranslation } from 'react-i18next' + +interface EmptyStateProps { + type: 'no-data' | 'no-nodes' | 'loading' | 'error' + title?: string + description?: string + icon?: React.ReactNode + className?: string +} + +export function EmptyState({ + type, + title, + description, + icon, + className = "max-h-[300px] min-h-[200px]" +}: EmptyStateProps) { + const { t } = useTranslation() + + const getEmptyStateContent = () => { + switch (type) { + case 'no-data': + return { + icon: icon || , + title: title || t('statistics.noDataAvailable'), + description: description || t('statistics.noDataDescription'), + } + case 'no-nodes': + return { + icon: icon || , + title: title || t('statistics.noNodesAvailable'), + description: description || t('statistics.noNodesDescription'), + } + case 'loading': + return { + icon: icon || , + title: title || t('loading'), + description: description || t('statistics.loadingDescription'), + } + case 'error': + return { + icon: icon || , + title: title || t('errors.failedToLoad'), + description: description || t('errors.connectionFailed'), + } + default: + return { + icon: , + title: t('statistics.noDataAvailable'), + description: t('statistics.noDataDescription'), + } + } + } + + const content = getEmptyStateContent() + + return ( +
+
+
+ {content.icon} +
+
+

{content.title}

+

{content.description}

+
+
+
+ ) +} + +export function ChartEmptyState({ + type, + title, + description, + icon, + className = "max-h-[300px] min-h-[200px]" +}: EmptyStateProps) { + return ( + + + + ) +} \ No newline at end of file diff --git a/dashboard/src/components/charts/TimeSelector.tsx b/dashboard/src/components/charts/TimeSelector.tsx new file mode 100644 index 000000000..e549419c6 --- /dev/null +++ b/dashboard/src/components/charts/TimeSelector.tsx @@ -0,0 +1,30 @@ +import { ToggleGroup, ToggleGroupItem } from '@/components/ui/toggle-group' +import type { Dispatch, SetStateAction } from 'react' + +export type TimePeriod = string + +interface TimeSelectorProps { + selectedTime: string + setSelectedTime: Dispatch> +} + +export default function TimeSelector({ selectedTime, setSelectedTime }: TimeSelectorProps) { + return ( +
+ value && setSelectedTime(value)} className="space-x-1"> + + 12h + + + 24h + + + 3d + + + 1w + + +
+ ) +} diff --git a/dashboard/src/components/common/AdminsSelector.tsx b/dashboard/src/components/common/AdminsSelector.tsx new file mode 100644 index 000000000..9228b0298 --- /dev/null +++ b/dashboard/src/components/common/AdminsSelector.tsx @@ -0,0 +1,137 @@ +import { Checkbox } from '@/components/ui/checkbox' +import { FormItem, FormMessage } from '@/components/ui/form' +import { Input } from '@/components/ui/input' +import { Skeleton } from '@/components/ui/skeleton' +import { useGetAdmins } from '@/service/api' +import { Search } from 'lucide-react' +import { useState } from 'react' +import { Control, FieldPath, FieldValues, useController } from 'react-hook-form' +import { Trans, useTranslation } from 'react-i18next' +import { useNavigate } from 'react-router' + +interface AdminSelectorProps { + control: Control + name: FieldPath + onAdminsChange?: (admins: (number | string)[]) => void + disabled?: boolean +} + +export default function AdminsSelector({ control, name, onAdminsChange, disabled = false }: AdminSelectorProps) { + const { t } = useTranslation() + const navigate = useNavigate() + const [searchQuery, setSearchQuery] = useState('') + + const { field } = useController({ + control, + name, + }) + + const { data: adminsData, isLoading: adminsLoading } = useGetAdmins(undefined, { + query: { + staleTime: 5 * 60 * 1000, // 5 minutes + gcTime: 10 * 60 * 1000, // 10 minutes + refetchOnWindowFocus: true, + refetchOnMount: true, + refetchOnReconnect: true, + }, + }) + + const selectedAdmins = (field.value as string[]) || [] + const filteredAdmins = (adminsData || []).filter((admin: any) => admin.username.toLowerCase().includes(searchQuery.toLowerCase())) + + const handleSelectAll = (checked: boolean) => { + const newAdmins = checked ? filteredAdmins.map((admin: any) => admin.username) : [] + field.onChange(newAdmins) + onAdminsChange?.(newAdmins) + } + + const handleAdminChange = (checked: boolean, adminUsername: string) => { + const newAdmins = checked ? [...selectedAdmins, adminUsername] : selectedAdmins.filter(username => username !== adminUsername) + + field.onChange(newAdmins) + onAdminsChange?.(newAdmins) + } + + if (adminsLoading) { + return ( + +
+
+ + +
+ +
+ {Array.from({ length: 5 }).map((_, index) => ( +
+ + +
+ ))} +
+
+
+ ) + } + + return ( + +
+
+ + setSearchQuery(e.target.value)} + className="pl-8" + disabled={disabled} + /> +
+ +
+ {filteredAdmins.length === 0 ? ( +
+ {t('warning')} + + { + e.preventDefault() + navigate('/admins') + }} + /> + ), + }} + /> + +
+ ) : ( + filteredAdmins.map((admin: any) => ( + + )) + )} +
+ {selectedAdmins.length > 0 && ( +
+ {t('admins.selectedAdmins', { + count: selectedAdmins.length, + defaultValue: '{{count}} admins selected', + })} +
+ )} +
+ +
+ ) +} diff --git a/dashboard/src/components/common/GroupsSelector.tsx b/dashboard/src/components/common/GroupsSelector.tsx new file mode 100644 index 000000000..31c2b0c6c --- /dev/null +++ b/dashboard/src/components/common/GroupsSelector.tsx @@ -0,0 +1,142 @@ +import { Checkbox } from '@/components/ui/checkbox' +import { FormItem, FormMessage } from '@/components/ui/form' +import { Input } from '@/components/ui/input' +import { Skeleton } from '@/components/ui/skeleton' +import { useGetAllGroups } from '@/service/api' +import { Search } from 'lucide-react' +import { useState } from 'react' +import { Control, FieldPath, FieldValues, useController } from 'react-hook-form' +import { Trans, useTranslation } from 'react-i18next' +import { useNavigate } from 'react-router' + +interface GroupsSelectorProps { + control: Control + name: FieldPath + onGroupsChange?: (groups: number[]) => void + disabled?: boolean +} + +export default function GroupsSelector({ + control, + name, + onGroupsChange, + disabled = false +}: GroupsSelectorProps) { + const { t } = useTranslation() + const navigate = useNavigate() + const [searchQuery, setSearchQuery] = useState('') + + const { field } = useController({ + control, + name, + }) + + const { data: groupsData, isLoading: groupsLoading } = useGetAllGroups(undefined, { + query: { + staleTime: 5 * 60 * 1000, // 5 minutes + gcTime: 10 * 60 * 1000, // 10 minutes + refetchOnWindowFocus: true, + refetchOnMount: true, + refetchOnReconnect: true, + }, + }) + + const selectedGroups = (field.value as number[]) || [] + const filteredGroups = (groupsData?.groups || []).filter((group: any) => group.name.toLowerCase().includes(searchQuery.toLowerCase())) + + const handleSelectAll = (checked: boolean) => { + const newGroups = checked ? filteredGroups.map((group: any) => group.id) : [] + field.onChange(newGroups) + onGroupsChange?.(newGroups) + } + + const handleGroupChange = (checked: boolean, groupId: number) => { + const newGroups = checked ? [...selectedGroups, groupId] : selectedGroups.filter(id => id !== groupId) + + field.onChange(newGroups) + onGroupsChange?.(newGroups) + } + + if (groupsLoading) { + return ( + +
+
+ + +
+ +
+ {Array.from({ length: 5 }).map((_, index) => ( +
+ + +
+ ))} +
+
+
+ ) + } + + return ( + +
+
+ + setSearchQuery(e.target.value)} + className="pl-8" + disabled={disabled} + /> +
+ +
+ {filteredGroups.length === 0 ? ( +
+ {t('warning')} + + { + e.preventDefault() + navigate('/groups') + }} + /> + ), + }} + /> + +
+ ) : ( + filteredGroups.map((group: any) => ( + + )) + )} +
+ {selectedGroups.length > 0 && ( +
+ {t('userDialog.selectedGroups', { + count: selectedGroups.length, + defaultValue: '{{count}} groups selected', + })} +
+ )} +
+ +
+ ) +} diff --git a/dashboard/src/components/common/TimeRangeSelector.tsx b/dashboard/src/components/common/TimeRangeSelector.tsx new file mode 100644 index 000000000..064ebe7e5 --- /dev/null +++ b/dashboard/src/components/common/TimeRangeSelector.tsx @@ -0,0 +1,99 @@ +'use client' + +import * as React from 'react' +import { addDays, format } from 'date-fns' +import { Calendar as CalendarIcon } from 'lucide-react' +import { DateRange } from 'react-day-picker' + +import { cn } from '@/lib/utils' +import { Button } from '@/components/ui/button' +import { Calendar } from '@/components/ui/calendar' +import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover' +import { useTranslation } from 'react-i18next' +import { Calendar as PersianCalendar } from '@/components/ui/persian-calendar' + +interface TimeRangeSelectorProps extends React.HTMLAttributes { + onRangeChange: (range: DateRange | undefined) => void + initialRange?: DateRange +} + +export function TimeRangeSelector({ className, onRangeChange, initialRange }: TimeRangeSelectorProps) { + const { t, i18n } = useTranslation() + const isPersianLocale = i18n.language === 'fa' + const [date, setDate] = React.useState( + initialRange ?? { + from: addDays(new Date(), -7), // Default to last 7 days + to: new Date(), + }, + ) + + React.useEffect(() => { + // Propagate initial range up if provided + if (initialRange) { + onRangeChange(initialRange) + } else { + // Propagate default range up on mount + onRangeChange(date) + } + }, []) // Run only on mount + + const handleSelect = (selectedRange: DateRange | undefined) => { + setDate(selectedRange) + onRangeChange(selectedRange) // Call the callback prop + } + + const formatDate = (date: Date) => { + if (isPersianLocale) { + return new Intl.DateTimeFormat('fa-IR', { + year: 'numeric', + month: 'short', + day: 'numeric', + }).format(date) + } + return format(date, 'LLL dd, y') + } + + return ( +
+ + + + + + {isPersianLocale ? ( + + ) : ( + + )} + + +
+ ) +} diff --git a/dashboard/src/components/dashboard/DashboardAdminStatistics.tsx b/dashboard/src/components/dashboard/DashboardAdminStatistics.tsx new file mode 100644 index 000000000..61d0c848d --- /dev/null +++ b/dashboard/src/components/dashboard/DashboardAdminStatistics.tsx @@ -0,0 +1,26 @@ +import { AdminDetails, SystemStats, useGetAdmins } from '@/service/api' +import AdminStatisticsCard from './admin-statistics-card' + +const DashboardAdminStatistics = ({ currentAdmin, systemStats }: { currentAdmin: AdminDetails | undefined; systemStats: SystemStats | undefined }) => { + const { data } = useGetAdmins(undefined, { + query: { + refetchInterval: 60000, + }, + }) + + if (!data || !currentAdmin) return null + + if (data.length === 1) { + return + } + + return ( +
+ {data?.map(admin => ( + + ))} +
+ ) +} + +export default DashboardAdminStatistics diff --git a/dashboard/src/components/dashboard/DashboardStatistics.tsx b/dashboard/src/components/dashboard/DashboardStatistics.tsx new file mode 100644 index 000000000..0a5767867 --- /dev/null +++ b/dashboard/src/components/dashboard/DashboardStatistics.tsx @@ -0,0 +1,223 @@ +import useDirDetection from '@/hooks/use-dir-detection' +import { cn } from '@/lib/utils' +import { SystemStats } from '@/service/api' +import { formatBytes } from '@/utils/formatByte' +import { Cpu, MemoryStick, Database, Users, Upload, Download } from 'lucide-react' +import { useTranslation } from 'react-i18next' +import { Card, CardContent } from '../ui/card' + +const DashboardStatistics = ({ systemData }: { systemData: SystemStats | undefined }) => { + const { t } = useTranslation() + const dir = useDirDetection() + + const getTotalTrafficValue = () => { + if (!systemData) return 0 + + // For master server stats - use total traffic + return Number(systemData.incoming_bandwidth) + Number(systemData.outgoing_bandwidth) + } + + const getIncomingBandwidth = () => { + if (!systemData) return 0 + return Number(systemData.incoming_bandwidth) || 0 + } + + const getOutgoingBandwidth = () => { + if (!systemData) return 0 + return Number(systemData.outgoing_bandwidth) || 0 + } + + const getMemoryUsage = () => { + if (!systemData) return { used: 0, total: 0, percentage: 0 } + + const memUsed = Number(systemData.mem_used) || 0 + const memTotal = Number(systemData.mem_total) || 0 + const percentage = memTotal > 0 ? (memUsed / memTotal) * 100 : 0 + + return { used: memUsed, total: memTotal, percentage } + } + + const getCpuInfo = () => { + if (!systemData) return { usage: 0, cores: 0 } + + let cpuUsage = Number(systemData.cpu_usage) || 0 + const cpuCores = Number(systemData.cpu_cores) || 0 + + // CPU usage is already in percentage (0-100), no need to multiply + // Just ensure it's within reasonable bounds + cpuUsage = Math.min(Math.max(cpuUsage, 0), 100) + + return { usage: Math.round(cpuUsage * 10) / 10, cores: cpuCores } // Round to 1 decimal place + } + + const memory = getMemoryUsage() + const cpu = getCpuInfo() + + return ( +
+ {/* CPU Usage */} +
+ +
+ +
+
+
+ +
+
+

{t('statistics.cpuUsage')}

+
+
+
+ +
+
+ + {cpu.usage}% + +
+ + {cpu.cores > 0 && ( +
+ + + {cpu.cores} {t('statistics.cores')} + +
+ )} +
+
+ +
+ + {/* Memory Usage */} +
+ +
+ +
+
+
+ +
+
+

{t('statistics.ramUsage')}

+
+
+
+ +
+ + {systemData ? ( + + {formatBytes(memory.used, 1, false)}/{formatBytes(memory.total, 1, true)} + + ) : ( + 0 + )} + +
+
+ +
+ + {/* Total Traffic with Incoming/Outgoing Details */} +
+ +
+ +
+
+
+ +
+
+

{t('statistics.totalTraffic')}

+
+
+
+ +
+
+ + {formatBytes(getTotalTrafficValue() || 0, 1)} + +
+ + {/* Incoming/Outgoing Details */} +
+
+ + {formatBytes(getIncomingBandwidth() || 0, 1)} +
+
+ + {formatBytes(getOutgoingBandwidth() || 0, 1)} +
+
+
+
+ +
+ + {/* Online Users */} +
+ +
+ +
+
+
+ +
+
+

{t('statistics.onlineUsers')}

+
+
+
+ +
+ + {systemData?.online_users || 0} + +
+
+ +
+
+ ) +} + +export default DashboardStatistics diff --git a/dashboard/src/components/dashboard/admin-statistics-card.tsx b/dashboard/src/components/dashboard/admin-statistics-card.tsx new file mode 100644 index 000000000..2e89e349b --- /dev/null +++ b/dashboard/src/components/dashboard/admin-statistics-card.tsx @@ -0,0 +1,67 @@ +import { AdminDetails, SystemStats, useGetSystemStats } from '@/service/api' +import { UserCircleIcon } from 'lucide-react' +import { useTranslation } from 'react-i18next' +import UserStatisticsCard from './users-statistics-card' +import DataUsageChart from './data-usage-chart' + +const AdminStatisticsCard = ({ + admin, + systemStats, + showAdminInfo = true, +}: { + admin: AdminDetails | undefined; + systemStats: SystemStats | undefined; + showAdminInfo?: boolean; + currentAdmin?: AdminDetails | undefined; +}) => { + const { t } = useTranslation() + if (!admin) return null + + // Send admin_username for specific admin stats, except for 'Total' which shows global stats + const systemStatsParams = admin.username !== 'Total' + ? { admin_username: admin.username } + : undefined; + + // Fetch system stats specific to this admin + const { data: adminSystemStats } = useGetSystemStats( + systemStatsParams, + { + query: { + refetchInterval: 5000, + }, + } + ) + + // Use admin-specific stats if available, otherwise fall back to global stats + const statsToUse = adminSystemStats || systemStats + + // For DataUsageChart: pass admin_username for specific admin data, except for 'Total' which shows global data + const shouldPassAdminUsername = admin.username !== 'Total'; + + if (showAdminInfo) + return ( +
+
+
+ + + {admin.username === 'Total' ? t('admins.total') : admin.username} + +
+
+
+ + +
+
+ ) + + return ( +
+ + +
+ ) +} + +export default AdminStatisticsCard diff --git a/dashboard/src/components/dashboard/data-usage-chart.tsx b/dashboard/src/components/dashboard/data-usage-chart.tsx new file mode 100644 index 000000000..0d4f040b2 --- /dev/null +++ b/dashboard/src/components/dashboard/data-usage-chart.tsx @@ -0,0 +1,337 @@ +import { Bar, BarChart, CartesianGrid, XAxis, YAxis, ResponsiveContainer, Cell, TooltipProps } from 'recharts' +import { Card, CardContent, CardDescription, CardHeader, CardTitle, CardFooter } from '../ui/card' +import { ChartConfig, ChartContainer, ChartTooltip } from '../ui/chart' +import { formatBytes } from '@/utils/formatByte' +import { useTranslation } from 'react-i18next' +import { useGetUsersUsage, Period } from '@/service/api' +import { useMemo, useState } from 'react' +import { SearchXIcon, TrendingUp, TrendingDown } from 'lucide-react' +import { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from '../ui/select' +import { dateUtils } from '@/utils/dateFormatter' +import dayjs from '@/lib/dayjs' + +interface PeriodOption { + label: string + value: string + period: Period + hours?: number + days?: number + months?: number + allTime?: boolean +} + +const PERIOD_KEYS = [ + { key: '12h', period: 'hour' as Period, amount: 12, unit: 'hour' }, + { key: '24h', period: 'hour' as Period, amount: 24, unit: 'hour' }, + { key: '3d', period: 'day' as Period, amount: 3, unit: 'day' }, + { key: '7d', period: 'day' as Period, amount: 7, unit: 'day' }, + { key: '30d', period: 'day' as Period, amount: 30, unit: 'day' }, + { key: '3m', period: 'day' as Period, amount: 3, unit: 'month' }, + { key: 'all', period: 'day' as Period, allTime: true }, +] + +const transformUsageData = (apiData: any, periodOption: any) => { + if (!apiData?.stats || !Array.isArray(apiData.stats)) { + return [] + } + + return apiData.stats.map((stat: any, index: number, array: any[]) => { + const d = dateUtils.toDayjs(stat.period_start) + const isLastItem = index === array.length - 1 + + let displayLabel = '' + if (periodOption.hours) { + if (isLastItem) { + displayLabel = 'Today' + } else { + displayLabel = d.format('HH:mm') + } + } else { + if (isLastItem) { + displayLabel = 'Today' + } else { + displayLabel = d.format('MM/DD') + } + } + + return { + date: displayLabel, + fullDate: stat.period_start, + localFullDate: d.toISOString(), + traffic: stat.total_traffic || 0, + } + }) +} + +const chartConfig = { + traffic: { + label: 'traffic', + color: 'hsl(var(--foreground))', + }, +} satisfies ChartConfig + +function CustomBarTooltip({ active, payload, period }: TooltipProps & { period?: string }) { + const { t, i18n } = useTranslation() + if (!active || !payload || !payload.length) return null + const data = payload[0].payload + const d = dateUtils.toDayjs(data.localFullDate || data.fullDate) + const today = dateUtils.toDayjs(new Date()) + const isToday = d.isSame(today, 'day') + + let formattedDate + if (i18n.language === 'fa') { + try { + if (period === 'day' && isToday) { + formattedDate = new Date().toLocaleString('fa-IR', { + year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', hour12: false + }).replace(',', '') + } else if (period === 'day') { + const localDate = new Date(d.year(), d.month(), d.date(), 0, 0, 0) + formattedDate = localDate.toLocaleString('fa-IR', { + year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', hour12: false + }).replace(',', '') + } else { + formattedDate = d.toDate().toLocaleString('fa-IR', { + year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', hour12: false + }).replace(',', '') + } + } catch { + formattedDate = d.format('YYYY/MM/DD HH:mm') + } + } else { + if (period === 'day' && isToday) { + const now = new Date() + formattedDate = now.toLocaleString('en-US', { + year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', hour12: false + }).replace(',', '') + } else if (period === 'day') { + const localDate = new Date(d.year(), d.month(), d.date(), 0, 0, 0) + formattedDate = localDate.toLocaleString('en-US', { + year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', hour12: false + }).replace(',', '') + } else { + formattedDate = d.toDate().toLocaleString('en-US', { + year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', hour12: false + }).replace(',', '') + } + } + + const isRTL = i18n.language === 'fa' + + return ( +
+
+ {t('statistics.date', { defaultValue: 'Date' })}: {formattedDate} +
+
+
+ {t('statistics.totalUsage', { defaultValue: 'Total Usage' })}: + {formatBytes(data.traffic)} +
+
+
+ ) +} + +const DataUsageChart = ({ admin_username }: { admin_username?: string }) => { + const { t, i18n } = useTranslation() + const [activeIndex, setActiveIndex] = useState(null) + const PERIOD_OPTIONS: PeriodOption[] = useMemo(() => [ + ...PERIOD_KEYS.slice(0, 6).map(opt => ({ + label: typeof opt.amount === 'number' ? `${opt.amount} ${t(`time.${opt.unit}${opt.amount > 1 ? 's' : ''}`)}` : '', + value: opt.key, + period: opt.period, + hours: opt.unit === 'hour' && typeof opt.amount === 'number' ? opt.amount : undefined, + days: opt.unit === 'day' && typeof opt.amount === 'number' ? opt.amount : undefined, + months: opt.unit === 'month' && typeof opt.amount === 'number' ? opt.amount : undefined, + })), + { label: t('alltime', { defaultValue: 'All Time' }), value: 'all', period: 'day', allTime: true }, + ], [t]) + const [periodOption, setPeriodOption] = useState(() => PERIOD_OPTIONS[3]) + + const { startDate, endDate } = useMemo(() => { + const now = dayjs() + let start: dayjs.Dayjs + if (periodOption.allTime) { + start = dayjs('2000-01-01T00:00:00Z') // Arbitrary early date + } else if (periodOption.hours) { + start = now.subtract(periodOption.hours, 'hour') + } else if (periodOption.days) { + // Match the logic from CostumeBarChart.tsx and AllNodesStackedBarChart.tsx + // For 7d, subtract 6 days; for 3d, subtract 2 days + const daysToSubtract = periodOption.days === 7 ? 6 : periodOption.days === 3 ? 2 : periodOption.days + start = now.subtract(daysToSubtract, 'day') + } else { + start = now + } + return { startDate: start.toISOString(), endDate: now.toISOString() } + }, [periodOption]) + + const { data, isLoading } = useGetUsersUsage( + { + ...(admin_username ? { admin: [admin_username] } : {}), + period: periodOption.period, + start: startDate, + end: dateUtils.toDayjs(endDate).endOf('day').toISOString(), + }, + { + query: { + refetchInterval: 1000 * 60 * 5, + }, + }, + ) + + // Extract correct stats array from grouped or flat API response (like CostumeBarChart) + let statsArr: any[] = [] + if (data?.stats) { + if (typeof data.stats === 'object' && !Array.isArray(data.stats)) { + // Use '-1' for all, or first key as fallback + statsArr = data.stats['-1'] || data.stats[Object.keys(data.stats)[0]] || [] + } else if (Array.isArray(data.stats)) { + statsArr = data.stats + } + } + + const chartData = useMemo(() => transformUsageData({ stats: statsArr }, periodOption), [statsArr, periodOption]) + + // Calculate trend + const trend = useMemo(() => { + if (!chartData || chartData.length < 2) return null + const last = chartData[chartData.length - 1]?.traffic || 0 + const prev = chartData[chartData.length - 2]?.traffic || 0 + if (prev === 0) return null + const percent = ((last - prev) / prev) * 100 + return percent + }, [chartData]) + + return ( + + +
+ {t('admins.used.traffic', { defaultValue: 'Traffic Usage' })} + {t('admins.monitor.traffic', { defaultValue: 'Monitor admin traffic usage over time' })} +
+ +
+ + {isLoading ? ( +
+
+
+
+
+
+ {[1, 2, 3, 4, 5, 6, 7].map((i) => ( +
+
+
+ ))} +
+
+
+
+
+
+
+
+
+
+ ) : chartData.length === 0 ? ( +
+ + {t('admins.monitor.no_traffic', { defaultValue: 'No traffic data available' })} +
+ ) : ( + + + { + if (state.activeTooltipIndex !== activeIndex) { + setActiveIndex(state.activeTooltipIndex !== undefined ? state.activeTooltipIndex : null); + } + }} + onMouseLeave={() => { + setActiveIndex(null); + }} + > + + { + // If this is the last bar, show 'Today' (translated) + if (periodOption.hours && index === chartData.length - 1) { + return i18n.language === 'fa' ? 'امروز' : 'Today'; + } + if (periodOption.hours) { + // For hour periods, show only time part for compactness + const timePart = chartData[index]?.date?.split(' ')[1]; + return timePart || chartData[index]?.date; + } + // For day periods, show date or 'Today' if present + if (chartData[index]?.date === 'Today') { + return i18n.language === 'fa' ? 'امروز' : 'Today'; + } + return chartData[index]?.date; + }} + /> + formatBytes(val, 0, true).toString()} /> + } + /> + + {chartData.map((_: any, index: number) => ( + + ))} + + + + + )} + + + {chartData.length > 0 && trend !== null && trend > 0 && ( +
+ {t('usersTable.trendingUp', { defaultValue: 'Trending up by' })} {trend.toFixed(1)}% +
+ )} + {chartData.length > 0 && trend !== null && trend < 0 && ( +
+ {t('usersTable.trendingDown', { defaultValue: 'Trending down by' })} {Math.abs(trend).toFixed(1)}% +
+ )} +
+ {t('statistics.trafficUsageDescription', { defaultValue: 'Total traffic usage across all servers' })} +
+
+ + ) +} + +export default DataUsageChart diff --git a/dashboard/src/components/dashboard/users-statistics-card.tsx b/dashboard/src/components/dashboard/users-statistics-card.tsx new file mode 100644 index 000000000..a1cc009a2 --- /dev/null +++ b/dashboard/src/components/dashboard/users-statistics-card.tsx @@ -0,0 +1,56 @@ +import { ActivityIcon, UsersIcon } from 'lucide-react' +import { useTranslation } from 'react-i18next' +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '../ui/card' +import { SystemStats } from '@/service/api' + +const UserStatisticsCard = ({ data }: { data: SystemStats | undefined }) => { + const { t } = useTranslation() + + return ( + + + {t('statistics.users')} + {t('monitorUsers')} + + +
+ + {t('statistics.users')} + {data?.total_user || 0} +
+
+ + {t('statistics.activeUsers')} + {data?.active_users || 0} +
+
+
+ {t('statistics.onlineUsers')} + {data?.online_users || 0} +
+
+
+ {t('statistics.expiredUsers')} + {data?.expired_users || 0} +
+
+
+ {t('statistics.limitedUsers')} + {data?.limited_users || 0} +
+
+
+ {t('statistics.onHoldUsers')} + {data?.on_hold_users || 0} +
+
+
+ {t('statistics.disabledUsers')} + {data?.disabled_users || 0} +
+ + + ) +} + +export default UserStatisticsCard diff --git a/dashboard/src/components/dialogs/AdminModal.tsx b/dashboard/src/components/dialogs/AdminModal.tsx new file mode 100644 index 000000000..58601c0d0 --- /dev/null +++ b/dashboard/src/components/dialogs/AdminModal.tsx @@ -0,0 +1,397 @@ +import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog' +import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '@/components/ui/form' +import { Input } from '@/components/ui/input' +import { Switch } from '@/components/ui/switch' +import { useTranslation } from 'react-i18next' +import { UseFormReturn } from 'react-hook-form' +import { Button } from '@/components/ui/button' +import { z } from 'zod' +import { useCreateAdmin, useModifyAdmin } from '@/service/api' +import { toast } from 'sonner' +import { queryClient } from '@/utils/query-client.ts' +import { PasswordInput } from '@/components/ui/password-input' +import useDynamicErrorHandler from "@/hooks/use-dynamic-errors.ts"; +import { LoaderButton } from '@/components/ui/loader-button' +import useDirDetection from '@/hooks/use-dir-detection' + +interface AdminModalProps { + isDialogOpen: boolean + onOpenChange: (open: boolean) => void + editingAdmin?: boolean + editingAdminUserName: string + form: UseFormReturn +} + +const passwordValidation = z.string().refine( + value => { + if (!value) return false // Don't allow empty passwords + + // Check in priority order + if (value.length < 12) { + return false + } + if ((value.match(/\d/g) || []).length < 2) { + return false + } + if ((value.match(/[A-Z]/g) || []).length < 2) { + return false + } + if ((value.match(/[a-z]/g) || []).length < 2) { + return false + } + return /[!@#$%^&*()\-_=+\[\]{}|;:,.<>?/~`]/.test(value) + }, + value => { + // Return specific error message based on the first validation that fails + if (!value) { + return { message: 'Password is required' } + } + if (value.length < 12) { + return { message: 'Password must be at least 12 characters long' } + } + if ((value.match(/\d/g) || []).length < 2) { + return { message: 'Password must contain at least 2 digits' } + } + if ((value.match(/[A-Z]/g) || []).length < 2) { + return { message: 'Password must contain at least 2 uppercase letters' } + } + if ((value.match(/[a-z]/g) || []).length < 2) { + return { message: 'Password must contain at least 2 lowercase letters' } + } + if (!/[!@#$%^&*()\-_=+\[\]{}|;:,.<>?/~`]/.test(value)) { + return { message: 'Password must contain at least one special character' } + } + return { message: 'Invalid password' } + }, +) + +export const adminFormSchema = z + .object({ + username: z.string().min(1, 'Username is required'), + password: z.string().optional(), + passwordConfirm: z.string().optional(), + is_sudo: z.boolean().default(false), + is_disabled: z.boolean().optional(), + discord_webhook: z.string().optional(), + sub_domain: z.string().optional(), + sub_template: z.string().optional(), + support_url: z.string().optional(), + telegram_id: z.number().optional(), + profile_title: z.string().optional(), + discord_id: z.number().optional(), + }) + .superRefine((data, ctx) => { + // Only validate password if it's provided (for editing) or if it's a new admin + if (data.password || !data.username) { + if (!data.password) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: 'Password is required', + path: ['password'], + }) + return + } + + // Validate password strength + const passwordResult = passwordValidation.safeParse(data.password) + if (!passwordResult.success) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: passwordResult.error.errors[0].message, + path: ['password'], + }) + return + } + + // Validate password confirmation + if (data.password !== data.passwordConfirm) { + ctx.addIssue({ + code: z.ZodIssueCode.custom, + message: 'Passwords do not match', + path: ['passwordConfirm'], + }) + } + } + }) + +export type AdminFormValues = z.infer +export default function AdminModal({ + isDialogOpen, + onOpenChange, + editingAdminUserName, + editingAdmin, + form +}: AdminModalProps) { + const { t } = useTranslation() + const dir = useDirDetection() + const handleError = useDynamicErrorHandler(); + const addAdminMutation = useCreateAdmin() + const modifyAdminMutation = useModifyAdmin() + + // Ensure form is cleared when modal is closed + const handleClose = (open: boolean) => { + if (!open) { + form.reset(); + } + onOpenChange(open); + } + + const onSubmit = async (values: AdminFormValues) => { + try { + const editData = { + is_sudo: values.is_sudo, + password: values.password || undefined, + is_disabled: values.is_disabled, + discord_webhook: values.discord_webhook, + sub_domain: values.sub_domain, + sub_template: values.sub_template, + support_url: values.support_url, + telegram_id: values.telegram_id, + profile_title: values.profile_title, + discord_id: values.discord_id, + } + if (editingAdmin && editingAdminUserName) { + await modifyAdminMutation.mutateAsync({ + username: editingAdminUserName, + data: editData, + }) + toast.success(t('admins.editSuccess', { + name: values.username, + defaultValue: 'Admin «{{name}}» has been updated successfully', + })) + } else { + if (!values.password) return + const createData = { + ...values, + password: values.password, // Ensure password is present + } + await addAdminMutation.mutateAsync({ + data: createData, + }) + toast.success(t('admins.createSuccess', { + name: values.username, + defaultValue: 'Admin «{{name}}» has been created successfully', + })) + } + queryClient.invalidateQueries({ queryKey: ['/api/admins'] }) + onOpenChange(false) + form.reset() + } catch (error: any) { + const fields = ['username', 'password', 'passwordConfirm', 'is_sudo', 'is_disabled', 'discord_webhook', 'sub_domain', 'sub_template', 'support_url', 'telegram_id', 'profile_title', 'discord_id'] + handleError({ error, fields, form, contextKey: "admins" }) + } + } + + return ( + + e.preventDefault()}> + + {editingAdmin ? t('admins.editAdmin') : t('admins.createAdmin')} + +
+ +
+
+
+ { + const hasError = !!form.formState.errors.username + return ( + + {t('admins.username')} + + + + + + ) + }} + /> + { + const hasError = !!form.formState.errors.password + return ( + + {t('admins.password')} + + + + + + ) + }} + /> + + ( + + {t('admins.passwordConfirm')} + + + + + + )} + /> + ( + + {t('admins.telegramId')} + + { + const value = e.target.value + field.onChange(value ? parseInt(value) : 0) + }} + value={field.value ? field.value : ''} + /> + + + + )} + /> + ( + + {t('admins.discordId')} + + { + const value = e.target.value + field.onChange(value ? parseInt(value) : 0) + }} + value={field.value ? field.value : ''} + /> + + + + )} + /> +
+
+ ( + + {t('admins.discord')} + + + + + + )} + /> + ( + + {t('admins.supportUrl')} + + + + + + )} + /> + ( + + {t('admins.profile')} + + + + + + )} + /> + ( + + {t('admins.subDomain')} + + + + + + )} + /> + ( + + {t('admins.subTemplate')} + + + + + + )} + /> +
+
+ ( + field.onChange(!field.value)}> +
+ {t('admins.sudo')} +
+ +
e.stopPropagation()}> + +
+
+
+ )} + /> +
+
+ + + {editingAdmin ? t('modify') : t('create')} + +
+
+ +
+
+ ) +} diff --git a/dashboard/src/components/dialogs/AdvanceSearchModal.tsx b/dashboard/src/components/dialogs/AdvanceSearchModal.tsx new file mode 100644 index 000000000..29b1a7bb6 --- /dev/null +++ b/dashboard/src/components/dialogs/AdvanceSearchModal.tsx @@ -0,0 +1,261 @@ +import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog.tsx' +import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '@/components/ui/form.tsx' +import { Accordion, AccordionItem, AccordionTrigger, AccordionContent } from '@/components/ui/accordion' +import { Switch } from '@/components/ui/switch.tsx' +import { Button } from '@/components/ui/button.tsx' +import { LoaderButton } from '@/components/ui/loader-button.tsx' +import useDirDetection from '@/hooks/use-dir-detection.tsx' +import { UseFormReturn } from 'react-hook-form' +import { useTranslation } from 'react-i18next' +import { z } from 'zod' +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select.tsx' +import GroupsSelector from '@/components/common/GroupsSelector.tsx' +import AdminsSelector from "@/components/common/AdminsSelector.tsx"; +import { Badge } from "@/components/ui/badge.tsx"; +import { X } from "lucide-react"; +import { useGetAllGroups } from '@/service/api' + +interface AdvanceSearchModalProps { + isDialogOpen: boolean + onOpenChange: (open: boolean) => void + form: UseFormReturn + onSubmit: (values: AdvanceSearchFormValue) => void + isSudo?: boolean +} + +export const advanceSearchFormSchema = z.object({ + is_username: z.boolean().default(true), + is_protocol: z.boolean().default(false), + admin: z.array(z.string()).optional(), + group: z.array(z.number()).optional(), + status: z.enum(['0', 'active', 'on_hold', 'disabled', 'expired', 'limited']).default('0').optional(), +}) + +export type AdvanceSearchFormValue = z.infer +export default function AdvanceSearchModal({ isDialogOpen, onOpenChange, form, onSubmit, isSudo }: AdvanceSearchModalProps) { + const dir = useDirDetection() + const { t } = useTranslation() + + const { data: groupsData } = useGetAllGroups(undefined, { + query: { + staleTime: 5 * 60 * 1000, // 5 minutes + gcTime: 10 * 60 * 1000, // 10 minutes + refetchOnWindowFocus: true, + refetchOnMount: true, + refetchOnReconnect: true, + }, + }) + + const groupIdToName = new Map( + (groupsData?.groups || []).map((group: any) => [group.id, group.name]) + ) + + + + + return ( + + e.preventDefault()}> + + + {t('advanceSearch.title')} + + +
+ +
+
+ { + return ( + + {t('advanceSearch.byUsername')} + + { + field.onChange(checked) + form.setValue('is_protocol', !checked) + }} + /> + + + + ) + }} + /> + { + return ( + + {t('advanceSearch.byProtocol')} + + { + field.onChange(checked) + form.setValue('is_username', !checked) + }} + /> + + + + ) + }} + /> + { + return ( + + {t('advanceSearch.byGroup')} + + <> +
+ {field.value?.map(tag => ( + + {groupIdToName.get(tag) || tag} + { + field.onChange(field.value?.filter(t => t !== tag)) + }} + /> + + ))} +
+ + + {t('advanceSearch.selectGroup')} + +
+ +
+
+
+
+ +
+ +
+ ) + }} + /> + {isSudo && ( + { + return ( + + {t('advanceSearch.byAdmin')} + + <> +
+ {field.value?.map(tag => ( + + {tag} + { + field.onChange(field.value?.filter(t => t !== tag)) + }} + /> + + ))} +
+ + + {t('advanceSearch.selectAdmin')} + +
+ +
+
+
+
+ +
+ +
+ ) + }} + /> + )} + { + const statusOptions = [ + { value: '0', label: t('allStatuses') }, + { value: 'active', label: t('status.active') }, + { value: 'on_hold', label: t('status.on_hold') }, + { value: 'disabled', label: t('status.disabled') }, + { value: 'expired', label: t('status.expired') }, + { value: 'limited', label: t('status.limited') }, + ] + + return ( + + {t('advanceSearch.byStatus')} + +
+ +
+
+ +
+ ) + }} + /> +
+
+
+ + + {t('apply')} + +
+
+ +
+
+ ) +} diff --git a/dashboard/src/components/dialogs/CoreConfigModal.tsx b/dashboard/src/components/dialogs/CoreConfigModal.tsx new file mode 100644 index 000000000..39d6ccd6f --- /dev/null +++ b/dashboard/src/components/dialogs/CoreConfigModal.tsx @@ -0,0 +1,826 @@ +import {CopyButton} from '@/components/CopyButton' +import {Button} from '@/components/ui/button' +import {Checkbox} from '@/components/ui/checkbox' +import {Dialog, DialogContent, DialogHeader, DialogTitle} from '@/components/ui/dialog' +import {Form, FormControl, FormField, FormItem, FormLabel, FormMessage} from '@/components/ui/form' +import {Input} from '@/components/ui/input' +import {LoaderButton} from '@/components/ui/loader-button' +import {Select, SelectContent, SelectItem, SelectTrigger, SelectValue} from '@/components/ui/select' +import useDirDetection from '@/hooks/use-dir-detection' +import {cn} from '@/lib/utils' +import {useCreateCoreConfig, useModifyCoreConfig} from '@/service/api' +import {queryClient} from '@/utils/query-client' +import Editor from '@monaco-editor/react' +import {encodeURLSafe} from '@stablelib/base64' +import {generateKeyPair} from '@stablelib/x25519' +import {debounce} from 'es-toolkit' +import {Maximize2, Minimize2, X} from 'lucide-react' +import {useCallback, useEffect, useState} from 'react' +import {UseFormReturn} from 'react-hook-form' +import {useTranslation} from 'react-i18next' +import {toast} from 'sonner' +import {z} from 'zod' +import {useTheme} from '../../components/theme-provider' +import {isEmptyObject} from "@/utils/isEmptyObject.ts"; + +export const coreConfigFormSchema = z.object({ + name: z.string().min(1, 'Name is required'), + config: z.string().min(1, 'Configuration is required'), + fallback_id: z.array(z.string()).optional(), + excluded_inbound_ids: z.array(z.string()).optional(), + public_key: z.string().optional(), + private_key: z.string().optional(), + restart_nodes: z.boolean().default(true), +}) + +export type CoreConfigFormValues = z.infer + +interface CoreConfigModalProps { + isDialogOpen: boolean + onOpenChange: (open: boolean) => void + form: UseFormReturn + editingCore: boolean + editingCoreId?: number +} + +interface ValidationResult { + isValid: boolean + error?: string +} + +export default function CoreConfigModal({ + isDialogOpen, + onOpenChange, + form, + editingCore, + editingCoreId + }: CoreConfigModalProps) { + const {t} = useTranslation() + const dir = useDirDetection() + const {resolvedTheme} = useTheme() + const [validation, setValidation] = useState({isValid: true}) + const [isEditorReady, setIsEditorReady] = useState(false) + const [generatedShortId, setGeneratedShortId] = useState(null) + const [keyPair, setKeyPair] = useState<{ publicKey: string; privateKey: string } | null>(null) + const createCoreMutation = useCreateCoreConfig() + const modifyCoreMutation = useModifyCoreConfig() + const [isEditorFullscreen, setIsEditorFullscreen] = useState(false) + const [inboundTags, setInboundTags] = useState([]) + const [isGeneratingKeyPair, setIsGeneratingKeyPair] = useState(false) + const [isGeneratingShortId, setIsGeneratingShortId] = useState(false) + + const handleEditorValidation = useCallback( + (markers: any[]) => { + // Monaco editor provides validation markers + const hasErrors = markers.length > 0 + if (hasErrors) { + setValidation({ + isValid: false, + error: markers[0].message, + }) + toast.error(markers[0].message, { + duration: 3000, + position: 'bottom-right', + }) + } else { + try { + // Additional validation - try parsing the JSON + JSON.parse(form.getValues().config) + setValidation({isValid: true}) + } catch (e) { + const errorMessage = e instanceof Error ? e.message : 'Invalid JSON' + setValidation({ + isValid: false, + error: errorMessage, + }) + toast.error(errorMessage, { + duration: 3000, + position: 'bottom-right', + }) + } + } + }, + [form], + ) + + // Debounce config changes to improve performance + const debouncedConfigChange = useCallback( + debounce((value: string) => { + try { + const parsedConfig = JSON.parse(value) + if (parsedConfig.inbounds && Array.isArray(parsedConfig.inbounds)) { + const tags = parsedConfig.inbounds.filter((inbound: any) => typeof inbound.tag === 'string' && inbound.tag.trim() !== '').map((inbound: any) => inbound.tag) + setInboundTags(tags) + } else { + setInboundTags([]) + } + } catch { + setInboundTags([]) + } + }, 300), + [], + ) + + // Extract inbound tags from config JSON whenever config changes + useEffect(() => { + const configValue = form.getValues().config + if (configValue) { + debouncedConfigChange(configValue) + } + }, [form.watch('config'), debouncedConfigChange]) + + const handleEditorDidMount = useCallback(() => { + setIsEditorReady(true) + }, []) + + const generatePrivateAndPublicKey = async () => { + try { + setIsGeneratingKeyPair(true) + const keyPair = generateKeyPair() + const formattedKeyPair = { + privateKey: encodeURLSafe(keyPair.secretKey).replace(/=/g, '').replace(/\n/g, ''), + publicKey: encodeURLSafe(keyPair.publicKey).replace(/=/g, '').replace(/\n/g, ''), + } + setKeyPair(formattedKeyPair) + toast.success(t('coreConfigModal.keyPairGenerated')) + } catch (error) { + toast.error(t('coreConfigModal.keyPairGenerationFailed')) + } finally { + setIsGeneratingKeyPair(false) + } + } + + const generateShortId = async () => { + try { + setIsGeneratingShortId(true) + const randomBytes = new Uint8Array(8) + crypto.getRandomValues(randomBytes) + const shortId = Array.from(randomBytes) + .map(byte => byte.toString(16).padStart(2, '0')) + .join('') + setGeneratedShortId(shortId) + toast.success(t('coreConfigModal.shortIdGenerated')) + } catch (error) { + toast.error(t('coreConfigModal.shortIdGenerationFailed')) + } finally { + setIsGeneratingShortId(false) + } + } + + const defaultConfig = JSON.stringify( + { + log: { + loglevel: 'info', + }, + inbounds: [ + { + tag: 'Shadowsocks TCP', + listen: '0.0.0.0', + port: 1080, + protocol: 'shadowsocks', + settings: { + clients: [], + network: 'tcp,udp', + }, + }, + ], + outbounds: [ + { + protocol: 'freedom', + tag: 'DIRECT', + }, + { + protocol: 'blackhole', + tag: 'BLOCK', + }, + ], + routing: { + rules: [ + { + ip: ['geoip:private'], + outboundTag: 'BLOCK', + type: 'field', + }, + ], + }, + }, + null, + 2, + ) + + const onSubmit = async (values: CoreConfigFormValues) => { + try { + // Validate JSON first + let configObj + try { + configObj = JSON.parse(values.config) + } catch (e) { + const errorMessage = e instanceof Error ? e.message : 'Invalid JSON' + form.setError('config', { + type: 'manual', + message: errorMessage, + }) + toast.error(errorMessage) + return + } + + const fallbackTags = values.fallback_id || [] + const excludeInboundTags = values.excluded_inbound_ids || [] + + if (editingCore && editingCoreId) { + // Update existing core + await modifyCoreMutation.mutateAsync({ + coreId: editingCoreId, + data: { + name: values.name, + config: configObj, + fallbacks_inbound_tags: fallbackTags, + exclude_inbound_tags: excludeInboundTags, + }, + params: { + restart_nodes: values.restart_nodes, + }, + }) + } else { + // Create new core + await createCoreMutation.mutateAsync({ + data: { + name: values.name, + config: configObj, + fallbacks_inbound_tags: fallbackTags, + exclude_inbound_tags: excludeInboundTags, + }, + }) + } + + toast.success( + t(editingCore ? 'coreConfigModal.editSuccess' : 'coreConfigModal.createSuccess', { + name: values.name, + }), + ) + + // Invalidate core config queries after successful action + queryClient.invalidateQueries({queryKey: ['/api/cores']}) + onOpenChange(false) + form.reset() + } catch (error: any) { + console.error('Core config operation failed:', error) + console.error('Error response:', error?.response) + // Error data logging removed + + // Reset all previous errors first + form.clearErrors() + + // Handle validation errors + if (error?.response?._data && !isEmptyObject(error?.response?._data)) { + // For zod validation errors + const fields = ['name', 'config', 'fallback_id', 'excluded_inbound_ids'] + + // Show first error in a toast + if (error?.response?._data?.detail) { + const detail = error?.response?._data?.detail + // If detail is an object with field errors (e.g., { status: "some error" }) + if (typeof detail === 'object' && detail !== null && !Array.isArray(detail)) { + // Set errors for all fields in the object + const firstField = Object.keys(detail)[0] + const firstMessage = detail[firstField] + + Object.entries(detail).forEach(([field, message]) => { + if (fields.includes(field)) { + form.setError(field as any, { + type: 'manual', + message: + typeof message === 'string' + ? message + : t('validation.invalid', { + field: t(`coreConfigModal.${field}`, {defaultValue: field}), + defaultValue: `${field} is invalid`, + }), + }) + } + }) + + toast.error( + firstMessage || + t('validation.invalid', { + field: t(`coreConfigModal.${firstField}`, {defaultValue: firstField}), + defaultValue: `${firstField} is invalid`, + }), + ) + } else if (typeof detail === 'string' && !Array.isArray(detail)) { + toast.error(detail) + } + } + } else if (error?.response?.data) { + // Handle API errors + const apiError = error.response?.data + let errorMessage = '' + + if (typeof apiError === 'string') { + errorMessage = apiError + } else if (apiError?.detail) { + if (Array.isArray(apiError.detail)) { + // Handle array of field errors + apiError.detail.forEach((err: any) => { + if (err.loc && err.loc[1]) { + const fieldName = err.loc[1] + form.setError(fieldName as any, { + type: 'manual', + message: err.msg, + }) + } + }) + errorMessage = apiError.detail[0]?.msg || 'Validation error' + } else if (typeof apiError.detail === 'string') { + errorMessage = apiError.detail + } else { + errorMessage = 'Validation error' + } + } else if (apiError?.message) { + errorMessage = apiError.message + } else { + errorMessage = 'An unexpected error occurred' + } + + toast.error(errorMessage) + } else { + // Generic error handling + toast.error(error?.message || t('coreConfigModal.genericError', {defaultValue: 'An error occurred'})) + } + } + } + + // Initialize form fields when modal opens + useEffect(() => { + if (isDialogOpen) { + if (!editingCore) { + // Reset form for new core + form.reset({ + name: '', + config: defaultConfig, + excluded_inbound_ids: [], + fallback_id: [], + restart_nodes: true, + }) + } else { + // Set restart_nodes to true for editing + form.setValue('restart_nodes', true) + } + } + }, [isDialogOpen, editingCore, form, defaultConfig]) + + // Cleanup on modal close + useEffect(() => { + if (!isDialogOpen) { + setIsEditorFullscreen(false) + setKeyPair(null) + setGeneratedShortId(null) + setValidation({isValid: true}) + } + }, [isDialogOpen]) + + // Add this CSS somewhere in your styles (you might need to create a new CSS file or add to existing one) + const styles = ` + .monaco-editor-mobile .monaco-menu { + background-color: var(--background) !important; + } + + .monaco-editor-mobile .monaco-menu .action-item { + background-color: var(--background) !important; + } + + .monaco-editor-mobile .monaco-menu .action-item:hover { + background-color: var(--muted) !important; + } + + .monaco-editor-mobile .monaco-menu .action-item.disabled { + opacity: 0.5; + } + + .monaco-editor-mobile .monaco-menu .action-item .action-label { + color: var(--foreground) !important; + } + + .monaco-editor-mobile .monaco-menu .action-item:hover .action-label { + color: var(--foreground) !important; + } + ` + + // Add this useEffect to inject the styles + useEffect(() => { + const styleElement = document.createElement('style') + styleElement.textContent = styles + document.head.appendChild(styleElement) + return () => { + document.head.removeChild(styleElement) + } + }, []) + + // Handle Monaco Editor web component registration errors + useEffect(() => { + const originalError = console.error + console.error = (...args) => { + // Suppress the specific web component registration error + if (args[0]?.message?.includes('custom element with name') && args[0]?.message?.includes('has already been defined')) { + return + } + originalError.apply(console, args) + } + + return () => { + console.error = originalError + } + }, []) + + return ( + + e.preventDefault()}> + + {editingCore ? t('coreConfigModal.editCore') : t('coreConfigModal.addConfig')} +

{t('coreConfigModal.createNewConfig')}

+
+ +
+ +
+
+
+

{t('coreConfigModal.jsonConfig')}

+

{t('coreConfigModal.editJson')}

+
+ ( + + +
+ {!isEditorReady && ( +
+ +
+ )} + + +
+
+ {validation.error && !validation.isValid && + {validation.error}} +
+ )} + /> +
+
+ +
+ ( + + {t('coreConfigModal.name')} + + + + + + )} + /> + + ( + + {t('coreConfigModal.fallback')} +
+
+ {field.value && field.value.length > 0 ? ( + field.value.map((tag: string) => ( + + {tag} + + + )) + ) : ( + {t('coreConfigModal.selectFallback')} + )} +
+ + {field.value && field.value.length > 0 && ( + + )} +
+ +
+ )} + /> + + ( + + {t('coreConfigModal.excludedInbound')} +
+
+ {field.value && field.value.length > 0 ? ( + field.value.map((tag: string) => ( + + {tag} + + + )) + ) : ( + {t('coreConfigModal.selectInbound')} + )} +
+ + {field.value && field.value.length > 0 && ( + + )} +
+ +
+ )} + /> + +
+ + {t('coreConfigModal.generateKeyPair')} + + + {keyPair && ( +
+ + +
+
+

{t('coreConfigModal.publicKey')}

+
+ {keyPair.publicKey} + +
+
+ +
+

{t('coreConfigModal.privateKey')}

+
+ {keyPair.privateKey} + +
+
+
+
+ )} +
+ +
+ + {t('coreConfigModal.generateShortId')} + +
+ + {generatedShortId && ( +
+ +

{t('coreConfigModal.shortId')}

+
+ {generatedShortId} + +
+
+ )} +
+
+
+ {!isEditorFullscreen && ( +
+ {editingCore && ( + ( + + + + + {t('coreConfigModal.restartNodes')} + + )} + /> + )} +
+ + + {editingCore ? t('modify') : t('create')} + +
+
+ )} +
+ +
+
+ ) +} diff --git a/dashboard/src/components/dialogs/GroupModal.tsx b/dashboard/src/components/dialogs/GroupModal.tsx new file mode 100644 index 000000000..0f6df2e33 --- /dev/null +++ b/dashboard/src/components/dialogs/GroupModal.tsx @@ -0,0 +1,156 @@ +import {Dialog, DialogContent, DialogHeader, DialogTitle} from '@/components/ui/dialog' +import {Form, FormControl, FormField, FormItem, FormLabel, FormMessage} from '@/components/ui/form' +import {Input} from '@/components/ui/input' +import {Button} from '@/components/ui/button' +import {useTranslation} from 'react-i18next' +import {UseFormReturn} from 'react-hook-form' +import {useCreateGroup, useModifyGroup, useGetInbounds} from '@/service/api' +import {toast} from 'sonner' +import {z} from 'zod' +import {Command, CommandEmpty, CommandGroup, CommandInput, CommandItem} from '@/components/ui/command' +import {Badge} from '@/components/ui/badge' +import {X} from 'lucide-react' +import {cn} from '@/lib/utils' +import {queryClient} from '@/utils/query-client' +import useDirDetection from '@/hooks/use-dir-detection' +import useDynamicErrorHandler from "@/hooks/use-dynamic-errors.ts"; + +export const groupFormSchema = z.object({ + name: z.string().min(1, 'Name is required'), + inbound_tags: z.array(z.string()), + is_disabled: z.boolean().optional(), +}) + +export type GroupFormValues = z.infer + +interface GroupModalProps { + isDialogOpen: boolean + onOpenChange: (open: boolean) => void + form: UseFormReturn + editingGroup: boolean + editingGroupId?: number +} + +export default function GroupModal({isDialogOpen, onOpenChange, form, editingGroup, editingGroupId}: GroupModalProps) { + const {t} = useTranslation() + const dir = useDirDetection() + const handleError = useDynamicErrorHandler(); + const addGroupMutation = useCreateGroup() + const modifyGroupMutation = useModifyGroup() + const {data: inbounds} = useGetInbounds() + + const onSubmit = async (values: GroupFormValues) => { + try { + if (editingGroup && editingGroupId) { + await modifyGroupMutation.mutateAsync({ + groupId: editingGroupId, + data: values, + }) + toast.success( + t('group.editSuccess', { + name: values.name, + }), + ) + } else { + await addGroupMutation.mutateAsync({ + data: values, + }) + toast.success( + t('group.createSuccess', { + name: values.name, + }), + ) + } + // Invalidate groups queries after successful action + queryClient.invalidateQueries({queryKey: ['/api/groups']}) + onOpenChange(false) + form.reset() + } catch (error: any) { + const fields = ['name', 'inbound_tags'] + handleError({error, fields, form, contextKey: "groups"}) + } + } + + return ( + + e.preventDefault()}> + + {editingGroup ? t('editGroup', {defaultValue: 'Edit Group'}) : t('createGroup')} + +
+ + ( + + {t('name')} + + + + + + )} + /> + ( + + {t('inboundTags')} +
+ + + {t('noInboundsFound')} + + {inbounds?.map(inbound => ( + { + const currentTags = field.value || [] + const newTags = currentTags.includes(inbound) ? currentTags.filter(tag => tag !== inbound) : [...currentTags, inbound] + field.onChange(newTags) + }} + > +
+ {inbound} + + ))} + + +
+ {field.value?.map(tag => ( + + {tag} + { + field.onChange(field.value?.filter(t => t !== tag)) + }} + /> + + ))} +
+
+ + + )} + /> +
+ + +
+ + + +
+ ) +} diff --git a/dashboard/src/components/dialogs/HostModal.tsx b/dashboard/src/components/dialogs/HostModal.tsx new file mode 100644 index 000000000..ba2f7c817 --- /dev/null +++ b/dashboard/src/components/dialogs/HostModal.tsx @@ -0,0 +1,2801 @@ +import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from '@/components/ui/accordion' +import { Badge } from '@/components/ui/badge' +import { Button } from '@/components/ui/button' +import { Checkbox } from '@/components/ui/checkbox' +import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog' +import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '@/components/ui/form' +import { Input } from '@/components/ui/input' +import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover' +import { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectTrigger, SelectValue } from '@/components/ui/select' +import { Switch } from '@/components/ui/switch' +import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs' +import { useClipboard } from '@/hooks/use-clipboard' +import useDirDetection from '@/hooks/use-dir-detection' +import { cn } from '@/lib/utils' +import { getHosts, getInbounds, UserStatus } from '@/service/api' +import { queryClient } from '@/utils/query-client' +import { useQuery } from '@tanstack/react-query' +import { Cable, ChevronsLeftRightEllipsis, GlobeLock, Info, Lock, Network, Plus, Trash2, X } from 'lucide-react' +import { useState, useMemo, useCallback, memo } from 'react' +import { UseFormReturn } from 'react-hook-form' +import { useTranslation } from 'react-i18next' +import { toast } from 'sonner' +import { HostFormValues } from '../hosts/Hosts' +import { LoaderButton } from '../ui/loader-button' + +interface HostModalProps { + isDialogOpen: boolean + onOpenChange: (open: boolean) => void + onSubmit: (data: HostFormValues) => Promise<{ status: number }> + editingHost?: boolean + form: UseFormReturn +} + +// Update status options constant +const statusOptions = [ + { value: UserStatus.active, label: 'hostsDialog.status.active' }, + { value: UserStatus.disabled, label: 'hostsDialog.status.disabled' }, + { value: UserStatus.limited, label: 'hostsDialog.status.limited' }, + { value: UserStatus.expired, label: 'hostsDialog.status.expired' }, + { value: UserStatus.on_hold, label: 'hostsDialog.status.onHold' }, +] as const + +// Memoized Noise Item Component for optimal performance +interface NoiseItemProps { + index: number + form: UseFormReturn + onRemove: (index: number) => void + t: (key: string) => string +} + +const NoiseItem = memo(({ index, form, onRemove, t }) => { + const handleRemove = useCallback(() => { + onRemove(index) + }, [index, onRemove]) + + return ( +
+ ( + + + + + )} + /> + ( + + + + + + + )} + /> + ( + + + + + + + )} + /> + +
+ ) +}) + +NoiseItem.displayName = 'NoiseItem' + +// Reusable ArrayInput component for type-and-enter functionality +interface ArrayInputProps { + field: any + placeholder: string + label: string + infoContent?: React.ReactNode +} + +const ArrayInput = memo(({ field, placeholder, label, infoContent }) => { + const [inputValue, setInputValue] = useState('') + const [isPopoverOpen, setIsPopoverOpen] = useState(false) + + const handleKeyDown = (e: React.KeyboardEvent) => { + if (e.key === 'Enter' && inputValue.trim()) { + e.preventDefault() + addItem() + } + } + + const addItem = () => { + if (inputValue.trim()) { + const currentValue = field.value || [] + const newValue = [...currentValue, inputValue.trim()] + field.onChange(newValue) + setInputValue('') + } + } + + const removeItem = (index: number) => { + const currentValue = field.value || [] + const newValue = currentValue.filter((_: any, i: number) => i !== index) + field.onChange(newValue) + } + + const displayValue = field.value && field.value.length > 0 + ? field.value.length <= 3 + ? field.value.join(', ') + : `${field.value.slice(0, 3).join(', ')}... (+${field.value.length - 3} more)` + : '' + + return ( + +
+ {label} + {infoContent && ( + + + + + + {infoContent} + + + )} +
+ + + + + +
+ {/* Input for adding new items with submit button */} +
+ setInputValue(e.target.value)} onKeyDown={handleKeyDown} className="flex-1 text-sm" /> + +
+ + {/* Selected items list */} + {field.value && field.value.length > 0 && ( +
+ {field.value.map((item: string, index: number) => ( +
removeItem(index)}> +
+ +
+ {item} +
+ ))} +
+ )} +
+
+
+ +
+ ) +}) + +ArrayInput.displayName = 'ArrayInput' + +const HostModal: React.FC = ({ isDialogOpen, onOpenChange, onSubmit, editingHost, form }) => { + const [openSection, setOpenSection] = useState(undefined) + const [isTransportOpen, setIsTransportOpen] = useState(false) + const { t } = useTranslation() + const dir = useDirDetection() + const [_isSubmitting, setIsSubmitting] = useState(false) + const { copy } = useClipboard() + + // Optimized noise settings handlers with useCallback for performance + const addNoiseSetting = useCallback(() => { + const currentNoiseSettings = form.getValues('noise_settings.xray') || [] + form.setValue( + 'noise_settings.xray', + [ + ...currentNoiseSettings, + { + type: 'rand', + packet: '', + delay: '', + }, + ], + { + shouldDirty: true, + shouldTouch: true, + } + ) + }, [form]) + + const removeNoiseSetting = useCallback((index: number) => { + const currentNoiseSettings = form.getValues('noise_settings.xray') || [] + const newNoiseSettings = currentNoiseSettings.filter((_, i) => i !== index) + form.setValue('noise_settings.xray', newNoiseSettings, { + shouldDirty: true, + shouldTouch: true, + }) + }, [form]) + + // Memoized noise settings array to prevent unnecessary re-renders + const noiseSettings = useMemo(() => { + return form.getValues('noise_settings.xray') || [] + }, [form.watch('noise_settings.xray')]) + + const cleanPayload = (data: any): any => { + // Helper function to check if an object has any non-empty values + const hasNonEmptyValues = (obj: any): boolean => { + if (!obj || typeof obj !== 'object') return false + return Object.values(obj).some(value => { + if (value === null || value === undefined || value === '') return false + if (typeof value === 'object') return hasNonEmptyValues(value) + return true + }) + } + + // Helper function to clean nested objects + const cleanObject = (obj: any, path: string[] = []): any => { + const result: any = {} + Object.entries(obj).forEach(([key, value]) => { + const currentPath = [...path, key] + if (value === null || value === undefined || value === '') return + + if (typeof value === 'object' && !Array.isArray(value)) { + const cleanedNested = cleanObject(value, currentPath) + if (Object.keys(cleanedNested).length > 0) { + result[key] = cleanedNested + } + } else if (Array.isArray(value)) { + if (value.length > 0) { + result[key] = value + } + } else { + result[key] = value + } + }) + return result + } + + return cleanObject(data) + } + + const handleModalOpenChange = (open: boolean) => { + if (!open) { + // Let the parent component handle the form reset + setOpenSection(undefined) + } + onOpenChange(open) + } + + const { data: inbounds = [] } = useQuery({ + queryKey: ['getInboundsQueryKey'], + queryFn: () => getInbounds(), + }) + + // Update the hosts query to refetch only when needed (not on dialog open) + const { data: hosts = [] } = useQuery({ + queryKey: ['getHostsQueryKey'], + queryFn: () => getHosts(), + enabled: isTransportOpen, // Only fetch when transport section is open + refetchOnWindowFocus: false, + select: data => data.filter(host => host.id != null), // Filter out hosts with null IDs + }) + + // No automatic refresh when dialog opens - only fetch on specific actions + + const handleAccordionChange = (value: string) => { + if (value === 'transport') { + setIsTransportOpen(true) + } + setOpenSection(prevSection => (prevSection === value ? undefined : value)) + } + + const handleSubmit = async (data: HostFormValues) => { + setIsSubmitting(true) + try { + // Clean the payload before sending + const payload = { ...data } + + // If SingBox fragment is disabled, clear related fields + if (!payload.fragment_settings?.sing_box?.fragment && payload.fragment_settings?.sing_box) { + const singBox = payload.fragment_settings.sing_box! + ; (singBox as any).fragment_fallback_delay = undefined + ; (singBox as any).record_fragment = undefined + } + + // Convert fragment_fallback_delay number to ms format + if (payload.fragment_settings?.sing_box?.fragment_fallback_delay) { + const delay = payload.fragment_settings.sing_box.fragment_fallback_delay + if (/^\d+$/.test(delay)) { + payload.fragment_settings.sing_box.fragment_fallback_delay = delay + 'ms' + } + } + + const cleanedData = cleanPayload(payload) + const response = await onSubmit(cleanedData) + if (response.status >= 400) { + throw new Error(`Operation failed with status: ${response.status}`) + } + handleModalOpenChange(false) + queryClient.invalidateQueries({ + queryKey: ['getHostsQueryKey'], + }) + } catch (error) { + console.error(error) + } finally { + setIsSubmitting(false) + } + } + + const handleCopy = (text: string) => { + copy(text) + toast.success(t('usersTable.copied')) + } + + return ( + + e.preventDefault()}> + + {editingHost ? t('editHost.title') : t('hostsDialog.addHost')} + +
+ +
+ ( + + {t('inbound')} + + + + )} + /> + + ( + + {t('hostsDialog.status.label')} +
+
+ {field.value && field.value.length > 0 ? ( + field.value.map(status => { + const option = statusOptions.find(opt => opt.value === status) + if (!option) return null + return ( + + {t(option.label)} + + + ) + }) + ) : ( + {t('hostsDialog.noStatus')} + )} +
+ + {field.value && field.value.length > 0 && ( + + )} +
+ +
+ )} + /> + + ( + +
+ {t('remark')} + + + + + +
+

{t('hostsDialog.variables.title')}

+
+
+ handleCopy('{SERVER_IP}')} + title={t('copy')} + > + {'{SERVER_IP}'} + + {t('hostsDialog.variables.server_ip')} +
+
+ handleCopy('{SERVER_IPV6}')} + title={t('copy')} + > + {'{SERVER_IPV6}'} + + {t('hostsDialog.variables.server_ipv6')} +
+
+ handleCopy('{USERNAME}')} + title={t('copy')} + > + {'{USERNAME}'} + + {t('hostsDialog.variables.username')} +
+
+ handleCopy('{DATA_USAGE}')} + title={t('copy')} + > + {'{DATA_USAGE}'} + + {t('hostsDialog.variables.data_usage')} +
+
+ handleCopy('{DATA_LEFT}')} + title={t('copy')} + > + {'{DATA_LEFT}'} + + {t('hostsDialog.variables.data_left')} +
+
+ handleCopy('{DATA_LIMIT}')} + title={t('copy')} + > + {'{DATA_LIMIT}'} + + {t('hostsDialog.variables.data_limit')} +
+
+ handleCopy('{DAYS_LEFT}')} + title={t('copy')} + > + {'{DAYS_LEFT}'} + + {t('hostsDialog.variables.days_left')} +
+
+ handleCopy('{EXPIRE_DATE}')} + title={t('copy')} + > + {'{EXPIRE_DATE}'} + + {t('hostsDialog.variables.expire_date')} +
+
+ handleCopy('{JALALI_EXPIRE_DATE}')} + title={t('copy')} + > + {'{JALALI_EXPIRE_DATE}'} + + {t('hostsDialog.variables.jalali_expire_date')} +
+
+ handleCopy('{TIME_LEFT}')} + title={t('copy')} + > + {'{TIME_LEFT}'} + + {t('hostsDialog.variables.time_left')} +
+
+ handleCopy('{STATUS_EMOJI}')} + title={t('copy')} + > + {'{STATUS_EMOJI}'} + + {t('hostsDialog.variables.status_emoji')} +
+
+ handleCopy('{PROTOCOL}')} + title={t('copy')} + > + {'{PROTOCOL}'} + + {t('hostsDialog.variables.protocol')} +
+
+ handleCopy('{TRANSPORT}')} + title={t('copy')} + > + {'{TRANSPORT}'} + + {t('hostsDialog.variables.transport')} +
+
+ handleCopy('{ADMIN_USERNAME}')} + title={t('copy')} + > + {'{ADMIN_USERNAME}'} + + {t('hostsDialog.variables.admin_username')} +
+
+
+
+
+
+ + + + +
+ )} + /> + +
+
+ { + const infoContent = ( +
+

{t('hostsDialog.variables.title')}

+
+
+ handleCopy('{SERVER_IP}')} + title={t('copy')} + > + {'{SERVER_IP}'} + + {t('hostsDialog.variables.server_ip')} +
+
+ handleCopy('{SERVER_IPV6}')} + title={t('copy')} + > + {'{SERVER_IPV6}'} + + {t('hostsDialog.variables.server_ipv6')} +
+
+ handleCopy('{USERNAME}')} + title={t('copy')} + > + {'{USERNAME}'} + + {t('hostsDialog.variables.username')} +
+
+ handleCopy('{DATA_USAGE}')} + title={t('copy')} + > + {'{DATA_USAGE}'} + + {t('hostsDialog.variables.data_usage')} +
+
+ handleCopy('{DATA_LEFT}')} + title={t('copy')} + > + {'{DATA_LEFT}'} + + {t('hostsDialog.variables.data_left')} +
+
+ handleCopy('{DATA_LIMIT}')} + title={t('copy')} + > + {'{DATA_LIMIT}'} + + {t('hostsDialog.variables.data_limit')} +
+
+ handleCopy('{DAYS_LEFT}')} + title={t('copy')} + > + {'{DAYS_LEFT}'} + + {t('hostsDialog.variables.days_left')} +
+
+ handleCopy('{EXPIRE_DATE}')} + title={t('copy')} + > + {'{EXPIRE_DATE}'} + + {t('hostsDialog.variables.expire_date')} +
+
+ handleCopy('{JALALI_EXPIRE_DATE}')} + title={t('copy')} + > + {'{JALALI_EXPIRE_DATE}'} + + {t('hostsDialog.variables.jalali_expire_date')} +
+
+ handleCopy('{TIME_LEFT}')} + title={t('copy')} + > + {'{TIME_LEFT}'} + + {t('hostsDialog.variables.time_left')} +
+
+ handleCopy('{STATUS_EMOJI}')} + title={t('copy')} + > + {'{STATUS_EMOJI}'} + + {t('hostsDialog.variables.status_emoji')} +
+
+ handleCopy('{PROTOCOL}')} + title={t('copy')} + > + {'{PROTOCOL}'} + + {t('hostsDialog.variables.protocol')} +
+
+ handleCopy('{TRANSPORT}')} + title={t('copy')} + > + {'{TRANSPORT}'} + + {t('hostsDialog.variables.transport')} +
+
+ handleCopy('{ADMIN_USERNAME}')} + title={t('copy')} + > + {'{ADMIN_USERNAME}'} + + {t('hostsDialog.variables.admin_username')} +
+
+
+ ) + + return + }} + /> +
+
+ ( + +
+ {t('hostsDialog.port')} + + + + + +

{t('hostsDialog.port.info')}

+
+
+
+ + { + const val = e.target.value + field.onChange(val === '' ? '' : Number.parseInt(val, 10)) + }} + value={field.value === null || field.value === undefined ? '' : field.value} + /> + + +
+ )} + /> +
+
+ + + + +
+ + {t('hostsDialog.networkSettings')} +
+
+ +
+
+ { + const infoContent = ( +
+

{t('hostsDialog.host.info')}

+

{t('hostsDialog.host.multiHost')}

+

{t('hostsDialog.host.wildcard')}

+
+ ) + + return + }} + /> + ( + +
+ {t('hostsDialog.path')} + + + + + +

{t('hostsDialog.path.info')}

+
+
+
+ + + + +
+ )} + /> +
+ + ( + field.onChange(!field.value)}> +
+ {t('hostsDialog.randomUserAgent')} +
+ +
e.stopPropagation()}> + +
+
+
+ )} + /> + +
+
+

{t('hostsDialog.httpHeaders')}

+ +
+
+ {Object.entries(form.watch('http_headers') || {}).map(([key, value]) => ( +
+ { + if (e.target.value !== key) { + const currentHeaders = { ...form.getValues('http_headers') } + const oldValue = currentHeaders[key] + delete currentHeaders[key] + currentHeaders[e.target.value] = oldValue + form.setValue('http_headers', currentHeaders, { + shouldDirty: true, + shouldTouch: true, + }) + } + }} + /> + { + const currentHeaders = { ...form.getValues('http_headers') } + currentHeaders[key] = e.target.value + form.setValue('http_headers', currentHeaders, { + shouldDirty: true, + shouldTouch: true, + }) + }} + /> + +
+ ))} +
+
+
+
+
+ + + +
+ + {t('hostsDialog.securitySettings')} +
+
+ +
+
+ ( + +
+ {t('hostsDialog.security')} + + + + + +

{t('hostsDialog.security.info')}

+
+
+
+ + +
+ )} + /> + + { + const infoContent = ( +
+

{t('hostsDialog.sni.info')}

+
+ ) + + return + }} + /> +
+ +
+ ( + + {t('hostsDialog.alpn')} + + + + + +
+ {['h3', 'h2', 'http/1.1'].map(protocol => { + const isSelected = field.value?.includes(protocol) + return ( +
{ + const currentValue = field.value || [] + const newValue = isSelected ? currentValue.filter((p: string) => p !== protocol) : [...currentValue, protocol] + field.onChange(newValue) + }} + className="flex cursor-pointer items-center gap-2 rounded-sm p-2 hover:bg-accent" + > +
+ {isSelected && } +
+ {protocol} +
+ ) + })} +
+
+
+ +
+ )} + /> + + ( + + {t('hostsDialog.fingerprint')} + + + + )} + /> +
+ + ( + field.onChange(!field.value)}> +
+ {t('hostsDialog.allowInsecure')} +
+ +
e.stopPropagation()}> + +
+
+
+ )} + /> + + ( + field.onChange(!field.value)}> +
+ {t('hostsDialog.useSniAsHost')} +
+ +
e.stopPropagation()}> + +
+
+
+ )} + /> + + ( + +
+ {t('hostsDialog.echConfigList')} + + + + + +

{t('hostsDialog.echConfigList.info')}

+
+
+
+ + + + +
+ )} + /> +
+
+
+ + + +
+ + {t('hostsDialog.transportSettingsAccordion')} +
+
+ +
+ +
+ + + XHTTP + XHTTP + + + gRPC + gRPC + + + KCP + KCP + + + TCP + TCP + + + WebSocket + WS + + +
+ + {/* XHTTP Settings */} + +
+ ( + + {t('hostsDialog.xhttp.mode')} + + + + )} + /> + + ( + field.onChange(!field.value)}> +
+ {t('hostsDialog.xhttp.noGrpcHeader')} +
+ +
e.stopPropagation()}> + +
+
+
+ )} + /> +
+ +
+ ( + + {t('hostsDialog.xhttp.xPaddingBytes')} + + + + + + )} + /> + + ( + + {t('hostsDialog.xhttp.scMaxEachPostBytes')} + + + + + + )} + /> + + ( + + {t('hostsDialog.xhttp.scMinPostsIntervalMs')} + + + + + + )} + /> +
+ +
+

{t('hostsDialog.xhttp.xmux')}

+
+ ( + + {t('hostsDialog.xhttp.maxConcurrency')} + + + + + + )} + /> + + ( + + {t('hostsDialog.xhttp.maxConnections')} + + + + + + )} + /> + + ( + + {t('hostsDialog.xhttp.cMaxReuseTimes')} + + + + + + )} + /> + + ( + + {t('hostsDialog.xhttp.cMaxLifetime')} + + + + + + )} + /> + + ( + + {t('hostsDialog.xhttp.hMaxRequestTimes')} + + + + + + )} + /> + + ( + + {t('hostsDialog.xhttp.hKeepAlivePeriod')} + + { + const value = e.target.value + field.onChange(value === '' ? null : parseInt(value, 10)) + }} + /> + + + + )} + /> + ( + +
+ {t('hostsDialog.xhttp.downloadSettings')} + + + + + +

{t('hostsDialog.xhttp.downloadSettingsInfo')}

+
+
+
+ + +
+ )} + /> +
+
+
+ + {/* gRPC Settings */} + +
+ ( + field.onChange(!field.value)}> +
+ {t('hostsDialog.grpc.multiMode')} +
+ +
e.stopPropagation()}> + +
+
+
+ )} + /> + + ( + + {t('hostsDialog.grpc.idleTimeout')} + + field.onChange(e.target.value ? Number(e.target.value) : 0)} value={field.value} /> + + + + )} + /> + + ( + + {t('hostsDialog.grpc.healthCheckTimeout')} + + field.onChange(e.target.value ? Number(e.target.value) : 0)} value={field.value} /> + + + + )} + /> + + ( + + {t('hostsDialog.grpc.permitWithoutStream')} + + field.onChange(e.target.value ? Number(e.target.value) : 0)} value={field.value} /> + + + + )} + /> + + ( + + {t('hostsDialog.grpc.initialWindowsSize')} + + field.onChange(e.target.value ? Number(e.target.value) : 0)} value={field.value} /> + + + + )} + /> +
+
+ + {/* KCP Settings */} + +
+ ( + + {t('hostsDialog.kcp.header')} + + + + )} + /> + + ( + + {t('hostsDialog.kcp.mtu')} + + field.onChange(e.target.value ? Number(e.target.value) : 0)} value={field.value} /> + + + + )} + /> + + ( + + {t('hostsDialog.kcp.tti')} + + field.onChange(e.target.value ? Number(e.target.value) : 0)} value={field.value} /> + + + + )} + /> + + ( + + {t('hostsDialog.kcp.uplinkCapacity')} + + field.onChange(e.target.value ? Number(e.target.value) : 0)} value={field.value} /> + + + + )} + /> + + ( + + {t('hostsDialog.kcp.downlinkCapacity')} + + field.onChange(e.target.value ? Number(e.target.value) : 0)} value={field.value} /> + + + + )} + /> + + ( + + {t('hostsDialog.kcp.congestion')} + + field.onChange(e.target.value ? Number(e.target.value) : 0)} value={field.value} /> + + + + )} + /> + + ( + + {t('hostsDialog.kcp.readBufferSize')} + + field.onChange(e.target.value ? Number(e.target.value) : 0)} value={field.value} /> + + + + )} + /> + + ( + + {t('hostsDialog.kcp.writeBufferSize')} + + field.onChange(e.target.value ? Number(e.target.value) : 0)} value={field.value} /> + + + + )} + /> +
+
+ + {/* TCP Settings */} + +
+ ( + + {t('hostsDialog.tcp.header')} + + + + )} + /> +
+ + {form.watch('transport_settings.tcp_settings.header') === 'http' && ( + <> +
+

{t('hostsDialog.tcp.request.title')}

+
+ ( + + {t('hostsDialog.tcp.request.version')} + + + + )} + /> + + ( + + {t('hostsDialog.tcp.request.method')} + + + + )} + /> +
+ + {/* Request Headers */} +
+
+

{t('hostsDialog.tcp.requestHeaders')}

+ +
+ + {/* Render request headers */} + {Object.entries(form.watch('transport_settings.tcp_settings.request.headers') || {}).map(([key, values]) => ( +
+ { + if (e.target.value !== key) { + const currentHeaders = { ...form.getValues('transport_settings.tcp_settings.request.headers') } + const oldValues = currentHeaders[key] + delete currentHeaders[key] + currentHeaders[e.target.value] = oldValues + form.setValue('transport_settings.tcp_settings.request.headers', currentHeaders, { + shouldDirty: true, + shouldTouch: true, + }) + } + }} + /> + { + const tcpHeaderValues = e.target.value.split(',').map(v => v.trim()) + const tcpHeaders = { ...form.getValues('transport_settings.tcp_settings.request.headers') } + tcpHeaders[key] = tcpHeaderValues + form.setValue('transport_settings.tcp_settings.request.headers', tcpHeaders, { + shouldDirty: true, + shouldTouch: true, + }) + }} + /> + +
+ ))} +
+
+ +
+

{t('hostsDialog.tcp.response.title')}

+
+ ( + + {t('hostsDialog.tcp.response.version')} + + + + )} + /> + + ( + + {t('hostsDialog.tcp.response.status')} + + + + + + )} + /> + + ( + + {t('hostsDialog.tcp.response.reason')} + + + + )} + /> +
+ + {/* Response Headers */} +
+
+

{t('hostsDialog.tcp.responseHeaders')}

+ +
+ + {/* Render response headers */} + {Object.entries(form.watch('transport_settings.tcp_settings.response.headers') || {}).map(([key, values]) => ( +
+ { + if (e.target.value !== key) { + const currentHeaders = { ...form.getValues('transport_settings.tcp_settings.response.headers') } + const oldValues = currentHeaders[key] + delete currentHeaders[key] + currentHeaders[e.target.value] = oldValues + form.setValue('transport_settings.tcp_settings.response.headers', currentHeaders, { + shouldDirty: true, + shouldTouch: true, + }) + } + }} + /> + { + const currentHeaders = { ...form.getValues('transport_settings.tcp_settings.response.headers') } + currentHeaders[key] = e.target.value.split(',').map(v => v.trim()) + form.setValue('transport_settings.tcp_settings.response.headers', currentHeaders, { + shouldDirty: true, + shouldTouch: true, + }) + }} + /> + +
+ ))} +
+
+ + )} +
+ + {/* WebSocket Settings */} + +
+ ( + + {t('hostsDialog.websocket.heartbeatPeriod')} + + field.onChange(e.target.value ? Number(e.target.value) : 0)} value={field.value} /> + + + + )} + /> +
+
+
+
+
+
+ + + +
+ + {t('hostsDialog.camouflagSettings')} +
+
+ + + + Xray + SingBox + + +
+ {/* Fragment Settings */} +
+
+

+ {t('hostsDialog.fragment.title')} + + + + + +
+

{t('hostsDialog.fragment.info')}

+

{t('hostsDialog.fragment.info.attention')}

+

{t('hostsDialog.fragment.info.examples')}

+

100-200,10-20,tlshello 100-200,10-20,1-3

+
+
+
+

+
+
+ ( + + {t('hostsDialog.fragment.packets')} + + + + + + )} + /> + ( + + {t('hostsDialog.fragment.length')} + + + + + + )} + /> + ( + + {t('hostsDialog.fragment.interval')} + + + + + + )} + /> +
+
+ + {/* Noise Settings */} +
+
+
+

{t('hostsDialog.noise.title')}

+ + + + + +
+

{t('hostsDialog.noise.info')}

+

{t('hostsDialog.noise.info.attention')}

+

{t('hostsDialog.noise.info.examples')}

+

+ rand:10-20,10-20 rand:10-20,10-20 &base64:7nQBAAABAAAAAAAABnQtcmluZwZtc2VkZ2UDbmV0AAABAAE=,10-25 +

+
+
+
+
+ +
+
+ {noiseSettings.map((_, index) => ( + + ))} + {noiseSettings.length === 0 &&
{t('hostsDialog.noise.noNoiseSettings')}
} +
+
+
+
+ +
+
+
+

{t('hostsDialog.fragment.title')}

+
+
+ ( + field.onChange(!field.value)}> +
+ {t('hostsDialog.fragment.fragment')} +
+ +
e.stopPropagation()}> + +
+
+
+ )} + /> + {form.watch('fragment_settings.sing_box.fragment') && ( + <> + ( + + {t('hostsDialog.fragment.fallbackDelay')} + + { + const value = e.target.value + field.onChange(value) + }} + title="Enter a number (e.g., 100)" + /> + + + + )} + /> + ( + field.onChange(!field.value)}> +
+ {t('hostsDialog.fragment.recordFragment')} +
+ +
e.stopPropagation()}> + +
+
+
+ )} + /> + + )} +
+
+
+
+
+
+
+ + +
+ + {t('hostsDialog.muxSettings')} +
+
+ +
+ + + Xray + Sing-box + Clash + + + {/* Xray Settings */} + +
+ ( + field.onChange(!field.value)}> +
+ {t('hostsDialog.enableMux')} +
+ +
e.stopPropagation()}> + { + field.onChange(checked) + if (checked) { + // Disable other mux settings when enabling this one + form.setValue('mux_settings.sing_box.enable', false) + form.setValue('mux_settings.clash.enable', false) + } + }} + /> +
+
+
+ )} + /> + {form.watch('mux_settings.xray.enable') === true ? ( +
+ ( + + {t('hostsDialog.concurrency')} + + field.onChange(e.target.value ? parseInt(e.target.value) : null)} /> + + + + )} + /> + + ( + + {t('hostsDialog.xudpConcurrency')} + + field.onChange(e.target.value ? parseInt(e.target.value) : null)} /> + + + + )} + /> + + ( + + {t('hostsDialog.xudpProxy443')} + + + + )} + /> +
+ ) : null} +
+
+ + {/* Sing-box Settings */} + +
+ ( + field.onChange(!field.value)}> +
+ {t('hostsDialog.enableMux')} +
+ +
e.stopPropagation()}> + { + field.onChange(checked) + if (checked) { + // Disable other mux settings when enabling this one + form.setValue('mux_settings.xray.enable', false) + form.setValue('mux_settings.clash.enable', false) + } + }} + /> +
+
+
+ )} + /> + {form.watch('mux_settings.sing_box.enable') === true ? ( + <> + ( + + {t('hostsDialog.protocol')} + + + + )} + /> + +
+ ( + + {t('hostsDialog.maxConnections')} + + field.onChange(e.target.value ? parseInt(e.target.value) : 0)} /> + + + + )} + /> + + ( + + {t('hostsDialog.minStreams')} + + field.onChange(e.target.value ? parseInt(e.target.value) : 0)} /> + + + + )} + /> + + ( + + {t('hostsDialog.maxStreams')} + + field.onChange(e.target.value ? parseInt(e.target.value) : 0)} /> + + + + )} + /> +
+ +
+

{t('hostsDialog.brutal.title')}

+ ( + field.onChange(!field.value)}> +
+ {t('hostsDialog.brutal.enable')} +
+ +
e.stopPropagation()}> + +
+
+
+ )} + /> + {form.watch('mux_settings.sing_box.brutal.enable') === true ? ( +
+ ( + + {t('hostsDialog.brutal.upMbps')} + + field.onChange(e.target.value ? parseInt(e.target.value) : 0)} /> + + + + )} + /> + + ( + + {t('hostsDialog.brutal.downMbps')} + + field.onChange(e.target.value ? parseInt(e.target.value) : 0)} /> + + + + )} + /> +
+ ) : null} +
+ + ( + field.onChange(!field.value)}> +
+ {t('hostsDialog.padding')} +
+ +
e.stopPropagation()}> + +
+
+
+ )} + /> + + ) : null} +
+
+ + {/* Clash Settings */} + +
+ ( + field.onChange(!field.value)}> +
+ {t('hostsDialog.enableMux')} +
+ +
e.stopPropagation()}> + { + field.onChange(checked) + if (checked) { + // Disable other mux settings when enabling this one + form.setValue('mux_settings.xray.enable', false) + form.setValue('mux_settings.sing_box.enable', false) + } + }} + /> +
+
+
+ )} + /> + {form.watch('mux_settings.clash.enable') === true ? ( + <> + ( + + {t('hostsDialog.protocol')} + + + + )} + /> + +
+ ( + + {t('hostsDialog.maxConnections')} + + field.onChange(e.target.value ? parseInt(e.target.value) : null)} /> + + + + )} + /> + + ( + + {t('hostsDialog.minStreams')} + + field.onChange(e.target.value ? parseInt(e.target.value) : null)} /> + + + + )} + /> + + ( + + {t('hostsDialog.maxStreams')} + + field.onChange(e.target.value ? parseInt(e.target.value) : null)} /> + + + + )} + /> +
+ +
+

{t('hostsDialog.brutal.title')}

+ ( + field.onChange(!field.value)}> +
+ {t('hostsDialog.brutal.enable')} +
+ +
e.stopPropagation()}> + +
+
+
+ )} + /> + {form.watch('mux_settings.clash.brutal.enable') === true ? ( +
+ ( + + {t('hostsDialog.brutal.upMbps')} + + field.onChange(e.target.value ? parseInt(e.target.value) : null)} /> + + + + )} + /> + + ( + + {t('hostsDialog.brutal.downMbps')} + + field.onChange(e.target.value ? parseInt(e.target.value) : null)} /> + + + + )} + /> +
+ ) : null} +
+ + ( + field.onChange(!field.value)}> +
+ {t('hostsDialog.padding')} +
+ +
e.stopPropagation()}> + +
+
+
+ )} + /> + + ( + field.onChange(!field.value)}> +
+ {t('hostsDialog.statistic')} +
+ +
e.stopPropagation()}> + +
+
+
+ )} + /> + + ( + field.onChange(!field.value)}> +
+ {t('hostsDialog.onlyTcp')} +
+ +
e.stopPropagation()}> + +
+
+
+ )} + /> + + ) : null} +
+
+
+
+
+
+
+
+
+ + + {editingHost ? t('modify') : t('create')} + +
+
+ +
+
+ ) +} + +export default HostModal diff --git a/dashboard/src/components/dialogs/NodeModal.tsx b/dashboard/src/components/dialogs/NodeModal.tsx new file mode 100644 index 000000000..e8f06fb4a --- /dev/null +++ b/dashboard/src/components/dialogs/NodeModal.tsx @@ -0,0 +1,719 @@ +import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog' +import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '@/components/ui/form' +import { Input } from '@/components/ui/input' +import { Button } from '@/components/ui/button' +import { Switch } from '@/components/ui/switch' +import { useTranslation } from 'react-i18next' +import { UseFormReturn } from 'react-hook-form' +import { + useCreateNode, + useModifyNode, + NodeConnectionType, + useGetAllCores, + CoreResponse, + getNode, +} from '@/service/api' +import { toast } from 'sonner' +import { z } from 'zod' +import { cn } from '@/lib/utils' +import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select' +import { Textarea } from '@/components/ui/textarea' +import { queryClient } from '@/utils/query-client' +import useDirDetection from '@/hooks/use-dir-detection' +import { useState, useEffect } from 'react' +import { Loader2, Settings, RefreshCw } from 'lucide-react' +import { v4 as uuidv4, v5 as uuidv5, v6 as uuidv6, v7 as uuidv7 } from 'uuid' +import { LoaderButton } from '../ui/loader-button' +import useDynamicErrorHandler from "@/hooks/use-dynamic-errors.ts"; +import { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from "@/components/ui/accordion" + +export const nodeFormSchema = z.object({ + name: z.string().min(1, 'Name is required'), + address: z.string().min(1, 'Address is required'), + port: z.number().min(1, 'Port is required'), + usage_coefficient: z.number().optional(), + connection_type: z.enum([NodeConnectionType.grpc, NodeConnectionType.rest]), + server_ca: z.string().min(1, 'Server CA is required'), + keep_alive: z.number().min(0, 'Keep alive must be 0 or greater'), + keep_alive_unit: z.enum(['seconds', 'minutes', 'hours']).default('seconds'), + max_logs: z.number().min(1, 'Max logs is required'), + api_key: z.string().min(1, 'API key is required'), + core_config_id: z.number().min(1, 'Core configuration is required'), + gather_logs: z.boolean().default(true), +}) + +export type NodeFormValues = z.infer + +interface NodeModalProps { + isDialogOpen: boolean + onOpenChange: (open: boolean) => void + form: UseFormReturn + editingNode: boolean + editingNodeId?: number +} + +type ConnectionStatus = 'idle' | 'success' | 'error' | 'checking' + +export default function NodeModal({ isDialogOpen, onOpenChange, form, editingNode, editingNodeId }: NodeModalProps) { + const { t } = useTranslation() + const dir = useDirDetection() + const addNodeMutation = useCreateNode() + const modifyNodeMutation = useModifyNode() + const handleError = useDynamicErrorHandler(); + const { data: cores } = useGetAllCores() + const [statusChecking, setStatusChecking] = useState(false) + const [connectionStatus, setConnectionStatus] = useState('idle') + const [errorDetails, setErrorDetails] = useState(null) + const [autoCheck, setAutoCheck] = useState(false) + const [showErrorDetails, setShowErrorDetails] = useState(false) + const [debouncedValues, setDebouncedValues] = useState(null) + + // Reset status when modal opens/closes + useEffect(() => { + if (isDialogOpen) { + setConnectionStatus('idle') + setErrorDetails(null) + setAutoCheck(true) + } + }, [isDialogOpen]) + + // Debounce form values changes + useEffect(() => { + const values = form.getValues() + const timer = setTimeout(() => { + setDebouncedValues(values) + }, 1000) // Wait 1 second after typing stops + + return () => clearTimeout(timer) + }, [form.watch('name'), form.watch('address'), form.watch('port'), form.watch('api_key')]) + + // Auto-check connection when debounced values change and are valid + useEffect(() => { + if (!isDialogOpen || !autoCheck || editingNode || !debouncedValues) return + + const { name, address, port, api_key } = debouncedValues + if (name && address && port && api_key) { + checkNodeStatus() + } + }, [debouncedValues]) + + // Start/stop polling when editing a node + useEffect(() => { + if (editingNode && isDialogOpen && editingNodeId) { + // Start polling immediately + checkNodeStatus() + } + }, [editingNode, isDialogOpen, editingNodeId]) + + // Initialize form with node data when editing + useEffect(() => { + if (editingNode && editingNodeId) { + const fetchNodeData = async () => { + try { + const nodeData = await getNode(editingNodeId) + + // Set form values with the fetched node data + form.reset({ + name: nodeData.name, + address: nodeData.address, + port: nodeData.port, + usage_coefficient: nodeData.usage_coefficient, + connection_type: nodeData.connection_type, + server_ca: nodeData.server_ca, + keep_alive: nodeData.keep_alive, + max_logs: nodeData.max_logs, + api_key: (nodeData.api_key as string) || '', + core_config_id: nodeData.core_config_id || cores?.cores?.[0]?.id, + gather_logs: nodeData.gather_logs ?? true, + }) + } catch (error) { + console.error('Error fetching node data:', error) + toast.error(t('nodes.fetchFailed')) + } + } + + fetchNodeData() + } else { + // For new nodes, set default values + form.reset({ + name: '', + address: '', + port: 62050, + usage_coefficient: 1, + connection_type: NodeConnectionType.grpc, + server_ca: '', + keep_alive: 60, + keep_alive_unit: 'seconds', + max_logs: 1000, + api_key: '', + core_config_id: cores?.cores?.[0]?.id, + gather_logs: true, + }) + } + }, [editingNode, editingNodeId, isDialogOpen]) + + const checkNodeStatus = async () => { + // Get current form values + const values = form.getValues() + + // Validate required fields before checking + if (!values.name || !values.address || !values.port) { + return + } + + setStatusChecking(true) + setConnectionStatus('checking') + setErrorDetails(null) + + try { + if (editingNode && editingNodeId) { + // For editing mode, use the node's endpoint directly + const node = await getNode(editingNodeId) + if (!node) { + throw new Error('No node data received') + } + + if (node.status === 'connected') { + setConnectionStatus('success') + } else if (node.status === 'error') { + setConnectionStatus('error') + setErrorDetails(node.message || 'Node has an error') + } else { + setConnectionStatus('idle') + setErrorDetails(null) + } + } else { + // For new nodes, we can't check status before creation + setConnectionStatus('idle') + setErrorDetails(t('nodeModal.statusMessages.checkUnavailableForNew')) + } + } catch (error: any) { + console.error('Node status check failed:', error) + setConnectionStatus('error') + setErrorDetails(error?.message || 'Failed to connect to node. Please check your connection settings.') + } finally { + setStatusChecking(false) + } + } + + + const onSubmit = async (values: NodeFormValues) => { + try { + // Convert keep_alive to seconds based on unit + const keepAliveInSeconds = values.keep_alive_unit === 'minutes' ? values.keep_alive * 60 : values.keep_alive_unit === 'hours' ? values.keep_alive * 3600 : values.keep_alive + + const nodeData = { + ...values, + keep_alive: keepAliveInSeconds, + // Remove the unit since backend doesn't need it + keep_alive_unit: undefined, + } + + let nodeId: number | undefined + + if (editingNode && editingNodeId) { + await modifyNodeMutation.mutateAsync({ + nodeId: editingNodeId, + data: nodeData, + }) + nodeId = editingNodeId + toast.success( + t('nodes.editSuccess', { + name: values.name, + defaultValue: 'Node «{name}» has been updated successfully', + }), + ) + } else { + const result = await addNodeMutation.mutateAsync({ + data: nodeData, + }) + nodeId = result?.id + toast.success( + t('nodes.createSuccess', { + name: values.name, + defaultValue: 'Node «{name}» has been created successfully', + }), + ) + } + + // Check status after successful creation/editing + if (nodeId) { + setStatusChecking(true) + try { + const node = await getNode(nodeId) + if (node && node.status === 'connected') { + setConnectionStatus('success') + } else if (node && node.status === 'error') { + setConnectionStatus('error') + setErrorDetails(node?.message || 'Node has an error') + } else { + setConnectionStatus('idle') + setErrorDetails(null) + } + } catch (error: any) { + setConnectionStatus('error') + setErrorDetails(error?.message || 'Failed to check node status') + } finally { + setStatusChecking(false) + } + } + + // Invalidate nodes queries after successful operation + queryClient.invalidateQueries({ queryKey: ['/api/nodes'] }) + onOpenChange(false) + form.reset() + } catch (error: any) { + const fields = ['name', 'address', 'port', 'core_config_id', 'api_key', 'max_logs', 'keep_alive_unit', 'keep_alive', 'server_ca', 'connection_type', ''] + handleError({ error, fields, form, contextKey: "nodes" }) + + } + } + + return ( + + e.preventDefault()}> + + {editingNode ? t('editNode.title') : t('nodeModal.title')} +

{editingNode ? t('nodes.prompt') : t('nodeModal.description')}

+
+ + {/* Status Check Results - Positioned at the top of the modal */} +
+
+
+
+ + {connectionStatus === 'success' + ? t('nodeModal.status.connected') + : connectionStatus === 'error' + ? t('nodeModal.status.error') + : connectionStatus === 'checking' + ? t('nodeModal.status.connecting') + : t('nodeModal.status.disabled')} + + {connectionStatus === 'error' && ( + + )} +
+ +
+ {showErrorDetails && connectionStatus === 'error' && ( +
+ {errorDetails} +
+ )} +
+ +
+ +
+
+
+ ( + + {t('nodeModal.name')} + + + + + + )} + /> + +
+ ( + + {t('nodeModal.address')} + + + + + + )} + /> + + ( + + {t('nodeModal.port')} + + field.onChange(parseInt(e.target.value))} + /> + + + + )} + /> +
+ + ( + + {t('nodeModal.coreConfig')} + + + + )} + /> + + { + const [uuidVersion, setUuidVersion] = useState<'v4' | 'v5' | 'v6' | 'v7'>('v4') + + const generateUUID = () => { + switch (uuidVersion) { + case 'v4': + field.onChange(uuidv4()) + break + case 'v5': + // Using a fixed namespace for v5 UUIDs + const namespace = '6ba7b810-9dad-11d1-80b4-00c04fd430c8' + field.onChange(uuidv5(field.value || 'default', namespace)) + break + case 'v6': + field.onChange(uuidv6()) + break + case 'v7': + field.onChange(uuidv7()) + break + } + } + + return ( + + {t('nodeModal.apiKey')} + +
+ field.onChange(e.target.value)} + /> +
+ + +
+
+
+ +
+ ) + }} + /> + + + + +
+ + {t('settings.notifications.advanced.title')} +
+
+ +
+
+ ( + + {t('nodeModal.usageRatio')} + + field.onChange(parseFloat(e.target.value))} + /> + + + + )} + /> + + ( + + {t('nodes.maxLogs')} + + field.onChange(parseInt(e.target.value))} + /> + + + + )} + /> +
+ + ( + + {t('nodeModal.connectionType')} + + + + )} + /> + + { + const [displayValue, setDisplayValue] = useState(field.value?.toString() || '') + const [unit, setUnit] = useState<'seconds' | 'minutes' | 'hours'>('seconds') + + const convertToSeconds = (value: number, fromUnit: 'seconds' | 'minutes' | 'hours') => { + switch (fromUnit) { + case 'minutes': + return value * 60 + case 'hours': + return value * 3600 + default: + return value + } + } + + const convertFromSeconds = (seconds: number, toUnit: 'seconds' | 'minutes' | 'hours') => { + switch (toUnit) { + case 'minutes': + return Math.floor(seconds / 60) + case 'hours': + return Math.floor(seconds / 3600) + default: + return seconds + } + } + + return ( + + {t('nodeModal.keepAlive')} +
+

{t('nodeModal.keepAliveDescription')}

+
+ + { + const value = e.target.value + setDisplayValue(value) + const numValue = parseInt(value) || 0 + field.onChange(convertToSeconds(numValue, unit)) + }} + /> + + +
+
+ +
+ ) + }} + /> + + ( + +
+ + {t('nodeModal.gatherLogs')} + +

+ {t('nodeModal.gatherLogsDescription')} +

+
+ + + +
+ )} + /> +
+
+
+
+
+ ( + + {t('nodeModal.certificate')} + +

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 literal 0 HcmV?d00001 diff --git a/dashboard/public/statics/favicon/logo-pwa.png b/dashboard/public/statics/favicon/logo-pwa.png new file mode 100644 index 0000000000000000000000000000000000000000..92dd50d35c7f06d326d990052b7bb1a06ab4bb12 GIT binary patch literal 283405 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 literal 0 HcmV?d00001 diff --git a/dashboard/public/statics/favicon/logo.png b/dashboard/public/statics/favicon/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a933b0a31a7dddc6c63e4cb898f4a5c30485890e GIT binary patch literal 263181 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�v`>%*+rjVVPn&@Ji7v$N!Wa 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 z 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 literal 0 HcmV?d00001 diff --git a/dashboard/public/statics/favicon/mstile-150x150.png b/dashboard/public/statics/favicon/mstile-150x150.png new file mode 100644 index 0000000000000000000000000000000000000000..a2fbd5219ffc7483cdc69d22d2505fc47b6a2948 GIT binary patch literal 11714 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 Y50uPA0#d;?SO5S307*qoM6N<$f?LhNzyJUM literal 0 HcmV?d00001 diff --git a/dashboard/public/statics/favicon/mstile-310x310.png b/dashboard/public/statics/favicon/mstile-310x310.png new file mode 100644 index 0000000000000000000000000000000000000000..31419e61997360cbbafb34f307b6d3aab900d936 GIT binary patch literal 31771 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 literal 0 HcmV?d00001 diff --git a/dashboard/public/statics/locales/en.json b/dashboard/public/statics/locales/en.json new file mode 100644 index 000000000..2f098e7fa --- /dev/null +++ b/dashboard/public/statics/locales/en.json @@ -0,0 +1,1502 @@ +{ + "pasargaurd": "PasarGuard", + "dashboard": "Dashboard", + "master": "All Nodes", + "dashboardDescription": "PasarGuard Management Dashboard", + "active": "active", + "online": "Online", + "platform": "Platform", + "allStatuses": "All Statuses", + "status": "Status", + "statistics": "Statistics", + "selectAll": "Select All", + "deselectAll": "Deselect All", + "hosts": "Hosts", + "success": "Success", + "error": "Error", + "username": "Username", + "modifying": "Modifying...", + "removing": "Removing...", + "creating": "Creating", + "monitorUsers": "Monitor Users", + "alltime": "All time", + "coreUsername": "Core Username", + "nodes": { + "title": "Nodes", + "description": "Manage your nodes", + "addNode": "Create Node", + "editNode": "Modify Node", + "deleteNode": "Remove Node", + "nodeName": "Node Name", + "nodeAddress": "Node Address", + "nodePort": "Node Port", + "usageCoefficient": "Usage Coefficient", + "connectionType": "Connection Type", + "serverCA": "Server CA", + "keepAlive": "Keep Alive", + "maxLogs": "Max Logs", + "maxLogsPlaceHolder": "Enter max logs (in seconds)", + "status": "Status", + "actions": "Actions", + "connected": "Connected", + "disconnected": "Disconnected", + "disabled": "Disabled", + "enabled": "Enabled", + "createSuccess": "Node «{{name}}» has been created successfully", + "createFailed": "Failed to create node «{{name}}»", + "editSuccess": "Node «{{name}}» has been modified successfully", + "editFailed": "Failed to modify node «{{name}}»", + "deleteSuccess": "Node «{{name}}» has been removed successfully", + "deleteFailed": "Failed to remove node «{{name}}»", + "enableSuccess": "Node «{{name}}» has been enabled successfully", + "enableFailed": "Failed to enable node «{{name}}»", + "disableSuccess": "Node «{{name}}» has been disabled successfully", + "disableFailed": "Failed to disable node «{{name}}»", + "certificate": "Certificate", + "certificateCopied": "Certificate copied to clipboard", + "certificateDownloaded": "Certificate downloaded successfully", + "certificateDescription": "To set up the node, you need to configure this certificate to establish a secure connection between the main server and the node", + "selectNode": "Select a node", + "noNodes": "No nodes configured", + "noNodesDescription": "Master Panel doesn't have any cores configured. You need to add and configure a node from", + "noNodesDescription2": "connect and configure it to the panel.", + "logs": { + "title": "Logs", + "description": "View and monitor node logs", + "noLogs": "No logs available", + "timestamps": "Timestamps", + "search": "Search logs", + "filter": "Filter Logs", + "debug": "Debug", + "info": "Info", + "warning": "Warning", + "error": "Error", + "download": "Download logs", + "paused": "Logs paused", + "resume": "Resume", + "pause": "Pause", + "messagesBuffered": "messages buffered", + "linesLabel": "Lines:", + "linesCount": "{{count}} lines", + "sinceLabel": "Since:", + "all": "All", + "timeFilters": { + "all": "All time", + "1m": "1 minute", + "5m": "5 minutes", + "15m": "15 minutes", + "30m": "30 minutes", + "1h": "1 hour", + "2h": "2 hours" + } + } + }, + "groups": "Groups", + "documentation": "Documentation", + "discussionGroup": "Discussion Group", + "github": "GitHub", + "community": "Community", + "supportUs": "Support Us", + "manageHosts": "Manage and control hosts", + "manageSettings": "Manage and control settings", + "settings": { + "title": "Settings", + "general": { + "title": "General", + "description": "Configure basic settings for your system", + "loadError": "Failed to load general settings. Please try again.", + "saveSuccess": "General settings saved successfully", + "saveFailed": "Failed to save general settings", + "cancelSuccess": "Changes cancelled and original settings restored", + "defaultFlow": { + "title": "Default VLESS Flow", + "description": "Autofill the flow field for new VLESS users" + }, + "defaultMethod": { + "title": "Default Shadowsocks Method", + "description": "Autofill the encryption method for new Shadowsocks users" + }, + "errorLoadingSettings": "Error loading settings" + }, + "notifications": { + "title": "Notifications", + "description": "Configure notification settings and manage alert preferences for your system", + "loadError": "Failed to load notification settings. Please try again.", + "saveSuccess": "Notification settings saved successfully", + "saveFailed": "Failed to save notification settings", + "cancelSuccess": "Changes cancelled and original settings restored", + "filterTitle": "Filter Notifications", + "filterDescription": "Select events that should trigger notifications for important system activities", + "types": { + "admin": "Admin", + "core": "Core", + "group": "Groups", + "host": "Hosts", + "login": "Login", + "node": "Nodes", + "user": "Users", + "userTemplate": "Templates", + "daysLeft": "Expiration", + "percentageReached": "Usage" + }, + "telegram": { + "title": "Telegram", + "description": "Configure Telegram notifications for important system activities", + "apiToken": "Bot API Token", + "adminId": "Admin Chat ID", + "channelId": "Channel ID", + "topicId": "Topic ID" + }, + "discord": { + "title": "Discord", + "description": "Configure Discord notifications for important system activities", + "webhookUrl": "Webhook URL" + }, + "advanced": { + "title": "Advanced Settings", + "description": "Configure advanced notification settings, including retry policies and proxy configurations", + "maxRetries": "Max Retries", + "proxyUrl": "Proxy URL" + } + }, + "subscriptions": { + "title": "Subscriptions", + "description": "Configure subscription URLs, update intervals, and client-specific rules", + "loadError": "Failed to load subscription settings", + "saveSuccess": "Subscription settings saved successfully", + "saveFailed": "Failed to save subscription settings", + "cancelSuccess": "Changes cancelled and original settings restored", + "general": { + "title": "General Settings", + "description": "Basic subscription configuration options", + "urlPrefix": "URL Prefix", + "urlPrefixPlaceholder": "sub", + "urlPrefixDescription": "Base URL for subscription links", + "updateInterval": "Update Interval (hours)", + "updateIntervalDescription": "How often clients should check for updates", + "supportUrl": "Support URL", + "supportUrlPlaceholder": "https://support.example.com", + "supportUrlDescription": "URL for user support and help", + "profileTitle": "Profile Title", + "profileTitlePlaceholder": "My VPN Service", + "profileTitleDescription": "Display name for the subscription profile", + "hostStatusFilter": "Host Status Filter", + "hostStatusFilterDescription": "Filter hosts based on their status" + }, + "rules": { + "title": "Subscription Rules", + "description": "Configure client-specific subscription rules and formats", + "addRule": "Add Rule", + "removeRule": "Remove Rule", + "pattern": "Pattern", + "patternPlaceholder": "Enter pattern (e.g., user-agent pattern)", + "patternDescription": "Pattern to match against client requests", + "target": "Target Format", + "targetDescription": "Configuration format to serve for this pattern", + "noRules": "No rules configured. Add rules to customize subscription behavior for different clients." + }, + "formats": { + "title": "Manual Subscription Formats", + "description": "Enable or disable specific subscription formats for manual requests", + "links": "Links", + "linksDescription": "Plain text subscription links", + "linksBase64": "Links (Base64)", + "linksBase64Description": "Base64 encoded subscription links", + "xray": "Xray", + "xrayDescription": "Xray configuration format", + "singBox": "Sing-box", + "singBoxDescription": "Sing-box configuration format", + "clash": "Clash", + "clashDescription": "Clash configuration format", + "clashMeta": "Clash Meta", + "clashMetaDescription": "Clash Meta configuration format", + "outline": "Outline", + "outlineDescription": "Outline VPN configuration format" + }, + "configFormats": { + "links": "Links", + "links_base64": "Links (Base64)", + "xray": "Xray", + "sing_box": "Sing-box", + "clash": "Clash", + "clash_meta": "Clash Meta", + "outline": "Outline", + "block": "Block" + } + }, + "telegram": { + "title": "Telegram", + "description": "Configure Telegram bot integration and related settings for your system", + "loadError": "Failed to load Telegram settings. Please try again.", + "saveSuccess": "Telegram settings saved successfully", + "saveFailed": "Failed to save Telegram settings", + "cancelSuccess": "Changes cancelled and original Telegram settings restored", + "general": { + "title": "General Settings", + "description": "Basic Telegram bot configuration and connection settings", + "enable": "Enable Telegram Bot", + "enableDescription": "Enable or disable Telegram bot functionality for your system", + "token": "Bot API Token", + "tokenPlaceholder": "Enter your Telegram bot token", + "tokenDescription": "Bot token obtained from @BotFather on Telegram", + "webhookUrl": "Webhook URL", + "webhookUrlPlaceholder": "https://your-domain.com/webhook", + "webhookUrlDescription": "URL where Telegram will send updates", + "webhookSecret": "Webhook Secret", + "webhookSecretPlaceholder": "Enter webhook secret", + "webhookSecretDescription": "Secret token for webhook security", + "method": "Connection Method", + "methodPlaceholder": "Select connection method", + "methodDescription": "Choose how the bot receives updates from Telegram", + "webhook": "Webhook", + "longPolling": "Long Polling", + "proxyUrl": "Proxy URL", + "proxyUrlPlaceholder": "socks5://proxy.example.com:1080", + "proxyUrlDescription": "Proxy URL for Telegram API connections (optional)" + }, + "advanced": { + "title": "Advanced Settings", + "description": "Advanced Telegram bot features and configurations", + "miniAppLogin": "Enable Mini App Login", + "miniAppLoginDescription": "Allow users to log in through Telegram mini apps", + "miniAppUrl": "Mini App URL", + "miniAppUrlPlaceholder": "Enter the Mini App URL (optional)", + "miniAppUrlDescription": "The URL for your Telegram Mini App. Leave empty if not used.", + "forAdminsOnly": "For Admins Only", + "forAdminsOnlyDescription": "Restrict bot access to administrators only" + } + }, + "discord": { + "title": "Discord", + "description": "Configure Discord bot integration and related settings for your system", + "loadError": "Failed to load Discord settings. Please try again.", + "saveSuccess": "Discord settings saved successfully", + "saveFailed": "Failed to save Discord settings", + "cancelSuccess": "Changes cancelled and original Discord settings restored", + "general": { + "title": "General Settings", + "description": "Basic Discord bot configuration and connection settings", + "enable": "Enable Discord Bot", + "enableDescription": "Enable or disable Discord bot functionality for your system", + "token": "Bot Token", + "tokenPlaceholder": "Enter your Discord bot token", + "tokenDescription": "Bot token obtained from Discord Developer Portal", + "proxyUrl": "Proxy URL", + "proxyUrlPlaceholder": "socks5://proxy.example.com:1080", + "proxyUrlDescription": "Proxy URL for Discord API connections (optional)" + } + }, + "webhook": { + "title": "Webhook", + "description": "Configure webhook notifications and endpoint settings for your system", + "loadError": "Failed to load webhook settings. Please try again.", + "saveSuccess": "Webhook settings saved successfully", + "saveFailed": "Failed to save webhook settings", + "cancelSuccess": "Changes cancelled and original webhook settings restored", + "general": { + "title": "General Settings", + "description": "Basic webhook configuration and connection settings", + "enable": "Enable Webhooks", + "enableDescription": "Enable or disable webhook notifications for your system", + "timeout": "Timeout (seconds)", + "timeoutDescription": "Request timeout for webhook calls (1-300 seconds)", + "recurrent": "Retry Attempts", + "recurrentDescription": "Number of retry attempts for failed webhooks (1-24)", + "proxyUrl": "Proxy URL", + "proxyUrlPlaceholder": "http://proxy.example.com:8080", + "proxyUrlDescription": "Proxy URL for webhook requests (optional)" + }, + "webhooks": { + "title": "Webhook Endpoints", + "description": "Configure webhook URLs and authentication", + "add": "Add Webhook", + "addFirst": "Add First Webhook", + "webhook": "Webhook", + "empty": "No webhooks configured. Add your first webhook endpoint.", + "name": "Name", + "namePlaceholder": "My Webhook", + "url": "URL", + "secret": "Secret", + "secretPlaceholder": "Enter webhook secret" + }, + "triggers": { + "daysLeft": { + "title": "Days Left Notifications", + "description": "Notify when user accounts have specific days remaining", + "empty": "No triggers set" + }, + "usagePercent": { + "title": "Usage Percentage Notifications", + "description": "Notify when users reach specific usage percentages", + "empty": "No triggers set" + } + } + }, + "cleanup": { + "title": "Cleanup", + "description": "Manage expired accounts and reset data usage for system maintenance", + "loadError": "Failed to load cleanup settings. Please try again.", + "saveSuccess": "Cleanup operation completed successfully", + "saveFailed": "Failed to complete cleanup operation", + "cancelSuccess": "Cleanup operation cancelled", + "expiredUsers": { + "title": "Delete Expired Accounts", + "description": "Remove accounts that have expired within a specific date range", + "expiredAfter": "Expired After", + "expiredBefore": "Expired Before", + "expiredAfterPlaceholder": "Select start date", + "expiredBeforePlaceholder": "Select end date", + "dateRange": "Date Range", + "deleteExpired": "Delete Expired", + "deleting": "Deleting...", + "deleteSuccess": "{{count}} expired accounts deleted successfully", + "deleteFailed": "Failed to delete expired accounts", + "confirmDelete": "Delete Expired Accounts", + "confirmDeleteMessage": "Are you sure you want to delete all expired accounts in the selected date range? This action cannot be undone.", + "noDateSelected": "Please select at least one date", + "selectDateRange": "Select the date range for expired accounts to delete (only past dates are selectable)" + }, + "resetUsage": { + "title": "Reset All Data Usage", + "description": "Reset data usage for all accounts in the system", + "resetAll": "Reset All Usage", + "resetting": "Resetting...", + "resetSuccess": "All data usage reset successfully", + "resetFailed": "Failed to reset data usage", + "confirmReset": "Reset All Data Usage", + "confirmResetMessage": "Are you sure you want to reset data usage for all accounts? This action cannot be undone.", + "warning": "This will reset data usage for ALL accounts in the system" + }, + "clearUsageData": { + "title": "Clear Usage Data", + "description": "Permanently delete usage data from selected database tables", + "selectTable": "Select Table", + "selectTablePlaceholder": "Choose a table to clear", + "noTableSelected": "Please select a table to clear", + "dataAfter": "Data After", + "dataBefore": "Data Before", + "dataAfterPlaceholder": "Select start date", + "dataBeforePlaceholder": "Select end date", + "selectDateRange": "Select date range to filter data by creation time (optional - leave blank to clear all data)", + "clearData": "Clear Data", + "clearing": "Clearing...", + "clearSuccess": "Successfully cleared data from {{table}}", + "clearFailed": "Failed to clear usage data", + "confirmClear": "Confirm Clear Data", + "confirmClearMessage": "Are you sure you want to permanently delete all data from the {{table}} table? This action cannot be undone.", + "warning": "Warning: This will permanently delete all usage data from the selected table. This action cannot be undone.", + "tables": { + "nodeUserUsages": "Node User Usages", + "userUsages": "User Usages" + } + } + }, + "theme": { + "title": "Theme", + "description": "Customize your application theme", + "light": "Light", + "dark": "Dark", + "system": "System", + "selectTheme": "Select theme", + "themeSaved": "Theme saved successfully", + "themeChanged": "Theme changed successfully", + "visitThemePage": "Visit theme page to customize further", + "radiusSaved": "Border radius updated successfully", + "mode": "Mode", + "color": "Color", + "radius": "Border Radius", + "zinc": "Zinc", + "rose": "Rose", + "blue": "Blue", + "green": "Green", + "violet": "Violet", + "orange": "Orange", + "yellow": "Yellow", + "default": "Default", + "red": "Red", + "modeDescription": "Choose how the interface should appear", + "colorDescription": "Select your preferred color scheme", + "radiusDescription": "Adjust the roundness of UI elements", + "lightDescription": "Bright and clean", + "darkDescription": "Easy on the eyes", + "systemDescription": "Matches device", + "preview": "Live Preview", + "previewDescription": "See how your theme settings look in real-time", + "dashboardPreview": "Dashboard Preview", + "dashboardDescription": "Monitor system performance and manage user accounts", + "currentTheme": "Current theme", + "sampleInput": "Sample input", + "primaryButton": "Primary Button", + "resetToDefaults": "Reset to defaults", + "resetDescription": "Restore all theme settings to their default values", + "resetting": "Resetting...", + "reset": "Reset", + "resetSuccess": "Theme reset to default settings", + "resetFailed": "Failed to reset theme settings", + "radiusNone": "None", + "radiusSmall": "Small", + "radiusMedium": "Medium", + "radiusLarge": "Large" + } + }, + "saving": "Saving...", + "general": "General", + "core": "Core Configs", + "activeUsers": "Active Users", + "apply": "Apply", + "cancel": "Cancel", + "created": "Created", + "by": "by", + "ip": "IP", + "admin": "Admin", + "sudo": "Sudo", + "save": "Save", + "test": "Test", + "testing": "Testing", + "confirm": "Confirm", + "admins": { + "title": "Admins", + "description": "Manage system administrators", + "createAdmin": "Create Admin", + "editAdmin": "Modify Admin", + "deleteAdmin": "Remove Admin", + "username": "Username", + "password": "Password", + "isSudo": "Super Admin", + "createdAt": "Created At", + "actions": "Actions", + "createSuccess": "Admin «{{name}}» has been created successfully", + "createFailed": "Failed to create admin «{{name}}»", + "editSuccess": "Admin «{{name}}» has been modified successfully", + "editFailed": "Failed to modify admin «{{name}}»", + "deleteSuccess": "Admin {{name}} removed successfully", + "deleteFailed": "Failed to remove admin {{name}}", + "enterUsername": "Enter username", + "enterPassword": "Enter password", + "sudo": "Sudo Admin Privileges", + "edit": "Save Changes", + "create": "Create Admin", + "status": "Status", + "role": "Role", + "total.users": "Total Users", + "used.traffic": "Used Traffic", + "total": "Total Admins", + "active": "Active Admins", + "disable": "Disabled Admins", + "telegramId": "Telegram ID", + "discord": "Discord Webhook", + "supportUrl": "Support URL", + "subDomain": "Subscription Domain", + "profile": "Profile Title", + "subTemplate": "Subscription Template Path", + "passwordConfirm": "Confirm Password", + "enterPasswordConfirm": "Enter Confirm Password", + "disableSuccess": "Admin «{{name}}» has been disabled successfully", + "enableSuccess": "Admin «{{name}}» has been enabled successfully", + "disableFailed": "Failed to disable admin «{{name}}»", + "enableFailed": "Failed to enable admin «{{name}}»", + "resetUsersUsage": "Admin Reset Users Usage", + "resetUsageSuccess": "Admin «{{name}}» user usage has been reset successfully", + "resetUsageFailed": "Failed to reset admin «{{name}}» user usage", + "reset": "Reset usage", + "discordId": "Discord ID", + "lifetime.used.traffic": "Total", + "used": { + "traffic": "Traffic Usage" + }, + "monitor": { + "traffic": "Monitor admin traffic usage over time", + "no_traffic": "No traffic data available" + } + }, + "shortcuts": { + "title": "Keyboard Shortcuts", + "description": "Manage your dashboard shortcuts for quick access", + "add": "Add Shortcut", + "empty": "No shortcuts configured" + }, + "quickActions": { + "title": "Quick Actions", + "description": "Choose an action to create new items in the system", + "comingSoon": "Coming Soon" + }, + "resetUsersUsage.prompt": "Are you sure you want to reset the {{name}} admin users usage?", + "admin.disable": "Disabled Admin", + "admin.enable": "Enabled Admin", + "deleteAdmin.prompt": "Are you sure you want to remove the {{name}} admin?", + "activeUsers.prompt": "Do you want to activate all users under {{name}}?", + "disableUsers.prompt": "Do you want to disable all users under {{name}}?", + "manageAccounts": "Control, Update, and Arrange User Accounts", + "manageGroups": "Control, Update, and Arrange User Groups", + "manageNodes": "Monitor, control, create, modify, remove nodes", + "onlineUsers": "Online Users", + "totalUsers": "Total Users", + "edit": "Modify", + "editGroup": "Modify Group", + "disable": "Disable", + "warning": "Warning", + "remove": "Remove", + "modify": "Modify", + "templates.userTemplates": "Templates", + "editUserTemplateModal.title": "Modify User Template", + "userTemplateModal.title": "Create User Template", + "templates": { + "title": "Templates", + "description": "Manage your Templates", + "addTemplate": "Create Template", + "editSuccess": "User Template «{{name}}» has been modified successfully", + "createSuccess": "User Templates «{{name}}» has been created successfully", + "editFailed": "Failed to modify User Template «{{name}}»", + "createFailed": "Failed to create User Template «{{name}}»", + "name": "Name", + "status": "Status", + "prefix": "Username Prefix", + "suffix": "Username Suffix", + "dataLimit": "Data Limit", + "expire": "Expire duration", + "onHoldTimeout": "OnHold Timeout", + "method": "Method", + "flow": "Flow", + "groups": "Groups", + "userDataLimitStrategy": "Data Limit Reset Strategy", + "resetUsage": "Reset Usage", + "groupsExistingWarning": "You dont create any Groups yet.", + "deleteSuccess": "Template {{name}} removed successfully", + "deleteFailed": "Failed to remove template {{name}}", + "deleteUserTemplateTitle": "Remove User Template", + "deleteUserTemplatePrompt": "Are you sure you want to remove the {{name}} template?", + "duplicateSuccess": "Template «{{name}}» duplicated successfully", + "duplicateFailed": "Failed to duplicate template «{{name}}»", + "enableSuccess": "Template «{{name}}» has been enabled successfully", + "disableSuccess": "Template «{{name}}» has been disabled successfully", + "enableFailed": "Failed to enable admin «{{name}}»", + "disableFailed": "Failed to disable admin «{{name}}»", + "resetUsages": "Reset Usages" + }, + "core.configuration": "Configuration", + "core.generalErrorMessage": "Something went wrong, please check the configuration", + "core.logs": "Logs", + "core.restartCore": "Restart Core", + "core.restarting": "Restarting...", + "core.save": "Save", + "core.socket.closed": "Closed", + "core.socket.connected": "Connected", + "core.socket.connecting": "Connecting...", + "core.socket.not_connected": "Not Connected", + "core.successMessage": "Core settings updated successfully", + "core.title": "Core Configs Settings", + "core.toggleSuccess": "Core «{name}» has been toggled successfully", + "core.toggleFailed": "Failed to toggle core «{name}»", + "core.deleteSuccess": "Core «{name}» has been removed successfully", + "core.deleteFailed": "Failed to remove core «{name}»", + "core.deleteConfirm": "Are you sure you want to remove {{name}}?", + "createNewUser": "Create new user", + "createUser": "Create User", + "createGroup": "Create Group", + "dataUsage": "data usage", + "dateFormat": "MMMM d, yyy", + "delete": "Remove", + "deleteNode.deleteSuccess": "Node {{name}} removed successfully", + "deleteNode.prompt": "Are you sure you want to remove the {{name}} node?", + "deleteNode.title": "Remove Node", + "deleteHost.title": "Remove Host", + "deleteHost.prompt": "Are you sure you want to remove the {{name}} host?", + "deleteHost.deleteSuccess": "Host {{name}} removed successfully", + "deleteHost.deleteFailed": "Failed to remove host {{name}}", + "editHost.title": "Modify Host", + "editNode.editSuccess": "Node {{name}} has been modified successfully", + "editNode.title": "Modify Node", + "deleteUser.deleteSuccess": "{{username}} removed successfully.", + "deleteUser.prompt": "Are you sure you want to remove {{username}}?", + "deleteUser.title": "Remove User", + "disabled": "disabled", + "expire": "Expire", + "expires": "Expires in {{time}}", + "expired": "Expired in {{time}}", + "header.donation": "Donation", + "header.hostSettings": "Host Settings", + "header.logout": "Log out", + "header.nodeSettings": "Node Settings", + "header.nodesUsage": "Nodes Usage", + "loading": "Loading...", + "noResults": "No results found", + "emptyState": { + "noUsers": { + "title": "No users yet", + "description": "Get started by creating your first user account", + "createFirstUser": "Create your first user" + } + }, + "hostsDialog": { + "addHost": "Create Host", + "selectInbound": "Select an inbound", + "selectStatus": "Select Status", + "remarkRequired": "Remark is required", + "addressRequired": "Address is required", + "portRequired": "Port is required", + "fingerprint": "Fingerprint", + "status": { + "label": "Status", + "active": "Active", + "disabled": "Disabled", + "limited": "Limited", + "expired": "Expired", + "onHold": "On Hold" + }, + "port": "Port", + "sni": "SNI", + "sniPlaceholder": "SNI (e.g. example.com)", + "host": "Host", + "path": "Path", + "selectAlpn": "Select ALPN", + "networkSettings": "Network Settings", + "transportSettings": "Transport Settings", + "transportType": "Transport Type", + "selectTransport": "Select transport type", + "serviceName": "Service Name", + "enterServiceName": "Enter gRPC service name", + "seed": "Seed", + "enterSeed": "Enter KCP seed", + "enterPath": "Enter path (e.g. /xray)", + "enterHost": "Enter host (e.g. example.com)", + "header": "Header", + "selectHeader": "Select header type", + "multiMode": "Multi Mode", + "securitySettings": "Security Settings", + "camouflagSettings": "Camouflag Settings", + "security": "Security", + "alpn": "ALPN", + "earlyData": "Early Data", + "allowInsecure": "Allow Insecure", + "muxEnable": "Enable Mux", + "randomUserAgent": "Random User Agent", + "inboundDefault": "Inbound Default", + "httpHeaders": "HTTP Headers", + "headersName": "Headers Name", + "headersValue": "Headers Value", + "addHeader": "Add Header", + "removeHeader": "Remove Header", + "createSuccess": "Host «{{name}}» has been created successfully", + "createFailed": "Failed to create host «{{name}}»", + "editSuccess": "Host «{{name}}» has been modified successfully", + "editFailed": "Failed to modify host «{{name}}»", + "noStatus": "No status selected", + "clearAllStatuses": "Clear all statuses", + "transportSettingsAccordion": "Transport Settings", + "xhttp": { + "mode": "Mode", + "noGrpcHeader": "No gRPC Header", + "xPaddingBytes": "X-Padding Bytes", + "scMaxEachPostBytes": "Max Each Post Bytes", + "scMinPostsIntervalMs": "Min Posts Interval (ms)", + "scMaxBufferedPosts": "Max Buffered Posts", + "scStreamUpServerSecs": "Stream Up Server (secs)", + "xmux": "XMux Settings", + "maxConcurrency": "Max Concurrency", + "maxConnections": "Max Connections", + "cMaxReuseTimes": "Max Reuse Times", + "cMaxLifetime": "Max Lifetime", + "hMaxRequestTimes": "Max Request Times", + "hKeepAlivePeriod": "Keep Alive Period", + "downloadSettings": "Download Settings", + "downloadSettingsInfo": "Select a host to use for download settings", + "selectDownloadSettings": "Select download settings host" + }, + "grpc": { + "multiMode": "Multi Mode", + "idleTimeout": "Idle Timeout", + "healthCheckTimeout": "Health Check Timeout", + "permitWithoutStream": "Permit Without Stream", + "initialWindowsSize": "Initial Windows Size" + }, + "kcp": { + "header": "Header", + "mtu": "MTU", + "tti": "TTI", + "uplinkCapacity": "Uplink Capacity", + "downlinkCapacity": "Downlink Capacity", + "congestion": "Congestion", + "readBufferSize": "Read Buffer Size", + "writeBufferSize": "Write Buffer Size" + }, + "tcp": { + "title": "TCP Settings", + "header": "Header Type", + "request": { + "title": "Request Settings", + "version": "HTTP Version", + "method": "HTTP Method", + "headers": "Request Headers" + }, + "response": { + "title": "Response Settings", + "version": "HTTP Version", + "status": "Status Code", + "reason": "Status Reason", + "headers": "Response Headers" + }, + "headerName": "Header Name", + "headerValue": "Header Value", + "addHeader": "Add Header", + "removeHeader": "Remove Header", + "requestHeaders": "Request Headers", + "responseHeaders": "Response Headers" + }, + "websocket": { + "heartbeatPeriod": "Heartbeat Period" + }, + "fragment": { + "title": "Fragment", + "packets": "Packets", + "packetsPlaceholder": "Enter packets", + "length": "Length", + "lengthPlaceholder": "Enter length", + "interval": "Interval", + "intervalPlaceholder": "Enter interval", + "allFieldsRequired": "If one field is entered, all fields must be filled", + "info": "length,interval,packet (e.g. 10-100,100-200,tlshello)", + "info.attention": "Attention: currently, this feature only supported in streisand >= 1.6.12 and v2rayNG >= 1.8.16 (custom config)", + "info.examples": "Examples:", + "fragment": "Fragment", + "fallbackDelay": "Fallback Delay", + "recordFragment": "Record Fragment" + }, + "noise": { + "title": "Noise", + "type": "Type", + "addNoise": "Add Noise", + "removeNoise": "Remove Noise", + "noNoiseSettings": "No noise settings configured", + "packet": "Packet", + "packetPlaceholder": "Enter packet value (e.g. rand:10-20)", + "delay": "Delay", + "delayPlaceholder": "Enter delay", + "rand": "Random", + "info": "packet,delay (e.g. rand:10-20,100-200)", + "info.attention": "Attention: currently, this feature only supported in streisand >= 1.6.32 and v2rayNG >= 1.8.39 (custom config)", + "info.examples": "Examples:" + }, + "muxSettings": "Mux Settings", + "enableMux": "Enable Mux", + "xraySettings": "Xray Settings", + "singBoxSettings": "Sing-box Settings", + "clashSettings": "Clash Settings", + "addXraySettings": "Add Xray Settings", + "addSingBoxSetting": "Add Sing-box Settings", + "addClashSettings": "Add Clash Settings", + "protocol": "Protocol", + "selectProtocol": "Select protocol", + "maxConnections": "Max Connections", + "maxStreams": "Max Streams", + "minStreams": "Min Streams", + "padding": "Enable Padding", + "enabled": "Enabled", + "concurrency": "Concurrency", + "xudpConcurrency": "XUDP Concurrency", + "xudpProxy443": "XUDP Proxy 443", + "selectXudpProxy443": "Select XUDP Proxy 443", + "statistic": "Enable Statistics", + "onlyTcp": "Only TCP", + "brutal": { + "enable": "Enable Brutal", + "title": "Brutal Settings", + "upMbps": "Upload Speed (Mbps)", + "downMbps": "Download Speed (Mbps)" + }, + "address": "Address", + "variables": { + "title": "Use these variables to make it dynamic", + "server_ip": "IP Address of current server", + "server_ipv6": "IPv6 of current server", + "username": "The username of the user", + "data_usage": "The current data usage of the user", + "data_left": "Remaining data of the user", + "data_limit": "The usage limit of the user", + "days_left": "Remaining days of the user", + "expire_date": "Expiry date of the user", + "jalali_expire_date": "Expiry date of the user in solar calendar", + "time_left": "Remaining time of the user", + "status_emoji": "User status as an emoji (✅,⌛️,🪫,❌,🔌)", + "protocol": "Proxy protocol (e.g. VMess)", + "transport": "Proxy transport method (e.g. ws)", + "admin_username": "Admin username" + }, + "advancedOptions": "Advanced Options", + "hos.info": "By default, if a request host is set in the XRAY configuration, it will be used. However, if needed, you can set a custom request host here.", + "multiHost": "To set multiple addresses, separate them with ,. A random address will be selected each time.", + "wildcard": "Use * to generate a random string (works for wildcard domains)", + "path.info": "Set a path for host users, useful behind a reverse proxy.", + "port.nfo": "By default, the host uses the port declared in the inbound. You can set a custom port if traffic is redirected from a different port. For example, the server might redirect traffic from port 443 to your inbound's default port.", + "proxyOutbound": { + "info": "Additional outbound traffic (only in v2ray custom configuration)" + }, + "security.info": "If this host's middleware server uses a different security layer than your inbound default, you can set a custom security layer here.", + "port.info": "By default, the host uses the port declared in the inbound. You can set a custom port if traffic is redirected from a different port. For example, the server might redirect traffic from port 443 to your inbound's default port.", + "host.info": "By default, if a request host is set in the XRAY configuration, it will be used. However, if needed, you can set a custom request host here.", + "host.multiHost": "To set multiple addresses, separate them with ,. A random address will be selected each time.", + "host.wildcard": "Use * to generate a random string (works for wildcard domains)", + "sni.info": "SNI (Server Name Indication) is used to specify which hostname the client is trying to connect to. This is particularly useful when you have multiple domains pointing to the same IP address.", + "useSniAsHost": "Use SNI as Host", + "echConfigList": "ECH Config List", + "echConfigList.info": "Encrypted Client Hello (ECH) configuration list. This is a base64 encoded string.", + "echConfigListPlaceholder": "Enter ECH Config List", + "httpVersions": { + "1.0": "HTTP/1.0", + "1.1": "HTTP/1.1", + "2.0": "HTTP/2.0", + "3.0": "HTTP/3.0" + }, + "httpMethods": { + "GET": "GET", + "POST": "POST", + "PUT": "PUT", + "DELETE": "DELETE", + "HEAD": "HEAD", + "OPTIONS": "OPTIONS", + "PATCH": "PATCH", + "TRACE": "TRACE", + "CONNECT": "CONNECT" + }, + "httpReasons": { + "100": "Continue", + "101": "Switching Protocols", + "200": "OK", + "201": "Created", + "202": "Accepted", + "203": "Non-Authoritative Information", + "204": "No Content", + "205": "Reset Content", + "206": "Partial Content", + "300": "Multiple Choices", + "301": "Moved Permanently", + "302": "Found", + "303": "See Other", + "304": "Not Modified", + "305": "Use Proxy", + "307": "Temporary Redirect", + "308": "Permanent Redirect", + "400": "Bad Request", + "401": "Unauthorized", + "402": "Payment Required", + "403": "Forbidden", + "404": "Not Found", + "405": "Method Not Allowed", + "406": "Not Acceptable", + "407": "Proxy Authentication Required", + "408": "Request Timeout", + "409": "Conflict", + "410": "Gone", + "411": "Length Required", + "412": "Precondition Failed", + "413": "Payload Too Large", + "414": "URI Too Long", + "415": "Unsupported Media Type", + "416": "Range Not Satisfiable", + "417": "Expectation Failed", + "418": "I'm a teapot", + "421": "Misdirected Request", + "422": "Unprocessable Entity", + "423": "Locked", + "424": "Failed Dependency", + "425": "Too Early", + "426": "Upgrade Required", + "428": "Precondition Required", + "429": "Too Many Requests", + "431": "Request Header Fields Too Large", + "451": "Unavailable For Legal Reasons", + "500": "Internal Server Error", + "501": "Not Implemented", + "502": "Bad Gateway", + "503": "Service Unavailable", + "504": "Gateway Timeout", + "505": "HTTP Version Not Supported" + }, + "selectReason": "Select Reason", + "nextPlanTitle": "Next Plan", + "nextPlanTemplateId": "Template ID", + "nextPlanDataLimit": "Data Limit (GB)", + "nextPlanExpire": "Expire (days)", + "nextPlanAddRemainingTraffic": "Add Remaining Traffic" + }, + "inbound": "Inbound", + "remark": "Host Name", + "none": "None", + "create": "Create", + "itemsPerPage": "Items per page", + "login": "Login", + "login.fieldRequired": "This field is required", + "login.loginYourAccount": "Login to your account", + "login.welcomeBack": "Welcome back, please enter your details", + "memoryUsage": "memory usage", + "next": "Next", + "monitorServers": "Monitor your servers and users", + "manageServers": "Control your server details", + "nodes.addHostForEveryInbound": "Add this node as a new host for every inbound", + "nodes.addNewPasarGuardNode": "Create New PasarGuard Node", + "nodes.prompt": "Create and configure node details", + "nodes.addNodeSuccess": "Node {{name}} created successfully", + "nodes.apply": "modifyNode", + "nodes.certificate": "Certificate", + "nodes.editNode": "Modify Node", + "nodes.nodeAPIPort": "API Port", + "nodes.nodeName": "Name", + "nodes.nodePort": "Port", + "nodes.reconnect": "Reconnect", + "nodes.reconnecting": "Reconnecting...", + "nodes.title": "Using PasarGuard-Node, you are able to scale up your connection quality by creating different nodes on different servers.", + "nodes.usageCoefficient": "Usage Ratio", + "on_hold": "On Hold", + "duplicate": "Duplicate", + "createAndManageTemplates": "Create and manage templates", + "password": "Password", + "previous": "Previous", + "qrcodeDialog.sublink": "Subscribe Link", + "reset": "Reset", + "resetAllUsage": "Reset All Usages", + "resetAllUsage.error": "Usage reset failed, please try again.", + "resetAllUsage.prompt": "This action clears all of the users' data usage completely. Are you sure you want to reset all usage? THIS CANNOT BE UNDONE!", + "resetAllUsage.success": "All usage has reset successfully.", + "resetAllUsage.title": "Reset data usage for all users", + "resetUserUsage.error": "Usage reset failed, please try again.", + "resetUserUsage.prompt": "Are you sure you want to reset {{username}}'s usage?", + "resetUserUsage.success": "{{username}}'s usage has reset successfully.", + "resetUserUsage.title": "Reset User Usage", + "revoke": "Revoke", + "revokeUserSub.error": "Subscription revoke failed, please try again.", + "revokeUserSub.prompt": "Are you sure you want to revoke «{{username}}»'s subscription?", + "revokeUserSub.success": "{{username}}'s subscription has revoked successfully.", + "revokeUserSub.title": "Revoke User Subscription", + "subscriptionClients": { + "title": "Subscription Clients", + "viewAllClients": "View Clients", + "total": "Total: {{count}} clients", + "showing": "Showing last {{count}} accesses", + "noClients": "No subscription clients found", + "noClientsDesc": "This user has not accessed their subscription yet", + "knownClient": "Known", + "unknown": "Unknown", + "error": "Failed to load subscription clients" + }, + "search": "Search", + "status.active": "Active", + "status.enable": "Enable", + "status.disabled": "Disabled", + "status.expired": "Expired", + "status.limited": "Limited", + "status.on_hold": "On Hold", + "nodeModal.status.error": "Error", + "nodeModal.status.disabled": "Disabled", + "nodeModal.status.connecting": "Connecting", + "nodeModal.status.connected": "Connected", + "userDialog": { + "absolute": "Absolute", + "custom": "Custom", + "dataLimit": "Data Limit", + "days": "Days", + "editUser": "Modify user", + "editUserTitle": "Modify user", + "endDate": "End date", + "expiryDate": "Expiry Date", + "timeOutDate": "Timeout Date", + "generatedByDefault": "Automatically generated by default", + "hours": "Hours", + "method": "Method", + "months": "Months", + "note": "Note", + "onHold": "On Hold", + "onHoldExpireDuration": "On-Hold Expire Duration", + "onHoldExpireDurationPlaceholder": "e.g. 7", + "optional": "optional", + "periodicUsageReset": "Periodic Usage Reset", + "protocols": "Protocols", + "relative": "Relative", + "resetStrategyAnnually": "Annually", + "resetStrategyDaily": "Daily", + "resetStrategyMonthly": "Monthly", + "resetStrategyNo": "No", + "resetStrategyWeekly": "Weekly", + "resetUsage": "Reset Usage", + "revokeSubscription": "Revoke Subscription", + "selectOneProtocol": "Please select at least one protocol", + "shadowsocksDesc": "Fast and secure, but not efficient as others", + "startDate": "Start date", + "total": "Total: ", + "trojanDesc": "Lightweight, secure and lightening fast", + "usage": "Usage", + "userAlreadyExists": "User already exists", + "userCreated": "User {{username}} created.", + "userEdited": "User {{username}} Modified.", + "vlessDesc": "Lightweight, fast and secure", + "vmessDesc": "Fast and secure", + "warningNoProtocol": "Please select at least one protocol", + "weeks": "Weeks", + "username": "Username", + "deleteSuccess": "User «{{name}}» has been removed successfully.", + "resetUsageSuccess": "Usage for user «{{name}}» has been reset.", + "revokeSubSuccess": "Subscription for user «{{name}}» has been revoked.", + "activeNextPlanSuccess": "Next plan for user «{{name}}» has been activated.", + "activeNextPlanError": "failed to activate next plan for user «{{name}}».", + "deleteConfirmTitle": "Remove User", + "deleteConfirm": "Are you sure you want to remove user «{{name}}»?", + "nextPlanTitle": "Next Plan", + "nextPlanTemplateId": "Template ID", + "nextPlanDataLimit": "Data Limit (GB)", + "nextPlanExpire": "Expire (days)", + "nextPlanAddRemainingTraffic": "Add Remaining Traffic", + "selectTemplate": "Select Template", + "selectTemplatePlaceholder": "Choose a template", + "proxySettingsAccordion": "Proxy Settings", + "proxySettings.vmess": "VMess", + "proxySettings.vless": "VLESS", + "proxySettings.trojan": "Trojan", + "proxySettings.shadowsocks": "Shadowsocks", + "proxySettings.id": "ID", + "proxySettings.password": "Password", + "proxySettings.method": "Method", + "proxySettings.flow": "Flow", + "proxySettings.desc": "Configure protocol-specific settings for this user.", + "selectNode": "Select Node", + "allNodes": "All Nodes", + "activeNextPlan": "Active Next Plan", + "status": "Status", + "dataLimitResetStrategy": "Data Limit Reset Strategy", + "expire": "Expire Date", + "onHoldTimeout": "On-Hold Timeout", + "autoDeleteInDays": "Auto Delete In Days", + "proxySettings": "Proxy Settings", + "nextPlan": "Next Plan", + "groups": "Groups", + "subscriptionInfo": "Subscription Info", + "subscriptionUpdated": "Last Updated", + "lastClient": "Last Client", + "subscriptionNotAccessed": "Not accessed yet", + "unknownClient": "Unknown client", + "selectedGroups": "{{count}} Group(s) selected", + "editError": "Failed to update user «{{name}}»", + "createError": "Failed to create user «{{name}}»", + "selectStatus": "Select status", + "selectedTemplates": "{{count}} Template(s) selected" + }, + "userSettings": { + "subscriptionUrlCopied": "Subscription URL copied to clipboard" + }, + "users": "Users", + "usersTable.copied": "Copied", + "usersTable.copyConfigs": "Copy Configs", + "usersTable.copyLink": "Copy Subscription Link", + "usersTable.dataUsage": "data usage", + "usersTable.noUser": "There is no user Created to the system", + "usersTable.noUserMatched": "It seems there is no user matched with what you are looking for", + "usersTable.status": "Status", + "usersTable.total": "Total", + "statistics.system": "System", + "statistics.totalTraffic": "Total Traffic", + "statistics.ramUsage": "RAM Usage", + "statistics.cpuUsage": "CPU Usage", + "statistics.cores": "cores", + "statistics.realTimeData": "Real-Time Data", + "statistics.historicalData": "Historical Data", + "statistics.viewHistorical": "View Historical", + "statistics.viewRealtime": "View Realtime", + "statistics.historical": "Historical", + "statistics.realtime": "Realtime", + "statistics.realtimeDescription": "Live statistics and charts for your servers and users.", + "statistics.historicalDescription": "Historical server performance data for the selected time range", + "enable": "Enable", + "host": { + "enableSuccess": "Host «{{name}}» has been enabled successfully", + "enableFailed": "Failed to enable host «{{name}}»", + "disableSuccess": "Host «{{name}}» has been disabled successfully", + "disableFailed": "Failed to disable host «{{name}}»", + "duplicateSuccess": "Host «{{name}}» has been duplicated successfully", + "duplicateFailed": "Failed to duplicate host «{{name}}»", + "xudp_proxy_443": "XUDP Proxy 443", + "reject": "Reject", + "allow": "Allow", + "skip": "Skip", + "priorityUpdated": "Host priorities updated", + "priorityUpdateError": "Failed to update priorities" + }, + "usersTable.sortByExpire": "Sort by expiry time", + "dateInfo.day": " day", + "dateInfo.hour": " hour", + "dateInfo.min": " minute", + "dateInfo.month": " month", + "dateInfo.year": " year", + "group": { + "createSuccess": "Group «{{name}}» has been created successfully", + "createFailed": "Failed to create group «{{name}}»", + "editSuccess": "Group «{{name}}» has been modified successfully", + "editFailed": "Failed to modify group «{{name}}»", + "deleteSuccess": "Group «{{name}}» has been removed successfully", + "deleteFailed": "Failed to remove group «{{name}}»", + "deleteConfirm": "Are you sure you want to remove group «{{name}}»?", + "enableSuccess": "Group «{{name}}» has been enabled successfully", + "enableFailed": "Failed to enable group «{{name}}»", + "disableSuccess": "Group «{{name}}» has been disabled successfully", + "disableFailed": "Failed to disable group «{{name}}»", + "deleteConfirmation": "Remove Group" + }, + "name": "Name", + "inboundTags": "Inbound Tags", + "searchInbounds": "Search inbounds...", + "noInboundsFound": "No inbounds found", + "nodeModal": { + "title": "Create Node", + "description": "Create a new node to your network", + "name": "Node Name", + "namePlaceholder": "Enter node name", + "address": "Node Address", + "addressPlaceholder": "Enter node address", + "port": "Node Port", + "portPlaceholder": "Enter node port", + "usageRatio": "Usage Ratio", + "usageRatioPlaceholder": "Enter usage ratio", + "maxLogs": "Max Logs", + "maxLogsPlaceholder": "Enter max logs", + "connectionType": "Connection Type", + "keepAlive": "Keep Alive", + "keepAliveDescription": "Set the keep alive interval", + "days": "Days", + "minutes": "Minutes", + "seconds": "Seconds", + "certificate": "Certificate", + "certificatePlaceholder": "Enter certificate", + "status": "Node Status", + "statusCheckSuccess": "Node is connected successfully", + "statusCheckFailed": "Failed to connect to node", + "errorDetails": "Error Details", + "connectionError": "Connection Error", + "retryConnection": "Retry Connection", + "configurationError": "Configuration Error", + "validateConfig": "Validate Configuration", + "fillRequiredFields": "Please fill out all required fields before checking status", + "apiKey": "API Key", + "apiKeyPlaceholder": "Enter the node's API Key", + "generateUUID": "Generate UUID", + "coreConfig": "Core Configuration", + "hours": "Hours", + "selectCoreConfig": "Select Core Configuration", + "hideDetails": "Hide Details", + "showDetails": "Show Details", + "statusCheck": "Check Status", + "statusChecking": "Checking...", + "reconnect": "Reconnect", + "reconnecting": "Reconnecting...", + "sync": "Sync", + "syncing": "Syncing...", + "syncSuccess": "Node synchronized successfully", + "syncFailed": "Failed to sync node", + "gatherLogs": "Gather Logs", + "gatherLogsDescription": "Enable log collection from this node for monitoring and debugging purposes", + "statusMessages": { + "checkUnavailableForNew": "Status check not available for new nodes. Create the node first to check its status." + }, + "onlineStats": { + "button": "Online Stats", + "title": "Online User Statistics", + "ipListTitle": "IP Addresses for {{username}}", + "nodeInfo": "Node: {{nodeName}}", + "searchPlaceholder": "Enter username to search...", + "enterUsername": "Please enter a username", + "refreshed": "Data refreshed successfully", + "refreshFailed": "Failed to refresh data", + "backToStats": "Back to Stats", + "ipAddresses": "IP addresses", + "errorLoading": "Error loading user stats", + "userNotOnline": "User is not online", + "searchUser": "Search for a user to view their online stats", + "autoRefresh": "Auto-refreshing every 5 seconds", + "connections": "connections", + "protocols": "protocols", + "viewIPs": "View IPs", + "userNotFound": "User '{{username}}' not found or not online", + "errorLoadingIPs": "Error loading user IP addresses" + } + }, + "theme": { + "title": "Theme", + "description": "Customize your application theme", + "light": "Light", + "dark": "Dark", + "system": "System", + "selectTheme": "Select theme", + "themeSaved": "Theme saved successfully", + "themeChanged": "Theme changed successfully", + "visitThemePage": "Visit theme page to customize further", + "radiusSaved": "Border radius updated successfully", + "mode": "Mode", + "color": "Color", + "radius": "Border Radius", + "zinc": "Zinc", + "rose": "Rose", + "blue": "Blue", + "green": "Green", + "violet": "Violet", + "orange": "Orange", + "yellow": "Yellow", + "default": "Default", + "red": "Red", + "modeDescription": "Choose how the interface should appear", + "colorDescription": "Select your preferred color scheme", + "radiusDescription": "Adjust the roundness of UI elements", + "lightDescription": "Bright and clean", + "darkDescription": "Easy on the eyes", + "systemDescription": "Matches device", + "preview": "Live Preview", + "previewDescription": "See how your theme settings look in real-time", + "dashboardPreview": "Dashboard Preview", + "dashboardDescription": "Monitor system performance and manage user accounts", + "currentTheme": "Current theme", + "sampleInput": "Sample input", + "primaryButton": "Primary Button", + "resetToDefaults": "Reset to defaults", + "resetDescription": "Restore all theme settings to their default values", + "resetting": "Resetting...", + "reset": "Reset", + "resetSuccess": "Theme reset to default settings", + "resetFailed": "Failed to reset theme settings", + "radiusNone": "None", + "radiusSmall": "Small", + "radiusMedium": "Medium", + "radiusLarge": "Large" + }, + "coreConfigModal": { + "addConfig": "Create Core Configuration", + "createNewConfig": "Create a new core configuration", + "editCore": "Modify Core Configuration", + "invalidJson": "Invalid JSON configuration", + "createSuccess": "Core Configuration «{{name}}» has been created successfully", + "createFailed": "Failed to create Core Configuration «{{name}}»", + "editSuccess": "Core Configuration «{{name}}» has been modified successfully", + "editFailed": "Failed to modify Core Configuration «{{name}}»", + "keyPairGenerated": "Key pair generated successfully", + "shortIdGenerated": "Short ID generated successfully", + "shortId": "Short ID", + "shortIdCopied": "Short ID copied to clipboard", + "publicKeyCopied": "Public key copied to clipboard", + "privateKeyCopied": "Private key copied to clipboard", + "jsonConfig": "JSON Configuration", + "editJson": "Modify JSON configuration", + "name": "Name", + "namePlaceholder": "Enter configuration name", + "fallback": "Fallback", + "selectFallback": "Select fallback", + "excludedInbound": "Excluded inbound", + "selectInbound": "Select inbound", + "inbound": "Inbound", + "generateKeyPair": "Generate Key Pair", + "generateShortId": "Generate Short ID", + "publicKey": "Public Key", + "privateKey": "Private Key", + "clearAllFallbacks": "Clear all fallbacks", + "clearAllExcluded": "Clear all excluded inbounds", + "copyPublicKey": "Copy Public Key", + "copyPrivateKey": "Copy Private Key", + "copyShortId": "Copy Short ID", + "restartNodes": "Restart Nodes", + "generateShadowsocksPassword": "Generate Shadowsocks Password", + "generatingShadowsocksPassword": "Generating Password...", + "shadowsocksPassword": "Shadowsocks Password", + "shadowsocksPasswordCopied": "Password copied to clipboard", + "copyShadowsocksPassword": "Copy Password", + "selectEncryptionMethod": "Select Encryption Method", + "regeneratePassword": "Regenerate Password" + }, + "settings.cores.title": "Cores", + "settings.cores.description": "Manage Your Cores", + "settings.cores.addCore": "Create Core", + "settings.cores.noCores": "No cores available. Create one to get started.", + "settings.cores.duplicateSuccess": "Core config «{{name}}» duplicated successfully", + "settings.cores.duplicateFailed": "Failed to duplicate core config «{{name}}»", + "settings.cores.deleteSuccess": "Core has been removed successfully", + "settings.cores.deleteFailed": "Failed to remove core", + "settings.cores.delete": "Remove Core Config", + "settings.cores.coreNotFound": "Core not found", + "createdAt": "Created at", + "toggle": "Toggle status", + "close": "Close", + "copy": "Copy", + "validation": { + "generic": "{{field}} is invalid", + "min": "{{field}} must be at least {{min}}", + "max": "{{field}} must be at most {{max}}", + "required": "{{field}} is required", + "invalid_type": "{{field}} is required", + "too_small": "{{field}} is too short", + "too_big": "{{field}} is too long" + }, + "fields": { + "username": "Username", + "data_limit": "Data Limit", + "expire": "Expire Date", + "note": "Note", + "on_hold_expire_duration": "On Hold Expire Duration", + "group_ids": "Groups" + }, + "sidebar.expand": "Expand sidebar", + "sidebar.collapse": "Collapse sidebar", + "usersTable.deleteUserTitle": "Delete User", + "usersTable.deleteUserPrompt": "Are you sure you want to delete user «{{name}}»? This action cannot be undone.", + "usersTable.deleteSuccess": "User «{{name}}» has been deleted successfully.", + "usersTable.deleteFailed": "Failed to delete user «{{name}}». {{error}}", + "usersTable.delete": "Delete", + "usersTable.cancel": "Cancel", + "statistics.trafficUsage": "Traffic Usage", + "statistics.trafficUsageDescription": "Total traffic usage across all servers", + "statistics.usageDuringPeriod": "Usage During Period", + "statistics.users": "Users", + "statistics.onlineUsers": "Online Users", + "statistics.limitedUsers": "Limited Users", + "statistics.activeUsers": "Active Users", + "statistics.disabledUsers": "Disabled Users", + "statistics.expiredUsers": "Expired Users", + "statistics.onHoldUsers": "On Hold Users", + "statistics.allUsers": "All Users", + "statistics.serverTraffic": "Server Traffic", + "statistics.nodeTrafficDistribution": "Node Traffic Distribution", + "statistics.noNodesAvailable": "No Nodes Available", + "statistics.noDataAvailable": "No Data Available", + "statistics.noDataDescription": "Select a time range to view traffic usage statistics and trends.", + "statistics.noNodesDescription": "No nodes are currently connected to display traffic distribution.", + "statistics.loadingDescription": "Fetching the latest statistics data...", + "statistics.waitingForData": "Waiting for Data", + "statistics.waitingForDataDescription": "Real-time statistics will appear here once data starts flowing.", + "statistics.selectTimeRange": "Select Time Range", + "statistics.selectTimeRangeDescription": "Choose a date range above to view traffic usage statistics.", + "statistics.noDataInRange": "No Data in Selected Range", + "statistics.noDataInRangeDescription": "No traffic data found for the selected time period. Try selecting a different date range.", + "statistics.selectNodeToView": "Select a node to view detailed statistics", + "statistics.userStatisticsDescription": "Overview of user account status and activity", + "statistics.date": "Date", + "statistics.totalUsage": "Total Usage", + "statistics.uplink": "Uplink", + "statistics.downlink": "Downlink", + "errors.connectionFailed": "Connection failed. Please check your network and try again.", + "errors.statisticsLoadFailed": "Failed to Load Statistics", + "usersTable.resetUsageTitle": "Reset User Usage", + "usersTable.resetUsagePrompt": "Are you sure you want to reset the usage for «{{name}}»?", + "usersTable.resetUsageSubmit": "Reset Usage", + "usersTable.resetUsageSuccess": "User «{{name}}» usage has been reset successfully", + "usersTable.resetUsageFailed": "Failed to reset usage for user «{{name}}»", + "time": { + "expires": "expires", + "expired": "expired", + "year": "year", + "years": "years", + "month": "month", + "months": "months", + "day": "day", + "days": "days", + "hour": "hour", + "hours": "hours", + "min": "min", + "mins": "mins", + "second": "second", + "seconds": "seconds", + "ago": "ago" + }, + "notConnectedYet": "Not connected yet", + "node.xrayVersion": "Core Version", + "node.coreVersion": "Node Version", + "calendar": { + "selectRange": "Select range", + "startDate": "Start date", + "endDate": "End date" + }, + "usersTable": { + "usageChart": "Usage Chart", + "noUsageData": "No usage data available for this period.", + "tryDifferentRange": "Try a different time range.", + "trendingUp": "Trending up by", + "trendingDown": "Trending down by", + "usageSummary": "Showing total usage for the selected period.", + "activeNextPlanTitle": "Activate User Next Plan", + "activeNextPlanPrompt": "Are you sure you want to activate next plan for «{{name}}»?", + "activeNextPlanSubmit": "Activate Next Plan" + }, + "setOwnerModal": { + "title": "Set Owner", + "currentOwner": "Current owner:", + "none": "None", + "selectAdmin": "Select new owner", + "confirm": "Set Owner", + "success": "User {{username}}'s owner changed to {{admin}} successfully.", + "error": "Failed to change owner of user {{username}} to {{admin}}.", + "loadError": "Failed to load admins." + }, + "bulk": { + "title": "Bulk", + "groups": "Groups", + "proxySettings": "Proxy Settings", + "proxySettingsDesc": "Configure the proxy settings to apply", + "applyToProxyDesc": "Select the groups, users, or admins you want to apply proxy settings to", + "flowMethod": "Flow: {{flow}} | Method: {{method}}", + "expireDate": "Expire date", + "dataLimit": "Data limit", + "groupsDesc": "Manage group assignments for multiple users and admins at once. Add or remove groups in bulk.", + "expireDateDesc": "Select the expiration date to apply", + "applyToExpireDesc": "Select the groups, users, or admins you want to apply expiration date to", + "noDateSelected": "No date selected", + "dataLimitDesc": "Set the data limit in GB to add or subtract", + "operationType": "Operation Type", + "groupsOperationDesc": "Select whether to add or remove groups from users.", + "addGroups": "Add Groups", + "removeGroups": "Remove Groups", + "addExpiry": "Add to Expiry", + "subtractExpiry": "Subtract from Expiry", + "addDataLimit": "Add Data Limit", + "subtractDataLimit": "Subtract Data Limit", + "applyToDataLimitDesc": "Select the groups, users, or admins you want to apply data limit to", + "noLimitSet": "No limit set", + "dataLimitLabel": "Data Limit (GB)", + "dataLimitPlaceholder": "Enter data limit in GB", + "dataLimitRequired": "Please enter a valid data limit.", + "applyDataLimit": "Apply Data Limit", + "applyDataLimitDescription": "Apply the selected data limit to the selected groups, users, and admins.", + "confirmApplyDataLimitTitle": "Confirm Apply Data Limit", + "confirmApplyDataLimitDescription": "Are you sure you want to apply data limit of {{dataLimit}} GB to {{totalTargets}} target(s)? This action will update the data limit for all selected groups, users, and admins.", + "insertDataLimitPlaceholder": "Insert data limit", + "flowLabel": "Flow", + "methodLabel": "Method", + "selectFlowPlaceholder": "Select flow", + "selectMethodPlaceholder": "Select method", + "proxySettingsRequired": "Please select at least one proxy setting (Flow or Method).", + "applyProxySettings": "Apply Proxy Settings", + "applyProxyDescription": "Apply the selected proxy settings to the selected groups, users, and admins.", + "confirmApplyProxyTitle": "Confirm Apply Proxy Settings", + "confirmApplyProxyDescription": "Are you sure you want to apply proxy settings to {{totalTargets}} target(s)? This action will update the proxy settings for all selected groups, users, and admins.", + "noTargetsSelected": "Please select at least one target.", + "selectedCount": "{{count}} selected", + "groupsDescShort": "Select the groups you want to apply", + "groupsCount": "{{count}} groups", + "targetsCount": "{{count}} targets", + "applyTo": "Apply To", + "applyToDesc": "Select the user or admin you want to apply settings", + "confirmApplyExpireDescriptionAll": "Are you sure you want to apply the expiration date {{expireDate}} to ALL users, admins, and groups? This will update the expiration date for everyone.", + "confirmApplyExpireDescription": "Are you sure you want to apply the expiration date {{expireDate}} to {{totalTargets}} target(s)? This will update the expiration date for all selected groups, users, and admins.", + "confirmApplyDataLimitDescriptionAll": "Are you sure you want to apply the data limit of {{dataLimit}} GB to ALL users, admins, and groups? This will update the data limit for everyone.", + "confirmApplyProxyDescriptionAll": "Are you sure you want to apply the proxy settings to ALL users, admins, and groups? This will update the proxy settings for everyone.", + "confirmApplyGroupsDescriptionAll": "Are you sure you want to apply the group changes to ALL users, admins, and groups? This will update the groups for everyone.", + "confirmApplyGroupsDescription": "Are you sure you want to apply the group changes to {{totalTargets}} target(s)? This will update the groups for all selected users and admins.", + "expire.placeholder": "Enter expire date" + }, + "operationSuccess": "Operation successful!", + "operationFailed": "Operation failed!", + "settingsApplied": "Settings applied successfully!", + "applying": "Applying...", + "timeSelector.pickDate": "Pick a date", + "advanceSearch": { + "title": "Advanced Search", + "byUsername": "Username and Notes", + "byProtocol": "Protocol Data", + "byStatus": "Status", + "byAdmin": "Admin", + "byGroup": "Group", + "selectGroup": "Select Group ... ", + "selectAdmin": "Select Admin ... ", + "selectStatus": "Select Status ... " + }, + "clearAllFilters": "Clear All Filters", + "activeFilters": "active" +} \ No newline at end of file diff --git a/dashboard/public/statics/locales/fa.json b/dashboard/public/statics/locales/fa.json new file mode 100644 index 000000000..9413388d4 --- /dev/null +++ b/dashboard/public/statics/locales/fa.json @@ -0,0 +1,1482 @@ +{ + "pasargaurd": "پاسارگارد", + "dashboard": "داشبورد", + "master": "همه گره‌ها", + "dashboardDescription": "داشبورد مدیریت مـرزبان", + "active": "فعال", + "online": "آنلاین", + "platform": "پلتفرم", + "allStatuses": "همه وضعیت‌ها", + "status": "وضعیت", + "statistics": "آمار", + "selectAll": "انتخاب همه", + "deselectAll": "لغو انتخاب همه", + "modifying": "در حال ویرایش...", + "removing": "در حال حذف...", + "creating": "در حال ایجاد...", + "hosts": "هاست‌ها", + "groups": "گروه‌ها", + "documentation": "مستندات", + "discussionGroup": "گروه گفتگو", + "github": "GitHub", + "community": "جامعه", + "supportUs": "پشتیبانی از ما", + "manageHosts": "مدیریت و کنترل هاست‌ها", + "manageSettings": "مدیریت و کنترل تنظیمات", + "monitorUsers": "مدیریت کاربران", + "alltime": "همه زمان", + "coreUsername": "نام کاربری هسته", + "settings": { + "title": "تنظیمات", + "notifications": { + "title": "اعلان‌ها", + "description": "پیکربندی تنظیمات اعلان‌های تلگرام و Discord", + "loadError": "بارگیری تنظیمات اعلان‌ها ناموفق بود", + "saveSuccess": "تنظیمات اعلان‌ها با موفقیت ذخیره شد", + "saveFailed": "ذخیره تنظیمات اعلان‌ها ناموفق بود", + "cancelSuccess": "تغییرات لغو شد و تنظیمات اصلی بازیابی شد", + "filterTitle": "فیلتر اعلان‌ها", + "filterDescription": "رویدادهایی را انتخاب کنید که باید اعلان‌هایی را برای اطلاع‌رسانی از فعالیت‌های مهم سیستم ایجاد کنند", + "types": { + "admin": "مدیران", + "core": "هسته", + "group": "گروه‌ها", + "host": "هاست‌ها", + "login": "ورود", + "node": "گره‌ها", + "user": "کاربران", + "userTemplate": "قالب‌ها", + "daysLeft": "انقضا", + "percentageReached": "مصرف" + }, + "telegram": { + "title": "تلگرام", + "description": "پیکربندی اعلان‌های ربات تلگرام برای دریافت هشدارهای بلادرنگ در چت یا کانال تلگرام شما", + "apiToken": "توکن API ربات", + "adminId": "شناسه چت مدیر", + "channelId": "شناسه کانال", + "topicId": "شناسه موضوع" + }, + "discord": { + "title": "Discord", + "description": "تنظیم اعلان‌های webhook Discord برای دریافت هشدارها مستقیماً در کانال‌های سرور Discord شما", + "webhookUrl": "آدرس webhook" + }, + "advanced": { + "title": "تنظیمات پیشرفته", + "description": "پیکربندی رفتار پیشرفته اعلان‌ها شامل سیاست‌های تلاش مجدد و تنظیمات پروکسی", + "maxRetries": "حداکثر تلاش مجدد", + "proxyUrl": "آدرس پروکسی", + "miniAppUrl": "آدرس مینی‌اپ تلگرام", + "miniAppUrlPlaceholder": "آدرس مینی‌اپ را وارد کنید (اختیاری)", + "miniAppUrlDescription": "آدرس مینی‌اپ تلگرام خود را وارد کنید. در صورت عدم استفاده، خالی بگذارید." + } + }, + "subscriptions": { + "title": "اشتراک‌ها", + "description": "پیکربندی URL های اشتراک، بازه‌های به‌روزرسانی و قوانین مخصوص کلاینت", + "loadError": "بارگیری تنظیمات اشتراک ناموفق بود", + "saveSuccess": "تنظیمات اشتراک با موفقیت ذخیره شد", + "saveError": "ذخیره تنظیمات اشتراک ناموفق بود", + "cancelSuccess": "تغییرات لغو شد و تنظیمات اصلی بازیابی شد", + "general": { + "title": "تنظیمات عمومی", + "description": "گزینه‌های پیکربندی پایه اشتراک", + "urlPrefix": "پیشوند آدرس", + "urlPrefixPlaceholder": "sub", + "urlPrefixDescription": "آدرس پایه برای لینک‌های اشتراک", + "updateInterval": "فاصله به‌روزرسانی (ساعت)", + "updateIntervalDescription": "هر چند وقت یکبار کلاینت‌ها باید به‌روزرسانی را بررسی کنند", + "supportUrl": "آدرس پشتیبانی", + "supportUrlPlaceholder": "https://support.example.com", + "supportUrlDescription": "آدرس پشتیبانی و راهنمایی کاربران", + "profileTitle": "عنوان پروفایل", + "profileTitlePlaceholder": "سرویس VPN من", + "profileTitleDescription": "نام نمایشی برای پروفایل اشتراک", + "hostStatusFilter": "فیلتر وضعیت هاست", + "hostStatusFilterDescription": "فیلتر کردن هاست‌ها بر اساس وضعیت آن‌ها" + }, + "rules": { + "title": "قوانین اشتراک", + "description": "پیکربندی قوانین اشتراک مخصوص کلاینت و فرمت‌ها", + "addRule": "افزودن قانون", + "removeRule": "حذف قانون", + "pattern": "الگو", + "patternPlaceholder": "الگو را وارد کنید (مثال: الگوی user-agent)", + "patternDescription": "الگو برای تطبیق با درخواست‌های کلاینت", + "target": "فرمت هدف", + "targetDescription": "فرمت پیکربندی برای ارائه این الگو", + "noRules": "هیچ قانونی پیکربندی نشده است. قوانین را اضافه کنید تا رفتار اشتراک را برای کلاینت‌های مختلف سفارشی کنید." + }, + "formats": { + "title": "فرمت‌های اشتراک دستی", + "description": "فعال یا غیرفعال کردن فرمت‌های اشتراک خاص برای درخواست‌های دستی", + "links": "لینک‌ها", + "linksDescription": "لینک‌های اشتراک متن ساده", + "linksBase64": "لینک‌ها (Base64)", + "linksBase64Description": "لینک‌های اشتراک کدگذاری شده با Base64", + "xray": "Xray", + "xrayDescription": "فرمت پیکربندی Xray", + "singBox": "Sing-box", + "singBoxDescription": "فرمت پیکربندی Sing-box", + "clash": "Clash", + "clashDescription": "فرمت پیکربندی Clash", + "clashMeta": "Clash Meta", + "clashMetaDescription": "فرمت پیکربندی Clash Meta", + "outline": "Outline", + "outlineDescription": "فرمت پیکربندی Outline VPN" + }, + "configFormats": { + "links": "لینک‌ها", + "links_base64": "لینک‌ها (Base64)", + "xray": "Xray", + "sing_box": "Sing-box", + "clash": "Clash", + "clash_meta": "Clash Meta", + "outline": "Outline", + "block": "بلاک" + } + }, + "telegram": { + "title": "تلگرام", + "description": "پیکربندی ادغام ربات تلگرام و تنظیمات مرتبط برای سیستم شما", + "loadError": "بارگیری تنظیمات تلگرام ناموفق بود. لطفاً دوباره تلاش کنید.", + "saveSuccess": "تنظیمات تلگرام با موفقیت ذخیره شد", + "saveFailed": "ذخیره تنظیمات تلگرام ناموفق بود", + "cancelSuccess": "تغییرات لغو شد و تنظیمات اصلی تلگرام بازیابی شد", + "general": { + "title": "تنظیمات عمومی", + "description": "پیکربندی اصلی ربات تلگرام و تنظیمات اتصال", + "enable": "فعال‌سازی ربات تلگرام", + "enableDescription": "فعال یا غیرفعال کردن عملکرد ربات تلگرام برای سیستم شما", + "token": "توکن API ربات", + "tokenPlaceholder": "توکن ربات تلگرام خود را وارد کنید", + "tokenDescription": "توکن ربات دریافت شده از @BotFather در تلگرام", + "webhookUrl": "آدرس Webhook", + "webhookUrlPlaceholder": "https://your-domain.com/webhook", + "webhookUrlDescription": "آدرسی که تلگرام به‌روزرسانی‌ها را ارسال می‌کند", + "webhookSecret": "رمز Webhook", + "webhookSecretPlaceholder": "رمز webhook را وارد کنید", + "webhookSecretDescription": "توکن مخفی برای امنیت webhook", + "method": "روش اتصال", + "methodPlaceholder": "روش اتصال را انتخاب کنید", + "methodDescription": "انتخاب کنید که ربات چگونه به‌روزرسانی‌ها را از تلگرام دریافت کند", + "webhook": "Webhook", + "longPolling": "Long Polling", + "proxyUrl": "آدرس پروکسی", + "proxyUrlPlaceholder": "socks5://proxy.example.com:1080", + "proxyUrlDescription": "آدرس پروکسی برای اتصالات API تلگرام (اختیاری)" + }, + "advanced": { + "title": "تنظیمات پیشرفته", + "description": "ویژگی‌ها و پیکربندی‌های پیشرفته ربات تلگرام", + "miniAppLogin": "فعال‌سازی ورود Mini App", + "miniAppLoginDescription": "اجازه ورود کاربران از طریق Mini App تلگرام", + "miniAppUrl": "آدرس Mini App تلگرام", + "miniAppUrlPlaceholder": "آدرس Mini App را وارد کنید (اختیاری)", + "miniAppUrlDescription": "آدرس Mini App تلگرام خود را وارد کنید. در صورت عدم استفاده، خالی بگذارید.", + "forAdminsOnly": "فقط برای مدیران", + "forAdminsOnlyDescription": "دسترسی ربات فقط به مدیران محدود میشود." + } + }, + "discord": { + "title": "Discord", + "description": "تنظیم یکپارچگی ربات Discord و تنظیمات مرتبط برای سیستم شما", + "loadError": "بارگذاری تنظیمات Discord ناموفق بود. لطفاً دوباره تلاش کنید.", + "saveSuccess": "تنظیمات Discord با موفقیت ذخیره شد", + "saveFailed": "ذخیره تنظیمات Discord ناموفق بود", + "cancelSuccess": "تغییرات لغو شد و تنظیمات اصلی Discord بازیابی شد", + "general": { + "title": "تنظیمات عمومی", + "description": "پیکربندی اولیه ربات Discord و تنظیمات اتصال", + "enable": "فعال‌سازی ربات Discord", + "enableDescription": "فعال یا غیرفعال کردن عملکرد ربات Discord برای سیستم شما", + "token": "توکن ربات", + "tokenPlaceholder": "توکن ربات Discord خود را وارد کنید", + "tokenDescription": "توکن ربات که از Discord Developer Portal دریافت شده", + "proxyUrl": "آدرس پروکسی", + "proxyUrlPlaceholder": "socks5://proxy.example.com:1080", + "proxyUrlDescription": "آدرس پروکسی برای اتصالات Discord API (اختیاری)" + } + }, + "webhook": { + "title": "Webhook", + "description": "پیکربندی اعلان‌های webhook و تنظیمات endpoint برای سیستم شما", + "loadError": "بارگذاری تنظیمات webhook ناموفق بود. لطفاً دوباره تلاش کنید.", + "saveSuccess": "تنظیمات webhook با موفقیت ذخیره شد", + "saveFailed": "ذخیره تنظیمات webhook ناموفق بود", + "cancelSuccess": "تغییرات لغو شد و تنظیمات اصلی webhook بازیابی شد", + "general": { + "title": "تنظیمات عمومی", + "description": "پیکربندی اولیه وبهوک و تنظیمات اتصال", + "enable": "فعال‌سازی webhook‌ها", + "enableDescription": "فعال یا غیرفعال کردن اعلان‌های webhook برای سیستم شما", + "timeout": "زمان انقضا (ثانیه)", + "timeoutDescription": "زمان انتظار درخواست برای فراخوانی وبهوک (۱-۳۰۰ ثانیه)", + "recurrent": "تعداد تلاش مجدد", + "recurrentDescription": "تعداد تلاش‌های مجدد برای webhook‌های ناموفق (۱-۲۴)", + "proxyUrl": "آدرس پروکسی", + "proxyUrlPlaceholder": "http://proxy.example.com:8080", + "proxyUrlDescription": "آدرس پروکسی برای درخواست‌های webhook (اختیاری)" + }, + "webhooks": { + "title": "نقاط پایانی webhook", + "description": "پیکربندی آدرس‌های webhook و احراز هویت", + "add": "افزودن webhook", + "addFirst": "افزودن اولین webhook", + "webhook": "webhook", + "empty": "هیچ webhook‌ای پیکربندی نشده. اولین نقطه پایانی webhook خود را اضافه کنید.", + "name": "نام", + "namePlaceholder": "وبهوک من", + "url": "آدرس", + "secret": "کلید مخفی", + "secretPlaceholder": "کلید مخفی وبهوک را وارد کنید" + }, + "triggers": { + "daysLeft": { + "title": "اعلان‌های روزهای باقی‌مانده", + "description": "اعلان زمانی که حساب‌های کاربری روزهای مشخصی باقی دارند", + "empty": "هیچ محرکی تنظیم نشده" + }, + "usagePercent": { + "title": "اعلان‌های درصد استفاده", + "description": "اعلان زمانی که کاربران به درصدهای مشخص استفاده می‌رسند", + "empty": "هیچ محرکی تنظیم نشده" + } + } + }, + "cleanup": { + "title": "پاکسازی", + "description": "مدیریت حساب‌های منقضی شده و بازنشانی مصرف داده‌ها برای نگهداری سیستم", + "loadError": "بارگذاری تنظیمات پاکسازی ناموفق بود. لطفاً دوباره تلاش کنید.", + "saveSuccess": "عملیات پاکسازی با موفقیت تکمیل شد", + "saveFailed": "تکمیل عملیات پاکسازی ناموفق بود", + "cancelSuccess": "عملیات پاکسازی لغو شد", + "expiredUsers": { + "title": "حذف حساب‌های منقضی شده", + "description": "حذف حساب‌هایی که در بازه زمانی مشخصی منقضی شده‌اند", + "expiredAfter": "منقضی شده بعد از", + "expiredBefore": "منقضی شده قبل از", + "expiredAfterPlaceholder": "تاریخ شروع را انتخاب کنید", + "expiredBeforePlaceholder": "تاریخ پایان را انتخاب کنید", + "dateRange": "بازه زمانی", + "deleteExpired": "حذف منقضی‌ها", + "deleting": "در حال حذف...", + "deleteSuccess": "{{count}} حساب منقضی شده با موفقیت حذف شد", + "deleteFailed": "حذف حساب‌های منقضی شده ناموفق بود", + "confirmDelete": "حذف حساب‌های منقضی شده", + "confirmDeleteMessage": "آیا مطمئن هستید که می‌خواهید همه حساب‌های منقضی شده در بازه زمانی انتخاب شده را حذف کنید؟ این عمل قابل بازگشت نیست.", + "noDateSelected": "لطفاً حداقل یک تاریخ انتخاب کنید", + "selectDateRange": "بازه زمانی حساب‌های منقضی شده برای حذف را انتخاب کنید (فقط تاریخ‌های گذشته قابل انتخاب هستند)" + }, + "resetUsage": { + "title": "بازنشانی کل مصرف داده‌ها", + "description": "بازنشانی مصرف داده‌ها برای همه حساب‌ها در سیستم", + "resetAll": "بازنشانی همه مصرف‌ها", + "resetting": "در حال بازنشانی...", + "resetSuccess": "همه مصرف داده‌ها با موفقیت بازنشانی شد", + "resetFailed": "بازنشانی مصرف داده‌ها ناموفق بود", + "confirmReset": "بازنشانی همه مصرف داده‌ها", + "confirmResetMessage": "آیا مطمئن هستید که می‌خواهید مصرف داده‌ها را برای همه حساب‌ها بازنشانی کنید؟ این عمل قابل بازگشت نیست.", + "warning": "این عمل مصرف داده‌ها را برای همه حساب‌ها در سیستم بازنشانی می‌کند" + }, + "clearUsageData": { + "title": "پاک کردن داده‌های مصرف", + "description": "حذف دائمی داده‌های مصرف از جداول انتخاب شده پایگاه داده", + "selectTable": "انتخاب جدول", + "selectTablePlaceholder": "جدولی برای پاک کردن انتخاب کنید", + "noTableSelected": "لطفاً جدولی برای پاک کردن انتخاب کنید", + "dataAfter": "داده‌ها بعد از", + "dataBefore": "داده‌ها قبل از", + "dataAfterPlaceholder": "تاریخ شروع را انتخاب کنید", + "dataBeforePlaceholder": "تاریخ پایان را انتخاب کنید", + "selectDateRange": "بازه زمانی برای فیلتر کردن داده‌ها بر اساس زمان ایجاد انتخاب کنید (اختیاری - برای پاک کردن همه داده‌ها خالی بگذارید)", + "clearData": "پاک کردن داده‌ها", + "clearing": "در حال پاک کردن...", + "clearSuccess": "داده‌ها از جدول {{table}} با موفقیت پاک شد", + "clearFailed": "پاک کردن داده‌های مصرف ناموفق بود", + "confirmClear": "تأیید پاک کردن داده‌ها", + "confirmClearMessage": "آیا مطمئن هستید که می‌خواهید تمام داده‌ها از جدول {{table}} را به طور دائمی حذف کنید؟ این عمل قابل بازگشت نیست.", + "warning": "هشدار: این عمل تمام داده‌های مصرف را از جدول انتخاب شده به طور دائمی حذف می‌کند. این عمل قابل بازگشت نیست.", + "tables": { + "nodeUserUsages": "مصرف کاربران گره", + "userUsages": "مصرف کاربران" + } + } + }, + "theme": { + "title": "تم" + }, + "general": { + "title": "عمومی", + "description": "پیکربندی تنظیمات پایه برای سیستم شما", + "loadError": "بارگیری تنظیمات عمومی ناموفق بود. لطفاً دوباره تلاش کنید.", + "saveSuccess": "تنظیمات عمومی با موفقیت ذخیره شد", + "saveFailed": "ذخیره تنظیمات عمومی ناموفق بود", + "cancelSuccess": "تغییرات لغو شد و تنظیمات اصلی بازیابی شد", + "defaultFlow": { + "title": "جریان VLESS پیش‌فرض", + "description": "پر کردن خودکار فیلد جریان برای کاربران جدید VLESS" + }, + "defaultMethod": { + "title": "روش پیش‌فرض Shadowsocks", + "description": "پر کردن خودکار روش رمزنگاری برای کاربران جدید Shadowsocks" + }, + "errorLoadingSettings": "خطا در بارگذاری تنظیمات" + } + }, + "saving": "در حال ذخیره...", + "general": "عمومی", + "loading": "در حال بارگذاری...", + "noResults": "نتیجه‌ای یافت نشد", + "emptyState": { + "noUsers": { + "title": "هنوز کاربری وجود ندارد", + "description": "با ایجاد اولین حساب کاربری شروع کنید", + "createFirstUser": "ایجاد اولین کاربر" + } + }, + "core": "هسته‌ها", + "activeUsers": "کاربران فعال", + "apply": "تایید", + "cancel": "لغو", + "created": "ایجاد شده", + "by": "توسط", + "ip": "آی‌پی", + "admin": "مدیر", + "sudo": "sudo", + "save": "ذخیره", + "test": "تست", + "testing": "در حال تست", + "confirm": "تایید", + "admins": { + "title": "مدیران", + "description": "مدیریت مدیران سیستم", + "createAdmin": "ایجاد مدیر", + "editAdmin": "ویرایش مدیر", + "deleteAdmin": "حذف مدیر", + "username": "نام کاربری", + "password": "رمز عبور", + "isSudo": "sudo", + "createdAt": "تاریخ ایجاد", + "actions": "عملیات", + "createSuccess": "مدیر «{{name}}» با موفقیت ایجاد شد", + "createFailed": "ایجاد مدیر «{{name}}» ناموفق بود", + "editSuccess": "مدیر «{{name}}» با موفقیت به‌روزرسانی شد", + "editFailed": "به‌روزرسانی مدیر «{{name}}» ناموفق بود", + "deleteSuccess": "مدیر {{name}} با موفقیت حذف شد", + "deleteFailed": "حذف مدیر {{name}} ناموفق بود", + "enterUsername": "نام کاربری را وارد کنید", + "enterPassword": "رمز عبور را وارد کنید", + "sudo": "دسترسی sudo", + "edit": "ذخیره تغییرات", + "create": "ایجاد مدیر", + "status": "وضعیت", + "role": "نقش", + "total.users": "کل کاربران", + "used.traffic": "ترافیک مصرف‌ شده", + "monitor.traffic": "نظارت بر ترافیک مصرف شده", + "monitor.no_traffic": "هیچ ترافیکی وجود ندارد", + "total": "کل مدیران", + "active": "مدیران فعال", + "disable": "مدیران غیرفعال", + "telegramId": "شناسه تلگرام", + "discord": "وبهوک دیسکورد", + "supportUrl": "آدرس پشتیبانی", + "subDomain": "دامنه اشتراک", + "profile": "عنوان پروفایل", + "subTemplate": "مسیر قالب اشتراک", + "passwordConfirm": "تأیید رمز عبور", + "enterPasswordConfirm": "رمز عبور را دوباره وارد کنید", + "disableSuccess": "مدیر «{{name}}» با موفقیت غیرفعال شد", + "enableSuccess": "مدیر «{{name}}» با موفقیت فعال شد", + "disableFailed": "غیرفعال‌سازی مدیر «{{name}}» با شکست مواجه شد", + "enableFailed": "فعال‌سازی مدیر «{{name}}» با شکست مواجه شد", + "resetUsersUsage": "ریست مصرف کاربران توسط ادمین", + "resetUsageSuccess": "مصرف کاربر «{{name}}» با موفقیت توسط ادمین ریست شد", + "resetUsageFailed": "ریست مصرف کاربر «{{name}}» توسط ادمین ناموفق بود", + "reset": "ریست مصرف", + "discordId": "شناسه دیسکورد", + "lifetime.used.traffic": "مجموع کل", + "used": { + "traffic": "مصرف ترافیک" + }, + "monitor": { + "traffic": "نظارت بر مصرف ترافیک مدیر در طول زمان", + "no_traffic": "داده‌ای برای ترافیک موجود نیست" + } + }, + "shortcuts": { + "title": "میانبرهای صفحه‌کلید", + "description": "میانبرهای داشبورد خود را برای دسترسی سریع مدیریت کنید", + "add": "افزودن میانبر", + "empty": "هیچ میانبری پیکربندی نشده است" + }, + "quickActions": { + "title": "عملیات سریع", + "description": "عملیاتی را برای ایجاد آیتم‌های جدید در سیستم انتخاب کنید", + "comingSoon": "به زودی" + }, + "resetUsersUsage.prompt": "آیا مطمئن هستید که می‌خواهید مصرف کاربر ادمین {{name}} را ریست کنید؟", + "admin.disable": "غیر فعالسازی مدیر", + "admin.enable": "فعالسازی مدیر", + "deleteAdmin.prompt": "آیا مطمئن هستید که می‌خواهید مدیر {{name}} را حذف کنید؟", + "activeUsers.prompt": "آیا می‌خواهید همه کاربران تحت مدیریت {{name}} را فعال کنید؟", + "disableUsers.prompt": "آیا می‌خواهید همه کاربران تحت مدیریت {{name}} را غیرفعال کنید؟", + "manageAccounts": "کنترل، بروزرسانی، و ترتیب حساب‌های کاربری", + "manageGroups": "کنترل، بروزرسانی، و ترتیب گروه‌های کاربری", + "manageNodes": "نظارت، کنترل، افزودن، ویرایش و حذف گره‌ها", + "edit": "ویرایش", + "editGroup": "ویرایش گروه", + "disable": "غیرفعال کردن", + "warning": "هشدار", + "remove": "حذف", + "modify": "ویرایش", + "templates.userTemplates": "قالب‌ها", + "editUserTemplateModal.title": "ویرایش قالب کاربر", + "userTemplateModal.title": "ایجاد قالب کاربر", + "templates": { + "title": "قالب‌ها", + "description": "مدیریت قالب‌های شما", + "addTemplate": "ایجاد قالب", + "editSuccess": "قالب کاربر «{{name}}» با موفقیت به‌روزرسانی شد", + "createSuccess": "قالب کاربر «{{name}}» با موفقیت ایجاد شد", + "editFailed": "به‌روزرسانی قالب کاربر «{{name}}» ناموفق بود", + "createFailed": "ایجاد قالب کاربر «{{name}}» ناموفق بود", + "name": "نام", + "status": "وضعیت", + "prefix": "پیشوند نام کاربری", + "suffix": "پسوند نام کاربری", + "dataLimit": "محدودیت داده", + "expire": "مدت انقضا", + "onHoldTimeout": "زمان انتظار توقف", + "method": "روش", + "flow": "جریان", + "groups": "گروه‌ها", + "userDataLimitStrategy": "استراتژی بازنشانی محدودیت داده‌ها", + "resetUsage": "بازنشانی استفاده", + "groupsExistingWarning": "شما هنوز هیچ گروهی اضافه نکرده‌اید.", + "deleteSuccess": "قالب {{name}} با موفقیت حذف شد", + "deleteFailed": "حذف قالب {{name}} ناموفق بود", + "deleteUserTemplateTitle": "حذف قالب کاربر", + "deleteUserTemplatePrompt": "آیا مطمئن هستید که می‌خواهید قالب {{name}} را حذف کنید؟", + "duplicateSuccess": "قالب «{{name}}» با موفقیت کپی شد", + "duplicateFailed": "کپی کردن قالب «{{name}}» ناموفق بود", + "enableSuccess": "قالب «{{name}}» با موفقیت فعال شد", + "disableSuccess": "قالب «{{name}}» با موفقیت غیرفعال شد", + "enableFailed": "فعال‌سازی مدیر «{{name}}» ناموفق بود", + "disableFailed": "غیرفعال‌سازی مدیر «{{name}}» ناموفق بود", + "resetUsages": "ریست مصرف" + }, + "core.configuration": "پیکربندی", + "core.generalErrorMessage": "مشکلی پیش آمده، لطفا پیکربندی را بررسی کنید", + "core.logs": "گزارش", + "core.restartCore": "اجرا مجدد هسته", + "core.restarting": "درحال اجرا مجدد...", + "core.save": "ذخیره", + "core.socket.closed": "بسته شده", + "core.socket.connected": "متصل", + "core.socket.connecting": "در حال اتصال...", + "core.socket.not_connected": "عدم اتصال", + "core.successMessage": "تنظیمات هسته با موفقیت ثبت شد", + "core.title": "تنظیمات هسته", + "createNewUser": "ساخت کاربر", + "createUser": "افزودن کاربر", + "createGroup": "افزودن گروه", + "dataUsage": "مصرف داده", + "dateFormat": "MM/dd/yyyy", + "dateInfo.day": " روز", + "dateInfo.hour": " ساعت", + "dateInfo.min": " دقیقه", + "dateInfo.month": " ماه", + "dateInfo.year": " سال", + "delete": "حذف", + "deleteNode.deleteSuccess": "گره {{name}} با موفقیت حذف شد", + "deleteNode.prompt": "از حذف گره {{name}} مطمئن هستید؟", + "deleteNode.title": "حذف گره", + "deleteHost.title": "حذف هاست", + "deleteHost.prompt": "آیا مطمئن هستید که می‌خواهید هاست {{name}} را حذف کنید؟", + "deleteHost.deleteSuccess": "هاست {{name}} با موفقیت حذف شد", + "deleteHost.deleteFailed": "حذف هاست {{name}} ناموفق بود", + "editNode.editSuccess": "گره {{name}} با موفقیت بروزرسانی شد", + "editNode.title": "ویرایش گره", + "deleteUser.deleteSuccess": "{{username}} با موفقیت حذف شد.", + "deleteUser.prompt": "از حذف کاربر {{username}} مطمئن هستید?", + "deleteUser.title": "حذف کاربر", + "disabled": "غیر فعال", + "expire": "انقضا", + "expired": "پایان یافته در {{time}}", + "expires": "پایان در {{time}}", + "header.donation": "کمک مالی", + "header.hostSettings": "تنظیمات هاست", + "header.logout": "خروج", + "header.nodeSettings": "تنظیمات گره‌ها", + "header.nodesUsage": "نمودار گره‌ها", + "hostsDialog": { + "addHost": "افزودن هاست", + "loading": "در حال بارگذاری...", + "port": "پورت", + "fingerprint": "اثر انگشت", + "sni": "SNI", + "sniPlaceholder": "SNI (مثال: example.com)", + "host": "هاست", + "path": "مسیر", + "selectAlpn": "انتخاب ALPN", + "networkSettings": "تنظیمات شبکه", + "transportSettings": "تنظیمات انتقال", + "transportType": "نوع انتقال", + "selectTransport": "انتخاب نوع انتقال", + "serviceName": "نام سرویس", + "enterServiceName": "نام سرویس gRPC را وارد کنید", + "seed": "سید", + "enterSeed": "سید KCP را وارد کنید", + "enterPath": "مسیر را وارد کنید (مثال: /xray)", + "enterHost": "هاست را وارد کنید (مثال: example.com)", + "header": "هدر", + "selectHeader": "نوع هدر را انتخاب کنید", + "multiMode": "حالت چندگانه", + "securitySettings": "تنظیمات امنیتی", + "camouflagSettings": "تنظیمات مخفی‌سازی", + "security": "امنیت", + "alpn": "ALPN", + "allowInsecure": "اجازه ناامن", + "muxEnable": "فعال‌سازی Mux", + "randomUserAgent": "استفاده از User-Agent تصادفی", + "inboundDefault": "ورودی پیش‌فرض", + "earlyData": "داده‌های اولیه", + "httpHeaders": "هدرهای HTTP", + "headersName": "نام هدر", + "headersValue": "مقدار هدر", + "addHeader": "افزودن هدر", + "removeHeader": "حذف هدر", + "createSuccess": "هاست «{{name}}» با موفقیت ایجاد شد", + "createFailed": "ایجاد هاست «{{name}}» با خطا مواجه شد", + "editSuccess": "هاست «{{name}}» با موفقیت ویرایش شد", + "editFailed": "ویرایش هاست «{{name}}» با خطا مواجه شد", + "selectInbound": "انتخاب ورودی", + "selectStatus": "انتخاب وضعیت", + "remarkRequired": "توضیحات الزامی است", + "address": "آدرس", + "addressRequired": "آدرس الزامی است", + "portRequired": "پورت الزامی است", + "status": { + "label": "وضعیت", + "active": "فعال", + "disabled": "غیرفعال", + "limited": "محدود", + "expired": "منقضی شده", + "onHold": "در انتظار" + }, + "noStatus": "وضعیتی انتخاب نشده", + "clearAllStatuses": "پاک کردن همه وضعیت‌ها", + "transportSettingsAccordion": "تنظیمات انتقال", + "xhttp": { + "mode": "حالت", + "noGrpcHeader": "بدون هدر gRPC", + "xPaddingBytes": "بایت‌های X-Padding", + "scMaxEachPostBytes": "حداکثر بایت هر پست", + "scMinPostsIntervalMs": "حداقل فاصله پست‌ها (میلی‌ثانیه)", + "scMaxBufferedPosts": "حداکثر پست‌های بافر شده", + "scStreamUpServerSecs": "سرور استریم بالا (ثانیه)", + "xmux": "تنظیمات XMux", + "maxConcurrency": "حداکثر همزمانی", + "maxConnections": "حداکثر اتصالات", + "cMaxReuseTimes": "حداکثر دفعات استفاده مجدد", + "cMaxLifetime": "حداکثر طول عمر", + "hMaxRequestTimes": "حداکثر دفعات درخواست", + "hKeepAlivePeriod": "دوره نگهداری اتصال", + "downloadSettings": "تنظیمات دانلود", + "downloadSettingsInfo": "انتخاب هاست برای تنظیمات دانلود", + "selectDownloadSettings": "انتخاب هاست تنظیمات دانلود" + }, + "grpc": { + "multiMode": "حالت چندگانه", + "idleTimeout": "مهلت بیکاری", + "healthCheckTimeout": "مهلت بررسی سلامت", + "permitWithoutStream": "اجازه بدون جریان", + "initialWindowsSize": "اندازه اولیه پنجره" + }, + "kcp": { + "header": "هدر", + "mtu": "MTU", + "tti": "TTI", + "uplinkCapacity": "ظرفیت آپلینک", + "downlinkCapacity": "ظرفیت دانلینک", + "congestion": "تراکم", + "readBufferSize": "اندازه بافر خواندن", + "writeBufferSize": "اندازه بافر نوشتن" + }, + "tcp": { + "title": "تنظیمات TCP", + "header": "نوع هدر", + "request": { + "title": "تنظیمات درخواست", + "version": "نسخه HTTP", + "method": "متد HTTP", + "headers": "هدرهای درخواست" + }, + "response": { + "title": "تنظیمات پاسخ", + "version": "نسخه HTTP", + "status": "کد وضعیت", + "reason": "دلیل وضعیت", + "headers": "هدرهای پاسخ" + }, + "headerName": "نام هدر", + "headerValue": "مقدار هدر", + "addHeader": "افزودن هدر", + "removeHeader": "حذف هدر", + "requestHeaders": "هدرهای درخواست", + "responseHeaders": "هدرهای پاسخ" + }, + "websocket": { + "heartbeatPeriod": "دوره ضربان قلب" + }, + "fragment": { + "title": "قطعه‌بندی", + "packets": "بسته‌ها", + "packetsPlaceholder": "تعداد بسته‌ها را وارد کنید", + "length": "طول", + "lengthPlaceholder": "طول را وارد کنید", + "interval": "فاصله", + "intervalPlaceholder": "فاصله را وارد کنید", + "allFieldsRequired": "اگر یک فیلد پر شود، همه فیلدها باید پر شوند", + "info": "طول،فاصله،بسته (مثال: 10-100,100-200,tlshello)", + "info.attention": "توجه: در حال حاضر، این ویژگی فقط در streisand >= 1.6.12 و v2rayNG >= 1.8.16 (پیکربندی سفارشی) پشتیبانی می‌شود", + "info.examples": "مثال‌ها:", + "fragment": "قطعه‌بندی", + "fallbackDelay": "تأخیر بازگشت", + "recordFragment": "ضبط قطعه" + }, + "noise": { + "title": "نویز", + "type": "نوع", + "addNoise": "افزودن نویز", + "removeNoise": "حذف نویز", + "noNoiseSettings": "هیچ تنظیمات نویزی پیکربندی نشده", + "packet": "بسته", + "packetPlaceholder": "مقدار پکت را وارد کنید (مثال: rand:10-20)", + "delay": "تاخیر", + "delayPlaceholder": "تاخیر را وارد کنید", + "rand": "تصادفی", + "info": "بسته،تاخیر (مثال: rand:10-20,100-200)", + "info.attention": "توجه: در حال حاضر، این ویژگی فقط در streisand >= 1.6.32 و v2rayNG >= 1.8.39 (پیکربندی سفارشی) پشتیبانی می‌شود", + "info.examples": "مثال‌ها:" + }, + "muxSettings": "تنظیمات Mux", + "enableMux": "فعال‌سازی Mux", + "xraySettings": "تنظیمات Xray", + "singBoxSettings": "تنظیمات Sing-box", + "clashSettings": "تنظیمات Clash", + "addXraySettings": "افزودن تنظیمات Xray", + "addSingBoxSetting": "افزودن تنظیمات Sing-box", + "addClashSettings": "افزودن تنظیمات Clash", + "protocol": "پروتکل", + "selectProtocol": "انتخاب پروتکل", + "maxConnections": "حداکثر اتصالات", + "maxStreams": "حداکثر جریان‌ها", + "minStreams": "حداقل جریان‌ها", + "padding": "فعال‌سازی پدینگ", + "enabled": "فعال", + "concurrency": "همزمانی", + "xudpConcurrency": "همزمانی XUDP", + "xudpProxy443": "پروکسی XUDP 443", + "selectXudpProxy443": "انتخاب پروکسی XUDP 443", + "statistic": "فعال‌سازی آمار", + "onlyTcp": "فقط TCP", + "brutal": { + "enable": "فعال‌سازی Brutal", + "title": "تنظیمات Brutal", + "upMbps": "سرعت آپلود (مگابیت بر ثانیه)", + "downMbps": "سرعت دانلود (مگابیت بر ثانیه)" + }, + "variables": { + "title": "از این متغیرها برای پویا کردن استفاده کنید", + "server_ip": "آدرس IP سرور فعلی", + "server_ipv6": "آدرس IPv6 سرور فعلی", + "username": "نام کاربری", + "data_usage": "مصرف داده فعلی", + "data_left": "داده باقی‌مانده", + "data_limit": "محدودیت مصرف داده", + "days_left": "روزهای باقی‌مانده", + "expire_date": "تاریخ انقضا", + "jalali_expire_date": "تاریخ انقضا به تقویم خورشیدی", + "time_left": "زمان باقی‌مانده", + "status_emoji": "وضعیت کاربر به صورت ایموجی (✅,⌛️,🪫,❌,🔌)", + "protocol": "پروتکل پروکسی (مثال: VMess)", + "transport": "روش انتقال پروکسی (مثال: ws)", + "admin_username": "نام کاربری ادمین" + }, + "advancedOptions": "تنظیمات پیشرفته", + "host.info": "به طور پیش‌فرض، اگر هاست درخواست در پیکربندی XRAY تنظیم شده باشد، از آن استفاده می‌شود. با این حال، در صورت نیاز، می‌توانید یک هاست درخواست سفارشی در اینجا تنظیم کنید.", + "host.multiHost": "برای تنظیم چند آدرس، آنها را با , جدا کنید. هر بار یک آدرس به صورت تصادفی انتخاب می‌شود.", + "host.wildcard": "از * برای تولید یک رشته تصادفی استفاده کنید (برای دامنه‌های wildcard کار می‌کند)", + "path.info": "تنظیم مسیر برای کاربران هاست، مفید در پشت پروکسی معکوس.", + "port.info": "به طور پیش‌فرض، هاست از پورت اعلام شده در ورودی استفاده می‌کند. اگر ترافیک از پورت دیگری هدایت می‌شود، می‌توانید پورت سفارشی تنظیم کنید. به عنوان مثال، سرور ممکن است ترافیک را از پورت 443 به پورت پیش‌فرض ورودی شما هدایت کند.", + "proxyOutbound.info": "ترافیک خروجی اضافی (فقط در پیکربندی سفارشی v2ray)", + "security.info": "اگر سرور واسط این هاست از لایه امنیتی متفاوتی نسبت به پیش‌فرض ورودی شما استفاده می‌کند، می‌توانید لایه امنیتی سفارشی را اینجا تنظیم کنید.", + "useSniAsHost": "استفاده از SNI به عنوان هاست", + "echConfigList": "لیست پیکربندی ECH", + "echConfigList.info": "لیست پیکربندی Encrypted Client Hello (ECH). این یک رشته کدگذاری شده با base64 است.", + "echConfigListPlaceholder": "لیست پیکربندی ECH را وارد کنید", + "httpVersions": { + "1.0": "HTTP/1.0", + "1.1": "HTTP/1.1", + "2.0": "HTTP/2.0", + "3.0": "HTTP/3.0" + }, + "httpMethods": { + "GET": "GET", + "POST": "POST", + "PUT": "PUT", + "DELETE": "DELETE", + "HEAD": "HEAD", + "OPTIONS": "OPTIONS", + "PATCH": "PATCH", + "TRACE": "TRACE", + "CONNECT": "CONNECT" + }, + "httpReasons": { + "100": "ادامه", + "101": "تغییر پروتکل", + "200": "موفق", + "201": "ایجاد شد", + "202": "پذیرفته شد", + "203": "اطلاعات غیرمجاز", + "204": "بدون محتوا", + "205": "بازنشانی محتوا", + "206": "محتوی جزئی", + "300": "انتخاب چندگانه", + "301": "انتقال دائمی", + "302": "پیدا شد", + "303": "مشاهده مکان دیگر", + "304": "تغییر نکرده", + "305": "استفاده از پراکسی", + "307": "انتقال موقت", + "308": "انتقال دائمی", + "400": "درخواست نامعتبر", + "401": "غیرمجاز", + "402": "نیاز به پرداخت", + "403": "ممنوع", + "404": "پیدا نشد", + "405": "متد مجاز نیست", + "406": "قابل قبول نیست", + "407": "نیاز به احراز هویت پراکسی", + "408": "زمان درخواست به پایان رسید", + "409": "تضاد", + "410": "حذف شده", + "411": "نیاز به طول", + "412": "شرط اولیه برقرار نیست", + "413": "بار درخواست خیلی بزرگ است", + "414": "URI خیلی طولانی است", + "415": "نوع رسانه پشتیبانی نمی‌شود", + "416": "محدوده درخواست قابل اجرا نیست", + "417": "انتظار برآورده نشد", + "418": "من یک قوری هستم", + "421": "درخواست اشتباه", + "422": "موجودیت غیرقابل پردازش", + "423": "قفل شده", + "424": "وابستگی شکست خورده", + "425": "خیلی زود", + "426": "نیاز به ارتقا", + "428": "نیاز به شرط اولیه", + "429": "درخواست‌های خیلی زیاد", + "431": "فیلدهای هدر درخواست خیلی بزرگ هستند", + "451": "به دلایل قانونی در دسترس نیست", + "500": "خطای داخلی سرور", + "501": "پیاده‌سازی نشده", + "502": "درگاه نامعتبر", + "503": "سرویس در دسترس نیست", + "504": "زمان درگاه به پایان رسید", + "505": "نسخه HTTP پشتیبانی نمی‌شود" + }, + "selectReason": "انتخاب دلیل" + }, + "inbound": "ورودی", + "remark": "اسم هاست", + "none": "هیچ", + "create": "ایجاد", + "itemsPerPage": "تعداد در صفحه", + "login": "ورود", + "login.fieldRequired": "این فیلد باید پر شود!", + "login.loginYourAccount": "وارد حساب خود شوید", + "login.welcomeBack": "خوش آمدید, لطفا اطلاعات خود را وارد کنید", + "memoryUsage": "مصرف حافظه", + "next": "بعدی", + "monitorServers": "نظارت بر سرورها و کاربران شما", + "manageServers": "کنترل جزئیات سرور شما", + "nodes.prompt": "افزودن و پیکربندی جزئیات گره", + "nodes.addHostForEveryInbound": "استفاده از این گره به عنوان هاست تمام ورودی‌ها", + "nodes.addNewPasarGuardNode": "افزودن گره پاسارگارد", + "nodes.addNode": "افزودن گره", + "nodes.addNodeSuccess": "گره {{name}} با موفقیت افزوده شد", + "nodes.apply": "ویرایش گره", + "nodes.certificate": "گواهی", + "nodes.certificateCopied": "گواهی در کلیپ‌بورد کپی شد", + "nodes.certificateDownloaded": "گواهی با موفقیت دانلود شد", + "nodes.certificateDescription": "برای راه‌اندازی نود، باید این گواهی را برای برقراری ارتباط امن بین سرور اصلی و نود پیکربندی کنید", + "nodes.connection-hint": "برای راه اندازی یک گره جدید، لازم است گواهی زیر را روی گره تنظیم کنید تا یک اتصال امن بین سرور اصلی و گره ایجاد شود.", + "nodes.download-certificate": "دانلود گواهی", + "nodes.editNode": "ویرایش گره", + "nodes.hide-certificate": "مخفی کردن گواهی", + "nodes.nodeAPIPort": "پورت API", + "nodes.nodeAddress": "آدرس", + "nodes.nodeName": "نام", + "nodes.nodePort": "پورت", + "nodes.reconnect": "اتصال مجدد", + "nodes.reconnecting": "درحال اتصال مجدد...", + "nodes.show-certificate": "نمایش دادن گواهی", + "nodes.title": "گره‌ها", + "nodes.usageCoefficient": "ضریب گره", + "on_hold": "در انتظار اتصال", + "duplicate": "تکرار", + "createAndManageTemplates": "ایجاد و مدیریت قالب‌ها", + "password": "گذرواژه", + "previous": "قبلی", + "qrcodeDialog.sublink": "لینک اشتراک", + "reset": "بازنشانی", + "resetAllUsage": "بازنشانی کل مصرف", + "resetAllUsage.error": "بازنشانی مصرف انجام نشد، دوباره تلاش کنید.", + "resetAllUsage.prompt": "این عمل مصرف تمام کاربران را بازنشانی می‌کند. از این بازنشانی مطمئن هستید؟ این عمل قابل بازگشت نیست!", + "resetAllUsage.success": "مصرف کل با موفقیت بازنشانی شد.", + "resetAllUsage.title": "بازنشانی مصرف تمام کاربران", + "resetUserUsage.error": "بازنشانی مصرف انجام نشد، دوباره تلاش کنید.", + "resetUserUsage.prompt": "از بازنشانی مصرف {{username}} مطئمن هستید؟", + "resetUserUsage.success": "مصرف {{username}} با موفقیت بازنشانی شد.", + "resetUserUsage.title": "بازنشانی مصرف کاربر", + "revoke": "بازنشانی", + "revokeUserSub.error": "بازنشانی اشتراک انجام نشد، لطفاً دوباره امتحان کنید.", + "revokeUserSub.prompt": "آیا مطمئن هستید که می خواهید اشتراک «{{username}}» را بازنشانی کنید؟", + "revokeUserSub.success": "اشتراک {{username}} با موفقیت بازنشانی شد.", + "revokeUserSub.title": "بازنشانی اشتراک کاربر", + "subscriptionClients": { + "title": "کلاینت‌های اشتراک", + "viewAllClients": "مشاهده کلاینت‌ها", + "total": "مجموع: {{count}} کلاینت", + "showing": "نمایش آخرین {{count}} دسترسی", + "noClients": "هیچ کلاینت اشتراکی یافت نشد", + "noClientsDesc": "این کاربر هنوز به اشتراک خود دسترسی نداشته است", + "knownClient": "شناخته شده", + "unknown": "نامشخص", + "error": "بارگیری کلاینت‌های اشتراک ناموفق بود" + }, + "search": "جستجو", + "status.active": "فعال", + "status.enable": "فعال", + "status.disabled": "غیرفعال", + "status.expired": "منقضی شده", + "status.limited": "اتمام حد مصرف", + "status.on_hold": "در انتظار اتصال", + "nodeModal.status.error": "خطا در اتصال", + "nodeModal.status.disabled": "غیرفعال", + "nodeModal.status.connecting": "درحال اتصال", + "nodeModal.status.connected": "متصل", + "userDialog.absolute": "مطلق", + "userDialog.custom": "انتخابی", + "userDialog.dataLimit": "حد مصرف داده", + "userDialog.days": "روزها", + "userDialog.editUser": "ویرایش کاربر", + "userDialog.editUserTitle": "ویرایش کاربر", + "userDialog.endDate": "تاریخ پایان", + "userDialog.expiryDate": "تاریخ پایان", + "userDialog.timeOutDate": "تاریخ تایم اوت", + "userDialog.generatedByDefault": "پیش‌فرض ساخته می‌شود", + "userDialog.hours": "ساعات", + "userDialog.method": "روش", + "userDialog.months": "ماه‌ها", + "userDialog.note": "توضیحات", + "userDialog.onHold": "در انتظار", + "userDialog.onHoldExpireDuration": "مدت انقضا", + "userDialog.onHoldExpireDurationPlaceholder": "به عنوان مثال: 7", + "userDialog.optional": "اختیاری", + "userDialog.periodicUsageReset": "بازنشانی دوره‌ای مصرف", + "userDialog.protocols": "پروتکل‌ها", + "userDialog.relative": "نسبی", + "userDialog.resetStrategyAnnually": "سالانه", + "userDialog.resetStrategyDaily": "روزانه", + "userDialog.resetStrategyMonthly": "ماهانه", + "userDialog.resetStrategyNo": "خیر", + "userDialog.resetStrategyWeekly": "هفتگی", + "userDialog.resetUsage": "بازنشانی مصرف", + "userDialog.revokeSubscription": "بازنشانی اشتراک", + "userDialog.subscriptionInfo": "اطلاعات اشتراک", + "userDialog.subscriptionUpdated": "آخرین بروزرسانی", + "userDialog.lastClient": "آخرین کلاینت", + "userDialog.subscriptionNotAccessed": "هنوز دسترسی نشده", + "userDialog.unknownClient": "کلاینت ناشناخته", + "userDialog.selectOneProtocol": "لطفا حداقل یک پروتکل انتخاب کنید", + "userDialog.shadowsocksDesc": "سریع و امن، اما کارآمد کمتر از بقیه", + "userDialog.startDate": "تاریخ شروع", + "userDialog.total": "مجموع: ", + "userDialog.trojanDesc": "سبک، امن و فوق‌العاده سریع", + "userDialog.usage": "مصرف", + "userDialog.userAlreadyExists": "کاربر وجود دارد", + "userDialog.userCreated": "کاربر {{username}} ساخته شد.", + "userDialog.userEdited": "کاربر {{username}} ویرایش شد.", + "userDialog.vlessDesc": "سبک، سریع و امن", + "userDialog.vmessDesc": "سریع و امن", + "userDialog.warningNoProtocol": "لطفا حداقل یک پروتکل انتخاب کنید", + "userDialog.weeks": "هفته‌ها", + "userDialog.proxySettingsAccordion": "تنظیمات پروکسی", + "userDialog.proxySettings.vmess": "VMess", + "userDialog.proxySettings.vless": "VLESS", + "userDialog.proxySettings.trojan": "Trojan", + "userDialog.proxySettings.shadowsocks": "Shadowsocks", + "userDialog.proxySettings.id": "شناسه (ID)", + "userDialog.proxySettings.password": "رمز عبور", + "userDialog.proxySettings.method": "روش رمزنگاری", + "userDialog.proxySettings.flow": "جریان (Flow)", + "userDialog.proxySettings.desc": "تنظیمات اختصاصی پروتکل برای این کاربر را پیکربندی کنید.", + "userDialog.expireDate": "تاریخ انقضا", + "username": "نام کاربری", + "users": "کاربران", + "usersTable.copied": "کپی شد", + "usersTable.copyConfigs": "تنظیمات کپی", + "usersTable.copyLink": "کپی لینک اشتراک", + "usersTable.dataUsage": "مصرف داده", + "usersTable.noUser": "کاربری افزوده نشده است", + "usersTable.noUserMatched": "به‌نظر میرسه کاربری که جستجو کردید، وجود ندارد", + "usersTable.status": "وضعیت", + "usersTable.total": "مجموع", + "statistics.system": "سیستم", + "statistics.totalTraffic": "کل ترافیک", + "statistics.ramUsage": "مصرف رم", + "statistics.cpuUsage": "مصرف پردازنده", + "statistics.cores": "هسته", + "statistics.serverSelection": "انتخاب سرور", + "statistics.selectServerToMonitor": "سروری را برای نظارت بر معیارهای عملکرد انتخاب کنید", + "statistics.selectServer": "انتخاب سرور", + "statistics.realTimeData": "داده‌های لحظه‌ای", + "statistics.historicalData": "داده‌های تاریخی", + "statistics.viewHistorical": "مشاهده تاریخی", + "statistics.viewRealtime": "مشاهده زمان واقعی", + "statistics.historical": "تاریخی", + "statistics.realtime": "زمان واقعی", + "statistics.realtimeDescription": "آمار و نمودارهای زنده برای سرورها و کاربران شما.", + "statistics.historicalDescription": "داده‌های عملکرد تاریخی سرور برای بازه زمانی انتخاب شده", + "statistics.selectTimeRange": "انتخاب بازه زمانی", + "statistics.selectTimeRangeDescription": "دوره مورد نظر را برای تجزیه و تحلیل داده‌های تاریخی انتخاب کنید", + "statistics.selectTimeRangeToView": "لطفاً یک بازه زمانی برای مشاهده داده‌های تاریخی انتخاب کنید", + "enable": "فعالسازی", + "editHost.title": "ویرایش هاست", + "host": { + "enableSuccess": "هاست «{{name}}» با موفقیت فعال شد", + "enableFailed": "فعال کردن هاست «{{name}}» با شکست مواجه شد", + "disableSuccess": "هاست «{{name}}» با موفقیت غیرفعال شد", + "disableFailed": "غیرفعال کردن هاست «{{name}}» با شکست مواجه شد", + "duplicateSuccess": "هاست «{{name}}» با موفقیت کپی شد", + "duplicateFailed": "کپی کردن هاست «{{name}}» با شکست مواجه شد", + "xudp_proxy_443": "پراکسی XUDP 443", + "reject": "رد کردن", + "allow": "اجازه دادن", + "skip": "رد شدن", + "priorityUpdated": "هاست‌ها با موفقیت به روز شدند", + "priorityUpdateError": "به روزرسانی هاست‌ها با شکست مواجه شد" + }, + "usersTable.sortByExpire": "مرتب‌سازی بر اساس زمان انقضا", + "group": { + "createSuccess": "گروه «{{name}}» با موفقیت ایجاد شد", + "createFailed": "ایجاد گروه «{{name}}» با خطا مواجه شد", + "editSuccess": "گروه «{{name}}» با موفقیت ویرایش شد", + "disableSuccess": "گروه «{{name}}» با موفقیت غیرفعال شد", + "disableFailed": "غیرفعال‌سازی گروه «{{name}}» با خطا مواجه شد", + "enableSuccess": "گروه «{{name}}» با موفقیت فعال شد", + "enableFailed": "فعال‌سازی گروه «{{name}}» با خطا مواجه شد", + "editFailed": "ویرایش گروه «{{name}}» با خطا مواجه شد", + "deleteSuccess": "گروه «{{name}}» با موفقیت حذف شد", + "deleteFailed": "حذف گروه «{{name}}» با خطا مواجه شد", + "deleteConfirm": "آیا مطمئن هستید که می‌خواهید گروه «{{name}}» را حذف کنید؟", + "deleteConfirmation": "حذف گروه" + }, + "name": "نام", + "nodeModal": { + "title": "افزودن گره", + "description": "افزودن یک گره جدید به شبکه", + "name": "نام گره", + "namePlaceholder": "نام گره را وارد کنید", + "address": "آدرس گره", + "addressPlaceholder": "آدرس گره را وارد کنید", + "port": "پورت گره", + "portPlaceholder": "پورت گره را وارد کنید", + "usageRatio": "نسبت استفاده", + "usageRatioPlaceholder": "نسبت استفاده را وارد کنید", + "maxLogs": "حداکثر لاگ‌ها", + "maxLogsPlaceholder": "حداکثر لاگ‌ها را وارد کنید", + "connectionType": "نوع اتصال", + "keepAlive": "نگهداری اتصال", + "keepAliveDescription": "تنظیم فاصله نگهداری اتصال", + "days": "روز", + "minutes": "دقیقه", + "seconds": "ثانیه", + "certificate": "گواهی", + "certificatePlaceholder": "گواهی را وارد کنید", + "status": "وضعیت گره", + "statusCheckSuccess": "گره با موفقیت متصل شد", + "statusCheckFailed": "اتصال به گره با شکست مواجه شد", + "errorDetails": "جزئیات خطا", + "connectionError": "خطای اتصال", + "retryConnection": "تلاش مجدد اتصال", + "configurationError": "خطای پیکربندی", + "validateConfig": "اعتبارسنجی پیکربندی", + "fillRequiredFields": "لطفا تمام فیلدهای الزامی را قبل از بررسی وضعیت پر کنید", + "apiKey": "کلید API", + "apiKeyPlaceholder": "کلید API گره را وارد کنید", + "generateUUID": "تولید UUID", + "coreConfig": "پیکربندی هسته", + "selectCoreConfig": "هسته را انتخاب کنید", + "hours": "ساعت", + "hideDetails": "مخفی کردن جزئیات", + "showDetails": "نمایش جزئیات", + "statusCheck": "بررسی وضعیت", + "statusChecking": "در حال بررسی...", + "reconnect": "دوباره متصل کن", + "reconnecting": "در حال دوباره متصل کردن...", + "sync": "همگام‌سازی", + "syncing": "در حال همگام‌سازی...", + "syncSuccess": "گره با موفقیت همگام‌سازی شد", + "syncFailed": "همگام‌سازی گره ناموفق بود", + "gatherLogs": "جمع‌آوری لاگ‌ها", + "gatherLogsDescription": "فعال‌سازی جمع‌آوری لاگ‌ها از این گره برای نظارت و عیب‌یابی", + "statusMessages": { + "checkUnavailableForNew": "بررسی وضعیت برای گره‌های جدید در دسترس نیست. ابتدا گره را ایجاد کنید تا بتوانید وضعیت آن را بررسی کنید." + }, + "onlineStats": { + "button": "آمار آنلاین", + "title": "آمار کاربران آنلاین", + "ipListTitle": "آدرس‌های IP برای {{username}}", + "nodeInfo": "گره: {{nodeName}}", + "searchPlaceholder": "نام کاربری را وارد کنید...", + "enterUsername": "لطفاً نام کاربری را وارد کنید", + "refreshed": "داده‌ها با موفقیت به‌روزرسانی شدند", + "refreshFailed": "به‌روزرسانی داده‌ها ناموفق بود", + "backToStats": "بازگشت به آمار", + "ipAddresses": "آدرس IP", + "errorLoading": "خطا در بارگذاری آمار کاربر", + "userNotOnline": "کاربر آنلاین نیست", + "searchUser": "برای مشاهده آمار آنلاین، کاربری را جستجو کنید", + "autoRefresh": "به‌روزرسانی خودکار هر 5 ثانیه", + "connections": "اتصال", + "protocols": "پروتکل", + "viewIPs": "مشاهده IP ‌ها", + "userNotFound": "کاربر '{{username}}' یافت نشد یا آنلاین نیست", + "errorLoadingIPs": "خطا در بارگذاری آدرس‌های IP کاربر" + } + }, + "nodes": { + "title": "گره‌ها", + "description": "مدیریت گره‌ها", + "addNode": "افزودن گره", + "editNode": "ویرایش گره", + "deleteNode": "حذف گره", + "nodeName": "نام گره", + "nodeAddress": "آدرس گره", + "nodePort": "پورت گره", + "usageCoefficient": "ضریب مصرف", + "connectionType": "نوع اتصال", + "serverCA": "گواهی سرور", + "keepAlive": "حفظ اتصال", + "maxLogs": "حداکثر لاگ‌ها", + "maxLogsPlaceHolder": "حداکثر لاگ‌ها را وارد کنید (ثانیه)", + "status": "وضعیت", + "actions": "عملیات", + "connected": "متصل", + "disconnected": "قطع شده", + "disabled": "غیرفعال", + "enabled": "فعال", + "createSuccess": "گره «{{name}}» با موفقیت ایجاد شد", + "createFailed": "ایجاد گره «{{name}}» با خطا مواجه شد", + "editSuccess": "گره «{{name}}» با موفقیت ویرایش شد", + "editFailed": "ویرایش گره «{{name}}» با خطا مواجه شد", + "deleteSuccess": "گره «{{name}}» با موفقیت حذف شد", + "deleteFailed": "حذف گره «{{name}}» با خطا مواجه شد", + "enableSuccess": "گره «{{name}}» با موفقیت فعال شد", + "enableFailed": "فعال‌سازی گره «{{name}}» با خطا مواجه شد", + "disableSuccess": "گره «{{name}}» با موفقیت غیرفعال شد", + "disableFailed": "غیرفعال‌سازی گره «{{name}}» با خطا مواجه شد", + "certificate": "گواهینامه", + "certificateCopied": "گواهینامه در کلیپ‌بورد کپی شد", + "certificateDownloaded": "گواهینامه با موفقیت دانلود شد", + "certificateDescription": "برای تنظیم گره، باید این گواهینامه را برای برقراری ارتباط امن بین سرور اصلی و گره پیکربندی کنید", + "selectNode": "یک گره انتخاب کنید", + "noNodes": "هیچ گره ای پیکربندی نشده", + "noNodesDescription": "پنل اصلی هیچ هسته‌ای ندارد. شما باید یک گره از", + "noNodesDescription2": "پیکربندی کرده و آن را به پنل متصل کنید.", + "logs": { + "title": "لاگ‌ها", + "description": "مشاهده و نظارت بر لاگ‌های گره‌ها", + "noLogs": "لاگی موجود نیست", + "timestamps": "زمان", + "search": "جستجوی لاگ", + "filter": "فیلتر لاگ‌ها", + "debug": "دیباگ", + "info": "اطلاعات", + "warning": "هشدار", + "error": "خطا", + "download": "دانلود لاگ‌ها", + "paused": "لاگ‌ها متوقف شده", + "resume": "ادامه", + "pause": "توقف", + "messagesBuffered": "پیام‌های ذخیره شده", + "linesLabel": "خطوط:", + "linesCount": "{{count}} خط", + "sinceLabel": "از:", + "all": "همه", + "timeFilters": { + "all": "کل زمان", + "1m": "۱ دقیقه", + "5m": "۵ دقیقه", + "15m": "۱۵ دقیقه", + "30m": "۳۰ دقیقه", + "1h": "۱ ساعت", + "2h": "۲ ساعت" + } + } + }, + "success": "موفق", + "error": "خطا", + "theme": { + "title": "تم", + "description": "سفارشی‌سازی تم برنامه شما", + "light": "روشن", + "dark": "تیره", + "system": "سیستم", + "selectTheme": "انتخاب تم", + "themeSaved": "تم با موفقیت ذخیره شد", + "themeChanged": "تم با موفقیت تغییر کرد", + "visitThemePage": "از صفحه تم برای سفارشی‌سازی بیشتر دیدن کنید", + "radiusSaved": "شعاع گوشه با موفقیت به‌روزرسانی شد", + "mode": "حالت", + "color": "رنگ", + "radius": "شعاع گوشه", + "zinc": "خاکستری", + "rose": "صورتی", + "blue": "آبی", + "green": "سبز", + "violet": "بنفش", + "orange": "نارنجی", + "yellow": "زرد", + "default": "پیش‌فرض", + "red": "قرمز", + "modeDescription": "نحوه نمایش رابط کاربری را انتخاب کنید", + "colorDescription": "طرح رنگی مورد نظر خود را انتخاب کنید", + "radiusDescription": "میزان گردی عناصر رابط کاربری را تنظیم کنید", + "lightDescription": "روشن و تمیز", + "darkDescription": "آسان برای چشم‌ها", + "systemDescription": "متناسب با دستگاه", + "preview": "پیش‌نمایش زنده", + "previewDescription": "تنظیمات تم خود را به صورت زمان واقعی ببینید", + "dashboardPreview": "پیش‌نمایش داشبورد", + "dashboardDescription": "نظارت بر عملکرد سیستم و مدیریت حساب‌های کاربری", + "currentTheme": "تم فعلی", + "sampleInput": "ورودی نمونه", + "primaryButton": "دکمه اصلی", + "resetToDefaults": "بازگشت به پیش‌فرض", + "resetDescription": "تمام تنظیمات تم را به مقادیر پیش‌فرض بازگردانید", + "resetting": "در حال بازگشت...", + "reset": "بازگشت", + "resetSuccess": "تم به تنظیمات پیش‌فرض بازگشت داده شد", + "resetFailed": "بازگشت تنظیمات تم ناموفق بود", + "radiusNone": "هیچ", + "radiusSmall": "کوچک", + "radiusMedium": "متوسط", + "radiusLarge": "بزرگ" + }, + "coreConfigModal": { + "addConfig": "افزودن پیکربندی هسته", + "createNewConfig": "ایجاد پیکربندی جدید هسته", + "editCore": "ویرایش پیکربندی هسته", + "invalidJson": "پیکربندی JSON نامعتبر است", + "createSuccess": "پیکربندی هسته «{{name}}» با موفقیت ایجاد شد", + "createFailed": "ایجاد پیکربندی هسته «{{name}}» با خطا مواجه شد", + "editSuccess": "پیکربندی هسته «{{name}}» با موفقیت به‌روزرسانی شد", + "editFailed": "به‌روزرسانی پیکربندی هسته «{{name}}» با خطا مواجه شد", + "keyPairGenerated": "جفت کلید با موفقیت تولید شد", + "shortIdGenerated": "شناسه کوتاه با موفقیت ایجاد شد", + "shortId": "شناسه کوتاه", + "shortIdCopied": "شناسه کوتاه در کلیپ‌بورد کپی شد", + "publicKeyCopied": "کلید عمومی در کلیپ‌بورد کپی شد", + "privateKeyCopied": "کلید خصوصی در کلیپ‌بورد کپی شد", + "jsonConfig": "پیکربندی JSON", + "editJson": "ویرایش پیکربندی JSON", + "name": "نام", + "namePlaceholder": "نام پیکربندی را وارد کنید", + "fallback": "پشتیبان", + "selectFallback": "پشتیبان را انتخاب کنید", + "excludedInbound": "ورودی‌های مستثنی", + "selectInbound": "ورودی را انتخاب کنید", + "inbound": "ورودی", + "generateKeyPair": "تولید جفت کلید", + "generateShortId": "تولید شناسه کوتاه", + "publicKey": "کلید عمومی", + "privateKey": "کلید خصوصی", + "clearAllFallbacks": "پاک‌کردن همه فال‌بک‌ها", + "clearAllExcluded": "پاک‌کردن همه ورودی‌های مستثنی‌شده", + "copyPublicKey": "کپی کلید عمومی", + "copyPrivateKey": "کپی کلید خصوصی", + "copyShortId": "کپی شناسه کوتاه", + "restartNodes": "راه‌اندازی مجدد گره‌ها", + "generateShadowsocksPassword": "تولید رمز عبور Shadowsocks", + "generatingShadowsocksPassword": "در حال تولید رمز عبور...", + "shadowsocksPassword": "رمز عبور Shadowsocks", + "shadowsocksPasswordCopied": "رمز عبور در کلیپ‌بورد کپی شد", + "copyShadowsocksPassword": "کپی رمز عبور", + "selectEncryptionMethod": "انتخاب روش رمزنگاری", + "regeneratePassword": "تولید مجدد رمز عبور" + }, + "settings.cores.title": "هسته‌ها", + "settings.cores.description": "مدیریت هسته‌های شما", + "settings.cores.addCore": "افزودن هسته", + "settings.cores.noCores": "هیچ هسته‌ای موجود نیست. یکی اضافه کنید تا شروع کنید.", + "settings.cores.duplicateSuccess": "پیکربندی هسته «{{name}}» با موفقیت کپی شد", + "settings.cores.duplicateFailed": "خطا در کپی پیکربندی هسته «{{name}}»", + "settings.cores.deleteSuccess": "هسته با موفقیت حذف شد", + "settings.cores.deleteFailed": "حذف هسته با خطا مواجه شد", + "settings.cores.delete": "حذف هسته", + "settings.cores.coreNotFound": "هسته یافت نشد", + "createdAt": "تاریخ ایجاد", + "toggle": "تغییر وضعیت", + "core.toggleSuccess": "هسته «{{name}}» با موفقیت تغییر وضعیت داده شد", + "core.toggleFailed": "تغییر وضعیت هسته «{{name}}» با خطا مواجه شد", + "core.deleteSuccess": "هسته «{{name}}» با موفقیت حذف شد", + "core.deleteFailed": "حذف هسته «{{name}}» با خطا مواجه شد", + "core.deleteConfirm": "آیا مطمئن هستید که می‌خواهید هسته «{{name}}» را حذف کنید؟", + "close": "بستن", + "copy": "کپی", + "validation": { + "generic": "{{field}} نامعتبر است", + "min": "{{field}} باید حداقل {{min}} باشد", + "max": "{{field}} باید حداکثر {{max}} باشد", + "required": "وارد کردن {{field}} الزامی است", + "invalid_type": "وارد کردن {{field}} الزامی است", + "too_small": "{{field}} خیلی کوتاه است", + "too_big": "{{field}} خیلی بلند است" + }, + "fields": { + "username": "نام کاربری", + "data_limit": "سقف مصرف داده", + "expire": "تاریخ پایان", + "note": "توضیحات", + "on_hold_expire_duration": "مدت تعلیق", + "group_ids": "گروه‌ها" + }, + "userDialog": { + "deleteSuccess": "کاربر «{{name}}» با موفقیت حذف شد.", + "resetUsageSuccess": "مصرف کاربر «{{name}}» بازنشانی شد.", + "revokeSubSuccess": "اشتراک کاربر «{{name}}» لغو شد.", + "activeNextPlanSuccess": "پلن بعدی برای کاربر «{{name}}» فعال شد.", + "activeNextPlanError": "فعال‌سازی پلن بعدی برای کاربر «{{name}}» با شکست مواجه شد.", + "deleteConfirmTitle": "حذف کاربر", + "deleteConfirm": "آیا مطمئن هستید که می‌خواهید کاربر «{{name}}» را حذف کنید؟", + "nextPlanTitle": "پلن بعدی", + "nextPlanTemplateId": "شناسه قالب", + "nextPlanDataLimit": "حجم داده (گیگابایت)", + "nextPlanExpire": "انقضا (روز)", + "nextPlanAddRemainingTraffic": "افزودن ترافیک باقی‌مانده", + "selectTemplate": "انتخاب قالب", + "selectTemplatePlaceholder": "یک قالب را انتخاب کنید", + "selectNode": "انتخاب گره", + "allNodes": "همه گره‌ها", + "activeNextPlan": "فعال‌سازی پلن بعدی", + "selectedGroups": "{{count}} گروه انتخاب شده", + "editError": "خطا در ویرایش کاربر «{{name}}»", + "createError": "خطا در ایجاد کاربر «{{name}}»", + "selectStatus": "انتخاب وضعیت", + "selectedTemplates": "{{count}} قالب انتخاب شده" + }, + "userSettings": { + "subscriptionUrlCopied": "لینک اشتراک در کلیپ‌بورد کپی شد" + }, + "sidebar.expand": "باز کردن منو", + "sidebar.collapse": "بستن منو", + "usersTable.deleteUserTitle": "حذف کاربر", + "usersTable.deleteUserPrompt": "آیا مطمئن هستید که می‌خواهید کاربر «{{name}}» را حذف کنید؟ این عملیات غیرقابل بازگشت است.", + "usersTable.deleteSuccess": "کاربر «{{name}}» با موفقیت حذف شد.", + "usersTable.deleteFailed": "حذف کاربر «{{name}}» با خطا مواجه شد. {{error}}", + "usersTable.delete": "حذف", + "usersTable.cancel": "لغو", + "statistics.trafficUsage": "میزان مصرف ترافیک", + "statistics.trafficUsageDescription": "کل مصرف ترافیک در تمام سرورها", + "statistics.usageDuringPeriod": "مصرف در دوره زمانی", + "statistics.users": "کاربران", + "statistics.onlineUsers": "کاربران آنلاین", + "statistics.limitedUsers": "کاربران محدود شده", + "statistics.activeUsers": "کاربران فعال", + "statistics.disabledUsers": "کاربران غیرفعال", + "statistics.expiredUsers": "کاربران منقضی شده", + "statistics.onHoldUsers": "کاربران در انتظار", + "statistics.allUsers": "همه کاربران", + "statistics.serverTraffic": "ترافیک سرور", + "statistics.nodeTrafficDistribution": "توزیع ترافیک نودها", + "statistics.noNodesAvailable": "هیچ نودی در دسترس نیست", + "statistics.noDataAvailable": "هیچ داده‌ای در دسترس نیست", + "statistics.noDataDescription": "یک بازه زمانی را انتخاب کنید تا آمار و روند مصرف ترافیک را مشاهده کنید.", + "statistics.noNodesDescription": "هیچ نودی در حال حاضر متصل نیست تا توزیع ترافیک را نمایش دهد.", + "statistics.loadingDescription": "در حال دریافت آخرین داده‌های آمار...", + "statistics.waitingForData": "در انتظار داده‌ها", + "statistics.waitingForDataDescription": "آمار لحظه‌ای در اینجا نمایش داده می‌شود پس از شروع جریان داده‌ها.", + "statistics.noDataInRange": "داده‌ای در بازه انتخابی وجود ندارد", + "statistics.noDataInRangeDescription": "هیچ داده ترافیکی برای دوره زمانی انتخابی یافت نشد. بازه زمانی متفاوتی را انتخاب کنید.", + "statistics.selectNodeToView": "یک نود را انتخاب کنید تا آمار دقیق را مشاهده کنید", + "statistics.userStatisticsDescription": "نمای کلی از وضعیت و فعالیت حساب‌های کاربری", + "errors.connectionFailed": "اتصال با خطا مواجه شد. لطفاً شبکه خود را بررسی کنید و دوباره تلاش کنید.", + "errors.statisticsLoadFailed": "بارگذاری آمار با خطا مواجه شد", + "usersTable.resetUsageTitle": "ریست مصرف کاربر", + "usersTable.resetUsagePrompt": "آیا مطمئن هستید که می‌خواهید مصرف «{{name}}» را ریست کنید؟", + "usersTable.resetUsageSubmit": "ریست مصرف", + "usersTable.resetUsageSuccess": "مصرف کاربر «{{name}}» با موفقیت ریست شد", + "usersTable.resetUsageFailed": "ریست مصرف کاربر «{{name}}» ناموفق بود", + "time": { + "expires": "منقضی می‌شود", + "expired": "منقضی شده", + "year": "سال", + "years": "سال", + "month": "ماه", + "months": "ماه", + "day": "روز", + "days": "روز", + "hour": "ساعت", + "hours": "ساعت", + "min": "دقیقه", + "mins": "دقیقه", + "second": "ثانیه", + "seconds": "ثانیه", + "ago": "پیش" + }, + "notConnectedYet": "هنوز متصل نشده", + "node.xrayVersion": "نسخه هسته", + "node.coreVersion": "نسخه گره", + "calendar": { + "selectRange": "انتخاب بازه زمانی", + "startDate": "تاریخ شروع", + "endDate": "تاریخ پایان" + }, + "usersTable": { + "usageChart": "نمودار مصرف", + "noUsageData": "داده‌ای برای این بازه زمانی وجود ندارد.", + "tryDifferentRange": "بازه زمانی دیگری را امتحان کنید.", + "trendingUp": "روند افزایشی", + "trendingDown": "روند کاهشی", + "usageSummary": "نمایش مجموع مصرف در بازه انتخاب شده.", + "activeNextPlanTitle": "فعال‌سازی پلن بعدی کاربر", + "activeNextPlanPrompt": "آیا مطمئن هستید که می‌خواهید پلن بعدی را برای «{{name}}» فعال کنید؟", + "activeNextPlanSubmit": "فعال‌سازی پلن بعدی" + }, + "setOwnerModal": { + "title": "تعیین مالک", + "currentOwner": "مالک فعلی:", + "none": "بدون مالک", + "selectAdmin": "انتخاب مالک جدید", + "confirm": "تعیین مالک", + "success": "مالک کاربر {{username}} با موفقیت به {{admin}} تغییر یافت.", + "error": "تغییر مالک کاربر {{username}} به {{admin}} ناموفق بود.", + "loadError": "بارگذاری لیست مدیران ناموفق بود." + }, + "bulk": { + "title": "عملیات گروهی", + "groups": "گروه‌ها", + "proxySettings": "تنظیمات پروکسی", + "proxySettingsDesc": "تنظیمات پروکسی را برای اعمال انتخاب کنید", + "applyToProxyDesc": "گروه‌ها، کاربران یا مدیرانی که می‌خواهید تنظیمات پروکسی را اعمال کنید انتخاب کنید", + "flowMethod": "جریان: {{flow}} | روش: {{method}}", + "expireDate": "تاریخ انقضا", + "dataLimit": "محدودیت حجم", + "groupsDesc": "مدیریت تخصیص گروه‌ها برای چندین کاربر و مدیر به طور همزمان. افزودن یا حذف گروه‌ها به صورت گروهی.", + "expireDateDesc": "تاریخ انقضا را برای اعمال انتخاب کنید", + "applyToExpireDesc": "گروه‌ها، کاربران یا مدیرانی که می‌خواهید تاریخ انقضا را اعمال کنید انتخاب کنید", + "noDateSelected": "تاریخی انتخاب نشده است", + "dataLimitDesc": "محدودیت حجم را به گیگابایت برای افزودن یا کسر وارد کنید", + "operationType": "نوع عملیات", + "groupsOperationDesc": "انتخاب کنید که آیا می‌خواهید گروه‌ها را به کاربران اضافه یا حذف کنید.", + "addGroups": "افزودن گروه‌ها", + "removeGroups": "حذف گروه‌ها", + "addExpiry": "افزودن به انقضا", + "subtractExpiry": "کاهش از انقضا", + "addDataLimit": "افزودن محدودیت حجم", + "subtractDataLimit": "کاهش محدودیت حجم", + "applyToDataLimitDesc": "گروه‌ها، کاربران یا مدیرانی که می‌خواهید محدودیت حجم را اعمال کنید انتخاب کنید", + "noLimitSet": "محدودیتی تنظیم نشده است", + "selectFlow": "انتخاب جریان", + "selectMethod": "انتخاب روش", + "applyChanges": "اعمال تغییرات", + "applyDescription": "اعمال تخصیص گروه‌ها و تنظیمات انتخاب شده به کاربران و مدیران انتخاب شده.", + "addGroupsToUsers": "افزودن گروه‌ها به کاربران", + "removeGroupsFromUsers": "حذف گروه‌ها از کاربران", + "confirmAddGroupsTitle": "تایید افزودن گروه‌ها", + "confirmAddGroupsDescription": "آیا مطمئن هستید که می‌خواهید {{totalGroups}} گروه را به {{totalTargets}} هدف اضافه کنید؟ این عمل گروه‌های انتخاب شده را به همه کاربران و مدیران انتخاب شده اختصاص خواهد داد.", + "confirmRemoveGroupsTitle": "تایید حذف گروه‌ها", + "confirmRemoveGroupsDescription": "آیا مطمئن هستید که می‌خواهید {{totalGroups}} گروه را از {{totalTargets}} هدف حذف کنید؟ این عمل گروه‌های انتخاب شده را از همه کاربران و مدیران انتخاب شده حذف خواهد کرد.", + "applySettings": "اعمال تنظیمات", + "settingsConfigured": "تنظیمات پیکربندی شده", + "noSettings": "بدون تنظیمات", + "searchGroups": "جستجوی گروه‌ها...", + "searchHasGroups": "جستجوی گروه‌های موجود...", + "searchUsers": "جستجوی کاربران...", + "searchAdmins": "جستجوی مدیران...", + "selectGroups": "انتخاب گروه‌ها", + "selectHasGroups": "انتخاب گروه‌های موجود", + "selectUsers": "انتخاب کاربران", + "selectAdmins": "انتخاب مدیران", + "expireDateLabel": "تاریخ انقضا", + "expireDateRequired": "لطفاً تاریخ انقضا را انتخاب کنید.", + "selectExpireDate": "انتخاب تاریخ انقضا", + "applyExpireDate": "اعمال تاریخ انقضا", + "applyExpireDescription": "اعمال تاریخ انقضای انتخاب شده به گروه‌ها، کاربران و مدیران انتخاب شده.", + "confirmApplyExpireTitle": "تایید اعمال تاریخ انقضا", + "confirmApplyExpireDescription": "آیا مطمئن هستید که می‌خواهید تاریخ انقضا {{expireDate}} را برای {{totalTargets}} مورد انتخابی اعمال کنید؟ این کار تاریخ انقضا را برای همه گروه‌ها، کاربران و مدیران انتخاب‌شده به‌روزرسانی می‌کند.", + "confirmApplyExpireDescriptionAll": "آیا مطمئن هستید که می‌خواهید تاریخ انقضا {{expireDate}} را برای همه کاربران، مدیران و گروه‌ها اعمال کنید؟ این کار تاریخ انقضا را برای همه به‌روزرسانی می‌کند.", + "insertExpireDatePlaceholder": "درج تاریخ انقضا", + "dataLimitLabel": "محدودیت حجم (گیگابایت)", + "dataLimitPlaceholder": "محدودیت حجم را به گیگابایت وارد کنید", + "dataLimitRequired": "لطفاً محدودیت حجم معتبر وارد کنید.", + "applyDataLimit": "اعمال محدودیت حجم", + "applyDataLimitDescription": "اعمال محدودیت حجم انتخاب شده به گروه‌ها، کاربران و مدیران انتخاب شده.", + "confirmApplyDataLimitTitle": "تایید اعمال محدودیت حجم", + "confirmApplyDataLimitDescription": "آیا مطمئن هستید که می‌خواهید محدودیت حجم {{dataLimit}} گیگابایت را برای {{totalTargets}} مورد انتخابی اعمال کنید؟ این کار محدودیت حجم را برای همه گروه‌ها، کاربران و مدیران انتخاب‌شده به‌روزرسانی می‌کند.", + "confirmApplyDataLimitDescriptionAll": "آیا مطمئن هستید که می‌خواهید محدودیت حجم {{dataLimit}} گیگابایت را برای همه کاربران، مدیران و گروه‌ها اعمال کنید؟ این کار محدودیت حجم را برای همه به‌روزرسانی می‌کند.", + "insertDataLimitPlaceholder": "درج محدودیت حجم", + "flowLabel": "جریان", + "methodLabel": "روش", + "selectFlowPlaceholder": "انتخاب جریان", + "selectMethodPlaceholder": "انتخاب روش", + "proxySettingsRequired": "لطفاً حداقل یک تنظیم پروکسی (جریان یا روش) را انتخاب کنید.", + "applyProxySettings": "اعمال تنظیمات پروکسی", + "applyProxyDescription": "اعمال تنظیمات پروکسی انتخاب شده به گروه‌ها، کاربران و مدیران انتخاب شده.", + "confirmApplyProxyTitle": "تایید اعمال تنظیمات پروکسی", + "confirmApplyProxyDescription": "آیا مطمئن هستید که می‌خواهید تنظیمات پروکسی را برای {{totalTargets}} مورد انتخابی اعمال کنید؟ این کار تنظیمات پروکسی را برای همه گروه‌ها، کاربران و مدیران انتخاب‌شده به‌روزرسانی می‌کند.", + "confirmApplyProxyDescriptionAll": "آیا مطمئن هستید که می‌خواهید تنظیمات پروکسی را برای همه کاربران، مدیران و گروه‌ها اعمال کنید؟ این کار تنظیمات پروکسی را برای همه به‌روزرسانی می‌کند.", + "noTargetsSelected": "لطفاً حداقل یک هدف را انتخاب کنید.", + "groupsDescShort": "گروه‌هایی که می‌خواهید اعمال کنید را انتخاب کنید", + "groupsCount": "{{count}} گروه", + "targetsCount": "{{count}} هدف", + "applyTo": "اعمال به", + "applyToDesc": "کاربر یا مدیری که می‌خواهید تنظیمات را اعمال کنید انتخاب کنید", + "confirmApplyGroupsDescriptionAll": "آیا مطمئن هستید که می‌خواهید تغییرات گروه را برای همه کاربران، مدیران و گروه‌ها اعمال کنید؟ این کار گروه‌ها را برای همه به‌روزرسانی می‌کند.", + "confirmApplyGroupsDescription": "آیا مطمئن هستید که می‌خواهید تغییرات گروه را برای {{totalTargets}} مورد انتخابی اعمال کنید؟ این کار گروه‌ها را برای همه کاربران و مدیران انتخاب‌شده به‌روزرسانی می‌کند.", + "expire.placeholder": "تاریخ انقضا را وارد کنید" + }, + "operationSuccess": "عملیات موفق بود!", + "operationFailed": "عملیات ناموفق بود!", + "settingsApplied": "تنظیمات با موفقیت اعمال شد!", + "inboundTags": "تگ‌های ورودی", + "searchInbounds": "جستجوی ورودی‌ها...", + "noInboundsFound": "هیچ ورودی‌ای یافت نشد", + "selectedCount": "{{count}} انتخاب شده", + "statistics.date": "تاریخ", + "statistics.totalUsage": "مصرف کل", + "statistics.uplink": "ارسال", + "statistics.downlink": "دریافت", + "timeSelector.pickDate": "انتخاب تاریخ", + "advanceSearch": { + "title": "جستجوی پیشرفته", + "byUsername": "نام کاربری و یادداشت‌ها", + "byProtocol": "داده‌های پروتکل", + "byStatus": "وضعیت", + "byAdmin": "مدیر", + "byGroup": "گروه", + "selectGroup": "انتخاب گروه ...", + "selectAdmin": "انتخاب مدیر ...", + "selectStatus": "انتخاب وضعیت ..." + }, + "clearAllFilters": "پاک کردن همه فیلترها", + "activeFilters": "فعال" +} \ No newline at end of file diff --git a/dashboard/public/statics/locales/ru.json b/dashboard/public/statics/locales/ru.json new file mode 100644 index 000000000..49b96de6d --- /dev/null +++ b/dashboard/public/statics/locales/ru.json @@ -0,0 +1,1491 @@ +{ + "pasargaurd": "PasarGuard", + "dashboard": "Панель управления", + "master": "Все узлы", + "dashboardDescription": "Панель управления PasarGuard", + "active": "активный", + "online": "В сети", + "platform": "Платформа", + "allStatuses": "Все статусы", + "status": "Статус", + "statistics": "Статистика", + "selectAll": "Выбрать все", + "deselectAll": "Снять выделение со всех", + "statistics.realTimeStats": "Статистика в реальном времени", + "statistics.serverPerformance": "Производительность сервера", + "statistics.realTimeData": "Данные в реальном времени", + "statistics.historicalData": "Исторические данные", + "statistics.viewHistorical": "Просмотр истории", + "statistics.viewRealtime": "Просмотр в реальном времени", + "statistics.historical": "История", + "statistics.realtime": "Реальное время", + "statistics.realtimeDescription": "Живая статистика и графики для ваших серверов и пользователей.", + "statistics.historicalDescription": "Исторические данные о производительности сервера за выбранный период времени", + "statistics.date": "Дата", + "statistics.totalUsage": "Общий трафик", + "statistics.uplink": "Входящий", + "statistics.downlink": "Исходящий", + "hosts": "Хосты", + "success": "Успешно", + "error": "Ошибка", + "modifying": "Изменение...", + "removing": "Удаление...", + "creating": "Создание...", + "monitorUsers": "Мониторинг пользователей", + "alltime": "Все время", + "coreUsername": "Основное имя пользователя", + "nodes": { + "title": "Узлы", + "description": "Управление узлами", + "addNode": "Добавить узел", + "editNode": "Редактировать узел", + "deleteNode": "Удалить узел", + "nodeName": "Имя узла", + "nodeAddress": "Адрес узла", + "nodePort": "Порт узла", + "usageCoefficient": "Коэффициент использования", + "connectionType": "Тип соединения", + "serverCA": "Сертификат сервера", + "keepAlive": "Поддержание соединения", + "maxLogs": "Максимум логов", + "maxLogsPlaceHolder": "Введите максимальное количество логов (в секундах)", + "status": "Статус", + "actions": "Действия", + "connected": "Подключено", + "disconnected": "Отключено", + "disabled": "Отключено", + "enabled": "Включено", + "createSuccess": "Узел «{{name}}» успешно создан", + "createFailed": "Не удалось создать узел «{{name}}»", + "editSuccess": "Узел «{{name}}» успешно обновлен", + "editFailed": "Не удалось обновить узел «{{name}}»", + "deleteSuccess": "Узел «{{name}}» успешно удален", + "deleteFailed": "Не удалось удалить узел «{{name}}»", + "enableSuccess": "Узел «{{name}}» успешно включен", + "enableFailed": "Не удалось включить узел «{{name}}»", + "disableSuccess": "Узел «{{name}}» успешно отключен", + "disableFailed": "Не удалось отключить узел «{{name}}»", + "certificate": "Сертификат", + "certificateCopied": "Сертификат скопирован в буфер обмена", + "certificateDownloaded": "Сертификат успешно загружен", + "certificateDescription": "Для настройки узла необходимо настроить этот сертификат для установки безопасного соединения между основным сервером и узлом", + "selectNode": "Выберите узел", + "noNodes": "Узлы не настроены", + "noNodesDescription": "Главная панель не имеет настроенных ядер. Вам нужно добавить и настроить узел из", + "noNodesDescription2": "подключить и настроить его к панели.", + "logs": { + "title": "Журналы", + "description": "Просмотр и мониторинг журналов узла", + "noLogs": "Нет доступных журналов", + "timestamps": "Метки времени", + "search": "Поиск в журналах", + "filter": "Фильтр журналов", + "debug": "Отладка", + "info": "Инфо", + "warning": "Предупреждение", + "error": "Ошибка", + "download": "Скачать журналы", + "paused": "Журналы приостановлены", + "resume": "Продолжить", + "pause": "Пауза", + "messagesBuffered": "сообщений в буфере", + "linesLabel": "Строки:", + "linesCount": "{{count}} строк", + "sinceLabel": "С:", + "all": "Все", + "timeFilters": { + "all": "Всё время", + "1m": "1 минута", + "5m": "5 минут", + "15m": "15 минут", + "30m": "30 минут", + "1h": "1 час", + "2h": "2 часа" + } + } + }, + "groups": "Группы", + "documentation": "Документация", + "discussionGroup": "Группа обсуждений", + "github": "GitHub", + "community": "Сообщество", + "supportUs": "Поддержать нас", + "manageHosts": "Управление и контроль хостов", + "manageSettings": "Управление и контроль настроек", + "settings": { + "title": "Настройки", + "notifications": { + "title": "Уведомления", + "description": "Настройка уведомлений Telegram и Discord", + "loadError": "Не удалось загрузить настройки уведомлений", + "saveSuccess": "Настройки уведомлений успешно сохранены", + "saveFailed": "Не удалось сохранить настройки уведомлений", + "cancelSuccess": "Изменения отменены и восстановлены исходные настройки", + "activeTypes": "Активные типы", + "filterTitle": "Фильтр уведомлений", + "filterDescription": "Выберите события, которые должны вызывать уведомления для информирования о важных системных действиях", + "types": { + "admin": "Админы", + "core": "Ядро", + "group": "Группы", + "host": "Хосты", + "login": "Вход", + "node": "Узлы", + "user": "Пользователи", + "userTemplate": "Шаблоны", + "daysLeft": "Истечение", + "percentageReached": "Использование" + }, + "telegram": { + "title": "Telegram", + "description": "Настройка уведомлений Telegram-бота для получения оповещений в реальном времени в вашем чате или канале Telegram", + "apiToken": "API токен бота", + "adminId": "ID чата администратора", + "channelId": "ID канала", + "topicId": "ID темы" + }, + "discord": { + "title": "Discord", + "description": "Настройка уведомлений Discord webhook для получения оповещений прямо в каналы вашего Discord сервера", + "webhookUrl": "URL webhook" + }, + "advanced": { + "title": "Расширенные настройки", + "description": "Настройка расширенного поведения уведомлений, включая политики повторных попыток и настройки прокси", + "maxRetries": "Максимум повторов", + "proxyUrl": "URL прокси", + "miniAppUrl": "URL мини-приложения", + "miniAppUrlPlaceholder": "Введите URL мини-приложения (необязательно)", + "miniAppUrlDescription": "URL вашего мини-приложения Telegram. Оставьте пустым, если не используется." + } + }, + "subscriptions": { + "title": "Подписки", + "description": "Настройка URL подписок, интервалов обновления и правил для конкретных клиентов", + "loadError": "Не удалось загрузить настройки подписки", + "saveSuccess": "Настройки подписки успешно сохранены", + "saveFailed": "Не удалось сохранить настройки подписки", + "cancelSuccess": "Изменения отменены и восстановлены исходные настройки", + "general": { + "title": "Общие настройки", + "description": "Основные параметры конфигурации подписки", + "urlPrefix": "Префикс URL", + "urlPrefixPlaceholder": "sub", + "urlPrefixDescription": "Базовый URL для ссылок подписки", + "updateInterval": "Интервал обновления (часы)", + "updateIntervalDescription": "Как часто клиенты должны проверять обновления", + "supportUrl": "URL поддержки", + "supportUrlPlaceholder": "https://support.example.com", + "supportUrlDescription": "URL для поддержки пользователей и помощи", + "profileTitle": "Название профиля", + "profileTitlePlaceholder": "Мой VPN сервис", + "profileTitleDescription": "Отображаемое имя для профиля подписки", + "hostStatusFilter": "Фильтр статуса хоста", + "hostStatusFilterDescription": "Фильтровать хосты на основе их статуса" + }, + "rules": { + "title": "Правила подписки", + "description": "Настройка правил подписки для конкретных клиентов и форматов", + "addRule": "Добавить правило", + "removeRule": "Удалить правило", + "pattern": "Шаблон", + "patternPlaceholder": "Введите шаблон (например, шаблон user-agent)", + "patternDescription": "Шаблон для сопоставления с запросами клиентов", + "target": "Целевой формат", + "targetDescription": "Формат конфигурации для обслуживания этого шаблона", + "noRules": "Правила не настроены. Добавьте правила для настройки поведения подписки для разных клиентов." + }, + "formats": { + "title": "Форматы ручной подписки", + "description": "Включение или отключение определенных форматов подписки для ручных запросов", + "links": "Ссылки", + "linksDescription": "Ссылки подписки в виде простого текста", + "linksBase64": "Ссылки (Base64)", + "linksBase64Description": "Ссылки подписки в кодировке Base64", + "xray": "Xray", + "xrayDescription": "Формат конфигурации Xray", + "singBox": "Sing-box", + "singBoxDescription": "Формат конфигурации Sing-box", + "clash": "Clash", + "clashDescription": "Формат конфигурации Clash", + "clashMeta": "Clash Meta", + "clashMetaDescription": "Формат конфигурации Clash Meta", + "outline": "Outline", + "outlineDescription": "Формат конфигурации Outline VPN" + }, + "configFormats": { + "links": "Ссылки", + "links_base64": "Ссылки (Base64)", + "xray": "Xray", + "sing_box": "Sing-box", + "clash": "Clash", + "clash_meta": "Clash Meta", + "outline": "Outline", + "block": "Блок" + } + }, + "telegram": { + "title": "Telegram", + "description": "Настройка интеграции Telegram бота и связанных настроек для вашей системы", + "loadError": "Не удалось загрузить настройки Telegram. Пожалуйста, попробуйте снова.", + "saveSuccess": "Настройки Telegram успешно сохранены", + "saveFailed": "Не удалось сохранить настройки Telegram", + "cancelSuccess": "Изменения отменены и восстановлены первоначальные настройки Telegram", + "general": { + "title": "Общие настройки", + "description": "Базовая конфигурация Telegram бота и настройки подключения", + "enable": "Включить бота Telegram", + "enableDescription": "Включить или отключить функциональность бота Telegram для вашей системы", + "token": "Токен API бота", + "tokenPlaceholder": "Введите токен вашего Telegram бота", + "tokenDescription": "Токен бота, полученный от @BotFather в Telegram", + "webhookUrl": "URL Webhook", + "webhookUrlPlaceholder": "https://your-domain.com/webhook", + "webhookUrlDescription": "URL, на который Telegram будет отправлять обновления", + "webhookSecret": "Секрет Webhook", + "webhookSecretPlaceholder": "Введите секрет webhook", + "webhookSecretDescription": "Секретный токен для безопасности webhook", + "method": "Метод подключения", + "methodPlaceholder": "Выберите метод подключения", + "methodDescription": "Выберите, как бот получает обновления от Telegram", + "webhook": "Webhook", + "longPolling": "Long Polling", + "proxyUrl": "URL прокси", + "proxyUrlPlaceholder": "socks5://proxy.example.com:1080", + "proxyUrlDescription": "URL прокси для подключений к API Telegram (необязательно)" + }, + "advanced": { + "title": "Расширенные настройки", + "description": "Расширенные функции и конфигурации бота Telegram", + "miniAppLogin": "Включить вход через Mini App", + "miniAppLoginDescription": "Разрешить пользователям входить через мини-приложения Telegram", + "miniAppUrl": "URL мини-приложения", + "miniAppUrlPlaceholder": "Введите URL мини-приложения (необязательно)", + "miniAppUrlDescription": "URL вашего мини-приложения Telegram. Оставьте пустым, если не используется.", + "forAdminsOnly": "Только для администраторов", + "forAdminsOnlyDescription": "Ограничить доступ к боту только администраторами" + } + }, + "discord": { + "title": "Discord", + "description": "Настройте интеграцию Discord бота и связанные параметры для вашей системы", + "loadError": "Не удалось загрузить настройки Discord. Попробуйте еще раз.", + "saveSuccess": "Настройки Discord успешно сохранены", + "saveFailed": "Не удалось сохранить настройки Discord", + "cancelSuccess": "Изменения отменены и восстановлены исходные настройки Discord", + "general": { + "title": "Основные настройки", + "description": "Базовая конфигурация Discord бота и настройки подключения", + "enable": "Включить Discord бота", + "enableDescription": "Включить или отключить функциональность Discord бота для вашей системы", + "token": "Токен бота", + "tokenPlaceholder": "Введите ваш токен Discord бота", + "tokenDescription": "Токен бота, полученный из Discord Developer Portal", + "proxyUrl": "URL прокси", + "proxyUrlPlaceholder": "socks5://proxy.example.com:1080", + "proxyUrlDescription": "URL прокси для подключений к Discord API (необязательно)" + } + }, + "webhook": { + "title": "Веб-хуки", + "description": "Настройка уведомлений веб-хуков и конечных точек для вашей системы", + "loadError": "Не удалось загрузить настройки веб-хуков. Пожалуйста, попробуйте снова.", + "saveSuccess": "Настройки веб-хуков успешно сохранены", + "saveFailed": "Не удалось сохранить настройки веб-хуков", + "cancelSuccess": "Изменения отменены и настройки веб-хуков восстановлены", + "general": { + "title": "Основные настройки", + "description": "Базовая конфигурация веб-хуков и настройки подключения", + "enable": "Включить веб-хуки", + "enableDescription": "Включить или отключить уведомления веб-хуков для вашей системы", + "timeout": "Тайм-аут (секунды)", + "timeoutDescription": "Время ожидания запроса для вызовов веб-хуков (1-300 секунд)", + "recurrent": "Количество повторов", + "recurrentDescription": "Количество повторных попыток для неудачных веб-хуков (1-24)", + "proxyUrl": "URL прокси", + "proxyUrlPlaceholder": "http://proxy.example.com:8080", + "proxyUrlDescription": "URL прокси для запросов веб-хуков (необязательно)" + }, + "webhooks": { + "title": "Конечные точки веб-хуков", + "description": "Настройка URL веб-хуков и аутентификации", + "add": "Добавить веб-хук", + "addFirst": "Добавить первый веб-хук", + "webhook": "Веб-хук", + "empty": "Веб-хуки не настроены. Добавьте вашу первую конечную точку веб-хука.", + "name": "Имя", + "namePlaceholder": "Мой веб-хук", + "url": "URL", + "secret": "Секретный ключ", + "secretPlaceholder": "Введите секретный ключ веб-хука" + }, + "triggers": { + "daysLeft": { + "title": "Уведомления об оставшихся днях", + "description": "Отправлять уведомления, когда у пользователей остается определенное количество дней", + "empty": "Триггеры не настроены" + }, + "usagePercent": { + "title": "Уведомления о проценте использования", + "description": "Отправлять уведомления, когда пользователи достигают определенного процента использования", + "empty": "Триггеры не настроены" + } + } + }, + "cleanup": { + "title": "Очистка", + "description": "Управление просроченными аккаунтами и сброс использования данных для обслуживания системы", + "loadError": "Не удалось загрузить настройки очистки. Пожалуйста, попробуйте еще раз.", + "saveSuccess": "Операция очистки выполнена успешно", + "saveFailed": "Не удалось завершить операцию очистки", + "cancelSuccess": "Операция очистки отменена", + "expiredUsers": { + "title": "Удаление просроченных аккаунтов", + "description": "Удаление аккаунтов, которые просрочены в определенном диапазоне дат", + "expiredAfter": "Просрочено после", + "expiredBefore": "Просрочено до", + "expiredAfterPlaceholder": "Выберите дату начала", + "expiredBeforePlaceholder": "Выберите дату окончания", + "dateRange": "Диапазон дат", + "deleteExpired": "Удалить просроченные", + "deleting": "Удаление...", + "deleteSuccess": "{{count}} просроченных аккаунтов успешно удалено", + "deleteFailed": "Не удалось удалить просроченные аккаунты", + "confirmDelete": "Удалить просроченные аккаунты", + "confirmDeleteMessage": "Вы уверены, что хотите удалить все просроченные аккаунты в выбранном диапазоне дат? Это действие нельзя отменить.", + "noDateSelected": "Пожалуйста, выберите хотя бы одну дату", + "selectDateRange": "Выберите диапазон дат для просроченных аккаунтов для удаления (доступны только прошедшие даты)" + }, + "resetUsage": { + "title": "Сброс всего использования данных", + "description": "Сброс использования данных для всех аккаунтов в системе", + "resetAll": "Сбросить все использование", + "resetting": "Сброс...", + "resetSuccess": "Все использование данных успешно сброшено", + "resetFailed": "Не удалось сбросить использование данных", + "confirmReset": "Сбросить все использование данных", + "confirmResetMessage": "Вы уверены, что хотите сбросить использование данных для всех аккаунтов? Это действие нельзя отменить.", + "warning": "Это действие сбросит использование данных для ВСЕХ аккаунтов в системе" + }, + "clearUsageData": { + "title": "Очистка данных использования", + "description": "Окончательное удаление данных использования из выбранных таблиц базы данных", + "selectTable": "Выберите таблицу", + "selectTablePlaceholder": "Выберите таблицу для очистки", + "noTableSelected": "Пожалуйста, выберите таблицу для очистки", + "dataAfter": "Данные после", + "dataBefore": "Данные до", + "dataAfterPlaceholder": "Выберите дату начала", + "dataBeforePlaceholder": "Выберите дату окончания", + "selectDateRange": "Выберите диапазон дат для фильтрации данных по времени создания (необязательно - оставьте пустым для очистки всех данных)", + "clearData": "Очистить данные", + "clearing": "Очистка...", + "clearSuccess": "Данные из таблицы {{table}} успешно очищены", + "clearFailed": "Не удалось очистить данные использования", + "confirmClear": "Подтвердить очистку данных", + "confirmClearMessage": "Вы уверены, что хотите окончательно удалить все данные из таблицы {{table}}? Это действие нельзя отменить.", + "warning": "Предупреждение: Это действие окончательно удалит все данные использования из выбранной таблицы. Это действие нельзя отменить.", + "tables": { + "nodeUserUsages": "Использование пользователей узла", + "userUsages": "Использование пользователей" + } + } + }, + "theme": { + "title": "темы" + }, + "general": { + "title": "Общие", + "description": "Настройте основные параметры системы", + "loadError": "Не удалось загрузить общие настройки. Пожалуйста, попробуйте снова.", + "saveSuccess": "Общие настройки успешно сохранены", + "saveFailed": "Не удалось сохранить общие настройки", + "cancelSuccess": "Изменения отменены и исходные настройки восстановлены", + "defaultFlow": { + "title": "Поток VLESS по умолчанию", + "description": "Автоматически заполнять поле потока для новых пользователей VLESS" + }, + "defaultMethod": { + "title": "Метод Shadowsocks по умолчанию", + "description": "Автоматически заполнять метод шифрования для новых пользователей Shadowsocks" + }, + "errorLoadingSettings": "Ошибка загрузки настроек" + } + }, + "saving": "Сохранение...", + "general": "Общие", + "core": "Ядра", + "activeUsers": "Пользователи", + "apply": "Применить", + "cancel": "Отмена", + "created": "Создано", + "by": "от", + "ip": "IP", + "admin": "Админ", + "sudo": "Суперпользователь", + "save": "Сохранить", + "test": "Тест", + "testing": "Тестирование", + "confirm": "Подтвердить", + "admins": { + "title": "Администраторы", + "description": "Управление системными администраторами", + "createAdmin": "Создать администратора", + "editAdmin": "Редактировать администратора", + "deleteAdmin": "Удалить администратора", + "username": "Имя пользователя", + "password": "Пароль", + "isSudo": "Супер администратор", + "createdAt": "Дата создания", + "actions": "Действия", + "createSuccess": "Администратор «{{name}}» успешно создан", + "createFailed": "Не удалось создать администратора «{{name}}»", + "editSuccess": "Администратор «{{name}}» успешно обновлен", + "editFailed": "Не удалось обновить администратора «{{name}}»", + "deleteSuccess": "Администратор {{name}} успешно удалён", + "deleteFailed": "Не удалось удалить администратора {{name}}", + "enterUsername": "Введите имя пользователя", + "enterPassword": "Введите пароль", + "sudo": "Права супер администратора", + "edit": "Сохранить изменения", + "create": "Создать администратора", + "status": "Статус", + "role": "Роль", + "total.users": "Всего пользователей", + "used.traffic": "Использованный трафик", + "total": "Всего администраторов", + "active": "Активные администраторы", + "disable": "Отключённые администраторы", + "telegramId": "Telegram ID", + "discord": "Вебхук Discord", + "supportUrl": "URL поддержки", + "subDomain": "Домен подписки", + "profile": "Заголовок профиля", + "subTemplate": "Путь шаблона подписки", + "passwordConfirm": "Подтвердите пароль", + "enterPasswordConfirm": "Введите подтверждение пароля", + "disableSuccess": "Администратор «{{name}}» был успешно отключен", + "enableSuccess": "Администратор «{{name}}» был успешно включен", + "disableFailed": "Не удалось отключить администратора «{{name}}»", + "enableFailed": "Не удалось включить администратора «{{name}}»", + "resetUsersUsage": "Админ сбросить использование пользователей", + "resetUsageSuccess": "Использование пользователя «{{name}}» успешно сброшено администратором", + "resetUsageFailed": "Не удалось сбросить использование пользователя «{{name}}» администратором", + "reset": "Сброс использования", + "discordId": "Discord ID", + "lifetime.used.traffic": "Всего", + "used": { + "traffic": "Использование трафика" + }, + "monitor": { + "traffic": "Мониторинг использования трафика администратором во времени", + "no_traffic": "Данные о трафике отсутствуют" + } + }, + "shortcuts": { + "title": "Горячие клавиши", + "description": "Управляйте горячими клавишами панели для быстрого доступа", + "add": "Добавить горячую клавишу", + "empty": "Горячие клавиши не настроены" + }, + "quickActions": { + "title": "Быстрые действия", + "description": "Выберите действие для создания новых элементов в системе", + "comingSoon": "Скоро" + }, + "resetUsersUsage.prompt": "Вы уверены, что хотите сбросить использование пользователя-админа {{name}}?", + "admin.disable": "Администратор отключён", + "admin.enable": "Администратор включён", + "deleteAdmin.prompt": "Вы уверены, что хотите удалить администратора {{name}}?", + "activeUsers.prompt": "Вы хотите активировать всех пользователей под управлением {{name}}?", + "disableUsers.prompt": "Вы хотите отключить всех пользователей под управлением {{name}}?", + "manageAccounts": "Контроль, обновление и упорядочивание учетных записей", + "manageGroups": "Контроль, обновление и упорядочивание групп пользователей", + "manageNodes": "Мониторинг, управление, добавление, редактирование, удаление узлов", + "onlineUsers": "Пользователи онлайн", + "totalUsers": "Всего пользователей", + "edit": "Редактировать", + "editGroup": "Редактировать группу", + "disable": "Отключить", + "warning": "Предупреждение", + "remove": "Удалить", + "modify": "Изменить", + "templates.userTemplates": "Шаблоны", + "editUserTemplateModal.title": "Редактировать шаблон пользователя", + "userTemplateModal.title": "Создать шаблон пользователя", + "templates": { + "title": "Шаблоны", + "description": "Управление шаблонами", + "addTemplate": "Создать шаблон", + "editSuccess": "Шаблон пользователя «{{name}}» успешно обновлен", + "createSuccess": "Шаблон пользователя «{{name}}» успешно создан", + "editFailed": "Не удалось обновить шаблон пользователя «{{name}}»", + "createFailed": "Не удалось создать шаблон пользователя «{{name}}»", + "name": "Имя", + "status": "Статус", + "prefix": "Префикс имени пользователя", + "suffix": "Суффикс имени пользователя", + "dataLimit": "Лимит данных", + "expire": "Срок действия", + "onHoldTimeout": "Тайм-аут при ожидании", + "method": "Метод", + "flow": "Поток", + "groups": "Группы", + "userDataLimitStrategy": "Стратегия сброса лимита данных", + "resetUsage": "Сброс использования", + "groupsExistingWarning": "Вы еще не добавили ни одной группы.", + "deleteSuccess": "Шаблон {{name}} успешно удалён", + "deleteFailed": "Не удалось удалить шаблон {{name}}", + "deleteUserTemplateTitle": "Удалить пользовательский шаблон", + "deleteUserTemplatePrompt": "Вы уверены, что хотите удалить шаблон {{name}}?", + "duplicateSuccess": "Шаблон «{{name}}» успешно дублирован", + "duplicateFailed": "Не удалось дублировать шаблон «{{name}}»", + "enableSuccess": "Шаблон «{{name}}» был успешно включён", + "disableSuccess": "Шаблон «{{name}}» был успешно отключён", + "enableFailed": "Не удалось включить администратора «{{name}}»", + "disableFailed": "Не удалось отключить администратора «{{name}}»", + "resetUsages": "Сброс использования" + }, + "core.configuration": "Конфигурация", + "core.generalErrorMessage": "Что-то пошло не так, пожалуйста, проверьте конфигурацию", + "core.logs": "Логи", + "core.restartCore": "Перезагрузить ядро", + "core.restarting": "Перезагрузка...", + "core.save": "Сохранить", + "core.socket.closed": "Закрыто", + "core.socket.connected": "Подключено", + "core.socket.connecting": "Соединение...", + "core.socket.not_connected": "Не подключено", + "core.successMessage": "Основные настройки успешно обновлены", + "core.title": "Основные настройки", + "core.toggleSuccess": "Ядро «{{name}}» успешно переключено", + "core.toggleFailed": "Не удалось переключить ядро «{{name}}»", + "core.deleteSuccess": "Ядро «{{name}}» успешно удалено", + "core.deleteFailed": "Не удалось удалить ядро «{{name}}»", + "core.deleteConfirm": "Вы уверены, что хотите удалить «{{name}}»?", + "createNewUser": "Создать нового пользователя", + "createUser": "Создать", + "createGroup": "Создать группу", + "dataUsage": "Трафик", + "dateFormat": "MMMM d, yyy", + "delete": "Удалить", + "deleteNode.deleteSuccess": "Узел {{name}} успешно удалён", + "deleteNode.prompt": "Вы уверены, что хотите удалить узел {{name}}?", + "deleteNode.title": "Удалить узел", + "deleteHost.title": "Удалить хост", + "deleteHost.prompt": "Вы уверены, что хотите удалить хост {{name}}?", + "deleteHost.deleteSuccess": "Хост {{name}} успешно удален", + "deleteHost.deleteFailed": "Не удалось удалить хост {{name}}", + "editHost.title": "Редактировать хост", + "editNode.editSuccess": "Узел {{name}} успешно обновлен", + "editNode.title": "Редактировать узел", + "deleteUser.deleteSuccess": "{{username}} успешно удалён.", + "deleteUser.prompt": "Вы уверены, что хотите удалить пользователя {{username}}?", + "deleteUser.title": "Удалить пользователя", + "disabled": "disabled", + "expire": "Истекает", + "expired": "Истекло {{time}} назад", + "expires": "Истекает через {{time}}", + "header.donation": "Пожертвование", + "header.hostSettings": "Настройки хоста", + "header.logout": "Выйти", + "header.nodeSettings": "Настройки узлов", + "header.nodesUsage": "Использование узлов", + "hostsDialog.addHost": "Добавить хост", + "hostsDialog.advancedOptions": "Дополнительные опции", + "hostsDialog.useSniAsHost": "Использовать SNI как хост", + "hostsDialog.alpn": "ALPN", + "hostsDialog.selectAlpn": "Выберите ALPN", + "hostsDialog.apply": "Применить", + "hostsDialog.currentServer": "IP текущего сервера", + "hostsDialog.currentServerv6": "IPv6 текущего сервера", + "hostsDialog.dataLimit": "Лимит трафика пользователя", + "hostsDialog.dataUsage": "Использованный трафик пользователя", + "hostsDialog.desc": "Используйте эти переменные, чтобы сделать его динамическим", + "hostsDialog.expireDate": "Дата истечения срока пользователя", + "hostsDialog.fingerprint": "Отпечаток", + "hostsDialog.fragment": { + "title": "Фрагментация", + "packets": "Пакеты", + "packetsPlaceholder": "Введите количество пакетов", + "length": "Длина", + "lengthPlaceholder": "Введите длину", + "interval": "Интервал", + "intervalPlaceholder": "Введите интервал", + "allFieldsRequired": "Если одно поле заполнено, все поля должны быть заполнены" + }, + "hostsDialog.fragment.info": "length,interval,packet (e.g. 10-100,100-200,tlshello)", + "hostsDialog.fragment.info.attention": "Attention: currently, this feature only supported in streisand >= 1.6.12 and v2rayNG >= 1.8.16 (custom config)", + "hostsDialog.fragment.info.examples": "Examples:", + "hostsDialog.fragment.fragment": "Фрагментация", + "hostsDialog.fragment.fallbackDelay": "Задержка отката", + "hostsDialog.fragment.recordFragment": "Запись фрагмента", + "hostsDialog.noise": { + "title": "Шум", + "type": "Тип", + "addNoise": "Добавить шум", + "removeNoise": "Удалить шум", + "noNoiseSettings": "Настройки шума не настроены", + "packet": "Пакет", + "packetPlaceholder": "Введите значение пакета (например: rand:10-20)", + "delay": "Задержка", + "delayPlaceholder": "Введите задержку", + "rand": "Случайный" + }, + "hostsDialog.noise.info": "packet,delay (e.g. rand:10-20,100-200)", + "hostsDialog.noise.info.attention": "Attention: currently, this feature only supported in streisand >= 1.6.32 and v2rayNG >= 1.8.39 (custom config)", + "hostsDialog.noise.info.examples": "Examples:", + "hostsDialog.host": "Host", + "hostsDialog.host.info": "По умолчанию, если в конфигурации XRAY задан запрашиваемый хост, то он и будет использоваться. Однако, если необходимо, вы можете установить здесь пользовательский запрашиваемый хост.", + "hostsDialog.host.multiHost": "Чтобы установить несколько адресов, разделяйте их с помощью ,. Каждый раз будет выбран случайный адрес.", + "hostsDialog.host.wildcard": "Используйте *, чтобы сгенерировать случайную строку (работает для wildcard доменов)", + "hostsDialog.jalaliExpireDate": "Дата истечения срока по солнечному календарю", + "hostsDialog.loading": "загрузка...", + "hostsDialog.muxEnable": "Давать возможность MUX", + "hostsDialog.path": "Path", + "hostsDialog.path.info": "Set a path for host users, useful behind a reverse proxy.", + "hostsDialog.port": "Port", + "hostsDialog.port.info": "По умолчанию хост использует порт, значение которого обьявленно в inbound. Вы можете установить своё значение порта, если с него трафик перенаправляется на другой порт. Например, сервер может перенаправлять трафик с порта 443 на порт по умолчанию Вашего inbound", + "hostsDialog.proxyMethod": "Метод транспорта прокси (например, ws)", + "hostsDialog.proxyOutbound": "Исходящий прокси json", + "hostsDialog.proxyOutbound.info": "Дополнительный исходящий трафик (только в пользовательской конфигурации v2ray)", + "hostsDialog.proxyProtocol": "Протокол прокси (например, VMess)", + "hostsDialog.randomUserAgent": "Использовать случайный User-Agent", + "hostsDialog.remainingData": "Оставшийся трафик пользователя", + "hostsDialog.remainingDays": "Оставшиеся дни пользователя", + "hostsDialog.remainingTime": "Оставшееся время пользователя", + "hostsDialog.savedSuccess": "Хосты успешно сохранены", + "hostsDialog.security": "Security Layer", + "hostsDialog.security.info": "Если промежуточный сервер этого хоста использует другой security layer, отличный от security layer Вашего inbound по умолчанию, Вы можете установить его здесь", + "hostsDialog.sni": "SNI", + "hostsDialog.sni.info": "По умолчанию хост использует SNI, значение которого обьявленно в inbound. Вы можете установить своё значение SNI, если этот хост содержит другие SNI. Например, сервер может принимать трафик с другим SSL-сертификатом, выполнять SSL-терминацию и перенаправлять его на ваш inbound.", + "hostsDialog.sniPlaceholder": "SNI (например, example.com)", + "hostsDialog.sockopt": "Sockopt", + "hostsDialog.statusEmoji": "Статус пользователя в виде смайлика (✅,⌛️,🪫,❌,🔌)", + "hostsDialog.statusText": "Статус пользователя", + "hostsDialog.title": "Используя эту настройку, Вы можете настроить свои inbound.", + "hostsDialog.username": "Имя пользователя", + "inbound": "inbound", + "itemsPerPage": "Элементов на страницу", + "login": "Вход", + "login.fieldRequired": "Это поле обязательно для заполнения", + "login.loginYourAccount": "Войдите в свой аккаунт", + "login.welcomeBack": "Пожалуйста, введите свои данные", + "memoryUsage": "Память", + "next": "Вперед", + "monitorServers": "Следите за своими серверами и пользователями", + "manageServers": "Управляйте данными вашего сервера", + "nodes.addHostForEveryInbound": "Добавить этот узел, как новый хост для каждого inbound", + "nodes.addNewPasarGuardNode": "Добавить новый узел PasarGuard", + "nodes.prompt": "Добавьте и настройте данные узла", + "nodes.addNode": "Добавить узел", + "nodes.addNodeSuccess": "Узел {{name}} успешно добавлен", + "nodes.apply": "Настройки узла успешно обновлены", + "nodes.certificate": "Сертификат", + "nodes.certificateCopied": "Сертификат скопирован в буфер обмена", + "nodes.certificateDownloaded": "Сертификат успешно загружен", + "nodes.certificateDescription": "Для настройки узла необходимо настроить этот сертификат для установления безопасного соединения между основным сервером и узлом", + "nodes.connection-hint": "Для настройки узла PasarGuard, необходимо установить на нём данный сертификат, для инициализации безопасного соединения между главным сервером и узлом", + "nodes.download-certificate": "Скачать сертификат", + "nodes.editNode": "Редактировать узел", + "nodes.hide-certificate": "Скрыть сертификат", + "nodes.nodeAPIPort": "API порт", + "nodes.nodeAddress": "Адрес", + "nodes.nodeName": "Имя", + "nodes.nodePort": "Порт", + "nodes.reconnect": "Переподключиться", + "nodes.reconnecting": "Переподключение...", + "nodes.show-certificate": "Показать сертификат", + "nodes.title": "Используя PasarGuard-Node, Вы можете масштабировать инфраструктуру, добавляя узлы на разных серверах.", + "nodes.usageCoefficient": "Коэффициент использования", + "on_hold": "On Hold", + "duplicate": "Дублировать", + "createAndManageTemplates": "Создавать и управлять шаблонами", + "password": "Пароль", + "previous": "Назад", + "qrcodeDialog.sublink": "Ссылка на подписку", + "reset": "Сбросить", + "resetAllUsage": "Сбросить расход трафика", + "resetAllUsage.error": "Сброс расхода трафика не удался, пожалуйста, попробуйте ещё раз.", + "resetAllUsage.prompt": "Это действие полностью очищает весь расход трафика пользователей. Вы уверены? ЭТО ДЕЙСТВИЕ НЕОБРАТИМО!", + "resetAllUsage.success": "Расход трафика успешно сброшен.", + "resetAllUsage.title": "Сбросить расход трафика для всех пользователей", + "resetUserUsage.error": "Сброс расхода не удался, пожалуйста, попробуйте ещё раз.", + "resetUserUsage.prompt": "Вы уверены, что хотите сбросить расход трафика для пользователя {{username}}?", + "resetUserUsage.success": "Расход трафика пользователя {{username}} успешно сброшен.", + "resetUserUsage.title": "Сбросить расход трафика пользователя", + "revoke": "Отозвать", + "revokeUserSub.error": "Отзыв подписки не удался, пожалуйста, попробуйте ещё раз.", + "revokeUserSub.prompt": "Вы уверены, что хотите отозвать подписку для пользователя «{{username}}»?", + "revokeUserSub.success": "Подписка пользователя {{username}} успешно отозвана.", + "revokeUserSub.title": "Отозвать подписку пользователя", + "subscriptionClients": { + "title": "Клиенты подписки", + "viewAllClients": "Показать клиентов", + "total": "Всего: {{count}} клиентов", + "showing": "Показано последних {{count}} обращений", + "noClients": "Клиенты подписки не найдены", + "noClientsDesc": "Этот пользователь ещё не обращался к своей подписке", + "knownClient": "Известный", + "unknown": "Неизвестно", + "error": "Не удалось загрузить клиентов подписки" + }, + "search": "Поиск", + "status.active": "Active", + "status.enable": "Enable", + "status.disabled": "Disable", + "status.expired": "Expired", + "status.limited": "Limited", + "status.on_hold": "On Hold", + "nodeModal.status.error": "Ошибка", + "nodeModal.status.disabled": "инвалидный", + "nodeModal.status.connecting": "соединяющий", + "nodeModal.status.connected": "Подключен", + "userDialog.absolute": "Абсолютно", + "userDialog.custom": "Пользовательский", + "userDialog.dataLimit": "Лимит трафика", + "userDialog.days": "Дни", + "userDialog.editUser": "Редактировать", + "userDialog.editUserTitle": "Редактировать пользователя", + "userDialog.endDate": "Дата окончания", + "userDialog.expiryDate": "Дата истечения срока", + "userDialog.timeOutDate": "Дата истечения срока действия", + "userDialog.generatedByDefault": "по умолчанию", + "userDialog.hours": "Часы", + "userDialog.method": "Метод", + "userDialog.months": "Месяцы", + "userDialog.note": "Примечание", + "userDialog.onHold": "В режиме ожидания", + "userDialog.onHoldExpireDuration": "Продолжительность срока действия", + "userDialog.onHoldExpireDurationPlaceholder": "например, 7", + "userDialog.optional": "необязательно", + "userDialog.periodicUsageReset": "Период сброса трафика", + "userDialog.protocols": "Протоколы", + "userDialog.relative": "Относительно", + "userDialog.resetStrategyAnnually": "Ежегодно", + "userDialog.resetStrategyDaily": "Ежедневно", + "userDialog.resetStrategyMonthly": "Ежемесячно", + "userDialog.resetStrategyNo": "Нет", + "userDialog.resetStrategyWeekly": "Еженедельно", + "userDialog.resetUsage": "Сбросить трафик", + "userDialog.revokeSubscription": "Отозвать подписку", + "userDialog.subscriptionInfo": "Информация о подписке", + "userDialog.subscriptionUpdated": "Последнее обновление", + "userDialog.lastClient": "Последний клиент", + "userDialog.subscriptionNotAccessed": "Еще не использовалась", + "userDialog.unknownClient": "Неизвестный клиент", + "userDialog.selectOneProtocol": "Пожалуйста, выберите хотя бы один протокол", + "userDialog.shadowsocksDesc": "Быстрый и безопасный, но не такой эффективный, как другие", + "userDialog.startDate": "Дата начала", + "userDialog.total": "Всего: ", + "userDialog.trojanDesc": "Легковесный, безопасный и быстрый", + "userDialog.usage": "Потребление", + "userDialog.userAlreadyExists": "Пользователь уже существует", + "userDialog.userCreated": "Пользователь {{username}} создан.", + "userDialog.userEdited": "Пользователь {{username}} изменён.", + "userDialog.vlessDesc": "Легковесный, быстрый и безопасный", + "userDialog.vmessDesc": "Быстрый и безопасный", + "userDialog.warningNoProtocol": "Пожалуйста, выберите хотя бы один протокол", + "userDialog.weeks": "Недели", + "userDialog.expireDate": "Дата истечения срока", + "username": "Имя пользователя", + "users": "Пользователи", + "usersTable.copied": "Скопировано", + "usersTable.copyConfigs": "Скопировать конфигурации", + "usersTable.copyLink": "Скопировать ссылку на подписку", + "usersTable.dataUsage": "Расход трафика", + "usersTable.noUser": "В системе нет созданных пользователей", + "usersTable.noUserMatched": "Похоже, нет пользователя, соответствующего вашему запросу", + "usersTable.status": "Статус", + "usersTable.total": "Всего", + "statistics.system": "Система", + "statistics.totalTraffic": "Общий трафик", + "statistics.ramUsage": "Использование RAM", + "statistics.cpuUsage": "Использование CPU", + "statistics.cores": "ядер", + "hostsDialog": { + "addHost": "Добавить хост", + "selectInbound": "Выберите входящий", + "fingerprint": "Отпечаток", + "selectStatus": "Выберите статус", + "remarkRequired": "Примечание обязательно", + "addressRequired": "Адрес обязателен", + "portRequired": "Порт обязателен", + "status": { + "label": "Статус", + "active": "Активный", + "disabled": "Отключен", + "limited": "Ограничен", + "expired": "Истек", + "onHold": "В ожидании" + }, + "loading": "загрузка...", + "port": "Порт", + "sni": "SNI", + "host": "Хост", + "path": "Путь", + "networkSettings": "Сетевые настройки", + "transportSettings": "Настройки транспорта", + "transportType": "Тип транспорта", + "selectTransport": "Выберите тип транспорта", + "serviceName": "Имя сервиса", + "enterServiceName": "Введите имя сервиса gRPC", + "seed": "Seed", + "enterSeed": "Введите seed для KCP", + "enterPath": "Введите путь (пример: /xray)", + "enterHost": "Введите хост (пример: example.com)", + "header": "Заголовок", + "selectHeader": "Выберите тип заголовка", + "multiMode": "Мульти режим", + "securitySettings": "Настройки безопасности", + "camouflagSettings": "Настройки маскировки", + "security": "Security Layer", + "alpn": "ALPN", + "allowInsecure": "Разрешить небезопасное соединение", + "muxEnable": "Включить MUX", + "randomUserAgent": "Использовать случайный User-Agent", + "useSniAsHost": "Использовать SNI как хост", + "echConfigList": "Список конфигураций ECH", + "echConfigList.info": "Список конфигураций Encrypted Client Hello (ECH). Это строка, закодированная в base64.", + "echConfigListPlaceholder": "Введите список конфигураций ECH", + "inboundDefault": "По умолчанию", + "earlyData": "Ранние данные", + "httpHeaders": "HTTP заголовки", + "headersName": "Имя заголовка", + "headersValue": "Значение заголовка", + "addHeader": "Добавить заголовок", + "removeHeader": "Удалить заголовок", + "createSuccess": "Хост «{{name}}» успешно создан", + "createFailed": "Не удалось создать хост «{{name}}»", + "editSuccess": "Хост «{{name}}» успешно обновлен", + "editFailed": "Не удалось обновить хост «{{name}}»", + "noStatus": "Статус не выбран", + "clearAllStatuses": "Очистить все статусы", + "transportSettingsAccordion": "Настройки транспорта", + "xhttp": { + "mode": "Режим", + "noGrpcHeader": "Без заголовка gRPC", + "xPaddingBytes": "X-Padding байты", + "scMaxEachPostBytes": "Максимум байт на пост", + "scMinPostsIntervalMs": "Минимальный интервал постов (мс)", + "scMaxBufferedPosts": "Максимум буферизованных постов", + "scStreamUpServerSecs": "Сервер стриминга (сек)", + "xmux": "Настройки XMux", + "maxConcurrency": "Максимум параллельных", + "maxConnections": "Максимум соединений", + "cMaxReuseTimes": "Максимум повторных использований", + "cMaxLifetime": "Максимальный срок службы", + "hMaxRequestTimes": "Максимум запросов", + "hKeepAlivePeriod": "Период поддержания соединения", + "downloadSettings": "Настройки загрузки", + "downloadSettingsInfo": "Выберите хост для настроек загрузки", + "selectDownloadSettings": "Выберите хост настроек загрузки" + }, + "grpc": { + "multiMode": "Мульти режим", + "idleTimeout": "Таймаут бездействия", + "healthCheckTimeout": "Таймаут проверки работоспособности", + "permitWithoutStream": "Разрешить без потока", + "initialWindowsSize": "Начальный размер окна" + }, + "kcp": { + "header": "Заголовок", + "mtu": "MTU", + "tti": "TTI", + "uplinkCapacity": "Пропускная способность входящего", + "downlinkCapacity": "Пропускная способность исходящего", + "congestion": "Перегрузка", + "readBufferSize": "Размер буфера чтения", + "writeBufferSize": "Размер буфера записи" + }, + "tcp": { + "title": "Настройки TCP", + "header": "Тип заголовка", + "request": { + "title": "Настройки запроса", + "version": "Версия HTTP", + "method": "Метод HTTP", + "headers": "Заголовки запроса" + }, + "response": { + "title": "Настройки ответа", + "version": "Версия HTTP", + "status": "Код состояния", + "reason": "Причина состояния", + "headers": "Заголовки ответа" + }, + "headerName": "Имя заголовка", + "headerValue": "Значение заголовка", + "addHeader": "Добавить заголовок", + "removeHeader": "Удалить заголовок", + "requestHeaders": "Заголовки запроса", + "responseHeaders": "Заголовки ответа" + }, + "websocket": { + "heartbeatPeriod": "Период сердцебиения" + }, + "muxSettings": "Настройки Mux", + "enableMux": "Включить Mux", + "xraySettings": "Настройки Xray", + "singBoxSettings": "Настройки Sing-box", + "clashSettings": "Настройки Clash", + "addXraySettings": "Добавить настройки Xray", + "addSingBoxSetting": "Добавить настройки Sing-box", + "addClashSettings": "Добавить настройки Clash", + "protocol": "Протокол", + "selectProtocol": "Выберите протокол", + "maxConnections": "Макс. соединений", + "maxStreams": "Макс. потоков", + "minStreams": "Мин. потоков", + "padding": "Включить отступы", + "enabled": "Включено", + "concurrency": "Параллельность", + "xudpConcurrency": "Параллельность XUDP", + "xudpProxy443": "XUDP Прокси 443", + "selectXudpProxy443": "Выберите XUDP Прокси 443", + "statistic": "Включить статистику", + "onlyTcp": "Только TCP", + "brutal": { + "enable": "Включить Brutal", + "title": "Настройки Brutal", + "upMbps": "Скорость загрузки (Мбит/с)", + "downMbps": "Скорость скачивания (Мбит/с)" + }, + "address": "Адрес", + "variables": { + "title": "Используйте эти переменные, чтобы сделать их динамическими", + "server_ip": "IP-адрес текущего сервера", + "server_ipv6": "IPv6 текущего сервера", + "username": "Имя пользователя", + "data_usage": "Текущий объем использованных данных", + "data_left": "Оставшийся объем данных", + "data_limit": "Лимит использования данных", + "days_left": "Оставшиеся дни", + "expire_date": "Дата истечения срока", + "jalali_expire_date": "Дата истечения срока по солнечному календарю", + "time_left": "Оставшееся время", + "status_emoji": "Статус пользователя в виде эмодзи (✅,⌛️,🪫,❌,🔌)", + "protocol": "Протокол прокси (например, VMess)", + "transport": "Метод транспорта прокси (например, ws)", + "admin_username": "Имя пользователя администратора" + }, + "httpVersions": { + "1.0": "HTTP/1.0", + "1.1": "HTTP/1.1", + "2.0": "HTTP/2.0", + "3.0": "HTTP/3.0" + }, + "httpMethods": { + "GET": "GET", + "POST": "POST", + "PUT": "PUT", + "DELETE": "DELETE", + "HEAD": "HEAD", + "OPTIONS": "OPTIONS", + "PATCH": "PATCH", + "TRACE": "TRACE", + "CONNECT": "CONNECT" + }, + "httpReasons": { + "100": "Продолжить", + "101": "Переключение протоколов", + "200": "OK", + "201": "Создано", + "202": "Принято", + "203": "Неавторитетная информация", + "204": "Нет содержимого", + "205": "Сбросить содержимое", + "206": "Частичное содержимое", + "300": "Множественный выбор", + "301": "Перемещено навсегда", + "302": "Найдено", + "303": "Смотреть другое", + "304": "Не изменялось", + "305": "Использовать прокси", + "307": "Временное перенаправление", + "308": "Постоянное перенаправление", + "400": "Неверный запрос", + "401": "Не авторизован", + "402": "Необходима оплата", + "403": "Запрещено", + "404": "Не найдено", + "405": "Метод не разрешен", + "406": "Неприемлемо", + "407": "Требуется аутентификация прокси", + "408": "Тайм-аут запроса", + "409": "Конфликт", + "410": "Удалено", + "411": "Требуется длина", + "412": "Предварительное условие не выполнено", + "413": "Полезная нагрузка слишком велика", + "414": "URI слишком длинный", + "415": "Неподдерживаемый тип носителя", + "416": "Диапазон не выполним", + "417": "Ожидание не выполнено", + "418": "Я чайник", + "421": "Неправильно направленный запрос", + "422": "Необрабатываемая сущность", + "423": "Заблокировано", + "424": "Невыполненная зависимость", + "425": "Слишком рано", + "426": "Требуется обновление", + "428": "Требуется предварительное условие", + "429": "Слишком много запросов", + "431": "Поля заголовка запроса слишком большие", + "451": "Недоступно по юридическим причинам", + "500": "Внутренняя ошибка сервера", + "501": "Не реализовано", + "502": "Ошибочный шлюз", + "503": "Служба недоступна", + "504": "Тайм-аут шлюза", + "505": "Версия HTTP не поддерживается" + }, + "selectReason": "Выбрать причину", + "nextPlanTitle": "Следующий план", + "nextPlanTemplateId": "ID шаблона", + "nextPlanDataLimit": "Лимит данных (ГБ)", + "nextPlanExpire": "Срок действия (дней)", + "nextPlanAddRemainingTraffic": "Добавить оставшийся трафик" + }, + "enable": "Включить", + "host": { + "enableSuccess": "Хост «{{name}}» успешно включен", + "enableFailed": "Не удалось включить хост «{{name}}»", + "disableSuccess": "Хост «{{name}}» успешно отключен", + "disableFailed": "Не удалось отключить хост «{{name}}»", + "duplicateSuccess": "Хост «{{name}}» успешно дублирован", + "duplicateFailed": "Не удалось дублировать хост «{{name}}»", + "xudp_proxy_443": "XUDP Прокси 443", + "reject": "Отклонить", + "allow": "Разрешить", + "skip": "Пропустить", + "priorityUpdated": "Хосты успешно обновлены", + "priorityUpdateError": "Не удалось обновить хосты" + }, + "group": { + "createSuccess": "Группа «{{name}}» успешно создана", + "createFailed": "Не удалось создать группу «{{name}}»", + "editSuccess": "Группа «{{name}}» успешно обновлена", + "editFailed": "Не удалось обновить группу «{{name}}»", + "deleteSuccess": "Группа «{{name}}» успешно удалена", + "deleteFailed": "Не удалось удалить группу «{{name}}»", + "deleteConfirm": "Вы уверены, что хотите удалить группу «{{name}}»?", + "enableSuccess": "Группа «{{name}}» успешно включена", + "enableFailed": "Не удалось включить группу «{{name}}»", + "disableSuccess": "Группа «{{name}}» успешно отключена", + "disableFailed": "Не удалось отключить группу «{{name}}»", + "deleteConfirmation": "Удалить группу" + }, + "name": "Имя", + "nodeModal": { + "title": "Добавить узел", + "description": "Добавить новый узел в сеть", + "name": "Название узла", + "namePlaceholder": "Введите название узла", + "address": "Адрес узла", + "addressPlaceholder": "Введите адрес узла", + "port": "Порт узла", + "portPlaceholder": "Введите порт узла", + "usageRatio": "Коэффициент использования", + "usageRatioPlaceholder": "Введите коэффициент использования", + "maxLogs": "Максимум логов", + "maxLogsPlaceholder": "Введите максимум логов", + "connectionType": "Тип подключения", + "keepAlive": "Поддержание соединения", + "keepAliveDescription": "Установите интервал поддержания соединения", + "days": "Дни", + "minutes": "Минуты", + "seconds": "Секунды", + "certificate": "Сертификат", + "certificatePlaceholder": "Введите сертификат", + "status": "Статус узла", + "statusCheckSuccess": "Узел успешно подключен", + "statusCheckFailed": "Не удалось подключиться к узлу", + "errorDetails": "Детали ошибки", + "connectionError": "Ошибка подключения", + "retryConnection": "Повторить подключение", + "configurationError": "Ошибка конфигурации", + "validateConfig": "Проверить конфигурацию", + "fillRequiredFields": "Пожалуйста, заполните все обязательные поля перед проверкой статуса", + "apiKey": "API ключ", + "apiKeyPlaceholder": "Введите API ключ узла", + "generateUUID": "Сгенерировать UUID", + "coreConfig": "Конфигурация ядра", + "selectCoreConfig": "Выберите конфигурацию ядра", + "hours": "Часы", + "hideDetails": "Скрыть детали", + "showDetails": "Показать детали", + "statusCheck": "Проверить статус", + "statusChecking": "Проверка...", + "reconnect": "Переподключить", + "reconnecting": "Переподключение...", + "sync": "Синхронизировать", + "syncing": "Синхронизация...", + "syncSuccess": "Узел успешно синхронизирован", + "syncFailed": "Не удалось синхронизировать узел", + "gatherLogs": "Сбор логов", + "gatherLogsDescription": "Включить сбор логов с этого узла для мониторинга и отладки", + "statusMessages": { + "checkUnavailableForNew": "Проверка статуса недоступна для новых узлов. Сначала создайте узел, чтобы проверить его статус." + }, + "onlineStats": { + "button": "Онлайн статистика", + "title": "Статистика онлайн пользователей", + "ipListTitle": "IP адреса для {{username}}", + "nodeInfo": "Узел: {{nodeName}}", + "searchPlaceholder": "Введите имя пользователя...", + "enterUsername": "Пожалуйста, введите имя пользователя", + "refreshed": "Данные успешно обновлены", + "refreshFailed": "Не удалось обновить данные", + "backToStats": "Назад к статистике", + "ipAddresses": "IP адреса", + "errorLoading": "Ошибка загрузки статистики пользователя", + "userNotOnline": "Пользователь не в сети", + "searchUser": "Найдите пользователя для просмотра его онлайн статистики", + "autoRefresh": "Автообновление каждые 5 секунд", + "connections": "соединения", + "protocols": "протоколы", + "viewIPs": "Просмотр IP", + "userNotFound": "Пользователь '{{username}}' не найден или не в сети", + "errorLoadingIPs": "Ошибка загрузки IP адресов пользователя" + } + }, + "theme": { + "title": "Тема", + "description": "Настройте тему вашего приложения", + "light": "Светлая", + "dark": "Тёмная", + "system": "Системная", + "selectTheme": "Выбрать тему", + "themeSaved": "Тема успешно сохранена", + "themeChanged": "Тема успешно изменена", + "visitThemePage": "Посетите страницу темы для дальнейшей настройки", + "radiusSaved": "Радиус границ успешно обновлён", + "mode": "Режим", + "color": "Цвет", + "radius": "Радиус границ", + "zinc": "Цинк", + "rose": "Розовый", + "blue": "Синий", + "green": "Зелёный", + "violet": "Фиолетовый", + "orange": "Оранжевый", + "yellow": "Жёлтый", + "default": "По умолчанию", + "red": "Красный", + "modeDescription": "Выберите, как должен выглядеть интерфейс", + "colorDescription": "Выберите предпочитаемую цветовую схему", + "radiusDescription": "Настройте скругление элементов интерфейса", + "lightDescription": "Яркая и чистая", + "darkDescription": "Приятная для глаз", + "systemDescription": "Соответствует устройству", + "preview": "Предпросмотр", + "previewDescription": "Посмотрите, как выглядят настройки темы в реальном времени", + "dashboardPreview": "Предпросмотр панели", + "dashboardDescription": "Мониторинг производительности системы и управление учетными записями пользователей", + "currentTheme": "Текущая тема", + "sampleInput": "Пример ввода", + "primaryButton": "Основная кнопка", + "resetToDefaults": "Сбросить к настройкам по умолчанию", + "resetDescription": "Восстановить все настройки темы к значениям по умолчанию", + "resetting": "Сброс...", + "reset": "Сбросить", + "resetSuccess": "Тема сброшена к настройкам по умолчанию", + "resetFailed": "Не удалось сбросить настройки темы", + "radiusNone": "Без", + "radiusSmall": "Малый", + "radiusMedium": "Средний", + "radiusLarge": "Большой" + }, + "coreConfigModal": { + "addConfig": "Добавить конфигурацию ядра", + "createNewConfig": "Создать новую конфигурацию ядра", + "editCore": "Редактировать конфигурацию ядра", + "invalidJson": "Недопустимая конфигурация JSON", + "createSuccess": "Конфигурация ядра «{{name}}» успешно создана", + "createFailed": "Не удалось создать конфигурацию ядра «{{name}}»", + "editSuccess": "Конфигурация ядра «{{name}}» успешно обновлена", + "editFailed": "Не удалось обновить конфигурацию ядра «{{name}}»", + "keyPairGenerated": "Пара ключей успешно сгенерирована", + "shortId": "Короткий ID", + "shortIdGenerated": "Короткий ID успешно сгенерирован", + "shortIdCopied": "Короткий ID скопирован в буфер обмена", + "publicKeyCopied": "Публичный ключ скопирован в буфер обмена", + "privateKeyCopied": "Приватный ключ скопирован в буфер обмена", + "jsonConfig": "Конфигурация JSON", + "editJson": "Редактировать конфигурацию JSON", + "name": "Имя", + "namePlaceholder": "Введите имя конфигурации", + "fallback": "Резервный вариант", + "selectFallback": "Выберите резервный вариант", + "excludedInbound": "Исключенные входящие", + "selectInbound": "Выберите входящий", + "inbound": "Входящий", + "generateKeyPair": "Сгенерировать пару ключей", + "generateShortId": "Сгенерировать короткий ID", + "publicKey": "Публичный ключ", + "privateKey": "Приватный ключ", + "clearAllFallbacks": "Очистить все fallback", + "clearAllExcluded": "Очистить все исключённые входящие", + "copyPublicKey": "Копировать публичный ключ", + "copyPrivateKey": "Копировать приватный ключ", + "copyShortId": "Копировать короткий ID", + "restartNodes": "Перезапустить узлы", + "generateShadowsocksPassword": "Сгенерировать пароль Shadowsocks", + "generatingShadowsocksPassword": "Генерация пароля...", + "shadowsocksPassword": "Пароль Shadowsocks", + "shadowsocksPasswordCopied": "Пароль скопирован в буфер обмена", + "copyShadowsocksPassword": "Копировать пароль", + "selectEncryptionMethod": "Выберите метод шифрования", + "regeneratePassword": "Сгенерировать пароль заново" + }, + "settings.cores.title": "Ядра", + "settings.cores.description": "Управление вашими ядрами", + "settings.cores.addCore": "Добавить ядро", + "settings.cores.noCores": "Нет доступных ядер. Добавьте одно, чтобы начать.", + "settings.cores.duplicateSuccess": "Конфигурация ядра «{{name}}» успешно скопирована", + "settings.cores.duplicateFailed": "Не удалось скопировать конфигурацию ядра «{{name}}»", + "settings.cores.deleteSuccess": "Ядро успешно удалено", + "settings.cores.deleteFailed": "Не удалось удалить ядро", + "settings.cores.delete": "Удалить ядро", + "settings.cores.coreNotFound": "Ядро не найдено", + "createdAt": "Дата создания", + "toggle": "Переключить статус", + "close": "Закрыть", + "copy": "Копировать", + "userDialog": { + "deleteSuccess": "Пользователь «{{name}}» был успешно удалён.", + "resetUsageSuccess": "Использование пользователя «{{name}}» было сброшено.", + "revokeSubSuccess": "Подписка пользователя «{{name}}» была отозвана.", + "activeNextPlanSuccess": "Следующий план для пользователя «{{name}}» был активирован.", + "activeNextPlanError": "Не удалось активировать следующий план для пользователя «{{name}}».", + "deleteConfirmTitle": "Удалить пользователя", + "deleteConfirm": "Вы уверены, что хотите удалить пользователя «{{name}}»?", + "selectTemplate": "Выберите шаблон", + "selectTemplatePlaceholder": "Выберите шаблон", + "proxySettingsAccordion": "Настройки прокси", + "proxySettings.vmess": "VMess", + "proxySettings.vless": "VLESS", + "proxySettings.trojan": "Trojan", + "proxySettings.shadowsocks": "Shadowsocks", + "proxySettings.id": "ID", + "proxySettings.password": "Пароль", + "proxySettings.method": "Метод", + "proxySettings.flow": "Поток (Flow)", + "proxySettings.desc": "Настройте параметры протокола для этого пользователя.", + "selectNode": "Выберите узел", + "allNodes": "Все узлы", + "activeNextPlan": "Активировать следующий план", + "unknownClient": "Неизвестный клиент", + "selectedGroups": "{{count}} групп выбрано", + "editError": "Не удалось обновить пользователя «{{name}}»", + "createError": "Не удалось создать пользователя «{{name}}»", + "selectStatus": "Выберите статус", + "selectedTemplates": "Выбрано шаблонов: {{count}}" + }, + "userSettings": { + "subscriptionUrlCopied": "URL подписки скопирован в буфер обмена" + }, + "sidebar.expand": "Развернуть меню", + "sidebar.collapse": "Свернуть меню", + "usersTable.deleteUserTitle": "Удалить пользователя", + "usersTable.deleteUserPrompt": "Вы уверены, что хотите удалить пользователя «{{name}}»? Это действие необратимо.", + "usersTable.deleteSuccess": "Пользователь «{{name}}» был успешно удалён.", + "usersTable.deleteFailed": "Не удалось удалить пользователя «{{name}}». {{error}}", + "usersTable.delete": "Удалить", + "usersTable.cancel": "Отмена", + "statistics.trafficUsage": "Использование трафика", + "statistics.trafficUsageDescription": "Общее использование трафика на всех серверах", + "statistics.usageDuringPeriod": "Использование за период", + "statistics.users": "Пользователи", + "statistics.onlineUsers": "Онлайн пользователи", + "statistics.limitedUsers": "Ограниченные пользователи", + "statistics.activeUsers": "Активные пользователи", + "statistics.disabledUsers": "Отключенные пользователи", + "statistics.expiredUsers": "Истекшие пользователи", + "statistics.onHoldUsers": "Пользователи на удержании", + "statistics.allUsers": "Все пользователи", + "statistics.serverTraffic": "Трафик сервера", + "statistics.nodeTrafficDistribution": "Распределение трафика узлов", + "statistics.noNodesAvailable": "Нет доступных узлов", + "statistics.noDataAvailable": "Нет данных", + "statistics.noDataDescription": "Выберите временной диапазон для просмотра статистики и трендов использования трафика.", + "statistics.noNodesDescription": "Нет подключенных узлов для отображения распределения трафика.", + "statistics.loadingDescription": "Получение последних статистических данных...", + "statistics.waitingForData": "Ожидание данных", + "statistics.waitingForDataDescription": "Статистика в реальном времени появится здесь после начала передачи данных.", + "statistics.selectTimeRange": "Выберите временной диапазон", + "statistics.selectTimeRangeDescription": "Выберите диапазон дат выше, чтобы просмотреть статистику использования трафика.", + "statistics.noDataInRange": "Нет данных в выбранном диапазоне", + "statistics.noDataInRangeDescription": "Данные о трафике для выбранного периода времени не найдены. Попробуйте выбрать другой диапазон дат.", + "statistics.showTimeRange": "Временной диапазон", + "statistics.hideTimeRange": "Скрыть диапазон", + "statistics.selectNodeToView": "Выберите узел для просмотра подробной статистики", + "statistics.userStatisticsDescription": "Обзор состояния и активности учетных записей пользователей", + "errors.connectionFailed": "Ошибка подключения. Проверьте сеть и попробуйте снова.", + "errors.statisticsLoadFailed": "Не удалось загрузить статистику", + "usersTable.resetUsageTitle": "Сбросить использование пользователя", + "usersTable.resetUsagePrompt": "Вы уверены, что хотите сбросить использование для «{{name}}»?", + "usersTable.resetUsageSubmit": "Сбросить использование", + "usersTable.resetUsageSuccess": "Использование пользователя «{{name}}» успешно сброшено", + "usersTable.resetUsageFailed": "Не удалось сбросить использование пользователя «{{name}}»", + "time": { + "expires": "истекает", + "expired": "истек", + "year": "год", + "years": "года", + "month": "месяц", + "months": "месяца", + "day": "день", + "days": "дня", + "hour": "час", + "hours": "часа", + "min": "мин", + "mins": "мин", + "second": "секунда", + "seconds": "секунды", + "ago": "назад" + }, + "notConnectedYet": "Еще не подключен", + "node.xrayVersion": "Версия ядра", + "node.coreVersion": "Версия узла", + "calendar": { + "selectRange": "Выбрать диапазон", + "startDate": "Дата начала", + "endDate": "Дата окончания" + }, + "usersTable": { + "usageChart": "График использования", + "noUsageData": "Нет данных за этот период.", + "tryDifferentRange": "Попробуйте другой диапазон времени.", + "trendingUp": "Рост на", + "trendingDown": "Снижение на", + "usageSummary": "Показано общее использование за выбранный период.", + "loading": "загрузка...", + "noResults": "Результаты не найдены", + "emptyState": { + "noUsers": { + "title": "Пользователей пока нет", + "description": "Начните с создания первой учетной записи пользователя", + "createFirstUser": "Создать первого пользователя" + } + }, + "activeNextPlanTitle": "Активировать следующий план пользователя", + "activeNextPlanPrompt": "Вы уверены, что хотите активировать следующий план для «{{name}}»?", + "activeNextPlanSubmit": "Активировать следующий план" + }, + "setOwnerModal": { + "title": "Назначить владельца", + "currentOwner": "Текущий владелец:", + "none": "Нет", + "selectAdmin": "Выбрать нового владельца", + "confirm": "Назначить владельца", + "success": "Владелец пользователя {{username}} успешно изменён на {{admin}}.", + "error": "Не удалось изменить владельца пользователя {{username}} на {{admin}}.", + "loadError": "Не удалось загрузить список администраторов." + }, + "bulk": { + "title": "Массовые операции", + "groups": "Группы", + "proxySettings": "Настройки прокси", + "proxySettingsDesc": "Настройте параметры прокси для применения", + "applyToProxyDesc": "Выберите группы, пользователей или администраторов для применения настроек прокси", + "flowMethod": "Поток: {{flow}} | Метод: {{method}}", + "expireDate": "Дата истечения", + "dataLimit": "Лимит данных", + "groupsDesc": "Управление назначением групп для нескольких пользователей и администраторов одновременно. Добавление или удаление групп массово.", + "expireDateDesc": "Выберите дату истечения срока действия для применения", + "applyToExpireDesc": "Выберите группы, пользователей или администраторов для применения даты истечения срока действия", + "noDateSelected": "Дата не выбрана", + "dataLimitDesc": "Настройка лимитов данных для нескольких пользователей и администраторов одновременно.", + "selectFlow": "Выбрать Flow", + "selectMethod": "Выбрать Method", + "applyChanges": "Применить изменения", + "applyDescription": "Применить выбранные назначения групп и настройки к выбранным пользователям и администраторам.", + "addGroupsToUsers": "Добавить группы к пользователям", + "removeGroupsFromUsers": "Удалить группы у пользователей", + "confirmAddGroupsTitle": "Подтвердить добавление групп", + "confirmAddGroupsDescription": "Вы уверены, что хотите добавить {{totalGroups}} групп(ы) к {{totalTargets}} целям? Это действие назначит выбранные группы всем выбранным пользователям и администраторам.", + "confirmRemoveGroupsTitle": "Подтвердить удаление групп", + "confirmRemoveGroupsDescription": "Вы уверены, что хотите удалить {{totalGroups}} групп(ы) у {{totalTargets}} целей? Это действие удалит выбранные группы у всех выбранных пользователей и администраторов.", + "applySettings": "Применить настройки", + "settingsConfigured": "Настройки сконфигурированы", + "noSettings": "Нет настроек", + "searchGroups": "Поиск групп...", + "searchHasGroups": "Поиск существующих групп...", + "searchUsers": "Поиск пользователей...", + "searchAdmins": "Поиск администраторов...", + "selectGroups": "Выбрать группы", + "selectHasGroups": "Выбрать существующие группы", + "selectUsers": "Выбрать пользователей", + "selectAdmins": "Выбрать администраторов", + "expireDateLabel": "Дата истечения", + "expireDateRequired": "Пожалуйста, выберите дату истечения.", + "selectExpireDate": "Выберите дату истечения", + "applyExpireDate": "Применить дату истечения", + "applyExpireDescription": "Применить выбранную дату истечения к выбранным группам, пользователям и администраторам.", + "confirmApplyExpireTitle": "Подтвердить применение даты истечения", + "confirmApplyExpireDescription": "Вы уверены, что хотите применить дату истечения срока {{expireDate}} к {{totalTargets}} выбранным объектам? Это обновит дату истечения срока для всех выбранных групп, пользователей и администраторов.", + "insertExpireDatePlaceholder": "Введите дату истечения", + "dataLimitLabel": "Лимит данных (ГБ)", + "dataLimitPlaceholder": "Введите лимит данных в ГБ", + "dataLimitRequired": "Пожалуйста, введите действительный лимит данных.", + "applyDataLimit": "Применить лимит данных", + "applyDataLimitDescription": "Применить выбранный лимит данных к выбранным группам, пользователям и администраторам.", + "confirmApplyDataLimitTitle": "Подтвердить применение лимита данных", + "confirmApplyDataLimitDescription": "Вы уверены, что хотите применить лимит данных {{dataLimit}} ГБ к {{totalTargets}} целям? Это действие обновит лимит данных для всех выбранных групп, пользователей и администраторов.", + "insertDataLimitPlaceholder": "Введите лимит данных", + "flowLabel": "Flow", + "methodLabel": "Method", + "selectFlowPlaceholder": "Выберите flow", + "selectMethodPlaceholder": "Выберите method", + "proxySettingsRequired": "Пожалуйста, выберите хотя бы одну настройку прокси (Flow или Method).", + "applyProxySettings": "Применить настройки прокси", + "applyProxyDescription": "Применить выбранные настройки прокси к выбранным группам, пользователям и администраторам.", + "confirmApplyProxyTitle": "Подтвердить применение настроек прокси", + "confirmApplyProxyDescription": "Вы уверены, что хотите применить настройки прокси к {{totalTargets}} целям? Это действие обновит настройки прокси для всех выбранных групп, пользователей и администраторов.", + "noTargetsSelected": "Пожалуйста, выберите хотя бы одну цель.", + "selectedCount": "Выбрано: {{count}}", + "groupsCount": "{{count}} групп", + "targetsCount": "{{count}} целей", + "applyTo": "Применить к", + "applyToDesc": "Выберите пользователя или администратора для применения настроек", + "operationType": "Тип операции", + "groupsOperationDesc": "Выберите, добавлять или удалять группы у пользователей.", + "addGroups": "Добавить группы", + "removeGroups": "Удалить группы", + "addExpiry": "Добавить к сроку действия", + "subtractExpiry": "Вычесть из срока действия", + "addDataLimit": "Добавить лимит данных", + "subtractDataLimit": "Вычесть лимит данных", + "applyToDataLimitDesc": "Выберите группы, пользователей или администраторов для применения лимита данных", + "noLimitSet": "Лимит не установлен", + "confirmApplyExpireDescriptionAll": "Вы уверены, что хотите применить дату истечения срока {{expireDate}} ко ВСЕМ пользователям, администраторам и группам? Это обновит дату истечения срока для всех.", + "confirmApplyDataLimitDescriptionAll": "Вы уверены, что хотите применить лимит данных {{dataLimit}} ГБ ко ВСЕМ пользователям, администраторам и группам? Это обновит лимит данных для всех.", + "confirmApplyProxyDescriptionAll": "Вы уверены, что хотите применить настройки прокси ко ВСЕМ пользователям, администраторам и группам? Это обновит настройки прокси для всех.", + "confirmApplyGroupsDescriptionAll": "Вы уверены, что хотите применить изменения групп ко ВСЕМ пользователям, администраторам и группам? Это обновит группы для всех.", + "confirmApplyGroupsDescription": "Вы уверены, что хотите применить изменения групп к {{totalTargets}} выбранным объектам? Это обновит группы для всех выбранных пользователей и администраторов.", + "expire.placeholder": "Введите дату истечения" + }, + "operationSuccess": "Операция выполнена успешно!", + "operationFailed": "Операция не удалась!", + "settingsApplied": "Настройки применены успешно!", + "applying": "Применение...", + "inboundTags": "Входящие теги", + "searchInbounds": "Поиск входящих...", + "noInboundsFound": "Входящие не найдены", + "timeSelector.pickDate": "Выбрать дату", + "advanceSearch": { + "title": "Расширенный поиск", + "byUsername": "Имя пользователя и заметки", + "byProtocol": "Данные протокола", + "byStatus": "Статус", + "byAdmin": "Администратор", + "byGroup": "Группа", + "selectGroup": "Выберите группу ...", + "selectAdmin": "Выберите администратора ...", + "selectStatus": "Выберите статус ..." + }, + "clearAllFilters": "Очистить все фильтры", + "activeFilters": "активных" +} \ No newline at end of file diff --git a/dashboard/public/statics/locales/zh.json b/dashboard/public/statics/locales/zh.json new file mode 100644 index 000000000..92cf0a781 --- /dev/null +++ b/dashboard/public/statics/locales/zh.json @@ -0,0 +1,1534 @@ +{ + "active": "激活", + "platform": "平台", + "dashboard": "仪表板", + "master": "所有节点", + "dashboardDescription": "PasarGuard 管理仪表板", + "allStatuses": "所有状态", + "status": "状态", + "statistics": "统计", + "selectAll": "全选", + "deselectAll": "取消全选", + "hosts": "主机", + "success": "成功", + "error": "错误", + "modifying": "修改中...", + "removing": "删除中...", + "creating": "正在创建...", + "monitorUsers": "监控用户", + "alltime": "全部时间", + "coreUsername": "核心用户名", + "nodes": { + "title": "节点", + "description": "管理您的节点", + "addNode": "添加节点", + "editNode": "编辑节点", + "deleteNode": "删除节点", + "nodeName": "节点名称", + "nodeAddress": "节点地址", + "nodePort": "节点端口", + "usageCoefficient": "使用系数", + "connectionType": "连接类型", + "serverCA": "服务器证书", + "keepAlive": "保持连接", + "maxLogs": "最大日志数", + "maxLogsPlaceHolder": "输入最大日志数(以秒为单位)", + "status": "状态", + "actions": "操作", + "connected": "已连接", + "disconnected": "未连接", + "disabled": "已禁用", + "enabled": "已启用", + "createSuccess": "节点 «{{name}}» 创建成功", + "createFailed": "创建节点 «{{name}}» 失败", + "editSuccess": "节点 «{{name}}» 更新成功", + "editFailed": "更新节点 «{{name}}» 失败", + "deleteSuccess": "节点 «{{name}}» 删除成功", + "deleteFailed": "删除节点 «{{name}}» 失败", + "enableSuccess": "节点 «{{name}}» 启用成功", + "enableFailed": "启用节点 «{{name}}» 失败", + "disableSuccess": "节点 «{{name}}» 禁用成功", + "disableFailed": "禁用节点 «{{name}}» 失败", + "certificate": "证书", + "createdAt": "创建时间", + "selectNode": "选择节点", + "noNodes": "未配置节点", + "noNodesDescription": "主面板没有配置任何核心。您需要从", + "noNodesDescription2": "连接和配置节点,并将其连接到面板。", + "logs": { + "title": "日志", + "description": "查看和监控节点日志", + "noLogs": "没有可用的日志", + "timestamps": "时间戳", + "search": "搜索日志", + "filter": "过滤日志", + "debug": "调试", + "info": "信息", + "warning": "警告", + "error": "错误", + "download": "下载日志", + "paused": "日志已暂停", + "resume": "恢复", + "pause": "暂停", + "messagesBuffered": "条消息已缓冲", + "linesLabel": "行数:", + "linesCount": "{{count}} 行", + "sinceLabel": "从:", + "all": "全部", + "timeFilters": { + "all": "所有时间", + "1m": "1分钟", + "5m": "5分钟", + "15m": "15分钟", + "30m": "30分钟", + "1h": "1小时", + "2h": "2小时" + } + } + }, + "groups": "群组", + "documentation": "文档", + "discussionGroup": "讨论组", + "github": "GitHub", + "community": "社区", + "supportUs": "支持我们", + "manageHosts": "管理和控制主机", + "manageSettings": "管理和控制设置", + "settings": { + "title": "设置", + "notifications": { + "title": "通知", + "description": "配置通知设置并管理系统的通知偏好", + "loadError": "无法加载通知设置。请重试。", + "saveSuccess": "通知设置保存成功", + "saveFailed": "保存通知设置失败", + "cancelSuccess": "已取消更改并恢复原始设置", + "activeTypes": "活跃类型", + "filterTitle": "通知过滤器", + "filterDescription": "选择应触发通知的事件,以便了解重要的系统活动", + "types": { + "admin": "管理员", + "core": "核心", + "group": "群组", + "host": "主机", + "login": "登录", + "node": "节点", + "user": "用户", + "userTemplate": "模板", + "daysLeft": "到期", + "percentageReached": "使用量" + }, + "telegram": { + "title": "Telegram", + "description": "配置 Telegram 机器人通知,在您的 Telegram 聊天或频道中接收实时警报", + "apiToken": "机器人 API 令牌", + "adminId": "管理员聊天 ID", + "channelId": "频道 ID", + "topicId": "主题 ID" + }, + "discord": { + "title": "Discord", + "description": "配置 Discord webhook 通知,直接在您的 Discord 服务器频道中接收警报", + "webhookUrl": "Webhook URL" + }, + "advanced": { + "title": "高级设置", + "description": "配置高级通知行为,包括重试策略和代理设置", + "maxRetries": "最大重试次数", + "proxyUrl": "代理 URL" + } + }, + "subscriptions": { + "title": "订阅", + "description": "配置订阅 URL、更新间隔和特定客户端规则", + "loadError": "无法加载订阅设置", + "saveSuccess": "订阅设置保存成功", + "saveError": "保存订阅设置失败", + "cancelSuccess": "已取消更改并恢复原始设置", + "general": { + "title": "常规设置", + "description": "配置基本订阅参数", + "urlPrefix": "URL 前缀", + "urlPrefixPlaceholder": "sub", + "urlPrefixDescription": "添加到所有订阅 URL 的前缀", + "updateInterval": "更新间隔(小时)", + "updateIntervalDescription": "订阅自动更新的间隔时间", + "supportUrl": "支持链接", + "supportUrlPlaceholder": "输入支持页面 URL", + "supportUrlDescription": "用户支持和帮助的链接", + "profileTitle": "配置文件标题", + "profileTitlePlaceholder": "输入配置文件标题", + "profileTitleDescription": "显示在客户端中的配置文件名称", + "hostStatusFilter": "主机状态过滤", + "hostStatusFilterDescription": "仅包含活跃主机在订阅中" + }, + "rules": { + "title": "订阅规则", + "description": "为特定客户端模式定义自定义规则", + "addRule": "添加规则", + "noRules": "尚未配置规则。点击上方按钮添加第一个规则。", + "pattern": "模式", + "patternPlaceholder": "输入客户端模式(例如:*android*)", + "patternDescription": "匹配客户端用户代理的模式", + "target": "目标格式", + "targetDescription": "匹配此模式时使用的配置格式" + }, + "formats": { + "title": "手动订阅格式", + "description": "启用或禁用特定的订阅格式", + "links": "链接", + "linksDescription": "原始代理链接格式", + "linksBase64": "Base64 链接", + "linksBase64Description": "Base64 编码的代理链接", + "xray": "Xray", + "xrayDescription": "Xray 核心配置格式", + "singBox": "Sing-box", + "singBoxDescription": "Sing-box 配置格式", + "clash": "Clash", + "clashDescription": "Clash 代理配置格式", + "clashMeta": "Clash Meta", + "clashMetaDescription": "Clash Meta 增强配置格式", + "outline": "Outline", + "outlineDescription": "Outline VPN 配置格式" + }, + "configFormats": { + "links": "链接", + "links_base64": "Base64 链接", + "xray": "Xray", + "sing_box": "Sing-box", + "clash": "Clash", + "clash_meta": "Clash Meta", + "outline": "Outline", + "block": "阻止" + } + }, + "telegram": { + "title": "Telegram", + "description": "配置 Telegram 机器人集成和系统相关设置", + "loadError": "加载 Telegram 设置失败,请重试。", + "saveSuccess": "Telegram 设置保存成功", + "saveFailed": "保存 Telegram 设置失败", + "cancelSuccess": "更改已取消,原始 Telegram 设置已恢复", + "general": { + "title": "常规设置", + "description": "基本 Telegram 机器人配置和连接设置", + "enable": "启用 Telegram 集成", + "enableDescription": "为您的系统启用或禁用 Telegram 机器人功能", + "token": "机器人 API 令牌", + "tokenPlaceholder": "输入您的 Telegram 机器人令牌", + "tokenDescription": "从 Telegram 的 @BotFather 获取的机器人令牌", + "webhookUrl": "Webhook URL", + "webhookUrlPlaceholder": "https://your-domain.com/webhook", + "webhookUrlDescription": "Telegram 发送更新的 URL", + "webhookSecret": "Webhook 密钥", + "webhookSecretPlaceholder": "输入 webhook 密钥", + "webhookSecretDescription": "用于 webhook 安全的秘密令牌", + "method": "连接方式", + "methodPlaceholder": "选择连接方式", + "methodDescription": "选择机器人如何从 Telegram 接收更新", + "webhook": "Webhook", + "longPolling": "长轮询", + "proxyUrl": "代理 URL", + "proxyUrlPlaceholder": "socks5://proxy.example.com:1080", + "proxyUrlDescription": "Telegram API 连接的代理 URL(可选)", + "miniAppUrl": "Mini App 链接", + "miniAppUrlPlaceholder": "输入 Mini App 链接(可选)", + "miniAppUrlDescription": "您的 Telegram Mini App 链接。如果未使用请留空。" + }, + "advanced": { + "title": "高级设置", + "description": "高级 Telegram 机器人功能和配置", + "miniAppLogin": "启用小程序登录", + "miniAppLoginDescription": "允许用户通过 Telegram 小程序登录", + "miniAppUrl": "Mini App 链接", + "miniAppUrlPlaceholder": "输入 Mini App 链接(可选)", + "miniAppUrlDescription": "您的 Telegram Mini App 链接。如果未使用请留空。", + "forAdminsOnly": "仅限管理员", + "forAdminsOnlyDescription": "限制机器人访问仅限管理员" + } + }, + "discord": { + "title": "Discord", + "description": "为您的系统配置 Discord 机器人集成和相关设置", + "loadError": "加载 Discord 设置失败。请重试。", + "saveSuccess": "Discord 设置保存成功", + "saveFailed": "保存 Discord 设置失败", + "cancelSuccess": "已取消更改并恢复原始 Discord 设置", + "general": { + "title": "基本设置", + "description": "基本 Discord 机器人配置和连接设置", + "enable": "启用 Discord 机器人", + "enableDescription": "启用或禁用系统的 Discord 机器人功能", + "token": "机器人令牌", + "tokenPlaceholder": "输入您的 Discord 机器人令牌", + "tokenDescription": "从 Discord 开发者门户获取的机器人令牌", + "proxyUrl": "代理 URL", + "proxyUrlPlaceholder": "socks5://proxy.example.com:1080", + "proxyUrlDescription": "Discord API 连接的代理 URL(可选)" + } + }, + "webhook": { + "title": "Webhook", + "description": "配置系统的Webhook通知和端点设置", + "loadError": "加载Webhook设置失败。请重试。", + "saveSuccess": "Webhook设置保存成功", + "saveFailed": "保存Webhook设置失败", + "cancelSuccess": "更改已取消,Webhook设置已还原", + "general": { + "title": "常规设置", + "description": "基本Webhook配置和连接设置", + "enable": "启用Webhook", + "enableDescription": "为您的系统启用或禁用Webhook通知", + "timeout": "超时(秒)", + "timeoutDescription": "Webhook调用的请求超时时间(1-300秒)", + "recurrent": "重试次数", + "recurrentDescription": "失败Webhook的重试次数(1-24)", + "proxyUrl": "代理URL", + "proxyUrlPlaceholder": "http://proxy.example.com:8080", + "proxyUrlDescription": "Webhook请求的代理URL(可选)" + }, + "webhooks": { + "title": "Webhook端点", + "description": "配置Webhook URL和身份验证", + "add": "添加Webhook", + "addFirst": "添加第一个Webhook", + "webhook": "Webhook", + "empty": "尚未配置Webhook。添加您的第一个Webhook端点。", + "name": "名称", + "namePlaceholder": "我的Webhook", + "url": "URL", + "secret": "密钥", + "secretPlaceholder": "输入Webhook密钥" + }, + "triggers": { + "daysLeft": { + "title": "剩余天数通知", + "description": "当用户账户剩余指定天数时发送通知", + "empty": "未设置触发器" + }, + "usagePercent": { + "title": "使用百分比通知", + "description": "当用户达到指定使用百分比时发送通知", + "empty": "未设置触发器" + } + } + }, + "cleanup": { + "title": "清理", + "description": "管理过期账户和重置数据使用量以进行系统维护", + "loadError": "加载清理设置失败,请重试。", + "saveSuccess": "清理操作成功完成", + "saveFailed": "清理操作失败", + "cancelSuccess": "清理操作已取消", + "expiredUsers": { + "title": "删除过期账户", + "description": "删除在特定日期范围内过期的账户", + "expiredAfter": "过期时间晚于", + "expiredBefore": "过期时间早于", + "expiredAfterPlaceholder": "选择开始日期", + "expiredBeforePlaceholder": "选择结束日期", + "dateRange": "日期范围", + "deleteExpired": "删除过期账户", + "deleting": "删除中...", + "deleteSuccess": "成功删除 {{count}} 个过期账户", + "deleteFailed": "删除过期账户失败", + "confirmDelete": "删除过期账户", + "confirmDeleteMessage": "您确定要删除所选日期范围内的所有过期账户吗?此操作无法撤销。", + "noDateSelected": "请至少选择一个日期", + "selectDateRange": "选择要删除过期账户的日期范围(只能选择过去的日期)" + }, + "resetUsage": { + "title": "重置所有数据使用量", + "description": "重置系统中所有账户的数据使用量", + "resetAll": "重置所有使用量", + "resetting": "重置中...", + "resetSuccess": "所有数据使用量重置成功", + "resetFailed": "重置数据使用量失败", + "confirmReset": "重置所有数据使用量", + "confirmResetMessage": "您确定要重置所有账户的数据使用量吗?此操作无法撤销。", + "warning": "此操作将重置系统中所有账户的数据使用量" + }, + "clearUsageData": { + "title": "清除使用数据", + "description": "从选定的数据库表中永久删除使用数据", + "selectTable": "选择表", + "selectTablePlaceholder": "选择要清除的表", + "noTableSelected": "请选择要清除的表", + "dataAfter": "数据晚于", + "dataBefore": "数据早于", + "dataAfterPlaceholder": "选择开始日期", + "dataBeforePlaceholder": "选择结束日期", + "selectDateRange": "选择日期范围以按创建时间过滤数据(可选 - 留空以清除所有数据)", + "clearData": "清除数据", + "clearing": "清除中...", + "clearSuccess": "成功清除 {{table}} 表中的数据", + "clearFailed": "清除使用数据失败", + "confirmClear": "确认清除数据", + "confirmClearMessage": "您确定要永久删除 {{table}} 表中的所有数据吗?此操作无法撤销。", + "warning": "警告:此操作将永久删除所选表中的所有使用数据。此操作无法撤销。", + "tables": { + "nodeUserUsages": "节点用户使用情况", + "userUsages": "用户使用情况" + } + } + }, + "theme": { + "title": "主题", + "description": "自定义您的应用主题", + "light": "明亮", + "dark": "深色", + "system": "系统", + "selectTheme": "选择主题", + "themeSaved": "主题保存成功", + "themeChanged": "主题更改成功", + "visitThemePage": "访问主题页面进行进一步自定义", + "radiusSaved": "边框圆角更新成功", + "mode": "模式", + "color": "颜色", + "radius": "边框圆角", + "zinc": "锌灰", + "rose": "玫瑰", + "blue": "蓝色", + "green": "绿色", + "violet": "紫色", + "orange": "橙色", + "yellow": "黄色", + "default": "默认", + "red": "红色", + "modeDescription": "选择界面的显示方式", + "colorDescription": "选择您喜欢的配色方案", + "radiusDescription": "调整界面元素的圆角程度", + "lightDescription": "明亮清新", + "darkDescription": "护眼模式", + "systemDescription": "跟随设备", + "preview": "实时预览", + "previewDescription": "实时查看您的主题设置效果", + "dashboardPreview": "仪表板预览", + "dashboardDescription": "监控系统性能和管理用户账户", + "currentTheme": "当前主题", + "sampleInput": "示例输入", + "primaryButton": "主要按钮", + "resetToDefaults": "重置为默认", + "resetDescription": "将所有主题设置恢复为默认值", + "resetting": "重置中...", + "reset": "重置", + "resetSuccess": "主题已重置为默认设置", + "resetFailed": "重置主题设置失败", + "radiusNone": "无", + "radiusSmall": "小", + "radiusMedium": "中", + "radiusLarge": "大" + }, + "general": { + "title": "常规设置", + "description": "配置系统的基本设置", + "loadError": "加载常规设置失败,请重试。", + "saveSuccess": "常规设置保存成功", + "saveFailed": "常规设置保存失败", + "cancelSuccess": "更改已取消,原始设置已恢复", + "defaultFlow": { + "title": "默认 VLESS 流", + "description": "为新 VLESS 用户自动填写流字段" + }, + "defaultMethod": { + "title": "默认 Shadowsocks 加密方式", + "description": "为新 Shadowsocks 用户自动填写加密方式" + }, + "errorLoadingSettings": "加载设置时出错" + }, + "errorLoadingSettings": "加载设置时出错" + }, + "saving": "保存中...", + "general": "常规", + "core": "核心", + "activeUsers": "活跃用户", + "apply": "应用", + "cancel": "取消", + "created": "已创建", + "by": "由", + "ip": "IP", + "admin": "管理员", + "sudo": "超级用户", + "save": "保存", + "test": "测试", + "testing": "测试中", + "confirm": "确认", + "admins": { + "title": "管理员", + "description": "管理系统管理员", + "createAdmin": "创建管理员", + "editAdmin": "编辑管理员", + "deleteAdmin": "删除管理员", + "username": "用户名", + "password": "密码", + "isSudo": "超级管理员", + "createdAt": "创建时间", + "actions": "操作", + "createSuccess": "管理员「{{name}}」创建成功", + "createFailed": "创建管理员「{{name}}」失败", + "editSuccess": "管理员「{{name}}」更新成功", + "editFailed": "更新管理员「{{name}}」失败", + "deleteSuccess": "管理员{{name}}删除成功", + "deleteFailed": "删除管理员{{name}}失败", + "enterUsername": "请输入用户名", + "enterPassword": "请输入密码", + "sudo": "超级管理员权限", + "edit": "保存更改", + "create": "创建管理员", + "status": "状态", + "role": "角色", + "total.users": "用户总数", + "used.traffic": "已用流量", + "total": "管理员总数", + "active": "活跃管理员", + "disable": "禁用的管理员", + "telegramId": "Telegram ID", + "discord": "Discord Webhook", + "supportUrl": "支持链接", + "subDomain": "订阅域名", + "profile": "个人资料标题", + "subTemplate": "订阅模板路径", + "passwordConfirm": "确认密码", + "enterPasswordConfirm": "请输入确认密码", + "disableSuccess": "管理员「{{name}}」已成功禁用", + "enableSuccess": "管理员「{{name}}」已成功启用", + "disableFailed": "禁用管理员「{{name}}」失败", + "enableFailed": "启用管理员「{{name}}」失败", + "resetUsersUsage": "管理员重置用户使用情况", + "resetUsageSuccess": "管理员已成功重置用户「{{name}}」的使用情况", + "resetUsageFailed": "管理员重置用户「{{name}}」的使用情况失败", + "reset": "重置使用情况", + "discordId": "Discord ID", + "lifetime.used.traffic": "总计", + "used": { + "traffic": "使用情况" + }, + "monitor": { + "traffic": "监控管理员使用情况", + "no_traffic": "没有使用情况数据" + } + }, + "shortcuts": { + "title": "键盘快捷键", + "description": "管理您的仪表板快捷键以便快速访问", + "add": "添加快捷键", + "empty": "未配置快捷键" + }, + "quickActions": { + "title": "快速操作", + "description": "选择操作以在系统中创建新项目", + "comingSoon": "即将推出" + }, + "resetUsersUsage.prompt": "你确定要重置管理员用户{{name}}的使用情况吗?", + "admin.disable": "管理员已禁用", + "admin.enable": "管理员已启用", + "deleteAdmin.prompt": "您确定要删除管理员{{name}}吗?", + "activeUsers.prompt": "您是否要激活此 {{name}} 下的所有用户?", + "disableUsers.prompt": "您是否要禁用此 {{name}} 下的所有用户?", + "manageAccounts": "控制、更新和排列用户账户", + "manageGroups": "控制、更新和排列用户组", + "manageNodes": "监控、控制、添加、编辑和删除节点", + "onlineUsers": "在线用户", + "totalUsers": "总用户", + "edit": "编辑", + "editGroup": "编辑群组", + "disable": "禁用", + "warning": "警告", + "remove": "删除", + "modify": "修改", + "templates.userTemplates": "模板", + "editUserTemplateModal.title": "编辑用户模板", + "userTemplateModal.title": "创建用户模板", + "templates": { + "title": "模板", + "description": "管理您的模板", + "addTemplate": "创建模板", + "editSuccess": "用户模板「{{name}}」已成功更新", + "createSuccess": "用户模板「{{name}}」已成功创建", + "editFailed": "更新用户模板「{{name}}」失败", + "createFailed": "创建用户模板「{{name}}」失败", + "name": "名称", + "status": "状态", + "prefix": "用户名前缀", + "suffix": "用户名后缀", + "dataLimit": "数据限制", + "expire": "过期时间", + "onHoldTimeout": "挂起超时", + "method": "方法", + "flow": "流程", + "groups": "分组", + "userDataLimitStrategy": "数据限制重置策略", + "resetUsage": "重置使用量", + "groupsExistingWarning": "您尚未添加任何分组。", + "deleteSuccess": "模板 {{name}} 已成功删除", + "deleteFailed": "删除模板 {{name}} 失败", + "deleteUserTemplateTitle": "删除用户模板", + "deleteUserTemplatePrompt": "您确定要删除模板 {{name}} 吗?", + "duplicateSuccess": "模板「{{name}}」复制成功", + "duplicateFailed": "复制模板「{{name}}」失败", + "enableSuccess": "模板「{{name}}」已成功启用", + "disableSuccess": "模板「{{name}}」已成功禁用", + "enableFailed": "启用管理员「{{name}}」失败", + "disableFailed": "禁用管理员「{{name}}」失败", + "resetUsages": "重置使用量" + }, + "core.configuration": "配置", + "core.generalErrorMessage": "配置有误, 请检查", + "core.logs": "日志", + "core.restartCore": "重启核心", + "core.restarting": "重启中...", + "core.save": "保存", + "core.socket.closed": "已关闭", + "core.socket.connected": "已连接", + "core.socket.connecting": "连接中...", + "core.socket.not_connected": "未连接", + "core.successMessage": "核心设置更新成功", + "core.title": "核心设置", + "core.toggleSuccess": "核心 «{{name}}» 状态切换成功", + "core.toggleFailed": "核心 «{{name}}» 状态切换失败", + "core.deleteSuccess": "核心 «{{name}}» 删除成功", + "core.deleteFailed": "核心 «{{name}}» 删除失败", + "core.deleteConfirm": "您确定要删除核心 «{{name}}» 吗?", + "createNewUser": "创建新用户", + "createUser": "创建用户", + "createGroup": "创建群组", + "dataUsage": "总流量", + "dateFormat": "MM/dd/yyyy", + "delete": "删除", + "deleteNode.deleteSuccess": "节点 {{name}} 删除成功", + "deleteNode.prompt": "您确实要删除 {{name}} 节点吗?", + "deleteNode.title": "删除节点", + "deleteHost.title": "删除主机", + "deleteHost.prompt": "您确定要删除 {{name}} 主机吗?", + "deleteHost.deleteSuccess": "主机 {{name}} 已成功删除", + "deleteHost.deleteFailed": "无法删除主机 {{name}}", + "editHost.title": "编辑主机", + "editNode.editSuccess": "节点 {{name}} 已成功更新", + "editNode.title": "编辑节点", + "deleteUser.deleteSuccess": "{{username}} 删除成功。", + "deleteUser.prompt": "您确定你要删除 {{username}}?", + "deleteUser.title": "删除用户", + "disabled": "禁用", + "expire": "过期", + "expired": "已在 {{time}} 前过期", + "expires": "将在 {{time}} 后过期", + "header.donation": "捐赠", + "header.hostSettings": "设置", + "header.logout": "退出", + "header.nodeSettings": "节点设置", + "header.nodesUsage": "节点统计", + "hostsDialog.addHost": "添加主机", + "hostsDialog.advancedOptions": "高级选项", + "hostsDialog.useSniAsHost": "使用 SNI 作为主机名", + "hostsDialog.echConfigList": "ECH 配置列表", + "hostsDialog.echConfigList.info": "加密客户端问候 (ECH) 配置列表。这是一个 base64 编码的字符串。", + "hostsDialog.echConfigListPlaceholder": "输入 ECH 配置列表", + "hostsDialog.alpn": "ALPN", + "hostsDialog.apply": "保存", + "hostsDialog.currentServer": "当前服务器的 IP 地址", + "hostsDialog.currentServerv6": "当前服务器的 IPv6 地址", + "hostsDialog.dataLimit": "用户的流量限制", + "hostsDialog.dataUsage": "用户当前流量情况", + "hostsDialog.desc": "使用这些变量使其可以动态替换", + "hostsDialog.expireDate": "用户的有效期", + "hostsDialog.fingerprint": "指纹", + "hostsDialog.fragment": { + "title": "分片", + "packets": "数据包", + "packetsPlaceholder": "输入数据包数量", + "length": "长度", + "lengthPlaceholder": "输入长度", + "interval": "间隔", + "intervalPlaceholder": "输入间隔", + "allFieldsRequired": "如果填写一个字段,则必须填写所有字段" + }, + "hostsDialog.fragment.info": "length,interval,packet (e.g. 10-100,100-200,tlshello)", + "hostsDialog.fragment.info.attention": "请注意: 当前特性仅支持 streisand >= 1.6.12 and v2rayNG >= 1.8.16 (自定义配置)", + "hostsDialog.fragment.info.examples": "示例:", + "hostsDialog.fragment.fragment": "分片", + "hostsDialog.fragment.fallbackDelay": "回退延迟", + "hostsDialog.fragment.recordFragment": "记录分片", + "hostsDialog.noise": { + "title": "噪声", + "type": "类型", + "addNoise": "添加噪声", + "removeNoise": "删除噪声", + "noNoiseSettings": "未配置噪声设置", + "packet": "数据包", + "packetPlaceholder": "输入数据包值(例如:rand:10-20)", + "delay": "延迟", + "delayPlaceholder": "输入延迟", + "rand": "随机" + }, + "hostsDialog.noise.info": "packet,delay (e.g. rand:10-20,100-200)", + "hostsDialog.noise.info.attention": "Attention: currently, this feature only supported in streisand >= 1.6.32 and v2rayNG >= 1.8.39 (custom config)", + "hostsDialog.noise.info.examples": "Examples:", + "hostsDialog.host": "主机", + "hostsDialog.host.info": "默认情况下,如果在 Xray 配置中设置了请求主机,则使用该主机。但是,如果需要,您可以在此处设置自定义请求主机。", + "hostsDialog.host.multiHost": "使用 , 作为分隔符设置多个地址,使用时,每次随机选择一个地址。", + "hostsDialog.host.wildcard": "使用 * 生成随机字符串 (在通配符域名中生效)", + "hostsDialog.jalaliExpireDate": "用户阳历有效日期", + "hostsDialog.loading": "加载中...", + "hostsDialog.muxEnable": "启用 MUX", + "hostsDialog.path": "路径", + "hostsDialog.path.info": "为主机用户设置路径,通常在反向代理中使用。", + "hostsDialog.port": "端口", + "hostsDialog.port.info": "默认情况下,主机使用入站端口的默认端口。如果此主机是一个服务器,用于从与您的服务器端口不同的端口转发流量,则可以设置自定义端口。例如,服务器可能会将来自端口 8443 的流量转发到您入站服务器的默认端口。", + "hostsDialog.proxyMethod": "代理传输方法(例如 ws)", + "hostsDialog.proxyOutbound": "代理出站 json", + "hostsDialog.proxyOutbound.info": "额外出站(仅在 v2ray 自定义配置中)", + "hostsDialog.proxyProtocol": "代理协议(例如 VMess)", + "hostsDialog.randomUserAgent": "使用随机 User-Agent", + "hostsDialog.remainingData": "用户剩余流量情况", + "hostsDialog.remainingDays": "用户的剩余天数", + "hostsDialog.remainingTime": "用户剩余时间", + "hostsDialog.savedSuccess": "设置保存成功", + "hostsDialog.security": "安全层", + "hostsDialog.security.info": "如果此主机的中间件服务器使用的安全层与入站默认值不同,则可以在此处设置自定义安全层。", + "hostsDialog.sni": "SNI", + "hostsDialog.sni.info": "默认情况下,主机使用入站 SNI 的默认值。如果此主机是一个服务器且 SNI 不同,则可以设置自定义 SNI。例如,服务器可能会接收带有不同 SSL 证书的流量,执行 SSL 处理并将其转发到您的入站服务器。", + "hostsDialog.sniPlaceholder": "SNI (例如:example.com)", + "hostsDialog.sockopt": "Sockopt", + "hostsDialog.statusEmoji": "用户状态作为表情符号 (✅,⌛️,🪫,❌,🔌)", + "hostsDialog.statusText": "用户状态", + "hostsDialog.title": "使用此设置,您可以为每个入站分配特定的地址。", + "hostsDialog.username": "用户的用户名", + "inbound": "入站", + "itemsPerPage": "每页条数", + "login": "登录", + "login.fieldRequired": "此项必填", + "login.loginYourAccount": "登录您的帐号", + "login.welcomeBack": "欢迎回来,请输入您的详细信息", + "memoryUsage": "内存状态", + "next": "下一页", + "monitorServers": "监控您的服务器和用户", + "manageServers": "控制您的服务器详细信息", + "nodes.addHostForEveryInbound": "为每个入站请求添加此节点作为新主机", + "nodes.addNewPasarGuardNode": "添加新的 PasarGuard 节点", + "nodes.prompt": "添加并配置节点详细信息", + "nodes.addNode": "添加节点", + "nodes.addNodeSuccess": "节点 {{name}} 添加成功", + "nodes.apply": "编辑节点", + "nodes.certificate": "证书", + "nodes.certificateCopied": "证书已复制到剪贴板", + "nodes.certificateDownloaded": "证书下载成功", + "nodes.certificateDescription": "要设置节点,您需要配置此证书以建立主服务器和节点之间的安全连接", + "nodes.connection-hint": "要设置PasarGuard节点,您需要在节点上设置此证书以初始化主服务器和节点之间的安全连接", + "nodes.download-certificate": "下载证书", + "nodes.editNode": "保存", + "nodes.hide-certificate": "隐藏证书", + "nodes.nodeAPIPort": "API 端口", + "nodes.nodeName": "名称", + "nodes.nodePort": "端口", + "nodes.reconnect": "重新连接", + "nodes.reconnecting": "重连中...", + "nodes.show-certificate": "如何证书", + "nodes.title": "使用 PasarGuard-Node,您可以通过在不同的服务器上添加不同的节点来提供多节点负载。", + "nodes.usageCoefficient": "使用系数", + "on_hold": "在线", + "duplicate": "复制", + "createAndManageTemplates": "创建和管理模板", + "password": "密码", + "previous": "上一页", + "qrcodeDialog.sublink": "订阅链接", + "reset": "重置", + "resetAllUsage": "重置所有统计", + "resetAllUsage.error": "重置失败,请稍候再试!", + "resetAllUsage.prompt": "此操作将清除所有用户统计,您确定要执行此操作吗? 这不能被撤消!", + "resetAllUsage.success": "所有统计重置完成。", + "resetAllUsage.title": "重置所有用户的数据使用情况", + "resetUserUsage.error": "重置失败,请稍候再试", + "resetUserUsage.prompt": "您确定要重置 {{username}} 的流量统计吗?", + "resetUserUsage.success": "{{username}} 的流量统计重置完成。", + "resetUserUsage.title": "重置用户流量统计", + "revoke": "撤销", + "revokeUserSub.error": "撤销订阅失败,请稍候再试!", + "revokeUserSub.prompt": "您确定要撤销用户 «{{username}}» 的订阅吗?", + "revokeUserSub.success": "成功撤销用户 {{username}} 的订阅。", + "revokeUserSub.title": "撤销用户订阅", + "subscriptionClients": { + "title": "订阅客户端", + "viewAllClients": "查看客户端", + "total": "总计:{{count}} 个客户端", + "showing": "显示最近 {{count}} 次访问", + "noClients": "未找到订阅客户端", + "noClientsDesc": "此用户尚未访问过其订阅", + "knownClient": "已知", + "unknown": "未知", + "error": "加载订阅客户端失败" + }, + "search": "搜索", + "status.active": "活跃", + "status.enable": "启用", + "status.disabled": "禁用", + "status.expired": "过期", + "status.limited": "受限", + "status.on_hold": "在线", + "nodeModal.status.error": "误", + "nodeModal.status.disabled": "已禁用", + "nodeModal.status.connecting": "正在连接", + "nodeModal.status.connected": "已连接", + "userDialog.absolute": "选择范围", + "userDialog.custom": "自定义", + "userDialog.dataLimit": "流量限制", + "userDialog.days": "天", + "userDialog.editUser": "修改", + "userDialog.editUserTitle": "用户编辑", + "userDialog.endDate": "结束日期", + "userDialog.expiryDate": "过期日期", + "userDialog.timeOutDate": "超时日期", + "userDialog.generatedByDefault": "默认自动生成", + "userDialog.hours": "小时", + "userDialog.method": "加密方式", + "userDialog.months": "月", + "userDialog.note": "备注", + "userDialog.onHold": "保持", + "userDialog.onHoldExpireDuration": "过期时间", + "userDialog.onHoldExpireDurationPlaceholder": "例如:7", + "userDialog.optional": "可以为空", + "userDialog.periodicUsageReset": "定期重置流量", + "userDialog.protocols": "协议", + "userDialog.relative": "相对时间", + "userDialog.resetStrategyAnnually": "每年", + "userDialog.resetStrategyDaily": "每天", + "userDialog.resetStrategyMonthly": "每月", + "userDialog.resetStrategyNo": "无", + "userDialog.resetStrategyWeekly": "每周", + "userDialog.resetUsage": "重置流量", + "userDialog.revokeSubscription": "撤销订阅", + "userDialog.subscriptionInfo": "订阅信息", + "userDialog.subscriptionUpdated": "最后更新", + "userDialog.lastClient": "最后客户端", + "userDialog.subscriptionNotAccessed": "尚未访问", + "userDialog.unknownClient": "未知客户端", + "userDialog.selectOneProtocol": "请至少选择一个协议", + "userDialog.shadowsocksDesc": "快速且安全, 但效率不如其它", + "userDialog.startDate": "开始日期", + "userDialog.total": "总共:", + "userDialog.trojanDesc": "轻量、安全且非常快", + "userDialog.usage": "流量详情", + "userDialog.userAlreadyExists": "用户已存在", + "userDialog.userCreated": "成功创建用户 {{username}}。", + "userDialog.userEdited": "已更新用户 {{username}}。", + "userDialog.vlessDesc": "轻量、快速且安全", + "userDialog.vmessDesc": "快速且安全", + "userDialog.warningNoProtocol": "请至少选择一个协议", + "userDialog.weeks": "周", + "userDialog.proxySettingsAccordion": "代理设置", + "userDialog.proxySettings.vmess": "VMess", + "userDialog.proxySettings.vless": "VLESS", + "userDialog.proxySettings.trojan": "Trojan", + "userDialog.proxySettings.shadowsocks": "Shadowsocks", + "userDialog.proxySettings.id": "ID", + "userDialog.proxySettings.password": "密码", + "userDialog.proxySettings.method": "加密方式", + "userDialog.proxySettings.flow": "流 (Flow)", + "userDialog.proxySettings.desc": "为此用户配置协议专属设置。", + "userDialog.expireDate": "过期日期", + "userDialog.selectedGroups": "已选择 {{count}} 个分组", + "username": "用户名", + "users": "用户", + "usersTable.copied": "已复制", + "usersTable.copyConfigs": "复制配置", + "usersTable.copyLink": "复制订阅链接", + "usersTable.dataUsage": "流量统计", + "usersTable.noUser": "还没有添加任何用户", + "usersTable.noUserMatched": "没有找到您搜索的用户", + "usersTable.status": "状态", + "usersTable.sortByExpire": "按过期时间排序", + "usersTable.total": "总共", + "statistics.system": "系统", + "statistics.totalTraffic": "总流量", + "statistics.ramUsage": "RAM 使用情况", + "statistics.cpuUsage": "CPU 使用情况", + "statistics.cores": "核心", + "statistics.serverSelection": "服务器选择", + "statistics.selectServerToMonitor": "选择要监控其性能指标的服务器", + "statistics.selectServer": "选择服务器", + "statistics.realTimeData": "实时数据", + "statistics.historicalData": "历史数据", + "statistics.viewHistorical": "查看历史", + "statistics.viewRealtime": "查看实时", + "statistics.historical": "历史", + "statistics.realtime": "实时", + "statistics.realtimeDescription": "为您的服务器和用户提供实时统计和图表。", + "statistics.historicalDescription": "所选时间范围内的历史服务器性能数据", + "statistics.selectTimeRange": "选择时间范围", + "statistics.selectTimeRangeDescription": "选择用于历史数据分析的时间段", + "statistics.selectTimeRangeToView": "请选择一个时间范围来查看历史数据", + "hostsDialog": { + "addHost": "添加主机", + "selectInbound": "选择入站", + "fingerprint": "指纹", + "selectStatus": "选择状态", + "remarkRequired": "备注为必填项", + "addressRequired": "地址是必需的", + "portRequired": "端口为必填项", + "status": { + "label": "状态", + "active": "活动", + "disabled": "禁用", + "limited": "受限", + "expired": "已过期", + "onHold": "等待中" + }, + "loading": "加载中...", + "port": "端口", + "sni": "SNI", + "host": "主机", + "path": "路径", + "selectAlpn": "选择 ALPN", + "networkSettings": "网络设置", + "transportSettings": "传输设置", + "transportType": "传输类型", + "selectTransport": "选择传输类型", + "serviceName": "服务名称", + "enterServiceName": "输入 gRPC 服务名称", + "seed": "种子", + "enterSeed": "输入 KCP 种子", + "enterPath": "输入路径 (示例: /xray)", + "enterHost": "输入主机 (示例: example.com)", + "header": "头部", + "selectHeader": "选择头部类型", + "multiMode": "多模式", + "securitySettings": "安全设置", + "camouflagSettings": "伪装设置", + "security": "安全层", + "alpn": "ALPN", + "allowInsecure": "允许不安全连接", + "muxEnable": "启用 MUX", + "randomUserAgent": "使用随机 User-Agent", + "inboundDefault": "入站默认值", + "earlyData": "早期数据", + "httpHeaders": "HTTP 标头", + "headersName": "标头名称", + "headersValue": "标头值", + "addHeader": "添加标头", + "removeHeader": "删除标头", + "createSuccess": "主机「{{name}}」已成功创建", + "createFailed": "创建主机「{{name}}」失败", + "editSuccess": "主机「{{name}}」已成功更新", + "editFailed": "更新主机「{{name}}」失败", + "noStatus": "未选择状态", + "clearAllStatuses": "清除所有状态", + "transportSettingsAccordion": "传输设置", + "xhttp": { + "mode": "模式", + "noGrpcHeader": "无 gRPC 头", + "xPaddingBytes": "X-Padding 字节", + "scMaxEachPostBytes": "每个帖子最大字节数", + "scMinPostsIntervalMs": "帖子最小间隔(毫秒)", + "scMaxBufferedPosts": "最大缓冲帖子数", + "scStreamUpServerSecs": "流上传服务器(秒)", + "xmux": "XMux 设置", + "maxConcurrency": "最大并发数", + "maxConnections": "最大连接数", + "cMaxReuseTimes": "最大重用次数", + "cMaxLifetime": "最大生命周期", + "hMaxRequestTimes": "最大请求次数", + "hKeepAlivePeriod": "保活周期", + "downloadSettings": "下载设置", + "downloadSettingsInfo": "选择用于下载设置的主机", + "selectDownloadSettings": "选择下载设置主机" + }, + "grpc": { + "multiMode": "多模式", + "idleTimeout": "空闲超时", + "healthCheckTimeout": "健康检查超时", + "permitWithoutStream": "允许无流", + "initialWindowsSize": "初始窗口大小" + }, + "kcp": { + "header": "头部", + "mtu": "MTU", + "tti": "TTI", + "uplinkCapacity": "上行容量", + "downlinkCapacity": "下行容量", + "congestion": "拥塞控制", + "readBufferSize": "读缓冲区大小", + "writeBufferSize": "写缓冲区大小" + }, + "tcp": { + "title": "TCP 设置", + "header": "头部类型", + "request": { + "title": "请求设置", + "version": "HTTP 版本", + "method": "HTTP 方法", + "headers": "请求头" + }, + "response": { + "title": "响应设置", + "version": "HTTP 版本", + "status": "状态码", + "reason": "状态原因", + "headers": "响应头" + }, + "headerName": "头部名称", + "headerValue": "头部值", + "addHeader": "添加头部", + "removeHeader": "删除头部", + "requestHeaders": "请求头", + "responseHeaders": "响应头" + }, + "websocket": { + "heartbeatPeriod": "心跳周期" + }, + "muxSettings": "多路复用设置", + "enableMux": "启用 Mux", + "xraySettings": "Xray 设置", + "singBoxSettings": "Sing-box 设置", + "clashSettings": "Clash 设置", + "addXraySettings": "添加 Xray 设置", + "addSingBoxSetting": "添加 Sing-box 设置", + "addClashSettings": "添加 Clash 设置", + "protocol": "协议", + "selectProtocol": "选择协议", + "maxConnections": "最大连接数", + "maxStreams": "最大流数", + "minStreams": "最小流数", + "padding": "启用填充", + "enabled": "启用", + "concurrency": "并发数", + "xudpConcurrency": "XUDP 并发数", + "xudpProxy443": "XUDP 代理 443", + "selectXudpProxy443": "选择 XUDP 代理 443", + "statistic": "启用统计", + "onlyTcp": "仅 TCP", + "brutal": { + "enable": "启用 Brutal", + "title": "Brutal 设置", + "upMbps": "上传速度 (Mbps)", + "downMbps": "下载速度 (Mbps)" + }, + "address": "地址", + "variables": { + "title": "使用这些变量使其动态化", + "server_ip": "当前服务器的 IP 地址", + "server_ipv6": "当前服务器的 IPv6 地址", + "username": "用户名", + "data_usage": "当前数据使用量", + "data_left": "剩余数据量", + "data_limit": "数据使用限制", + "days_left": "剩余天数", + "expire_date": "到期日期", + "jalali_expire_date": "阳历到期日期", + "time_left": "剩余时间", + "status_emoji": "用户状态表情符号 (✅,⌛️,🪫,❌,🔌)", + "protocol": "代理协议(如 VMess)", + "transport": "代理传输方式(如 ws)", + "admin_username": "管理员用户名" + }, + "httpVersions": { + "1.0": "HTTP/1.0", + "1.1": "HTTP/1.1", + "2.0": "HTTP/2.0", + "3.0": "HTTP/3.0" + }, + "httpMethods": { + "GET": "GET", + "POST": "POST", + "PUT": "PUT", + "DELETE": "DELETE", + "HEAD": "HEAD", + "OPTIONS": "OPTIONS", + "PATCH": "PATCH", + "TRACE": "TRACE", + "CONNECT": "CONNECT" + }, + "httpReasons": { + "100": "继续", + "101": "切换协议", + "200": "成功", + "201": "已创建", + "202": "已接受", + "203": "非授权信息", + "204": "无内容", + "205": "重置内容", + "206": "部分内容", + "300": "多种选择", + "301": "永久移动", + "302": "临时移动", + "303": "查看其他位置", + "304": "未修改", + "305": "使用代理", + "307": "临时重定向", + "308": "永久重定向", + "400": "错误请求", + "401": "未授权", + "402": "需要支付", + "403": "禁止", + "404": "未找到", + "405": "方法禁用", + "406": "不接受", + "407": "需要代理授权", + "408": "请求超时", + "409": "冲突", + "410": "已删除", + "411": "需要有效长度", + "412": "未满足前提条件", + "413": "请求实体过大", + "414": "请求的 URI 过长", + "415": "不支持的媒体类型", + "416": "请求范围不符合要求", + "417": "未满足期望值", + "418": "我是茶壶", + "421": "错误的请求", + "422": "不可处理的实体", + "423": "已锁定", + "424": "失败的依赖", + "425": "太早", + "426": "需要升级", + "428": "需要先决条件", + "429": "太多请求", + "431": "请求头字段太大", + "451": "因法律原因不可用", + "500": "服务器内部错误", + "501": "尚未实施", + "502": "错误网关", + "503": "服务不可用", + "504": "网关超时", + "505": "HTTP 版本不受支持" + }, + "selectReason": "选择原因" + }, + "enable": "启用", + "host": { + "xudp_proxy_443": "XUDP 代理 443", + "reject": "拒绝", + "allow": "允许", + "enableSuccess": "主机「{{name}}」已成功启用", + "enableFailed": "启用主机「{{name}}」失败", + "disableSuccess": "主机「{{name}}」已成功禁用", + "disableFailed": "禁用主机「{{name}}」失败", + "duplicateSuccess": "主机「{{name}}」已成功复制", + "duplicateFailed": "复制主机「{{name}}」失败", + "priorityUpdated": "主机已成功更新", + "priorityUpdateError": "更新主机失败" + }, + "pasargaurd": "PasarGuard", + "group": { + "createSuccess": "群组「{{name}}」已成功创建", + "createFailed": "创建群组「{{name}}」失败", + "editSuccess": "群组「{{name}}」已成功更新", + "editFailed": "更新群组「{{name}}」失败", + "deleteSuccess": "群组「{{name}}」已成功删除", + "deleteFailed": "删除群组「{{name}}」失败", + "deleteConfirm": "您确定要删除群组「{{name}}」吗?", + "enableSuccess": "群组「{{name}}」已成功启用", + "enableFailed": "启用群组「{{name}}」失败", + "disableSuccess": "群组「{{name}}」已成功禁用", + "disableFailed": "禁用群组「{{name}}」失败", + "deleteConfirmation": "移除群组" + }, + "name": "名称", + "nodeModal": { + "title": "添加节点", + "description": "添加新节点到您的网络", + "name": "节点名称", + "namePlaceholder": "输入节点名称", + "address": "节点地址", + "addressPlaceholder": "输入节点地址", + "port": "节点端口", + "portPlaceholder": "输入节点端口", + "usageRatio": "使用系数", + "usageRatioPlaceholder": "输入使用系数", + "maxLogs": "最大日志数", + "maxLogsPlaceholder": "输入最大日志数", + "connectionType": "连接类型", + "keepAlive": "保持连接", + "keepAliveDescription": "设置保持连接间隔", + "days": "天", + "minutes": "分钟", + "seconds": "秒", + "certificate": "证书", + "certificatePlaceholder": "输入证书", + "status": { + "connected": "已连接", + "error": "错误", + "connecting": "连接中...", + "disabled": "已禁用" + }, + "statusCheck": "检查状态", + "statusChecking": "检查中...", + "reconnect": "重新连接", + "reconnecting": "重新连接中...", + "sync": "同步", + "syncing": "同步中...", + "syncSuccess": "节点同步成功", + "syncFailed": "节点同步失败", + "gatherLogs": "收集日志", + "gatherLogsDescription": "启用从此节点收集日志以进行监控和调试", + "statusMessages": { + "checkUnavailableForNew": "新节点无法进行状态检查。请先创建节点,然后检查其状态。" + }, + "onlineStats": { + "button": "在线统计", + "title": "在线用户统计", + "ipListTitle": "{{username}} 的 IP 地址", + "nodeInfo": "节点:{{nodeName}}", + "searchPlaceholder": "输入用户名进行搜索...", + "enterUsername": "请输入用户名", + "refreshed": "数据刷新成功", + "refreshFailed": "数据刷新失败", + "backToStats": "返回统计", + "ipAddresses": "IP 地址", + "errorLoading": "加载用户统计时出错", + "userNotOnline": "用户未在线", + "searchUser": "搜索用户以查看其在线统计", + "autoRefresh": "每 5 秒自动刷新", + "connections": "连接", + "protocols": "协议", + "viewIPs": "查看 IP", + "userNotFound": "用户 '{{username}}' 未找到或不在线", + "errorLoadingIPs": "加载用户 IP 地址时出错" + }, + "hideDetails": "隐藏详情", + "showDetails": "显示详情", + "errorDetails": "错误详情", + "connectionError": "连接错误", + "retryConnection": "重试连接", + "configurationError": "配置错误", + "validateConfig": "验证配置", + "fillRequiredFields": "请在检查状态之前填写所有必填字段", + "apiKey": "API 密钥", + "apiKeyPlaceholder": "请输入节点的 API 密钥", + "generateUUID": "生成 UUID", + "coreConfig": "核心配置", + "hours": "小时", + "selectCoreConfig": "选择核心配置", + "noCoreConfig": "无核心配置" + }, + "theme": { + "title": "主题", + "description": "自定义您的应用主题", + "light": "明亮", + "dark": "深色", + "system": "系统", + "selectTheme": "选择主题", + "themeSaved": "主题保存成功", + "themeChanged": "主题更改成功", + "visitThemePage": "访问主题页面进行进一步自定义", + "radiusSaved": "边框圆角更新成功", + "mode": "模式", + "color": "颜色", + "radius": "边框圆角", + "zinc": "锌灰", + "rose": "玫瑰", + "blue": "蓝色", + "green": "绿色", + "violet": "紫色", + "orange": "橙色", + "yellow": "黄色", + "default": "默认", + "red": "红色", + "modeDescription": "选择界面的显示方式", + "colorDescription": "选择您喜欢的配色方案", + "radiusDescription": "调整界面元素的圆角程度", + "lightDescription": "明亮清新", + "darkDescription": "护眼模式", + "systemDescription": "跟随设备", + "preview": "实时预览", + "previewDescription": "实时查看您的主题设置效果", + "dashboardPreview": "仪表板预览", + "dashboardDescription": "监控系统性能和管理用户账户", + "currentTheme": "当前主题", + "sampleInput": "示例输入", + "primaryButton": "主要按钮", + "resetToDefaults": "重置为默认", + "resetDescription": "将所有主题设置恢复为默认值", + "resetting": "重置中...", + "reset": "重置", + "resetSuccess": "主题已重置为默认设置", + "resetFailed": "重置主题设置失败", + "radiusNone": "无", + "radiusSmall": "小", + "radiusMedium": "中", + "radiusLarge": "大" + }, + "coreConfigModal": { + "addConfig": "添加核心配置", + "createNewConfig": "创建新的核心配置", + "editCore": "编辑核心配置", + "invalidJson": "无效的 JSON 配置", + "createSuccess": "核心配置 \"{name}\" 已成功创建", + "createFailed": "核心配置 \"{name}\" 创建失败", + "editSuccess": "核心配置 \"{name}\" 已成功更新", + "editFailed": "核心配置 \"{name}\" 更新失败", + "keyPairGenerated": "密钥对生成成功", + "shortIdGenerated": "短 ID 已成功生成", + "shortId": "短 ID", + "shortIdCopied": "短 ID 已复制到剪贴板", + "publicKeyCopied": "公钥已复制到剪贴板", + "privateKeyCopied": "私钥已复制到剪贴板", + "jsonConfig": "JSON 配置", + "editJson": "编辑 JSON 配置", + "name": "名称", + "namePlaceholder": "输入配置名称", + "fallback": "备用项", + "selectFallback": "选择备用项", + "excludedInbound": "排除的入站", + "selectInbound": "选择入站", + "inbound": "入站", + "generateKeyPair": "生成密钥对", + "generateShortId": "生成短 ID", + "publicKey": "公钥", + "privateKey": "私钥", + "clearAllFallbacks": "清除所有回退", + "clearAllExcluded": "清除所有排除的入站", + "copyPublicKey": "复制公钥", + "copyPrivateKey": "复制私钥", + "copyShortId": "复制短 ID", + "restartNodes": "重启节点", + "generateShadowsocksPassword": "生成 Shadowsocks 密码", + "generatingShadowsocksPassword": "正在生成密码...", + "shadowsocksPassword": "Shadowsocks 密码", + "shadowsocksPasswordCopied": "密码已复制到剪贴板", + "copyShadowsocksPassword": "复制密码", + "selectEncryptionMethod": "选择加密方法", + "regeneratePassword": "重新生成密码" + }, + "settings.cores.title": "核心", + "settings.cores.description": "管理您的核心", + "settings.cores.addCore": "添加核心", + "settings.cores.noCores": "没有可用的核心。添加一个以开始。", + "settings.cores.duplicateSuccess": "核心配置 «{{name}}» 复制成功", + "settings.cores.duplicateFailed": "核心配置 «{{name}}» 复制失败", + "settings.cores.deleteSuccess": "核心删除成功", + "settings.cores.deleteFailed": "核心删除失败", + "settings.cores.delete": "删除核心配置", + "settings.cores.coreNotFound": "未找到核心", + "toggle": "切换状态", + "close": "关闭", + "copy": "复制", + "userDialog": { + "deleteSuccess": "用户「{{name}}」已成功删除。", + "resetUsageSuccess": "用户「{{name}}」的用量已重置。", + "revokeSubSuccess": "用户「{{name}}」的订阅已撤销。", + "activeNextPlanSuccess": "用户「{{name}}」的下一个套餐已激活。", + "activeNextPlanError": "无法为用户「{{name}}」激活下一个计划。", + "deleteConfirmTitle": "删除用户", + "deleteConfirm": "您确定要删除用户「{{name}}」吗?", + "nextPlanTitle": "下一个套餐", + "nextPlanTemplateId": "模板ID", + "nextPlanDataLimit": "流量限制 (GB)", + "nextPlanExpire": "到期(天)", + "nextPlanAddRemainingTraffic": "添加剩余流量", + "selectTemplate": "选择模板", + "selectTemplatePlaceholder": "选择模板", + "selectNode": "选择节点", + "allNodes": "所有节点", + "activeNextPlan": "激活下一个套餐", + "editError": "更新用户 «{{name}}» 失败", + "createError": "创建用户 «{{name}}» 失败", + "selectStatus": "选择状态", + "selectedTemplates": "已选择 {{count}} 个模板" + }, + "userSettings": { + "subscriptionUrlCopied": "订阅链接已复制到剪贴板" + }, + "sidebar.expand": "展开侧边栏", + "sidebar.collapse": "折叠侧边栏", + "usersTable.deleteUserTitle": "删除用户", + "usersTable.deleteUserPrompt": "您确定要删除用户「{{name}}」吗?此操作无法撤销。", + "usersTable.deleteSuccess": "用户「{{name}}」已成功删除。", + "usersTable.deleteFailed": "无法删除用户「{{name}}」。{{error}}", + "usersTable.delete": "删除", + "usersTable.cancel": "取消", + "statistics.trafficUsage": "流量使用", + "statistics.trafficUsageDescription": "所有服务器的总流量使用情况", + "statistics.usageDuringPeriod": "期间使用量", + "statistics.users": "用户", + "statistics.onlineUsers": "在线用户", + "statistics.limitedUsers": "受限用户", + "statistics.activeUsers": "活跃用户", + "statistics.disabledUsers": "已禁用用户", + "statistics.expiredUsers": "已过期用户", + "statistics.onHoldUsers": "暂停用户", + "statistics.allUsers": "全部用户", + "statistics.serverTraffic": "服务器流量", + "statistics.nodeTrafficDistribution": "节点流量分布", + "statistics.noNodesAvailable": "没有可用节点", + "statistics.noDataAvailable": "无数据", + "statistics.noDataDescription": "选择时间范围以查看流量使用统计和趋势。", + "statistics.noNodesDescription": "当前没有连接的节点来显示流量分布。", + "statistics.loadingDescription": "正在获取最新统计数据...", + "statistics.waitingForData": "等待数据", + "statistics.waitingForDataDescription": "实时统计数据将在数据流开始后显示在这里。", + "statistics.noDataInRange": "所选范围内无数据", + "statistics.noDataInRangeDescription": "在所选时间段内未找到流量数据。请尝试选择不同的日期范围。", + "statistics.selectNodeToView": "选择一个节点以查看详细统计信息", + "statistics.userStatisticsDescription": "用户账户状态和活动概览", + "errors.connectionFailed": "连接失败。请检查您的网络并重试。", + "errors.statisticsLoadFailed": "加载统计数据失败", + "usersTable.resetUsageTitle": "重置用户使用情况", + "usersTable.resetUsagePrompt": "你确定要重置 «{{name}}» 的使用情况吗?", + "usersTable.resetUsageSubmit": "重置使用情况", + "usersTable.resetUsageSuccess": "用户「{{name}}」的使用情况已成功重置", + "usersTable.resetUsageFailed": "重置用户「{{name}}」的使用情况失败", + "time": { + "expires": "到期", + "expired": "已过期", + "year": "年", + "years": "年", + "month": "月", + "months": "月", + "day": "天", + "days": "天", + "hour": "小时", + "hours": "小时", + "min": "分钟", + "mins": "分钟", + "second": "秒", + "seconds": "秒", + "ago": "前", + "notConnectedYet": "尚未连接" + }, + "node.xrayVersion": "核心版本", + "node.coreVersion": "节点版本", + "calendar": { + "selectRange": "选择时间范围", + "startDate": "开始日期", + "endDate": "结束日期" + }, + "usersTable": { + "usageChart": "用量图表", + "noUsageData": "此期间没有可用数据。", + "tryDifferentRange": "请尝试其他时间范围。", + "trendingUp": "上升", + "trendingDown": "下降", + "usageSummary": "显示所选期间的总用量。", + "activeNextPlanTitle": "激活用户的下一个计划", + "activeNextPlanPrompt": "您确定要为「{{name}}」激活下一个计划吗?", + "activeNextPlanSubmit": "激活下一个计划" + }, + "setOwnerModal": { + "title": "设置所有者", + "currentOwner": "当前所有者:", + "none": "无", + "selectAdmin": "选择新所有者", + "confirm": "设置所有者", + "success": "用户 {{username}} 的所有者已成功更改为 {{admin}}。", + "error": "无法将用户 {{username}} 的所有者更改为 {{admin}}。", + "loadError": "加载管理员列表失败。" + }, + "online": "在线", + "loading": "加载中...", + "noResults": "未找到结果", + "emptyState": { + "noUsers": { + "title": "暂无用户", + "description": "开始创建您的第一个用户账户", + "createFirstUser": "创建第一个用户" + } + }, + "bulk": { + "title": "批量操作", + "groups": "用户组", + "proxySettings": "代理设置", + "proxySettingsDesc": "配置要应用的代理设置", + "applyToProxyDesc": "选择要应用代理设置的分组、用户或管理员", + "flowMethod": "流: {{flow}} | 方法: {{method}}", + "expireDate": "到期日期", + "dataLimit": "数据限制", + "groupsDesc": "同时管理多个用户和管理员的用户组分配。批量添加或删除用户组。", + "expireDateDesc": "同时为多个用户和管理员设置到期日期。", + "dataLimitDesc": "同时为多个用户和管理员配置数据限制。", + "selectFlow": "选择 Flow", + "selectMethod": "选择 Method", + "applyChanges": "应用更改", + "applyDescription": "将选定的用户组分配和设置应用到选定的用户和管理员。", + "addGroupsToUsers": "向用户添加用户组", + "removeGroupsFromUsers": "从用户中删除用户组", + "confirmAddGroupsTitle": "确认添加用户组", + "confirmAddGroupsDescription": "您确定要向 {{totalTargets}} 个目标添加 {{totalGroups}} 个用户组吗?此操作将为所有选定的用户和管理员分配选定的用户组。", + "confirmRemoveGroupsTitle": "确认删除用户组", + "confirmRemoveGroupsDescription": "您确定要从 {{totalTargets}} 个目标中删除 {{totalGroups}} 个用户组吗?此操作将从所有选定的用户和管理员中删除选定的用户组。", + "applySettings": "应用设置", + "settingsConfigured": "设置已配置", + "noSettings": "无设置", + "searchGroups": "搜索用户组...", + "searchHasGroups": "搜索现有用户组...", + "searchUsers": "搜索用户...", + "searchAdmins": "搜索管理员...", + "selectGroups": "选择用户组", + "selectHasGroups": "选择现有用户组", + "selectUsers": "选择用户", + "selectAdmins": "选择管理员", + "expireDateLabel": "到期日期", + "expireDateRequired": "请选择到期日期。", + "selectExpireDate": "选择到期日期", + "applyExpireDate": "应用到期日期", + "applyExpireDescription": "将选定的到期日期应用到选定的用户组、用户和管理员。", + "confirmApplyExpireTitle": "确认应用到期日期", + "confirmApplyExpireDescription": "您确定要将到期日期设置为 {{expireDate}} 用于 {{totalTargets}} 个目标吗?此操作将修改所有选定用户和管理员的到期日期。", + "insertExpireDatePlaceholder": "输入到期日期", + "dataLimitLabel": "数据限制(GB)", + "dataLimitPlaceholder": "输入数据限制(GB)", + "dataLimitRequired": "请输入有效的数据限制。", + "applyDataLimit": "应用数据限制", + "applyDataLimitDescription": "将选定的数据限制应用到选定的用户组、用户和管理员。", + "confirmApplyDataLimitTitle": "确认应用数据限制", + "confirmApplyDataLimitDescription": "您确定要将数据限制 {{dataLimit}} GB 应用到 {{totalTargets}} 个目标吗?此操作将更新所有选定用户组、用户和管理员的数据限制。", + "insertDataLimitPlaceholder": "输入数据限制", + "flowLabel": "Flow", + "methodLabel": "Method", + "selectFlowPlaceholder": "选择 flow", + "selectMethodPlaceholder": "选择 method", + "proxySettingsRequired": "请至少选择一个代理设置(Flow 或 Method)。", + "applyProxySettings": "应用代理设置", + "applyProxyDescription": "将选定的代理设置应用到选定的用户组、用户和管理员。", + "confirmApplyProxyTitle": "确认应用代理设置", + "confirmApplyProxyDescription": "您确定要将代理设置应用到 {{totalTargets}} 个目标吗?此操作将更新所有选定用户组、用户和管理员的代理设置。", + "noTargetsSelected": "请至少选择一个目标。", + "groupsDescShort": "选择要应用的分组", + "groupsCount": "{{count}} 分组", + "targetsCount": "{{count}} 目标", + "applyTo": "应用到", + "applyToDesc": "选择要应用设置的用户或管理员", + "applyToExpireDesc": "选择要应用到期日期的分组、用户或管理员", + "noDateSelected": "未选择日期", + "operationType": "操作类型", + "groupsOperationDesc": "选择是否要向用户添加或删除用户组。", + "addGroups": "添加用户组", + "removeGroups": "删除用户组", + "addExpiry": "添加到到期时间", + "subtractExpiry": "从到期时间减去", + "addDataLimit": "增加数据限额", + "subtractDataLimit": "减少数据限额", + "applyToDataLimitDesc": "选择要应用数据限额的分组、用户或管理员", + "noLimitSet": "未设置限额", + "confirmApplyExpireDescriptionAll": "您确定要将到期日期 {{expireDate}} 应用于所有用户、管理员和群组吗?这将更新所有人的到期日期。", + "confirmApplyDataLimitDescriptionAll": "您确定要将数据限额 {{dataLimit}} GB 应用于所有用户、管理员和群组吗?这将更新所有人的数据限额。", + "confirmApplyProxyDescriptionAll": "您确定要将代理设置应用于所有用户、管理员和群组吗?这将更新所有人的代理设置。", + "confirmApplyGroupsDescriptionAll": "您确定要将分组更改应用于所有用户、管理员和群组吗?这将更新所有人的分组。", + "confirmApplyGroupsDescription": "您确定要将分组更改应用于 {{totalTargets}} 个目标吗?这将更新所有选定用户和管理员的分组。", + "expire.placeholder": "输入到期日期" + }, + "operationSuccess": "操作成功!", + "operationFailed": "操作失败!", + "settingsApplied": "设置应用成功!", + "applying": "应用中...", + "inboundTags": "入站标签", + "searchInbounds": "搜索入站...", + "noInboundsFound": "未找到入站", + "selectedCount": "已选择 {{count}} 项", + "statistics.date": "日期", + "statistics.totalUsage": "总用量", + "statistics.uplink": "上行", + "statistics.downlink": "下行", + "timeSelector.pickDate": "选择日期", + "advanceSearch": { + "title": "高级搜索", + "byUsername": "用户名和备注", + "byProtocol": "协议数据", + "byStatus": "状态", + "byAdmin": "管理员", + "byGroup": "分组", + "selectGroup": "选择分组 ...", + "selectAdmin": "选择管理员 ...", + "selectStatus": "选择状态 ..." + }, + "clearAllFilters": "清除所有筛选器", + "activeFilters": "活跃" +} \ No newline at end of file diff --git a/dashboard/react-router.config.ts b/dashboard/react-router.config.ts new file mode 100644 index 000000000..ed199936a --- /dev/null +++ b/dashboard/react-router.config.ts @@ -0,0 +1,10 @@ +import type { Config } from '@react-router/dev/config' + +export default { + ssr: false, + appDirectory: './src', + basename: process.env.BASE_URL, + future: { + unstable_optimizeDeps: true, + }, +} satisfies Config diff --git a/dashboard/src/App.tsx b/dashboard/src/App.tsx new file mode 100644 index 000000000..6ba4e402a --- /dev/null +++ b/dashboard/src/App.tsx @@ -0,0 +1,20 @@ +import { ThemeProvider } from '@/components/theme-provider' +import { router } from '@/router' +import { QueryClientProvider } from '@tanstack/react-query' +import { RouterProvider } from 'react-router' +import { Toaster } from './components/ui/sonner' +import './lib/dayjs' +import { queryClient } from './utils/query-client' + +export default function App() { + return ( + + +

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 literal 0 HcmV?d00001 diff --git a/dashboard/bun.lock b/dashboard/bun.lock new file mode 100644 index 000000000..4c4c096b8 --- /dev/null +++ b/dashboard/bun.lock @@ -0,0 +1,2319 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "name": "pasargaurd-ui", + "dependencies": { + "@dnd-kit/core": "^6.3.1", + "@dnd-kit/sortable": "^10.0.0", + "@dnd-kit/utilities": "^3.2.2", + "@hookform/resolvers": "^3.10.0", + "@monaco-editor/react": "^4.6.0", + "@radix-ui/react-accordion": "^1.2.3", + "@radix-ui/react-alert-dialog": "^1.1.4", + "@radix-ui/react-avatar": "^1.1.2", + "@radix-ui/react-checkbox": "^1.1.4", + "@radix-ui/react-collapsible": "^1.1.2", + "@radix-ui/react-dialog": "^1.1.4", + "@radix-ui/react-dropdown-menu": "^2.1.4", + "@radix-ui/react-hover-card": "^1.1.6", + "@radix-ui/react-label": "^2.1.1", + "@radix-ui/react-popover": "^1.1.6", + "@radix-ui/react-progress": "^1.1.1", + "@radix-ui/react-radio-group": "^1.3.6", + "@radix-ui/react-scroll-area": "^1.2.2", + "@radix-ui/react-select": "^2.1.4", + "@radix-ui/react-separator": "^1.1.1", + "@radix-ui/react-slot": "^1.1.1", + "@radix-ui/react-switch": "^1.1.2", + "@radix-ui/react-tabs": "^1.1.3", + "@radix-ui/react-toast": "^1.2.4", + "@radix-ui/react-toggle": "^1.1.2", + "@radix-ui/react-toggle-group": "^1.1.2", + "@radix-ui/react-tooltip": "^1.1.6", + "@stablelib/base64": "^2.0.1", + "@stablelib/x25519": "^2.0.1", + "@tanstack/react-query": "^5.64.0", + "@tanstack/react-table": "^8.20.6", + "@telegram-apps/sdk": "^3.11.4", + "@vitejs/plugin-react": "^4.3.4", + "axios": "^1.8.4", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "cmdk": "^1.1.1", + "cross-env": "^7.0.3", + "date-fns": "^4.1.0", + "date-fns-jalali": "4.1.0-0", + "dayjs": "^1.11.13", + "embla-carousel-react": "^8.5.2", + "es-toolkit": "^1.31.0", + "eventsource": "^3.0.7", + "fancy-ansi": "^0.1.3", + "i18next": "^24.2.1", + "i18next-browser-languagedetector": "^8.0.2", + "i18next-http-backend": "^3.0.1", + "isbot": "^5.1.21", + "lodash.debounce": "^4.0.8", + "lucide-react": "^0.465.0", + "next-themes": "^0.4.6", + "ofetch": "^1.4.1", + "qrcode.react": "^3.2.0", + "react": "^18.3.1", + "react-day-picker": "9.7.0", + "react-dom": "^18.3.1", + "react-github-btn": "^1.4.0", + "react-hook-form": "^7.54.2", + "react-i18next": "^15.4.0", + "react-router": "^7.1.1", + "react-top-loading-bar": "^3.0.2", + "react-use-websocket": "^4.13.0", + "recharts": "^2.15.1", + "sonner": "^2.0.3", + "tailwind-merge": "^2.6.0", + "tailwindcss-animate": "^1.0.7", + "ufo": "^1.5.4", + "uuid": "^11.1.0", + "vaul": "^1.1.2", + "vite-tsconfig-paths": "^5.1.4", + "zod": "^3.24.1", + "zustand": "^5.0.3", + }, + "devDependencies": { + "@react-router/dev": "^7.1.1", + "@react-router/fs-routes": "^7.1.1", + "@svgr/webpack": "^8.1.0", + "@types/lodash.debounce": "^4.0.9", + "@types/node": "^20.17.28", + "@types/react": "^18.3.18", + "@types/react-dom": "^18.3.5", + "ajv": "^8.17.1", + "autoprefixer": "^10.4.20", + "eslint": "^9.18.0", + "eslint-plugin-react-hooks": "^5.1.0", + "eslint-plugin-react-refresh": "^0.4.18", + "orval": "7.4.1", + "postcss": "^8.4.49", + "prettier": "^3.6.2", + "prettier-plugin-tailwindcss": "^0.6.13", + "tailwindcss": "^3.4.17", + "typescript": "~5.6.3", + "typescript-eslint": "^8.19.1", + "vite": "^6.2.4", + "vite-plugin-pwa": "^1.0.1", + "vite-plugin-svgr": "^4.3.0", + "wait-port": "^1.1.0", + }, + }, + }, + "packages": { + "@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="], + + "@ampproject/remapping": ["@ampproject/remapping@2.3.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw=="], + + "@apideck/better-ajv-errors": ["@apideck/better-ajv-errors@0.3.6", "", { "dependencies": { "json-schema": "^0.4.0", "jsonpointer": "^5.0.0", "leven": "^3.1.0" }, "peerDependencies": { "ajv": ">=8" } }, "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA=="], + + "@apidevtools/json-schema-ref-parser": ["@apidevtools/json-schema-ref-parser@11.7.2", "", { "dependencies": { "@jsdevtools/ono": "^7.1.3", "@types/json-schema": "^7.0.15", "js-yaml": "^4.1.0" } }, "sha512-4gY54eEGEstClvEkGnwVkTkrx0sqwemEFG5OSRRn3tD91XH0+Q8XIkYIfo7IwEWPpJZwILb9GUXeShtplRc/eA=="], + + "@apidevtools/openapi-schemas": ["@apidevtools/openapi-schemas@2.1.0", "", {}, "sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ=="], + + "@apidevtools/swagger-methods": ["@apidevtools/swagger-methods@3.0.2", "", {}, "sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg=="], + + "@apidevtools/swagger-parser": ["@apidevtools/swagger-parser@10.1.1", "", { "dependencies": { "@apidevtools/json-schema-ref-parser": "11.7.2", "@apidevtools/openapi-schemas": "^2.1.0", "@apidevtools/swagger-methods": "^3.0.2", "@jsdevtools/ono": "^7.1.3", "ajv": "^8.17.1", "ajv-draft-04": "^1.0.0", "call-me-maybe": "^1.0.2" }, "peerDependencies": { "openapi-types": ">=7" } }, "sha512-u/kozRnsPO/x8QtKYJOqoGtC4kH6yg1lfYkB9Au0WhYB0FNLpyFusttQtvhlwjtG3rOwiRz4D8DnnXa8iEpIKA=="], + + "@asyncapi/specs": ["@asyncapi/specs@6.8.1", "", { "dependencies": { "@types/json-schema": "^7.0.11" } }, "sha512-czHoAk3PeXTLR+X8IUaD+IpT+g+zUvkcgMDJVothBsan+oHN3jfcFcFUNdOPAAFoUCQN1hXF1dWuphWy05THlA=="], + + "@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], + + "@babel/compat-data": ["@babel/compat-data@7.28.0", "", {}, "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw=="], + + "@babel/core": ["@babel/core@7.28.0", "", { "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.0", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.27.3", "@babel/helpers": "^7.27.6", "@babel/parser": "^7.28.0", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.0", "@babel/types": "^7.28.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ=="], + + "@babel/generator": ["@babel/generator@7.28.0", "", { "dependencies": { "@babel/parser": "^7.28.0", "@babel/types": "^7.28.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg=="], + + "@babel/helper-annotate-as-pure": ["@babel/helper-annotate-as-pure@7.27.3", "", { "dependencies": { "@babel/types": "^7.27.3" } }, "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg=="], + + "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.27.2", "", { "dependencies": { "@babel/compat-data": "^7.27.2", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ=="], + + "@babel/helper-create-class-features-plugin": ["@babel/helper-create-class-features-plugin@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-member-expression-to-functions": "^7.27.1", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/traverse": "^7.27.1", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A=="], + + "@babel/helper-create-regexp-features-plugin": ["@babel/helper-create-regexp-features-plugin@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "regexpu-core": "^6.2.0", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ=="], + + "@babel/helper-define-polyfill-provider": ["@babel/helper-define-polyfill-provider@0.6.5", "", { "dependencies": { "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", "debug": "^4.4.1", "lodash.debounce": "^4.0.8", "resolve": "^1.22.10" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg=="], + + "@babel/helper-globals": ["@babel/helper-globals@7.28.0", "", {}, "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="], + + "@babel/helper-member-expression-to-functions": ["@babel/helper-member-expression-to-functions@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA=="], + + "@babel/helper-module-imports": ["@babel/helper-module-imports@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w=="], + + "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.27.3", "", { "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1", "@babel/traverse": "^7.27.3" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg=="], + + "@babel/helper-optimise-call-expression": ["@babel/helper-optimise-call-expression@7.27.1", "", { "dependencies": { "@babel/types": "^7.27.1" } }, "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw=="], + + "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.27.1", "", {}, "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw=="], + + "@babel/helper-remap-async-to-generator": ["@babel/helper-remap-async-to-generator@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-wrap-function": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA=="], + + "@babel/helper-replace-supers": ["@babel/helper-replace-supers@7.27.1", "", { "dependencies": { "@babel/helper-member-expression-to-functions": "^7.27.1", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA=="], + + "@babel/helper-skip-transparent-expression-wrappers": ["@babel/helper-skip-transparent-expression-wrappers@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg=="], + + "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], + + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.27.1", "", {}, "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow=="], + + "@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="], + + "@babel/helper-wrap-function": ["@babel/helper-wrap-function@7.27.1", "", { "dependencies": { "@babel/template": "^7.27.1", "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ=="], + + "@babel/helpers": ["@babel/helpers@7.27.6", "", { "dependencies": { "@babel/template": "^7.27.2", "@babel/types": "^7.27.6" } }, "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug=="], + + "@babel/parser": ["@babel/parser@7.28.0", "", { "dependencies": { "@babel/types": "^7.28.0" }, "bin": "./bin/babel-parser.js" }, "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g=="], + + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": ["@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA=="], + + "@babel/plugin-bugfix-safari-class-field-initializer-scope": ["@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA=="], + + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": ["@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA=="], + + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": ["@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/plugin-transform-optional-chaining": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.13.0" } }, "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw=="], + + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": ["@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw=="], + + "@babel/plugin-proposal-private-property-in-object": ["@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2", "", { "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w=="], + + "@babel/plugin-syntax-decorators": ["@babel/plugin-syntax-decorators@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A=="], + + "@babel/plugin-syntax-import-assertions": ["@babel/plugin-syntax-import-assertions@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg=="], + + "@babel/plugin-syntax-import-attributes": ["@babel/plugin-syntax-import-attributes@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww=="], + + "@babel/plugin-syntax-jsx": ["@babel/plugin-syntax-jsx@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w=="], + + "@babel/plugin-syntax-typescript": ["@babel/plugin-syntax-typescript@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ=="], + + "@babel/plugin-syntax-unicode-sets-regex": ["@babel/plugin-syntax-unicode-sets-regex@7.18.6", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg=="], + + "@babel/plugin-transform-arrow-functions": ["@babel/plugin-transform-arrow-functions@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA=="], + + "@babel/plugin-transform-async-generator-functions": ["@babel/plugin-transform-async-generator-functions@7.28.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-remap-async-to-generator": "^7.27.1", "@babel/traverse": "^7.28.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q=="], + + "@babel/plugin-transform-async-to-generator": ["@babel/plugin-transform-async-to-generator@7.27.1", "", { "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-remap-async-to-generator": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA=="], + + "@babel/plugin-transform-block-scoped-functions": ["@babel/plugin-transform-block-scoped-functions@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg=="], + + "@babel/plugin-transform-block-scoping": ["@babel/plugin-transform-block-scoping@7.28.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q=="], + + "@babel/plugin-transform-class-properties": ["@babel/plugin-transform-class-properties@7.27.1", "", { "dependencies": { "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA=="], + + "@babel/plugin-transform-class-static-block": ["@babel/plugin-transform-class-static-block@7.27.1", "", { "dependencies": { "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.12.0" } }, "sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA=="], + + "@babel/plugin-transform-classes": ["@babel/plugin-transform-classes@7.28.0", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-globals": "^7.28.0", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1", "@babel/traverse": "^7.28.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-IjM1IoJNw72AZFlj33Cu8X0q2XK/6AaVC3jQu+cgQ5lThWD5ajnuUAml80dqRmOhmPkTH8uAwnpMu9Rvj0LTRA=="], + + "@babel/plugin-transform-computed-properties": ["@babel/plugin-transform-computed-properties@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/template": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw=="], + + "@babel/plugin-transform-destructuring": ["@babel/plugin-transform-destructuring@7.28.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/traverse": "^7.28.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A=="], + + "@babel/plugin-transform-dotall-regex": ["@babel/plugin-transform-dotall-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw=="], + + "@babel/plugin-transform-duplicate-keys": ["@babel/plugin-transform-duplicate-keys@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q=="], + + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": ["@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ=="], + + "@babel/plugin-transform-dynamic-import": ["@babel/plugin-transform-dynamic-import@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A=="], + + "@babel/plugin-transform-explicit-resource-management": ["@babel/plugin-transform-explicit-resource-management@7.28.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-transform-destructuring": "^7.28.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ=="], + + "@babel/plugin-transform-exponentiation-operator": ["@babel/plugin-transform-exponentiation-operator@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ=="], + + "@babel/plugin-transform-export-namespace-from": ["@babel/plugin-transform-export-namespace-from@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ=="], + + "@babel/plugin-transform-for-of": ["@babel/plugin-transform-for-of@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw=="], + + "@babel/plugin-transform-function-name": ["@babel/plugin-transform-function-name@7.27.1", "", { "dependencies": { "@babel/helper-compilation-targets": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ=="], + + "@babel/plugin-transform-json-strings": ["@babel/plugin-transform-json-strings@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q=="], + + "@babel/plugin-transform-literals": ["@babel/plugin-transform-literals@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA=="], + + "@babel/plugin-transform-logical-assignment-operators": ["@babel/plugin-transform-logical-assignment-operators@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw=="], + + "@babel/plugin-transform-member-expression-literals": ["@babel/plugin-transform-member-expression-literals@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ=="], + + "@babel/plugin-transform-modules-amd": ["@babel/plugin-transform-modules-amd@7.27.1", "", { "dependencies": { "@babel/helper-module-transforms": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA=="], + + "@babel/plugin-transform-modules-commonjs": ["@babel/plugin-transform-modules-commonjs@7.27.1", "", { "dependencies": { "@babel/helper-module-transforms": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw=="], + + "@babel/plugin-transform-modules-systemjs": ["@babel/plugin-transform-modules-systemjs@7.27.1", "", { "dependencies": { "@babel/helper-module-transforms": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA=="], + + "@babel/plugin-transform-modules-umd": ["@babel/plugin-transform-modules-umd@7.27.1", "", { "dependencies": { "@babel/helper-module-transforms": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w=="], + + "@babel/plugin-transform-named-capturing-groups-regex": ["@babel/plugin-transform-named-capturing-groups-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng=="], + + "@babel/plugin-transform-new-target": ["@babel/plugin-transform-new-target@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ=="], + + "@babel/plugin-transform-nullish-coalescing-operator": ["@babel/plugin-transform-nullish-coalescing-operator@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA=="], + + "@babel/plugin-transform-numeric-separator": ["@babel/plugin-transform-numeric-separator@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw=="], + + "@babel/plugin-transform-object-rest-spread": ["@babel/plugin-transform-object-rest-spread@7.28.0", "", { "dependencies": { "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-transform-destructuring": "^7.28.0", "@babel/plugin-transform-parameters": "^7.27.7", "@babel/traverse": "^7.28.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA=="], + + "@babel/plugin-transform-object-super": ["@babel/plugin-transform-object-super@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng=="], + + "@babel/plugin-transform-optional-catch-binding": ["@babel/plugin-transform-optional-catch-binding@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q=="], + + "@babel/plugin-transform-optional-chaining": ["@babel/plugin-transform-optional-chaining@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg=="], + + "@babel/plugin-transform-parameters": ["@babel/plugin-transform-parameters@7.27.7", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg=="], + + "@babel/plugin-transform-private-methods": ["@babel/plugin-transform-private-methods@7.27.1", "", { "dependencies": { "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA=="], + + "@babel/plugin-transform-private-property-in-object": ["@babel/plugin-transform-private-property-in-object@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ=="], + + "@babel/plugin-transform-property-literals": ["@babel/plugin-transform-property-literals@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ=="], + + "@babel/plugin-transform-react-constant-elements": ["@babel/plugin-transform-react-constant-elements@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug=="], + + "@babel/plugin-transform-react-display-name": ["@babel/plugin-transform-react-display-name@7.28.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA=="], + + "@babel/plugin-transform-react-jsx": ["@babel/plugin-transform-react-jsx@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-module-imports": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/types": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw=="], + + "@babel/plugin-transform-react-jsx-development": ["@babel/plugin-transform-react-jsx-development@7.27.1", "", { "dependencies": { "@babel/plugin-transform-react-jsx": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q=="], + + "@babel/plugin-transform-react-jsx-self": ["@babel/plugin-transform-react-jsx-self@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw=="], + + "@babel/plugin-transform-react-jsx-source": ["@babel/plugin-transform-react-jsx-source@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw=="], + + "@babel/plugin-transform-react-pure-annotations": ["@babel/plugin-transform-react-pure-annotations@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA=="], + + "@babel/plugin-transform-regenerator": ["@babel/plugin-transform-regenerator@7.28.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-P0QiV/taaa3kXpLY+sXla5zec4E+4t4Aqc9ggHlfZ7a2cp8/x/Gv08jfwEtn9gnnYIMvHx6aoOZ8XJL8eU71Dg=="], + + "@babel/plugin-transform-regexp-modifiers": ["@babel/plugin-transform-regexp-modifiers@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA=="], + + "@babel/plugin-transform-reserved-words": ["@babel/plugin-transform-reserved-words@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw=="], + + "@babel/plugin-transform-shorthand-properties": ["@babel/plugin-transform-shorthand-properties@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ=="], + + "@babel/plugin-transform-spread": ["@babel/plugin-transform-spread@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q=="], + + "@babel/plugin-transform-sticky-regex": ["@babel/plugin-transform-sticky-regex@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g=="], + + "@babel/plugin-transform-template-literals": ["@babel/plugin-transform-template-literals@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg=="], + + "@babel/plugin-transform-typeof-symbol": ["@babel/plugin-transform-typeof-symbol@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw=="], + + "@babel/plugin-transform-typescript": ["@babel/plugin-transform-typescript@7.28.0", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-create-class-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg=="], + + "@babel/plugin-transform-unicode-escapes": ["@babel/plugin-transform-unicode-escapes@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg=="], + + "@babel/plugin-transform-unicode-property-regex": ["@babel/plugin-transform-unicode-property-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q=="], + + "@babel/plugin-transform-unicode-regex": ["@babel/plugin-transform-unicode-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw=="], + + "@babel/plugin-transform-unicode-sets-regex": ["@babel/plugin-transform-unicode-sets-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw=="], + + "@babel/preset-env": ["@babel/preset-env@7.28.0", "", { "dependencies": { "@babel/compat-data": "^7.28.0", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1", "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.27.1", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-import-assertions": "^7.27.1", "@babel/plugin-syntax-import-attributes": "^7.27.1", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.27.1", "@babel/plugin-transform-async-generator-functions": "^7.28.0", "@babel/plugin-transform-async-to-generator": "^7.27.1", "@babel/plugin-transform-block-scoped-functions": "^7.27.1", "@babel/plugin-transform-block-scoping": "^7.28.0", "@babel/plugin-transform-class-properties": "^7.27.1", "@babel/plugin-transform-class-static-block": "^7.27.1", "@babel/plugin-transform-classes": "^7.28.0", "@babel/plugin-transform-computed-properties": "^7.27.1", "@babel/plugin-transform-destructuring": "^7.28.0", "@babel/plugin-transform-dotall-regex": "^7.27.1", "@babel/plugin-transform-duplicate-keys": "^7.27.1", "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", "@babel/plugin-transform-dynamic-import": "^7.27.1", "@babel/plugin-transform-explicit-resource-management": "^7.28.0", "@babel/plugin-transform-exponentiation-operator": "^7.27.1", "@babel/plugin-transform-export-namespace-from": "^7.27.1", "@babel/plugin-transform-for-of": "^7.27.1", "@babel/plugin-transform-function-name": "^7.27.1", "@babel/plugin-transform-json-strings": "^7.27.1", "@babel/plugin-transform-literals": "^7.27.1", "@babel/plugin-transform-logical-assignment-operators": "^7.27.1", "@babel/plugin-transform-member-expression-literals": "^7.27.1", "@babel/plugin-transform-modules-amd": "^7.27.1", "@babel/plugin-transform-modules-commonjs": "^7.27.1", "@babel/plugin-transform-modules-systemjs": "^7.27.1", "@babel/plugin-transform-modules-umd": "^7.27.1", "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", "@babel/plugin-transform-new-target": "^7.27.1", "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", "@babel/plugin-transform-numeric-separator": "^7.27.1", "@babel/plugin-transform-object-rest-spread": "^7.28.0", "@babel/plugin-transform-object-super": "^7.27.1", "@babel/plugin-transform-optional-catch-binding": "^7.27.1", "@babel/plugin-transform-optional-chaining": "^7.27.1", "@babel/plugin-transform-parameters": "^7.27.7", "@babel/plugin-transform-private-methods": "^7.27.1", "@babel/plugin-transform-private-property-in-object": "^7.27.1", "@babel/plugin-transform-property-literals": "^7.27.1", "@babel/plugin-transform-regenerator": "^7.28.0", "@babel/plugin-transform-regexp-modifiers": "^7.27.1", "@babel/plugin-transform-reserved-words": "^7.27.1", "@babel/plugin-transform-shorthand-properties": "^7.27.1", "@babel/plugin-transform-spread": "^7.27.1", "@babel/plugin-transform-sticky-regex": "^7.27.1", "@babel/plugin-transform-template-literals": "^7.27.1", "@babel/plugin-transform-typeof-symbol": "^7.27.1", "@babel/plugin-transform-unicode-escapes": "^7.27.1", "@babel/plugin-transform-unicode-property-regex": "^7.27.1", "@babel/plugin-transform-unicode-regex": "^7.27.1", "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.14", "babel-plugin-polyfill-corejs3": "^0.13.0", "babel-plugin-polyfill-regenerator": "^0.6.5", "core-js-compat": "^3.43.0", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-VmaxeGOwuDqzLl5JUkIRM1X2Qu2uKGxHEQWh+cvvbl7JuJRgKGJSfsEF/bUaxFhJl/XAyxBe7q7qSuTbKFuCyg=="], + + "@babel/preset-modules": ["@babel/preset-modules@0.1.6-no-external-plugins", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/types": "^7.4.4", "esutils": "^2.0.2" }, "peerDependencies": { "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA=="], + + "@babel/preset-react": ["@babel/preset-react@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", "@babel/plugin-transform-react-display-name": "^7.27.1", "@babel/plugin-transform-react-jsx": "^7.27.1", "@babel/plugin-transform-react-jsx-development": "^7.27.1", "@babel/plugin-transform-react-pure-annotations": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA=="], + + "@babel/preset-typescript": ["@babel/preset-typescript@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/plugin-transform-modules-commonjs": "^7.27.1", "@babel/plugin-transform-typescript": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ=="], + + "@babel/runtime": ["@babel/runtime@7.27.6", "", {}, "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q=="], + + "@babel/template": ["@babel/template@7.27.2", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/parser": "^7.27.2", "@babel/types": "^7.27.1" } }, "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw=="], + + "@babel/traverse": ["@babel/traverse@7.28.0", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.0", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.28.0", "@babel/template": "^7.27.2", "@babel/types": "^7.28.0", "debug": "^4.3.1" } }, "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg=="], + + "@babel/types": ["@babel/types@7.28.1", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ=="], + + "@date-fns/tz": ["@date-fns/tz@1.2.0", "", {}, "sha512-LBrd7MiJZ9McsOgxqWX7AaxrDjcFVjWH/tIKJd7pnR7McaslGYOP1QmmiBXdJH/H/yLCT+rcQ7FaPBUxRGUtrg=="], + + "@dnd-kit/accessibility": ["@dnd-kit/accessibility@3.1.1", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "react": ">=16.8.0" } }, "sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw=="], + + "@dnd-kit/core": ["@dnd-kit/core@6.3.1", "", { "dependencies": { "@dnd-kit/accessibility": "^3.1.1", "@dnd-kit/utilities": "^3.2.2", "tslib": "^2.0.0" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ=="], + + "@dnd-kit/sortable": ["@dnd-kit/sortable@10.0.0", "", { "dependencies": { "@dnd-kit/utilities": "^3.2.2", "tslib": "^2.0.0" }, "peerDependencies": { "@dnd-kit/core": "^6.3.0", "react": ">=16.8.0" } }, "sha512-+xqhmIIzvAYMGfBYYnbKuNicfSsk4RksY2XdmJhT+HAC01nix6fHCztU68jooFiMUB01Ky3F0FyOvhG/BZrWkg=="], + + "@dnd-kit/utilities": ["@dnd-kit/utilities@3.2.2", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "react": ">=16.8.0" } }, "sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg=="], + + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.6", "", { "os": "aix", "cpu": "ppc64" }, "sha512-ShbM/3XxwuxjFiuVBHA+d3j5dyac0aEVVq1oluIDf71hUw0aRF59dV/efUsIwFnR6m8JNM2FjZOzmaZ8yG61kw=="], + + "@esbuild/android-arm": ["@esbuild/android-arm@0.25.6", "", { "os": "android", "cpu": "arm" }, "sha512-S8ToEOVfg++AU/bHwdksHNnyLyVM+eMVAOf6yRKFitnwnbwwPNqKr3srzFRe7nzV69RQKb5DgchIX5pt3L53xg=="], + + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.6", "", { "os": "android", "cpu": "arm64" }, "sha512-hd5zdUarsK6strW+3Wxi5qWws+rJhCCbMiC9QZyzoxfk5uHRIE8T287giQxzVpEvCwuJ9Qjg6bEjcRJcgfLqoA=="], + + "@esbuild/android-x64": ["@esbuild/android-x64@0.25.6", "", { "os": "android", "cpu": "x64" }, "sha512-0Z7KpHSr3VBIO9A/1wcT3NTy7EB4oNC4upJ5ye3R7taCc2GUdeynSLArnon5G8scPwaU866d3H4BCrE5xLW25A=="], + + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.6", "", { "os": "darwin", "cpu": "arm64" }, "sha512-FFCssz3XBavjxcFxKsGy2DYK5VSvJqa6y5HXljKzhRZ87LvEi13brPrf/wdyl/BbpbMKJNOr1Sd0jtW4Ge1pAA=="], + + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.6", "", { "os": "darwin", "cpu": "x64" }, "sha512-GfXs5kry/TkGM2vKqK2oyiLFygJRqKVhawu3+DOCk7OxLy/6jYkWXhlHwOoTb0WqGnWGAS7sooxbZowy+pK9Yg=="], + + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.6", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-aoLF2c3OvDn2XDTRvn8hN6DRzVVpDlj2B/F66clWd/FHLiHaG3aVZjxQX2DYphA5y/evbdGvC6Us13tvyt4pWg=="], + + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.6", "", { "os": "freebsd", "cpu": "x64" }, "sha512-2SkqTjTSo2dYi/jzFbU9Plt1vk0+nNg8YC8rOXXea+iA3hfNJWebKYPs3xnOUf9+ZWhKAaxnQNUf2X9LOpeiMQ=="], + + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.6", "", { "os": "linux", "cpu": "arm" }, "sha512-SZHQlzvqv4Du5PrKE2faN0qlbsaW/3QQfUUc6yO2EjFcA83xnwm91UbEEVx4ApZ9Z5oG8Bxz4qPE+HFwtVcfyw=="], + + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-b967hU0gqKd9Drsh/UuAm21Khpoh6mPBSgz8mKRq4P5mVK8bpA+hQzmm/ZwGVULSNBzKdZPQBRT3+WuVavcWsQ=="], + + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.6", "", { "os": "linux", "cpu": "ia32" }, "sha512-aHWdQ2AAltRkLPOsKdi3xv0mZ8fUGPdlKEjIEhxCPm5yKEThcUjHpWB1idN74lfXGnZ5SULQSgtr5Qos5B0bPw=="], + + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.6", "", { "os": "linux", "cpu": "none" }, "sha512-VgKCsHdXRSQ7E1+QXGdRPlQ/e08bN6WMQb27/TMfV+vPjjTImuT9PmLXupRlC90S1JeNNW5lzkAEO/McKeJ2yg=="], + + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.6", "", { "os": "linux", "cpu": "none" }, "sha512-WViNlpivRKT9/py3kCmkHnn44GkGXVdXfdc4drNmRl15zVQ2+D2uFwdlGh6IuK5AAnGTo2qPB1Djppj+t78rzw=="], + + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.6", "", { "os": "linux", "cpu": "ppc64" }, "sha512-wyYKZ9NTdmAMb5730I38lBqVu6cKl4ZfYXIs31Baf8aoOtB4xSGi3THmDYt4BTFHk7/EcVixkOV2uZfwU3Q2Jw=="], + + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.6", "", { "os": "linux", "cpu": "none" }, "sha512-KZh7bAGGcrinEj4qzilJ4hqTY3Dg2U82c8bv+e1xqNqZCrCyc+TL9AUEn5WGKDzm3CfC5RODE/qc96OcbIe33w=="], + + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.6", "", { "os": "linux", "cpu": "s390x" }, "sha512-9N1LsTwAuE9oj6lHMyyAM+ucxGiVnEqUdp4v7IaMmrwb06ZTEVCIs3oPPplVsnjPfyjmxwHxHMF8b6vzUVAUGw=="], + + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.6", "", { "os": "linux", "cpu": "x64" }, "sha512-A6bJB41b4lKFWRKNrWoP2LHsjVzNiaurf7wyj/XtFNTsnPuxwEBWHLty+ZE0dWBKuSK1fvKgrKaNjBS7qbFKig=="], + + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.6", "", { "os": "none", "cpu": "arm64" }, "sha512-IjA+DcwoVpjEvyxZddDqBY+uJ2Snc6duLpjmkXm/v4xuS3H+3FkLZlDm9ZsAbF9rsfP3zeA0/ArNDORZgrxR/Q=="], + + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.6", "", { "os": "none", "cpu": "x64" }, "sha512-dUXuZr5WenIDlMHdMkvDc1FAu4xdWixTCRgP7RQLBOkkGgwuuzaGSYcOpW4jFxzpzL1ejb8yF620UxAqnBrR9g=="], + + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.6", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-l8ZCvXP0tbTJ3iaqdNf3pjaOSd5ex/e6/omLIQCVBLmHTlfXW3zAxQ4fnDmPLOB1x9xrcSi/xtCWFwCZRIaEwg=="], + + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.6", "", { "os": "openbsd", "cpu": "x64" }, "sha512-hKrmDa0aOFOr71KQ/19JC7az1P0GWtCN1t2ahYAf4O007DHZt/dW8ym5+CUdJhQ/qkZmI1HAF8KkJbEFtCL7gw=="], + + "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.6", "", { "os": "none", "cpu": "arm64" }, "sha512-+SqBcAWoB1fYKmpWoQP4pGtx+pUUC//RNYhFdbcSA16617cchuryuhOCRpPsjCblKukAckWsV+aQ3UKT/RMPcA=="], + + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.6", "", { "os": "sunos", "cpu": "x64" }, "sha512-dyCGxv1/Br7MiSC42qinGL8KkG4kX0pEsdb0+TKhmJZgCUDBGmyo1/ArCjNGiOLiIAgdbWgmWgib4HoCi5t7kA=="], + + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.6", "", { "os": "win32", "cpu": "arm64" }, "sha512-42QOgcZeZOvXfsCBJF5Afw73t4veOId//XD3i+/9gSkhSV6Gk3VPlWncctI+JcOyERv85FUo7RxuxGy+z8A43Q=="], + + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.6", "", { "os": "win32", "cpu": "ia32" }, "sha512-4AWhgXmDuYN7rJI6ORB+uU9DHLq/erBbuMoAuB4VWJTu5KtCgcKYPynF0YI1VkBNuEfjNlLrFr9KZPJzrtLkrQ=="], + + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.6", "", { "os": "win32", "cpu": "x64" }, "sha512-NgJPHHbEpLQgDH2MjQu90pzW/5vvXIZ7KOnPyNBm92A6WgZ/7b6fJyUBjoumLqeOQQGqY2QjQxRo97ah4Sj0cA=="], + + "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.7.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw=="], + + "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="], + + "@eslint/config-array": ["@eslint/config-array@0.21.0", "", { "dependencies": { "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ=="], + + "@eslint/config-helpers": ["@eslint/config-helpers@0.3.0", "", {}, "sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw=="], + + "@eslint/core": ["@eslint/core@0.15.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA=="], + + "@eslint/eslintrc": ["@eslint/eslintrc@3.3.1", "", { "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" } }, "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ=="], + + "@eslint/js": ["@eslint/js@9.31.0", "", {}, "sha512-LOm5OVt7D4qiKCqoiPbA7LWmI+tbw1VbTUowBcUMgQSuM6poJufkFkYDcQpo5KfgD39TnNySV26QjOh7VFpSyw=="], + + "@eslint/object-schema": ["@eslint/object-schema@2.1.6", "", {}, "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA=="], + + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.3.3", "", { "dependencies": { "@eslint/core": "^0.15.1", "levn": "^0.4.1" } }, "sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag=="], + + "@exodus/schemasafe": ["@exodus/schemasafe@1.3.0", "", {}, "sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw=="], + + "@floating-ui/core": ["@floating-ui/core@1.7.2", "", { "dependencies": { "@floating-ui/utils": "^0.2.10" } }, "sha512-wNB5ooIKHQc+Kui96jE/n69rHFWAVoxn5CAzL1Xdd8FG03cgY3MLO+GF9U3W737fYDSgPWA6MReKhBQBop6Pcw=="], + + "@floating-ui/dom": ["@floating-ui/dom@1.7.2", "", { "dependencies": { "@floating-ui/core": "^1.7.2", "@floating-ui/utils": "^0.2.10" } }, "sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA=="], + + "@floating-ui/react-dom": ["@floating-ui/react-dom@2.1.4", "", { "dependencies": { "@floating-ui/dom": "^1.7.2" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-JbbpPhp38UmXDDAu60RJmbeme37Jbgsm7NrHGgzYYFKmblzRUh6Pa641dII6LsjwF4XlScDrde2UAzDo/b9KPw=="], + + "@floating-ui/utils": ["@floating-ui/utils@0.2.10", "", {}, "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ=="], + + "@hookform/resolvers": ["@hookform/resolvers@3.10.0", "", { "peerDependencies": { "react-hook-form": "^7.0.0" } }, "sha512-79Dv+3mDF7i+2ajj7SkypSKHhl1cbln1OGavqrsF7p6mbUv11xpqpacPsGDCTRvCSjEEIez2ef1NveSVL3b0Ag=="], + + "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], + + "@humanfs/node": ["@humanfs/node@0.16.6", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" } }, "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw=="], + + "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], + + "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], + + "@ibm-cloud/openapi-ruleset": ["@ibm-cloud/openapi-ruleset@1.31.1", "", { "dependencies": { "@ibm-cloud/openapi-ruleset-utilities": "1.9.0", "@stoplight/spectral-formats": "^1.8.2", "@stoplight/spectral-functions": "^1.9.3", "@stoplight/spectral-rulesets": "^1.21.3", "chalk": "^4.1.2", "jsonschema": "^1.5.0", "lodash": "^4.17.21", "loglevel": "^1.9.2", "loglevel-plugin-prefix": "0.8.4", "minimatch": "^6.2.0", "validator": "^13.11.0" } }, "sha512-3WK2FREmDA2aadCjD71PE7tx5evyvmhg80ts1kXp2IzXIA0ZJ7guGM66tj40kxaqwpMSGchwEnnfYswntav76g=="], + + "@ibm-cloud/openapi-ruleset-utilities": ["@ibm-cloud/openapi-ruleset-utilities@1.9.0", "", {}, "sha512-AoFbSarOqFBYH+1TZ9Ahkm2IWYSi5v0pBk88fpV+5b3qGJukypX8PwvCWADjuyIccKg48/F73a6hTTkBzDQ2UA=="], + + "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], + + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.12", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg=="], + + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], + + "@jridgewell/source-map": ["@jridgewell/source-map@0.3.10", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" } }, "sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.4", "", {}, "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw=="], + + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.29", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ=="], + + "@jsdevtools/ono": ["@jsdevtools/ono@7.1.3", "", {}, "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg=="], + + "@jsep-plugin/assignment": ["@jsep-plugin/assignment@1.3.0", "", { "peerDependencies": { "jsep": "^0.4.0||^1.0.0" } }, "sha512-VVgV+CXrhbMI3aSusQyclHkenWSAm95WaiKrMxRFam3JSUiIaQjoMIw2sEs/OX4XifnqeQUN4DYbJjlA8EfktQ=="], + + "@jsep-plugin/regex": ["@jsep-plugin/regex@1.0.4", "", { "peerDependencies": { "jsep": "^0.4.0||^1.0.0" } }, "sha512-q7qL4Mgjs1vByCaTnDFcBnV9HS7GVPJX5vyVoCgZHNSC9rjwIlmbXG5sUuorR5ndfHAIlJ8pVStxvjXHbNvtUg=="], + + "@jsep-plugin/ternary": ["@jsep-plugin/ternary@1.1.4", "", { "peerDependencies": { "jsep": "^0.4.0||^1.0.0" } }, "sha512-ck5wiqIbqdMX6WRQztBL7ASDty9YLgJ3sSAK5ZpBzXeySvFGCzIvM6UiAI4hTZ22fEcYQVV/zhUbNscggW+Ukg=="], + + "@mjackson/node-fetch-server": ["@mjackson/node-fetch-server@0.2.0", "", {}, "sha512-EMlH1e30yzmTpGLQjlFmaDAjyOeZhng1/XCd7DExR8PNAnG/G1tyruZxEoUe11ClnwGhGrtsdnyyUx1frSzjng=="], + + "@monaco-editor/loader": ["@monaco-editor/loader@1.5.0", "", { "dependencies": { "state-local": "^1.0.6" } }, "sha512-hKoGSM+7aAc7eRTRjpqAZucPmoNOC4UUbknb/VNoTkEIkCPhqV8LfbsgM1webRM7S/z21eHEx9Fkwx8Z/C/+Xw=="], + + "@monaco-editor/react": ["@monaco-editor/react@4.7.0", "", { "dependencies": { "@monaco-editor/loader": "^1.5.0" }, "peerDependencies": { "monaco-editor": ">= 0.25.0 < 1", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-cyzXQCtO47ydzxpQtCGSQGOC8Gk3ZUeBXFAxD+CWXYFo5OqZyZUonFl0DwUlTyAfRHntBfw2p3w4s9R6oe1eCA=="], + + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], + + "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], + + "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], + + "@npmcli/git": ["@npmcli/git@4.1.0", "", { "dependencies": { "@npmcli/promise-spawn": "^6.0.0", "lru-cache": "^7.4.4", "npm-pick-manifest": "^8.0.0", "proc-log": "^3.0.0", "promise-inflight": "^1.0.1", "promise-retry": "^2.0.1", "semver": "^7.3.5", "which": "^3.0.0" } }, "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ=="], + + "@npmcli/package-json": ["@npmcli/package-json@4.0.1", "", { "dependencies": { "@npmcli/git": "^4.1.0", "glob": "^10.2.2", "hosted-git-info": "^6.1.1", "json-parse-even-better-errors": "^3.0.0", "normalize-package-data": "^5.0.0", "proc-log": "^3.0.0", "semver": "^7.5.3" } }, "sha512-lRCEGdHZomFsURroh522YvA/2cVb9oPIJrjHanCJZkiasz1BzcnLr3tBJhlV7S86MBJBuAQ33is2D60YitZL2Q=="], + + "@npmcli/promise-spawn": ["@npmcli/promise-spawn@6.0.2", "", { "dependencies": { "which": "^3.0.0" } }, "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg=="], + + "@orval/angular": ["@orval/angular@7.4.1", "", { "dependencies": { "@orval/core": "7.4.1" } }, "sha512-ypqJk/WJ9tnMQv17ZRoB73xZrNTskaR1FXc1j5FyC19dQgmBgCtyJrJsXDSRVj747KA9qtdHpS0sIzofwOTx/A=="], + + "@orval/axios": ["@orval/axios@7.4.1", "", { "dependencies": { "@orval/core": "7.4.1" } }, "sha512-Izg99898tPutkvFUSDD9LROEul1Gh88yxgSHSDFuWZcImkdjeg30Sc6b/EXytjn5I/De/PtQPgEIFPCEsZ9O4A=="], + + "@orval/core": ["@orval/core@7.4.1", "", { "dependencies": { "@apidevtools/swagger-parser": "^10.1.0", "@ibm-cloud/openapi-ruleset": "^1.26.0", "acorn": "^8.14.0", "ajv": "^8.17.1", "chalk": "^4.1.2", "compare-versions": "^6.1.1", "debug": "^4.3.7", "esbuild": "^0.24.2", "esutils": "2.0.3", "fs-extra": "^11.2.0", "globby": "11.1.0", "lodash.get": "^4.4.2", "lodash.isempty": "^4.4.0", "lodash.omit": "^4.5.0", "lodash.uniq": "^4.5.0", "lodash.uniqby": "^4.7.0", "lodash.uniqwith": "^4.5.0", "micromatch": "^4.0.8", "openapi3-ts": "4.4.0", "swagger2openapi": "^7.0.8" } }, "sha512-puqyqfA7uolvd/cSy11Siq7UqrgzLAWeVUMxhsuql5KFn3Vi+5n3XUztzbtW0kuTb27vX8kcpnlOMQMf8Jf1Og=="], + + "@orval/fetch": ["@orval/fetch@7.4.1", "", { "dependencies": { "@orval/core": "7.4.1" } }, "sha512-EVirxs0ii0rt/Lsl5IO7ADAKdEWNnHB7GinbdvtfugZ8rENzNzOQLyBm5QP70kJM70FVLBxWGpeH6Jnqz0Fv8g=="], + + "@orval/hono": ["@orval/hono@7.4.1", "", { "dependencies": { "@orval/core": "7.4.1", "@orval/zod": "7.4.1", "lodash.uniq": "^4.5.0" } }, "sha512-qzoOl2KvbxpBZKZB19+vn5iOZIwGcbdYY+/qNmSlJQ3jA7bbHNbn26ZfItDlAh3WFH+fTvme58ezRNP7HVc0rw=="], + + "@orval/mock": ["@orval/mock@7.4.1", "", { "dependencies": { "@orval/core": "7.4.1", "lodash.get": "^4.4.2", "lodash.omit": "^4.5.0", "openapi3-ts": "^4.2.2" } }, "sha512-ywKwcQaLIyZXKE6kHmdF3M3HGtlOKaZZ6+ciSEV1vbKMBr7ahFyv0m2pitUiwHyJ3ameKarMArX0hk31klZbtA=="], + + "@orval/query": ["@orval/query@7.4.1", "", { "dependencies": { "@orval/core": "7.4.1", "@orval/fetch": "7.4.1", "lodash.omitby": "^4.6.0" } }, "sha512-zlkrdiK+Bas7xOYM36cfZKGGoslKqh1B9mKaGQKadkCj9+54PzI9CxIxtCGZWJhLXB8kqPxaenNxyYoV/JW02A=="], + + "@orval/swr": ["@orval/swr@7.4.1", "", { "dependencies": { "@orval/core": "7.4.1", "@orval/fetch": "7.4.1" } }, "sha512-OnmSjDiS4xZUrkJhbmEQjdY95gfRHdp9uU5q9fGM4Qg1VVaR/KcOG7FRNk4WHcQmCmi4KDvwbboE/KJjsDsF7Q=="], + + "@orval/zod": ["@orval/zod@7.4.1", "", { "dependencies": { "@orval/core": "7.4.1", "lodash.uniq": "^4.5.0" } }, "sha512-TqFidfTx9OtjTeA48P43/Vw1OaWuEkhURsMQGy8hn8w8/AKIAN7j0e/m8eoMLV/C3BN1ErfLDC1lkQ52q7u6SQ=="], + + "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], + + "@radix-ui/number": ["@radix-ui/number@1.1.1", "", {}, "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g=="], + + "@radix-ui/primitive": ["@radix-ui/primitive@1.1.2", "", {}, "sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA=="], + + "@radix-ui/react-accordion": ["@radix-ui/react-accordion@1.2.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collapsible": "1.1.11", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-l3W5D54emV2ues7jjeG1xcyN7S3jnK3zE2zHqgn0CmMsy9lNJwmgcrmaxS+7ipw15FAivzKNzH3d5EcGoFKw0A=="], + + "@radix-ui/react-alert-dialog": ["@radix-ui/react-alert-dialog@1.1.14", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dialog": "1.1.14", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-IOZfZ3nPvN6lXpJTBCunFQPRSvK8MDgSc1FB85xnIpUKOw9en0dJj8JmCAxV7BiZdtYlUpmrQjoTFkVYtdoWzQ=="], + + "@radix-ui/react-arrow": ["@radix-ui/react-arrow@1.1.7", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w=="], + + "@radix-ui/react-avatar": ["@radix-ui/react-avatar@1.1.10", "", { "dependencies": { "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-is-hydrated": "0.1.0", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-V8piFfWapM5OmNCXTzVQY+E1rDa53zY+MQ4Y7356v4fFz6vqCyUtIz2rUD44ZEdwg78/jKmMJHj07+C/Z/rcog=="], + + "@radix-ui/react-checkbox": ["@radix-ui/react-checkbox@1.3.2", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-use-size": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-yd+dI56KZqawxKZrJ31eENUwqc1QSqg4OZ15rybGjF2ZNwMO+wCyHzAVLRp9qoYJf7kYy0YpZ2b0JCzJ42HZpA=="], + + "@radix-ui/react-collapsible": ["@radix-ui/react-collapsible@1.1.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-2qrRsVGSCYasSz1RFOorXwl0H7g7J1frQtgpQgYrt+MOidtPAINHn9CPovQXb83r8ahapdx3Tu0fa/pdFFSdPg=="], + + "@radix-ui/react-collection": ["@radix-ui/react-collection@1.1.7", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw=="], + + "@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg=="], + + "@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="], + + "@radix-ui/react-dialog": ["@radix-ui/react-dialog@1.1.14", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.10", "@radix-ui/react-focus-guards": "1.1.2", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-controllable-state": "1.2.2", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-+CpweKjqpzTmwRwcYECQcNYbI8V9VSQt0SNFKeEBLgfucbsLssU6Ppq7wUdNXEGb573bMjFhVjKVll8rmV6zMw=="], + + "@radix-ui/react-direction": ["@radix-ui/react-direction@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw=="], + + "@radix-ui/react-dismissable-layer": ["@radix-ui/react-dismissable-layer@1.1.10", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-escape-keydown": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-IM1zzRV4W3HtVgftdQiiOmA0AdJlCtMLe00FXaHwgt3rAnNsIyDqshvkIW3hj/iu5hu8ERP7KIYki6NkqDxAwQ=="], + + "@radix-ui/react-dropdown-menu": ["@radix-ui/react-dropdown-menu@2.1.15", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-menu": "2.1.15", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-mIBnOjgwo9AH3FyKaSWoSu/dYj6VdhJ7frEPiGTeXCdUFHjl9h3mFh2wwhEtINOmYXWhdpf1rY2minFsmaNgVQ=="], + + "@radix-ui/react-focus-guards": ["@radix-ui/react-focus-guards@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA=="], + + "@radix-ui/react-focus-scope": ["@radix-ui/react-focus-scope@1.1.7", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw=="], + + "@radix-ui/react-hover-card": ["@radix-ui/react-hover-card@1.1.14", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.10", "@radix-ui/react-popper": "1.2.7", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-CPYZ24Mhirm+g6D8jArmLzjYu4Eyg3TTUHswR26QgzXBHBe64BO/RHOJKzmF/Dxb4y4f9PKyJdwm/O/AhNkb+Q=="], + + "@radix-ui/react-id": ["@radix-ui/react-id@1.1.1", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg=="], + + "@radix-ui/react-label": ["@radix-ui/react-label@2.1.7", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-YT1GqPSL8kJn20djelMX7/cTRp/Y9w5IZHvfxQTVHrOqa2yMl7i/UfMqKRU5V7mEyKTrUVgJXhNQPVCG8PBLoQ=="], + + "@radix-ui/react-menu": ["@radix-ui/react-menu@2.1.15", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.10", "@radix-ui/react-focus-guards": "1.1.2", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.7", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-roving-focus": "1.1.10", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-callback-ref": "1.1.1", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-tVlmA3Vb9n8SZSd+YSbuFR66l87Wiy4du+YE+0hzKQEANA+7cWKH1WgqcEX4pXqxUFQKrWQGHdvEfw00TjFiew=="], + + "@radix-ui/react-popover": ["@radix-ui/react-popover@1.1.14", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.10", "@radix-ui/react-focus-guards": "1.1.2", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.7", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-controllable-state": "1.2.2", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-ODz16+1iIbGUfFEfKx2HTPKizg2MN39uIOV8MXeHnmdd3i/N9Wt7vU46wbHsqA0xoaQyXVcs0KIlBdOA2Y95bw=="], + + "@radix-ui/react-popper": ["@radix-ui/react-popper@1.2.7", "", { "dependencies": { "@floating-ui/react-dom": "^2.0.0", "@radix-ui/react-arrow": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-rect": "1.1.1", "@radix-ui/react-use-size": "1.1.1", "@radix-ui/rect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-IUFAccz1JyKcf/RjB552PlWwxjeCJB8/4KxT7EhBHOJM+mN7LdW+B3kacJXILm32xawcMMjb2i0cIZpo+f9kiQ=="], + + "@radix-ui/react-portal": ["@radix-ui/react-portal@1.1.9", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ=="], + + "@radix-ui/react-presence": ["@radix-ui/react-presence@1.1.4", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA=="], + + "@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="], + + "@radix-ui/react-progress": ["@radix-ui/react-progress@1.1.7", "", { "dependencies": { "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-vPdg/tF6YC/ynuBIJlk1mm7Le0VgW6ub6J2UWnTQ7/D23KXcPI1qy+0vBkgKgd38RCMJavBXpB83HPNFMTb0Fg=="], + + "@radix-ui/react-radio-group": ["@radix-ui/react-radio-group@1.3.7", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-roving-focus": "1.1.10", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-use-size": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-9w5XhD0KPOrm92OTTE0SysH3sYzHsSTHNvZgUBo/VZ80VdYyB5RneDbc0dKpURS24IxkoFRu/hI0i4XyfFwY6g=="], + + "@radix-ui/react-roving-focus": ["@radix-ui/react-roving-focus@1.1.10", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-dT9aOXUen9JSsxnMPv/0VqySQf5eDQ6LCk5Sw28kamz8wSOW2bJdlX2Bg5VUIIcV+6XlHpWTIuTPCf/UNIyq8Q=="], + + "@radix-ui/react-scroll-area": ["@radix-ui/react-scroll-area@1.2.9", "", { "dependencies": { "@radix-ui/number": "1.1.1", "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-YSjEfBXnhUELsO2VzjdtYYD4CfQjvao+lhhrX5XsHD7/cyUNzljF1FHEbgTPN7LH2MClfwRMIsYlqTYpKTTe2A=="], + + "@radix-ui/react-select": ["@radix-ui/react-select@2.2.5", "", { "dependencies": { "@radix-ui/number": "1.1.1", "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.10", "@radix-ui/react-focus-guards": "1.1.2", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.7", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-visually-hidden": "1.2.3", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-HnMTdXEVuuyzx63ME0ut4+sEMYW6oouHWNGUZc7ddvUWIcfCva/AMoqEW/3wnEllriMWBa0RHspCYnfCWJQYmA=="], + + "@radix-ui/react-separator": ["@radix-ui/react-separator@1.1.7", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA=="], + + "@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="], + + "@radix-ui/react-switch": ["@radix-ui/react-switch@1.2.5", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-use-size": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-5ijLkak6ZMylXsaImpZ8u4Rlf5grRmoc0p0QeX9VJtlrM4f5m3nCTX8tWga/zOA8PZYIR/t0p2Mnvd7InrJ6yQ=="], + + "@radix-ui/react-tabs": ["@radix-ui/react-tabs@1.1.12", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-roving-focus": "1.1.10", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-GTVAlRVrQrSw3cEARM0nAx73ixrWDPNZAruETn3oHCNP6SbZ/hNxdxp+u7VkIEv3/sFoLq1PfcHrl7Pnp0CDpw=="], + + "@radix-ui/react-toast": ["@radix-ui/react-toast@1.2.14", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.10", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-visually-hidden": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-nAP5FBxBJGQ/YfUB+r+O6USFVkWq3gAInkxyEnmvEV5jtSbfDhfa4hwX8CraCnbjMLsE7XSf/K75l9xXY7joWg=="], + + "@radix-ui/react-toggle": ["@radix-ui/react-toggle@1.1.9", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-ZoFkBBz9zv9GWer7wIjvdRxmh2wyc2oKWw6C6CseWd6/yq1DK/l5lJ+wnsmFwJZbBYqr02mrf8A2q/CVCuM3ZA=="], + + "@radix-ui/react-toggle-group": ["@radix-ui/react-toggle-group@1.1.10", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-roving-focus": "1.1.10", "@radix-ui/react-toggle": "1.1.9", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-kiU694Km3WFLTC75DdqgM/3Jauf3rD9wxeS9XtyWFKsBUeZA337lC+6uUazT7I1DhanZ5gyD5Stf8uf2dbQxOQ=="], + + "@radix-ui/react-tooltip": ["@radix-ui/react-tooltip@1.2.7", "", { "dependencies": { "@radix-ui/primitive": "1.1.2", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.10", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.7", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.4", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-visually-hidden": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Ap+fNYwKTYJ9pzqW+Xe2HtMRbQ/EeWkj2qykZ6SuEV4iS/o1bZI5ssJbk4D2r8XuDuOBVz/tIx2JObtuqU+5Zw=="], + + "@radix-ui/react-use-callback-ref": ["@radix-ui/react-use-callback-ref@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg=="], + + "@radix-ui/react-use-controllable-state": ["@radix-ui/react-use-controllable-state@1.2.2", "", { "dependencies": { "@radix-ui/react-use-effect-event": "0.0.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg=="], + + "@radix-ui/react-use-effect-event": ["@radix-ui/react-use-effect-event@0.0.2", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA=="], + + "@radix-ui/react-use-escape-keydown": ["@radix-ui/react-use-escape-keydown@1.1.1", "", { "dependencies": { "@radix-ui/react-use-callback-ref": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g=="], + + "@radix-ui/react-use-is-hydrated": ["@radix-ui/react-use-is-hydrated@0.1.0", "", { "dependencies": { "use-sync-external-store": "^1.5.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA=="], + + "@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ=="], + + "@radix-ui/react-use-previous": ["@radix-ui/react-use-previous@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ=="], + + "@radix-ui/react-use-rect": ["@radix-ui/react-use-rect@1.1.1", "", { "dependencies": { "@radix-ui/rect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w=="], + + "@radix-ui/react-use-size": ["@radix-ui/react-use-size@1.1.1", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ=="], + + "@radix-ui/react-visually-hidden": ["@radix-ui/react-visually-hidden@1.2.3", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug=="], + + "@radix-ui/rect": ["@radix-ui/rect@1.1.1", "", {}, "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw=="], + + "@react-router/dev": ["@react-router/dev@7.6.3", "", { "dependencies": { "@babel/core": "^7.21.8", "@babel/generator": "^7.21.5", "@babel/parser": "^7.21.8", "@babel/plugin-syntax-decorators": "^7.22.10", "@babel/plugin-syntax-jsx": "^7.21.4", "@babel/preset-typescript": "^7.21.5", "@babel/traverse": "^7.23.2", "@babel/types": "^7.22.5", "@npmcli/package-json": "^4.0.1", "@react-router/node": "7.6.3", "arg": "^5.0.1", "babel-dead-code-elimination": "^1.0.6", "chokidar": "^4.0.0", "dedent": "^1.5.3", "es-module-lexer": "^1.3.1", "exit-hook": "2.2.1", "jsesc": "3.0.2", "lodash": "^4.17.21", "pathe": "^1.1.2", "picocolors": "^1.1.1", "prettier": "^2.7.1", "react-refresh": "^0.14.0", "semver": "^7.3.7", "set-cookie-parser": "^2.6.0", "tinyglobby": "^0.2.14", "valibot": "^0.41.0", "vite-node": "^3.1.4" }, "peerDependencies": { "@react-router/serve": "^7.6.3", "react-router": "^7.6.3", "typescript": "^5.1.0", "vite": "^5.1.0 || ^6.0.0 || ^7.0.0", "wrangler": "^3.28.2 || ^4.0.0" }, "optionalPeers": ["@react-router/serve", "typescript", "wrangler"], "bin": { "react-router": "bin.js" } }, "sha512-nnJQMVeE+LDViFTQDxeQV5FcfJ48a6aCScrFHwPHWgViQmiJxUBtDU1Pl7XZKEoTus5KDg/W3Vz2spiY6wXg3Q=="], + + "@react-router/fs-routes": ["@react-router/fs-routes@7.6.3", "", { "dependencies": { "minimatch": "^9.0.0" }, "peerDependencies": { "@react-router/dev": "^7.6.3", "typescript": "^5.1.0" }, "optionalPeers": ["typescript"] }, "sha512-7w9Z2UyAMBsQqzKChIDHnJ0ehFObG6lhFqTP9/ssW2jAfhmzYZLBfjqOHloI+glzRzj/LpSRUZBlDWiNHlbcjQ=="], + + "@react-router/node": ["@react-router/node@7.6.3", "", { "dependencies": { "@mjackson/node-fetch-server": "^0.2.0" }, "peerDependencies": { "react-router": "7.6.3", "typescript": "^5.1.0" }, "optionalPeers": ["typescript"] }, "sha512-CgqYAGjrfW/Al0LbWhQ60joDci5/H3ix4IU5UwlKLtqmNPzuSUTBkCrxit3jHuMYqaBaGfyRpT7kIeb1YZ4nqA=="], + + "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.19", "", {}, "sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA=="], + + "@rollup/plugin-babel": ["@rollup/plugin-babel@5.3.1", "", { "dependencies": { "@babel/helper-module-imports": "^7.10.4", "@rollup/pluginutils": "^3.1.0" }, "peerDependencies": { "@babel/core": "^7.0.0", "@types/babel__core": "^7.1.9", "rollup": "^1.20.0||^2.0.0" }, "optionalPeers": ["@types/babel__core"] }, "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q=="], + + "@rollup/plugin-node-resolve": ["@rollup/plugin-node-resolve@15.3.1", "", { "dependencies": { "@rollup/pluginutils": "^5.0.1", "@types/resolve": "1.20.2", "deepmerge": "^4.2.2", "is-module": "^1.0.0", "resolve": "^1.22.1" }, "peerDependencies": { "rollup": "^2.78.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA=="], + + "@rollup/plugin-replace": ["@rollup/plugin-replace@2.4.2", "", { "dependencies": { "@rollup/pluginutils": "^3.1.0", "magic-string": "^0.25.7" }, "peerDependencies": { "rollup": "^1.20.0 || ^2.0.0" } }, "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg=="], + + "@rollup/plugin-terser": ["@rollup/plugin-terser@0.4.4", "", { "dependencies": { "serialize-javascript": "^6.0.1", "smob": "^1.0.0", "terser": "^5.17.4" }, "peerDependencies": { "rollup": "^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A=="], + + "@rollup/pluginutils": ["@rollup/pluginutils@5.2.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw=="], + + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.45.0", "", { "os": "android", "cpu": "arm" }, "sha512-2o/FgACbji4tW1dzXOqAV15Eu7DdgbKsF2QKcxfG4xbh5iwU7yr5RRP5/U+0asQliSYv5M4o7BevlGIoSL0LXg=="], + + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.45.0", "", { "os": "android", "cpu": "arm64" }, "sha512-PSZ0SvMOjEAxwZeTx32eI/j5xSYtDCRxGu5k9zvzoY77xUNssZM+WV6HYBLROpY5CkXsbQjvz40fBb7WPwDqtQ=="], + + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.45.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-BA4yPIPssPB2aRAWzmqzQ3y2/KotkLyZukVB7j3psK/U3nVJdceo6qr9pLM2xN6iRP/wKfxEbOb1yrlZH6sYZg=="], + + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.45.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-Pr2o0lvTwsiG4HCr43Zy9xXrHspyMvsvEw4FwKYqhli4FuLE5FjcZzuQ4cfPe0iUFCvSQG6lACI0xj74FDZKRA=="], + + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.45.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-lYE8LkE5h4a/+6VnnLiL14zWMPnx6wNbDG23GcYFpRW1V9hYWHAw9lBZ6ZUIrOaoK7NliF1sdwYGiVmziUF4vA=="], + + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.45.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-PVQWZK9sbzpvqC9Q0GlehNNSVHR+4m7+wET+7FgSnKG3ci5nAMgGmr9mGBXzAuE5SvguCKJ6mHL6vq1JaJ/gvw=="], + + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.45.0", "", { "os": "linux", "cpu": "arm" }, "sha512-hLrmRl53prCcD+YXTfNvXd776HTxNh8wPAMllusQ+amcQmtgo3V5i/nkhPN6FakW+QVLoUUr2AsbtIRPFU3xIA=="], + + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.45.0", "", { "os": "linux", "cpu": "arm" }, "sha512-XBKGSYcrkdiRRjl+8XvrUR3AosXU0NvF7VuqMsm7s5nRy+nt58ZMB19Jdp1RdqewLcaYnpk8zeVs/4MlLZEJxw=="], + + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.45.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-fRvZZPUiBz7NztBE/2QnCS5AtqLVhXmUOPj9IHlfGEXkapgImf4W9+FSkL8cWqoAjozyUzqFmSc4zh2ooaeF6g=="], + + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.45.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-Btv2WRZOcUGi8XU80XwIvzTg4U6+l6D0V6sZTrZx214nrwxw5nAi8hysaXj/mctyClWgesyuxbeLylCBNauimg=="], + + "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.45.0", "", { "os": "linux", "cpu": "none" }, "sha512-Li0emNnwtUZdLwHjQPBxn4VWztcrw/h7mgLyHiEI5Z0MhpeFGlzaiBHpSNVOMB/xucjXTTcO+dhv469Djr16KA=="], + + "@rollup/rollup-linux-powerpc64le-gnu": ["@rollup/rollup-linux-powerpc64le-gnu@4.45.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-sB8+pfkYx2kvpDCfd63d5ScYT0Fz1LO6jIb2zLZvmK9ob2D8DeVqrmBDE0iDK8KlBVmsTNzrjr3G1xV4eUZhSw=="], + + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.45.0", "", { "os": "linux", "cpu": "none" }, "sha512-5GQ6PFhh7E6jQm70p1aW05G2cap5zMOvO0se5JMecHeAdj5ZhWEHbJ4hiKpfi1nnnEdTauDXxPgXae/mqjow9w=="], + + "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.45.0", "", { "os": "linux", "cpu": "none" }, "sha512-N/euLsBd1rekWcuduakTo/dJw6U6sBP3eUq+RXM9RNfPuWTvG2w/WObDkIvJ2KChy6oxZmOSC08Ak2OJA0UiAA=="], + + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.45.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-2l9sA7d7QdikL0xQwNMO3xURBUNEWyHVHfAsHsUdq+E/pgLTUcCE+gih5PCdmyHmfTDeXUWVhqL0WZzg0nua3g=="], + + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.45.0", "", { "os": "linux", "cpu": "x64" }, "sha512-XZdD3fEEQcwG2KrJDdEQu7NrHonPxxaV0/w2HpvINBdcqebz1aL+0vM2WFJq4DeiAVT6F5SUQas65HY5JDqoPw=="], + + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.45.0", "", { "os": "linux", "cpu": "x64" }, "sha512-7ayfgvtmmWgKWBkCGg5+xTQ0r5V1owVm67zTrsEY1008L5ro7mCyGYORomARt/OquB9KY7LpxVBZes+oSniAAQ=="], + + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.45.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-B+IJgcBnE2bm93jEW5kHisqvPITs4ddLOROAcOc/diBgrEiQJJ6Qcjby75rFSmH5eMGrqJryUgJDhrfj942apQ=="], + + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.45.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-+CXwwG66g0/FpWOnP/v1HnrGVSOygK/osUbu3wPRy8ECXjoYKjRAyfxYpDQOfghC5qPJYLPH0oN4MCOjwgdMug=="], + + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.45.0", "", { "os": "win32", "cpu": "x64" }, "sha512-SRf1cytG7wqcHVLrBc9VtPK4pU5wxiB/lNIkNmW2ApKXIg+RpqwHfsaEK+e7eH4A1BpI6BX/aBWXxZCIrJg3uA=="], + + "@shikijs/core": ["@shikijs/core@1.29.2", "", { "dependencies": { "@shikijs/engine-javascript": "1.29.2", "@shikijs/engine-oniguruma": "1.29.2", "@shikijs/types": "1.29.2", "@shikijs/vscode-textmate": "^10.0.1", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.4" } }, "sha512-vju0lY9r27jJfOY4Z7+Rt/nIOjzJpZ3y+nYpqtUZInVoXQ/TJZcfGnNOGnKjFdVZb8qexiCuSlZRKcGfhhTTZQ=="], + + "@shikijs/engine-javascript": ["@shikijs/engine-javascript@1.29.2", "", { "dependencies": { "@shikijs/types": "1.29.2", "@shikijs/vscode-textmate": "^10.0.1", "oniguruma-to-es": "^2.2.0" } }, "sha512-iNEZv4IrLYPv64Q6k7EPpOCE/nuvGiKl7zxdq0WFuRPF5PAE9PRo2JGq/d8crLusM59BRemJ4eOqrFrC4wiQ+A=="], + + "@shikijs/engine-oniguruma": ["@shikijs/engine-oniguruma@1.29.2", "", { "dependencies": { "@shikijs/types": "1.29.2", "@shikijs/vscode-textmate": "^10.0.1" } }, "sha512-7iiOx3SG8+g1MnlzZVDYiaeHe7Ez2Kf2HrJzdmGwkRisT7r4rak0e655AcM/tF9JG/kg5fMNYlLLKglbN7gBqA=="], + + "@shikijs/langs": ["@shikijs/langs@1.29.2", "", { "dependencies": { "@shikijs/types": "1.29.2" } }, "sha512-FIBA7N3LZ+223U7cJDUYd5shmciFQlYkFXlkKVaHsCPgfVLiO+e12FmQE6Tf9vuyEsFe3dIl8qGWKXgEHL9wmQ=="], + + "@shikijs/themes": ["@shikijs/themes@1.29.2", "", { "dependencies": { "@shikijs/types": "1.29.2" } }, "sha512-i9TNZlsq4uoyqSbluIcZkmPL9Bfi3djVxRnofUHwvx/h6SRW3cwgBC5SML7vsDcWyukY0eCzVN980rqP6qNl9g=="], + + "@shikijs/types": ["@shikijs/types@1.29.2", "", { "dependencies": { "@shikijs/vscode-textmate": "^10.0.1", "@types/hast": "^3.0.4" } }, "sha512-VJjK0eIijTZf0QSTODEXCqinjBn0joAHQ+aPSBzrv4O2d/QSbsMw+ZeSRx03kV34Hy7NzUvV/7NqfYGRLrASmw=="], + + "@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.2", "", {}, "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="], + + "@stablelib/base64": ["@stablelib/base64@2.0.1", "", {}, "sha512-P2z89A7N1ETt6RxgpVdDT2xlg8cnm3n6td0lY9gyK7EiWK3wdq388yFX/hLknkCC0we05OZAD1rfxlQJUbl5VQ=="], + + "@stablelib/binary": ["@stablelib/binary@2.0.1", "", { "dependencies": { "@stablelib/int": "^2.0.1" } }, "sha512-U9iAO8lXgEDONsA0zPPSgcf3HUBNAqHiJmSHgZz62OvC3Hi2Bhc5kTnQ3S1/L+sthDTHtCMhcEiklmIly6uQ3w=="], + + "@stablelib/bytes": ["@stablelib/bytes@2.0.1", "", {}, "sha512-QIzI6V7nkJA5CjOZ7GoceBd4CIKrJoC471VaI6jh1xPQ2cMhkhQK4HddyzCXOR2y+fBF3/5B2HO3FXXI9C+Xzg=="], + + "@stablelib/int": ["@stablelib/int@2.0.1", "", {}, "sha512-Ht63fQp3wz/F8U4AlXEPb7hfJOIILs8Lq55jgtD7KueWtyjhVuzcsGLSTAWtZs3XJDZYdF1WcSKn+kBtbzupww=="], + + "@stablelib/keyagreement": ["@stablelib/keyagreement@2.0.1", "", { "dependencies": { "@stablelib/bytes": "^2.0.1" } }, "sha512-2+tWBLCMtWlHQ7GqjD5L+lQRyWtun4Lou0IOdTML8zuTuAS0EgihnHFx+4uMZwYU1In40J/WlpyKSLidHfStRQ=="], + + "@stablelib/random": ["@stablelib/random@2.0.1", "", { "dependencies": { "@stablelib/binary": "^2.0.1", "@stablelib/wipe": "^2.0.1" } }, "sha512-W6GAtXEEs7r+dSbuBsvoFmlyL3gLxle41tQkjKu17dDWtDdjhVUbtRfRCQcCUeczwkgjQxMPopgwYEvxXtHXGw=="], + + "@stablelib/wipe": ["@stablelib/wipe@2.0.1", "", {}, "sha512-1eU2K9EgOcV4qc9jcP6G72xxZxEm5PfeI5H55l08W95b4oRJaqhmlWRc4xZAm6IVSKhVNxMi66V67hCzzuMTAg=="], + + "@stablelib/x25519": ["@stablelib/x25519@2.0.1", "", { "dependencies": { "@stablelib/keyagreement": "^2.0.1", "@stablelib/random": "^2.0.1", "@stablelib/wipe": "^2.0.1" } }, "sha512-qi04HS2puHaBf50kM/kes5QcZFGsx8yF0YmCjLCOa/LPmnBaKEKX9ZR82OnnCwMn72YH13R/bBZgr/UP0aPFfA=="], + + "@stoplight/better-ajv-errors": ["@stoplight/better-ajv-errors@1.0.3", "", { "dependencies": { "jsonpointer": "^5.0.0", "leven": "^3.1.0" }, "peerDependencies": { "ajv": ">=8" } }, "sha512-0p9uXkuB22qGdNfy3VeEhxkU5uwvp/KrBTAbrLBURv6ilxIVwanKwjMc41lQfIVgPGcOkmLbTolfFrSsueu7zA=="], + + "@stoplight/json": ["@stoplight/json@3.21.7", "", { "dependencies": { "@stoplight/ordered-object-literal": "^1.0.3", "@stoplight/path": "^1.3.2", "@stoplight/types": "^13.6.0", "jsonc-parser": "~2.2.1", "lodash": "^4.17.21", "safe-stable-stringify": "^1.1" } }, "sha512-xcJXgKFqv/uCEgtGlPxy3tPA+4I+ZI4vAuMJ885+ThkTHFVkC+0Fm58lA9NlsyjnkpxFh4YiQWpH+KefHdbA0A=="], + + "@stoplight/json-ref-readers": ["@stoplight/json-ref-readers@1.2.2", "", { "dependencies": { "node-fetch": "^2.6.0", "tslib": "^1.14.1" } }, "sha512-nty0tHUq2f1IKuFYsLM4CXLZGHdMn+X/IwEUIpeSOXt0QjMUbL0Em57iJUDzz+2MkWG83smIigNZ3fauGjqgdQ=="], + + "@stoplight/json-ref-resolver": ["@stoplight/json-ref-resolver@3.1.6", "", { "dependencies": { "@stoplight/json": "^3.21.0", "@stoplight/path": "^1.3.2", "@stoplight/types": "^12.3.0 || ^13.0.0", "@types/urijs": "^1.19.19", "dependency-graph": "~0.11.0", "fast-memoize": "^2.5.2", "immer": "^9.0.6", "lodash": "^4.17.21", "tslib": "^2.6.0", "urijs": "^1.19.11" } }, "sha512-YNcWv3R3n3U6iQYBsFOiWSuRGE5su1tJSiX6pAPRVk7dP0L7lqCteXGzuVRQ0gMZqUl8v1P0+fAKxF6PLo9B5A=="], + + "@stoplight/ordered-object-literal": ["@stoplight/ordered-object-literal@1.0.5", "", {}, "sha512-COTiuCU5bgMUtbIFBuyyh2/yVVzlr5Om0v5utQDgBCuQUOPgU1DwoffkTfg4UBQOvByi5foF4w4T+H9CoRe5wg=="], + + "@stoplight/path": ["@stoplight/path@1.3.2", "", {}, "sha512-lyIc6JUlUA8Ve5ELywPC8I2Sdnh1zc1zmbYgVarhXIp9YeAB0ReeqmGEOWNtlHkbP2DAA1AL65Wfn2ncjK/jtQ=="], + + "@stoplight/spectral-core": ["@stoplight/spectral-core@1.20.0", "", { "dependencies": { "@stoplight/better-ajv-errors": "1.0.3", "@stoplight/json": "~3.21.0", "@stoplight/path": "1.3.2", "@stoplight/spectral-parsers": "^1.0.0", "@stoplight/spectral-ref-resolver": "^1.0.4", "@stoplight/spectral-runtime": "^1.1.2", "@stoplight/types": "~13.6.0", "@types/es-aggregate-error": "^1.0.2", "@types/json-schema": "^7.0.11", "ajv": "^8.17.1", "ajv-errors": "~3.0.0", "ajv-formats": "~2.1.1", "es-aggregate-error": "^1.0.7", "jsonpath-plus": "^10.3.0", "lodash": "~4.17.21", "lodash.topath": "^4.5.2", "minimatch": "3.1.2", "nimma": "0.2.3", "pony-cause": "^1.1.1", "simple-eval": "1.0.1", "tslib": "^2.8.1" } }, "sha512-5hBP81nCC1zn1hJXL/uxPNRKNcB+/pEIHgCjPRpl/w/qy9yC9ver04tw1W0l/PMiv0UeB5dYgozXVQ4j5a6QQQ=="], + + "@stoplight/spectral-formats": ["@stoplight/spectral-formats@1.8.2", "", { "dependencies": { "@stoplight/json": "^3.17.0", "@stoplight/spectral-core": "^1.19.2", "@types/json-schema": "^7.0.7", "tslib": "^2.8.1" } }, "sha512-c06HB+rOKfe7tuxg0IdKDEA5XnjL2vrn/m/OVIIxtINtBzphZrOgtRn7epQ5bQF5SWp84Ue7UJWaGgDwVngMFw=="], + + "@stoplight/spectral-functions": ["@stoplight/spectral-functions@1.10.1", "", { "dependencies": { "@stoplight/better-ajv-errors": "1.0.3", "@stoplight/json": "^3.17.1", "@stoplight/spectral-core": "^1.19.4", "@stoplight/spectral-formats": "^1.8.1", "@stoplight/spectral-runtime": "^1.1.2", "ajv": "^8.17.1", "ajv-draft-04": "~1.0.0", "ajv-errors": "~3.0.0", "ajv-formats": "~2.1.1", "lodash": "~4.17.21", "tslib": "^2.8.1" } }, "sha512-obu8ZfoHxELOapfGsCJixKZXZcffjg+lSoNuttpmUFuDzVLT3VmH8QkPXfOGOL5Pz80BR35ClNAToDkdnYIURg=="], + + "@stoplight/spectral-parsers": ["@stoplight/spectral-parsers@1.0.5", "", { "dependencies": { "@stoplight/json": "~3.21.0", "@stoplight/types": "^14.1.1", "@stoplight/yaml": "~4.3.0", "tslib": "^2.8.1" } }, "sha512-ANDTp2IHWGvsQDAY85/jQi9ZrF4mRrA5bciNHX+PUxPr4DwS6iv4h+FVWJMVwcEYdpyoIdyL+SRmHdJfQEPmwQ=="], + + "@stoplight/spectral-ref-resolver": ["@stoplight/spectral-ref-resolver@1.0.5", "", { "dependencies": { "@stoplight/json-ref-readers": "1.2.2", "@stoplight/json-ref-resolver": "~3.1.6", "@stoplight/spectral-runtime": "^1.1.2", "dependency-graph": "0.11.0", "tslib": "^2.8.1" } }, "sha512-gj3TieX5a9zMW29z3mBlAtDOCgN3GEc1VgZnCVlr5irmR4Qi5LuECuFItAq4pTn5Zu+sW5bqutsCH7D4PkpyAA=="], + + "@stoplight/spectral-rulesets": ["@stoplight/spectral-rulesets@1.22.0", "", { "dependencies": { "@asyncapi/specs": "^6.8.0", "@stoplight/better-ajv-errors": "1.0.3", "@stoplight/json": "^3.17.0", "@stoplight/spectral-core": "^1.19.4", "@stoplight/spectral-formats": "^1.8.1", "@stoplight/spectral-functions": "^1.9.1", "@stoplight/spectral-runtime": "^1.1.2", "@stoplight/types": "^13.6.0", "@types/json-schema": "^7.0.7", "ajv": "^8.17.1", "ajv-formats": "~2.1.1", "json-schema-traverse": "^1.0.0", "leven": "3.1.0", "lodash": "~4.17.21", "tslib": "^2.8.1" } }, "sha512-l2EY2jiKKLsvnPfGy+pXC0LeGsbJzcQP5G/AojHgf+cwN//VYxW1Wvv4WKFx/CLmLxc42mJYF2juwWofjWYNIQ=="], + + "@stoplight/spectral-runtime": ["@stoplight/spectral-runtime@1.1.4", "", { "dependencies": { "@stoplight/json": "^3.20.1", "@stoplight/path": "^1.3.2", "@stoplight/types": "^13.6.0", "abort-controller": "^3.0.0", "lodash": "^4.17.21", "node-fetch": "^2.7.0", "tslib": "^2.8.1" } }, "sha512-YHbhX3dqW0do6DhiPSgSGQzr6yQLlWybhKwWx0cqxjMwxej3TqLv3BXMfIUYFKKUqIwH4Q2mV8rrMM8qD2N0rQ=="], + + "@stoplight/types": ["@stoplight/types@13.20.0", "", { "dependencies": { "@types/json-schema": "^7.0.4", "utility-types": "^3.10.0" } }, "sha512-2FNTv05If7ib79VPDA/r9eUet76jewXFH2y2K5vuge6SXbRHtWBhcaRmu+6QpF4/WRNoJj5XYRSwLGXDxysBGA=="], + + "@stoplight/yaml": ["@stoplight/yaml@4.3.0", "", { "dependencies": { "@stoplight/ordered-object-literal": "^1.0.5", "@stoplight/types": "^14.1.1", "@stoplight/yaml-ast-parser": "0.0.50", "tslib": "^2.2.0" } }, "sha512-JZlVFE6/dYpP9tQmV0/ADfn32L9uFarHWxfcRhReKUnljz1ZiUM5zpX+PH8h5CJs6lao3TuFqnPm9IJJCEkE2w=="], + + "@stoplight/yaml-ast-parser": ["@stoplight/yaml-ast-parser@0.0.50", "", {}, "sha512-Pb6M8TDO9DtSVla9yXSTAxmo9GVEouq5P40DWXdOie69bXogZTkgvopCq+yEvTMA0F6PEvdJmbtTV3ccIp11VQ=="], + + "@surma/rollup-plugin-off-main-thread": ["@surma/rollup-plugin-off-main-thread@2.2.3", "", { "dependencies": { "ejs": "^3.1.6", "json5": "^2.2.0", "magic-string": "^0.25.0", "string.prototype.matchall": "^4.0.6" } }, "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ=="], + + "@svgr/babel-plugin-add-jsx-attribute": ["@svgr/babel-plugin-add-jsx-attribute@8.0.0", "", { "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g=="], + + "@svgr/babel-plugin-remove-jsx-attribute": ["@svgr/babel-plugin-remove-jsx-attribute@8.0.0", "", { "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA=="], + + "@svgr/babel-plugin-remove-jsx-empty-expression": ["@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0", "", { "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA=="], + + "@svgr/babel-plugin-replace-jsx-attribute-value": ["@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0", "", { "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ=="], + + "@svgr/babel-plugin-svg-dynamic-title": ["@svgr/babel-plugin-svg-dynamic-title@8.0.0", "", { "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og=="], + + "@svgr/babel-plugin-svg-em-dimensions": ["@svgr/babel-plugin-svg-em-dimensions@8.0.0", "", { "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g=="], + + "@svgr/babel-plugin-transform-react-native-svg": ["@svgr/babel-plugin-transform-react-native-svg@8.1.0", "", { "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q=="], + + "@svgr/babel-plugin-transform-svg-component": ["@svgr/babel-plugin-transform-svg-component@8.0.0", "", { "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw=="], + + "@svgr/babel-preset": ["@svgr/babel-preset@8.1.0", "", { "dependencies": { "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", "@svgr/babel-plugin-transform-svg-component": "8.0.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug=="], + + "@svgr/core": ["@svgr/core@8.1.0", "", { "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", "camelcase": "^6.2.0", "cosmiconfig": "^8.1.3", "snake-case": "^3.0.4" } }, "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA=="], + + "@svgr/hast-util-to-babel-ast": ["@svgr/hast-util-to-babel-ast@8.0.0", "", { "dependencies": { "@babel/types": "^7.21.3", "entities": "^4.4.0" } }, "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q=="], + + "@svgr/plugin-jsx": ["@svgr/plugin-jsx@8.1.0", "", { "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", "@svgr/hast-util-to-babel-ast": "8.0.0", "svg-parser": "^2.0.4" }, "peerDependencies": { "@svgr/core": "*" } }, "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA=="], + + "@svgr/plugin-svgo": ["@svgr/plugin-svgo@8.1.0", "", { "dependencies": { "cosmiconfig": "^8.1.3", "deepmerge": "^4.3.1", "svgo": "^3.0.2" }, "peerDependencies": { "@svgr/core": "*" } }, "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA=="], + + "@svgr/webpack": ["@svgr/webpack@8.1.0", "", { "dependencies": { "@babel/core": "^7.21.3", "@babel/plugin-transform-react-constant-elements": "^7.21.3", "@babel/preset-env": "^7.20.2", "@babel/preset-react": "^7.18.6", "@babel/preset-typescript": "^7.21.0", "@svgr/core": "8.1.0", "@svgr/plugin-jsx": "8.1.0", "@svgr/plugin-svgo": "8.1.0" } }, "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA=="], + + "@tanstack/query-core": ["@tanstack/query-core@5.83.0", "", {}, "sha512-0M8dA+amXUkyz5cVUm/B+zSk3xkQAcuXuz5/Q/LveT4ots2rBpPTZOzd7yJa2Utsf8D2Upl5KyjhHRY+9lB/XA=="], + + "@tanstack/react-query": ["@tanstack/react-query@5.83.0", "", { "dependencies": { "@tanstack/query-core": "5.83.0" }, "peerDependencies": { "react": "^18 || ^19" } }, "sha512-/XGYhZ3foc5H0VM2jLSD/NyBRIOK4q9kfeml4+0x2DlL6xVuAcVEW+hTlTapAmejObg0i3eNqhkr2dT+eciwoQ=="], + + "@tanstack/react-table": ["@tanstack/react-table@8.21.3", "", { "dependencies": { "@tanstack/table-core": "8.21.3" }, "peerDependencies": { "react": ">=16.8", "react-dom": ">=16.8" } }, "sha512-5nNMTSETP4ykGegmVkhjcS8tTLW6Vl4axfEGQN3v0zdHYbK4UfoqfPChclTrJ4EoK9QynqAu9oUf8VEmrpZ5Ww=="], + + "@tanstack/table-core": ["@tanstack/table-core@8.21.3", "", {}, "sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg=="], + + "@telegram-apps/bridge": ["@telegram-apps/bridge@2.10.3", "", { "dependencies": { "@telegram-apps/signals": "^1.1.2", "@telegram-apps/toolkit": "^2.1.3", "@telegram-apps/transformers": "^2.2.6", "@telegram-apps/types": "^2.0.3", "better-promises": "^0.4.1", "error-kid": "^0.0.7", "mitt": "^3.0.1", "valibot": "1.0.0" } }, "sha512-mjbpxynr6g5EOQlpxuKQxDN+UTrtKLWBfJQs8BLQX0dkZVL+r7nQNAVzY2NtJHLUUCA+eUccq+yF7NkesnY46g=="], + + "@telegram-apps/navigation": ["@telegram-apps/navigation@1.0.14", "", {}, "sha512-bqNgF/J8Po7ZtsELm3E1a6aPr7awwxO3sIqD8J6u12urOlGoW5+1KxKKbkPa58mgXuQdsltd8apI+OVy0IYiUA=="], + + "@telegram-apps/sdk": ["@telegram-apps/sdk@3.11.4", "", { "dependencies": { "@telegram-apps/bridge": "^2.10.3", "@telegram-apps/navigation": "^1.0.14", "@telegram-apps/signals": "^1.1.2", "@telegram-apps/toolkit": "^2.1.3", "@telegram-apps/transformers": "^2.2.6", "@telegram-apps/types": "^2.0.3", "better-promises": "^0.4.1", "error-kid": "^0.0.7", "valibot": "1.0.0" } }, "sha512-en2yRVhKJwzKfT4TOAG8fwaZHAqB2CfMCE0AY7mx55+UKlPCDdRN2BVUOxdYabUoxglJUquCUpNWr4TXIeAfng=="], + + "@telegram-apps/signals": ["@telegram-apps/signals@1.1.2", "", {}, "sha512-1P1kdCLX7MfETGPxH7f3UZKIsdE7Tz5S7QmN4Km1sbYQMakD5Bi1NecSMR7/wnHp50gWMI1JzENcMtCEmouhSg=="], + + "@telegram-apps/toolkit": ["@telegram-apps/toolkit@2.1.3", "", {}, "sha512-LPUBL7hxQTOr+Dowyk9a1O82nQS4ja4+OYiYWtvqq5nNUHC6Gbbus0zGWCbFcj9CLnIzaeb5HWOg5iSnhoRcyg=="], + + "@telegram-apps/transformers": ["@telegram-apps/transformers@2.2.6", "", { "dependencies": { "@telegram-apps/toolkit": "^2.1.3", "@telegram-apps/types": "^2.0.3", "valibot": "1.0.0-beta.14" } }, "sha512-MMBRs3demeBT9Cd614KKZmak7eEyNdEbfu99a0SwEEJe2oIODjJLrUxrhUcAOc5wvTRfrKka27VXVgruauLhdg=="], + + "@telegram-apps/types": ["@telegram-apps/types@2.0.3", "", {}, "sha512-pXh9BdnLZF3e2BGc4WL+RTRMAUpqKpaSP3Rs8rB4WyRwIoRSGWFKE4gtT/9m42LGixB8YVwdo/pJ+9XO765XEA=="], + + "@trysound/sax": ["@trysound/sax@0.2.0", "", {}, "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA=="], + + "@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="], + + "@types/babel__generator": ["@types/babel__generator@7.27.0", "", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg=="], + + "@types/babel__template": ["@types/babel__template@7.4.4", "", { "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A=="], + + "@types/babel__traverse": ["@types/babel__traverse@7.20.7", "", { "dependencies": { "@babel/types": "^7.20.7" } }, "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng=="], + + "@types/d3-array": ["@types/d3-array@3.2.1", "", {}, "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg=="], + + "@types/d3-color": ["@types/d3-color@3.1.3", "", {}, "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A=="], + + "@types/d3-ease": ["@types/d3-ease@3.0.2", "", {}, "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA=="], + + "@types/d3-interpolate": ["@types/d3-interpolate@3.0.4", "", { "dependencies": { "@types/d3-color": "*" } }, "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA=="], + + "@types/d3-path": ["@types/d3-path@3.1.1", "", {}, "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg=="], + + "@types/d3-scale": ["@types/d3-scale@4.0.9", "", { "dependencies": { "@types/d3-time": "*" } }, "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw=="], + + "@types/d3-shape": ["@types/d3-shape@3.1.7", "", { "dependencies": { "@types/d3-path": "*" } }, "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg=="], + + "@types/d3-time": ["@types/d3-time@3.0.4", "", {}, "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g=="], + + "@types/d3-timer": ["@types/d3-timer@3.0.2", "", {}, "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw=="], + + "@types/es-aggregate-error": ["@types/es-aggregate-error@1.0.6", "", { "dependencies": { "@types/node": "*" } }, "sha512-qJ7LIFp06h1QE1aVxbVd+zJP2wdaugYXYfd6JxsyRMrYHaxb6itXPogW2tz+ylUJ1n1b+JF1PHyYCfYHm0dvUg=="], + + "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + + "@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="], + + "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], + + "@types/lodash": ["@types/lodash@4.17.20", "", {}, "sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA=="], + + "@types/lodash.debounce": ["@types/lodash.debounce@4.0.9", "", { "dependencies": { "@types/lodash": "*" } }, "sha512-Ma5JcgTREwpLRwMM+XwBR7DaWe96nC38uCBDFKZWbNKD+osjVzdpnUSwBcqCptrp16sSOLBAUb50Car5I0TCsQ=="], + + "@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="], + + "@types/node": ["@types/node@20.19.7", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-1GM9z6BJOv86qkPvzh2i6VW5+VVrXxCLknfmTkWEqz+6DqosiY28XUWCTmBcJ0ACzKqx/iwdIREfo1fwExIlkA=="], + + "@types/prop-types": ["@types/prop-types@15.7.15", "", {}, "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw=="], + + "@types/react": ["@types/react@18.3.23", "", { "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" } }, "sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w=="], + + "@types/react-dom": ["@types/react-dom@18.3.7", "", { "peerDependencies": { "@types/react": "^18.0.0" } }, "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ=="], + + "@types/resolve": ["@types/resolve@1.20.2", "", {}, "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q=="], + + "@types/trusted-types": ["@types/trusted-types@2.0.7", "", {}, "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="], + + "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], + + "@types/urijs": ["@types/urijs@1.19.25", "", {}, "sha512-XOfUup9r3Y06nFAZh3WvO0rBU4OtlfPB/vgxpjg+NRdGU6CN6djdc6OEiH+PcqHCY6eFLo9Ista73uarf4gnBg=="], + + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.36.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.36.0", "@typescript-eslint/type-utils": "8.36.0", "@typescript-eslint/utils": "8.36.0", "@typescript-eslint/visitor-keys": "8.36.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.36.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-lZNihHUVB6ZZiPBNgOQGSxUASI7UJWhT8nHyUGCnaQ28XFCw98IfrMCG3rUl1uwUWoAvodJQby2KTs79UTcrAg=="], + + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.36.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.36.0", "@typescript-eslint/types": "8.36.0", "@typescript-eslint/typescript-estree": "8.36.0", "@typescript-eslint/visitor-keys": "8.36.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-FuYgkHwZLuPbZjQHzJXrtXreJdFMKl16BFYyRrLxDhWr6Qr7Kbcu2s1Yhu8tsiMXw1S0W1pjfFfYEt+R604s+Q=="], + + "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.36.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.36.0", "@typescript-eslint/types": "^8.36.0", "debug": "^4.3.4" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-JAhQFIABkWccQYeLMrHadu/fhpzmSQ1F1KXkpzqiVxA/iYI6UnRt2trqXHt1sYEcw1mxLnB9rKMsOxXPxowN/g=="], + + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.36.0", "", { "dependencies": { "@typescript-eslint/types": "8.36.0", "@typescript-eslint/visitor-keys": "8.36.0" } }, "sha512-wCnapIKnDkN62fYtTGv2+RY8FlnBYA3tNm0fm91kc2BjPhV2vIjwwozJ7LToaLAyb1ca8BxrS7vT+Pvvf7RvqA=="], + + "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.36.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-Nhh3TIEgN18mNbdXpd5Q8mSCBnrZQeY9V7Ca3dqYvNDStNIGRmJA6dmrIPMJ0kow3C7gcQbpsG2rPzy1Ks/AnA=="], + + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.36.0", "", { "dependencies": { "@typescript-eslint/typescript-estree": "8.36.0", "@typescript-eslint/utils": "8.36.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-5aaGYG8cVDd6cxfk/ynpYzxBRZJk7w/ymto6uiyUFtdCozQIsQWh7M28/6r57Fwkbweng8qAzoMCPwSJfWlmsg=="], + + "@typescript-eslint/types": ["@typescript-eslint/types@8.36.0", "", {}, "sha512-xGms6l5cTJKQPZOKM75Dl9yBfNdGeLRsIyufewnxT4vZTrjC0ImQT4fj8QmtJK84F58uSh5HVBSANwcfiXxABQ=="], + + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.36.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.36.0", "@typescript-eslint/tsconfig-utils": "8.36.0", "@typescript-eslint/types": "8.36.0", "@typescript-eslint/visitor-keys": "8.36.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-JaS8bDVrfVJX4av0jLpe4ye0BpAaUW7+tnS4Y4ETa3q7NoZgzYbN9zDQTJ8kPb5fQ4n0hliAt9tA4Pfs2zA2Hg=="], + + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.36.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.36.0", "@typescript-eslint/types": "8.36.0", "@typescript-eslint/typescript-estree": "8.36.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-VOqmHu42aEMT+P2qYjylw6zP/3E/HvptRwdn/PZxyV27KhZg2IOszXod4NcXisWzPAGSS4trE/g4moNj6XmH2g=="], + + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.36.0", "", { "dependencies": { "@typescript-eslint/types": "8.36.0", "eslint-visitor-keys": "^4.2.1" } }, "sha512-vZrhV2lRPWDuGoxcmrzRZyxAggPL+qp3WzUrlZD+slFueDiYHxeBa34dUXPuC0RmGKzl4lS5kFJYvKCq9cnNDA=="], + + "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="], + + "@vitejs/plugin-react": ["@vitejs/plugin-react@4.6.0", "", { "dependencies": { "@babel/core": "^7.27.4", "@babel/plugin-transform-react-jsx-self": "^7.27.1", "@babel/plugin-transform-react-jsx-source": "^7.27.1", "@rolldown/pluginutils": "1.0.0-beta.19", "@types/babel__core": "^7.20.5", "react-refresh": "^0.17.0" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" } }, "sha512-5Kgff+m8e2PB+9j51eGHEpn5kUzRKH2Ry0qGoe8ItJg7pqnkPrYPkDQZGgGmTa0EGarHrkjLvOdU3b1fzI8otQ=="], + + "abort-controller": ["abort-controller@3.0.0", "", { "dependencies": { "event-target-shim": "^5.0.0" } }, "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg=="], + + "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], + + "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], + + "ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], + + "ajv-draft-04": ["ajv-draft-04@1.0.0", "", { "peerDependencies": { "ajv": "^8.5.0" }, "optionalPeers": ["ajv"] }, "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw=="], + + "ajv-errors": ["ajv-errors@3.0.0", "", { "peerDependencies": { "ajv": "^8.0.1" } }, "sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ=="], + + "ajv-formats": ["ajv-formats@2.1.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA=="], + + "ansi-colors": ["ansi-colors@4.1.3", "", {}, "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw=="], + + "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "any-promise": ["any-promise@1.3.0", "", {}, "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="], + + "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], + + "arg": ["arg@5.0.2", "", {}, "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="], + + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + + "aria-hidden": ["aria-hidden@1.2.6", "", { "dependencies": { "tslib": "^2.0.0" } }, "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA=="], + + "array-buffer-byte-length": ["array-buffer-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "is-array-buffer": "^3.0.5" } }, "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw=="], + + "array-union": ["array-union@2.1.0", "", {}, "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="], + + "arraybuffer.prototype.slice": ["arraybuffer.prototype.slice@1.0.4", "", { "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "is-array-buffer": "^3.0.4" } }, "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ=="], + + "astring": ["astring@1.9.0", "", { "bin": { "astring": "bin/astring" } }, "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg=="], + + "async": ["async@3.2.6", "", {}, "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA=="], + + "async-function": ["async-function@1.0.0", "", {}, "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA=="], + + "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], + + "at-least-node": ["at-least-node@1.0.0", "", {}, "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg=="], + + "autoprefixer": ["autoprefixer@10.4.21", "", { "dependencies": { "browserslist": "^4.24.4", "caniuse-lite": "^1.0.30001702", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.1.0" }, "bin": { "autoprefixer": "bin/autoprefixer" } }, "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ=="], + + "available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="], + + "axios": ["axios@1.10.0", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw=="], + + "babel-dead-code-elimination": ["babel-dead-code-elimination@1.0.10", "", { "dependencies": { "@babel/core": "^7.23.7", "@babel/parser": "^7.23.6", "@babel/traverse": "^7.23.7", "@babel/types": "^7.23.6" } }, "sha512-DV5bdJZTzZ0zn0DC24v3jD7Mnidh6xhKa4GfKCbq3sfW8kaWhDdZjP3i81geA8T33tdYqWKw4D3fVv0CwEgKVA=="], + + "babel-plugin-polyfill-corejs2": ["babel-plugin-polyfill-corejs2@0.4.14", "", { "dependencies": { "@babel/compat-data": "^7.27.7", "@babel/helper-define-polyfill-provider": "^0.6.5", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg=="], + + "babel-plugin-polyfill-corejs3": ["babel-plugin-polyfill-corejs3@0.13.0", "", { "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.5", "core-js-compat": "^3.43.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A=="], + + "babel-plugin-polyfill-regenerator": ["babel-plugin-polyfill-regenerator@0.6.5", "", { "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.5" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg=="], + + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "better-promises": ["better-promises@0.4.1", "", { "dependencies": { "error-kid": "^0.0.7" } }, "sha512-cDW7eMvhvCoWzSih5o/OxsAgTUfP05yGMq77xNZUTmcZoNU9vEeFZJ+yJJi4lnocvxFrVFKsG0Yxt7ZnuYJEig=="], + + "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], + + "boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="], + + "brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + + "browserslist": ["browserslist@4.25.1", "", { "dependencies": { "caniuse-lite": "^1.0.30001726", "electron-to-chromium": "^1.5.173", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw=="], + + "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], + + "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="], + + "call-bind": ["call-bind@1.0.8", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.2" } }, "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww=="], + + "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], + + "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], + + "call-me-maybe": ["call-me-maybe@1.0.2", "", {}, "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ=="], + + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], + + "camelcase": ["camelcase@6.3.0", "", {}, "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA=="], + + "camelcase-css": ["camelcase-css@2.0.1", "", {}, "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA=="], + + "caniuse-lite": ["caniuse-lite@1.0.30001727", "", {}, "sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q=="], + + "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="], + + "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "character-entities-html4": ["character-entities-html4@2.1.0", "", {}, "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA=="], + + "character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="], + + "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], + + "class-variance-authority": ["class-variance-authority@0.7.1", "", { "dependencies": { "clsx": "^2.1.1" } }, "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg=="], + + "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + + "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], + + "cmdk": ["cmdk@1.1.1", "", { "dependencies": { "@radix-ui/react-compose-refs": "^1.1.1", "@radix-ui/react-dialog": "^1.1.6", "@radix-ui/react-id": "^1.1.0", "@radix-ui/react-primitive": "^2.0.2" }, "peerDependencies": { "react": "^18 || ^19 || ^19.0.0-rc", "react-dom": "^18 || ^19 || ^19.0.0-rc" } }, "sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg=="], + + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], + + "comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="], + + "commander": ["commander@9.5.0", "", {}, "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ=="], + + "common-tags": ["common-tags@1.8.2", "", {}, "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA=="], + + "compare-versions": ["compare-versions@6.1.1", "", {}, "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg=="], + + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + + "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], + + "cookie": ["cookie@1.0.2", "", {}, "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA=="], + + "core-js-compat": ["core-js-compat@3.44.0", "", { "dependencies": { "browserslist": "^4.25.1" } }, "sha512-JepmAj2zfl6ogy34qfWtcE7nHKAJnKsQFRn++scjVS2bZFllwptzw61BZcZFYBPpUznLfAvh0LGhxKppk04ClA=="], + + "cosmiconfig": ["cosmiconfig@8.3.6", "", { "dependencies": { "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "parse-json": "^5.2.0", "path-type": "^4.0.0" }, "peerDependencies": { "typescript": ">=4.9.5" }, "optionalPeers": ["typescript"] }, "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA=="], + + "cross-env": ["cross-env@7.0.3", "", { "dependencies": { "cross-spawn": "^7.0.1" }, "bin": { "cross-env": "src/bin/cross-env.js", "cross-env-shell": "src/bin/cross-env-shell.js" } }, "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw=="], + + "cross-fetch": ["cross-fetch@4.0.0", "", { "dependencies": { "node-fetch": "^2.6.12" } }, "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g=="], + + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "crypto-random-string": ["crypto-random-string@2.0.0", "", {}, "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA=="], + + "css-select": ["css-select@5.2.2", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", "domhandler": "^5.0.2", "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw=="], + + "css-tree": ["css-tree@2.3.1", "", { "dependencies": { "mdn-data": "2.0.30", "source-map-js": "^1.0.1" } }, "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw=="], + + "css-what": ["css-what@6.2.2", "", {}, "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA=="], + + "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], + + "csso": ["csso@5.0.5", "", { "dependencies": { "css-tree": "~2.2.0" } }, "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ=="], + + "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], + + "d3-array": ["d3-array@3.2.4", "", { "dependencies": { "internmap": "1 - 2" } }, "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg=="], + + "d3-color": ["d3-color@3.1.0", "", {}, "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA=="], + + "d3-ease": ["d3-ease@3.0.1", "", {}, "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w=="], + + "d3-format": ["d3-format@3.1.0", "", {}, "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA=="], + + "d3-interpolate": ["d3-interpolate@3.0.1", "", { "dependencies": { "d3-color": "1 - 3" } }, "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g=="], + + "d3-path": ["d3-path@3.1.0", "", {}, "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ=="], + + "d3-scale": ["d3-scale@4.0.2", "", { "dependencies": { "d3-array": "2.10.0 - 3", "d3-format": "1 - 3", "d3-interpolate": "1.2.0 - 3", "d3-time": "2.1.1 - 3", "d3-time-format": "2 - 4" } }, "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ=="], + + "d3-shape": ["d3-shape@3.2.0", "", { "dependencies": { "d3-path": "^3.1.0" } }, "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA=="], + + "d3-time": ["d3-time@3.1.0", "", { "dependencies": { "d3-array": "2 - 3" } }, "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q=="], + + "d3-time-format": ["d3-time-format@4.1.0", "", { "dependencies": { "d3-time": "1 - 3" } }, "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg=="], + + "d3-timer": ["d3-timer@3.0.1", "", {}, "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA=="], + + "data-view-buffer": ["data-view-buffer@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ=="], + + "data-view-byte-length": ["data-view-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ=="], + + "data-view-byte-offset": ["data-view-byte-offset@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" } }, "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ=="], + + "date-fns": ["date-fns@4.1.0", "", {}, "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg=="], + + "date-fns-jalali": ["date-fns-jalali@4.1.0-0", "", {}, "sha512-hTIP/z+t+qKwBDcmmsnmjWTduxCg+5KfdqWQvb2X/8C9+knYY6epN/pfxdDuyVlSVeFz0sM5eEfwIUQ70U4ckg=="], + + "dayjs": ["dayjs@1.11.13", "", {}, "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg=="], + + "debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], + + "decimal.js-light": ["decimal.js-light@2.5.1", "", {}, "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg=="], + + "dedent": ["dedent@1.6.0", "", { "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, "optionalPeers": ["babel-plugin-macros"] }, "sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA=="], + + "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], + + "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="], + + "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="], + + "define-properties": ["define-properties@1.2.1", "", { "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="], + + "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], + + "dependency-graph": ["dependency-graph@0.11.0", "", {}, "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg=="], + + "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], + + "destr": ["destr@2.0.5", "", {}, "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA=="], + + "detect-node-es": ["detect-node-es@1.1.0", "", {}, "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="], + + "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="], + + "didyoumean": ["didyoumean@1.2.2", "", {}, "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw=="], + + "dir-glob": ["dir-glob@3.0.1", "", { "dependencies": { "path-type": "^4.0.0" } }, "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA=="], + + "dlv": ["dlv@1.1.3", "", {}, "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="], + + "dom-helpers": ["dom-helpers@5.2.1", "", { "dependencies": { "@babel/runtime": "^7.8.7", "csstype": "^3.0.2" } }, "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA=="], + + "dom-serializer": ["dom-serializer@2.0.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", "entities": "^4.2.0" } }, "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg=="], + + "domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="], + + "domhandler": ["domhandler@5.0.3", "", { "dependencies": { "domelementtype": "^2.3.0" } }, "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w=="], + + "domutils": ["domutils@3.2.2", "", { "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3" } }, "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw=="], + + "dot-case": ["dot-case@3.0.4", "", { "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w=="], + + "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], + + "eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], + + "ejs": ["ejs@3.1.10", "", { "dependencies": { "jake": "^10.8.5" }, "bin": { "ejs": "bin/cli.js" } }, "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA=="], + + "electron-to-chromium": ["electron-to-chromium@1.5.182", "", {}, "sha512-Lv65Btwv9W4J9pyODI6EWpdnhfvrve/us5h1WspW8B2Fb0366REPtY3hX7ounk1CkV/TBjWCEvCBBbYbmV0qCA=="], + + "embla-carousel": ["embla-carousel@8.6.0", "", {}, "sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA=="], + + "embla-carousel-react": ["embla-carousel-react@8.6.0", "", { "dependencies": { "embla-carousel": "8.6.0", "embla-carousel-reactive-utils": "8.6.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.1 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-0/PjqU7geVmo6F734pmPqpyHqiM99olvyecY7zdweCw+6tKEXnrE90pBiBbMMU8s5tICemzpQ3hi5EpxzGW+JA=="], + + "embla-carousel-reactive-utils": ["embla-carousel-reactive-utils@8.6.0", "", { "peerDependencies": { "embla-carousel": "8.6.0" } }, "sha512-fMVUDUEx0/uIEDM0Mz3dHznDhfX+znCCDCeIophYb1QGVM7YThSWX+wz11zlYwWFOr74b4QLGg0hrGPJeG2s4A=="], + + "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "emoji-regex-xs": ["emoji-regex-xs@1.0.0", "", {}, "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg=="], + + "enquirer": ["enquirer@2.4.1", "", { "dependencies": { "ansi-colors": "^4.1.1", "strip-ansi": "^6.0.1" } }, "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ=="], + + "entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], + + "err-code": ["err-code@2.0.3", "", {}, "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA=="], + + "error-ex": ["error-ex@1.3.2", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g=="], + + "error-kid": ["error-kid@0.0.7", "", {}, "sha512-8mFs7ZaDWlBFgjOy4lHLMCe2+KZfZXGx5GOgh2VQ/M1CCIvSWzbl2OMl+5fdZgrgoUfhTeF+NPhmqfEvUhN8yw=="], + + "es-abstract": ["es-abstract@1.24.0", "", { "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", "get-intrinsic": "^1.3.0", "get-proto": "^1.0.1", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "internal-slot": "^1.1.0", "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", "is-negative-zero": "^2.0.3", "is-regex": "^1.2.1", "is-set": "^2.0.3", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", "is-weakref": "^1.1.1", "math-intrinsics": "^1.1.0", "object-inspect": "^1.13.4", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", "regexp.prototype.flags": "^1.5.4", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", "stop-iteration-iterator": "^1.1.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.3", "typed-array-byte-length": "^1.0.3", "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", "which-typed-array": "^1.1.19" } }, "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg=="], + + "es-aggregate-error": ["es-aggregate-error@1.0.14", "", { "dependencies": { "define-data-property": "^1.1.4", "define-properties": "^1.2.1", "es-abstract": "^1.24.0", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "globalthis": "^1.0.4", "has-property-descriptors": "^1.0.2", "set-function-name": "^2.0.2" } }, "sha512-3YxX6rVb07B5TV11AV5wsL7nQCHXNwoHPsQC8S4AmBiqYhyNCJ5BRKXkXyDJvs8QzXN20NgRtxe3dEEQD9NLHA=="], + + "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], + + "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], + + "es-module-lexer": ["es-module-lexer@1.7.0", "", {}, "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA=="], + + "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], + + "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], + + "es-to-primitive": ["es-to-primitive@1.3.0", "", { "dependencies": { "is-callable": "^1.2.7", "is-date-object": "^1.0.5", "is-symbol": "^1.0.4" } }, "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g=="], + + "es-toolkit": ["es-toolkit@1.39.7", "", {}, "sha512-ek/wWryKouBrZIjkwW2BFf91CWOIMvoy2AE5YYgUrfWsJQM2Su1LoLtrw8uusEpN9RfqLlV/0FVNjT0WMv8Bxw=="], + + "es6-promise": ["es6-promise@3.3.1", "", {}, "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg=="], + + "esbuild": ["esbuild@0.25.6", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.6", "@esbuild/android-arm": "0.25.6", "@esbuild/android-arm64": "0.25.6", "@esbuild/android-x64": "0.25.6", "@esbuild/darwin-arm64": "0.25.6", "@esbuild/darwin-x64": "0.25.6", "@esbuild/freebsd-arm64": "0.25.6", "@esbuild/freebsd-x64": "0.25.6", "@esbuild/linux-arm": "0.25.6", "@esbuild/linux-arm64": "0.25.6", "@esbuild/linux-ia32": "0.25.6", "@esbuild/linux-loong64": "0.25.6", "@esbuild/linux-mips64el": "0.25.6", "@esbuild/linux-ppc64": "0.25.6", "@esbuild/linux-riscv64": "0.25.6", "@esbuild/linux-s390x": "0.25.6", "@esbuild/linux-x64": "0.25.6", "@esbuild/netbsd-arm64": "0.25.6", "@esbuild/netbsd-x64": "0.25.6", "@esbuild/openbsd-arm64": "0.25.6", "@esbuild/openbsd-x64": "0.25.6", "@esbuild/openharmony-arm64": "0.25.6", "@esbuild/sunos-x64": "0.25.6", "@esbuild/win32-arm64": "0.25.6", "@esbuild/win32-ia32": "0.25.6", "@esbuild/win32-x64": "0.25.6" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-GVuzuUwtdsghE3ocJ9Bs8PNoF13HNQ5TXbEi2AhvVb8xU1Iwt9Fos9FEamfoee+u/TOsn7GUWc04lz46n2bbTg=="], + + "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], + + "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="], + + "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], + + "eslint": ["eslint@9.31.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.0", "@eslint/config-helpers": "^0.3.0", "@eslint/core": "^0.15.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.31.0", "@eslint/plugin-kit": "^0.3.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@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.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.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" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-QldCVh/ztyKJJZLr4jXNUByx3gR+TDYZCRXEktiZoUR3PGy4qCmSbkxcIle8GEwGpb5JBZazlaJ/CxLidXdEbQ=="], + + "eslint-plugin-react-hooks": ["eslint-plugin-react-hooks@5.2.0", "", { "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg=="], + + "eslint-plugin-react-refresh": ["eslint-plugin-react-refresh@0.4.20", "", { "peerDependencies": { "eslint": ">=8.40" } }, "sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA=="], + + "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], + + "eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + + "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], + + "esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="], + + "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], + + "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], + + "estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], + + "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], + + "event-target-shim": ["event-target-shim@5.0.1", "", {}, "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="], + + "eventemitter3": ["eventemitter3@4.0.7", "", {}, "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="], + + "eventsource": ["eventsource@3.0.7", "", { "dependencies": { "eventsource-parser": "^3.0.1" } }, "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA=="], + + "eventsource-parser": ["eventsource-parser@3.0.3", "", {}, "sha512-nVpZkTMM9rF6AQ9gPJpFsNAMt48wIzB5TQgiTLdHiuO8XEDhUgZEhqKlZWXbIzo9VmJ/HvysHqEaVeD5v9TPvA=="], + + "execa": ["execa@5.1.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="], + + "exit-hook": ["exit-hook@2.2.1", "", {}, "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw=="], + + "fancy-ansi": ["fancy-ansi@0.1.3", "", { "dependencies": { "escape-html": "^1.0.3" } }, "sha512-tRQVTo5jjdSIiydqgzIIEZpKddzSsfGLsSVt6vWdjVm7fbvDTiQkyoPu6Z3dIPlAM4OZk0jP5jmTCX4G8WGgBw=="], + + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], + + "fast-equals": ["fast-equals@5.2.2", "", {}, "sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw=="], + + "fast-glob": ["fast-glob@3.3.3", "", { "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" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], + + "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], + + "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], + + "fast-memoize": ["fast-memoize@2.5.2", "", {}, "sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw=="], + + "fast-safe-stringify": ["fast-safe-stringify@2.1.1", "", {}, "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA=="], + + "fast-uri": ["fast-uri@3.0.6", "", {}, "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw=="], + + "fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="], + + "fdir": ["fdir@6.4.6", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w=="], + + "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], + + "filelist": ["filelist@1.0.4", "", { "dependencies": { "minimatch": "^5.0.1" } }, "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q=="], + + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], + + "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], + + "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], + + "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="], + + "follow-redirects": ["follow-redirects@1.15.9", "", {}, "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ=="], + + "for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="], + + "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], + + "form-data": ["form-data@4.0.3", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA=="], + + "fraction.js": ["fraction.js@4.3.7", "", {}, "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew=="], + + "fs-extra": ["fs-extra@11.3.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew=="], + + "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="], + + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + + "function.prototype.name": ["function.prototype.name@1.1.8", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "functions-have-names": "^1.2.3", "hasown": "^2.0.2", "is-callable": "^1.2.7" } }, "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q=="], + + "functions-have-names": ["functions-have-names@1.2.3", "", {}, "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="], + + "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], + + "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], + + "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], + + "get-nonce": ["get-nonce@1.0.1", "", {}, "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q=="], + + "get-own-enumerable-property-symbols": ["get-own-enumerable-property-symbols@3.0.2", "", {}, "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g=="], + + "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], + + "get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="], + + "get-symbol-description": ["get-symbol-description@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6" } }, "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg=="], + + "github-buttons": ["github-buttons@2.29.1", "", {}, "sha512-TV3YgAKda5hPz75n7QXmGCsSzgVya1vvmBieebg3EB5ScmashTZ0FldViG1aU2d4V5rcAGrtQ7k5uAaCo0A4PA=="], + + "glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="], + + "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], + + "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], + + "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], + + "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], + + "globrex": ["globrex@0.1.2", "", {}, "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg=="], + + "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], + + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + + "graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="], + + "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="], + + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], + + "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="], + + "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], + + "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], + + "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + + "hast-util-to-html": ["hast-util-to-html@9.0.5", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-whitespace": "^3.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "stringify-entities": "^4.0.0", "zwitch": "^2.0.4" } }, "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw=="], + + "hast-util-whitespace": ["hast-util-whitespace@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw=="], + + "hosted-git-info": ["hosted-git-info@6.1.3", "", { "dependencies": { "lru-cache": "^7.5.1" } }, "sha512-HVJyzUrLIL1c0QmviVh5E8VGyUS7xCFPS6yydaVd1UegW+ibV/CohqTH9MkOLDp5o+rb82DMo77PTuc9F/8GKw=="], + + "html-parse-stringify": ["html-parse-stringify@3.0.1", "", { "dependencies": { "void-elements": "3.1.0" } }, "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg=="], + + "html-void-elements": ["html-void-elements@3.0.0", "", {}, "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg=="], + + "http2-client": ["http2-client@1.3.5", "", {}, "sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA=="], + + "human-signals": ["human-signals@2.1.0", "", {}, "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="], + + "i18next": ["i18next@24.2.3", "", { "dependencies": { "@babel/runtime": "^7.26.10" }, "peerDependencies": { "typescript": "^5" }, "optionalPeers": ["typescript"] }, "sha512-lfbf80OzkocvX7nmZtu7nSTNbrTYR52sLWxPtlXX1zAhVw8WEnFk4puUkCR4B1dNQwbSpEHHHemcZu//7EcB7A=="], + + "i18next-browser-languagedetector": ["i18next-browser-languagedetector@8.2.0", "", { "dependencies": { "@babel/runtime": "^7.23.2" } }, "sha512-P+3zEKLnOF0qmiesW383vsLdtQVyKtCNA9cjSoKCppTKPQVfKd2W8hbVo5ZhNJKDqeM7BOcvNoKJOjpHh4Js9g=="], + + "i18next-http-backend": ["i18next-http-backend@3.0.2", "", { "dependencies": { "cross-fetch": "4.0.0" } }, "sha512-PdlvPnvIp4E1sYi46Ik4tBYh/v/NbYfFFgTjkwFl0is8A18s7/bx9aXqsrOax9WUbeNS6mD2oix7Z0yGGf6m5g=="], + + "idb": ["idb@7.1.1", "", {}, "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ=="], + + "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "immer": ["immer@9.0.21", "", {}, "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA=="], + + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], + + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], + + "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="], + + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + + "internal-slot": ["internal-slot@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw=="], + + "internmap": ["internmap@2.0.3", "", {}, "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg=="], + + "is-array-buffer": ["is-array-buffer@3.0.5", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A=="], + + "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], + + "is-async-function": ["is-async-function@2.1.1", "", { "dependencies": { "async-function": "^1.0.0", "call-bound": "^1.0.3", "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ=="], + + "is-bigint": ["is-bigint@1.1.0", "", { "dependencies": { "has-bigints": "^1.0.2" } }, "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ=="], + + "is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="], + + "is-boolean-object": ["is-boolean-object@1.2.2", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A=="], + + "is-callable": ["is-callable@1.2.7", "", {}, "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="], + + "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], + + "is-data-view": ["is-data-view@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" } }, "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw=="], + + "is-date-object": ["is-date-object@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg=="], + + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], + + "is-finalizationregistry": ["is-finalizationregistry@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg=="], + + "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + + "is-generator-function": ["is-generator-function@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "get-proto": "^1.0.0", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ=="], + + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + + "is-map": ["is-map@2.0.3", "", {}, "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw=="], + + "is-module": ["is-module@1.0.0", "", {}, "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g=="], + + "is-negative-zero": ["is-negative-zero@2.0.3", "", {}, "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw=="], + + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + + "is-number-object": ["is-number-object@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw=="], + + "is-obj": ["is-obj@1.0.1", "", {}, "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg=="], + + "is-regex": ["is-regex@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g=="], + + "is-regexp": ["is-regexp@1.0.0", "", {}, "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA=="], + + "is-set": ["is-set@2.0.3", "", {}, "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg=="], + + "is-shared-array-buffer": ["is-shared-array-buffer@1.0.4", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A=="], + + "is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="], + + "is-string": ["is-string@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA=="], + + "is-symbol": ["is-symbol@1.1.1", "", { "dependencies": { "call-bound": "^1.0.2", "has-symbols": "^1.1.0", "safe-regex-test": "^1.1.0" } }, "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w=="], + + "is-typed-array": ["is-typed-array@1.1.15", "", { "dependencies": { "which-typed-array": "^1.1.16" } }, "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ=="], + + "is-weakmap": ["is-weakmap@2.0.2", "", {}, "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w=="], + + "is-weakref": ["is-weakref@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew=="], + + "is-weakset": ["is-weakset@2.0.4", "", { "dependencies": { "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ=="], + + "isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], + + "isbot": ["isbot@5.1.28", "", {}, "sha512-qrOp4g3xj8YNse4biorv6O5ZShwsJM0trsoda4y7j/Su7ZtTTfVXFzbKkpgcSoDrHS8FcTuUwcU04YimZlZOxw=="], + + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], + + "jake": ["jake@10.9.2", "", { "dependencies": { "async": "^3.2.3", "chalk": "^4.0.2", "filelist": "^1.0.4", "minimatch": "^3.1.2" }, "bin": { "jake": "bin/cli.js" } }, "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA=="], + + "jiti": ["jiti@1.21.7", "", { "bin": { "jiti": "bin/jiti.js" } }, "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A=="], + + "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + + "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], + + "jsep": ["jsep@1.4.0", "", {}, "sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw=="], + + "jsesc": ["jsesc@3.0.2", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g=="], + + "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], + + "json-parse-even-better-errors": ["json-parse-even-better-errors@3.0.2", "", {}, "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ=="], + + "json-schema": ["json-schema@0.4.0", "", {}, "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="], + + "json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + + "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], + + "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], + + "jsonc-parser": ["jsonc-parser@2.2.1", "", {}, "sha512-o6/yDBYccGvTz1+QFevz6l6OBZ2+fMVu2JZ9CIhzsYRX4mjaK5IyX9eldUdCmga16zlgQxyrj5pt9kzuj2C02w=="], + + "jsonfile": ["jsonfile@6.1.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ=="], + + "jsonpath-plus": ["jsonpath-plus@10.3.0", "", { "dependencies": { "@jsep-plugin/assignment": "^1.3.0", "@jsep-plugin/regex": "^1.0.4", "jsep": "^1.4.0" }, "bin": { "jsonpath": "bin/jsonpath-cli.js", "jsonpath-plus": "bin/jsonpath-cli.js" } }, "sha512-8TNmfeTCk2Le33A3vRRwtuworG/L5RrgMvdjhKZxvyShO+mBu2fP50OWUjRLNtvw344DdDarFh9buFAZs5ujeA=="], + + "jsonpointer": ["jsonpointer@5.0.1", "", {}, "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ=="], + + "jsonschema": ["jsonschema@1.5.0", "", {}, "sha512-K+A9hhqbn0f3pJX17Q/7H6yQfD/5OXgdrR5UE12gMXCiN9D5Xq2o5mddV2QEcX/bjla99ASsAAQUyMCCRWAEhw=="], + + "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], + + "leven": ["leven@3.1.0", "", {}, "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A=="], + + "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], + + "lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="], + + "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], + + "linkify-it": ["linkify-it@5.0.0", "", { "dependencies": { "uc.micro": "^2.0.0" } }, "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ=="], + + "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], + + "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], + + "lodash.debounce": ["lodash.debounce@4.0.8", "", {}, "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="], + + "lodash.get": ["lodash.get@4.4.2", "", {}, "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ=="], + + "lodash.isempty": ["lodash.isempty@4.4.0", "", {}, "sha512-oKMuF3xEeqDltrGMfDxAPGIVMSSRv8tbRSODbrs4KGsRRLEhrW8N8Rd4DRgB2+621hY8A8XwwrTVhXWpxFvMzg=="], + + "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], + + "lodash.omit": ["lodash.omit@4.5.0", "", {}, "sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg=="], + + "lodash.omitby": ["lodash.omitby@4.6.0", "", {}, "sha512-5OrRcIVR75M288p4nbI2WLAf3ndw2GD9fyNv3Bc15+WCxJDdZ4lYndSxGd7hnG6PVjiJTeJE2dHEGhIuKGicIQ=="], + + "lodash.sortby": ["lodash.sortby@4.7.0", "", {}, "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA=="], + + "lodash.topath": ["lodash.topath@4.5.2", "", {}, "sha512-1/W4dM+35DwvE/iEd1M9ekewOSTlpFekhw9mhAtrwjVqUr83/ilQiyAvmg4tVX7Unkcfl1KC+i9WdaT4B6aQcg=="], + + "lodash.uniq": ["lodash.uniq@4.5.0", "", {}, "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ=="], + + "lodash.uniqby": ["lodash.uniqby@4.7.0", "", {}, "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww=="], + + "lodash.uniqwith": ["lodash.uniqwith@4.5.0", "", {}, "sha512-7lYL8bLopMoy4CTICbxygAUq6CdRJ36vFc80DucPueUee+d5NBRxz3FdT9Pes/HEx5mPoT9jwnsEJWz1N7uq7Q=="], + + "loglevel": ["loglevel@1.9.2", "", {}, "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg=="], + + "loglevel-plugin-prefix": ["loglevel-plugin-prefix@0.8.4", "", {}, "sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g=="], + + "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="], + + "lower-case": ["lower-case@2.0.2", "", { "dependencies": { "tslib": "^2.0.3" } }, "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg=="], + + "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], + + "lucide-react": ["lucide-react@0.465.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc" } }, "sha512-uV7WEqbwaCcc+QjAxIhAvkAr3kgwkkYID3XptCHll72/F7NZlk6ONmJYpk+Xqx5Q0r/8wiOjz73H1BYbl8Z8iw=="], + + "lunr": ["lunr@2.3.9", "", {}, "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow=="], + + "magic-string": ["magic-string@0.25.9", "", { "dependencies": { "sourcemap-codec": "^1.4.8" } }, "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ=="], + + "markdown-it": ["markdown-it@14.1.0", "", { "dependencies": { "argparse": "^2.0.1", "entities": "^4.4.0", "linkify-it": "^5.0.0", "mdurl": "^2.0.0", "punycode.js": "^2.3.1", "uc.micro": "^2.1.0" }, "bin": { "markdown-it": "bin/markdown-it.mjs" } }, "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg=="], + + "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], + + "mdast-util-to-hast": ["mdast-util-to-hast@13.2.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@ungap/structured-clone": "^1.0.0", "devlop": "^1.0.0", "micromark-util-sanitize-uri": "^2.0.0", "trim-lines": "^3.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA=="], + + "mdn-data": ["mdn-data@2.0.30", "", {}, "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA=="], + + "mdurl": ["mdurl@2.0.0", "", {}, "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w=="], + + "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="], + + "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], + + "micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-util-encode": ["micromark-util-encode@2.0.1", "", {}, "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw=="], + + "micromark-util-sanitize-uri": ["micromark-util-sanitize-uri@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ=="], + + "micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-util-types": ["micromark-util-types@2.0.2", "", {}, "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA=="], + + "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + + "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + + "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="], + + "minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + + "mitt": ["mitt@3.0.1", "", {}, "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw=="], + + "monaco-editor": ["monaco-editor@0.52.2", "", {}, "sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "mz": ["mz@2.7.0", "", { "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", "thenify-all": "^1.0.0" } }, "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q=="], + + "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + + "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], + + "next-themes": ["next-themes@0.4.6", "", { "peerDependencies": { "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" } }, "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA=="], + + "nimma": ["nimma@0.2.3", "", { "dependencies": { "@jsep-plugin/regex": "^1.0.1", "@jsep-plugin/ternary": "^1.0.2", "astring": "^1.8.1", "jsep": "^1.2.0" }, "optionalDependencies": { "jsonpath-plus": "^6.0.1 || ^10.1.0", "lodash.topath": "^4.5.2" } }, "sha512-1ZOI8J+1PKKGceo/5CT5GfQOG6H8I2BencSK06YarZ2wXwH37BSSUWldqJmMJYA5JfqDqffxDXynt6f11AyKcA=="], + + "no-case": ["no-case@3.0.4", "", { "dependencies": { "lower-case": "^2.0.2", "tslib": "^2.0.3" } }, "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg=="], + + "node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], + + "node-fetch-h2": ["node-fetch-h2@2.3.0", "", { "dependencies": { "http2-client": "^1.2.5" } }, "sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg=="], + + "node-fetch-native": ["node-fetch-native@1.6.6", "", {}, "sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ=="], + + "node-readfiles": ["node-readfiles@0.2.0", "", { "dependencies": { "es6-promise": "^3.2.1" } }, "sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA=="], + + "node-releases": ["node-releases@2.0.19", "", {}, "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw=="], + + "normalize-package-data": ["normalize-package-data@5.0.0", "", { "dependencies": { "hosted-git-info": "^6.0.0", "is-core-module": "^2.8.1", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" } }, "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q=="], + + "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], + + "normalize-range": ["normalize-range@0.1.2", "", {}, "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA=="], + + "npm-install-checks": ["npm-install-checks@6.3.0", "", { "dependencies": { "semver": "^7.1.1" } }, "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw=="], + + "npm-normalize-package-bin": ["npm-normalize-package-bin@3.0.1", "", {}, "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ=="], + + "npm-package-arg": ["npm-package-arg@10.1.0", "", { "dependencies": { "hosted-git-info": "^6.0.0", "proc-log": "^3.0.0", "semver": "^7.3.5", "validate-npm-package-name": "^5.0.0" } }, "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA=="], + + "npm-pick-manifest": ["npm-pick-manifest@8.0.2", "", { "dependencies": { "npm-install-checks": "^6.0.0", "npm-normalize-package-bin": "^3.0.0", "npm-package-arg": "^10.0.0", "semver": "^7.3.5" } }, "sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg=="], + + "npm-run-path": ["npm-run-path@4.0.1", "", { "dependencies": { "path-key": "^3.0.0" } }, "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw=="], + + "nth-check": ["nth-check@2.1.1", "", { "dependencies": { "boolbase": "^1.0.0" } }, "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w=="], + + "oas-kit-common": ["oas-kit-common@1.0.8", "", { "dependencies": { "fast-safe-stringify": "^2.0.7" } }, "sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ=="], + + "oas-linter": ["oas-linter@3.2.2", "", { "dependencies": { "@exodus/schemasafe": "^1.0.0-rc.2", "should": "^13.2.1", "yaml": "^1.10.0" } }, "sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ=="], + + "oas-resolver": ["oas-resolver@2.5.6", "", { "dependencies": { "node-fetch-h2": "^2.3.0", "oas-kit-common": "^1.0.8", "reftools": "^1.1.9", "yaml": "^1.10.0", "yargs": "^17.0.1" }, "bin": { "resolve": "resolve.js" } }, "sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ=="], + + "oas-schema-walker": ["oas-schema-walker@1.1.5", "", {}, "sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ=="], + + "oas-validator": ["oas-validator@5.0.8", "", { "dependencies": { "call-me-maybe": "^1.0.1", "oas-kit-common": "^1.0.8", "oas-linter": "^3.2.2", "oas-resolver": "^2.5.6", "oas-schema-walker": "^1.1.5", "reftools": "^1.1.9", "should": "^13.2.1", "yaml": "^1.10.0" } }, "sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw=="], + + "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], + + "object-hash": ["object-hash@3.0.0", "", {}, "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw=="], + + "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], + + "object-keys": ["object-keys@1.1.1", "", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="], + + "object.assign": ["object.assign@4.1.7", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0", "has-symbols": "^1.1.0", "object-keys": "^1.1.1" } }, "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw=="], + + "ofetch": ["ofetch@1.4.1", "", { "dependencies": { "destr": "^2.0.3", "node-fetch-native": "^1.6.4", "ufo": "^1.5.4" } }, "sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw=="], + + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], + + "onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], + + "oniguruma-to-es": ["oniguruma-to-es@2.3.0", "", { "dependencies": { "emoji-regex-xs": "^1.0.0", "regex": "^5.1.1", "regex-recursion": "^5.1.1" } }, "sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g=="], + + "openapi-types": ["openapi-types@12.1.3", "", {}, "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw=="], + + "openapi3-ts": ["openapi3-ts@4.2.2", "", { "dependencies": { "yaml": "^2.3.4" } }, "sha512-+9g4actZKeb3czfi9gVQ4Br2Ju3KwhCAQJBNaKgye5KggqcBLIhFHH+nIkcm0BUX00TrAJl6dH4JWgM4G4JWrw=="], + + "optionator": ["optionator@0.9.4", "", { "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" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], + + "orval": ["orval@7.4.1", "", { "dependencies": { "@apidevtools/swagger-parser": "^10.1.0", "@orval/angular": "7.4.1", "@orval/axios": "7.4.1", "@orval/core": "7.4.1", "@orval/fetch": "7.4.1", "@orval/hono": "7.4.1", "@orval/mock": "7.4.1", "@orval/query": "7.4.1", "@orval/swr": "7.4.1", "@orval/zod": "7.4.1", "ajv": "^8.17.1", "cac": "^6.7.14", "chalk": "^4.1.2", "chokidar": "^4.0.1", "enquirer": "^2.4.1", "execa": "^5.1.1", "find-up": "5.0.0", "fs-extra": "^11.2.0", "lodash.uniq": "^4.5.0", "openapi3-ts": "4.2.2", "string-argv": "^0.3.2", "tsconfck": "^2.0.1", "typedoc": "0.26.11", "typedoc-plugin-markdown": "4.2.10", "typescript": "^5.6.3" }, "bin": { "orval": "dist/bin/orval.js" } }, "sha512-pXg5g5gdAzFqCUURZsMJoVeiWynSNSzqi6lXI1Opw08ILtmzDTdiU7PoSOf7pKVTB6oEf82zQzWeJMqSk8nzuQ=="], + + "own-keys": ["own-keys@1.0.1", "", { "dependencies": { "get-intrinsic": "^1.2.6", "object-keys": "^1.1.1", "safe-push-apply": "^1.0.0" } }, "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg=="], + + "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], + + "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], + + "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], + + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], + + "parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="], + + "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], + + "path-is-absolute": ["path-is-absolute@1.0.1", "", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="], + + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], + + "path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], + + "path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="], + + "pathe": ["pathe@1.1.2", "", {}, "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="], + + "pify": ["pify@2.3.0", "", {}, "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog=="], + + "pirates": ["pirates@4.0.7", "", {}, "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA=="], + + "pony-cause": ["pony-cause@1.1.1", "", {}, "sha512-PxkIc/2ZpLiEzQXu5YRDOUgBlfGYBY8156HY5ZcRAwwonMk5W/MrJP2LLkG/hF7GEQzaHo2aS7ho6ZLCOvf+6g=="], + + "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="], + + "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], + + "postcss-import": ["postcss-import@15.1.0", "", { "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", "resolve": "^1.1.7" }, "peerDependencies": { "postcss": "^8.0.0" } }, "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew=="], + + "postcss-js": ["postcss-js@4.0.1", "", { "dependencies": { "camelcase-css": "^2.0.1" }, "peerDependencies": { "postcss": "^8.4.21" } }, "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw=="], + + "postcss-load-config": ["postcss-load-config@4.0.2", "", { "dependencies": { "lilconfig": "^3.0.0", "yaml": "^2.3.4" }, "peerDependencies": { "postcss": ">=8.0.9", "ts-node": ">=9.0.0" }, "optionalPeers": ["postcss", "ts-node"] }, "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ=="], + + "postcss-nested": ["postcss-nested@6.2.0", "", { "dependencies": { "postcss-selector-parser": "^6.1.1" }, "peerDependencies": { "postcss": "^8.2.14" } }, "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ=="], + + "postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="], + + "postcss-value-parser": ["postcss-value-parser@4.2.0", "", {}, "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="], + + "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], + + "prettier": ["prettier@3.6.2", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ=="], + + "prettier-plugin-tailwindcss": ["prettier-plugin-tailwindcss@0.6.14", "", { "peerDependencies": { "@ianvs/prettier-plugin-sort-imports": "*", "@prettier/plugin-hermes": "*", "@prettier/plugin-oxc": "*", "@prettier/plugin-pug": "*", "@shopify/prettier-plugin-liquid": "*", "@trivago/prettier-plugin-sort-imports": "*", "@zackad/prettier-plugin-twig": "*", "prettier": "^3.0", "prettier-plugin-astro": "*", "prettier-plugin-css-order": "*", "prettier-plugin-import-sort": "*", "prettier-plugin-jsdoc": "*", "prettier-plugin-marko": "*", "prettier-plugin-multiline-arrays": "*", "prettier-plugin-organize-attributes": "*", "prettier-plugin-organize-imports": "*", "prettier-plugin-sort-imports": "*", "prettier-plugin-style-order": "*", "prettier-plugin-svelte": "*" }, "optionalPeers": ["@ianvs/prettier-plugin-sort-imports", "@prettier/plugin-hermes", "@prettier/plugin-oxc", "@prettier/plugin-pug", "@shopify/prettier-plugin-liquid", "@trivago/prettier-plugin-sort-imports", "@zackad/prettier-plugin-twig", "prettier-plugin-astro", "prettier-plugin-css-order", "prettier-plugin-import-sort", "prettier-plugin-jsdoc", "prettier-plugin-marko", "prettier-plugin-multiline-arrays", "prettier-plugin-organize-attributes", "prettier-plugin-organize-imports", "prettier-plugin-sort-imports", "prettier-plugin-style-order", "prettier-plugin-svelte"] }, "sha512-pi2e/+ZygeIqntN+vC573BcW5Cve8zUB0SSAGxqpB4f96boZF4M3phPVoOFCeypwkpRYdi7+jQ5YJJUwrkGUAg=="], + + "pretty-bytes": ["pretty-bytes@6.1.1", "", {}, "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ=="], + + "proc-log": ["proc-log@3.0.0", "", {}, "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A=="], + + "promise-inflight": ["promise-inflight@1.0.1", "", {}, "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g=="], + + "promise-retry": ["promise-retry@2.0.1", "", { "dependencies": { "err-code": "^2.0.2", "retry": "^0.12.0" } }, "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g=="], + + "prop-types": ["prop-types@15.8.1", "", { "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg=="], + + "property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="], + + "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="], + + "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], + + "punycode.js": ["punycode.js@2.3.1", "", {}, "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA=="], + + "qrcode.react": ["qrcode.react@3.2.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, "sha512-YietHHltOHA4+l5na1srdaMx4sVSOjV9tamHs+mwiLWAMr6QVACRUw1Neax5CptFILcNoITctJY0Ipyn5enQ8g=="], + + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], + + "randombytes": ["randombytes@2.1.0", "", { "dependencies": { "safe-buffer": "^5.1.0" } }, "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ=="], + + "react": ["react@18.3.1", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ=="], + + "react-day-picker": ["react-day-picker@9.7.0", "", { "dependencies": { "@date-fns/tz": "1.2.0", "date-fns": "4.1.0", "date-fns-jalali": "4.1.0-0" }, "peerDependencies": { "react": ">=16.8.0" } }, "sha512-urlK4C9XJZVpQ81tmVgd2O7lZ0VQldZeHzNejbwLWZSkzHH498KnArT0EHNfKBOWwKc935iMLGZdxXPRISzUxQ=="], + + "react-dom": ["react-dom@18.3.1", "", { "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" }, "peerDependencies": { "react": "^18.3.1" } }, "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw=="], + + "react-github-btn": ["react-github-btn@1.4.0", "", { "dependencies": { "github-buttons": "^2.22.0" }, "peerDependencies": { "react": ">=16.3.0" } }, "sha512-lV4FYClAfjWnBfv0iNlJUGhamDgIq6TayD0kPZED6VzHWdpcHmPfsYOZ/CFwLfPv4Zp+F4m8QKTj0oy2HjiGXg=="], + + "react-hook-form": ["react-hook-form@7.60.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17 || ^18 || ^19" } }, "sha512-SBrYOvMbDB7cV8ZfNpaiLcgjH/a1c7aK0lK+aNigpf4xWLO8q+o4tcvVurv3c4EOyzn/3dCsYt4GKD42VvJ/+A=="], + + "react-i18next": ["react-i18next@15.6.0", "", { "dependencies": { "@babel/runtime": "^7.27.6", "html-parse-stringify": "^3.0.1" }, "peerDependencies": { "i18next": ">= 23.2.3", "react": ">= 16.8.0", "typescript": "^5" }, "optionalPeers": ["typescript"] }, "sha512-W135dB0rDfiFmbMipC17nOhGdttO5mzH8BivY+2ybsQBbXvxWIwl3cmeH3T9d+YPBSJu/ouyJKFJTtkK7rJofw=="], + + "react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="], + + "react-refresh": ["react-refresh@0.14.2", "", {}, "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA=="], + + "react-remove-scroll": ["react-remove-scroll@2.7.1", "", { "dependencies": { "react-remove-scroll-bar": "^2.3.7", "react-style-singleton": "^2.2.3", "tslib": "^2.1.0", "use-callback-ref": "^1.3.3", "use-sidecar": "^1.1.3" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA=="], + + "react-remove-scroll-bar": ["react-remove-scroll-bar@2.3.8", "", { "dependencies": { "react-style-singleton": "^2.2.2", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q=="], + + "react-router": ["react-router@7.6.3", "", { "dependencies": { "cookie": "^1.0.1", "set-cookie-parser": "^2.6.0" }, "peerDependencies": { "react": ">=18", "react-dom": ">=18" }, "optionalPeers": ["react-dom"] }, "sha512-zf45LZp5skDC6I3jDLXQUu0u26jtuP4lEGbc7BbdyxenBN1vJSTA18czM2D+h5qyMBuMrD+9uB+mU37HIoKGRA=="], + + "react-smooth": ["react-smooth@4.0.4", "", { "dependencies": { "fast-equals": "^5.0.1", "prop-types": "^15.8.1", "react-transition-group": "^4.4.5" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-gnGKTpYwqL0Iii09gHobNolvX4Kiq4PKx6eWBCYYix+8cdw+cGo3do906l1NBPKkSWx1DghC1dlWG9L2uGd61Q=="], + + "react-style-singleton": ["react-style-singleton@2.2.3", "", { "dependencies": { "get-nonce": "^1.0.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ=="], + + "react-top-loading-bar": ["react-top-loading-bar@3.0.2", "", { "peerDependencies": { "react": "^16 || ^17 || ^18 || ^19" } }, "sha512-hW0CHrHqKdBOBsVhms73ka0rgb9/aoiRfqo7jiS1vwIYDK7VkyMj52ypo5ewhshTQGHKE6mRvR99GZBZ+FuM/Q=="], + + "react-transition-group": ["react-transition-group@4.4.5", "", { "dependencies": { "@babel/runtime": "^7.5.5", "dom-helpers": "^5.0.1", "loose-envify": "^1.4.0", "prop-types": "^15.6.2" }, "peerDependencies": { "react": ">=16.6.0", "react-dom": ">=16.6.0" } }, "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g=="], + + "react-use-websocket": ["react-use-websocket@4.13.0", "", {}, "sha512-anMuVoV//g2N76Wxqvqjjo1X48r9Np3y1/gMl7arX84tAPXdy5R7sB5lO5hvCzQRYjqXwV8XMAiEBOUbyrZFrw=="], + + "read-cache": ["read-cache@1.0.0", "", { "dependencies": { "pify": "^2.3.0" } }, "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA=="], + + "readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], + + "recharts": ["recharts@2.15.4", "", { "dependencies": { "clsx": "^2.0.0", "eventemitter3": "^4.0.1", "lodash": "^4.17.21", "react-is": "^18.3.1", "react-smooth": "^4.0.4", "recharts-scale": "^0.4.4", "tiny-invariant": "^1.3.1", "victory-vendor": "^36.6.8" }, "peerDependencies": { "react": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-UT/q6fwS3c1dHbXv2uFgYJ9BMFHu3fwnd7AYZaEQhXuYQ4hgsxLvsUXzGdKeZrW5xopzDCvuA2N41WJ88I7zIw=="], + + "recharts-scale": ["recharts-scale@0.4.5", "", { "dependencies": { "decimal.js-light": "^2.4.1" } }, "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w=="], + + "reflect.getprototypeof": ["reflect.getprototypeof@1.0.10", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.1", "which-builtin-type": "^1.2.1" } }, "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw=="], + + "reftools": ["reftools@1.1.9", "", {}, "sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w=="], + + "regenerate": ["regenerate@1.4.2", "", {}, "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A=="], + + "regenerate-unicode-properties": ["regenerate-unicode-properties@10.2.0", "", { "dependencies": { "regenerate": "^1.4.2" } }, "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA=="], + + "regex": ["regex@5.1.1", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw=="], + + "regex-recursion": ["regex-recursion@5.1.1", "", { "dependencies": { "regex": "^5.1.1", "regex-utilities": "^2.3.0" } }, "sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w=="], + + "regex-utilities": ["regex-utilities@2.3.0", "", {}, "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng=="], + + "regexp.prototype.flags": ["regexp.prototype.flags@1.5.4", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", "get-proto": "^1.0.1", "gopd": "^1.2.0", "set-function-name": "^2.0.2" } }, "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA=="], + + "regexpu-core": ["regexpu-core@6.2.0", "", { "dependencies": { "regenerate": "^1.4.2", "regenerate-unicode-properties": "^10.2.0", "regjsgen": "^0.8.0", "regjsparser": "^0.12.0", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.1.0" } }, "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA=="], + + "regjsgen": ["regjsgen@0.8.0", "", {}, "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q=="], + + "regjsparser": ["regjsparser@0.12.0", "", { "dependencies": { "jsesc": "~3.0.2" }, "bin": { "regjsparser": "bin/parser" } }, "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ=="], + + "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], + + "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], + + "resolve": ["resolve@1.22.10", "", { "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w=="], + + "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], + + "retry": ["retry@0.12.0", "", {}, "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow=="], + + "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], + + "rollup": ["rollup@4.45.0", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.45.0", "@rollup/rollup-android-arm64": "4.45.0", "@rollup/rollup-darwin-arm64": "4.45.0", "@rollup/rollup-darwin-x64": "4.45.0", "@rollup/rollup-freebsd-arm64": "4.45.0", "@rollup/rollup-freebsd-x64": "4.45.0", "@rollup/rollup-linux-arm-gnueabihf": "4.45.0", "@rollup/rollup-linux-arm-musleabihf": "4.45.0", "@rollup/rollup-linux-arm64-gnu": "4.45.0", "@rollup/rollup-linux-arm64-musl": "4.45.0", "@rollup/rollup-linux-loongarch64-gnu": "4.45.0", "@rollup/rollup-linux-powerpc64le-gnu": "4.45.0", "@rollup/rollup-linux-riscv64-gnu": "4.45.0", "@rollup/rollup-linux-riscv64-musl": "4.45.0", "@rollup/rollup-linux-s390x-gnu": "4.45.0", "@rollup/rollup-linux-x64-gnu": "4.45.0", "@rollup/rollup-linux-x64-musl": "4.45.0", "@rollup/rollup-win32-arm64-msvc": "4.45.0", "@rollup/rollup-win32-ia32-msvc": "4.45.0", "@rollup/rollup-win32-x64-msvc": "4.45.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-WLjEcJRIo7i3WDDgOIJqVI2d+lAC3EwvOGy+Xfq6hs+GQuAA4Di/H72xmXkOhrIWFg2PFYSKZYfH0f4vfKXN4A=="], + + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], + + "safe-array-concat": ["safe-array-concat@1.1.3", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "has-symbols": "^1.1.0", "isarray": "^2.0.5" } }, "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q=="], + + "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "safe-push-apply": ["safe-push-apply@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "isarray": "^2.0.5" } }, "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA=="], + + "safe-regex-test": ["safe-regex-test@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-regex": "^1.2.1" } }, "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw=="], + + "safe-stable-stringify": ["safe-stable-stringify@1.1.1", "", {}, "sha512-ERq4hUjKDbJfE4+XtZLFPCDi8Vb1JqaxAPTxWFLBx8XcAlf9Bda/ZJdVezs/NAfsMQScyIlUMx+Yeu7P7rx5jw=="], + + "scheduler": ["scheduler@0.23.2", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ=="], + + "semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], + + "serialize-javascript": ["serialize-javascript@6.0.2", "", { "dependencies": { "randombytes": "^2.1.0" } }, "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g=="], + + "set-cookie-parser": ["set-cookie-parser@2.7.1", "", {}, "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ=="], + + "set-function-length": ["set-function-length@1.2.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="], + + "set-function-name": ["set-function-name@2.0.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", "has-property-descriptors": "^1.0.2" } }, "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ=="], + + "set-proto": ["set-proto@1.0.0", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0" } }, "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw=="], + + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "shiki": ["shiki@1.29.2", "", { "dependencies": { "@shikijs/core": "1.29.2", "@shikijs/engine-javascript": "1.29.2", "@shikijs/engine-oniguruma": "1.29.2", "@shikijs/langs": "1.29.2", "@shikijs/themes": "1.29.2", "@shikijs/types": "1.29.2", "@shikijs/vscode-textmate": "^10.0.1", "@types/hast": "^3.0.4" } }, "sha512-njXuliz/cP+67jU2hukkxCNuH1yUi4QfdZZY+sMr5PPrIyXSu5iTb/qYC4BiWWB0vZ+7TbdvYUCeL23zpwCfbg=="], + + "should": ["should@13.2.3", "", { "dependencies": { "should-equal": "^2.0.0", "should-format": "^3.0.3", "should-type": "^1.4.0", "should-type-adaptors": "^1.0.1", "should-util": "^1.0.0" } }, "sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ=="], + + "should-equal": ["should-equal@2.0.0", "", { "dependencies": { "should-type": "^1.4.0" } }, "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA=="], + + "should-format": ["should-format@3.0.3", "", { "dependencies": { "should-type": "^1.3.0", "should-type-adaptors": "^1.0.1" } }, "sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q=="], + + "should-type": ["should-type@1.4.0", "", {}, "sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ=="], + + "should-type-adaptors": ["should-type-adaptors@1.1.0", "", { "dependencies": { "should-type": "^1.3.0", "should-util": "^1.0.0" } }, "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA=="], + + "should-util": ["should-util@1.0.1", "", {}, "sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g=="], + + "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="], + + "side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="], + + "side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="], + + "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="], + + "signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], + + "simple-eval": ["simple-eval@1.0.1", "", { "dependencies": { "jsep": "^1.3.6" } }, "sha512-LH7FpTAkeD+y5xQC4fzS+tFtaNlvt3Ib1zKzvhjv/Y+cioV4zIuw4IZr2yhRLu67CWL7FR9/6KXKnjRoZTvGGQ=="], + + "slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="], + + "smob": ["smob@1.5.0", "", {}, "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig=="], + + "snake-case": ["snake-case@3.0.4", "", { "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg=="], + + "sonner": ["sonner@2.0.6", "", { "peerDependencies": { "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-yHFhk8T/DK3YxjFQXIrcHT1rGEeTLliVzWbO0xN8GberVun2RiBnxAjXAYpZrqwEVHBG9asI/Li8TAAhN9m59Q=="], + + "source-map": ["source-map@0.8.0-beta.0", "", { "dependencies": { "whatwg-url": "^7.0.0" } }, "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA=="], + + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], + + "source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="], + + "sourcemap-codec": ["sourcemap-codec@1.4.8", "", {}, "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA=="], + + "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="], + + "spdx-correct": ["spdx-correct@3.2.0", "", { "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA=="], + + "spdx-exceptions": ["spdx-exceptions@2.5.0", "", {}, "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w=="], + + "spdx-expression-parse": ["spdx-expression-parse@3.0.1", "", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q=="], + + "spdx-license-ids": ["spdx-license-ids@3.0.21", "", {}, "sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg=="], + + "state-local": ["state-local@1.0.7", "", {}, "sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w=="], + + "stop-iteration-iterator": ["stop-iteration-iterator@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "internal-slot": "^1.1.0" } }, "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ=="], + + "string-argv": ["string-argv@0.3.2", "", {}, "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q=="], + + "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "string.prototype.matchall": ["string.prototype.matchall@4.0.12", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.6", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "regexp.prototype.flags": "^1.5.3", "set-function-name": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA=="], + + "string.prototype.trim": ["string.prototype.trim@1.2.10", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-data-property": "^1.1.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-object-atoms": "^1.0.0", "has-property-descriptors": "^1.0.2" } }, "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA=="], + + "string.prototype.trimend": ["string.prototype.trimend@1.0.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ=="], + + "string.prototype.trimstart": ["string.prototype.trimstart@1.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg=="], + + "stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="], + + "stringify-object": ["stringify-object@3.3.0", "", { "dependencies": { "get-own-enumerable-property-symbols": "^3.0.0", "is-obj": "^1.0.1", "is-regexp": "^1.0.0" } }, "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw=="], + + "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "strip-comments": ["strip-comments@2.0.1", "", {}, "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw=="], + + "strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="], + + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + + "sucrase": ["sucrase@3.35.0", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "glob": "^10.3.10", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "ts-interface-checker": "^0.1.9" }, "bin": { "sucrase": "bin/sucrase", "sucrase-node": "bin/sucrase-node" } }, "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA=="], + + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], + + "svg-parser": ["svg-parser@2.0.4", "", {}, "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ=="], + + "svgo": ["svgo@3.3.2", "", { "dependencies": { "@trysound/sax": "0.2.0", "commander": "^7.2.0", "css-select": "^5.1.0", "css-tree": "^2.3.1", "css-what": "^6.1.0", "csso": "^5.0.5", "picocolors": "^1.0.0" }, "bin": "./bin/svgo" }, "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw=="], + + "swagger2openapi": ["swagger2openapi@7.0.8", "", { "dependencies": { "call-me-maybe": "^1.0.1", "node-fetch": "^2.6.1", "node-fetch-h2": "^2.3.0", "node-readfiles": "^0.2.0", "oas-kit-common": "^1.0.8", "oas-resolver": "^2.5.6", "oas-schema-walker": "^1.1.5", "oas-validator": "^5.0.8", "reftools": "^1.1.9", "yaml": "^1.10.0", "yargs": "^17.0.1" }, "bin": { "swagger2openapi": "swagger2openapi.js", "oas-validate": "oas-validate.js", "boast": "boast.js" } }, "sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g=="], + + "tailwind-merge": ["tailwind-merge@2.6.0", "", {}, "sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA=="], + + "tailwindcss": ["tailwindcss@3.4.17", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", "chokidar": "^3.6.0", "didyoumean": "^1.2.2", "dlv": "^1.1.3", "fast-glob": "^3.3.2", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", "jiti": "^1.21.6", "lilconfig": "^3.1.3", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", "picocolors": "^1.1.1", "postcss": "^8.4.47", "postcss-import": "^15.1.0", "postcss-js": "^4.0.1", "postcss-load-config": "^4.0.2", "postcss-nested": "^6.2.0", "postcss-selector-parser": "^6.1.2", "resolve": "^1.22.8", "sucrase": "^3.35.0" }, "bin": { "tailwind": "lib/cli.js", "tailwindcss": "lib/cli.js" } }, "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og=="], + + "tailwindcss-animate": ["tailwindcss-animate@1.0.7", "", { "peerDependencies": { "tailwindcss": ">=3.0.0 || insiders" } }, "sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA=="], + + "temp-dir": ["temp-dir@2.0.0", "", {}, "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg=="], + + "tempy": ["tempy@0.6.0", "", { "dependencies": { "is-stream": "^2.0.0", "temp-dir": "^2.0.0", "type-fest": "^0.16.0", "unique-string": "^2.0.0" } }, "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw=="], + + "terser": ["terser@5.43.1", "", { "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.14.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" } }, "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg=="], + + "thenify": ["thenify@3.3.1", "", { "dependencies": { "any-promise": "^1.0.0" } }, "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw=="], + + "thenify-all": ["thenify-all@1.6.0", "", { "dependencies": { "thenify": ">= 3.1.0 < 4" } }, "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA=="], + + "tiny-invariant": ["tiny-invariant@1.3.3", "", {}, "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="], + + "tinyglobby": ["tinyglobby@0.2.14", "", { "dependencies": { "fdir": "^6.4.4", "picomatch": "^4.0.2" } }, "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ=="], + + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + + "tr46": ["tr46@1.0.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA=="], + + "trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="], + + "ts-api-utils": ["ts-api-utils@2.1.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ=="], + + "ts-interface-checker": ["ts-interface-checker@0.1.13", "", {}, "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="], + + "tsconfck": ["tsconfck@2.1.2", "", { "peerDependencies": { "typescript": "^4.3.5 || ^5.0.0" }, "optionalPeers": ["typescript"], "bin": { "tsconfck": "bin/tsconfck.js" } }, "sha512-ghqN1b0puy3MhhviwO2kGF8SeMDNhEbnKxjK7h6+fvY9JAxqvXi8y5NAHSQv687OVboS2uZIByzGd45/YxrRHg=="], + + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], + + "type-fest": ["type-fest@0.16.0", "", {}, "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg=="], + + "typed-array-buffer": ["typed-array-buffer@1.0.3", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-typed-array": "^1.1.14" } }, "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw=="], + + "typed-array-byte-length": ["typed-array-byte-length@1.0.3", "", { "dependencies": { "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.14" } }, "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg=="], + + "typed-array-byte-offset": ["typed-array-byte-offset@1.0.4", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.15", "reflect.getprototypeof": "^1.0.9" } }, "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ=="], + + "typed-array-length": ["typed-array-length@1.0.7", "", { "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", "is-typed-array": "^1.1.13", "possible-typed-array-names": "^1.0.0", "reflect.getprototypeof": "^1.0.6" } }, "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg=="], + + "typedoc": ["typedoc@0.26.11", "", { "dependencies": { "lunr": "^2.3.9", "markdown-it": "^14.1.0", "minimatch": "^9.0.5", "shiki": "^1.16.2", "yaml": "^2.5.1" }, "peerDependencies": { "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x" }, "bin": { "typedoc": "bin/typedoc" } }, "sha512-sFEgRRtrcDl2FxVP58Ze++ZK2UQAEvtvvH8rRlig1Ja3o7dDaMHmaBfvJmdGnNEFaLTpQsN8dpvZaTqJSu/Ugw=="], + + "typedoc-plugin-markdown": ["typedoc-plugin-markdown@4.2.10", "", { "peerDependencies": { "typedoc": "0.26.x" } }, "sha512-PLX3pc1/7z13UJm4TDE9vo9jWGcClFUErXXtd5LdnoLjV6mynPpqZLU992DwMGFSRqJFZeKbVyqlNNeNHnk2tQ=="], + + "typescript": ["typescript@5.6.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw=="], + + "typescript-eslint": ["typescript-eslint@8.36.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.36.0", "@typescript-eslint/parser": "8.36.0", "@typescript-eslint/utils": "8.36.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-fTCqxthY+h9QbEgSIBfL9iV6CvKDFuoxg6bHPNpJ9HIUzS+jy2lCEyCmGyZRWEBSaykqcDPf1SJ+BfCI8DRopA=="], + + "uc.micro": ["uc.micro@2.1.0", "", {}, "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A=="], + + "ufo": ["ufo@1.6.1", "", {}, "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA=="], + + "unbox-primitive": ["unbox-primitive@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", "has-symbols": "^1.1.0", "which-boxed-primitive": "^1.1.1" } }, "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw=="], + + "undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], + + "unicode-canonical-property-names-ecmascript": ["unicode-canonical-property-names-ecmascript@2.0.1", "", {}, "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg=="], + + "unicode-match-property-ecmascript": ["unicode-match-property-ecmascript@2.0.0", "", { "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" } }, "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q=="], + + "unicode-match-property-value-ecmascript": ["unicode-match-property-value-ecmascript@2.2.0", "", {}, "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg=="], + + "unicode-property-aliases-ecmascript": ["unicode-property-aliases-ecmascript@2.1.0", "", {}, "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w=="], + + "unique-string": ["unique-string@2.0.0", "", { "dependencies": { "crypto-random-string": "^2.0.0" } }, "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg=="], + + "unist-util-is": ["unist-util-is@6.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw=="], + + "unist-util-position": ["unist-util-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA=="], + + "unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="], + + "unist-util-visit": ["unist-util-visit@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg=="], + + "unist-util-visit-parents": ["unist-util-visit-parents@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw=="], + + "universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], + + "upath": ["upath@1.2.0", "", {}, "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg=="], + + "update-browserslist-db": ["update-browserslist-db@1.1.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw=="], + + "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], + + "urijs": ["urijs@1.19.11", "", {}, "sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ=="], + + "use-callback-ref": ["use-callback-ref@1.3.3", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg=="], + + "use-sidecar": ["use-sidecar@1.1.3", "", { "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ=="], + + "use-sync-external-store": ["use-sync-external-store@1.5.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A=="], + + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + + "utility-types": ["utility-types@3.11.0", "", {}, "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw=="], + + "uuid": ["uuid@11.1.0", "", { "bin": { "uuid": "dist/esm/bin/uuid" } }, "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A=="], + + "valibot": ["valibot@0.41.0", "", { "peerDependencies": { "typescript": ">=5" }, "optionalPeers": ["typescript"] }, "sha512-igDBb8CTYr8YTQlOKgaN9nSS0Be7z+WRuaeYqGf3Cjz3aKmSnqEmYnkfVjzIuumGqfHpa3fLIvMEAfhrpqN8ng=="], + + "validate-npm-package-license": ["validate-npm-package-license@3.0.4", "", { "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew=="], + + "validate-npm-package-name": ["validate-npm-package-name@5.0.1", "", {}, "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ=="], + + "validator": ["validator@13.15.15", "", {}, "sha512-BgWVbCI72aIQy937xbawcs+hrVaN/CZ2UwutgaJ36hGqRrLNM+f5LUT/YPRbo8IV/ASeFzXszezV+y2+rq3l8A=="], + + "vaul": ["vaul@1.1.2", "", { "dependencies": { "@radix-ui/react-dialog": "^1.1.1" }, "peerDependencies": { "react": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-ZFkClGpWyI2WUQjdLJ/BaGuV6AVQiJ3uELGk3OYtP+B6yCO7Cmn9vPFXVJkRaGkOJu3m8bQMgtyzNHixULceQA=="], + + "vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="], + + "vfile-message": ["vfile-message@4.0.2", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw=="], + + "victory-vendor": ["victory-vendor@36.9.2", "", { "dependencies": { "@types/d3-array": "^3.0.3", "@types/d3-ease": "^3.0.0", "@types/d3-interpolate": "^3.0.1", "@types/d3-scale": "^4.0.2", "@types/d3-shape": "^3.1.0", "@types/d3-time": "^3.0.0", "@types/d3-timer": "^3.0.0", "d3-array": "^3.1.6", "d3-ease": "^3.0.1", "d3-interpolate": "^3.0.1", "d3-scale": "^4.0.2", "d3-shape": "^3.1.0", "d3-time": "^3.0.0", "d3-timer": "^3.0.1" } }, "sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ=="], + + "vite": ["vite@6.3.5", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "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" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ=="], + + "vite-node": ["vite-node@3.2.4", "", { "dependencies": { "cac": "^6.7.14", "debug": "^4.4.1", "es-module-lexer": "^1.7.0", "pathe": "^2.0.3", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" }, "bin": { "vite-node": "vite-node.mjs" } }, "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg=="], + + "vite-plugin-pwa": ["vite-plugin-pwa@1.0.1", "", { "dependencies": { "debug": "^4.3.6", "pretty-bytes": "^6.1.1", "tinyglobby": "^0.2.10", "workbox-build": "^7.3.0", "workbox-window": "^7.3.0" }, "peerDependencies": { "@vite-pwa/assets-generator": "^1.0.0", "vite": "^3.1.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" }, "optionalPeers": ["@vite-pwa/assets-generator"] }, "sha512-STyUomQbydj7vGamtgQYIJI0YsUZ3T4pJLGBQDQPhzMse6aGSncmEN21OV35PrFsmCvmtiH+Nu1JS1ke4RqBjQ=="], + + "vite-plugin-svgr": ["vite-plugin-svgr@4.3.0", "", { "dependencies": { "@rollup/pluginutils": "^5.1.3", "@svgr/core": "^8.1.0", "@svgr/plugin-jsx": "^8.1.0" }, "peerDependencies": { "vite": ">=2.6.0" } }, "sha512-Jy9qLB2/PyWklpYy0xk0UU3TlU0t2UMpJXZvf+hWII1lAmRHrOUKi11Uw8N3rxoNk7atZNYO3pR3vI1f7oi+6w=="], + + "vite-tsconfig-paths": ["vite-tsconfig-paths@5.1.4", "", { "dependencies": { "debug": "^4.1.1", "globrex": "^0.1.2", "tsconfck": "^3.0.3" }, "peerDependencies": { "vite": "*" }, "optionalPeers": ["vite"] }, "sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w=="], + + "void-elements": ["void-elements@3.1.0", "", {}, "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w=="], + + "wait-port": ["wait-port@1.1.0", "", { "dependencies": { "chalk": "^4.1.2", "commander": "^9.3.0", "debug": "^4.3.4" }, "bin": { "wait-port": "bin/wait-port.js" } }, "sha512-3e04qkoN3LxTMLakdqeWth8nih8usyg+sf1Bgdf9wwUkp05iuK1eSY/QpLvscT/+F/gA89+LpUmmgBtesbqI2Q=="], + + "webidl-conversions": ["webidl-conversions@4.0.2", "", {}, "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg=="], + + "whatwg-url": ["whatwg-url@7.1.0", "", { "dependencies": { "lodash.sortby": "^4.7.0", "tr46": "^1.0.1", "webidl-conversions": "^4.0.2" } }, "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg=="], + + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "which-boxed-primitive": ["which-boxed-primitive@1.1.1", "", { "dependencies": { "is-bigint": "^1.1.0", "is-boolean-object": "^1.2.1", "is-number-object": "^1.1.1", "is-string": "^1.1.1", "is-symbol": "^1.1.1" } }, "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA=="], + + "which-builtin-type": ["which-builtin-type@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "function.prototype.name": "^1.1.6", "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", "is-date-object": "^1.1.0", "is-finalizationregistry": "^1.1.0", "is-generator-function": "^1.0.10", "is-regex": "^1.2.1", "is-weakref": "^1.0.2", "isarray": "^2.0.5", "which-boxed-primitive": "^1.1.0", "which-collection": "^1.0.2", "which-typed-array": "^1.1.16" } }, "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q=="], + + "which-collection": ["which-collection@1.0.2", "", { "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", "is-weakmap": "^2.0.2", "is-weakset": "^2.0.3" } }, "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw=="], + + "which-typed-array": ["which-typed-array@1.1.19", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw=="], + + "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], + + "workbox-background-sync": ["workbox-background-sync@7.3.0", "", { "dependencies": { "idb": "^7.0.1", "workbox-core": "7.3.0" } }, "sha512-PCSk3eK7Mxeuyatb22pcSx9dlgWNv3+M8PqPaYDokks8Y5/FX4soaOqj3yhAZr5k6Q5JWTOMYgaJBpbw11G9Eg=="], + + "workbox-broadcast-update": ["workbox-broadcast-update@7.3.0", "", { "dependencies": { "workbox-core": "7.3.0" } }, "sha512-T9/F5VEdJVhwmrIAE+E/kq5at2OY6+OXXgOWQevnubal6sO92Gjo24v6dCVwQiclAF5NS3hlmsifRrpQzZCdUA=="], + + "workbox-build": ["workbox-build@7.3.0", "", { "dependencies": { "@apideck/better-ajv-errors": "^0.3.1", "@babel/core": "^7.24.4", "@babel/preset-env": "^7.11.0", "@babel/runtime": "^7.11.2", "@rollup/plugin-babel": "^5.2.0", "@rollup/plugin-node-resolve": "^15.2.3", "@rollup/plugin-replace": "^2.4.1", "@rollup/plugin-terser": "^0.4.3", "@surma/rollup-plugin-off-main-thread": "^2.2.3", "ajv": "^8.6.0", "common-tags": "^1.8.0", "fast-json-stable-stringify": "^2.1.0", "fs-extra": "^9.0.1", "glob": "^7.1.6", "lodash": "^4.17.20", "pretty-bytes": "^5.3.0", "rollup": "^2.43.1", "source-map": "^0.8.0-beta.0", "stringify-object": "^3.3.0", "strip-comments": "^2.0.1", "tempy": "^0.6.0", "upath": "^1.2.0", "workbox-background-sync": "7.3.0", "workbox-broadcast-update": "7.3.0", "workbox-cacheable-response": "7.3.0", "workbox-core": "7.3.0", "workbox-expiration": "7.3.0", "workbox-google-analytics": "7.3.0", "workbox-navigation-preload": "7.3.0", "workbox-precaching": "7.3.0", "workbox-range-requests": "7.3.0", "workbox-recipes": "7.3.0", "workbox-routing": "7.3.0", "workbox-strategies": "7.3.0", "workbox-streams": "7.3.0", "workbox-sw": "7.3.0", "workbox-window": "7.3.0" } }, "sha512-JGL6vZTPlxnlqZRhR/K/msqg3wKP+m0wfEUVosK7gsYzSgeIxvZLi1ViJJzVL7CEeI8r7rGFV973RiEqkP3lWQ=="], + + "workbox-cacheable-response": ["workbox-cacheable-response@7.3.0", "", { "dependencies": { "workbox-core": "7.3.0" } }, "sha512-eAFERIg6J2LuyELhLlmeRcJFa5e16Mj8kL2yCDbhWE+HUun9skRQrGIFVUagqWj4DMaaPSMWfAolM7XZZxNmxA=="], + + "workbox-core": ["workbox-core@7.3.0", "", {}, "sha512-Z+mYrErfh4t3zi7NVTvOuACB0A/jA3bgxUN3PwtAVHvfEsZxV9Iju580VEETug3zYJRc0Dmii/aixI/Uxj8fmw=="], + + "workbox-expiration": ["workbox-expiration@7.3.0", "", { "dependencies": { "idb": "^7.0.1", "workbox-core": "7.3.0" } }, "sha512-lpnSSLp2BM+K6bgFCWc5bS1LR5pAwDWbcKt1iL87/eTSJRdLdAwGQznZE+1czLgn/X05YChsrEegTNxjM067vQ=="], + + "workbox-google-analytics": ["workbox-google-analytics@7.3.0", "", { "dependencies": { "workbox-background-sync": "7.3.0", "workbox-core": "7.3.0", "workbox-routing": "7.3.0", "workbox-strategies": "7.3.0" } }, "sha512-ii/tSfFdhjLHZ2BrYgFNTrb/yk04pw2hasgbM70jpZfLk0vdJAXgaiMAWsoE+wfJDNWoZmBYY0hMVI0v5wWDbg=="], + + "workbox-navigation-preload": ["workbox-navigation-preload@7.3.0", "", { "dependencies": { "workbox-core": "7.3.0" } }, "sha512-fTJzogmFaTv4bShZ6aA7Bfj4Cewaq5rp30qcxl2iYM45YD79rKIhvzNHiFj1P+u5ZZldroqhASXwwoyusnr2cg=="], + + "workbox-precaching": ["workbox-precaching@7.3.0", "", { "dependencies": { "workbox-core": "7.3.0", "workbox-routing": "7.3.0", "workbox-strategies": "7.3.0" } }, "sha512-ckp/3t0msgXclVAYaNndAGeAoWQUv7Rwc4fdhWL69CCAb2UHo3Cef0KIUctqfQj1p8h6aGyz3w8Cy3Ihq9OmIw=="], + + "workbox-range-requests": ["workbox-range-requests@7.3.0", "", { "dependencies": { "workbox-core": "7.3.0" } }, "sha512-EyFmM1KpDzzAouNF3+EWa15yDEenwxoeXu9bgxOEYnFfCxns7eAxA9WSSaVd8kujFFt3eIbShNqa4hLQNFvmVQ=="], + + "workbox-recipes": ["workbox-recipes@7.3.0", "", { "dependencies": { "workbox-cacheable-response": "7.3.0", "workbox-core": "7.3.0", "workbox-expiration": "7.3.0", "workbox-precaching": "7.3.0", "workbox-routing": "7.3.0", "workbox-strategies": "7.3.0" } }, "sha512-BJro/MpuW35I/zjZQBcoxsctgeB+kyb2JAP5EB3EYzePg8wDGoQuUdyYQS+CheTb+GhqJeWmVs3QxLI8EBP1sg=="], + + "workbox-routing": ["workbox-routing@7.3.0", "", { "dependencies": { "workbox-core": "7.3.0" } }, "sha512-ZUlysUVn5ZUzMOmQN3bqu+gK98vNfgX/gSTZ127izJg/pMMy4LryAthnYtjuqcjkN4HEAx1mdgxNiKJMZQM76A=="], + + "workbox-strategies": ["workbox-strategies@7.3.0", "", { "dependencies": { "workbox-core": "7.3.0" } }, "sha512-tmZydug+qzDFATwX7QiEL5Hdf7FrkhjaF9db1CbB39sDmEZJg3l9ayDvPxy8Y18C3Y66Nrr9kkN1f/RlkDgllg=="], + + "workbox-streams": ["workbox-streams@7.3.0", "", { "dependencies": { "workbox-core": "7.3.0", "workbox-routing": "7.3.0" } }, "sha512-SZnXucyg8x2Y61VGtDjKPO5EgPUG5NDn/v86WYHX+9ZqvAsGOytP0Jxp1bl663YUuMoXSAtsGLL+byHzEuMRpw=="], + + "workbox-sw": ["workbox-sw@7.3.0", "", {}, "sha512-aCUyoAZU9IZtH05mn0ACUpyHzPs0lMeJimAYkQkBsOWiqaJLgusfDCR+yllkPkFRxWpZKF8vSvgHYeG7LwhlmA=="], + + "workbox-window": ["workbox-window@7.3.0", "", { "dependencies": { "@types/trusted-types": "^2.0.2", "workbox-core": "7.3.0" } }, "sha512-qW8PDy16OV1UBaUNGlTVcepzrlzyzNW/ZJvFQQs2j2TzGsg6IKjcpZC1RSquqQnTOafl5pCj5bGfAHlCjOOjdA=="], + + "wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], + + "wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + + "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], + + "yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], + + "yaml": ["yaml@2.8.0", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ=="], + + "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], + + "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + + "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], + + "zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="], + + "zustand": ["zustand@5.0.6", "", { "peerDependencies": { "@types/react": ">=18.0.0", "immer": ">=9.0.6", "react": ">=18.0.0", "use-sync-external-store": ">=1.2.0" }, "optionalPeers": ["@types/react", "immer", "react", "use-sync-external-store"] }, "sha512-ihAqNeUVhe0MAD+X8M5UzqyZ9k3FFZLBTtqo6JLPwV53cbRB/mJwBI0PxcIgqhBBHlEs8G45OTDTMq3gNcLq3A=="], + + "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], + + "@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@babel/helper-create-class-features-plugin/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@babel/helper-create-regexp-features-plugin/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@babel/preset-env/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + + "@eslint/config-array/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "@eslint/eslintrc/ajv": ["ajv@6.12.6", "", { "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" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], + + "@eslint/eslintrc/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "@humanfs/node/@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.1", "", {}, "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA=="], + + "@ibm-cloud/openapi-ruleset/minimatch": ["minimatch@6.2.0", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg=="], + + "@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], + + "@isaacs/cliui/strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="], + + "@npmcli/git/lru-cache": ["lru-cache@7.18.3", "", {}, "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA=="], + + "@npmcli/git/which": ["which@3.0.1", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "bin/which.js" } }, "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg=="], + + "@npmcli/promise-spawn/which": ["which@3.0.1", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "bin/which.js" } }, "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg=="], + + "@orval/core/esbuild": ["esbuild@0.24.2", "", { "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" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA=="], + + "@orval/core/openapi3-ts": ["openapi3-ts@4.4.0", "", { "dependencies": { "yaml": "^2.5.0" } }, "sha512-9asTNB9IkKEzWMcHmVZE7Ts3kC9G7AFHfs8i7caD8HbI76gEjdkId4z/AkP83xdZsH7PLAnnbl47qZkXuxpArw=="], + + "@orval/mock/openapi3-ts": ["openapi3-ts@4.4.0", "", { "dependencies": { "yaml": "^2.5.0" } }, "sha512-9asTNB9IkKEzWMcHmVZE7Ts3kC9G7AFHfs8i7caD8HbI76gEjdkId4z/AkP83xdZsH7PLAnnbl47qZkXuxpArw=="], + + "@react-router/dev/prettier": ["prettier@2.8.8", "", { "bin": { "prettier": "bin-prettier.js" } }, "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q=="], + + "@rollup/plugin-babel/@rollup/pluginutils": ["@rollup/pluginutils@3.1.0", "", { "dependencies": { "@types/estree": "0.0.39", "estree-walker": "^1.0.1", "picomatch": "^2.2.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0" } }, "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg=="], + + "@rollup/plugin-babel/rollup": ["rollup@2.79.2", "", { "optionalDependencies": { "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ=="], + + "@rollup/plugin-replace/@rollup/pluginutils": ["@rollup/pluginutils@3.1.0", "", { "dependencies": { "@types/estree": "0.0.39", "estree-walker": "^1.0.1", "picomatch": "^2.2.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0" } }, "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg=="], + + "@rollup/plugin-replace/rollup": ["rollup@2.79.2", "", { "optionalDependencies": { "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ=="], + + "@stoplight/json-ref-readers/tslib": ["tslib@1.14.1", "", {}, "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="], + + "@stoplight/spectral-core/@stoplight/types": ["@stoplight/types@13.6.0", "", { "dependencies": { "@types/json-schema": "^7.0.4", "utility-types": "^3.10.0" } }, "sha512-dzyuzvUjv3m1wmhPfq82lCVYGcXG0xUYgqnWfCq3PCVR4BKFhjdkHrnJ+jIDoMKvXb05AZP/ObQF6+NpDo29IQ=="], + + "@stoplight/spectral-core/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "@stoplight/spectral-parsers/@stoplight/types": ["@stoplight/types@14.1.1", "", { "dependencies": { "@types/json-schema": "^7.0.4", "utility-types": "^3.10.0" } }, "sha512-/kjtr+0t0tjKr+heVfviO9FrU/uGLc+QNX3fHJc19xsCNYqU7lVhaXxDmEID9BZTjG+/r9pK9xP/xU02XGg65g=="], + + "@stoplight/yaml/@stoplight/types": ["@stoplight/types@14.1.1", "", { "dependencies": { "@types/json-schema": "^7.0.4", "utility-types": "^3.10.0" } }, "sha512-/kjtr+0t0tjKr+heVfviO9FrU/uGLc+QNX3fHJc19xsCNYqU7lVhaXxDmEID9BZTjG+/r9pK9xP/xU02XGg65g=="], + + "@telegram-apps/bridge/valibot": ["valibot@1.0.0", "", { "peerDependencies": { "typescript": ">=5" }, "optionalPeers": ["typescript"] }, "sha512-1Hc0ihzWxBar6NGeZv7fPLY0QuxFMyxwYR2sF1Blu7Wq7EnremwY2W02tit2ij2VJT8HcSkHAQqmFfl77f73Yw=="], + + "@telegram-apps/sdk/valibot": ["valibot@1.0.0", "", { "peerDependencies": { "typescript": ">=5" }, "optionalPeers": ["typescript"] }, "sha512-1Hc0ihzWxBar6NGeZv7fPLY0QuxFMyxwYR2sF1Blu7Wq7EnremwY2W02tit2ij2VJT8HcSkHAQqmFfl77f73Yw=="], + + "@telegram-apps/transformers/valibot": ["valibot@1.0.0-beta.14", "", { "peerDependencies": { "typescript": ">=5" }, "optionalPeers": ["typescript"] }, "sha512-tLyV2rE5QL6U29MFy3xt4AqMrn+/HErcp2ZThASnQvPMwfSozjV1uBGKIGiegtZIGjinJqn0SlBdannf18wENA=="], + + "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], + + "@vitejs/plugin-react/react-refresh": ["react-refresh@0.17.0", "", {}, "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ=="], + + "anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "babel-plugin-polyfill-corejs2/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "csso/css-tree": ["css-tree@2.2.1", "", { "dependencies": { "mdn-data": "2.0.28", "source-map-js": "^1.0.1" } }, "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA=="], + + "eslint/ajv": ["ajv@6.12.6", "", { "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" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], + + "eslint/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "filelist/minimatch": ["minimatch@5.1.6", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g=="], + + "foreground-child/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + + "hosted-git-info/lru-cache": ["lru-cache@7.18.3", "", {}, "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA=="], + + "jake/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "node-fetch/whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], + + "oas-linter/yaml": ["yaml@1.10.2", "", {}, "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="], + + "oas-resolver/yaml": ["yaml@1.10.2", "", {}, "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="], + + "oas-validator/yaml": ["yaml@1.10.2", "", {}, "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="], + + "parse-json/json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="], + + "path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + + "prop-types/react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], + + "source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "sucrase/commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="], + + "svgo/commander": ["commander@7.2.0", "", {}, "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="], + + "swagger2openapi/yaml": ["yaml@1.10.2", "", {}, "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="], + + "tailwindcss/chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], + + "terser/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], + + "vite-node/pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], + + "vite-tsconfig-paths/tsconfck": ["tsconfck@3.1.6", "", { "peerDependencies": { "typescript": "^5.0.0" }, "optionalPeers": ["typescript"], "bin": { "tsconfck": "bin/tsconfck.js" } }, "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w=="], + + "workbox-build/fs-extra": ["fs-extra@9.1.0", "", { "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ=="], + + "workbox-build/glob": ["glob@7.2.3", "", { "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" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + + "workbox-build/pretty-bytes": ["pretty-bytes@5.6.0", "", {}, "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg=="], + + "workbox-build/rollup": ["rollup@2.79.2", "", { "optionalDependencies": { "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ=="], + + "wrap-ansi/ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="], + + "wrap-ansi/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], + + "wrap-ansi/strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="], + + "@eslint/config-array/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + + "@eslint/eslintrc/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "@eslint/eslintrc/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + + "@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + + "@isaacs/cliui/strip-ansi/ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="], + + "@orval/core/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.24.2", "", { "os": "aix", "cpu": "ppc64" }, "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA=="], + + "@orval/core/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.24.2", "", { "os": "android", "cpu": "arm" }, "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q=="], + + "@orval/core/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.24.2", "", { "os": "android", "cpu": "arm64" }, "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg=="], + + "@orval/core/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.24.2", "", { "os": "android", "cpu": "x64" }, "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw=="], + + "@orval/core/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.24.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA=="], + + "@orval/core/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.24.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA=="], + + "@orval/core/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.24.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg=="], + + "@orval/core/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.24.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q=="], + + "@orval/core/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.24.2", "", { "os": "linux", "cpu": "arm" }, "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA=="], + + "@orval/core/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.24.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg=="], + + "@orval/core/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.24.2", "", { "os": "linux", "cpu": "ia32" }, "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw=="], + + "@orval/core/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.24.2", "", { "os": "linux", "cpu": "none" }, "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ=="], + + "@orval/core/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.24.2", "", { "os": "linux", "cpu": "none" }, "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw=="], + + "@orval/core/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.24.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw=="], + + "@orval/core/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.24.2", "", { "os": "linux", "cpu": "none" }, "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q=="], + + "@orval/core/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.24.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw=="], + + "@orval/core/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.24.2", "", { "os": "linux", "cpu": "x64" }, "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q=="], + + "@orval/core/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.24.2", "", { "os": "none", "cpu": "arm64" }, "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw=="], + + "@orval/core/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.24.2", "", { "os": "none", "cpu": "x64" }, "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw=="], + + "@orval/core/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.24.2", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A=="], + + "@orval/core/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.24.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA=="], + + "@orval/core/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.24.2", "", { "os": "sunos", "cpu": "x64" }, "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig=="], + + "@orval/core/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.24.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ=="], + + "@orval/core/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.24.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA=="], + + "@orval/core/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.24.2", "", { "os": "win32", "cpu": "x64" }, "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg=="], + + "@rollup/plugin-babel/@rollup/pluginutils/@types/estree": ["@types/estree@0.0.39", "", {}, "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw=="], + + "@rollup/plugin-babel/@rollup/pluginutils/estree-walker": ["estree-walker@1.0.1", "", {}, "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg=="], + + "@rollup/plugin-babel/@rollup/pluginutils/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "@rollup/plugin-replace/@rollup/pluginutils/@types/estree": ["@types/estree@0.0.39", "", {}, "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw=="], + + "@rollup/plugin-replace/@rollup/pluginutils/estree-walker": ["estree-walker@1.0.1", "", {}, "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg=="], + + "@rollup/plugin-replace/@rollup/pluginutils/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "@stoplight/spectral-core/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + + "csso/css-tree/mdn-data": ["mdn-data@2.0.28", "", {}, "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g=="], + + "eslint/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "eslint/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + + "jake/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + + "node-fetch/whatwg-url/tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], + + "node-fetch/whatwg-url/webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], + + "tailwindcss/chokidar/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "tailwindcss/chokidar/readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], + + "workbox-build/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "wrap-ansi/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + + "wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="], + + "tailwindcss/chokidar/readdirp/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "workbox-build/glob/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + } +} diff --git a/dashboard/components.json b/dashboard/components.json new file mode 100644 index 000000000..6296a74dd --- /dev/null +++ b/dashboard/components.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": false, + "tsx": true, + "tailwind": { + "config": "tailwind.config.js", + "css": "src/index.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "utils": "@/lib/utils", + "ui": "@/components/ui", + "lib": "@/lib", + "hooks": "@/hooks" + }, + "iconLibrary": "lucide" +} diff --git a/dashboard/custom.d.ts b/dashboard/custom.d.ts new file mode 100644 index 000000000..ec884c5ee --- /dev/null +++ b/dashboard/custom.d.ts @@ -0,0 +1,6 @@ +declare module '*.svg' { + import React = require('react') + export const ReactComponent: React.FC> + const src: string + export default src +} diff --git a/dashboard/eslint.config.js b/dashboard/eslint.config.js new file mode 100644 index 000000000..05c6758b9 --- /dev/null +++ b/dashboard/eslint.config.js @@ -0,0 +1,25 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import tseslint from 'typescript-eslint' + +export default tseslint.config( + { ignores: ['dist'] }, + { + extends: [js.configs.recommended, ...tseslint.configs.recommended], + files: ['**/*.{ts,tsx}'], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + plugins: { + 'react-hooks': reactHooks, + 'react-refresh': reactRefresh, + }, + rules: { + ...reactHooks.configs.recommended.rules, + 'react-refresh/only-export-components': ['warn', { allowConstantExport: true }], + }, + }, +) diff --git a/dashboard/index.html b/dashboard/index.html new file mode 100644 index 000000000..b321ac88f --- /dev/null +++ b/dashboard/index.html @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + PasarGuard + + +