From fdac0267201ecc3e7f8057ff898698e1a58dc1e2 Mon Sep 17 00:00:00 2001 From: huazhongmin Date: Sun, 26 Oct 2025 15:34:05 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8D=E5=86=8D=E4=BD=BF=E7=94=A8=E7=9A=84?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=B8=85=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/AugmentWebviewStateStore.xml | 2 +- .../java/com/emotion/config/WebMvcConfig.java | 20 +- .../emotion/controller/AuthController.java | 15 +- .../java/com/emotion/service/AuthService.java | 53 +- .../emotion/service/impl/AuthServiceImpl.java | 38 +- .../auth/config/SecurityConfig.java | 3 +- .../auth/controller/AuthController.java | 17 + .../auth/service/AuthService.java | 18 + .../auth/service/impl/AuthServiceImpl.java | 42 + .../src/main/resources/application.yml | 2 +- web-new/.env.development | 7 - web-new/.env.production | 7 - web-new/.eslintrc-auto-import.json | 314 - web-new/.eslintrc.cjs | 85 - web-new/.prettierrc | 15 - web-new/README.md | 213 - web-new/auto-imports.d.ts | 310 - web-new/components.d.ts | 19 - web-new/cypress.config.ts | 126 - web-new/index.html | 39 - web-new/package-lock.json | 15735 ---------------- web-new/package.json | 102 - web-new/postcss.config.js | 6 - web-new/src/App.vue | 118 - web-new/src/api/auth.ts | 85 - web-new/src/api/conversation.ts | 74 - web-new/src/api/diary.ts | 71 - web-new/src/api/user.ts | 97 - web-new/src/assets/styles/main.css | 230 - .../src/components/editor/RichTextEditor.vue | 472 - web-new/src/components/emoji/EmojiPicker.vue | 325 - .../src/components/error/ErrorBoundary.vue | 467 - .../notification/NotificationCenter.vue | 514 - web-new/src/components/upload/FileUpload.vue | 373 - web-new/src/components/upload/ImageUpload.vue | 471 - web-new/src/composables/useChat.ts | 307 - web-new/src/composables/useDiary.ts | 380 - web-new/src/composables/useUser.ts | 283 - web-new/src/config/constants.ts | 214 - web-new/src/config/emoji.ts | 158 - web-new/src/config/env.ts | 145 - web-new/src/i18n/index.ts | 26 - web-new/src/i18n/locales/en-US.json | 73 - web-new/src/i18n/locales/zh-CN.json | 73 - web-new/src/layouts/AuthLayout.vue | 124 - web-new/src/layouts/ChatLayout.vue | 376 - web-new/src/layouts/DefaultLayout.vue | 307 - web-new/src/main.ts | 50 - web-new/src/plugins/error-handler.ts | 44 - web-new/src/plugins/global-components.ts | 15 - web-new/src/plugins/progress-bar.ts | 29 - web-new/src/router/guards.ts | 159 - web-new/src/router/index.ts | 394 - web-new/src/stores/app.ts | 411 - web-new/src/stores/auth.ts | 399 - web-new/src/stores/notification.ts | 382 - web-new/src/types/api.ts | 316 - web-new/src/types/global.d.ts | 228 - web-new/src/utils/format.ts | 353 - web-new/src/utils/performance.ts | 384 - web-new/src/utils/request.ts | 346 - web-new/src/utils/storage.ts | 339 - web-new/src/utils/validation.ts | 400 - web-new/src/utils/websocket.ts | 395 - web-new/src/views/Home.vue | 242 - web-new/src/views/analysis/Analysis.vue | 538 - web-new/src/views/auth/Login.vue | 295 - web-new/src/views/auth/Register.vue | 399 - web-new/src/views/chat/Chat.vue | 331 - web-new/src/views/chat/ChatHistory.vue | 474 - .../src/views/dashboard/PersonalDashboard.vue | 440 - web-new/src/views/diary/Diary.vue | 484 - web-new/src/views/diary/DiaryDetail.vue | 543 - web-new/src/views/diary/DiaryEditor.vue | 578 - web-new/src/views/error/NotFound.vue | 85 - web-new/src/views/profile/Profile.vue | 518 - web-new/src/views/settings/Settings.vue | 430 - web-new/tailwind.config.js | 98 - web-new/tests/e2e/specs/auth.cy.ts | 304 - web-new/tests/e2e/support/commands.ts | 204 - web-new/tests/e2e/support/e2e.ts | 97 - web-new/tests/setup.ts | 125 - .../tests/unit/components/FileUpload.test.ts | 245 - web-new/tests/unit/stores/auth.test.ts | 349 - web-new/tests/unit/utils/format.test.ts | 223 - web-new/tests/unit/utils/validation.test.ts | 220 - web-new/tsconfig.json | 57 - web-new/tsconfig.node.json | 17 - web-new/vite.config.ts | 223 - web-new/vitest.config.ts | 76 - web-new/web功能与页面梳理.md | 131 - web-new/前端技术方案Augment.md | 1138 -- web-new/前端环境配置梳理.md | 517 - web-new/重构计划.md | 711 - web/deploy.ps1 | 52 - web/src/router/index.ts | 15 + web/src/services/auth.ts | 39 +- web/src/types/auth.ts | 26 +- web/src/views/Login/index.vue | 153 +- 开心APP网页代码v1.1.zip | Bin 54574 -> 0 bytes 情绪博物馆MVP需求规格书.md | 441 - 101 files changed, 278 insertions(+), 38135 deletions(-) delete mode 100644 web-new/.env.development delete mode 100644 web-new/.env.production delete mode 100644 web-new/.eslintrc-auto-import.json delete mode 100644 web-new/.eslintrc.cjs delete mode 100644 web-new/.prettierrc delete mode 100644 web-new/README.md delete mode 100644 web-new/auto-imports.d.ts delete mode 100644 web-new/components.d.ts delete mode 100644 web-new/cypress.config.ts delete mode 100644 web-new/index.html delete mode 100644 web-new/package-lock.json delete mode 100644 web-new/package.json delete mode 100644 web-new/postcss.config.js delete mode 100644 web-new/src/App.vue delete mode 100644 web-new/src/api/auth.ts delete mode 100644 web-new/src/api/conversation.ts delete mode 100644 web-new/src/api/diary.ts delete mode 100644 web-new/src/api/user.ts delete mode 100644 web-new/src/assets/styles/main.css delete mode 100644 web-new/src/components/editor/RichTextEditor.vue delete mode 100644 web-new/src/components/emoji/EmojiPicker.vue delete mode 100644 web-new/src/components/error/ErrorBoundary.vue delete mode 100644 web-new/src/components/notification/NotificationCenter.vue delete mode 100644 web-new/src/components/upload/FileUpload.vue delete mode 100644 web-new/src/components/upload/ImageUpload.vue delete mode 100644 web-new/src/composables/useChat.ts delete mode 100644 web-new/src/composables/useDiary.ts delete mode 100644 web-new/src/composables/useUser.ts delete mode 100644 web-new/src/config/constants.ts delete mode 100644 web-new/src/config/emoji.ts delete mode 100644 web-new/src/config/env.ts delete mode 100644 web-new/src/i18n/index.ts delete mode 100644 web-new/src/i18n/locales/en-US.json delete mode 100644 web-new/src/i18n/locales/zh-CN.json delete mode 100644 web-new/src/layouts/AuthLayout.vue delete mode 100644 web-new/src/layouts/ChatLayout.vue delete mode 100644 web-new/src/layouts/DefaultLayout.vue delete mode 100644 web-new/src/main.ts delete mode 100644 web-new/src/plugins/error-handler.ts delete mode 100644 web-new/src/plugins/global-components.ts delete mode 100644 web-new/src/plugins/progress-bar.ts delete mode 100644 web-new/src/router/guards.ts delete mode 100644 web-new/src/router/index.ts delete mode 100644 web-new/src/stores/app.ts delete mode 100644 web-new/src/stores/auth.ts delete mode 100644 web-new/src/stores/notification.ts delete mode 100644 web-new/src/types/api.ts delete mode 100644 web-new/src/types/global.d.ts delete mode 100644 web-new/src/utils/format.ts delete mode 100644 web-new/src/utils/performance.ts delete mode 100644 web-new/src/utils/request.ts delete mode 100644 web-new/src/utils/storage.ts delete mode 100644 web-new/src/utils/validation.ts delete mode 100644 web-new/src/utils/websocket.ts delete mode 100644 web-new/src/views/Home.vue delete mode 100644 web-new/src/views/analysis/Analysis.vue delete mode 100644 web-new/src/views/auth/Login.vue delete mode 100644 web-new/src/views/auth/Register.vue delete mode 100644 web-new/src/views/chat/Chat.vue delete mode 100644 web-new/src/views/chat/ChatHistory.vue delete mode 100644 web-new/src/views/dashboard/PersonalDashboard.vue delete mode 100644 web-new/src/views/diary/Diary.vue delete mode 100644 web-new/src/views/diary/DiaryDetail.vue delete mode 100644 web-new/src/views/diary/DiaryEditor.vue delete mode 100644 web-new/src/views/error/NotFound.vue delete mode 100644 web-new/src/views/profile/Profile.vue delete mode 100644 web-new/src/views/settings/Settings.vue delete mode 100644 web-new/tailwind.config.js delete mode 100644 web-new/tests/e2e/specs/auth.cy.ts delete mode 100644 web-new/tests/e2e/support/commands.ts delete mode 100644 web-new/tests/e2e/support/e2e.ts delete mode 100644 web-new/tests/setup.ts delete mode 100644 web-new/tests/unit/components/FileUpload.test.ts delete mode 100644 web-new/tests/unit/stores/auth.test.ts delete mode 100644 web-new/tests/unit/utils/format.test.ts delete mode 100644 web-new/tests/unit/utils/validation.test.ts delete mode 100644 web-new/tsconfig.json delete mode 100644 web-new/tsconfig.node.json delete mode 100644 web-new/vite.config.ts delete mode 100644 web-new/vitest.config.ts delete mode 100644 web-new/web功能与页面梳理.md delete mode 100644 web-new/前端技术方案Augment.md delete mode 100644 web-new/前端环境配置梳理.md delete mode 100644 web-new/重构计划.md delete mode 100644 web/deploy.ps1 delete mode 100644 开心APP网页代码v1.1.zip delete mode 100644 情绪博物馆MVP需求规格书.md diff --git a/.idea/AugmentWebviewStateStore.xml b/.idea/AugmentWebviewStateStore.xml index 07ece10..559f5df 100644 --- a/.idea/AugmentWebviewStateStore.xml +++ b/.idea/AugmentWebviewStateStore.xml @@ -3,7 +3,7 @@ diff --git a/backend-single/src/main/java/com/emotion/config/WebMvcConfig.java b/backend-single/src/main/java/com/emotion/config/WebMvcConfig.java index 42e5717..7b6f3b7 100644 --- a/backend-single/src/main/java/com/emotion/config/WebMvcConfig.java +++ b/backend-single/src/main/java/com/emotion/config/WebMvcConfig.java @@ -23,15 +23,17 @@ public class WebMvcConfig implements WebMvcConfigurer { registry.addInterceptor(jwtAuthInterceptor) .addPathPatterns("/api/**") // 拦截所有API请求 .excludePathPatterns( - "/api/auth/login", // 登录接口 - "/api/auth/register", // 注册接口 - "/api/auth/captcha", // 验证码接口 - "/api/auth/refresh-token", // 刷新token接口 - "/api/health", // 健康检查接口 - "/api/ws/**", // WebSocket接口 - "/swagger-ui/**", // Swagger UI - "/v3/api-docs/**", // API文档 - "/actuator/**" // 监控端点 + "/api/auth/login", // 登录接口 + "/api/auth/register", // 注册接口 + "/api/auth/captcha", // 图形验证码接口 + "/api/auth/sms-code", // 短信验证码接口(免登录) + "/api/auth/refresh-token", // 刷新token接口 + "/api/auth/resetPassword", // 重置密码接口(免登录) + "/api/health", // 健康检查接口 + "/api/ws/**", // WebSocket接口 + "/swagger-ui/**", // Swagger UI + "/v3/api-docs/**", // API文档 + "/actuator/**" // 监控端点 ); } } diff --git a/backend-single/src/main/java/com/emotion/controller/AuthController.java b/backend-single/src/main/java/com/emotion/controller/AuthController.java index d5d9735..8661da3 100644 --- a/backend-single/src/main/java/com/emotion/controller/AuthController.java +++ b/backend-single/src/main/java/com/emotion/controller/AuthController.java @@ -4,6 +4,9 @@ import com.emotion.common.Result; import com.emotion.dto.request.LoginRequest; import com.emotion.dto.request.RegisterRequest; import com.emotion.dto.request.RefreshTokenRequest; +import com.emotion.dto.request.ResetPasswordRequest; +import com.emotion.dto.response.ResetPasswordResponse; + import com.emotion.dto.response.AuthResponse; import com.emotion.dto.response.CaptchaResponse; import com.emotion.dto.response.SmsCodeResponse; @@ -50,13 +53,23 @@ public class AuthController { /** * 用户注册(简化版:仅需手机号、密码和短信验证码) */ - @PostMapping("/register") + @PostMapping(value = "/register") @Operation(summary = "用户注册", description = "使用手机号、密码和短信验证码进行注册") public Result register(@Valid @RequestBody RegisterRequest request) { AuthResponse response = authService.register(request); return Result.success("注册成功", response); } + /** + * 重置密码(手机号 + 验证码) + */ + @PostMapping(value = "/resetPassword") + @Operation(summary = "重置密码", description = "通过手机号和验证码重置密码,验证码本期固定为123456") + public Result resetPassword(@Valid @RequestBody ResetPasswordRequest request) { + ResetPasswordResponse response = authService.resetPassword(request); + return Result.success("重置密码成功", response); + } + /** * 获取当前用户信息 */ diff --git a/backend-single/src/main/java/com/emotion/service/AuthService.java b/backend-single/src/main/java/com/emotion/service/AuthService.java index 776cdd9..6be83d5 100644 --- a/backend-single/src/main/java/com/emotion/service/AuthService.java +++ b/backend-single/src/main/java/com/emotion/service/AuthService.java @@ -2,6 +2,9 @@ package com.emotion.service; import com.emotion.dto.request.LoginRequest; import com.emotion.dto.request.RegisterRequest; +import com.emotion.dto.request.ResetPasswordRequest; +import com.emotion.dto.response.ResetPasswordResponse; + import com.emotion.dto.response.AuthResponse; import com.emotion.dto.response.CaptchaResponse; import com.emotion.dto.response.SmsCodeResponse; @@ -11,52 +14,60 @@ import javax.servlet.http.HttpServletRequest; /** * 认证服务接口 - * + * * @author emotion-museum * @date 2025-07-23 */ public interface AuthService { - + /** * 用户登录 - * + * * @param request 登录请求 * @return 认证响应 */ AuthResponse login(LoginRequest request); - + /** * 用户注册 - * + * * @param request 注册请求 * @return 认证响应 */ + /** + * 重置密码(手机号 + 验证码) + * + * @param request 重置密码请求 + * @return 重置密码响应 + */ + ResetPasswordResponse resetPassword(ResetPasswordRequest request); + AuthResponse register(RegisterRequest request); - + /** * 获取当前用户信息 - * + * * @param userId 用户ID * @return 用户信息响应 */ UserInfoResponse getCurrentUserInfo(String userId); - + /** * 生成验证码 - * + * * @return 验证码响应 */ CaptchaResponse generateCaptcha(); - + /** * 验证验证码 - * + * * @param captchaKey 验证码key - * @param captcha 验证码 + * @param captcha 验证码 * @return 是否验证成功 */ boolean validateCaptcha(String captchaKey, String captcha); - + /** * 用户登出 * @@ -73,18 +84,18 @@ public interface AuthService { * @return 是否登出成功 */ boolean logoutByToken(HttpServletRequest request); - + /** * 刷新访问令牌 - * + * * @param refreshToken 刷新令牌 * @return 新的认证响应 */ AuthResponse refreshToken(String refreshToken); - + /** * 验证访问令牌 - * + * * @param request HTTP请求 * @return 是否有效 */ @@ -92,20 +103,20 @@ public interface AuthService { /** * 验证访问令牌 - * + * * @param token 访问令牌 * @return 是否有效 */ boolean validateToken(String token); - + /** * 从令牌中获取用户ID - * + * * @param token 访问令牌 * @return 用户ID */ String getUserIdFromToken(String token); - + /** * 从令牌中获取用户名 * diff --git a/backend-single/src/main/java/com/emotion/service/impl/AuthServiceImpl.java b/backend-single/src/main/java/com/emotion/service/impl/AuthServiceImpl.java index f68ed3c..2e70b06 100644 --- a/backend-single/src/main/java/com/emotion/service/impl/AuthServiceImpl.java +++ b/backend-single/src/main/java/com/emotion/service/impl/AuthServiceImpl.java @@ -2,8 +2,10 @@ package com.emotion.service.impl; import com.emotion.dto.request.LoginRequest; import com.emotion.dto.request.RegisterRequest; +import com.emotion.dto.request.ResetPasswordRequest; import com.emotion.dto.response.AuthResponse; import com.emotion.dto.response.CaptchaResponse; +import com.emotion.dto.response.ResetPasswordResponse; import com.emotion.dto.response.SmsCodeResponse; import com.emotion.dto.response.UserInfoResponse; import com.emotion.entity.User; @@ -155,6 +157,30 @@ public class AuthServiceImpl implements AuthService { return response; } + @Override + public ResetPasswordResponse resetPassword(ResetPasswordRequest request) { + // 验证码本期固定为123456 + if (request.getCaptcha() == null || !"123456".equals(request.getCaptcha().trim())) { + throw new CaptchaException("验证码错误或已过期"); + } + + // 根据手机号查询用户 + User user = userService.getByPhone(request.getPhone()); + if (user == null) { + throw new BusinessException("用户不存在"); + } + + // 使用统一的 PasswordEncoder 进行加密,保持与登录/注册一致 + String encoded = passwordEncoder.encode(request.getNewPassword()); + user.setPassword(encoded); + userService.updateById(user); + + ResetPasswordResponse resp = new ResetPasswordResponse(); + resp.setSuccess(true); + resp.setMessage("重置密码成功"); + return resp; + } + @Override public UserInfoResponse getCurrentUserInfo(String userId) { User user = userService.getById(userId); @@ -168,15 +194,15 @@ public class AuthServiceImpl implements AuthService { public CaptchaResponse generateCaptcha() { String captchaKey = UUID.randomUUID().toString(); String captchaCode = generateCaptchaCode(); - + // 生成验证码图片 String captchaImage = generateCaptchaImage(captchaCode); - + // 存储验证码到Redis redisTemplate.opsForValue().set( - CAPTCHA_PREFIX + captchaKey, - captchaCode.toLowerCase(), - CAPTCHA_EXPIRE_MINUTES, + CAPTCHA_PREFIX + captchaKey, + captchaCode.toLowerCase(), + CAPTCHA_EXPIRE_MINUTES, TimeUnit.MINUTES ); @@ -201,7 +227,7 @@ public class AuthServiceImpl implements AuthService { // 验证成功后删除验证码 redisTemplate.delete(CAPTCHA_PREFIX + captchaKey); - + return storedCaptcha.equalsIgnoreCase(captcha.trim()); } diff --git a/backend/auth/server/src/main/java/com/emotionmuseum/auth/config/SecurityConfig.java b/backend/auth/server/src/main/java/com/emotionmuseum/auth/config/SecurityConfig.java index e29c1b4..09ac311 100644 --- a/backend/auth/server/src/main/java/com/emotionmuseum/auth/config/SecurityConfig.java +++ b/backend/auth/server/src/main/java/com/emotionmuseum/auth/config/SecurityConfig.java @@ -109,7 +109,8 @@ public class SecurityConfig { "/auth/check-account", "/auth/check-email", "/auth/check-phone", - "/captcha/**", + "/auth/resetPassword", + "/captcha/**", "/oauth/**") .permitAll() diff --git a/backend/auth/server/src/main/java/com/emotionmuseum/auth/controller/AuthController.java b/backend/auth/server/src/main/java/com/emotionmuseum/auth/controller/AuthController.java index 4cd5017..f2dee05 100644 --- a/backend/auth/server/src/main/java/com/emotionmuseum/auth/controller/AuthController.java +++ b/backend/auth/server/src/main/java/com/emotionmuseum/auth/controller/AuthController.java @@ -3,8 +3,10 @@ package com.emotionmuseum.auth.controller; import com.emotionmuseum.common.result.Result; import com.emotionmuseum.auth.request.LoginRequest; import com.emotionmuseum.auth.request.RegisterRequest; +import com.emotionmuseum.auth.request.ResetPasswordRequest; import com.emotionmuseum.auth.service.AuthService; import com.emotionmuseum.auth.response.LoginResponse; +import com.emotionmuseum.auth.response.ResetPasswordResponse; import com.emotionmuseum.auth.response.UserInfoResponse; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -108,4 +110,19 @@ public class AuthController { boolean exists = authService.existsByPhone(phone); return Result.success(exists); } + + /** + * 重置密码(未登录场景) + * + * @param request 重置密码请求(手机号 + 新密码 + 验证码=123456) + * @return 重置密码响应 + */ + @Operation(summary = "重置密码(手机号+验证码)") + @PostMapping("/resetPassword") + public Result resetPassword(@Valid @RequestBody ResetPasswordRequest request) { + log.info("重置密码请求: phone={}", request.getPhone()); + ResetPasswordResponse response = authService.resetPassword(request); + return Result.success("重置密码成功", response); + } } + diff --git a/backend/auth/server/src/main/java/com/emotionmuseum/auth/service/AuthService.java b/backend/auth/server/src/main/java/com/emotionmuseum/auth/service/AuthService.java index 00dc32a..9c0158c 100644 --- a/backend/auth/server/src/main/java/com/emotionmuseum/auth/service/AuthService.java +++ b/backend/auth/server/src/main/java/com/emotionmuseum/auth/service/AuthService.java @@ -2,12 +2,18 @@ package com.emotionmuseum.auth.service; import com.emotionmuseum.auth.request.LoginRequest; import com.emotionmuseum.auth.request.RegisterRequest; +import com.emotionmuseum.auth.request.ResetPasswordRequest; import com.emotionmuseum.auth.response.LoginResponse; +import com.emotionmuseum.auth.response.ResetPasswordResponse; import com.emotionmuseum.auth.response.UserInfoResponse; /** * 认证服务接口 * + *

+ * 注意:所有新增接口需遵循项目接口规范与异常处理规范。 + *

+ * * @author emotion-museum * @since 2025-07-16 */ @@ -89,4 +95,16 @@ public interface AuthService { * @param userId 用户ID */ void updateLastActiveTime(String userId); + + /** + * 重置密码(未登录场景) + * + *

+ * 通过手机号与验证码(当前固定为123456)设置新密码。 + *

+ * + * @param request 重置密码请求 + * @return 重置密码响应 + */ + ResetPasswordResponse resetPassword(ResetPasswordRequest request); } diff --git a/backend/auth/server/src/main/java/com/emotionmuseum/auth/service/impl/AuthServiceImpl.java b/backend/auth/server/src/main/java/com/emotionmuseum/auth/service/impl/AuthServiceImpl.java index 633f4c7..dd2bacf 100644 --- a/backend/auth/server/src/main/java/com/emotionmuseum/auth/service/impl/AuthServiceImpl.java +++ b/backend/auth/server/src/main/java/com/emotionmuseum/auth/service/impl/AuthServiceImpl.java @@ -6,11 +6,13 @@ import com.emotionmuseum.common.result.ResultCode; import com.emotionmuseum.common.util.JwtUtil; import com.emotionmuseum.auth.request.LoginRequest; import com.emotionmuseum.auth.request.RegisterRequest; +import com.emotionmuseum.auth.request.ResetPasswordRequest; import com.emotionmuseum.auth.entity.User; import com.emotionmuseum.auth.mapper.UserMapper; import com.emotionmuseum.auth.service.AuthService; import com.emotionmuseum.auth.service.CaptchaService; import com.emotionmuseum.auth.response.LoginResponse; +import com.emotionmuseum.auth.response.ResetPasswordResponse; import com.emotionmuseum.auth.response.UserInfoResponse; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -239,6 +241,46 @@ public class AuthServiceImpl extends ServiceImpl implements Au return convertToUserInfoResponse(user); } + /** + * 重置密码(未登录场景) + * + *

+ * 校验验证码(当前固定为123456),按手机号查询用户,使用 PasswordEncoder(BCrypt) 加密新密码并更新。 + *

+ * + * @param request 重置密码请求 + * @return 重置密码响应 + */ + @Override + public ResetPasswordResponse resetPassword(ResetPasswordRequest request) { + // 校验验证码(本期约定固定为 123456) + if (!"123456".equals(request.getCaptcha())) { + throw new RuntimeException(ResultCode.CAPTCHA_ERROR.getMessage()); + } + + // 按手机号查找用户 + User user = baseMapper.selectByPhone(request.getPhone()); + if (user == null) { + throw new RuntimeException(ResultCode.USER_NOT_FOUND.getMessage()); + } + + // 获取加密器并加密新密码 + PasswordEncoder passwordEncoder = applicationContext.getBean(PasswordEncoder.class); + String encoded = passwordEncoder.encode(request.getNewPassword()); + + // 仅更新密码与更新时间(遵循仅更新非空字段原则) + User toUpdate = new User(); + toUpdate.setId(user.getId()); + toUpdate.setPassword(encoded); + updateById(toUpdate); + + log.info("用户重置密码成功: phone={}", request.getPhone()); + ResetPasswordResponse resp = new ResetPasswordResponse(); + resp.setSuccess(true); + resp.setMessage("重置密码成功"); + return resp; + } + @Override public void updateLastActiveTime(String userId) { baseMapper.updateLastActiveTime(userId); diff --git a/backend/gateway/src/main/resources/application.yml b/backend/gateway/src/main/resources/application.yml index 7e02045..e9dca6f 100644 --- a/backend/gateway/src/main/resources/application.yml +++ b/backend/gateway/src/main/resources/application.yml @@ -68,7 +68,7 @@ spring: predicates: - Path=/api/auth/** filters: - - StripPrefix=2 + - StripPrefix=1 # 认证服务路由 - 直接路径 - id: emotion-auth-direct diff --git a/web-new/.env.development b/web-new/.env.development deleted file mode 100644 index 9b723cd..0000000 --- a/web-new/.env.development +++ /dev/null @@ -1,7 +0,0 @@ -# 开发环境配置 -VITE_APP_ENV=dev -VITE_API_BASE_URL=https://dev-api.emotion-museum.com/api -VITE_WS_BASE_URL=wss://dev-api.emotion-museum.com -VITE_UPLOAD_URL=https://dev-api.emotion-museum.com/api/upload -VITE_DEBUG=true -VITE_MOCK=false diff --git a/web-new/.env.production b/web-new/.env.production deleted file mode 100644 index af844ed..0000000 --- a/web-new/.env.production +++ /dev/null @@ -1,7 +0,0 @@ -# 生产环境配置 -VITE_APP_ENV=prod -VITE_API_BASE_URL=https://api.emotion-museum.com/api -VITE_WS_BASE_URL=wss://api.emotion-museum.com -VITE_UPLOAD_URL=https://api.emotion-museum.com/api/upload -VITE_DEBUG=false -VITE_MOCK=false diff --git a/web-new/.eslintrc-auto-import.json b/web-new/.eslintrc-auto-import.json deleted file mode 100644 index 37982c4..0000000 --- a/web-new/.eslintrc-auto-import.json +++ /dev/null @@ -1,314 +0,0 @@ -{ - "globals": { - "Component": true, - "ComponentPublicInstance": true, - "ComputedRef": true, - "DirectiveBinding": true, - "EffectScope": true, - "ExtractDefaultPropTypes": true, - "ExtractPropTypes": true, - "ExtractPublicPropTypes": true, - "InjectionKey": true, - "MaybeRef": true, - "MaybeRefOrGetter": true, - "PropType": true, - "Ref": true, - "VNode": true, - "WritableComputedRef": true, - "acceptHMRUpdate": true, - "asyncComputed": true, - "autoResetRef": true, - "computed": true, - "computedAsync": true, - "computedEager": true, - "computedInject": true, - "computedWithControl": true, - "controlledComputed": true, - "controlledRef": true, - "createApp": true, - "createEventHook": true, - "createGlobalState": true, - "createInjectionState": true, - "createPinia": true, - "createReactiveFn": true, - "createReusableTemplate": true, - "createSharedComposable": true, - "createTemplatePromise": true, - "createUnrefFn": true, - "customRef": true, - "debouncedRef": true, - "debouncedWatch": true, - "defineAsyncComponent": true, - "defineComponent": true, - "defineStore": true, - "eagerComputed": true, - "effectScope": true, - "extendRef": true, - "getActivePinia": true, - "getCurrentInstance": true, - "getCurrentScope": true, - "h": true, - "ignorableWatch": true, - "inject": true, - "injectLocal": true, - "isDefined": true, - "isProxy": true, - "isReactive": true, - "isReadonly": true, - "isRef": true, - "makeDestructurable": true, - "mapActions": true, - "mapGetters": true, - "mapState": true, - "mapStores": true, - "mapWritableState": true, - "markRaw": true, - "nextTick": true, - "onActivated": true, - "onBeforeMount": true, - "onBeforeRouteLeave": true, - "onBeforeRouteUpdate": true, - "onBeforeUnmount": true, - "onBeforeUpdate": true, - "onClickOutside": true, - "onDeactivated": true, - "onErrorCaptured": true, - "onKeyStroke": true, - "onLongPress": true, - "onMounted": true, - "onRenderTracked": true, - "onRenderTriggered": true, - "onScopeDispose": true, - "onServerPrefetch": true, - "onStartTyping": true, - "onUnmounted": true, - "onUpdated": true, - "onWatcherCleanup": true, - "pausableWatch": true, - "provide": true, - "provideLocal": true, - "reactify": true, - "reactifyObject": true, - "reactive": true, - "reactiveComputed": true, - "reactiveOmit": true, - "reactivePick": true, - "readonly": true, - "ref": true, - "refAutoReset": true, - "refDebounced": true, - "refDefault": true, - "refThrottled": true, - "refWithControl": true, - "resolveComponent": true, - "resolveRef": true, - "resolveUnref": true, - "setActivePinia": true, - "setMapStoreSuffix": true, - "shallowReactive": true, - "shallowReadonly": true, - "shallowRef": true, - "storeToRefs": true, - "syncRef": true, - "syncRefs": true, - "templateRef": true, - "throttledRef": true, - "throttledWatch": true, - "toRaw": true, - "toReactive": true, - "toRef": true, - "toRefs": true, - "toValue": true, - "triggerRef": true, - "tryOnBeforeMount": true, - "tryOnBeforeUnmount": true, - "tryOnMounted": true, - "tryOnScopeDispose": true, - "tryOnUnmounted": true, - "unref": true, - "unrefElement": true, - "until": true, - "useActiveElement": true, - "useAnimate": true, - "useArrayDifference": true, - "useArrayEvery": true, - "useArrayFilter": true, - "useArrayFind": true, - "useArrayFindIndex": true, - "useArrayFindLast": true, - "useArrayIncludes": true, - "useArrayJoin": true, - "useArrayMap": true, - "useArrayReduce": true, - "useArraySome": true, - "useArrayUnique": true, - "useAsyncQueue": true, - "useAsyncState": true, - "useAttrs": true, - "useBase64": true, - "useBattery": true, - "useBluetooth": true, - "useBreakpoints": true, - "useBroadcastChannel": true, - "useBrowserLocation": true, - "useCached": true, - "useClipboard": true, - "useClipboardItems": true, - "useCloned": true, - "useColorMode": true, - "useConfirmDialog": true, - "useCounter": true, - "useCssModule": true, - "useCssVar": true, - "useCssVars": true, - "useCurrentElement": true, - "useCycleList": true, - "useDark": true, - "useDateFormat": true, - "useDebounce": true, - "useDebounceFn": true, - "useDebouncedRefHistory": true, - "useDeviceMotion": true, - "useDeviceOrientation": true, - "useDevicePixelRatio": true, - "useDevicesList": true, - "useDisplayMedia": true, - "useDocumentVisibility": true, - "useDraggable": true, - "useDropZone": true, - "useElementBounding": true, - "useElementByPoint": true, - "useElementHover": true, - "useElementSize": true, - "useElementVisibility": true, - "useEventBus": true, - "useEventListener": true, - "useEventSource": true, - "useEyeDropper": true, - "useFavicon": true, - "useFetch": true, - "useFileDialog": true, - "useFileSystemAccess": true, - "useFocus": true, - "useFocusWithin": true, - "useFps": true, - "useFullscreen": true, - "useGamepad": true, - "useGeolocation": true, - "useI18n": true, - "useId": true, - "useIdle": true, - "useImage": true, - "useInfiniteScroll": true, - "useIntersectionObserver": true, - "useInterval": true, - "useIntervalFn": true, - "useKeyModifier": true, - "useLastChanged": true, - "useLink": true, - "useLocalStorage": true, - "useMagicKeys": true, - "useManualRefHistory": true, - "useMediaControls": true, - "useMediaQuery": true, - "useMemoize": true, - "useMemory": true, - "useModel": true, - "useMounted": true, - "useMouse": true, - "useMouseInElement": true, - "useMousePressed": true, - "useMutationObserver": true, - "useNavigatorLanguage": true, - "useNetwork": true, - "useNow": true, - "useObjectUrl": true, - "useOffsetPagination": true, - "useOnline": true, - "usePageLeave": true, - "useParallax": true, - "useParentElement": true, - "usePerformanceObserver": true, - "usePermission": true, - "usePointer": true, - "usePointerLock": true, - "usePointerSwipe": true, - "usePreferredColorScheme": true, - "usePreferredContrast": true, - "usePreferredDark": true, - "usePreferredLanguages": true, - "usePreferredReducedMotion": true, - "usePrevious": true, - "useRafFn": true, - "useRefHistory": true, - "useResizeObserver": true, - "useRoute": true, - "useRouter": true, - "useScreenOrientation": true, - "useScreenSafeArea": true, - "useScriptTag": true, - "useScroll": true, - "useScrollLock": true, - "useSessionStorage": true, - "useShare": true, - "useSlots": true, - "useSorted": true, - "useSpeechRecognition": true, - "useSpeechSynthesis": true, - "useStepper": true, - "useStorage": true, - "useStorageAsync": true, - "useStyleTag": true, - "useSupported": true, - "useSwipe": true, - "useTemplateRef": true, - "useTemplateRefsList": true, - "useTextDirection": true, - "useTextSelection": true, - "useTextareaAutosize": true, - "useThrottle": true, - "useThrottleFn": true, - "useThrottledRefHistory": true, - "useTimeAgo": true, - "useTimeout": true, - "useTimeoutFn": true, - "useTimeoutPoll": true, - "useTimestamp": true, - "useTitle": true, - "useToNumber": true, - "useToString": true, - "useToggle": true, - "useTransition": true, - "useUrlSearchParams": true, - "useUserMedia": true, - "useVModel": true, - "useVModels": true, - "useVibrate": true, - "useVirtualList": true, - "useWakeLock": true, - "useWebNotification": true, - "useWebSocket": true, - "useWebWorker": true, - "useWebWorkerFn": true, - "useWindowFocus": true, - "useWindowScroll": true, - "useWindowSize": true, - "watch": true, - "watchArray": true, - "watchAtMost": true, - "watchDebounced": true, - "watchDeep": true, - "watchEffect": true, - "watchIgnorable": true, - "watchImmediate": true, - "watchOnce": true, - "watchPausable": true, - "watchPostEffect": true, - "watchSyncEffect": true, - "watchThrottled": true, - "watchTriggerable": true, - "watchWithFilter": true, - "whenever": true, - "ElMessage": true - } -} diff --git a/web-new/.eslintrc.cjs b/web-new/.eslintrc.cjs deleted file mode 100644 index 0a7f168..0000000 --- a/web-new/.eslintrc.cjs +++ /dev/null @@ -1,85 +0,0 @@ -/* eslint-env node */ -require('@rushstack/eslint-patch/modern-module-resolution') - -module.exports = { - root: true, - extends: [ - 'plugin:vue/vue3-essential', - 'eslint:recommended', - '@vue/eslint-config-typescript', - '@vue/eslint-config-prettier/skip-formatting', - './.eslintrc-auto-import.json' - ], - parserOptions: { - ecmaVersion: 'latest' - }, - env: { - node: true, - browser: true, - es2022: true - }, - globals: { - defineEmits: 'readonly', - defineProps: 'readonly', - defineExpose: 'readonly', - withDefaults: 'readonly' - }, - rules: { - // Vue规则 - 'vue/multi-word-component-names': 'off', - 'vue/no-v-html': 'off', - 'vue/require-default-prop': 'off', - 'vue/require-explicit-emits': 'off', - 'vue/html-self-closing': [ - 'error', - { - html: { - void: 'always', - normal: 'always', - component: 'always' - }, - svg: 'always', - math: 'always' - } - ], - - // TypeScript规则 - '@typescript-eslint/no-unused-vars': [ - 'error', - { - argsIgnorePattern: '^_', - varsIgnorePattern: '^_' - } - ], - '@typescript-eslint/no-explicit-any': 'warn', - '@typescript-eslint/ban-ts-comment': 'off', - '@typescript-eslint/prefer-ts-expect-error': 'error', - - // 通用规则 - 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', - 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off', - 'no-unused-vars': 'off', // 使用TypeScript版本 - 'prefer-const': 'error', - 'no-var': 'error', - - // 代码风格 - 'eqeqeq': ['error', 'always'], - 'curly': ['error', 'all'], - 'brace-style': ['error', '1tbs'], - 'comma-dangle': ['error', 'never'], - 'quotes': ['error', 'single', { avoidEscape: true }], - 'semi': ['error', 'never'] - }, - overrides: [ - { - files: ['cypress/e2e/**/*.{cy,spec}.{js,ts,jsx,tsx}'], - extends: ['plugin:cypress/recommended'] - }, - { - files: ['src/**/__tests__/**/*', 'src/**/*.{test,spec}.*'], - env: { - vitest: true - } - } - ] -} diff --git a/web-new/.prettierrc b/web-new/.prettierrc deleted file mode 100644 index 9f1e535..0000000 --- a/web-new/.prettierrc +++ /dev/null @@ -1,15 +0,0 @@ -{ - "semi": false, - "singleQuote": true, - "tabWidth": 2, - "useTabs": false, - "trailingComma": "none", - "printWidth": 100, - "bracketSpacing": true, - "bracketSameLine": false, - "arrowParens": "avoid", - "endOfLine": "lf", - "vueIndentScriptAndStyle": false, - "htmlWhitespaceSensitivity": "ignore", - "embeddedLanguageFormatting": "auto" -} diff --git a/web-new/README.md b/web-new/README.md deleted file mode 100644 index 146f05a..0000000 --- a/web-new/README.md +++ /dev/null @@ -1,213 +0,0 @@ -# 情绪博物馆 Web 端 - -基于 Vue 3 + TypeScript + Vite 的现代化前端应用,为用户提供情绪记录和心理健康服务。 - -## ✨ 特性 - -- 🚀 **现代化技术栈**: Vue 3.4.21 + TypeScript 5.4.2 + Vite 5.1.6 -- 🎨 **优雅的UI**: Element Plus 2.6.1 + Tailwind CSS 3.4.1 -- 📱 **响应式设计**: 支持桌面端和移动端 -- 🔐 **完整的认证**: JWT Token + 自动刷新 -- 🌐 **实时通信**: 原生WebSocket + STOMP协议 -- 📊 **数据可视化**: ECharts 5.5.0 图表展示 -- 🌍 **国际化**: Vue I18n 多语言支持 -- 📦 **PWA支持**: 离线访问和桌面安装 -- 🧪 **完整测试**: Vitest + Cypress 测试覆盖 - -## 🏗️ 项目结构 - -``` -web-new/ -├── public/ # 静态资源 -├── src/ -│ ├── api/ # API接口定义 -│ ├── assets/ # 资源文件 -│ ├── components/ # 通用组件 -│ ├── composables/ # 组合式API -│ ├── config/ # 配置文件 -│ ├── i18n/ # 国际化 -│ ├── layouts/ # 布局组件 -│ ├── plugins/ # 插件 -│ ├── router/ # 路由配置 -│ ├── stores/ # 状态管理 -│ ├── types/ # 类型定义 -│ ├── utils/ # 工具函数 -│ ├── views/ # 页面组件 -│ ├── App.vue # 根组件 -│ └── main.ts # 入口文件 -├── tests/ # 测试文件 -├── .env # 环境变量 -├── package.json # 依赖配置 -├── vite.config.ts # Vite配置 -└── README.md # 项目文档 -``` - -## 🚀 快速开始 - -### 环境要求 - -- Node.js >= 18.0.0 -- npm >= 9.0.0 - -### 安装依赖 - -```bash -npm install -``` - -### 开发环境 - -```bash -npm run dev -``` - -### 构建生产版本 - -```bash -npm run build -``` - -### 预览生产版本 - -```bash -npm run preview -``` - -## 🧪 测试 - -### 运行单元测试 - -```bash -npm run test -``` - -### 运行E2E测试 - -```bash -npm run test:e2e -``` - -### 测试覆盖率 - -```bash -npm run test:coverage -``` - -## 📦 核心依赖 - -### 框架和工具 - -- **Vue 3.4.21**: 渐进式JavaScript框架 -- **TypeScript 5.4.2**: 类型安全的JavaScript -- **Vite 5.1.6**: 下一代前端构建工具 -- **Vue Router 4.3.0**: 官方路由管理器 -- **Pinia 2.1.7**: 官方状态管理库 - -### UI和样式 - -- **Element Plus 2.6.1**: Vue 3 UI组件库 -- **Tailwind CSS 3.4.1**: 实用优先的CSS框架 -- **@element-plus/icons-vue**: Element Plus图标 - -### 网络和通信 - -- **Axios 1.6.8**: HTTP客户端 -- **@stomp/stompjs 7.1.1**: WebSocket STOMP协议 - -### 数据可视化 - -- **ECharts 5.5.0**: 强大的图表库 -- **vue-echarts 6.7.3**: Vue ECharts组件 - -### 工具库 - -- **@vueuse/core 10.9.0**: Vue组合式工具集 -- **Day.js 1.11.10**: 轻量级日期库 -- **Lodash-es 4.17.21**: 实用工具库 - -## 🔧 开发工具 - -### 代码质量 - -- **ESLint 8.57.0**: 代码检查 -- **Prettier 3.2.5**: 代码格式化 -- **Husky 9.0.11**: Git钩子 -- **lint-staged 15.2.2**: 暂存文件检查 - -### 自动化 - -- **unplugin-auto-import**: 自动导入API -- **unplugin-vue-components**: 自动导入组件 -- **vite-plugin-pwa**: PWA支持 - -### 测试 - -- **Vitest 1.4.0**: 单元测试框架 -- **@vue/test-utils 2.4.5**: Vue组件测试工具 -- **Cypress 13.7.1**: E2E测试框架 - -## 🌍 环境配置 - -项目支持多环境配置: - -- **local**: 本地开发环境 -- **dev**: 开发服务器环境 -- **test**: 测试环境 -- **prod**: 生产环境 - -通过 `.env` 文件配置不同环境的参数。 - -## 📱 功能特性 - -### 核心功能 - -- **AI智能对话**: 与AI助手进行情绪交流 -- **情绪日记**: 记录和分析日常情绪 -- **数据可视化**: 情绪趋势和统计分析 -- **个人仪表盘**: 全面的个人数据展示 - -### 技术特性 - -- **响应式设计**: 适配各种设备尺寸 -- **暗色主题**: 支持明暗主题切换 -- **国际化**: 中英文语言切换 -- **PWA**: 支持离线访问和桌面安装 -- **实时通信**: WebSocket实时消息推送 - -## 🔐 安全特性 - -- **JWT认证**: 安全的用户认证机制 -- **Token刷新**: 自动Token刷新和过期处理 -- **权限控制**: 基于角色的访问控制 -- **路由守卫**: 页面访问权限验证 -- **XSS防护**: 内容安全策略 - -## 📈 性能优化 - -- **代码分割**: 按需加载减少初始包大小 -- **Tree Shaking**: 移除未使用的代码 -- **图片优化**: 支持WebP格式和懒加载 -- **缓存策略**: 合理的缓存配置 -- **Gzip压缩**: 减少传输大小 - -## 🤝 贡献指南 - -1. Fork 项目 -2. 创建功能分支 (`git checkout -b feature/AmazingFeature`) -3. 提交更改 (`git commit -m 'Add some AmazingFeature'`) -4. 推送到分支 (`git push origin feature/AmazingFeature`) -5. 打开 Pull Request - -## 📄 许可证 - -本项目采用 MIT 许可证 - 查看 [LICENSE](LICENSE) 文件了解详情。 - -## 📞 联系我们 - -- 项目地址: [GitHub](https://github.com/emotion-museum/web) -- 问题反馈: [Issues](https://github.com/emotion-museum/web/issues) -- 邮箱: contact@emotion-museum.com - ---- - -**情绪博物馆** - 记录情绪,分享心情的温暖空间 ❤️ diff --git a/web-new/auto-imports.d.ts b/web-new/auto-imports.d.ts deleted file mode 100644 index 429a8e4..0000000 --- a/web-new/auto-imports.d.ts +++ /dev/null @@ -1,310 +0,0 @@ -/* eslint-disable */ -/* prettier-ignore */ -// @ts-nocheck -// noinspection JSUnusedGlobalSymbols -// Generated by unplugin-auto-import -export {} -declare global { - const EffectScope: typeof import('vue')['EffectScope'] - const ElMessage: typeof import('element-plus/es')['ElMessage'] - const acceptHMRUpdate: typeof import('pinia')['acceptHMRUpdate'] - const asyncComputed: typeof import('@vueuse/core')['asyncComputed'] - const autoResetRef: typeof import('@vueuse/core')['autoResetRef'] - const computed: typeof import('vue')['computed'] - const computedAsync: typeof import('@vueuse/core')['computedAsync'] - const computedEager: typeof import('@vueuse/core')['computedEager'] - const computedInject: typeof import('@vueuse/core')['computedInject'] - const computedWithControl: typeof import('@vueuse/core')['computedWithControl'] - const controlledComputed: typeof import('@vueuse/core')['controlledComputed'] - const controlledRef: typeof import('@vueuse/core')['controlledRef'] - const createApp: typeof import('vue')['createApp'] - const createEventHook: typeof import('@vueuse/core')['createEventHook'] - const createGlobalState: typeof import('@vueuse/core')['createGlobalState'] - const createInjectionState: typeof import('@vueuse/core')['createInjectionState'] - const createPinia: typeof import('pinia')['createPinia'] - const createReactiveFn: typeof import('@vueuse/core')['createReactiveFn'] - const createReusableTemplate: typeof import('@vueuse/core')['createReusableTemplate'] - const createSharedComposable: typeof import('@vueuse/core')['createSharedComposable'] - const createTemplatePromise: typeof import('@vueuse/core')['createTemplatePromise'] - const createUnrefFn: typeof import('@vueuse/core')['createUnrefFn'] - const customRef: typeof import('vue')['customRef'] - const debouncedRef: typeof import('@vueuse/core')['debouncedRef'] - const debouncedWatch: typeof import('@vueuse/core')['debouncedWatch'] - const defineAsyncComponent: typeof import('vue')['defineAsyncComponent'] - const defineComponent: typeof import('vue')['defineComponent'] - const defineStore: typeof import('pinia')['defineStore'] - const eagerComputed: typeof import('@vueuse/core')['eagerComputed'] - const effectScope: typeof import('vue')['effectScope'] - const extendRef: typeof import('@vueuse/core')['extendRef'] - const getActivePinia: typeof import('pinia')['getActivePinia'] - const getCurrentInstance: typeof import('vue')['getCurrentInstance'] - const getCurrentScope: typeof import('vue')['getCurrentScope'] - const h: typeof import('vue')['h'] - const ignorableWatch: typeof import('@vueuse/core')['ignorableWatch'] - const inject: typeof import('vue')['inject'] - const injectLocal: typeof import('@vueuse/core')['injectLocal'] - const isDefined: typeof import('@vueuse/core')['isDefined'] - const isProxy: typeof import('vue')['isProxy'] - const isReactive: typeof import('vue')['isReactive'] - const isReadonly: typeof import('vue')['isReadonly'] - const isRef: typeof import('vue')['isRef'] - const makeDestructurable: typeof import('@vueuse/core')['makeDestructurable'] - const mapActions: typeof import('pinia')['mapActions'] - const mapGetters: typeof import('pinia')['mapGetters'] - const mapState: typeof import('pinia')['mapState'] - const mapStores: typeof import('pinia')['mapStores'] - const mapWritableState: typeof import('pinia')['mapWritableState'] - const markRaw: typeof import('vue')['markRaw'] - const nextTick: typeof import('vue')['nextTick'] - const onActivated: typeof import('vue')['onActivated'] - const onBeforeMount: typeof import('vue')['onBeforeMount'] - const onBeforeRouteLeave: typeof import('vue-router')['onBeforeRouteLeave'] - const onBeforeRouteUpdate: typeof import('vue-router')['onBeforeRouteUpdate'] - const onBeforeUnmount: typeof import('vue')['onBeforeUnmount'] - const onBeforeUpdate: typeof import('vue')['onBeforeUpdate'] - const onClickOutside: typeof import('@vueuse/core')['onClickOutside'] - const onDeactivated: typeof import('vue')['onDeactivated'] - const onErrorCaptured: typeof import('vue')['onErrorCaptured'] - const onKeyStroke: typeof import('@vueuse/core')['onKeyStroke'] - const onLongPress: typeof import('@vueuse/core')['onLongPress'] - const onMounted: typeof import('vue')['onMounted'] - const onRenderTracked: typeof import('vue')['onRenderTracked'] - const onRenderTriggered: typeof import('vue')['onRenderTriggered'] - const onScopeDispose: typeof import('vue')['onScopeDispose'] - const onServerPrefetch: typeof import('vue')['onServerPrefetch'] - const onStartTyping: typeof import('@vueuse/core')['onStartTyping'] - const onUnmounted: typeof import('vue')['onUnmounted'] - const onUpdated: typeof import('vue')['onUpdated'] - const onWatcherCleanup: typeof import('vue')['onWatcherCleanup'] - const pausableWatch: typeof import('@vueuse/core')['pausableWatch'] - const provide: typeof import('vue')['provide'] - const provideLocal: typeof import('@vueuse/core')['provideLocal'] - const reactify: typeof import('@vueuse/core')['reactify'] - const reactifyObject: typeof import('@vueuse/core')['reactifyObject'] - const reactive: typeof import('vue')['reactive'] - const reactiveComputed: typeof import('@vueuse/core')['reactiveComputed'] - const reactiveOmit: typeof import('@vueuse/core')['reactiveOmit'] - const reactivePick: typeof import('@vueuse/core')['reactivePick'] - const readonly: typeof import('vue')['readonly'] - const ref: typeof import('vue')['ref'] - const refAutoReset: typeof import('@vueuse/core')['refAutoReset'] - const refDebounced: typeof import('@vueuse/core')['refDebounced'] - const refDefault: typeof import('@vueuse/core')['refDefault'] - const refThrottled: typeof import('@vueuse/core')['refThrottled'] - const refWithControl: typeof import('@vueuse/core')['refWithControl'] - const resolveComponent: typeof import('vue')['resolveComponent'] - const resolveRef: typeof import('@vueuse/core')['resolveRef'] - const resolveUnref: typeof import('@vueuse/core')['resolveUnref'] - const setActivePinia: typeof import('pinia')['setActivePinia'] - const setMapStoreSuffix: typeof import('pinia')['setMapStoreSuffix'] - const shallowReactive: typeof import('vue')['shallowReactive'] - const shallowReadonly: typeof import('vue')['shallowReadonly'] - const shallowRef: typeof import('vue')['shallowRef'] - const storeToRefs: typeof import('pinia')['storeToRefs'] - const syncRef: typeof import('@vueuse/core')['syncRef'] - const syncRefs: typeof import('@vueuse/core')['syncRefs'] - const templateRef: typeof import('@vueuse/core')['templateRef'] - const throttledRef: typeof import('@vueuse/core')['throttledRef'] - const throttledWatch: typeof import('@vueuse/core')['throttledWatch'] - const toRaw: typeof import('vue')['toRaw'] - const toReactive: typeof import('@vueuse/core')['toReactive'] - const toRef: typeof import('vue')['toRef'] - const toRefs: typeof import('vue')['toRefs'] - const toValue: typeof import('vue')['toValue'] - const triggerRef: typeof import('vue')['triggerRef'] - const tryOnBeforeMount: typeof import('@vueuse/core')['tryOnBeforeMount'] - const tryOnBeforeUnmount: typeof import('@vueuse/core')['tryOnBeforeUnmount'] - const tryOnMounted: typeof import('@vueuse/core')['tryOnMounted'] - const tryOnScopeDispose: typeof import('@vueuse/core')['tryOnScopeDispose'] - const tryOnUnmounted: typeof import('@vueuse/core')['tryOnUnmounted'] - const unref: typeof import('vue')['unref'] - const unrefElement: typeof import('@vueuse/core')['unrefElement'] - const until: typeof import('@vueuse/core')['until'] - const useActiveElement: typeof import('@vueuse/core')['useActiveElement'] - const useAnimate: typeof import('@vueuse/core')['useAnimate'] - const useArrayDifference: typeof import('@vueuse/core')['useArrayDifference'] - const useArrayEvery: typeof import('@vueuse/core')['useArrayEvery'] - const useArrayFilter: typeof import('@vueuse/core')['useArrayFilter'] - const useArrayFind: typeof import('@vueuse/core')['useArrayFind'] - const useArrayFindIndex: typeof import('@vueuse/core')['useArrayFindIndex'] - const useArrayFindLast: typeof import('@vueuse/core')['useArrayFindLast'] - const useArrayIncludes: typeof import('@vueuse/core')['useArrayIncludes'] - const useArrayJoin: typeof import('@vueuse/core')['useArrayJoin'] - const useArrayMap: typeof import('@vueuse/core')['useArrayMap'] - const useArrayReduce: typeof import('@vueuse/core')['useArrayReduce'] - const useArraySome: typeof import('@vueuse/core')['useArraySome'] - const useArrayUnique: typeof import('@vueuse/core')['useArrayUnique'] - const useAsyncQueue: typeof import('@vueuse/core')['useAsyncQueue'] - const useAsyncState: typeof import('@vueuse/core')['useAsyncState'] - const useAttrs: typeof import('vue')['useAttrs'] - const useBase64: typeof import('@vueuse/core')['useBase64'] - const useBattery: typeof import('@vueuse/core')['useBattery'] - const useBluetooth: typeof import('@vueuse/core')['useBluetooth'] - const useBreakpoints: typeof import('@vueuse/core')['useBreakpoints'] - const useBroadcastChannel: typeof import('@vueuse/core')['useBroadcastChannel'] - const useBrowserLocation: typeof import('@vueuse/core')['useBrowserLocation'] - const useCached: typeof import('@vueuse/core')['useCached'] - const useClipboard: typeof import('@vueuse/core')['useClipboard'] - const useClipboardItems: typeof import('@vueuse/core')['useClipboardItems'] - const useCloned: typeof import('@vueuse/core')['useCloned'] - const useColorMode: typeof import('@vueuse/core')['useColorMode'] - const useConfirmDialog: typeof import('@vueuse/core')['useConfirmDialog'] - const useCounter: typeof import('@vueuse/core')['useCounter'] - const useCssModule: typeof import('vue')['useCssModule'] - const useCssVar: typeof import('@vueuse/core')['useCssVar'] - const useCssVars: typeof import('vue')['useCssVars'] - const useCurrentElement: typeof import('@vueuse/core')['useCurrentElement'] - const useCycleList: typeof import('@vueuse/core')['useCycleList'] - const useDark: typeof import('@vueuse/core')['useDark'] - const useDateFormat: typeof import('@vueuse/core')['useDateFormat'] - const useDebounce: typeof import('@vueuse/core')['useDebounce'] - const useDebounceFn: typeof import('@vueuse/core')['useDebounceFn'] - const useDebouncedRefHistory: typeof import('@vueuse/core')['useDebouncedRefHistory'] - const useDeviceMotion: typeof import('@vueuse/core')['useDeviceMotion'] - const useDeviceOrientation: typeof import('@vueuse/core')['useDeviceOrientation'] - const useDevicePixelRatio: typeof import('@vueuse/core')['useDevicePixelRatio'] - const useDevicesList: typeof import('@vueuse/core')['useDevicesList'] - const useDisplayMedia: typeof import('@vueuse/core')['useDisplayMedia'] - const useDocumentVisibility: typeof import('@vueuse/core')['useDocumentVisibility'] - const useDraggable: typeof import('@vueuse/core')['useDraggable'] - const useDropZone: typeof import('@vueuse/core')['useDropZone'] - const useElementBounding: typeof import('@vueuse/core')['useElementBounding'] - const useElementByPoint: typeof import('@vueuse/core')['useElementByPoint'] - const useElementHover: typeof import('@vueuse/core')['useElementHover'] - const useElementSize: typeof import('@vueuse/core')['useElementSize'] - const useElementVisibility: typeof import('@vueuse/core')['useElementVisibility'] - const useEventBus: typeof import('@vueuse/core')['useEventBus'] - const useEventListener: typeof import('@vueuse/core')['useEventListener'] - const useEventSource: typeof import('@vueuse/core')['useEventSource'] - const useEyeDropper: typeof import('@vueuse/core')['useEyeDropper'] - const useFavicon: typeof import('@vueuse/core')['useFavicon'] - const useFetch: typeof import('@vueuse/core')['useFetch'] - const useFileDialog: typeof import('@vueuse/core')['useFileDialog'] - const useFileSystemAccess: typeof import('@vueuse/core')['useFileSystemAccess'] - const useFocus: typeof import('@vueuse/core')['useFocus'] - const useFocusWithin: typeof import('@vueuse/core')['useFocusWithin'] - const useFps: typeof import('@vueuse/core')['useFps'] - const useFullscreen: typeof import('@vueuse/core')['useFullscreen'] - const useGamepad: typeof import('@vueuse/core')['useGamepad'] - const useGeolocation: typeof import('@vueuse/core')['useGeolocation'] - const useI18n: typeof import('vue-i18n')['useI18n'] - const useId: typeof import('vue')['useId'] - const useIdle: typeof import('@vueuse/core')['useIdle'] - const useImage: typeof import('@vueuse/core')['useImage'] - const useInfiniteScroll: typeof import('@vueuse/core')['useInfiniteScroll'] - const useIntersectionObserver: typeof import('@vueuse/core')['useIntersectionObserver'] - const useInterval: typeof import('@vueuse/core')['useInterval'] - const useIntervalFn: typeof import('@vueuse/core')['useIntervalFn'] - const useKeyModifier: typeof import('@vueuse/core')['useKeyModifier'] - const useLastChanged: typeof import('@vueuse/core')['useLastChanged'] - const useLink: typeof import('vue-router')['useLink'] - const useLocalStorage: typeof import('@vueuse/core')['useLocalStorage'] - const useMagicKeys: typeof import('@vueuse/core')['useMagicKeys'] - const useManualRefHistory: typeof import('@vueuse/core')['useManualRefHistory'] - const useMediaControls: typeof import('@vueuse/core')['useMediaControls'] - const useMediaQuery: typeof import('@vueuse/core')['useMediaQuery'] - const useMemoize: typeof import('@vueuse/core')['useMemoize'] - const useMemory: typeof import('@vueuse/core')['useMemory'] - const useModel: typeof import('vue')['useModel'] - const useMounted: typeof import('@vueuse/core')['useMounted'] - const useMouse: typeof import('@vueuse/core')['useMouse'] - const useMouseInElement: typeof import('@vueuse/core')['useMouseInElement'] - const useMousePressed: typeof import('@vueuse/core')['useMousePressed'] - const useMutationObserver: typeof import('@vueuse/core')['useMutationObserver'] - const useNavigatorLanguage: typeof import('@vueuse/core')['useNavigatorLanguage'] - const useNetwork: typeof import('@vueuse/core')['useNetwork'] - const useNow: typeof import('@vueuse/core')['useNow'] - const useObjectUrl: typeof import('@vueuse/core')['useObjectUrl'] - const useOffsetPagination: typeof import('@vueuse/core')['useOffsetPagination'] - const useOnline: typeof import('@vueuse/core')['useOnline'] - const usePageLeave: typeof import('@vueuse/core')['usePageLeave'] - const useParallax: typeof import('@vueuse/core')['useParallax'] - const useParentElement: typeof import('@vueuse/core')['useParentElement'] - const usePerformanceObserver: typeof import('@vueuse/core')['usePerformanceObserver'] - const usePermission: typeof import('@vueuse/core')['usePermission'] - const usePointer: typeof import('@vueuse/core')['usePointer'] - const usePointerLock: typeof import('@vueuse/core')['usePointerLock'] - const usePointerSwipe: typeof import('@vueuse/core')['usePointerSwipe'] - const usePreferredColorScheme: typeof import('@vueuse/core')['usePreferredColorScheme'] - const usePreferredContrast: typeof import('@vueuse/core')['usePreferredContrast'] - const usePreferredDark: typeof import('@vueuse/core')['usePreferredDark'] - const usePreferredLanguages: typeof import('@vueuse/core')['usePreferredLanguages'] - const usePreferredReducedMotion: typeof import('@vueuse/core')['usePreferredReducedMotion'] - const usePrevious: typeof import('@vueuse/core')['usePrevious'] - const useRafFn: typeof import('@vueuse/core')['useRafFn'] - const useRefHistory: typeof import('@vueuse/core')['useRefHistory'] - const useResizeObserver: typeof import('@vueuse/core')['useResizeObserver'] - const useRoute: typeof import('vue-router')['useRoute'] - const useRouter: typeof import('vue-router')['useRouter'] - const useScreenOrientation: typeof import('@vueuse/core')['useScreenOrientation'] - const useScreenSafeArea: typeof import('@vueuse/core')['useScreenSafeArea'] - const useScriptTag: typeof import('@vueuse/core')['useScriptTag'] - const useScroll: typeof import('@vueuse/core')['useScroll'] - const useScrollLock: typeof import('@vueuse/core')['useScrollLock'] - const useSessionStorage: typeof import('@vueuse/core')['useSessionStorage'] - const useShare: typeof import('@vueuse/core')['useShare'] - const useSlots: typeof import('vue')['useSlots'] - const useSorted: typeof import('@vueuse/core')['useSorted'] - const useSpeechRecognition: typeof import('@vueuse/core')['useSpeechRecognition'] - const useSpeechSynthesis: typeof import('@vueuse/core')['useSpeechSynthesis'] - const useStepper: typeof import('@vueuse/core')['useStepper'] - const useStorage: typeof import('@vueuse/core')['useStorage'] - const useStorageAsync: typeof import('@vueuse/core')['useStorageAsync'] - const useStyleTag: typeof import('@vueuse/core')['useStyleTag'] - const useSupported: typeof import('@vueuse/core')['useSupported'] - const useSwipe: typeof import('@vueuse/core')['useSwipe'] - const useTemplateRef: typeof import('vue')['useTemplateRef'] - const useTemplateRefsList: typeof import('@vueuse/core')['useTemplateRefsList'] - const useTextDirection: typeof import('@vueuse/core')['useTextDirection'] - const useTextSelection: typeof import('@vueuse/core')['useTextSelection'] - const useTextareaAutosize: typeof import('@vueuse/core')['useTextareaAutosize'] - const useThrottle: typeof import('@vueuse/core')['useThrottle'] - const useThrottleFn: typeof import('@vueuse/core')['useThrottleFn'] - const useThrottledRefHistory: typeof import('@vueuse/core')['useThrottledRefHistory'] - const useTimeAgo: typeof import('@vueuse/core')['useTimeAgo'] - const useTimeout: typeof import('@vueuse/core')['useTimeout'] - const useTimeoutFn: typeof import('@vueuse/core')['useTimeoutFn'] - const useTimeoutPoll: typeof import('@vueuse/core')['useTimeoutPoll'] - const useTimestamp: typeof import('@vueuse/core')['useTimestamp'] - const useTitle: typeof import('@vueuse/core')['useTitle'] - const useToNumber: typeof import('@vueuse/core')['useToNumber'] - const useToString: typeof import('@vueuse/core')['useToString'] - const useToggle: typeof import('@vueuse/core')['useToggle'] - const useTransition: typeof import('@vueuse/core')['useTransition'] - const useUrlSearchParams: typeof import('@vueuse/core')['useUrlSearchParams'] - const useUserMedia: typeof import('@vueuse/core')['useUserMedia'] - const useVModel: typeof import('@vueuse/core')['useVModel'] - const useVModels: typeof import('@vueuse/core')['useVModels'] - const useVibrate: typeof import('@vueuse/core')['useVibrate'] - const useVirtualList: typeof import('@vueuse/core')['useVirtualList'] - const useWakeLock: typeof import('@vueuse/core')['useWakeLock'] - const useWebNotification: typeof import('@vueuse/core')['useWebNotification'] - const useWebSocket: typeof import('@vueuse/core')['useWebSocket'] - const useWebWorker: typeof import('@vueuse/core')['useWebWorker'] - const useWebWorkerFn: typeof import('@vueuse/core')['useWebWorkerFn'] - const useWindowFocus: typeof import('@vueuse/core')['useWindowFocus'] - const useWindowScroll: typeof import('@vueuse/core')['useWindowScroll'] - const useWindowSize: typeof import('@vueuse/core')['useWindowSize'] - const watch: typeof import('vue')['watch'] - const watchArray: typeof import('@vueuse/core')['watchArray'] - const watchAtMost: typeof import('@vueuse/core')['watchAtMost'] - const watchDebounced: typeof import('@vueuse/core')['watchDebounced'] - const watchDeep: typeof import('@vueuse/core')['watchDeep'] - const watchEffect: typeof import('vue')['watchEffect'] - const watchIgnorable: typeof import('@vueuse/core')['watchIgnorable'] - const watchImmediate: typeof import('@vueuse/core')['watchImmediate'] - const watchOnce: typeof import('@vueuse/core')['watchOnce'] - const watchPausable: typeof import('@vueuse/core')['watchPausable'] - const watchPostEffect: typeof import('vue')['watchPostEffect'] - const watchSyncEffect: typeof import('vue')['watchSyncEffect'] - const watchThrottled: typeof import('@vueuse/core')['watchThrottled'] - const watchTriggerable: typeof import('@vueuse/core')['watchTriggerable'] - const watchWithFilter: typeof import('@vueuse/core')['watchWithFilter'] - const whenever: typeof import('@vueuse/core')['whenever'] -} -// for type re-export -declare global { - // @ts-ignore - export type { Component, ComponentPublicInstance, ComputedRef, DirectiveBinding, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, MaybeRef, MaybeRefOrGetter, VNode, WritableComputedRef } from 'vue' - import('vue') -} diff --git a/web-new/components.d.ts b/web-new/components.d.ts deleted file mode 100644 index efaa6ef..0000000 --- a/web-new/components.d.ts +++ /dev/null @@ -1,19 +0,0 @@ -/* eslint-disable */ -/* prettier-ignore */ -// @ts-nocheck -// Generated by unplugin-vue-components -// Read more: https://github.com/vuejs/core/pull/3399 -export {} - -declare module 'vue' { - export interface GlobalComponents { - EmojiPicker: typeof import('./src/components/emoji/EmojiPicker.vue')['default'] - ErrorBoundary: typeof import('./src/components/error/ErrorBoundary.vue')['default'] - FileUpload: typeof import('./src/components/upload/FileUpload.vue')['default'] - ImageUpload: typeof import('./src/components/upload/ImageUpload.vue')['default'] - NotificationCenter: typeof import('./src/components/notification/NotificationCenter.vue')['default'] - RichTextEditor: typeof import('./src/components/editor/RichTextEditor.vue')['default'] - RouterLink: typeof import('vue-router')['RouterLink'] - RouterView: typeof import('vue-router')['RouterView'] - } -} diff --git a/web-new/cypress.config.ts b/web-new/cypress.config.ts deleted file mode 100644 index bca8b62..0000000 --- a/web-new/cypress.config.ts +++ /dev/null @@ -1,126 +0,0 @@ -/** - * Cypress E2E 测试配置 - */ - -import { defineConfig } from 'cypress' - -export default defineConfig({ - e2e: { - // 基础URL - baseUrl: 'http://localhost:5173', - - // 测试文件位置 - specPattern: 'tests/e2e/**/*.cy.{js,jsx,ts,tsx}', - - // 支持文件位置 - supportFile: 'tests/e2e/support/e2e.ts', - - // 固件文件位置 - fixturesFolder: 'tests/e2e/fixtures', - - // 截图和视频配置 - screenshotsFolder: 'tests/e2e/screenshots', - videosFolder: 'tests/e2e/videos', - - // 视频录制 - video: true, - videoCompression: 32, - - // 截图配置 - screenshotOnRunFailure: true, - - // 视口配置 - viewportWidth: 1280, - viewportHeight: 720, - - // 等待配置 - defaultCommandTimeout: 10000, - requestTimeout: 10000, - responseTimeout: 10000, - pageLoadTimeout: 30000, - - // 重试配置 - retries: { - runMode: 2, - openMode: 0 - }, - - // 浏览器配置 - chromeWebSecurity: false, - - // 环境变量 - env: { - // API基础URL - apiUrl: 'http://localhost:3000/api', - - // 测试用户凭据 - testUser: { - username: 'testuser', - password: 'password123', - email: 'test@example.com' - }, - - // 测试管理员凭据 - adminUser: { - username: 'admin', - password: 'admin123', - email: 'admin@example.com' - } - }, - - setupNodeEvents(on, config) { - // 任务注册 - on('task', { - // 数据库清理任务 - clearDatabase() { - // 这里可以添加数据库清理逻辑 - return null - }, - - // 创建测试数据任务 - seedTestData() { - // 这里可以添加测试数据创建逻辑 - return null - }, - - // 日志输出任务 - log(message) { - console.log(message) - return null - } - }) - - // 文件处理 - on('before:browser:launch', (browser, launchOptions) => { - if (browser.name === 'chrome') { - // Chrome 特定配置 - launchOptions.args.push('--disable-dev-shm-usage') - launchOptions.args.push('--no-sandbox') - } - - return launchOptions - }) - - // 配置处理 - on('before:spec', (spec) => { - console.log(`Running spec: ${spec.name}`) - }) - - return config - } - }, - - component: { - // 组件测试配置 - devServer: { - framework: 'vue', - bundler: 'vite' - }, - - specPattern: 'src/**/*.cy.{js,jsx,ts,tsx,vue}', - supportFile: 'tests/e2e/support/component.ts', - - viewportWidth: 1000, - viewportHeight: 660 - } -}) diff --git a/web-new/index.html b/web-new/index.html deleted file mode 100644 index 8ee76b0..0000000 --- a/web-new/index.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - 情绪博物馆 - - -
- - - diff --git a/web-new/package-lock.json b/web-new/package-lock.json deleted file mode 100644 index e0f2a0b..0000000 --- a/web-new/package-lock.json +++ /dev/null @@ -1,15735 +0,0 @@ -{ - "name": "emotion-museum-web", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "emotion-museum-web", - "version": "1.0.0", - "dependencies": { - "@element-plus/icons-vue": "^2.3.1", - "@stomp/stompjs": "^7.1.1", - "@tailwindcss/forms": "^0.5.7", - "@tailwindcss/typography": "^0.5.10", - "@tiptap/extension-image": "^2.2.4", - "@tiptap/starter-kit": "^2.2.4", - "@tiptap/vue-3": "^2.2.4", - "@vuelidate/core": "^2.0.3", - "@vuelidate/validators": "^2.0.4", - "@vueuse/core": "^10.9.0", - "@vueuse/motion": "^2.0.0", - "axios": "^1.6.8", - "cropperjs": "^1.6.1", - "dayjs": "^1.11.10", - "echarts": "^5.5.0", - "element-plus": "^2.6.1", - "file-saver": "^2.0.5", - "lodash-es": "^4.17.21", - "nprogress": "^0.2.0", - "pinia": "^2.1.7", - "tailwindcss": "^3.4.1", - "vue": "^3.4.21", - "vue-echarts": "^6.7.3", - "vue-i18n": "^9.10.2", - "vue-router": "^4.3.0", - "vue-toastification": "^2.0.0-rc.5", - "vue-upload-component": "^3.1.4", - "zod": "^3.22.4" - }, - "devDependencies": { - "@intlify/unplugin-vue-i18n": "^4.0.0", - "@types/file-saver": "^2.0.7", - "@types/lodash-es": "^4.17.12", - "@types/nprogress": "^0.2.3", - "@vitejs/plugin-vue": "^5.0.4", - "@vue/eslint-config-prettier": "^9.0.0", - "@vue/eslint-config-typescript": "^12.0.0", - "@vue/test-utils": "^2.4.5", - "@vue/tsconfig": "^0.5.1", - "autoprefixer": "^10.4.18", - "cypress": "^13.7.1", - "eslint": "^8.57.0", - "husky": "^9.0.11", - "jsdom": "^24.0.0", - "lint-staged": "^15.2.2", - "postcss": "^8.4.35", - "prettier": "^3.2.5", - "rollup-plugin-visualizer": "^5.12.0", - "typescript": "^5.4.2", - "unplugin-auto-import": "^0.17.5", - "unplugin-vue-components": "^0.26.0", - "vite": "^5.1.6", - "vite-plugin-compression": "^0.5.1", - "vite-plugin-mock": "^3.0.1", - "vite-plugin-pwa": "^0.19.2", - "vitest": "^1.4.0", - "vue-tsc": "^2.0.6", - "workbox-window": "^7.0.0" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=9.0.0" - } - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmmirror.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@antfu/utils": { - "version": "0.7.10", - "resolved": "https://registry.npmmirror.com/@antfu/utils/-/utils-0.7.10.tgz", - "integrity": "sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@asamuzakjp/css-color": { - "version": "3.2.0", - "resolved": "https://registry.npmmirror.com/@asamuzakjp/css-color/-/css-color-3.2.0.tgz", - "integrity": "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@csstools/css-calc": "^2.1.3", - "@csstools/css-color-parser": "^3.0.9", - "@csstools/css-parser-algorithms": "^3.0.4", - "@csstools/css-tokenizer": "^3.0.3", - "lru-cache": "^10.4.3" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "dev": true, - "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/code-frame/node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@babel/compat-data": { - "version": "7.28.0", - "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.28.0.tgz", - "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.28.0", - "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.28.0.tgz", - "integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==", - "dev": true, - "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", - "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.28.0", - "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.28.0.tgz", - "integrity": "sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==", - "dev": true, - "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", - "resolved": "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", - "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", - "dev": true, - "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/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.27.1", - "resolved": "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz", - "integrity": "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==", - "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", - "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.27.1", - "resolved": "https://registry.npmmirror.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz", - "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==", - "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", - "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.5", - "resolved": "https://registry.npmmirror.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz", - "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.27.1", - "resolved": "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", - "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", - "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-transforms": { - "version": "7.27.3", - "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", - "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", - "dev": true, - "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", - "resolved": "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", - "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.27.1", - "resolved": "https://registry.npmmirror.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", - "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", - "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", - "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.27.1", - "resolved": "https://registry.npmmirror.com/@babel/helper-wrap-function/-/helper-wrap-function-7.27.1.tgz", - "integrity": "sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ==", - "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.28.2", - "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.28.2.tgz", - "integrity": "sha512-/V9771t+EgXz62aCcyofnQhGM8DQACbRhvzKFsXKC9QM+5MadF8ZmIm0crDMaz3+o0h0zXfJnd4EhbYbxsrcFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.28.0", - "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.28.0.tgz", - "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz", - "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", - "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", - "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", - "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.27.1.tgz", - "integrity": "sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.27.1", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", - "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", - "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", - "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz", - "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", - "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", - "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.0.tgz", - "integrity": "sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", - "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.27.1.tgz", - "integrity": "sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.0.tgz", - "integrity": "sha512-IjM1IoJNw72AZFlj33Cu8X0q2XK/6AaVC3jQu+cgQ5lThWD5ajnuUAml80dqRmOhmPkTH8uAwnpMu9Rvj0LTRA==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", - "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz", - "integrity": "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", - "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", - "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", - "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", - "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz", - "integrity": "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz", - "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", - "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", - "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", - "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", - "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", - "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz", - "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", - "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", - "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", - "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz", - "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", - "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", - "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", - "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", - "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", - "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.0.tgz", - "integrity": "sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", - "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", - "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz", - "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", - "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", - "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", - "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", - "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", - "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-regenerator": { - "version": "7.28.1", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.1.tgz", - "integrity": "sha512-P0QiV/taaa3kXpLY+sXla5zec4E+4t4Aqc9ggHlfZ7a2cp8/x/Gv08jfwEtn9gnnYIMvHx6aoOZ8XJL8eU71Dg==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", - "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", - "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", - "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", - "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", - "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", - "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", - "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", - "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-escapes": { - "version": "7.27.1", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", - "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", - "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", - "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", - "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", - "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", - "resolved": "https://registry.npmmirror.com/@babel/preset-env/-/preset-env-7.28.0.tgz", - "integrity": "sha512-VmaxeGOwuDqzLl5JUkIRM1X2Qu2uKGxHEQWh+cvvbl7JuJRgKGJSfsEF/bUaxFhJl/XAyxBe7q7qSuTbKFuCyg==", - "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", - "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmmirror.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "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/runtime": { - "version": "7.28.2", - "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.28.2.tgz", - "integrity": "sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", - "dev": true, - "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", - "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.28.0.tgz", - "integrity": "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==", - "dev": true, - "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.2", - "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.28.2.tgz", - "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmmirror.com/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@csstools/color-helpers": { - "version": "5.0.2", - "resolved": "https://registry.npmmirror.com/@csstools/color-helpers/-/color-helpers-5.0.2.tgz", - "integrity": "sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=18" - } - }, - "node_modules/@csstools/css-calc": { - "version": "2.1.4", - "resolved": "https://registry.npmmirror.com/@csstools/css-calc/-/css-calc-2.1.4.tgz", - "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - } - }, - "node_modules/@csstools/css-color-parser": { - "version": "3.0.10", - "resolved": "https://registry.npmmirror.com/@csstools/css-color-parser/-/css-color-parser-3.0.10.tgz", - "integrity": "sha512-TiJ5Ajr6WRd1r8HSiwJvZBiJOqtH86aHpUjq5aEKWHiII2Qfjqd/HCWKPOW8EP4vcspXbHnXrwIDlu5savQipg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/color-helpers": "^5.0.2", - "@csstools/css-calc": "^2.1.4" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^3.0.5", - "@csstools/css-tokenizer": "^3.0.4" - } - }, - "node_modules/@csstools/css-parser-algorithms": { - "version": "3.0.5", - "resolved": "https://registry.npmmirror.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", - "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@csstools/css-tokenizer": "^3.0.4" - } - }, - "node_modules/@csstools/css-tokenizer": { - "version": "3.0.4", - "resolved": "https://registry.npmmirror.com/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", - "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@ctrl/tinycolor": { - "version": "3.6.1", - "resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", - "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/@cypress/request": { - "version": "3.0.9", - "resolved": "https://registry.npmmirror.com/@cypress/request/-/request-3.0.9.tgz", - "integrity": "sha512-I3l7FdGRXluAS44/0NguwWlO83J18p0vlr2FYHrJkWdNYhgVoiYo61IXPqaOsL+vNxU1ZqMACzItGK3/KKDsdw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~4.0.4", - "http-signature": "~1.4.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "performance-now": "^2.1.0", - "qs": "6.14.0", - "safe-buffer": "^5.1.2", - "tough-cookie": "^5.0.0", - "tunnel-agent": "^0.6.0", - "uuid": "^8.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@cypress/xvfb": { - "version": "1.2.4", - "resolved": "https://registry.npmmirror.com/@cypress/xvfb/-/xvfb-1.2.4.tgz", - "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^3.1.0", - "lodash.once": "^4.1.1" - } - }, - "node_modules/@cypress/xvfb/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/@element-plus/icons-vue": { - "version": "2.3.1", - "resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz", - "integrity": "sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==", - "license": "MIT", - "peerDependencies": { - "vue": "^3.2.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.8.tgz", - "integrity": "sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.25.8.tgz", - "integrity": "sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.25.8.tgz", - "integrity": "sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.25.8.tgz", - "integrity": "sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.8.tgz", - "integrity": "sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.25.8.tgz", - "integrity": "sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.8.tgz", - "integrity": "sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.8.tgz", - "integrity": "sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.25.8.tgz", - "integrity": "sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.25.8.tgz", - "integrity": "sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.25.8.tgz", - "integrity": "sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.25.8.tgz", - "integrity": "sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.8.tgz", - "integrity": "sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.8.tgz", - "integrity": "sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.8.tgz", - "integrity": "sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.25.8.tgz", - "integrity": "sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.25.8.tgz", - "integrity": "sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.8.tgz", - "integrity": "sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.8.tgz", - "integrity": "sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.8.tgz", - "integrity": "sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.8.tgz", - "integrity": "sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.8.tgz", - "integrity": "sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.25.8.tgz", - "integrity": "sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.25.8.tgz", - "integrity": "sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.25.8.tgz", - "integrity": "sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.25.8.tgz", - "integrity": "sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.7.0", - "resolved": "https://registry.npmmirror.com/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", - "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", - "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/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmmirror.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.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": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmmirror.com/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@floating-ui/core": { - "version": "1.7.2", - "resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.7.2.tgz", - "integrity": "sha512-wNB5ooIKHQc+Kui96jE/n69rHFWAVoxn5CAzL1Xdd8FG03cgY3MLO+GF9U3W737fYDSgPWA6MReKhBQBop6Pcw==", - "license": "MIT", - "dependencies": { - "@floating-ui/utils": "^0.2.10" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.7.2", - "resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.7.2.tgz", - "integrity": "sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA==", - "license": "MIT", - "dependencies": { - "@floating-ui/core": "^1.7.2", - "@floating-ui/utils": "^0.2.10" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.2.10", - "resolved": "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.2.10.tgz", - "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", - "license": "MIT" - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "deprecated": "Use @eslint/config-array instead", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@intlify/bundle-utils": { - "version": "8.0.0", - "resolved": "https://registry.npmmirror.com/@intlify/bundle-utils/-/bundle-utils-8.0.0.tgz", - "integrity": "sha512-1B++zykRnMwQ+20SpsZI1JCnV/YJt9Oq7AGlEurzkWJOFtFAVqaGc/oV36PBRYeiKnTbY9VYfjBimr2Vt42wLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@intlify/message-compiler": "^9.4.0", - "@intlify/shared": "^9.4.0", - "acorn": "^8.8.2", - "escodegen": "^2.1.0", - "estree-walker": "^2.0.2", - "jsonc-eslint-parser": "^2.3.0", - "mlly": "^1.2.0", - "source-map-js": "^1.0.1", - "yaml-eslint-parser": "^1.2.2" - }, - "engines": { - "node": ">= 14.16" - }, - "peerDependenciesMeta": { - "petite-vue-i18n": { - "optional": true - }, - "vue-i18n": { - "optional": true - } - } - }, - "node_modules/@intlify/core-base": { - "version": "9.14.5", - "resolved": "https://registry.npmmirror.com/@intlify/core-base/-/core-base-9.14.5.tgz", - "integrity": "sha512-5ah5FqZG4pOoHjkvs8mjtv+gPKYU0zCISaYNjBNNqYiaITxW8ZtVih3GS/oTOqN8d9/mDLyrjD46GBApNxmlsA==", - "license": "MIT", - "dependencies": { - "@intlify/message-compiler": "9.14.5", - "@intlify/shared": "9.14.5" - }, - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://github.com/sponsors/kazupon" - } - }, - "node_modules/@intlify/message-compiler": { - "version": "9.14.5", - "resolved": "https://registry.npmmirror.com/@intlify/message-compiler/-/message-compiler-9.14.5.tgz", - "integrity": "sha512-IHzgEu61/YIpQV5Pc3aRWScDcnFKWvQA9kigcINcCBXN8mbW+vk9SK+lDxA6STzKQsVJxUPg9ACC52pKKo3SVQ==", - "license": "MIT", - "dependencies": { - "@intlify/shared": "9.14.5", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://github.com/sponsors/kazupon" - } - }, - "node_modules/@intlify/shared": { - "version": "9.14.5", - "resolved": "https://registry.npmmirror.com/@intlify/shared/-/shared-9.14.5.tgz", - "integrity": "sha512-9gB+E53BYuAEMhbCAxVgG38EZrk59sxBtv3jSizNL2hEWlgjBjAw1AwpLHtNaeda12pe6W20OGEa0TwuMSRbyQ==", - "license": "MIT", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://github.com/sponsors/kazupon" - } - }, - "node_modules/@intlify/unplugin-vue-i18n": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/@intlify/unplugin-vue-i18n/-/unplugin-vue-i18n-4.0.0.tgz", - "integrity": "sha512-q2Mhqa/mLi0tulfLFO4fMXXvEbkSZpI5yGhNNsLTNJJ41icEGUuyDe+j5zRZIKSkOJRgX6YbCyibTDJdRsukmw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@intlify/bundle-utils": "^8.0.0", - "@intlify/shared": "^9.4.0", - "@rollup/pluginutils": "^5.1.0", - "@vue/compiler-sfc": "^3.2.47", - "debug": "^4.3.3", - "fast-glob": "^3.2.12", - "js-yaml": "^4.1.0", - "json5": "^2.2.3", - "pathe": "^1.0.0", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2", - "unplugin": "^1.1.0" - }, - "engines": { - "node": ">= 14.16" - }, - "peerDependencies": { - "petite-vue-i18n": "*", - "vue-i18n": "*", - "vue-i18n-bridge": "*" - }, - "peerDependenciesMeta": { - "petite-vue-i18n": { - "optional": true - }, - "vue-i18n": { - "optional": true - }, - "vue-i18n-bridge": { - "optional": true - } - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmmirror.com/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "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/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmmirror.com/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "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/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmmirror.com/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.12", - "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", - "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.10", - "resolved": "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.10.tgz", - "integrity": "sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q==", - "dev": 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", - "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", - "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.29", - "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", - "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nuxt/kit": { - "version": "3.17.7", - "resolved": "https://registry.npmmirror.com/@nuxt/kit/-/kit-3.17.7.tgz", - "integrity": "sha512-JLno3ur7Pix2o/StxIMlEHRkMawA6h7uzjZBDgxdeKXRWTYY8ID9YekSkN4PBlEFGXBfCBOcPd5+YqcyBUAMkw==", - "license": "MIT", - "optional": true, - "dependencies": { - "c12": "^3.0.4", - "consola": "^3.4.2", - "defu": "^6.1.4", - "destr": "^2.0.5", - "errx": "^0.1.0", - "exsolve": "^1.0.7", - "ignore": "^7.0.5", - "jiti": "^2.4.2", - "klona": "^2.0.6", - "knitwork": "^1.2.0", - "mlly": "^1.7.4", - "ohash": "^2.0.11", - "pathe": "^2.0.3", - "pkg-types": "^2.2.0", - "scule": "^1.3.0", - "semver": "^7.7.2", - "std-env": "^3.9.0", - "tinyglobby": "^0.2.14", - "ufo": "^1.6.1", - "unctx": "^2.4.1", - "unimport": "^5.1.0", - "untyped": "^2.0.0" - }, - "engines": { - "node": ">=18.12.0" - } - }, - "node_modules/@nuxt/kit/node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmmirror.com/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/@nuxt/kit/node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmmirror.com/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "license": "MIT", - "optional": true - }, - "node_modules/@one-ini/wasm": { - "version": "0.1.1", - "resolved": "https://registry.npmmirror.com/@one-ini/wasm/-/wasm-0.1.1.tgz", - "integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmmirror.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@pkgr/core": { - "version": "0.2.9", - "resolved": "https://registry.npmmirror.com/@pkgr/core/-/core-0.2.9.tgz", - "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/pkgr" - } - }, - "node_modules/@popperjs/core": { - "name": "@sxzz/popperjs-es", - "version": "2.11.7", - "resolved": "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz", - "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@remirror/core-constants": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/@remirror/core-constants/-/core-constants-3.0.0.tgz", - "integrity": "sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==", - "license": "MIT" - }, - "node_modules/@rollup/plugin-node-resolve": { - "version": "15.3.1", - "resolved": "https://registry.npmmirror.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.1.tgz", - "integrity": "sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==", - "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-terser": { - "version": "0.4.4", - "resolved": "https://registry.npmmirror.com/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz", - "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", - "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", - "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.2.0.tgz", - "integrity": "sha512-qWJ2ZTbmumwiLFomfzTyt5Kng4hwPi9rwCYN4SHb6eaRU1KNO4ccxINHr/VhH4GgPlt1XfSTLX2LBTme8ne4Zw==", - "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.46.1", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.46.1.tgz", - "integrity": "sha512-oENme6QxtLCqjChRUUo3S6X8hjCXnWmJWnedD7VbGML5GUtaOtAyx+fEEXnBXVf0CBZApMQU0Idwi0FmyxzQhw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.46.1", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.46.1.tgz", - "integrity": "sha512-OikvNT3qYTl9+4qQ9Bpn6+XHM+ogtFadRLuT2EXiFQMiNkXFLQfNVppi5o28wvYdHL2s3fM0D/MZJ8UkNFZWsw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.46.1", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.46.1.tgz", - "integrity": "sha512-EFYNNGij2WllnzljQDQnlFTXzSJw87cpAs4TVBAWLdkvic5Uh5tISrIL6NRcxoh/b2EFBG/TK8hgRrGx94zD4A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.46.1", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.46.1.tgz", - "integrity": "sha512-ZaNH06O1KeTug9WI2+GRBE5Ujt9kZw4a1+OIwnBHal92I8PxSsl5KpsrPvthRynkhMck4XPdvY0z26Cym/b7oA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.46.1", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.46.1.tgz", - "integrity": "sha512-n4SLVebZP8uUlJ2r04+g2U/xFeiQlw09Me5UFqny8HGbARl503LNH5CqFTb5U5jNxTouhRjai6qPT0CR5c/Iig==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.46.1", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.46.1.tgz", - "integrity": "sha512-8vu9c02F16heTqpvo3yeiu7Vi1REDEC/yES/dIfq3tSXe6mLndiwvYr3AAvd1tMNUqE9yeGYa5w7PRbI5QUV+w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.46.1", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.46.1.tgz", - "integrity": "sha512-K4ncpWl7sQuyp6rWiGUvb6Q18ba8mzM0rjWJ5JgYKlIXAau1db7hZnR0ldJvqKWWJDxqzSLwGUhA4jp+KqgDtQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.46.1", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.46.1.tgz", - "integrity": "sha512-YykPnXsjUjmXE6j6k2QBBGAn1YsJUix7pYaPLK3RVE0bQL2jfdbfykPxfF8AgBlqtYbfEnYHmLXNa6QETjdOjQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.46.1", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.46.1.tgz", - "integrity": "sha512-kKvqBGbZ8i9pCGW3a1FH3HNIVg49dXXTsChGFsHGXQaVJPLA4f/O+XmTxfklhccxdF5FefUn2hvkoGJH0ScWOA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.46.1", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.46.1.tgz", - "integrity": "sha512-zzX5nTw1N1plmqC9RGC9vZHFuiM7ZP7oSWQGqpbmfjK7p947D518cVK1/MQudsBdcD84t6k70WNczJOct6+hdg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.46.1", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.46.1.tgz", - "integrity": "sha512-O8CwgSBo6ewPpktFfSDgB6SJN9XDcPSvuwxfejiddbIC/hn9Tg6Ai0f0eYDf3XvB/+PIWzOQL+7+TZoB8p9Yuw==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.46.1", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.46.1.tgz", - "integrity": "sha512-JnCfFVEKeq6G3h3z8e60kAp8Rd7QVnWCtPm7cxx+5OtP80g/3nmPtfdCXbVl063e3KsRnGSKDHUQMydmzc/wBA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.46.1", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.46.1.tgz", - "integrity": "sha512-dVxuDqS237eQXkbYzQQfdf/njgeNw6LZuVyEdUaWwRpKHhsLI+y4H/NJV8xJGU19vnOJCVwaBFgr936FHOnJsQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.46.1", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.46.1.tgz", - "integrity": "sha512-CvvgNl2hrZrTR9jXK1ye0Go0HQRT6ohQdDfWR47/KFKiLd5oN5T14jRdUVGF4tnsN8y9oSfMOqH6RuHh+ck8+w==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.46.1", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.46.1.tgz", - "integrity": "sha512-x7ANt2VOg2565oGHJ6rIuuAon+A8sfe1IeUx25IKqi49OjSr/K3awoNqr9gCwGEJo9OuXlOn+H2p1VJKx1psxA==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.46.1", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.46.1.tgz", - "integrity": "sha512-9OADZYryz/7E8/qt0vnaHQgmia2Y0wrjSSn1V/uL+zw/i7NUhxbX4cHXdEQ7dnJgzYDS81d8+tf6nbIdRFZQoQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.46.1", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.46.1.tgz", - "integrity": "sha512-NuvSCbXEKY+NGWHyivzbjSVJi68Xfq1VnIvGmsuXs6TCtveeoDRKutI5vf2ntmNnVq64Q4zInet0UDQ+yMB6tA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.46.1", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.46.1.tgz", - "integrity": "sha512-mWz+6FSRb82xuUMMV1X3NGiaPFqbLN9aIueHleTZCc46cJvwTlvIh7reQLk4p97dv0nddyewBhwzryBHH7wtPw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.46.1", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.46.1.tgz", - "integrity": "sha512-7Thzy9TMXDw9AU4f4vsLNBxh7/VOKuXi73VH3d/kHGr0tZ3x/ewgL9uC7ojUKmH1/zvmZe2tLapYcZllk3SO8Q==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.46.1", - "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.46.1.tgz", - "integrity": "sha512-7GVB4luhFmGUNXXJhH2jJwZCFB3pIOixv2E3s17GQHBFUOQaISlt7aGcQgqvCaDSxTZJUzlK/QJ1FN8S94MrzQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmmirror.com/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@stomp/stompjs": { - "version": "7.1.1", - "resolved": "https://registry.npmmirror.com/@stomp/stompjs/-/stompjs-7.1.1.tgz", - "integrity": "sha512-chcDs6YkAnKp1FqzwhGvh3i7v0+/ytzqWdKYw6XzINEKAzke/iD00dNgFPWSZEqktHOK+C1gSzXhLkLbARIaZw==", - "license": "Apache-2.0" - }, - "node_modules/@surma/rollup-plugin-off-main-thread": { - "version": "2.2.3", - "resolved": "https://registry.npmmirror.com/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", - "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", - "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/@surma/rollup-plugin-off-main-thread/node_modules/magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "sourcemap-codec": "^1.4.8" - } - }, - "node_modules/@tailwindcss/forms": { - "version": "0.5.10", - "resolved": "https://registry.npmmirror.com/@tailwindcss/forms/-/forms-0.5.10.tgz", - "integrity": "sha512-utI1ONF6uf/pPNO68kmN1b8rEwNXv3czukalo8VtJH8ksIkZXr3Q3VYudZLkCsDd4Wku120uF02hYK25XGPorw==", - "license": "MIT", - "dependencies": { - "mini-svg-data-uri": "^1.2.3" - }, - "peerDependencies": { - "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1" - } - }, - "node_modules/@tailwindcss/typography": { - "version": "0.5.16", - "resolved": "https://registry.npmmirror.com/@tailwindcss/typography/-/typography-0.5.16.tgz", - "integrity": "sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA==", - "license": "MIT", - "dependencies": { - "lodash.castarray": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.merge": "^4.6.2", - "postcss-selector-parser": "6.0.10" - }, - "peerDependencies": { - "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" - } - }, - "node_modules/@tiptap/core": { - "version": "2.26.1", - "resolved": "https://registry.npmmirror.com/@tiptap/core/-/core-2.26.1.tgz", - "integrity": "sha512-fymyd/XZvYiHjBoLt1gxs024xP/LY26d43R1vluYq7AHBL/7DE3ywzy+1GEsGyAv5Je2L0KBhNIR/izbq3Kaqg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/pm": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-blockquote": { - "version": "2.26.1", - "resolved": "https://registry.npmmirror.com/@tiptap/extension-blockquote/-/extension-blockquote-2.26.1.tgz", - "integrity": "sha512-viQ6AHRhjCYYipKK6ZepBzwZpkuMvO9yhRHeUZDvlSOAh8rvsUTSre0y74nu8QRYUt4a44lJJ6BpphJK7bEgYA==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-bold": { - "version": "2.26.1", - "resolved": "https://registry.npmmirror.com/@tiptap/extension-bold/-/extension-bold-2.26.1.tgz", - "integrity": "sha512-zCce9PRuTNhadFir71luLo99HERDpGJ0EEflGm7RN8I1SnNi9gD5ooK42BOIQtejGCJqg3hTPZiYDJC2hXvckQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-bubble-menu": { - "version": "2.26.1", - "resolved": "https://registry.npmmirror.com/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.26.1.tgz", - "integrity": "sha512-oHevUcZbTMFOTpdCEo4YEDe044MB4P1ZrWyML8CGe5tnnKdlI9BN03AXpI1mEEa5CA3H1/eEckXx8EiCgYwQ3Q==", - "license": "MIT", - "dependencies": { - "tippy.js": "^6.3.7" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0", - "@tiptap/pm": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-bullet-list": { - "version": "2.26.1", - "resolved": "https://registry.npmmirror.com/@tiptap/extension-bullet-list/-/extension-bullet-list-2.26.1.tgz", - "integrity": "sha512-HHakuV4ckYCDOnBbne088FvCEP4YICw+wgPBz/V2dfpiFYQ4WzT0LPK9s7OFMCN+ROraoug+1ryN1Z1KdIgujQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-code": { - "version": "2.26.1", - "resolved": "https://registry.npmmirror.com/@tiptap/extension-code/-/extension-code-2.26.1.tgz", - "integrity": "sha512-GU9deB1A/Tr4FMPu71CvlcjGKwRhGYz60wQ8m4aM+ELZcVIcZRa1ebR8bExRIEWnvRztQuyRiCQzw2N0xQJ1QQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-code-block": { - "version": "2.26.1", - "resolved": "https://registry.npmmirror.com/@tiptap/extension-code-block/-/extension-code-block-2.26.1.tgz", - "integrity": "sha512-/TDDOwONl0qEUc4+B6V9NnWtSjz95eg7/8uCb8Y8iRbGvI9vT4/znRKofFxstvKmW4URu/H74/g0ywV57h0B+A==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0", - "@tiptap/pm": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-document": { - "version": "2.26.1", - "resolved": "https://registry.npmmirror.com/@tiptap/extension-document/-/extension-document-2.26.1.tgz", - "integrity": "sha512-2P2IZp1NRAE+21mRuFBiP3X2WKfZ6kUC23NJKpn8bcOamY3obYqCt0ltGPhE4eR8n8QAl2fI/3jIgjR07dC8ow==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-dropcursor": { - "version": "2.26.1", - "resolved": "https://registry.npmmirror.com/@tiptap/extension-dropcursor/-/extension-dropcursor-2.26.1.tgz", - "integrity": "sha512-JkDQU2ZYFOuT5mNYb8OiWGwD1HcjbtmX8tLNugQbToECmz9WvVPqJmn7V/q8VGpP81iEECz/IsyRmuf2kSD4uA==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0", - "@tiptap/pm": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-floating-menu": { - "version": "2.26.1", - "resolved": "https://registry.npmmirror.com/@tiptap/extension-floating-menu/-/extension-floating-menu-2.26.1.tgz", - "integrity": "sha512-OJF+H6qhQogVTMedAGSWuoL1RPe3LZYXONuFCVyzHnvvMpK+BP1vm180E2zDNFnn/DVA+FOrzNGpZW7YjoFH1w==", - "license": "MIT", - "dependencies": { - "tippy.js": "^6.3.7" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0", - "@tiptap/pm": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-gapcursor": { - "version": "2.26.1", - "resolved": "https://registry.npmmirror.com/@tiptap/extension-gapcursor/-/extension-gapcursor-2.26.1.tgz", - "integrity": "sha512-KOiMZc3PwJS3hR0nSq5d0TJi2jkNZkLZElcT6pCEnhRHzPH6dRMu9GM5Jj798ZRUy0T9UFcKJalFZaDxnmRnpg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0", - "@tiptap/pm": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-hard-break": { - "version": "2.26.1", - "resolved": "https://registry.npmmirror.com/@tiptap/extension-hard-break/-/extension-hard-break-2.26.1.tgz", - "integrity": "sha512-d6uStdNKi8kjPlHAyO59M6KGWATNwhLCD7dng0NXfwGndc22fthzIk/6j9F6ltQx30huy5qQram6j3JXwNACoA==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-heading": { - "version": "2.26.1", - "resolved": "https://registry.npmmirror.com/@tiptap/extension-heading/-/extension-heading-2.26.1.tgz", - "integrity": "sha512-KSzL8WZV3pjJG9ke4RaU70+B5UlYR2S6olNt5UCAawM+fi11mobVztiBoC19xtpSVqIXC1AmXOqUgnuSvmE4ZA==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-history": { - "version": "2.26.1", - "resolved": "https://registry.npmmirror.com/@tiptap/extension-history/-/extension-history-2.26.1.tgz", - "integrity": "sha512-m6YR1gkkauIDo3PRl0gP+7Oc4n5OqDzcjVh6LvWREmZP8nmi94hfseYbqOXUb6RPHIc0JKF02eiRifT4MSd2nw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0", - "@tiptap/pm": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-horizontal-rule": { - "version": "2.26.1", - "resolved": "https://registry.npmmirror.com/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.26.1.tgz", - "integrity": "sha512-mT6baqOhs/NakgrAeDeed194E/ZJFGL692H0C7f1N7WDRaWxUu2oR0LrnRqSH5OyPjELkzu6nQnNy0+0tFGHHg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0", - "@tiptap/pm": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-image": { - "version": "2.26.1", - "resolved": "https://registry.npmmirror.com/@tiptap/extension-image/-/extension-image-2.26.1.tgz", - "integrity": "sha512-96+MaYBJebQlR/ik5W72GLUfXdEoxFs+6jsoERxbM5qEdhb7TEnodBFtWZOwgDO27kFd6rSNZuW9r5KJNtljEg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-italic": { - "version": "2.26.1", - "resolved": "https://registry.npmmirror.com/@tiptap/extension-italic/-/extension-italic-2.26.1.tgz", - "integrity": "sha512-pOs6oU4LyGO89IrYE4jbE8ZYsPwMMIiKkYfXcfeD9NtpGNBnjeVXXF5I9ndY2ANrCAgC8k58C3/powDRf0T2yA==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-list-item": { - "version": "2.26.1", - "resolved": "https://registry.npmmirror.com/@tiptap/extension-list-item/-/extension-list-item-2.26.1.tgz", - "integrity": "sha512-quOXckC73Luc3x+Dcm88YAEBW+Crh3x5uvtQOQtn2GEG91AshrvbnhGRiYnfvEN7UhWIS+FYI5liHFcRKSUKrQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-ordered-list": { - "version": "2.26.1", - "resolved": "https://registry.npmmirror.com/@tiptap/extension-ordered-list/-/extension-ordered-list-2.26.1.tgz", - "integrity": "sha512-UHKNRxq6TBnXMGFSq91knD6QaHsyyOwLOsXMzupmKM5Su0s+CRXEjfav3qKlbb9e4m7D7S/a0aPm8nC9KIXNhQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-paragraph": { - "version": "2.26.1", - "resolved": "https://registry.npmmirror.com/@tiptap/extension-paragraph/-/extension-paragraph-2.26.1.tgz", - "integrity": "sha512-UezvM9VDRAVJlX1tykgHWSD1g3MKfVMWWZ+Tg+PE4+kizOwoYkRWznVPgCAxjmyHajxpCKRXgqTZkOxjJ9Kjzg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-strike": { - "version": "2.26.1", - "resolved": "https://registry.npmmirror.com/@tiptap/extension-strike/-/extension-strike-2.26.1.tgz", - "integrity": "sha512-CkoRH+pAi6MgdCh7K0cVZl4N2uR4pZdabXAnFSoLZRSg6imLvEUmWHfSi1dl3Z7JOvd3a4yZ4NxerQn5MWbJ7g==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-text": { - "version": "2.26.1", - "resolved": "https://registry.npmmirror.com/@tiptap/extension-text/-/extension-text-2.26.1.tgz", - "integrity": "sha512-p2n8WVMd/2vckdJlol24acaTDIZAhI7qle5cM75bn01sOEZoFlSw6SwINOULrUCzNJsYb43qrLEibZb4j2LeQw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-text-style": { - "version": "2.26.1", - "resolved": "https://registry.npmmirror.com/@tiptap/extension-text-style/-/extension-text-style-2.26.1.tgz", - "integrity": "sha512-t9Nc/UkrbCfnSHEUi1gvUQ2ZPzvfdYFT5TExoV2DTiUCkhG6+mecT5bTVFGW3QkPmbToL+nFhGn4ZRMDD0SP3Q==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0" - } - }, - "node_modules/@tiptap/pm": { - "version": "2.26.1", - "resolved": "https://registry.npmmirror.com/@tiptap/pm/-/pm-2.26.1.tgz", - "integrity": "sha512-8aF+mY/vSHbGFqyG663ds84b+vca5Lge3tHdTMTKazxCnhXR9dn2oQJMnZ78YZvdRbkPkMJJHti9h3K7u2UQvw==", - "license": "MIT", - "dependencies": { - "prosemirror-changeset": "^2.3.0", - "prosemirror-collab": "^1.3.1", - "prosemirror-commands": "^1.6.2", - "prosemirror-dropcursor": "^1.8.1", - "prosemirror-gapcursor": "^1.3.2", - "prosemirror-history": "^1.4.1", - "prosemirror-inputrules": "^1.4.0", - "prosemirror-keymap": "^1.2.2", - "prosemirror-markdown": "^1.13.1", - "prosemirror-menu": "^1.2.4", - "prosemirror-model": "^1.23.0", - "prosemirror-schema-basic": "^1.2.3", - "prosemirror-schema-list": "^1.4.1", - "prosemirror-state": "^1.4.3", - "prosemirror-tables": "^1.6.4", - "prosemirror-trailing-node": "^3.0.0", - "prosemirror-transform": "^1.10.2", - "prosemirror-view": "^1.37.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - } - }, - "node_modules/@tiptap/starter-kit": { - "version": "2.26.1", - "resolved": "https://registry.npmmirror.com/@tiptap/starter-kit/-/starter-kit-2.26.1.tgz", - "integrity": "sha512-oziMGCds8SVQ3s5dRpBxVdEKZAmO/O//BjZ69mhA3q4vJdR0rnfLb5fTxSeQvHiqB878HBNn76kNaJrHrV35GA==", - "license": "MIT", - "dependencies": { - "@tiptap/core": "^2.26.1", - "@tiptap/extension-blockquote": "^2.26.1", - "@tiptap/extension-bold": "^2.26.1", - "@tiptap/extension-bullet-list": "^2.26.1", - "@tiptap/extension-code": "^2.26.1", - "@tiptap/extension-code-block": "^2.26.1", - "@tiptap/extension-document": "^2.26.1", - "@tiptap/extension-dropcursor": "^2.26.1", - "@tiptap/extension-gapcursor": "^2.26.1", - "@tiptap/extension-hard-break": "^2.26.1", - "@tiptap/extension-heading": "^2.26.1", - "@tiptap/extension-history": "^2.26.1", - "@tiptap/extension-horizontal-rule": "^2.26.1", - "@tiptap/extension-italic": "^2.26.1", - "@tiptap/extension-list-item": "^2.26.1", - "@tiptap/extension-ordered-list": "^2.26.1", - "@tiptap/extension-paragraph": "^2.26.1", - "@tiptap/extension-strike": "^2.26.1", - "@tiptap/extension-text": "^2.26.1", - "@tiptap/extension-text-style": "^2.26.1", - "@tiptap/pm": "^2.26.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - } - }, - "node_modules/@tiptap/vue-3": { - "version": "2.26.1", - "resolved": "https://registry.npmmirror.com/@tiptap/vue-3/-/vue-3-2.26.1.tgz", - "integrity": "sha512-GC0UP+v3KEb0nhgjIHYmWIn5ziTaRqSy8TESXOjG5aljJ8BdP+A0pbcpumB3u0QU+BLUANZqUV2r3l+V18AKYg==", - "license": "MIT", - "dependencies": { - "@tiptap/extension-bubble-menu": "^2.26.1", - "@tiptap/extension-floating-menu": "^2.26.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0", - "@tiptap/pm": "^2.7.0", - "vue": "^3.0.0" - } - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/@types/file-saver": { - "version": "2.0.7", - "resolved": "https://registry.npmmirror.com/@types/file-saver/-/file-saver-2.0.7.tgz", - "integrity": "sha512-dNKVfHd/jk0SkR/exKGj2ggkB45MAkzvWCaqLUUgkyjITkGNzH8H+yUwr+BLJUBjZOe9w8X3wgmXhZDRg1ED6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/@types/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", - "license": "MIT" - }, - "node_modules/@types/lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==", - "license": "MIT" - }, - "node_modules/@types/lodash-es": { - "version": "4.17.12", - "resolved": "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.12.tgz", - "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", - "license": "MIT", - "dependencies": { - "@types/lodash": "*" - } - }, - "node_modules/@types/markdown-it": { - "version": "14.1.2", - "resolved": "https://registry.npmmirror.com/@types/markdown-it/-/markdown-it-14.1.2.tgz", - "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", - "license": "MIT", - "dependencies": { - "@types/linkify-it": "^5", - "@types/mdurl": "^2" - } - }, - "node_modules/@types/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/@types/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "24.1.0", - "resolved": "https://registry.npmmirror.com/@types/node/-/node-24.1.0.tgz", - "integrity": "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "undici-types": "~7.8.0" - } - }, - "node_modules/@types/nprogress": { - "version": "0.2.3", - "resolved": "https://registry.npmmirror.com/@types/nprogress/-/nprogress-0.2.3.tgz", - "integrity": "sha512-k7kRA033QNtC+gLc4VPlfnue58CM1iQLgn1IMAU8VPHGOj7oIHPp9UlhedEnD/Gl8evoCjwkZjlBORtZ3JByUA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/resolve": { - "version": "1.20.2", - "resolved": "https://registry.npmmirror.com/@types/resolve/-/resolve-1.20.2.tgz", - "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/semver": { - "version": "7.7.0", - "resolved": "https://registry.npmmirror.com/@types/semver/-/semver-7.7.0.tgz", - "integrity": "sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/sinonjs__fake-timers": { - "version": "8.1.1", - "resolved": "https://registry.npmmirror.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz", - "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/sizzle": { - "version": "2.3.9", - "resolved": "https://registry.npmmirror.com/@types/sizzle/-/sizzle-2.3.9.tgz", - "integrity": "sha512-xzLEyKB50yqCUPUJkIsrVvoWNfFUbIZI+RspLWt8u+tIW/BetMBZtgV2LY/2o+tYH8dRvQ+eoPf3NdhQCcLE2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/trusted-types": { - "version": "2.0.7", - "resolved": "https://registry.npmmirror.com/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/web-bluetooth": { - "version": "0.0.20", - "resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", - "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==", - "license": "MIT" - }, - "node_modules/@types/yauzl": { - "version": "2.10.3", - "resolved": "https://registry.npmmirror.com/@types/yauzl/-/yauzl-2.10.3.tgz", - "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.21.0", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", - "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/type-utils": "6.21.0", - "@typescript-eslint/utils": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "6.21.0", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-6.21.0.tgz", - "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "6.21.0", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", - "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "6.21.0", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", - "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/utils": "6.21.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "6.21.0", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/types/-/types-6.21.0.tgz", - "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.21.0", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", - "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "6.21.0", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-6.21.0.tgz", - "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.21.0", - "resolved": "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", - "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "6.21.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmmirror.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", - "dev": true, - "license": "ISC" - }, - "node_modules/@vitejs/plugin-vue": { - "version": "5.2.4", - "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", - "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "vite": "^5.0.0 || ^6.0.0", - "vue": "^3.2.25" - } - }, - "node_modules/@vitest/expect": { - "version": "1.6.1", - "resolved": "https://registry.npmmirror.com/@vitest/expect/-/expect-1.6.1.tgz", - "integrity": "sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "1.6.1", - "@vitest/utils": "1.6.1", - "chai": "^4.3.10" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "1.6.1", - "resolved": "https://registry.npmmirror.com/@vitest/runner/-/runner-1.6.1.tgz", - "integrity": "sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "1.6.1", - "p-limit": "^5.0.0", - "pathe": "^1.1.1" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner/node_modules/p-limit": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-5.0.0.tgz", - "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@vitest/runner/node_modules/yocto-queue": { - "version": "1.2.1", - "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-1.2.1.tgz", - "integrity": "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@vitest/snapshot": { - "version": "1.6.1", - "resolved": "https://registry.npmmirror.com/@vitest/snapshot/-/snapshot-1.6.1.tgz", - "integrity": "sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "pretty-format": "^29.7.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "1.6.1", - "resolved": "https://registry.npmmirror.com/@vitest/spy/-/spy-1.6.1.tgz", - "integrity": "sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyspy": "^2.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "1.6.1", - "resolved": "https://registry.npmmirror.com/@vitest/utils/-/utils-1.6.1.tgz", - "integrity": "sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "diff-sequences": "^29.6.3", - "estree-walker": "^3.0.3", - "loupe": "^2.3.7", - "pretty-format": "^29.7.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/@volar/language-core": { - "version": "2.4.15", - "resolved": "https://registry.npmmirror.com/@volar/language-core/-/language-core-2.4.15.tgz", - "integrity": "sha512-3VHw+QZU0ZG9IuQmzT68IyN4hZNd9GchGPhbD9+pa8CVv7rnoOZwo7T8weIbrRmihqy3ATpdfXFnqRrfPVK6CA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@volar/source-map": "2.4.15" - } - }, - "node_modules/@volar/source-map": { - "version": "2.4.15", - "resolved": "https://registry.npmmirror.com/@volar/source-map/-/source-map-2.4.15.tgz", - "integrity": "sha512-CPbMWlUN6hVZJYGcU/GSoHu4EnCHiLaXI9n8c9la6RaI9W5JHX+NqG+GSQcB0JdC2FIBLdZJwGsfKyBB71VlTg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@volar/typescript": { - "version": "2.4.15", - "resolved": "https://registry.npmmirror.com/@volar/typescript/-/typescript-2.4.15.tgz", - "integrity": "sha512-2aZ8i0cqPGjXb4BhkMsPYDkkuc2ZQ6yOpqwAuNwUoncELqoy5fRgOQtLR9gB0g902iS0NAkvpIzs27geVyVdPg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@volar/language-core": "2.4.15", - "path-browserify": "^1.0.1", - "vscode-uri": "^3.0.8" - } - }, - "node_modules/@vue/compiler-core": { - "version": "3.5.18", - "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.18.tgz", - "integrity": "sha512-3slwjQrrV1TO8MoXgy3aynDQ7lslj5UqDxuHnrzHtpON5CBinhWjJETciPngpin/T3OuW3tXUf86tEurusnztw==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.28.0", - "@vue/shared": "3.5.18", - "entities": "^4.5.0", - "estree-walker": "^2.0.2", - "source-map-js": "^1.2.1" - } - }, - "node_modules/@vue/compiler-dom": { - "version": "3.5.18", - "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.18.tgz", - "integrity": "sha512-RMbU6NTU70++B1JyVJbNbeFkK+A+Q7y9XKE2EM4NLGm2WFR8x9MbAtWxPPLdm0wUkuZv9trpwfSlL6tjdIa1+A==", - "license": "MIT", - "dependencies": { - "@vue/compiler-core": "3.5.18", - "@vue/shared": "3.5.18" - } - }, - "node_modules/@vue/compiler-sfc": { - "version": "3.5.18", - "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.18.tgz", - "integrity": "sha512-5aBjvGqsWs+MoxswZPoTB9nSDb3dhd1x30xrrltKujlCxo48j8HGDNj3QPhF4VIS0VQDUrA1xUfp2hEa+FNyXA==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.28.0", - "@vue/compiler-core": "3.5.18", - "@vue/compiler-dom": "3.5.18", - "@vue/compiler-ssr": "3.5.18", - "@vue/shared": "3.5.18", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.17", - "postcss": "^8.5.6", - "source-map-js": "^1.2.1" - } - }, - "node_modules/@vue/compiler-ssr": { - "version": "3.5.18", - "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.18.tgz", - "integrity": "sha512-xM16Ak7rSWHkM3m22NlmcdIM+K4BMyFARAfV9hYFl+SFuRzrZ3uGMNW05kA5pmeMa0X9X963Kgou7ufdbpOP9g==", - "license": "MIT", - "dependencies": { - "@vue/compiler-dom": "3.5.18", - "@vue/shared": "3.5.18" - } - }, - "node_modules/@vue/compiler-vue2": { - "version": "2.7.16", - "resolved": "https://registry.npmmirror.com/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", - "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", - "dev": true, - "license": "MIT", - "dependencies": { - "de-indent": "^1.0.2", - "he": "^1.2.0" - } - }, - "node_modules/@vue/devtools-api": { - "version": "6.6.4", - "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.6.4.tgz", - "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", - "license": "MIT" - }, - "node_modules/@vue/eslint-config-prettier": { - "version": "9.0.0", - "resolved": "https://registry.npmmirror.com/@vue/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", - "integrity": "sha512-z1ZIAAUS9pKzo/ANEfd2sO+v2IUalz7cM/cTLOZ7vRFOPk5/xuRKQteOu1DErFLAh/lYGXMVZ0IfYKlyInuDVg==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-config-prettier": "^9.0.0", - "eslint-plugin-prettier": "^5.0.0" - }, - "peerDependencies": { - "eslint": ">= 8.0.0", - "prettier": ">= 3.0.0" - } - }, - "node_modules/@vue/eslint-config-typescript": { - "version": "12.0.0", - "resolved": "https://registry.npmmirror.com/@vue/eslint-config-typescript/-/eslint-config-typescript-12.0.0.tgz", - "integrity": "sha512-StxLFet2Qe97T8+7L8pGlhYBBr8Eg05LPuTDVopQV6il+SK6qqom59BA/rcFipUef2jD8P2X44Vd8tMFytfvlg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/eslint-plugin": "^6.7.0", - "@typescript-eslint/parser": "^6.7.0", - "vue-eslint-parser": "^9.3.1" - }, - "engines": { - "node": "^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0", - "eslint-plugin-vue": "^9.0.0", - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@vue/language-core": { - "version": "2.2.12", - "resolved": "https://registry.npmmirror.com/@vue/language-core/-/language-core-2.2.12.tgz", - "integrity": "sha512-IsGljWbKGU1MZpBPN+BvPAdr55YPkj2nB/TBNGNC32Vy2qLG25DYu/NBN2vNtZqdRbTRjaoYrahLrToim2NanA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@volar/language-core": "2.4.15", - "@vue/compiler-dom": "^3.5.0", - "@vue/compiler-vue2": "^2.7.16", - "@vue/shared": "^3.5.0", - "alien-signals": "^1.0.3", - "minimatch": "^9.0.3", - "muggle-string": "^0.4.1", - "path-browserify": "^1.0.1" - }, - "peerDependencies": { - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@vue/reactivity": { - "version": "3.5.18", - "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.18.tgz", - "integrity": "sha512-x0vPO5Imw+3sChLM5Y+B6G1zPjwdOri9e8V21NnTnlEvkxatHEH5B5KEAJcjuzQ7BsjGrKtfzuQ5eQwXh8HXBg==", - "license": "MIT", - "dependencies": { - "@vue/shared": "3.5.18" - } - }, - "node_modules/@vue/runtime-core": { - "version": "3.5.18", - "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.18.tgz", - "integrity": "sha512-DUpHa1HpeOQEt6+3nheUfqVXRog2kivkXHUhoqJiKR33SO4x+a5uNOMkV487WPerQkL0vUuRvq/7JhRgLW3S+w==", - "license": "MIT", - "dependencies": { - "@vue/reactivity": "3.5.18", - "@vue/shared": "3.5.18" - } - }, - "node_modules/@vue/runtime-dom": { - "version": "3.5.18", - "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.18.tgz", - "integrity": "sha512-YwDj71iV05j4RnzZnZtGaXwPoUWeRsqinblgVJwR8XTXYZ9D5PbahHQgsbmzUvCWNF6x7siQ89HgnX5eWkr3mw==", - "license": "MIT", - "dependencies": { - "@vue/reactivity": "3.5.18", - "@vue/runtime-core": "3.5.18", - "@vue/shared": "3.5.18", - "csstype": "^3.1.3" - } - }, - "node_modules/@vue/server-renderer": { - "version": "3.5.18", - "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.18.tgz", - "integrity": "sha512-PvIHLUoWgSbDG7zLHqSqaCoZvHi6NNmfVFOqO+OnwvqMz/tqQr3FuGWS8ufluNddk7ZLBJYMrjcw1c6XzR12mA==", - "license": "MIT", - "dependencies": { - "@vue/compiler-ssr": "3.5.18", - "@vue/shared": "3.5.18" - }, - "peerDependencies": { - "vue": "3.5.18" - } - }, - "node_modules/@vue/shared": { - "version": "3.5.18", - "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.18.tgz", - "integrity": "sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==", - "license": "MIT" - }, - "node_modules/@vue/test-utils": { - "version": "2.4.6", - "resolved": "https://registry.npmmirror.com/@vue/test-utils/-/test-utils-2.4.6.tgz", - "integrity": "sha512-FMxEjOpYNYiFe0GkaHsnJPXFHxQ6m4t8vI/ElPGpMWxZKpmRvQ33OIrvRXemy6yha03RxhOlQuy+gZMC3CQSow==", - "dev": true, - "license": "MIT", - "dependencies": { - "js-beautify": "^1.14.9", - "vue-component-type-helpers": "^2.0.0" - } - }, - "node_modules/@vue/tsconfig": { - "version": "0.5.1", - "resolved": "https://registry.npmmirror.com/@vue/tsconfig/-/tsconfig-0.5.1.tgz", - "integrity": "sha512-VcZK7MvpjuTPx2w6blwnwZAu5/LgBUtejFOi3pPGQFXQN5Ela03FUtd2Qtg4yWGGissVL0dr6Ro1LfOFh+PCuQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vuelidate/core": { - "version": "2.0.3", - "resolved": "https://registry.npmmirror.com/@vuelidate/core/-/core-2.0.3.tgz", - "integrity": "sha512-AN6l7KF7+mEfyWG0doT96z+47ljwPpZfi9/JrNMkOGLFv27XVZvKzRLXlmDPQjPl/wOB1GNnHuc54jlCLRNqGA==", - "license": "MIT", - "dependencies": { - "vue-demi": "^0.13.11" - }, - "peerDependencies": { - "@vue/composition-api": "^1.0.0-rc.1", - "vue": "^2.0.0 || >=3.0.0" - }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - } - } - }, - "node_modules/@vuelidate/core/node_modules/vue-demi": { - "version": "0.13.11", - "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.13.11.tgz", - "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==", - "hasInstallScript": true, - "license": "MIT", - "bin": { - "vue-demi-fix": "bin/vue-demi-fix.js", - "vue-demi-switch": "bin/vue-demi-switch.js" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@vue/composition-api": "^1.0.0-rc.1", - "vue": "^3.0.0-0 || ^2.6.0" - }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - } - } - }, - "node_modules/@vuelidate/validators": { - "version": "2.0.4", - "resolved": "https://registry.npmmirror.com/@vuelidate/validators/-/validators-2.0.4.tgz", - "integrity": "sha512-odTxtUZ2JpwwiQ10t0QWYJkkYrfd0SyFYhdHH44QQ1jDatlZgTh/KRzrWVmn/ib9Gq7H4hFD4e8ahoo5YlUlDw==", - "license": "MIT", - "dependencies": { - "vue-demi": "^0.13.11" - }, - "peerDependencies": { - "@vue/composition-api": "^1.0.0-rc.1", - "vue": "^2.0.0 || >=3.0.0" - }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - } - } - }, - "node_modules/@vuelidate/validators/node_modules/vue-demi": { - "version": "0.13.11", - "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.13.11.tgz", - "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==", - "hasInstallScript": true, - "license": "MIT", - "bin": { - "vue-demi-fix": "bin/vue-demi-fix.js", - "vue-demi-switch": "bin/vue-demi-switch.js" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@vue/composition-api": "^1.0.0-rc.1", - "vue": "^3.0.0-0 || ^2.6.0" - }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - } - } - }, - "node_modules/@vueuse/core": { - "version": "10.11.1", - "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-10.11.1.tgz", - "integrity": "sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==", - "license": "MIT", - "dependencies": { - "@types/web-bluetooth": "^0.0.20", - "@vueuse/metadata": "10.11.1", - "@vueuse/shared": "10.11.1", - "vue-demi": ">=0.14.8" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vueuse/metadata": { - "version": "10.11.1", - "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-10.11.1.tgz", - "integrity": "sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vueuse/motion": { - "version": "2.2.6", - "resolved": "https://registry.npmmirror.com/@vueuse/motion/-/motion-2.2.6.tgz", - "integrity": "sha512-gKFktPtrdypSv44SaW1oBJKLBiP6kE5NcoQ6RsAU3InemESdiAutgQncfPe/rhLSLCtL4jTAhMmFfxoR6gm5LQ==", - "license": "MIT", - "dependencies": { - "@vueuse/core": "^10.10.0", - "@vueuse/shared": "^10.10.0", - "csstype": "^3.1.3", - "framesync": "^6.1.2", - "popmotion": "^11.0.5", - "style-value-types": "^5.1.2" - }, - "optionalDependencies": { - "@nuxt/kit": "^3.13.0" - }, - "peerDependencies": { - "vue": ">=3.0.0" - } - }, - "node_modules/@vueuse/shared": { - "version": "10.11.1", - "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-10.11.1.tgz", - "integrity": "sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==", - "license": "MIT", - "dependencies": { - "vue-demi": ">=0.14.8" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/abbrev": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/abbrev/-/abbrev-2.0.0.tgz", - "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "devOptional": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmmirror.com/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "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/alien-signals": { - "version": "1.0.13", - "resolved": "https://registry.npmmirror.com/alien-signals/-/alien-signals-1.0.13.tgz", - "integrity": "sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==", - "dev": true, - "license": "MIT" - }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmmirror.com/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "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", - "resolved": "https://registry.npmmirror.com/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "license": "MIT" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "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", - "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/arch": { - "version": "2.2.0", - "resolved": "https://registry.npmmirror.com/arch/-/arch-2.2.0.tgz", - "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", - "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/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmmirror.com/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "license": "MIT" - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", - "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", - "resolved": "https://registry.npmmirror.com/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.4", - "resolved": "https://registry.npmmirror.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", - "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", - "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/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmmirror.com/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmmirror.com/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "dev": true, - "license": "MIT" - }, - "node_modules/async-function": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/async-function/-/async-function-1.0.0.tgz", - "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/async-validator": { - "version": "4.2.5", - "resolved": "https://registry.npmmirror.com/async-validator/-/async-validator-4.2.5.tgz", - "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==", - "license": "MIT" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.21", - "resolved": "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-10.4.21.tgz", - "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", - "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", - "resolved": "https://registry.npmmirror.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "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/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmmirror.com/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.13.2", - "resolved": "https://registry.npmmirror.com/aws4/-/aws4-1.13.2.tgz", - "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", - "dev": true, - "license": "MIT" - }, - "node_modules/axios": { - "version": "1.11.0", - "resolved": "https://registry.npmmirror.com/axios/-/axios-1.11.0.tgz", - "integrity": "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.4", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.14", - "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", - "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==", - "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", - "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.13.0", - "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", - "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", - "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", - "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz", - "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==", - "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", - "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "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/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/blob-util": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/blob-util/-/blob-util-2.0.2.tgz", - "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmmirror.com/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true, - "license": "MIT" - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true, - "license": "ISC", - "peer": true - }, - "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.25.1", - "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.25.1.tgz", - "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", - "dev": true, - "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": { - "version": "5.7.1", - "resolved": "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmmirror.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/bundle-require": { - "version": "4.2.1", - "resolved": "https://registry.npmmirror.com/bundle-require/-/bundle-require-4.2.1.tgz", - "integrity": "sha512-7Q/6vkyYAwOmQNRw75x+4yRtZCZJXUDmHHlFdkiV0wgv/reNjtJwpu1jPJ0w2kbEpIM0uoKI3S4/f39dU7AjSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "load-tsconfig": "^0.2.3" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "peerDependencies": { - "esbuild": ">=0.17" - } - }, - "node_modules/c12": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/c12/-/c12-3.1.0.tgz", - "integrity": "sha512-uWoS8OU1MEIsOv8p/5a82c3H31LsWVR5qiyXVfBNOzfffjUWtPnhAb4BYI2uG2HfGmZmFjCtui5XNWaps+iFuw==", - "license": "MIT", - "optional": true, - "dependencies": { - "chokidar": "^4.0.3", - "confbox": "^0.2.2", - "defu": "^6.1.4", - "dotenv": "^16.6.1", - "exsolve": "^1.0.7", - "giget": "^2.0.0", - "jiti": "^2.4.2", - "ohash": "^2.0.11", - "pathe": "^2.0.3", - "perfect-debounce": "^1.0.0", - "pkg-types": "^2.2.0", - "rc9": "^2.1.2" - }, - "peerDependencies": { - "magicast": "^0.3.5" - }, - "peerDependenciesMeta": { - "magicast": { - "optional": true - } - } - }, - "node_modules/c12/node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmmirror.com/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "license": "MIT", - "optional": true - }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmmirror.com/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cachedir": { - "version": "2.4.0", - "resolved": "https://registry.npmmirror.com/cachedir/-/cachedir-2.4.0.tgz", - "integrity": "sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "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", - "resolved": "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "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", - "resolved": "https://registry.npmmirror.com/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "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/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001727", - "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz", - "integrity": "sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==", - "dev": true, - "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/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmmirror.com/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/chai": { - "version": "4.5.0", - "resolved": "https://registry.npmmirror.com/chai/-/chai-4.5.0.tgz", - "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "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/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-func-name": "^2.0.2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/check-more-types": { - "version": "2.24.0", - "resolved": "https://registry.npmmirror.com/check-more-types/-/check-more-types-2.24.0.tgz", - "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "license": "MIT", - "optional": true, - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/ci-info": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/ci-info/-/ci-info-4.3.0.tgz", - "integrity": "sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/citty": { - "version": "0.1.6", - "resolved": "https://registry.npmmirror.com/citty/-/citty-0.1.6.tgz", - "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "consola": "^3.2.3" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmmirror.com/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-table3": { - "version": "0.6.5", - "resolved": "https://registry.npmmirror.com/cli-table3/-/cli-table3-0.6.5.tgz", - "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmmirror.com/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "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", - "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "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/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmmirror.com/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "6.2.1", - "resolved": "https://registry.npmmirror.com/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/common-tags": { - "version": "1.8.2", - "resolved": "https://registry.npmmirror.com/common-tags/-/common-tags-1.8.2.tgz", - "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/confbox": { - "version": "0.2.2", - "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.2.2.tgz", - "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", - "license": "MIT", - "optional": true - }, - "node_modules/config-chain": { - "version": "1.1.13", - "resolved": "https://registry.npmmirror.com/config-chain/-/config-chain-1.1.13.tgz", - "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/config-chain/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmmirror.com/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true, - "license": "ISC" - }, - "node_modules/connect": { - "version": "3.7.0", - "resolved": "https://registry.npmmirror.com/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/connect/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/connect/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/consola": { - "version": "3.4.2", - "resolved": "https://registry.npmmirror.com/consola/-/consola-3.4.2.tgz", - "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", - "license": "MIT", - "optional": true, - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/core-js-compat": { - "version": "3.44.0", - "resolved": "https://registry.npmmirror.com/core-js-compat/-/core-js-compat-3.44.0.tgz", - "integrity": "sha512-JepmAj2zfl6ogy34qfWtcE7nHKAJnKsQFRn++scjVS2bZFllwptzw61BZcZFYBPpUznLfAvh0LGhxKppk04ClA==", - "dev": true, - "license": "MIT", - "dependencies": { - "browserslist": "^4.25.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/crelt": { - "version": "1.0.6", - "resolved": "https://registry.npmmirror.com/crelt/-/crelt-1.0.6.tgz", - "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", - "license": "MIT" - }, - "node_modules/cropperjs": { - "version": "1.6.2", - "resolved": "https://registry.npmmirror.com/cropperjs/-/cropperjs-1.6.2.tgz", - "integrity": "sha512-nhymn9GdnV3CqiEHJVai54TULFAE3VshJTXSqSJKa8yXAKyBKDWdhHarnlIPrshJ0WMFTGuFvG02YjLXfPiuOA==", - "license": "MIT" - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "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", - "resolved": "https://registry.npmmirror.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssstyle": { - "version": "4.6.0", - "resolved": "https://registry.npmmirror.com/cssstyle/-/cssstyle-4.6.0.tgz", - "integrity": "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@asamuzakjp/css-color": "^3.2.0", - "rrweb-cssom": "^0.8.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/cssstyle/node_modules/rrweb-cssom": { - "version": "0.8.0", - "resolved": "https://registry.npmmirror.com/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", - "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", - "dev": true, - "license": "MIT" - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "license": "MIT" - }, - "node_modules/cypress": { - "version": "13.17.0", - "resolved": "https://registry.npmmirror.com/cypress/-/cypress-13.17.0.tgz", - "integrity": "sha512-5xWkaPurwkIljojFidhw8lFScyxhtiFHl/i/3zov+1Z5CmY4t9tjIdvSXfu82Y3w7wt0uR9KkucbhkVvJZLQSA==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@cypress/request": "^3.0.6", - "@cypress/xvfb": "^1.2.4", - "@types/sinonjs__fake-timers": "8.1.1", - "@types/sizzle": "^2.3.2", - "arch": "^2.2.0", - "blob-util": "^2.0.2", - "bluebird": "^3.7.2", - "buffer": "^5.7.1", - "cachedir": "^2.3.0", - "chalk": "^4.1.0", - "check-more-types": "^2.24.0", - "ci-info": "^4.0.0", - "cli-cursor": "^3.1.0", - "cli-table3": "~0.6.1", - "commander": "^6.2.1", - "common-tags": "^1.8.0", - "dayjs": "^1.10.4", - "debug": "^4.3.4", - "enquirer": "^2.3.6", - "eventemitter2": "6.4.7", - "execa": "4.1.0", - "executable": "^4.1.1", - "extract-zip": "2.0.1", - "figures": "^3.2.0", - "fs-extra": "^9.1.0", - "getos": "^3.2.1", - "is-installed-globally": "~0.4.0", - "lazy-ass": "^1.6.0", - "listr2": "^3.8.3", - "lodash": "^4.17.21", - "log-symbols": "^4.0.0", - "minimist": "^1.2.8", - "ospath": "^1.2.2", - "pretty-bytes": "^5.6.0", - "process": "^0.11.10", - "proxy-from-env": "1.0.0", - "request-progress": "^3.0.0", - "semver": "^7.5.3", - "supports-color": "^8.1.1", - "tmp": "~0.2.3", - "tree-kill": "1.2.2", - "untildify": "^4.0.0", - "yauzl": "^2.10.0" - }, - "bin": { - "cypress": "bin/cypress" - }, - "engines": { - "node": "^16.0.0 || ^18.0.0 || >=20.0.0" - } - }, - "node_modules/cypress/node_modules/proxy-from-env": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz", - "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==", - "dev": true, - "license": "MIT" - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmmirror.com/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "dev": true, - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/data-urls": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/data-urls/-/data-urls-5.0.0.tgz", - "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/data-view-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/data-view-buffer/-/data-view-buffer-1.0.2.tgz", - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", - "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", - "resolved": "https://registry.npmmirror.com/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", - "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", - "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", - "resolved": "https://registry.npmmirror.com/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", - "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", - "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/dayjs": { - "version": "1.11.13", - "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz", - "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", - "license": "MIT" - }, - "node_modules/de-indent": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/de-indent/-/de-indent-1.0.2.tgz", - "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", - "dev": true, - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decimal.js": { - "version": "10.6.0", - "resolved": "https://registry.npmmirror.com/decimal.js/-/decimal.js-10.6.0.tgz", - "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", - "dev": true, - "license": "MIT" - }, - "node_modules/deep-eql": { - "version": "4.1.4", - "resolved": "https://registry.npmmirror.com/deep-eql/-/deep-eql-4.1.4.tgz", - "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmmirror.com/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "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-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "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/defu": { - "version": "6.1.4", - "resolved": "https://registry.npmmirror.com/defu/-/defu-6.1.4.tgz", - "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", - "license": "MIT", - "optional": true - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/destr": { - "version": "2.0.5", - "resolved": "https://registry.npmmirror.com/destr/-/destr-2.0.5.tgz", - "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==", - "license": "MIT", - "optional": true - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmmirror.com/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "license": "Apache-2.0" - }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmmirror.com/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmmirror.com/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "license": "MIT" - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dotenv": { - "version": "16.6.1", - "resolved": "https://registry.npmmirror.com/dotenv/-/dotenv-16.6.1.tgz", - "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", - "license": "BSD-2-Clause", - "optional": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "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", - "resolved": "https://registry.npmmirror.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "license": "MIT" - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmmirror.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dev": true, - "license": "MIT", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/echarts": { - "version": "5.6.0", - "resolved": "https://registry.npmmirror.com/echarts/-/echarts-5.6.0.tgz", - "integrity": "sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "2.3.0", - "zrender": "5.6.1" - } - }, - "node_modules/editorconfig": { - "version": "1.0.4", - "resolved": "https://registry.npmmirror.com/editorconfig/-/editorconfig-1.0.4.tgz", - "integrity": "sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@one-ini/wasm": "0.1.1", - "commander": "^10.0.0", - "minimatch": "9.0.1", - "semver": "^7.5.3" - }, - "bin": { - "editorconfig": "bin/editorconfig" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/editorconfig/node_modules/commander": { - "version": "10.0.1", - "resolved": "https://registry.npmmirror.com/commander/-/commander-10.0.1.tgz", - "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "node_modules/editorconfig/node_modules/minimatch": { - "version": "9.0.1", - "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.1.tgz", - "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true, - "license": "MIT" - }, - "node_modules/ejs": { - "version": "3.1.10", - "resolved": "https://registry.npmmirror.com/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", - "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.191", - "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.191.tgz", - "integrity": "sha512-xcwe9ELcuxYLUFqZZxL19Z6HVKcvNkIwhbHUz7L3us6u12yR+7uY89dSl570f/IqNthx8dAw3tojG7i4Ni4tDA==", - "dev": true, - "license": "ISC" - }, - "node_modules/element-plus": { - "version": "2.10.4", - "resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.10.4.tgz", - "integrity": "sha512-UD4elWHrCnp1xlPhbXmVcaKFLCRaRAY6WWRwemGfGW3ceIjXm9fSYc9RNH3AiOEA6Ds1p9ZvhCs76CR9J8Vd+A==", - "license": "MIT", - "dependencies": { - "@ctrl/tinycolor": "^3.4.1", - "@element-plus/icons-vue": "^2.3.1", - "@floating-ui/dom": "^1.0.1", - "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7", - "@types/lodash": "^4.14.182", - "@types/lodash-es": "^4.17.6", - "@vueuse/core": "^9.1.0", - "async-validator": "^4.2.5", - "dayjs": "^1.11.13", - "escape-html": "^1.0.3", - "lodash": "^4.17.21", - "lodash-es": "^4.17.21", - "lodash-unified": "^1.0.2", - "memoize-one": "^6.0.0", - "normalize-wheel-es": "^1.2.0" - }, - "peerDependencies": { - "vue": "^3.2.0" - } - }, - "node_modules/element-plus/node_modules/@types/web-bluetooth": { - "version": "0.0.16", - "resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz", - "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==", - "license": "MIT" - }, - "node_modules/element-plus/node_modules/@vueuse/core": { - "version": "9.13.0", - "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-9.13.0.tgz", - "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==", - "license": "MIT", - "dependencies": { - "@types/web-bluetooth": "^0.0.16", - "@vueuse/metadata": "9.13.0", - "@vueuse/shared": "9.13.0", - "vue-demi": "*" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/element-plus/node_modules/@vueuse/metadata": { - "version": "9.13.0", - "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.13.0.tgz", - "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/element-plus/node_modules/@vueuse/shared": { - "version": "9.13.0", - "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.13.0.tgz", - "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==", - "license": "MIT", - "dependencies": { - "vue-demi": "*" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.5", - "resolved": "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.5.tgz", - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/enquirer": { - "version": "2.4.1", - "resolved": "https://registry.npmmirror.com/enquirer/-/enquirer-2.4.1.tgz", - "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", - "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", - "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/environment": { - "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/environment/-/environment-1.1.0.tgz", - "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/errx": { - "version": "0.1.0", - "resolved": "https://registry.npmmirror.com/errx/-/errx-0.1.0.tgz", - "integrity": "sha512-fZmsRiDNv07K6s2KkKFTiD2aIvECa7++PKyD5NC32tpRw46qZA3sOz+aM+/V9V0GDHxVTKLziveV4JhzBHDp9Q==", - "license": "MIT", - "optional": true - }, - "node_modules/es-abstract": { - "version": "1.24.0", - "resolved": "https://registry.npmmirror.com/es-abstract/-/es-abstract-1.24.0.tgz", - "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", - "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-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "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", - "resolved": "https://registry.npmmirror.com/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", - "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/esbuild": { - "version": "0.25.8", - "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.25.8.tgz", - "integrity": "sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "peer": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.8", - "@esbuild/android-arm": "0.25.8", - "@esbuild/android-arm64": "0.25.8", - "@esbuild/android-x64": "0.25.8", - "@esbuild/darwin-arm64": "0.25.8", - "@esbuild/darwin-x64": "0.25.8", - "@esbuild/freebsd-arm64": "0.25.8", - "@esbuild/freebsd-x64": "0.25.8", - "@esbuild/linux-arm": "0.25.8", - "@esbuild/linux-arm64": "0.25.8", - "@esbuild/linux-ia32": "0.25.8", - "@esbuild/linux-loong64": "0.25.8", - "@esbuild/linux-mips64el": "0.25.8", - "@esbuild/linux-ppc64": "0.25.8", - "@esbuild/linux-riscv64": "0.25.8", - "@esbuild/linux-s390x": "0.25.8", - "@esbuild/linux-x64": "0.25.8", - "@esbuild/netbsd-arm64": "0.25.8", - "@esbuild/netbsd-x64": "0.25.8", - "@esbuild/openbsd-arm64": "0.25.8", - "@esbuild/openbsd-x64": "0.25.8", - "@esbuild/openharmony-arm64": "0.25.8", - "@esbuild/sunos-x64": "0.25.8", - "@esbuild/win32-arm64": "0.25.8", - "@esbuild/win32-ia32": "0.25.8", - "@esbuild/win32-x64": "0.25.8" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/eslint": { - "version": "8.57.1", - "resolved": "https://registry.npmmirror.com/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.1", - "@humanwhocodes/config-array": "^0.13.0", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-prettier": { - "version": "9.1.2", - "resolved": "https://registry.npmmirror.com/eslint-config-prettier/-/eslint-config-prettier-9.1.2.tgz", - "integrity": "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ==", - "dev": true, - "license": "MIT", - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-prettier": { - "version": "5.5.3", - "resolved": "https://registry.npmmirror.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.3.tgz", - "integrity": "sha512-NAdMYww51ehKfDyDhv59/eIItUVzU0Io9H2E8nHNGKEeeqlnci+1gCvrHib6EmZdf6GxF+LCV5K7UC65Ezvw7w==", - "dev": true, - "license": "MIT", - "dependencies": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.11.7" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint-plugin-prettier" - }, - "peerDependencies": { - "@types/eslint": ">=8.0.0", - "eslint": ">=8.0.0", - "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", - "prettier": ">=3.0.0" - }, - "peerDependenciesMeta": { - "@types/eslint": { - "optional": true - }, - "eslint-config-prettier": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-vue": { - "version": "9.33.0", - "resolved": "https://registry.npmmirror.com/eslint-plugin-vue/-/eslint-plugin-vue-9.33.0.tgz", - "integrity": "sha512-174lJKuNsuDIlLpjeXc5E2Tss8P44uIimAfGD0b90k0NoirJqpG7stLuU9Vp/9ioTOrQdWVREc4mRd1BD+CvGw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "globals": "^13.24.0", - "natural-compare": "^1.4.0", - "nth-check": "^2.1.1", - "postcss-selector-parser": "^6.0.15", - "semver": "^7.6.3", - "vue-eslint-parser": "^9.4.3", - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": "^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0" - } - }, - "node_modules/eslint-plugin-vue/node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmmirror.com/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmmirror.com/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "license": "MIT" - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eventemitter2": { - "version": "6.4.7", - "resolved": "https://registry.npmmirror.com/eventemitter2/-/eventemitter2-6.4.7.tgz", - "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==", - "dev": true, - "license": "MIT" - }, - "node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", - "dev": true, - "license": "MIT" - }, - "node_modules/execa": { - "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/executable": { - "version": "4.1.1", - "resolved": "https://registry.npmmirror.com/executable/-/executable-4.1.1.tgz", - "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "pify": "^2.2.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/exsolve": { - "version": "1.0.7", - "resolved": "https://registry.npmmirror.com/exsolve/-/exsolve-1.0.7.tgz", - "integrity": "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmmirror.com/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true, - "license": "MIT" - }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmmirror.com/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "license": "MIT" - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmmirror.com/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmmirror.com/fast-uri/-/fast-uri-3.0.6.tgz", - "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", - "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", - "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/fdir": { - "version": "6.4.6", - "resolved": "https://registry.npmmirror.com/fdir/-/fdir-6.4.6.tgz", - "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", - "license": "MIT", - "optional": true, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmmirror.com/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/file-saver": { - "version": "2.0.5", - "resolved": "https://registry.npmmirror.com/file-saver/-/file-saver-2.0.5.tgz", - "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==", - "license": "MIT" - }, - "node_modules/filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmmirror.com/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "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": "3.2.0", - "resolved": "https://registry.npmmirror.com/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmmirror.com/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true, - "license": "ISC" - }, - "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmmirror.com/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", - "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", - "resolved": "https://registry.npmmirror.com/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "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", - "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "4.0.4", - "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.4.tgz", - "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", - "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", - "resolved": "https://registry.npmmirror.com/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/framesync": { - "version": "6.1.2", - "resolved": "https://registry.npmmirror.com/framesync/-/framesync-6.1.2.tgz", - "integrity": "sha512-jBTqhX6KaQVDyus8muwZbBeGGP0XgujBRbQ7gM7BRdS3CadCZIHiawyzYLnafYcvZIh5j8WE7cxZKFn7dXhu9g==", - "license": "MIT", - "dependencies": { - "tslib": "2.4.0" - } - }, - "node_modules/framesync/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "license": "0BSD" - }, - "node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "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/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmmirror.com/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", - "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.8", - "resolved": "https://registry.npmmirror.com/function.prototype.name/-/function.prototype.name-1.1.8.tgz", - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", - "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", - "resolved": "https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-east-asian-width": { - "version": "1.3.0", - "resolved": "https://registry.npmmirror.com/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", - "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "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-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmmirror.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", - "dev": true, - "license": "ISC" - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-symbol-description": { - "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/get-symbol-description/-/get-symbol-description-1.1.0.tgz", - "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", - "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/getos": { - "version": "3.2.1", - "resolved": "https://registry.npmmirror.com/getos/-/getos-3.2.1.tgz", - "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "async": "^3.2.0" - } - }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmmirror.com/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dev": true, - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/giget": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/giget/-/giget-2.0.0.tgz", - "integrity": "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==", - "license": "MIT", - "optional": true, - "dependencies": { - "citty": "^0.1.6", - "consola": "^3.4.0", - "defu": "^6.1.4", - "node-fetch-native": "^1.6.6", - "nypm": "^0.6.0", - "pathe": "^2.0.3" - }, - "bin": { - "giget": "dist/cli.mjs" - } - }, - "node_modules/giget/node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmmirror.com/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "license": "MIT", - "optional": true - }, - "node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmmirror.com/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "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", - "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmmirror.com/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmmirror.com/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "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", - "resolved": "https://registry.npmmirror.com/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "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/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true, - "license": "MIT" - }, - "node_modules/has-bigints": { - "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/has-bigints/-/has-bigints-1.1.0.tgz", - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "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", - "resolved": "https://registry.npmmirror.com/has-proto/-/has-proto-1.2.0.tgz", - "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", - "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", - "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "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", - "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "license": "MIT", - "bin": { - "he": "bin/he" - } - }, - "node_modules/hey-listen": { - "version": "1.0.8", - "resolved": "https://registry.npmmirror.com/hey-listen/-/hey-listen-1.0.8.tgz", - "integrity": "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==", - "license": "MIT" - }, - "node_modules/html-encoding-sniffer": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", - "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-encoding": "^3.1.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmmirror.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/http-signature": { - "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/http-signature/-/http-signature-1.4.0.tgz", - "integrity": "sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^2.0.2", - "sshpk": "^1.18.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8.12.0" - } - }, - "node_modules/husky": { - "version": "9.1.7", - "resolved": "https://registry.npmmirror.com/husky/-/husky-9.1.7.tgz", - "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", - "dev": true, - "license": "MIT", - "bin": { - "husky": "bin.js" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/typicode" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/idb": { - "version": "7.1.1", - "resolved": "https://registry.npmmirror.com/idb/-/idb-7.1.1.tgz", - "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "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": "BSD-3-Clause" - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "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", - "resolved": "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/internal-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/internal-slot/-/internal-slot-1.1.0.tgz", - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", - "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/is-array-buffer": { - "version": "3.0.5", - "resolved": "https://registry.npmmirror.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", - "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-async-function": { - "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/is-async-function/-/is-async-function-2.1.1.tgz", - "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", - "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", - "resolved": "https://registry.npmmirror.com/is-bigint/-/is-bigint-1.1.0.tgz", - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", - "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", - "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.2.2", - "resolved": "https://registry.npmmirror.com/is-boolean-object/-/is-boolean-object-1.2.2.tgz", - "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", - "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", - "resolved": "https://registry.npmmirror.com/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "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", - "resolved": "https://registry.npmmirror.com/is-data-view/-/is-data-view-1.0.2.tgz", - "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", - "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", - "resolved": "https://registry.npmmirror.com/is-date-object/-/is-date-object-1.1.0.tgz", - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", - "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-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmmirror.com/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", - "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", - "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", - "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-function": { - "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/is-generator-function/-/is-generator-function-1.1.0.tgz", - "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", - "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", - "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmmirror.com/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmmirror.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/is-number-object/-/is-number-object-1.1.1.tgz", - "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", - "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", - "resolved": "https://registry.npmmirror.com/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmmirror.com/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmmirror.com/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - "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", - "resolved": "https://registry.npmmirror.com/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmmirror.com/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "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", - "resolved": "https://registry.npmmirror.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", - "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", - "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", - "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-string": { - "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/is-string/-/is-string-1.1.1.tgz", - "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", - "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", - "resolved": "https://registry.npmmirror.com/is-symbol/-/is-symbol-1.1.1.tgz", - "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", - "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", - "resolved": "https://registry.npmmirror.com/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "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-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmmirror.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/is-weakref/-/is-weakref-1.1.1.tgz", - "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", - "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", - "resolved": "https://registry.npmmirror.com/is-weakset/-/is-weakset-2.0.4.tgz", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", - "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/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmmirror.com/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmmirror.com/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true, - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmmirror.com/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "dev": true, - "license": "MIT" - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmmirror.com/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "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", - "resolved": "https://registry.npmmirror.com/jake/-/jake-10.9.2.tgz", - "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", - "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/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/jake/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/jiti": { - "version": "2.5.1", - "resolved": "https://registry.npmmirror.com/jiti/-/jiti-2.5.1.tgz", - "integrity": "sha512-twQoecYPiVA5K/h6SxtORw/Bs3ar+mLUtoPSc7iMXzQzK8d7eJ/R09wmTwAjiamETn1cXYPGfNnu7DMoHgu12w==", - "license": "MIT", - "optional": true, - "bin": { - "jiti": "lib/jiti-cli.mjs" - } - }, - "node_modules/js-beautify": { - "version": "1.15.4", - "resolved": "https://registry.npmmirror.com/js-beautify/-/js-beautify-1.15.4.tgz", - "integrity": "sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA==", - "dev": true, - "license": "MIT", - "dependencies": { - "config-chain": "^1.1.13", - "editorconfig": "^1.0.4", - "glob": "^10.4.2", - "js-cookie": "^3.0.5", - "nopt": "^7.2.1" - }, - "bin": { - "css-beautify": "js/bin/css-beautify.js", - "html-beautify": "js/bin/html-beautify.js", - "js-beautify": "js/bin/js-beautify.js" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/js-cookie": { - "version": "3.0.5", - "resolved": "https://registry.npmmirror.com/js-cookie/-/js-cookie-3.0.5.tgz", - "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "node_modules/js-tokens": { - "version": "9.0.1", - "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-9.0.1.tgz", - "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmmirror.com/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "dev": true, - "license": "MIT" - }, - "node_modules/jsdom": { - "version": "24.1.3", - "resolved": "https://registry.npmmirror.com/jsdom/-/jsdom-24.1.3.tgz", - "integrity": "sha512-MyL55p3Ut3cXbeBEG7Hcv0mVM8pp8PBNWxRqchZnSfAiES1v1mRnMeFfaHWIPULpwsYfvO+ZmMZz5tGCnjzDUQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssstyle": "^4.0.1", - "data-urls": "^5.0.0", - "decimal.js": "^10.4.3", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^4.0.0", - "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.5", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.12", - "parse5": "^7.1.2", - "rrweb-cssom": "^0.7.1", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.4", - "w3c-xmlserializer": "^5.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^3.1.1", - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0", - "ws": "^8.18.0", - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "canvas": "^2.11.2" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsdom/node_modules/tough-cookie": { - "version": "4.1.4", - "resolved": "https://registry.npmmirror.com/tough-cookie/-/tough-cookie-4.1.4.tgz", - "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsdom/node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmmirror.com/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/jsdom/node_modules/xml-name-validator": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/xml-name-validator/-/xml-name-validator-5.0.0.tgz", - "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true, - "license": "(AFL-2.1 OR BSD-3-Clause)" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true, - "license": "ISC" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonc-eslint-parser": { - "version": "2.4.0", - "resolved": "https://registry.npmmirror.com/jsonc-eslint-parser/-/jsonc-eslint-parser-2.4.0.tgz", - "integrity": "sha512-WYDyuc/uFcGp6YtM2H0uKmUwieOuzeE/5YocFJLnLfclZ4inf3mRn8ZVy1s7Hxji7Jxm6Ss8gqpexD/GlKoGgg==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.5.0", - "eslint-visitor-keys": "^3.0.0", - "espree": "^9.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ota-meshi" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonpointer": { - "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/jsonpointer/-/jsonpointer-5.0.1.tgz", - "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jsprim": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/jsprim/-/jsprim-2.0.2.tgz", - "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "license": "MIT", - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/klona": { - "version": "2.0.6", - "resolved": "https://registry.npmmirror.com/klona/-/klona-2.0.6.tgz", - "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/knitwork": { - "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/knitwork/-/knitwork-1.2.0.tgz", - "integrity": "sha512-xYSH7AvuQ6nXkq42x0v5S8/Iry+cfulBz/DJQzhIyESdLD7425jXsPy4vn5cCXU+HhRN2kVw51Vd1K6/By4BQg==", - "license": "MIT", - "optional": true - }, - "node_modules/lazy-ass": { - "version": "1.6.0", - "resolved": "https://registry.npmmirror.com/lazy-ass/-/lazy-ass-1.6.0.tgz", - "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "> 0.8" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "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", - "resolved": "https://registry.npmmirror.com/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "license": "MIT" - }, - "node_modules/linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", - "license": "MIT", - "dependencies": { - "uc.micro": "^2.0.0" - } - }, - "node_modules/lint-staged": { - "version": "15.5.2", - "resolved": "https://registry.npmmirror.com/lint-staged/-/lint-staged-15.5.2.tgz", - "integrity": "sha512-YUSOLq9VeRNAo/CTaVmhGDKG+LBtA8KF1X4K5+ykMSwWST1vDxJRB2kv2COgLb1fvpCo+A/y9A0G0znNVmdx4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^5.4.1", - "commander": "^13.1.0", - "debug": "^4.4.0", - "execa": "^8.0.1", - "lilconfig": "^3.1.3", - "listr2": "^8.2.5", - "micromatch": "^4.0.8", - "pidtree": "^0.6.0", - "string-argv": "^0.3.2", - "yaml": "^2.7.0" - }, - "bin": { - "lint-staged": "bin/lint-staged.js" - }, - "engines": { - "node": ">=18.12.0" - }, - "funding": { - "url": "https://opencollective.com/lint-staged" - } - }, - "node_modules/lint-staged/node_modules/ansi-escapes": { - "version": "7.0.0", - "resolved": "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-7.0.0.tgz", - "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "environment": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/lint-staged/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/lint-staged/node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/lint-staged/node_modules/cli-cursor": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/cli-truncate": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/cli-truncate/-/cli-truncate-4.0.0.tgz", - "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", - "dev": true, - "license": "MIT", - "dependencies": { - "slice-ansi": "^5.0.0", - "string-width": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/commander": { - "version": "13.1.0", - "resolved": "https://registry.npmmirror.com/commander/-/commander-13.1.0.tgz", - "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/lint-staged/node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", - "dev": true, - "license": "MIT" - }, - "node_modules/lint-staged/node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmmirror.com/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/lint-staged/node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=16.17.0" - } - }, - "node_modules/lint-staged/node_modules/is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/listr2": { - "version": "8.3.3", - "resolved": "https://registry.npmmirror.com/listr2/-/listr2-8.3.3.tgz", - "integrity": "sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "cli-truncate": "^4.0.0", - "colorette": "^2.0.20", - "eventemitter3": "^5.0.1", - "log-update": "^6.1.0", - "rfdc": "^1.4.1", - "wrap-ansi": "^9.0.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/lint-staged/node_modules/log-update": { - "version": "6.1.0", - "resolved": "https://registry.npmmirror.com/log-update/-/log-update-6.1.0.tgz", - "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-escapes": "^7.0.0", - "cli-cursor": "^5.0.0", - "slice-ansi": "^7.1.0", - "strip-ansi": "^7.1.0", - "wrap-ansi": "^9.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/log-update/node_modules/is-fullwidth-code-point": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", - "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-east-asian-width": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/log-update/node_modules/slice-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-7.1.0.tgz", - "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "is-fullwidth-code-point": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/lint-staged/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/restore-cursor": { - "version": "5.1.0", - "resolved": "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-5.1.0.tgz", - "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^7.0.0", - "signal-exit": "^4.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/restore-cursor/node_modules/onetime": { - "version": "7.0.0", - "resolved": "https://registry.npmmirror.com/onetime/-/onetime-7.0.0.tgz", - "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-function": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/lint-staged/node_modules/slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/lint-staged/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/lint-staged/node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/listr2": { - "version": "3.14.0", - "resolved": "https://registry.npmmirror.com/listr2/-/listr2-3.14.0.tgz", - "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "cli-truncate": "^2.1.0", - "colorette": "^2.0.16", - "log-update": "^4.0.0", - "p-map": "^4.0.0", - "rfdc": "^1.3.0", - "rxjs": "^7.5.1", - "through": "^2.3.8", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "enquirer": ">= 2.3.0 < 3" - }, - "peerDependenciesMeta": { - "enquirer": { - "optional": true - } - } - }, - "node_modules/listr2/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "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/load-tsconfig": { - "version": "0.2.5", - "resolved": "https://registry.npmmirror.com/load-tsconfig/-/load-tsconfig-0.2.5.tgz", - "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/local-pkg": { - "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-1.1.1.tgz", - "integrity": "sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==", - "license": "MIT", - "optional": true, - "dependencies": { - "mlly": "^1.7.4", - "pkg-types": "^2.0.1", - "quansync": "^0.2.8" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "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", - "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" - }, - "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "license": "MIT" - }, - "node_modules/lodash-unified": { - "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/lodash-unified/-/lodash-unified-1.0.3.tgz", - "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==", - "license": "MIT", - "peerDependencies": { - "@types/lodash-es": "*", - "lodash": "*", - "lodash-es": "*" - } - }, - "node_modules/lodash.castarray": { - "version": "4.4.0", - "resolved": "https://registry.npmmirror.com/lodash.castarray/-/lodash.castarray-4.4.0.tgz", - "integrity": "sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==", - "license": "MIT" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmmirror.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "license": "MIT" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "license": "MIT" - }, - "node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmmirror.com/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmmirror.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", - "dev": true, - "license": "MIT" - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/log-update/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/loupe": { - "version": "2.3.7", - "resolved": "https://registry.npmmirror.com/loupe/-/loupe-2.3.7.tgz", - "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-func-name": "^2.0.1" - } - }, - "node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" - }, - "node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/markdown-it": { - "version": "14.1.0", - "resolved": "https://registry.npmmirror.com/markdown-it/-/markdown-it-14.1.0.tgz", - "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", - "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", - "resolved": "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", - "license": "MIT" - }, - "node_modules/memoize-one": { - "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz", - "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", - "license": "MIT" - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true, - "license": "MIT" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "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", - "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/mimic-function": { - "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/mimic-function/-/mimic-function-5.0.1.tgz", - "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mini-svg-data-uri": { - "version": "1.4.4", - "resolved": "https://registry.npmmirror.com/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", - "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", - "license": "MIT", - "bin": { - "mini-svg-data-uri": "cli.js" - } - }, - "node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmmirror.com/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/mlly": { - "version": "1.7.4", - "resolved": "https://registry.npmmirror.com/mlly/-/mlly-1.7.4.tgz", - "integrity": "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.14.0", - "pathe": "^2.0.1", - "pkg-types": "^1.3.0", - "ufo": "^1.5.4" - } - }, - "node_modules/mlly/node_modules/confbox": { - "version": "0.1.8", - "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.1.8.tgz", - "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/mlly/node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmmirror.com/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/mlly/node_modules/pkg-types": { - "version": "1.3.1", - "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-1.3.1.tgz", - "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "confbox": "^0.1.8", - "mlly": "^1.7.4", - "pathe": "^2.0.1" - } - }, - "node_modules/mockjs": { - "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/mockjs/-/mockjs-1.1.0.tgz", - "integrity": "sha512-eQsKcWzIaZzEZ07NuEyO4Nw65g0hdWAyurVol1IPl1gahRwY+svqzfgfey8U8dahLwG44d6/RwEzuK52rSa/JQ==", - "dev": true, - "peer": true, - "dependencies": { - "commander": "*" - }, - "bin": { - "random": "bin/random" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/muggle-string": { - "version": "0.4.1", - "resolved": "https://registry.npmmirror.com/muggle-string/-/muggle-string-0.4.1.tgz", - "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "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", - "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-fetch-native": { - "version": "1.6.6", - "resolved": "https://registry.npmmirror.com/node-fetch-native/-/node-fetch-native-1.6.6.tgz", - "integrity": "sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==", - "license": "MIT", - "optional": true - }, - "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "dev": true, - "license": "MIT" - }, - "node_modules/nopt": { - "version": "7.2.1", - "resolved": "https://registry.npmmirror.com/nopt/-/nopt-7.2.1.tgz", - "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", - "dev": true, - "license": "ISC", - "dependencies": { - "abbrev": "^2.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmmirror.com/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-wheel-es": { - "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", - "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==", - "license": "BSD-3-Clause" - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nprogress": { - "version": "0.2.0", - "resolved": "https://registry.npmmirror.com/nprogress/-/nprogress-0.2.0.tgz", - "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==", - "license": "MIT" - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/nwsapi": { - "version": "2.2.21", - "resolved": "https://registry.npmmirror.com/nwsapi/-/nwsapi-2.2.21.tgz", - "integrity": "sha512-o6nIY3qwiSXl7/LuOU0Dmuctd34Yay0yeuZRLFmDPrrdHpXKFndPj3hM+YEPVHYC5fx2otBx4Ilc/gyYSAUaIA==", - "dev": true, - "license": "MIT" - }, - "node_modules/nypm": { - "version": "0.6.0", - "resolved": "https://registry.npmmirror.com/nypm/-/nypm-0.6.0.tgz", - "integrity": "sha512-mn8wBFV9G9+UFHIrq+pZ2r2zL4aPau/by3kJb3cM7+5tQHMt6HGQB8FDIeKFYp8o0D2pnH6nVsO88N4AmUxIWg==", - "license": "MIT", - "optional": true, - "dependencies": { - "citty": "^0.1.6", - "consola": "^3.4.0", - "pathe": "^2.0.3", - "pkg-types": "^2.0.0", - "tinyexec": "^0.3.2" - }, - "bin": { - "nypm": "dist/cli.mjs" - }, - "engines": { - "node": "^14.16.0 || >=16.10.0" - } - }, - "node_modules/nypm/node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmmirror.com/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "license": "MIT", - "optional": true - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.7", - "resolved": "https://registry.npmmirror.com/object.assign/-/object.assign-4.1.7.tgz", - "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", - "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/ohash": { - "version": "2.0.11", - "resolved": "https://registry.npmmirror.com/ohash/-/ohash-2.0.11.tgz", - "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", - "license": "MIT", - "optional": true - }, - "node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", - "dev": true, - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmmirror.com/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "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/orderedmap": { - "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/orderedmap/-/orderedmap-2.1.1.tgz", - "integrity": "sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==", - "license": "MIT" - }, - "node_modules/ospath": { - "version": "1.2.2", - "resolved": "https://registry.npmmirror.com/ospath/-/ospath-1.2.2.tgz", - "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==", - "dev": true, - "license": "MIT" - }, - "node_modules/own-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/own-keys/-/own-keys-1.0.1.tgz", - "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", - "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", - "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "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", - "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "license": "BlueOak-1.0.0" - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse5": { - "version": "7.3.0", - "resolved": "https://registry.npmmirror.com/parse5/-/parse5-7.3.0.tgz", - "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "entities": "^6.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5/node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "license": "MIT" - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmmirror.com/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "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-to-regexp": { - "version": "6.3.0", - "resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-6.3.0.tgz", - "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true, - "license": "MIT" - }, - "node_modules/perfect-debounce": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/perfect-debounce/-/perfect-debounce-1.0.0.tgz", - "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", - "license": "MIT", - "optional": true - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "dev": true, - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pidtree": { - "version": "0.6.0", - "resolved": "https://registry.npmmirror.com/pidtree/-/pidtree-0.6.0.tgz", - "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", - "dev": true, - "license": "MIT", - "bin": { - "pidtree": "bin/pidtree.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmmirror.com/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinia": { - "version": "2.3.1", - "resolved": "https://registry.npmmirror.com/pinia/-/pinia-2.3.1.tgz", - "integrity": "sha512-khUlZSwt9xXCaTbbxFYBKDc/bWAGWJjOgvxETwkTN7KRm66EeT1ZdZj6i2ceh9sP2Pzqsbc704r2yngBrxBVug==", - "license": "MIT", - "dependencies": { - "@vue/devtools-api": "^6.6.3", - "vue-demi": "^0.14.10" - }, - "funding": { - "url": "https://github.com/sponsors/posva" - }, - "peerDependencies": { - "typescript": ">=4.4.4", - "vue": "^2.7.0 || ^3.5.11" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmmirror.com/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-types": { - "version": "2.2.0", - "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-2.2.0.tgz", - "integrity": "sha512-2SM/GZGAEkPp3KWORxQZns4M+WSeXbC2HEvmOIJe3Cmiv6ieAJvdVhDldtHqM5J1Y7MrR1XhkBT/rMlhh9FdqQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "confbox": "^0.2.2", - "exsolve": "^1.0.7", - "pathe": "^2.0.3" - } - }, - "node_modules/pkg-types/node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmmirror.com/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "license": "MIT", - "optional": true - }, - "node_modules/popmotion": { - "version": "11.0.5", - "resolved": "https://registry.npmmirror.com/popmotion/-/popmotion-11.0.5.tgz", - "integrity": "sha512-la8gPM1WYeFznb/JqF4GiTkRRPZsfaj2+kCxqQgr2MJylMmIKUwBfWW8Wa5fml/8gmtlD5yI01MP1QCZPWmppA==", - "license": "MIT", - "dependencies": { - "framesync": "6.1.2", - "hey-listen": "^1.0.8", - "style-value-types": "5.1.2", - "tslib": "2.4.0" - } - }, - "node_modules/popmotion/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "license": "0BSD" - }, - "node_modules/possible-typed-array-names": { - "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "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", - "resolved": "https://registry.npmmirror.com/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "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", - "resolved": "https://registry.npmmirror.com/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "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", - "resolved": "https://registry.npmmirror.com/postcss-load-config/-/postcss-load-config-4.0.2.tgz", - "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", - "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", - "resolved": "https://registry.npmmirror.com/postcss-nested/-/postcss-nested-6.2.0.tgz", - "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", - "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-nested/node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "license": "MIT" - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.6.2", - "resolved": "https://registry.npmmirror.com/prettier/-/prettier-3.6.2.tgz", - "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmmirror.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmmirror.com/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmmirror.com/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/prosemirror-changeset": { - "version": "2.3.1", - "resolved": "https://registry.npmmirror.com/prosemirror-changeset/-/prosemirror-changeset-2.3.1.tgz", - "integrity": "sha512-j0kORIBm8ayJNl3zQvD1TTPHJX3g042et6y/KQhZhnPrruO8exkTgG8X+NRpj7kIyMMEx74Xb3DyMIBtO0IKkQ==", - "license": "MIT", - "dependencies": { - "prosemirror-transform": "^1.0.0" - } - }, - "node_modules/prosemirror-collab": { - "version": "1.3.1", - "resolved": "https://registry.npmmirror.com/prosemirror-collab/-/prosemirror-collab-1.3.1.tgz", - "integrity": "sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==", - "license": "MIT", - "dependencies": { - "prosemirror-state": "^1.0.0" - } - }, - "node_modules/prosemirror-commands": { - "version": "1.7.1", - "resolved": "https://registry.npmmirror.com/prosemirror-commands/-/prosemirror-commands-1.7.1.tgz", - "integrity": "sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w==", - "license": "MIT", - "dependencies": { - "prosemirror-model": "^1.0.0", - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.10.2" - } - }, - "node_modules/prosemirror-dropcursor": { - "version": "1.8.2", - "resolved": "https://registry.npmmirror.com/prosemirror-dropcursor/-/prosemirror-dropcursor-1.8.2.tgz", - "integrity": "sha512-CCk6Gyx9+Tt2sbYk5NK0nB1ukHi2ryaRgadV/LvyNuO3ena1payM2z6Cg0vO1ebK8cxbzo41ku2DE5Axj1Zuiw==", - "license": "MIT", - "dependencies": { - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.1.0", - "prosemirror-view": "^1.1.0" - } - }, - "node_modules/prosemirror-gapcursor": { - "version": "1.3.2", - "resolved": "https://registry.npmmirror.com/prosemirror-gapcursor/-/prosemirror-gapcursor-1.3.2.tgz", - "integrity": "sha512-wtjswVBd2vaQRrnYZaBCbyDqr232Ed4p2QPtRIUK5FuqHYKGWkEwl08oQM4Tw7DOR0FsasARV5uJFvMZWxdNxQ==", - "license": "MIT", - "dependencies": { - "prosemirror-keymap": "^1.0.0", - "prosemirror-model": "^1.0.0", - "prosemirror-state": "^1.0.0", - "prosemirror-view": "^1.0.0" - } - }, - "node_modules/prosemirror-history": { - "version": "1.4.1", - "resolved": "https://registry.npmmirror.com/prosemirror-history/-/prosemirror-history-1.4.1.tgz", - "integrity": "sha512-2JZD8z2JviJrboD9cPuX/Sv/1ChFng+xh2tChQ2X4bB2HeK+rra/bmJ3xGntCcjhOqIzSDG6Id7e8RJ9QPXLEQ==", - "license": "MIT", - "dependencies": { - "prosemirror-state": "^1.2.2", - "prosemirror-transform": "^1.0.0", - "prosemirror-view": "^1.31.0", - "rope-sequence": "^1.3.0" - } - }, - "node_modules/prosemirror-inputrules": { - "version": "1.5.0", - "resolved": "https://registry.npmmirror.com/prosemirror-inputrules/-/prosemirror-inputrules-1.5.0.tgz", - "integrity": "sha512-K0xJRCmt+uSw7xesnHmcn72yBGTbY45vm8gXI4LZXbx2Z0jwh5aF9xrGQgrVPu0WbyFVFF3E/o9VhJYz6SQWnA==", - "license": "MIT", - "dependencies": { - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.0.0" - } - }, - "node_modules/prosemirror-keymap": { - "version": "1.2.3", - "resolved": "https://registry.npmmirror.com/prosemirror-keymap/-/prosemirror-keymap-1.2.3.tgz", - "integrity": "sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==", - "license": "MIT", - "dependencies": { - "prosemirror-state": "^1.0.0", - "w3c-keyname": "^2.2.0" - } - }, - "node_modules/prosemirror-markdown": { - "version": "1.13.2", - "resolved": "https://registry.npmmirror.com/prosemirror-markdown/-/prosemirror-markdown-1.13.2.tgz", - "integrity": "sha512-FPD9rHPdA9fqzNmIIDhhnYQ6WgNoSWX9StUZ8LEKapaXU9i6XgykaHKhp6XMyXlOWetmaFgGDS/nu/w9/vUc5g==", - "license": "MIT", - "dependencies": { - "@types/markdown-it": "^14.0.0", - "markdown-it": "^14.0.0", - "prosemirror-model": "^1.25.0" - } - }, - "node_modules/prosemirror-menu": { - "version": "1.2.5", - "resolved": "https://registry.npmmirror.com/prosemirror-menu/-/prosemirror-menu-1.2.5.tgz", - "integrity": "sha512-qwXzynnpBIeg1D7BAtjOusR+81xCp53j7iWu/IargiRZqRjGIlQuu1f3jFi+ehrHhWMLoyOQTSRx/IWZJqOYtQ==", - "license": "MIT", - "dependencies": { - "crelt": "^1.0.0", - "prosemirror-commands": "^1.0.0", - "prosemirror-history": "^1.0.0", - "prosemirror-state": "^1.0.0" - } - }, - "node_modules/prosemirror-model": { - "version": "1.25.2", - "resolved": "https://registry.npmmirror.com/prosemirror-model/-/prosemirror-model-1.25.2.tgz", - "integrity": "sha512-BVypCAJ4SL6jOiTsDffP3Wp6wD69lRhI4zg/iT8JXjp3ccZFiq5WyguxvMKmdKFC3prhaig7wSr8dneDToHE1Q==", - "license": "MIT", - "dependencies": { - "orderedmap": "^2.0.0" - } - }, - "node_modules/prosemirror-schema-basic": { - "version": "1.2.4", - "resolved": "https://registry.npmmirror.com/prosemirror-schema-basic/-/prosemirror-schema-basic-1.2.4.tgz", - "integrity": "sha512-ELxP4TlX3yr2v5rM7Sb70SqStq5NvI15c0j9j/gjsrO5vaw+fnnpovCLEGIcpeGfifkuqJwl4fon6b+KdrODYQ==", - "license": "MIT", - "dependencies": { - "prosemirror-model": "^1.25.0" - } - }, - "node_modules/prosemirror-schema-list": { - "version": "1.5.1", - "resolved": "https://registry.npmmirror.com/prosemirror-schema-list/-/prosemirror-schema-list-1.5.1.tgz", - "integrity": "sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==", - "license": "MIT", - "dependencies": { - "prosemirror-model": "^1.0.0", - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.7.3" - } - }, - "node_modules/prosemirror-state": { - "version": "1.4.3", - "resolved": "https://registry.npmmirror.com/prosemirror-state/-/prosemirror-state-1.4.3.tgz", - "integrity": "sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q==", - "license": "MIT", - "dependencies": { - "prosemirror-model": "^1.0.0", - "prosemirror-transform": "^1.0.0", - "prosemirror-view": "^1.27.0" - } - }, - "node_modules/prosemirror-tables": { - "version": "1.7.1", - "resolved": "https://registry.npmmirror.com/prosemirror-tables/-/prosemirror-tables-1.7.1.tgz", - "integrity": "sha512-eRQ97Bf+i9Eby99QbyAiyov43iOKgWa7QCGly+lrDt7efZ1v8NWolhXiB43hSDGIXT1UXgbs4KJN3a06FGpr1Q==", - "license": "MIT", - "dependencies": { - "prosemirror-keymap": "^1.2.2", - "prosemirror-model": "^1.25.0", - "prosemirror-state": "^1.4.3", - "prosemirror-transform": "^1.10.3", - "prosemirror-view": "^1.39.1" - } - }, - "node_modules/prosemirror-trailing-node": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/prosemirror-trailing-node/-/prosemirror-trailing-node-3.0.0.tgz", - "integrity": "sha512-xiun5/3q0w5eRnGYfNlW1uU9W6x5MoFKWwq/0TIRgt09lv7Hcser2QYV8t4muXbEr+Fwo0geYn79Xs4GKywrRQ==", - "license": "MIT", - "dependencies": { - "@remirror/core-constants": "3.0.0", - "escape-string-regexp": "^4.0.0" - }, - "peerDependencies": { - "prosemirror-model": "^1.22.1", - "prosemirror-state": "^1.4.2", - "prosemirror-view": "^1.33.8" - } - }, - "node_modules/prosemirror-transform": { - "version": "1.10.4", - "resolved": "https://registry.npmmirror.com/prosemirror-transform/-/prosemirror-transform-1.10.4.tgz", - "integrity": "sha512-pwDy22nAnGqNR1feOQKHxoFkkUtepoFAd3r2hbEDsnf4wp57kKA36hXsB3njA9FtONBEwSDnDeCiJe+ItD+ykw==", - "license": "MIT", - "dependencies": { - "prosemirror-model": "^1.21.0" - } - }, - "node_modules/prosemirror-view": { - "version": "1.40.1", - "resolved": "https://registry.npmmirror.com/prosemirror-view/-/prosemirror-view-1.40.1.tgz", - "integrity": "sha512-pbwUjt3G7TlsQQHDiYSupWBhJswpLVB09xXm1YiJPdkjkh9Pe7Y51XdLh5VWIZmROLY8UpUpG03lkdhm9lzIBA==", - "license": "MIT", - "dependencies": { - "prosemirror-model": "^1.20.0", - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.1.0" - } - }, - "node_modules/proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmmirror.com/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", - "dev": true, - "license": "ISC" - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" - }, - "node_modules/psl": { - "version": "1.15.0", - "resolved": "https://registry.npmmirror.com/psl/-/psl-1.15.0.tgz", - "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "funding": { - "url": "https://github.com/sponsors/lupomontero" - } - }, - "node_modules/pump": { - "version": "3.0.3", - "resolved": "https://registry.npmmirror.com/pump/-/pump-3.0.3.tgz", - "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/punycode.js": { - "version": "2.3.1", - "resolved": "https://registry.npmmirror.com/punycode.js/-/punycode.js-2.3.1.tgz", - "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmmirror.com/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/quansync": { - "version": "0.2.10", - "resolved": "https://registry.npmmirror.com/quansync/-/quansync-0.2.10.tgz", - "integrity": "sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==", - "devOptional": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/antfu" - }, - { - "type": "individual", - "url": "https://github.com/sponsors/sxzz" - } - ], - "license": "MIT" - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmmirror.com/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "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", - "resolved": "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/rc9": { - "version": "2.1.2", - "resolved": "https://registry.npmmirror.com/rc9/-/rc9-2.1.2.tgz", - "integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==", - "license": "MIT", - "optional": true, - "dependencies": { - "defu": "^6.1.4", - "destr": "^2.0.3" - } - }, - "node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmmirror.com/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT" - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "license": "MIT", - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.10", - "resolved": "https://registry.npmmirror.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", - "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", - "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/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmmirror.com/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true, - "license": "MIT" - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.2.0", - "resolved": "https://registry.npmmirror.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", - "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", - "dev": true, - "license": "MIT", - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.4", - "resolved": "https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", - "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", - "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", - "resolved": "https://registry.npmmirror.com/regexpu-core/-/regexpu-core-6.2.0.tgz", - "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", - "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", - "resolved": "https://registry.npmmirror.com/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/regjsparser": { - "version": "0.12.0", - "resolved": "https://registry.npmmirror.com/regjsparser/-/regjsparser-0.12.0.tgz", - "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "jsesc": "~3.0.2" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/request-progress": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/request-progress/-/request-progress-3.0.0.tgz", - "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==", - "dev": true, - "license": "MIT", - "dependencies": { - "throttleit": "^1.0.0" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/resize-detector": { - "version": "0.3.0", - "resolved": "https://registry.npmmirror.com/resize-detector/-/resize-detector-0.3.0.tgz", - "integrity": "sha512-R/tCuvuOHQ8o2boRP6vgx8hXCCy87H1eY9V5imBYeVNyNVpuL9ciReSccLj2gDcax9+2weXy3bc8Vv+NRXeEvQ==", - "license": "MIT" - }, - "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "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", - "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmmirror.com/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "dev": true, - "license": "MIT" - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "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/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/rollup": { - "version": "4.46.1", - "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.46.1.tgz", - "integrity": "sha512-33xGNBsDJAkzt0PvninskHlWnTIPgDtTwhg0U38CUoNP/7H6wI2Cz6dUeoNPbjdTdsYTGuiFFASuUOWovH0SyQ==", - "dev": true, - "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.46.1", - "@rollup/rollup-android-arm64": "4.46.1", - "@rollup/rollup-darwin-arm64": "4.46.1", - "@rollup/rollup-darwin-x64": "4.46.1", - "@rollup/rollup-freebsd-arm64": "4.46.1", - "@rollup/rollup-freebsd-x64": "4.46.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.46.1", - "@rollup/rollup-linux-arm-musleabihf": "4.46.1", - "@rollup/rollup-linux-arm64-gnu": "4.46.1", - "@rollup/rollup-linux-arm64-musl": "4.46.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.46.1", - "@rollup/rollup-linux-ppc64-gnu": "4.46.1", - "@rollup/rollup-linux-riscv64-gnu": "4.46.1", - "@rollup/rollup-linux-riscv64-musl": "4.46.1", - "@rollup/rollup-linux-s390x-gnu": "4.46.1", - "@rollup/rollup-linux-x64-gnu": "4.46.1", - "@rollup/rollup-linux-x64-musl": "4.46.1", - "@rollup/rollup-win32-arm64-msvc": "4.46.1", - "@rollup/rollup-win32-ia32-msvc": "4.46.1", - "@rollup/rollup-win32-x64-msvc": "4.46.1", - "fsevents": "~2.3.2" - } - }, - "node_modules/rollup-plugin-visualizer": { - "version": "5.14.0", - "resolved": "https://registry.npmmirror.com/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.14.0.tgz", - "integrity": "sha512-VlDXneTDaKsHIw8yzJAFWtrzguoJ/LnQ+lMpoVfYJ3jJF4Ihe5oYLAqLklIK/35lgUY+1yEzCkHyZ1j4A5w5fA==", - "dev": true, - "license": "MIT", - "dependencies": { - "open": "^8.4.0", - "picomatch": "^4.0.2", - "source-map": "^0.7.4", - "yargs": "^17.5.1" - }, - "bin": { - "rollup-plugin-visualizer": "dist/bin/cli.js" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "rolldown": "1.x", - "rollup": "2.x || 3.x || 4.x" - }, - "peerDependenciesMeta": { - "rolldown": { - "optional": true - }, - "rollup": { - "optional": true - } - } - }, - "node_modules/rollup-plugin-visualizer/node_modules/source-map": { - "version": "0.7.6", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.7.6.tgz", - "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">= 12" - } - }, - "node_modules/rope-sequence": { - "version": "1.3.4", - "resolved": "https://registry.npmmirror.com/rope-sequence/-/rope-sequence-1.3.4.tgz", - "integrity": "sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==", - "license": "MIT" - }, - "node_modules/rrweb-cssom": { - "version": "0.7.1", - "resolved": "https://registry.npmmirror.com/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz", - "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==", - "dev": true, - "license": "MIT" - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "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/rxjs": { - "version": "7.8.2", - "resolved": "https://registry.npmmirror.com/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/safe-array-concat": { - "version": "1.1.3", - "resolved": "https://registry.npmmirror.com/safe-array-concat/-/safe-array-concat-1.1.3.tgz", - "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", - "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", - "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "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", - "resolved": "https://registry.npmmirror.com/safe-push-apply/-/safe-push-apply-1.0.0.tgz", - "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", - "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", - "resolved": "https://registry.npmmirror.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", - "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/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "license": "MIT" - }, - "node_modules/saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "dev": true, - "license": "ISC", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=v12.22.7" - } - }, - "node_modules/scule": { - "version": "1.3.0", - "resolved": "https://registry.npmmirror.com/scule/-/scule-1.3.0.tgz", - "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "devOptional": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmmirror.com/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "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", - "resolved": "https://registry.npmmirror.com/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "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", - "resolved": "https://registry.npmmirror.com/set-proto/-/set-proto-1.0.0.tgz", - "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", - "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", - "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "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", - "resolved": "https://registry.npmmirror.com/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "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", - "resolved": "https://registry.npmmirror.com/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "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", - "resolved": "https://registry.npmmirror.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "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/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true, - "license": "ISC" - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/smob": { - "version": "1.5.0", - "resolved": "https://registry.npmmirror.com/smob/-/smob-1.5.0.tgz", - "integrity": "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==", - "dev": true, - "license": "MIT" - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmmirror.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "deprecated": "Please use @jridgewell/sourcemap-codec instead", - "dev": true, - "license": "MIT" - }, - "node_modules/sshpk": { - "version": "1.18.0", - "resolved": "https://registry.npmmirror.com/sshpk/-/sshpk-1.18.0.tgz", - "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmmirror.com/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true, - "license": "MIT" - }, - "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmmirror.com/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/std-env": { - "version": "3.9.0", - "resolved": "https://registry.npmmirror.com/std-env/-/std-env-3.9.0.tgz", - "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/stop-iteration-iterator": { - "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", - "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", - "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", - "resolved": "https://registry.npmmirror.com/string-argv/-/string-argv-0.3.2.tgz", - "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6.19" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "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", - "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "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", - "resolved": "https://registry.npmmirror.com/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", - "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", - "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", - "resolved": "https://registry.npmmirror.com/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", - "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", - "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", - "resolved": "https://registry.npmmirror.com/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", - "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", - "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", - "resolved": "https://registry.npmmirror.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "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-object": { - "version": "3.3.0", - "resolved": "https://registry.npmmirror.com/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "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", - "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/strip-comments/-/strip-comments-2.0.1.tgz", - "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-literal": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/strip-literal/-/strip-literal-3.0.0.tgz", - "integrity": "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==", - "license": "MIT", - "optional": true, - "dependencies": { - "js-tokens": "^9.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/style-value-types": { - "version": "5.1.2", - "resolved": "https://registry.npmmirror.com/style-value-types/-/style-value-types-5.1.2.tgz", - "integrity": "sha512-Vs9fNreYF9j6W2VvuDTP7kepALi7sk0xtk2Tu8Yxi9UoajJdEVpNpCov0HsLTqXvNGKX+Uv09pkozVITi1jf3Q==", - "license": "MIT", - "dependencies": { - "hey-listen": "^1.0.8", - "tslib": "2.4.0" - } - }, - "node_modules/style-value-types/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "license": "0BSD" - }, - "node_modules/sucrase": { - "version": "3.35.0", - "resolved": "https://registry.npmmirror.com/sucrase/-/sucrase-3.35.0.tgz", - "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", - "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", - "resolved": "https://registry.npmmirror.com/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmmirror.com/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true, - "license": "MIT" - }, - "node_modules/synckit": { - "version": "0.11.11", - "resolved": "https://registry.npmmirror.com/synckit/-/synckit-0.11.11.tgz", - "integrity": "sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@pkgr/core": "^0.2.9" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/synckit" - } - }, - "node_modules/tailwindcss": { - "version": "3.4.17", - "resolved": "https://registry.npmmirror.com/tailwindcss/-/tailwindcss-3.4.17.tgz", - "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", - "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/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "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", - "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/tailwindcss/node_modules/jiti": { - "version": "1.21.7", - "resolved": "https://registry.npmmirror.com/jiti/-/jiti-1.21.7.tgz", - "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", - "license": "MIT", - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/tailwindcss/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/tailwindcss/node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/tailwindcss/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/tempy": { - "version": "0.6.0", - "resolved": "https://registry.npmmirror.com/tempy/-/tempy-0.6.0.tgz", - "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", - "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/tempy/node_modules/type-fest": { - "version": "0.16.0", - "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.16.0.tgz", - "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/terser": { - "version": "5.43.1", - "resolved": "https://registry.npmmirror.com/terser/-/terser-5.43.1.tgz", - "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==", - "dev": 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", - "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true, - "license": "MIT" - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmmirror.com/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmmirror.com/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "license": "MIT", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/throttleit": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/throttleit/-/throttleit-1.0.1.tgz", - "integrity": "sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmmirror.com/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinybench": { - "version": "2.9.0", - "resolved": "https://registry.npmmirror.com/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyexec": { - "version": "0.3.2", - "resolved": "https://registry.npmmirror.com/tinyexec/-/tinyexec-0.3.2.tgz", - "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", - "license": "MIT", - "optional": true - }, - "node_modules/tinyglobby": { - "version": "0.2.14", - "resolved": "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.14.tgz", - "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", - "license": "MIT", - "optional": true, - "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinypool": { - "version": "0.8.4", - "resolved": "https://registry.npmmirror.com/tinypool/-/tinypool-0.8.4.tgz", - "integrity": "sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "2.2.1", - "resolved": "https://registry.npmmirror.com/tinyspy/-/tinyspy-2.2.1.tgz", - "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tippy.js": { - "version": "6.3.7", - "resolved": "https://registry.npmmirror.com/tippy.js/-/tippy.js-6.3.7.tgz", - "integrity": "sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==", - "license": "MIT", - "dependencies": { - "@popperjs/core": "^2.9.0" - } - }, - "node_modules/tldts": { - "version": "6.1.86", - "resolved": "https://registry.npmmirror.com/tldts/-/tldts-6.1.86.tgz", - "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "tldts-core": "^6.1.86" - }, - "bin": { - "tldts": "bin/cli.js" - } - }, - "node_modules/tldts-core": { - "version": "6.1.86", - "resolved": "https://registry.npmmirror.com/tldts-core/-/tldts-core-6.1.86.tgz", - "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", - "dev": true, - "license": "MIT" - }, - "node_modules/tmp": { - "version": "0.2.3", - "resolved": "https://registry.npmmirror.com/tmp/-/tmp-0.2.3.tgz", - "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.14" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tough-cookie": { - "version": "5.1.2", - "resolved": "https://registry.npmmirror.com/tough-cookie/-/tough-cookie-5.1.2.tgz", - "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tldts": "^6.1.32" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/tr46": { - "version": "5.1.1", - "resolved": "https://registry.npmmirror.com/tr46/-/tr46-5.1.1.tgz", - "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmmirror.com/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, - "license": "MIT", - "bin": { - "tree-kill": "cli.js" - } - }, - "node_modules/ts-api-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmmirror.com/ts-api-utils/-/ts-api-utils-1.4.3.tgz", - "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmmirror.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "license": "Apache-2.0" - }, - "node_modules/tslib": { - "version": "2.3.0", - "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", - "license": "0BSD" - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmmirror.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmmirror.com/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "dev": true, - "license": "Unlicense" - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/type-detect/-/type-detect-4.1.0.tgz", - "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmmirror.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", - "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", - "resolved": "https://registry.npmmirror.com/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", - "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", - "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", - "resolved": "https://registry.npmmirror.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", - "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", - "resolved": "https://registry.npmmirror.com/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", - "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/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", - "devOptional": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/uc.micro": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/uc.micro/-/uc.micro-2.1.0.tgz", - "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", - "license": "MIT" - }, - "node_modules/ufo": { - "version": "1.6.1", - "resolved": "https://registry.npmmirror.com/ufo/-/ufo-1.6.1.tgz", - "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/unbox-primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/unbox-primitive/-/unbox-primitive-1.1.0.tgz", - "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", - "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/unctx": { - "version": "2.4.1", - "resolved": "https://registry.npmmirror.com/unctx/-/unctx-2.4.1.tgz", - "integrity": "sha512-AbaYw0Nm4mK4qjhns67C+kgxR2YWiwlDBPzxrN8h8C6VtAdCgditAY5Dezu3IJy4XVqAnbrXt9oQJvsn3fyozg==", - "license": "MIT", - "optional": true, - "dependencies": { - "acorn": "^8.14.0", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.17", - "unplugin": "^2.1.0" - } - }, - "node_modules/unctx/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/unctx/node_modules/unplugin": { - "version": "2.3.5", - "resolved": "https://registry.npmmirror.com/unplugin/-/unplugin-2.3.5.tgz", - "integrity": "sha512-RyWSb5AHmGtjjNQ6gIlA67sHOsWpsbWpwDokLwTcejVdOjEkJZh7QKu14J00gDDVSh8kGH4KYC/TNBceXFZhtw==", - "license": "MIT", - "optional": true, - "dependencies": { - "acorn": "^8.14.1", - "picomatch": "^4.0.2", - "webpack-virtual-modules": "^0.6.2" - }, - "engines": { - "node": ">=18.12.0" - } - }, - "node_modules/undici-types": { - "version": "7.8.0", - "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-7.8.0.tgz", - "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", - "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "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", - "resolved": "https://registry.npmmirror.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", - "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unimport": { - "version": "5.2.0", - "resolved": "https://registry.npmmirror.com/unimport/-/unimport-5.2.0.tgz", - "integrity": "sha512-bTuAMMOOqIAyjV4i4UH7P07pO+EsVxmhOzQ2YJ290J6mkLUdozNhb5I/YoOEheeNADC03ent3Qj07X0fWfUpmw==", - "license": "MIT", - "optional": true, - "dependencies": { - "acorn": "^8.15.0", - "escape-string-regexp": "^5.0.0", - "estree-walker": "^3.0.3", - "local-pkg": "^1.1.1", - "magic-string": "^0.30.17", - "mlly": "^1.7.4", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "pkg-types": "^2.2.0", - "scule": "^1.3.0", - "strip-literal": "^3.0.0", - "tinyglobby": "^0.2.14", - "unplugin": "^2.3.5", - "unplugin-utils": "^0.2.4" - }, - "engines": { - "node": ">=18.12.0" - } - }, - "node_modules/unimport/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/unimport/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/unimport/node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmmirror.com/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "license": "MIT", - "optional": true - }, - "node_modules/unimport/node_modules/unplugin": { - "version": "2.3.5", - "resolved": "https://registry.npmmirror.com/unplugin/-/unplugin-2.3.5.tgz", - "integrity": "sha512-RyWSb5AHmGtjjNQ6gIlA67sHOsWpsbWpwDokLwTcejVdOjEkJZh7QKu14J00gDDVSh8kGH4KYC/TNBceXFZhtw==", - "license": "MIT", - "optional": true, - "dependencies": { - "acorn": "^8.14.1", - "picomatch": "^4.0.2", - "webpack-virtual-modules": "^0.6.2" - }, - "engines": { - "node": ">=18.12.0" - } - }, - "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dev": true, - "license": "MIT", - "dependencies": { - "crypto-random-string": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/unplugin": { - "version": "1.16.1", - "resolved": "https://registry.npmmirror.com/unplugin/-/unplugin-1.16.1.tgz", - "integrity": "sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.14.0", - "webpack-virtual-modules": "^0.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/unplugin-auto-import": { - "version": "0.17.8", - "resolved": "https://registry.npmmirror.com/unplugin-auto-import/-/unplugin-auto-import-0.17.8.tgz", - "integrity": "sha512-CHryj6HzJ+n4ASjzwHruD8arhbdl+UXvhuAIlHDs15Y/IMecG3wrf7FVg4pVH/DIysbq/n0phIjNHAjl7TG7Iw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@antfu/utils": "^0.7.10", - "@rollup/pluginutils": "^5.1.0", - "fast-glob": "^3.3.2", - "local-pkg": "^0.5.0", - "magic-string": "^0.30.10", - "minimatch": "^9.0.4", - "unimport": "^3.7.2", - "unplugin": "^1.11.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@nuxt/kit": "^3.2.2", - "@vueuse/core": "*" - }, - "peerDependenciesMeta": { - "@nuxt/kit": { - "optional": true - }, - "@vueuse/core": { - "optional": true - } - } - }, - "node_modules/unplugin-auto-import/node_modules/confbox": { - "version": "0.1.8", - "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.1.8.tgz", - "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/unplugin-auto-import/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/unplugin-auto-import/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/unplugin-auto-import/node_modules/local-pkg": { - "version": "0.5.1", - "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-0.5.1.tgz", - "integrity": "sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mlly": "^1.7.3", - "pkg-types": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/unplugin-auto-import/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/unplugin-auto-import/node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmmirror.com/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, - "license": "MIT" - }, - "node_modules/unplugin-auto-import/node_modules/pkg-types": { - "version": "1.3.1", - "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-1.3.1.tgz", - "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "confbox": "^0.1.8", - "mlly": "^1.7.4", - "pathe": "^2.0.1" - } - }, - "node_modules/unplugin-auto-import/node_modules/strip-literal": { - "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/strip-literal/-/strip-literal-2.1.1.tgz", - "integrity": "sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "js-tokens": "^9.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/unplugin-auto-import/node_modules/unimport": { - "version": "3.14.6", - "resolved": "https://registry.npmmirror.com/unimport/-/unimport-3.14.6.tgz", - "integrity": "sha512-CYvbDaTT04Rh8bmD8jz3WPmHYZRG/NnvYVzwD6V1YAlvvKROlAeNDUBhkBGzNav2RKaeuXvlWYaa1V4Lfi/O0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^5.1.4", - "acorn": "^8.14.0", - "escape-string-regexp": "^5.0.0", - "estree-walker": "^3.0.3", - "fast-glob": "^3.3.3", - "local-pkg": "^1.0.0", - "magic-string": "^0.30.17", - "mlly": "^1.7.4", - "pathe": "^2.0.1", - "picomatch": "^4.0.2", - "pkg-types": "^1.3.0", - "scule": "^1.3.0", - "strip-literal": "^2.1.1", - "unplugin": "^1.16.1" - } - }, - "node_modules/unplugin-auto-import/node_modules/unimport/node_modules/confbox": { - "version": "0.2.2", - "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.2.2.tgz", - "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/unplugin-auto-import/node_modules/unimport/node_modules/local-pkg": { - "version": "1.1.1", - "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-1.1.1.tgz", - "integrity": "sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "mlly": "^1.7.4", - "pkg-types": "^2.0.1", - "quansync": "^0.2.8" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/unplugin-auto-import/node_modules/unimport/node_modules/local-pkg/node_modules/pkg-types": { - "version": "2.2.0", - "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-2.2.0.tgz", - "integrity": "sha512-2SM/GZGAEkPp3KWORxQZns4M+WSeXbC2HEvmOIJe3Cmiv6ieAJvdVhDldtHqM5J1Y7MrR1XhkBT/rMlhh9FdqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "confbox": "^0.2.2", - "exsolve": "^1.0.7", - "pathe": "^2.0.3" - } - }, - "node_modules/unplugin-utils": { - "version": "0.2.4", - "resolved": "https://registry.npmmirror.com/unplugin-utils/-/unplugin-utils-0.2.4.tgz", - "integrity": "sha512-8U/MtpkPkkk3Atewj1+RcKIjb5WBimZ/WSLhhR3w6SsIj8XJuKTacSP8g+2JhfSGw0Cb125Y+2zA/IzJZDVbhA==", - "license": "MIT", - "optional": true, - "dependencies": { - "pathe": "^2.0.2", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=18.12.0" - }, - "funding": { - "url": "https://github.com/sponsors/sxzz" - } - }, - "node_modules/unplugin-utils/node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmmirror.com/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "license": "MIT", - "optional": true - }, - "node_modules/unplugin-vue-components": { - "version": "0.26.0", - "resolved": "https://registry.npmmirror.com/unplugin-vue-components/-/unplugin-vue-components-0.26.0.tgz", - "integrity": "sha512-s7IdPDlnOvPamjunVxw8kNgKNK8A5KM1YpK5j/p97jEKTjlPNrA0nZBiSfAKKlK1gWZuyWXlKL5dk3EDw874LQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@antfu/utils": "^0.7.6", - "@rollup/pluginutils": "^5.0.4", - "chokidar": "^3.5.3", - "debug": "^4.3.4", - "fast-glob": "^3.3.1", - "local-pkg": "^0.4.3", - "magic-string": "^0.30.3", - "minimatch": "^9.0.3", - "resolve": "^1.22.4", - "unplugin": "^1.4.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@babel/parser": "^7.15.8", - "@nuxt/kit": "^3.2.2", - "vue": "2 || 3" - }, - "peerDependenciesMeta": { - "@babel/parser": { - "optional": true - }, - "@nuxt/kit": { - "optional": true - } - } - }, - "node_modules/unplugin-vue-components/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "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/unplugin-vue-components/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/unplugin-vue-components/node_modules/local-pkg": { - "version": "0.4.3", - "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-0.4.3.tgz", - "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/unplugin-vue-components/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/unplugin-vue-components/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/untyped": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/untyped/-/untyped-2.0.0.tgz", - "integrity": "sha512-nwNCjxJTjNuLCgFr42fEak5OcLuB3ecca+9ksPFNvtfYSLpjf+iJqSIaSnIile6ZPbKYxI5k2AfXqeopGudK/g==", - "license": "MIT", - "optional": true, - "dependencies": { - "citty": "^0.1.6", - "defu": "^6.1.4", - "jiti": "^2.4.2", - "knitwork": "^1.2.0", - "scule": "^1.3.0" - }, - "bin": { - "untyped": "dist/cli.mjs" - } - }, - "node_modules/upath": { - "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4", - "yarn": "*" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", - "dev": true, - "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", - "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmmirror.com/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmmirror.com/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/vite": { - "version": "5.4.19", - "resolved": "https://registry.npmmirror.com/vite/-/vite-5.4.19.tgz", - "integrity": "sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.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", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vite-node": { - "version": "1.6.1", - "resolved": "https://registry.npmmirror.com/vite-node/-/vite-node-1.6.1.tgz", - "integrity": "sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.3.4", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "vite": "^5.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vite-plugin-compression": { - "version": "0.5.1", - "resolved": "https://registry.npmmirror.com/vite-plugin-compression/-/vite-plugin-compression-0.5.1.tgz", - "integrity": "sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.2", - "debug": "^4.3.3", - "fs-extra": "^10.0.0" - }, - "peerDependencies": { - "vite": ">=2.0.0" - } - }, - "node_modules/vite-plugin-compression/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/vite-plugin-mock": { - "version": "3.0.2", - "resolved": "https://registry.npmmirror.com/vite-plugin-mock/-/vite-plugin-mock-3.0.2.tgz", - "integrity": "sha512-bD//HvkTygGmk+LsIAdf0jGNlCv4iWv0kZlH9UEgWT6QYoUwfjQAE4SKxHRw2tfLgVhbPQVv/+X3YlNWvueGUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "bundle-require": "^4.0.1", - "chokidar": "^3.5.3", - "connect": "^3.7.0", - "debug": "^4.3.4", - "fast-glob": "^3.2.12", - "path-to-regexp": "^6.2.1", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "esbuild": ">=0.17", - "mockjs": ">=1.1.0", - "vite": ">=4.0.0" - } - }, - "node_modules/vite-plugin-mock/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "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/vite-plugin-mock/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/vite-plugin-mock/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/vite-plugin-mock/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/vite-plugin-pwa": { - "version": "0.19.8", - "resolved": "https://registry.npmmirror.com/vite-plugin-pwa/-/vite-plugin-pwa-0.19.8.tgz", - "integrity": "sha512-e1oK0dfhzhDhY3VBuML6c0h8Xfx6EkOVYqolj7g+u8eRfdauZe5RLteCIA/c5gH0CBQ0CNFAuv/AFTx4Z7IXTw==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "pretty-bytes": "^6.1.1", - "workbox-build": "^7.0.0", - "workbox-window": "^7.0.0" - }, - "engines": { - "node": ">=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@vite-pwa/assets-generator": "^0.2.4", - "vite": "^3.1.0 || ^4.0.0 || ^5.0.0", - "workbox-build": "^7.0.0", - "workbox-window": "^7.0.0" - }, - "peerDependenciesMeta": { - "@vite-pwa/assets-generator": { - "optional": true - } - } - }, - "node_modules/vite-plugin-pwa/node_modules/pretty-bytes": { - "version": "6.1.1", - "resolved": "https://registry.npmmirror.com/pretty-bytes/-/pretty-bytes-6.1.1.tgz", - "integrity": "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vite/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, - "node_modules/vitest": { - "version": "1.6.1", - "resolved": "https://registry.npmmirror.com/vitest/-/vitest-1.6.1.tgz", - "integrity": "sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "1.6.1", - "@vitest/runner": "1.6.1", - "@vitest/snapshot": "1.6.1", - "@vitest/spy": "1.6.1", - "@vitest/utils": "1.6.1", - "acorn-walk": "^8.3.2", - "chai": "^4.3.10", - "debug": "^4.3.4", - "execa": "^8.0.1", - "local-pkg": "^0.5.0", - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "std-env": "^3.5.0", - "strip-literal": "^2.0.0", - "tinybench": "^2.5.1", - "tinypool": "^0.8.3", - "vite": "^5.0.0", - "vite-node": "1.6.1", - "why-is-node-running": "^2.2.2" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "1.6.1", - "@vitest/ui": "1.6.1", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "node_modules/vitest/node_modules/confbox": { - "version": "0.1.8", - "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.1.8.tgz", - "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/vitest/node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmmirror.com/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/vitest/node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=16.17.0" - } - }, - "node_modules/vitest/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/node_modules/local-pkg": { - "version": "0.5.1", - "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-0.5.1.tgz", - "integrity": "sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mlly": "^1.7.3", - "pkg-types": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/vitest/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/node_modules/pkg-types": { - "version": "1.3.1", - "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-1.3.1.tgz", - "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "confbox": "^0.1.8", - "mlly": "^1.7.4", - "pathe": "^2.0.1" - } - }, - "node_modules/vitest/node_modules/pkg-types/node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmmirror.com/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, - "license": "MIT" - }, - "node_modules/vitest/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/vitest/node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/node_modules/strip-literal": { - "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/strip-literal/-/strip-literal-2.1.1.tgz", - "integrity": "sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "js-tokens": "^9.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/vscode-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/vscode-uri/-/vscode-uri-3.1.0.tgz", - "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/vue": { - "version": "3.5.18", - "resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.18.tgz", - "integrity": "sha512-7W4Y4ZbMiQ3SEo+m9lnoNpV9xG7QVMLa+/0RFwwiAVkeYoyGXqWE85jabU4pllJNUzqfLShJ5YLptewhCWUgNA==", - "license": "MIT", - "dependencies": { - "@vue/compiler-dom": "3.5.18", - "@vue/compiler-sfc": "3.5.18", - "@vue/runtime-dom": "3.5.18", - "@vue/server-renderer": "3.5.18", - "@vue/shared": "3.5.18" - }, - "peerDependencies": { - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/vue-component-type-helpers": { - "version": "2.2.12", - "resolved": "https://registry.npmmirror.com/vue-component-type-helpers/-/vue-component-type-helpers-2.2.12.tgz", - "integrity": "sha512-YbGqHZ5/eW4SnkPNR44mKVc6ZKQoRs/Rux1sxC6rdwXb4qpbOSYfDr9DsTHolOTGmIKgM9j141mZbBeg05R1pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/vue-demi": { - "version": "0.14.10", - "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz", - "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", - "hasInstallScript": true, - "license": "MIT", - "bin": { - "vue-demi-fix": "bin/vue-demi-fix.js", - "vue-demi-switch": "bin/vue-demi-switch.js" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@vue/composition-api": "^1.0.0-rc.1", - "vue": "^3.0.0-0 || ^2.6.0" - }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - } - } - }, - "node_modules/vue-echarts": { - "version": "6.7.3", - "resolved": "https://registry.npmmirror.com/vue-echarts/-/vue-echarts-6.7.3.tgz", - "integrity": "sha512-vXLKpALFjbPphW9IfQPOVfb1KjGZ/f8qa/FZHi9lZIWzAnQC1DgnmEK3pJgEkyo6EP7UnX6Bv/V3Ke7p+qCNXA==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "resize-detector": "^0.3.0", - "vue-demi": "^0.13.11" - }, - "peerDependencies": { - "@vue/composition-api": "^1.0.5", - "@vue/runtime-core": "^3.0.0", - "echarts": "^5.4.1", - "vue": "^2.6.12 || ^3.1.1" - }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - }, - "@vue/runtime-core": { - "optional": true - } - } - }, - "node_modules/vue-echarts/node_modules/vue-demi": { - "version": "0.13.11", - "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.13.11.tgz", - "integrity": "sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==", - "hasInstallScript": true, - "license": "MIT", - "bin": { - "vue-demi-fix": "bin/vue-demi-fix.js", - "vue-demi-switch": "bin/vue-demi-switch.js" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@vue/composition-api": "^1.0.0-rc.1", - "vue": "^3.0.0-0 || ^2.6.0" - }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - } - } - }, - "node_modules/vue-eslint-parser": { - "version": "9.4.3", - "resolved": "https://registry.npmmirror.com/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz", - "integrity": "sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.4", - "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.1", - "esquery": "^1.4.0", - "lodash": "^4.17.21", - "semver": "^7.3.6" - }, - "engines": { - "node": "^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=6.0.0" - } - }, - "node_modules/vue-i18n": { - "version": "9.14.5", - "resolved": "https://registry.npmmirror.com/vue-i18n/-/vue-i18n-9.14.5.tgz", - "integrity": "sha512-0jQ9Em3ymWngyiIkj0+c/k7WgaPO+TNzjKSNq9BvBQaKJECqn9cd9fL4tkDhB5G1QBskGl9YxxbDAhgbFtpe2g==", - "license": "MIT", - "dependencies": { - "@intlify/core-base": "9.14.5", - "@intlify/shared": "9.14.5", - "@vue/devtools-api": "^6.5.0" - }, - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://github.com/sponsors/kazupon" - }, - "peerDependencies": { - "vue": "^3.0.0" - } - }, - "node_modules/vue-router": { - "version": "4.5.1", - "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.5.1.tgz", - "integrity": "sha512-ogAF3P97NPm8fJsE4by9dwSYtDwXIY1nFY9T6DyQnGHd1E2Da94w9JIolpe42LJGIl0DwOHBi8TcRPlPGwbTtw==", - "license": "MIT", - "dependencies": { - "@vue/devtools-api": "^6.6.4" - }, - "funding": { - "url": "https://github.com/sponsors/posva" - }, - "peerDependencies": { - "vue": "^3.2.0" - } - }, - "node_modules/vue-toastification": { - "version": "2.0.0-rc.5", - "resolved": "https://registry.npmmirror.com/vue-toastification/-/vue-toastification-2.0.0-rc.5.tgz", - "integrity": "sha512-q73e5jy6gucEO/U+P48hqX+/qyXDozAGmaGgLFm5tXX4wJBcVsnGp4e/iJqlm9xzHETYOilUuwOUje2Qg1JdwA==", - "license": "MIT", - "peerDependencies": { - "vue": "^3.0.2" - } - }, - "node_modules/vue-tsc": { - "version": "2.2.12", - "resolved": "https://registry.npmmirror.com/vue-tsc/-/vue-tsc-2.2.12.tgz", - "integrity": "sha512-P7OP77b2h/Pmk+lZdJ0YWs+5tJ6J2+uOQPo7tlBnY44QqQSPYvS0qVT4wqDJgwrZaLe47etJLLQRFia71GYITw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@volar/typescript": "2.4.15", - "@vue/language-core": "2.2.12" - }, - "bin": { - "vue-tsc": "bin/vue-tsc.js" - }, - "peerDependencies": { - "typescript": ">=5.0.0" - } - }, - "node_modules/vue-upload-component": { - "version": "3.1.17", - "resolved": "https://registry.npmmirror.com/vue-upload-component/-/vue-upload-component-3.1.17.tgz", - "integrity": "sha512-1orTC5apoFzBz4ku2HAydpviaAOck+ABc83rGypIK/Bgl+TqhtoWsQOhXqbb7vDv7pKlvRVWwml9PM224HyhkA==", - "license": "Apache-2.0" - }, - "node_modules/w3c-keyname": { - "version": "2.2.8", - "resolved": "https://registry.npmmirror.com/w3c-keyname/-/w3c-keyname-2.2.8.tgz", - "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", - "license": "MIT" - }, - "node_modules/w3c-xmlserializer": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", - "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/w3c-xmlserializer/node_modules/xml-name-validator": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/xml-name-validator/-/xml-name-validator-5.0.0.tgz", - "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/webpack-virtual-modules": { - "version": "0.6.2", - "resolved": "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", - "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/whatwg-encoding": { - "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", - "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/whatwg-mimetype": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", - "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/whatwg-url": { - "version": "14.2.0", - "resolved": "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-14.2.0.tgz", - "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tr46": "^5.1.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "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", - "resolved": "https://registry.npmmirror.com/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", - "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", - "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", - "resolved": "https://registry.npmmirror.com/which-builtin-type/-/which-builtin-type-1.2.1.tgz", - "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", - "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", - "resolved": "https://registry.npmmirror.com/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "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", - "resolved": "https://registry.npmmirror.com/which-typed-array/-/which-typed-array-1.1.19.tgz", - "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", - "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/why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmmirror.com/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/workbox-background-sync": { - "version": "7.3.0", - "resolved": "https://registry.npmmirror.com/workbox-background-sync/-/workbox-background-sync-7.3.0.tgz", - "integrity": "sha512-PCSk3eK7Mxeuyatb22pcSx9dlgWNv3+M8PqPaYDokks8Y5/FX4soaOqj3yhAZr5k6Q5JWTOMYgaJBpbw11G9Eg==", - "dev": true, - "license": "MIT", - "dependencies": { - "idb": "^7.0.1", - "workbox-core": "7.3.0" - } - }, - "node_modules/workbox-broadcast-update": { - "version": "7.3.0", - "resolved": "https://registry.npmmirror.com/workbox-broadcast-update/-/workbox-broadcast-update-7.3.0.tgz", - "integrity": "sha512-T9/F5VEdJVhwmrIAE+E/kq5at2OY6+OXXgOWQevnubal6sO92Gjo24v6dCVwQiclAF5NS3hlmsifRrpQzZCdUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "workbox-core": "7.3.0" - } - }, - "node_modules/workbox-build": { - "version": "7.3.0", - "resolved": "https://registry.npmmirror.com/workbox-build/-/workbox-build-7.3.0.tgz", - "integrity": "sha512-JGL6vZTPlxnlqZRhR/K/msqg3wKP+m0wfEUVosK7gsYzSgeIxvZLi1ViJJzVL7CEeI8r7rGFV973RiEqkP3lWQ==", - "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/@apideck/better-ajv-errors": { - "version": "0.3.6", - "resolved": "https://registry.npmmirror.com/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", - "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", - "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/workbox-build/node_modules/@rollup/plugin-babel": { - "version": "5.3.1", - "resolved": "https://registry.npmmirror.com/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", - "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", - "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/workbox-build/node_modules/@rollup/plugin-replace": { - "version": "2.4.2", - "resolved": "https://registry.npmmirror.com/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", - "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", - "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/workbox-build/node_modules/@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", - "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/workbox-build/node_modules/@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", - "dev": true, - "license": "MIT" - }, - "node_modules/workbox-build/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "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/workbox-build/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/workbox-build/node_modules/estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", - "dev": true, - "license": "MIT" - }, - "node_modules/workbox-build/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "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/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT" - }, - "node_modules/workbox-build/node_modules/magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "sourcemap-codec": "^1.4.8" - } - }, - "node_modules/workbox-build/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/workbox-build/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/workbox-build/node_modules/rollup": { - "version": "2.79.2", - "resolved": "https://registry.npmmirror.com/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/workbox-build/node_modules/source-map": { - "version": "0.8.0-beta.0", - "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.8.0-beta.0.tgz", - "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "whatwg-url": "^7.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/workbox-build/node_modules/tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/workbox-build/node_modules/webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/workbox-build/node_modules/whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, - "node_modules/workbox-cacheable-response": { - "version": "7.3.0", - "resolved": "https://registry.npmmirror.com/workbox-cacheable-response/-/workbox-cacheable-response-7.3.0.tgz", - "integrity": "sha512-eAFERIg6J2LuyELhLlmeRcJFa5e16Mj8kL2yCDbhWE+HUun9skRQrGIFVUagqWj4DMaaPSMWfAolM7XZZxNmxA==", - "dev": true, - "license": "MIT", - "dependencies": { - "workbox-core": "7.3.0" - } - }, - "node_modules/workbox-core": { - "version": "7.3.0", - "resolved": "https://registry.npmmirror.com/workbox-core/-/workbox-core-7.3.0.tgz", - "integrity": "sha512-Z+mYrErfh4t3zi7NVTvOuACB0A/jA3bgxUN3PwtAVHvfEsZxV9Iju580VEETug3zYJRc0Dmii/aixI/Uxj8fmw==", - "dev": true, - "license": "MIT" - }, - "node_modules/workbox-expiration": { - "version": "7.3.0", - "resolved": "https://registry.npmmirror.com/workbox-expiration/-/workbox-expiration-7.3.0.tgz", - "integrity": "sha512-lpnSSLp2BM+K6bgFCWc5bS1LR5pAwDWbcKt1iL87/eTSJRdLdAwGQznZE+1czLgn/X05YChsrEegTNxjM067vQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "idb": "^7.0.1", - "workbox-core": "7.3.0" - } - }, - "node_modules/workbox-google-analytics": { - "version": "7.3.0", - "resolved": "https://registry.npmmirror.com/workbox-google-analytics/-/workbox-google-analytics-7.3.0.tgz", - "integrity": "sha512-ii/tSfFdhjLHZ2BrYgFNTrb/yk04pw2hasgbM70jpZfLk0vdJAXgaiMAWsoE+wfJDNWoZmBYY0hMVI0v5wWDbg==", - "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", - "resolved": "https://registry.npmmirror.com/workbox-navigation-preload/-/workbox-navigation-preload-7.3.0.tgz", - "integrity": "sha512-fTJzogmFaTv4bShZ6aA7Bfj4Cewaq5rp30qcxl2iYM45YD79rKIhvzNHiFj1P+u5ZZldroqhASXwwoyusnr2cg==", - "dev": true, - "license": "MIT", - "dependencies": { - "workbox-core": "7.3.0" - } - }, - "node_modules/workbox-precaching": { - "version": "7.3.0", - "resolved": "https://registry.npmmirror.com/workbox-precaching/-/workbox-precaching-7.3.0.tgz", - "integrity": "sha512-ckp/3t0msgXclVAYaNndAGeAoWQUv7Rwc4fdhWL69CCAb2UHo3Cef0KIUctqfQj1p8h6aGyz3w8Cy3Ihq9OmIw==", - "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", - "resolved": "https://registry.npmmirror.com/workbox-range-requests/-/workbox-range-requests-7.3.0.tgz", - "integrity": "sha512-EyFmM1KpDzzAouNF3+EWa15yDEenwxoeXu9bgxOEYnFfCxns7eAxA9WSSaVd8kujFFt3eIbShNqa4hLQNFvmVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "workbox-core": "7.3.0" - } - }, - "node_modules/workbox-recipes": { - "version": "7.3.0", - "resolved": "https://registry.npmmirror.com/workbox-recipes/-/workbox-recipes-7.3.0.tgz", - "integrity": "sha512-BJro/MpuW35I/zjZQBcoxsctgeB+kyb2JAP5EB3EYzePg8wDGoQuUdyYQS+CheTb+GhqJeWmVs3QxLI8EBP1sg==", - "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", - "resolved": "https://registry.npmmirror.com/workbox-routing/-/workbox-routing-7.3.0.tgz", - "integrity": "sha512-ZUlysUVn5ZUzMOmQN3bqu+gK98vNfgX/gSTZ127izJg/pMMy4LryAthnYtjuqcjkN4HEAx1mdgxNiKJMZQM76A==", - "dev": true, - "license": "MIT", - "dependencies": { - "workbox-core": "7.3.0" - } - }, - "node_modules/workbox-strategies": { - "version": "7.3.0", - "resolved": "https://registry.npmmirror.com/workbox-strategies/-/workbox-strategies-7.3.0.tgz", - "integrity": "sha512-tmZydug+qzDFATwX7QiEL5Hdf7FrkhjaF9db1CbB39sDmEZJg3l9ayDvPxy8Y18C3Y66Nrr9kkN1f/RlkDgllg==", - "dev": true, - "license": "MIT", - "dependencies": { - "workbox-core": "7.3.0" - } - }, - "node_modules/workbox-streams": { - "version": "7.3.0", - "resolved": "https://registry.npmmirror.com/workbox-streams/-/workbox-streams-7.3.0.tgz", - "integrity": "sha512-SZnXucyg8x2Y61VGtDjKPO5EgPUG5NDn/v86WYHX+9ZqvAsGOytP0Jxp1bl663YUuMoXSAtsGLL+byHzEuMRpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "workbox-core": "7.3.0", - "workbox-routing": "7.3.0" - } - }, - "node_modules/workbox-sw": { - "version": "7.3.0", - "resolved": "https://registry.npmmirror.com/workbox-sw/-/workbox-sw-7.3.0.tgz", - "integrity": "sha512-aCUyoAZU9IZtH05mn0ACUpyHzPs0lMeJimAYkQkBsOWiqaJLgusfDCR+yllkPkFRxWpZKF8vSvgHYeG7LwhlmA==", - "dev": true, - "license": "MIT" - }, - "node_modules/workbox-window": { - "version": "7.3.0", - "resolved": "https://registry.npmmirror.com/workbox-window/-/workbox-window-7.3.0.tgz", - "integrity": "sha512-qW8PDy16OV1UBaUNGlTVcepzrlzyzNW/ZJvFQQs2j2TzGsg6IKjcpZC1RSquqQnTOafl5pCj5bGfAHlCjOOjdA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/trusted-types": "^2.0.2", - "workbox-core": "7.3.0" - } - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "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", - "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "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-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" - }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmmirror.com/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "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/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmmirror.com/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xml-name-validator": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmmirror.com/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true, - "license": "MIT" - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/yaml": { - "version": "2.8.0", - "resolved": "https://registry.npmmirror.com/yaml/-/yaml-2.8.0.tgz", - "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==", - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" - } - }, - "node_modules/yaml-eslint-parser": { - "version": "1.3.0", - "resolved": "https://registry.npmmirror.com/yaml-eslint-parser/-/yaml-eslint-parser-1.3.0.tgz", - "integrity": "sha512-E/+VitOorXSLiAqtTd7Yqax0/pAS3xaYMP+AUUJGOK1OZG3rhcj9fcJOM5HJ2VrP1FrStVCWr1muTfQCdj4tAA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.0.0", - "yaml": "^2.0.0" - }, - "engines": { - "node": "^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ota-meshi" - } - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmmirror.com/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "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", - "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmmirror.com/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmmirror.com/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/zrender": { - "version": "5.6.1", - "resolved": "https://registry.npmmirror.com/zrender/-/zrender-5.6.1.tgz", - "integrity": "sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==", - "license": "BSD-3-Clause", - "dependencies": { - "tslib": "2.3.0" - } - } - } -} diff --git a/web-new/package.json b/web-new/package.json deleted file mode 100644 index 0eed011..0000000 --- a/web-new/package.json +++ /dev/null @@ -1,102 +0,0 @@ -{ - "name": "emotion-museum-web", - "version": "1.0.0", - "description": "情绪博物馆Web端 - Vue3+TypeScript重构版本", - "type": "module", - "scripts": { - "dev": "vite", - "build": "vue-tsc && vite build", - "build:check": "vue-tsc && vite build", - "preview": "vite preview", - "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore", - "lint:check": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --ignore-path .gitignore", - "type-check": "vue-tsc --noEmit", - "test": "vitest", - "test:ui": "vitest --ui", - "test:coverage": "vitest --coverage", - "test:unit": "vitest run", - "test:unit:watch": "vitest", - "test:e2e": "cypress run", - "test:e2e:open": "cypress open", - "test:e2e:ci": "start-server-and-test dev http://localhost:5173 'cypress run'", - "test:all": "npm run test:unit && npm run test:e2e", - "build:analyze": "vite build --mode analyze", - "build:staging": "vite build --mode staging", - "build:production": "vite build --mode production", - "prepare": "husky install" - }, - "dependencies": { - "vue": "^3.4.21", - "vue-router": "^4.3.0", - "pinia": "^2.1.7", - "axios": "^1.6.8", - "@stomp/stompjs": "^7.1.1", - "element-plus": "^2.6.1", - "@element-plus/icons-vue": "^2.3.1", - "tailwindcss": "^3.4.1", - "@tailwindcss/forms": "^0.5.7", - "@tailwindcss/typography": "^0.5.10", - "echarts": "^5.5.0", - "vue-echarts": "^6.7.3", - "@vueuse/core": "^10.9.0", - "dayjs": "^1.11.10", - "lodash-es": "^4.17.21", - "zod": "^3.22.4", - "@vuelidate/core": "^2.0.3", - "@vuelidate/validators": "^2.0.4", - "@vueuse/motion": "^2.0.0", - "vue-toastification": "^2.0.0-rc.5", - "nprogress": "^0.2.0", - "vue-upload-component": "^3.1.4", - "cropperjs": "^1.6.1", - "file-saver": "^2.0.5", - "@tiptap/vue-3": "^2.2.4", - "@tiptap/starter-kit": "^2.2.4", - "@tiptap/extension-image": "^2.2.4", - "vue-i18n": "^9.10.2" - }, - "devDependencies": { - "@vitejs/plugin-vue": "^5.0.4", - "@vue/tsconfig": "^0.5.1", - "vue-tsc": "^2.0.6", - "vite": "^5.1.6", - "typescript": "^5.4.2", - "unplugin-auto-import": "^0.17.5", - "unplugin-vue-components": "^0.26.0", - "vite-plugin-pwa": "^0.19.2", - "workbox-window": "^7.0.0", - "eslint": "^8.57.0", - "@vue/eslint-config-typescript": "^12.0.0", - "@vue/eslint-config-prettier": "^9.0.0", - "prettier": "^3.2.5", - "lint-staged": "^15.2.2", - "husky": "^9.0.11", - "vitest": "^1.4.0", - "@vue/test-utils": "^2.4.5", - "jsdom": "^24.0.0", - "cypress": "^13.7.1", - "rollup-plugin-visualizer": "^5.12.0", - "vite-plugin-compression": "^0.5.1", - "vite-plugin-mock": "^3.0.1", - "@intlify/unplugin-vue-i18n": "^4.0.0", - "autoprefixer": "^10.4.18", - "postcss": "^8.4.35", - "@types/lodash-es": "^4.17.12", - "@types/nprogress": "^0.2.3", - "@types/file-saver": "^2.0.7", - "@types/cropperjs": "^1.3.5", - "tailwindcss": "^3.4.1", - "@types/node": "^20.11.25", - "start-server-and-test": "^2.0.3" - }, - "lint-staged": { - "*.{vue,js,ts}": [ - "eslint --fix", - "prettier --write" - ] - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=9.0.0" - } -} diff --git a/web-new/postcss.config.js b/web-new/postcss.config.js deleted file mode 100644 index 2b75bd8..0000000 --- a/web-new/postcss.config.js +++ /dev/null @@ -1,6 +0,0 @@ -export default { - plugins: { - tailwindcss: {}, - autoprefixer: {} - } -} diff --git a/web-new/src/App.vue b/web-new/src/App.vue deleted file mode 100644 index bc73269..0000000 --- a/web-new/src/App.vue +++ /dev/null @@ -1,118 +0,0 @@ - - - - - diff --git a/web-new/src/api/auth.ts b/web-new/src/api/auth.ts deleted file mode 100644 index f60f796..0000000 --- a/web-new/src/api/auth.ts +++ /dev/null @@ -1,85 +0,0 @@ -/** - * 认证相关API接口 - */ - -import request from '@/utils/request' -import { API_PATHS } from '@/config/constants' -import type { - LoginRequest, - LoginResponse, - RegisterRequest, - RegisterResponse, - RefreshTokenRequest, - RefreshTokenResponse, - CaptchaResponse, - OAuthLoginRequest, - UserInfo -} from '@/types/api' - -export const authApi = { - /** - * 用户登录 - */ - login(data: LoginRequest): Promise { - return request.post(API_PATHS.AUTH.LOGIN, data, { - skipAuth: true, - showLoading: true, - loadingText: '正在登录...' - }) - }, - - /** - * 用户注册 - */ - register(data: RegisterRequest): Promise { - return request.post(API_PATHS.AUTH.REGISTER, data, { - skipAuth: true, - showLoading: true, - loadingText: '正在注册...' - }) - }, - - /** - * 用户登出 - */ - logout(): Promise { - return request.post(API_PATHS.AUTH.LOGOUT) - }, - - /** - * 刷新Token - */ - refreshToken(data: RefreshTokenRequest): Promise { - return request.post(API_PATHS.AUTH.REFRESH_TOKEN, data, { - skipAuth: true, - skipErrorHandler: true - }) - }, - - /** - * 获取验证码 - */ - getCaptcha(): Promise { - return request.get(API_PATHS.AUTH.CAPTCHA, undefined, { - skipAuth: true - }) - }, - - /** - * 第三方登录 - */ - oauthLogin(data: OAuthLoginRequest): Promise { - return request.post(API_PATHS.AUTH.OAUTH_LOGIN, data, { - skipAuth: true, - showLoading: true, - loadingText: '正在登录...' - }) - }, - - /** - * 获取用户信息 - */ - getUserInfo(): Promise { - return request.get(API_PATHS.AUTH.USER_INFO) - } -} diff --git a/web-new/src/api/conversation.ts b/web-new/src/api/conversation.ts deleted file mode 100644 index 68d73ca..0000000 --- a/web-new/src/api/conversation.ts +++ /dev/null @@ -1,74 +0,0 @@ -/** - * 对话相关API接口 - */ - -import request from '@/utils/request' -import { API_PATHS } from '@/config/constants' -import type { - CreateConversationRequest, - ConversationInfo, - GetUserConversationsRequest, - MessageInfo, - GetUserMessagesRequest, - SearchUserMessagesRequest, - GetRecentMessagesRequest -} from '@/types/api' - -export const conversationApi = { - /** - * 创建新对话 - */ - create(data: CreateConversationRequest): Promise { - return request.post(API_PATHS.CONVERSATION.CREATE, data, { - showLoading: true, - loadingText: '创建中...' - }) - }, - - /** - * 获取用户对话列表 - */ - getUserConversations(params: GetUserConversationsRequest): Promise> { - return request.get(API_PATHS.CONVERSATION.USER_LIST, params) - }, - - /** - * 删除对话 - */ - delete(conversationId: string): Promise { - return request.delete(`${API_PATHS.CONVERSATION.DELETE}/${conversationId}`, { - showLoading: true, - loadingText: '删除中...' - }) - } -} - -export const messageApi = { - /** - * 获取用户消息列表 - */ - getUserMessages(params: GetUserMessagesRequest): Promise> { - return request.get(API_PATHS.MESSAGE.USER_PAGE, params) - }, - - /** - * 搜索用户消息 - */ - searchUserMessages(params: SearchUserMessagesRequest): Promise> { - return request.get(API_PATHS.MESSAGE.USER_SEARCH, params) - }, - - /** - * 获取最近消息 - */ - getRecentMessages(params: GetRecentMessagesRequest): Promise { - return request.get(API_PATHS.MESSAGE.USER_RECENT, params) - }, - - /** - * 获取消息详情 - */ - getMessageDetail(messageId: string): Promise { - return request.get(`${API_PATHS.MESSAGE.DETAIL}/${messageId}`) - } -} diff --git a/web-new/src/api/diary.ts b/web-new/src/api/diary.ts deleted file mode 100644 index cb8cb46..0000000 --- a/web-new/src/api/diary.ts +++ /dev/null @@ -1,71 +0,0 @@ -/** - * 日记相关API接口 - */ - -import request from '@/utils/request' -import { API_PATHS } from '@/config/constants' -import type { - DiaryPost, - PublishDiaryRequest, - GetUserDiariesRequest -} from '@/types/api' - -export const diaryApi = { - /** - * 发布日记 - */ - publish(data: PublishDiaryRequest): Promise { - return request.post(API_PATHS.DIARY.PUBLISH, data, { - showLoading: true, - loadingText: '发布中...' - }) - }, - - /** - * 获取用户日记列表 - */ - getUserDiaries(params: GetUserDiariesRequest): Promise> { - return request.get(API_PATHS.DIARY.USER_PAGE, params) - }, - - /** - * 获取日记详情 - */ - getDiaryDetail(diaryId: string): Promise { - return request.get(`${API_PATHS.DIARY.PUBLISH}/${diaryId}`) - }, - - /** - * 更新日记 - */ - updateDiary(diaryId: string, data: Partial): Promise { - return request.put(`${API_PATHS.DIARY.PUBLISH}/${diaryId}`, data, { - showLoading: true, - loadingText: '保存中...' - }) - }, - - /** - * 删除日记 - */ - deleteDiary(diaryId: string): Promise { - return request.delete(`${API_PATHS.DIARY.PUBLISH}/${diaryId}`, { - showLoading: true, - loadingText: '删除中...' - }) - }, - - /** - * 保存草稿 - */ - saveDraft(data: Partial): Promise { - return request.post(`${API_PATHS.DIARY.PUBLISH}/draft`, data) - }, - - /** - * 获取草稿列表 - */ - getDrafts(): Promise { - return request.get(`${API_PATHS.DIARY.PUBLISH}/drafts`) - } -} diff --git a/web-new/src/api/user.ts b/web-new/src/api/user.ts deleted file mode 100644 index 863cb46..0000000 --- a/web-new/src/api/user.ts +++ /dev/null @@ -1,97 +0,0 @@ -/** - * 用户相关API接口 - */ - -import request from '@/utils/request' -import { API_PATHS } from '@/config/constants' -import type { - UserInfo, - UpdateUserProfileRequest, - ChangePasswordRequest, - UploadAvatarResponse, - VerifyEmailRequest, - SendEmailCodeRequest, - VerifyPhoneRequest, - SendPhoneCodeRequest, - UserGrowthStats -} from '@/types/api' - -export const userApi = { - /** - * 获取用户资料 - */ - getProfile(): Promise { - return request.get(API_PATHS.USER.PROFILE) - }, - - /** - * 更新用户资料 - */ - updateProfile(data: UpdateUserProfileRequest): Promise { - return request.put(API_PATHS.USER.PROFILE, data, { - showLoading: true, - loadingText: '保存中...' - }) - }, - - /** - * 修改密码 - */ - changePassword(data: ChangePasswordRequest): Promise { - return request.put(API_PATHS.USER.PASSWORD, data, { - showLoading: true, - loadingText: '修改中...' - }) - }, - - /** - * 上传头像 - */ - uploadAvatar(file: File): Promise { - return request.upload(API_PATHS.USER.AVATAR_UPLOAD, file, { - showLoading: true, - loadingText: '上传中...' - }) - }, - - /** - * 获取用户成长数据 - */ - getGrowthStats(): Promise { - return request.get(API_PATHS.USER.GROWTH_STATS) - }, - - /** - * 发送邮箱验证码 - */ - sendEmailCode(data: SendEmailCodeRequest): Promise { - return request.post(API_PATHS.USER.EMAIL_SEND_CODE, data) - }, - - /** - * 验证邮箱 - */ - verifyEmail(data: VerifyEmailRequest): Promise { - return request.post(API_PATHS.USER.EMAIL_VERIFY, data, { - showLoading: true, - loadingText: '验证中...' - }) - }, - - /** - * 发送手机验证码 - */ - sendPhoneCode(data: SendPhoneCodeRequest): Promise { - return request.post(API_PATHS.USER.PHONE_SEND_CODE, data) - }, - - /** - * 验证手机号 - */ - verifyPhone(data: VerifyPhoneRequest): Promise { - return request.post(API_PATHS.USER.PHONE_VERIFY, data, { - showLoading: true, - loadingText: '验证中...' - }) - } -} diff --git a/web-new/src/assets/styles/main.css b/web-new/src/assets/styles/main.css deleted file mode 100644 index 69da172..0000000 --- a/web-new/src/assets/styles/main.css +++ /dev/null @@ -1,230 +0,0 @@ -/** - * 主样式文件 - */ - -@import 'tailwindcss/base'; -@import 'tailwindcss/components'; -@import 'tailwindcss/utilities'; - -/* 全局样式 */ -* { - box-sizing: border-box; -} - -html { - font-family: 'Noto Sans SC', 'Inter', system-ui, sans-serif; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -body { - margin: 0; - padding: 0; - background-color: #f9fafb; - color: #374151; - line-height: 1.6; -} - -/* 滚动条样式 */ -::-webkit-scrollbar { - width: 6px; - height: 6px; -} - -::-webkit-scrollbar-track { - background: #f1f1f1; - border-radius: 3px; -} - -::-webkit-scrollbar-thumb { - background: #c1c1c1; - border-radius: 3px; -} - -::-webkit-scrollbar-thumb:hover { - background: #a8a8a8; -} - -/* 暗色主题 */ -.dark { - background-color: #111827; - color: #f9fafb; -} - -.dark ::-webkit-scrollbar-track { - background: #374151; -} - -.dark ::-webkit-scrollbar-thumb { - background: #6b7280; -} - -.dark ::-webkit-scrollbar-thumb:hover { - background: #9ca3af; -} - -/* Element Plus 样式覆盖 */ -.el-button--primary { - background-color: #4a90e2; - border-color: #4a90e2; -} - -.el-button--primary:hover { - background-color: #357abd; - border-color: #357abd; -} - -/* 自定义工具类 */ -.text-gradient { - background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - background-clip: text; -} - -.glass-effect { - backdrop-filter: blur(10px); - background-color: rgba(255, 255, 255, 0.8); - border: 1px solid rgba(255, 255, 255, 0.2); -} - -.dark .glass-effect { - background-color: rgba(17, 24, 39, 0.8); - border: 1px solid rgba(75, 85, 99, 0.2); -} - -/* 动画类 */ -.fade-enter-active, -.fade-leave-active { - transition: opacity 0.3s ease; -} - -.fade-enter-from, -.fade-leave-to { - opacity: 0; -} - -.slide-up-enter-active, -.slide-up-leave-active { - transition: all 0.3s ease; -} - -.slide-up-enter-from { - transform: translateY(20px); - opacity: 0; -} - -.slide-up-leave-to { - transform: translateY(-20px); - opacity: 0; -} - -.slide-left-enter-active, -.slide-left-leave-active { - transition: all 0.3s ease; -} - -.slide-left-enter-from { - transform: translateX(100%); - opacity: 0; -} - -.slide-left-leave-to { - transform: translateX(-100%); - opacity: 0; -} - -/* 响应式工具类 */ -@media (max-width: 768px) { - .mobile-hidden { - display: none !important; - } -} - -@media (min-width: 769px) { - .desktop-hidden { - display: none !important; - } -} - -/* 打印样式 */ -@media print { - .no-print { - display: none !important; - } - - body { - background: white !important; - color: black !important; - } -} - -/* 无障碍样式 */ -.sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - white-space: nowrap; - border: 0; -} - -/* 焦点样式 */ -.focus-visible:focus { - outline: 2px solid #4a90e2; - outline-offset: 2px; -} - -/* 加载动画 */ -.loading-spinner { - animation: spin 1s linear infinite; -} - -@keyframes spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} - -/* 脉冲动画 */ -.pulse { - animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; -} - -@keyframes pulse { - 0%, 100% { - opacity: 1; - } - 50% { - opacity: 0.5; - } -} - -/* 弹跳动画 */ -.bounce { - animation: bounce 1s infinite; -} - -@keyframes bounce { - 0%, 20%, 53%, 80%, 100% { - animation-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1); - transform: translate3d(0, 0, 0); - } - 40%, 43% { - animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); - transform: translate3d(0, -30px, 0); - } - 70% { - animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06); - transform: translate3d(0, -15px, 0); - } - 90% { - transform: translate3d(0, -4px, 0); - } -} diff --git a/web-new/src/components/editor/RichTextEditor.vue b/web-new/src/components/editor/RichTextEditor.vue deleted file mode 100644 index ad4e95f..0000000 --- a/web-new/src/components/editor/RichTextEditor.vue +++ /dev/null @@ -1,472 +0,0 @@ - - - - - diff --git a/web-new/src/components/emoji/EmojiPicker.vue b/web-new/src/components/emoji/EmojiPicker.vue deleted file mode 100644 index e874ab4..0000000 --- a/web-new/src/components/emoji/EmojiPicker.vue +++ /dev/null @@ -1,325 +0,0 @@ - - - - - - - diff --git a/web-new/src/components/error/ErrorBoundary.vue b/web-new/src/components/error/ErrorBoundary.vue deleted file mode 100644 index f8b0b87..0000000 --- a/web-new/src/components/error/ErrorBoundary.vue +++ /dev/null @@ -1,467 +0,0 @@ - - - - - diff --git a/web-new/src/components/notification/NotificationCenter.vue b/web-new/src/components/notification/NotificationCenter.vue deleted file mode 100644 index c55565b..0000000 --- a/web-new/src/components/notification/NotificationCenter.vue +++ /dev/null @@ -1,514 +0,0 @@ - - - - - - - diff --git a/web-new/src/components/upload/FileUpload.vue b/web-new/src/components/upload/FileUpload.vue deleted file mode 100644 index d2492c2..0000000 --- a/web-new/src/components/upload/FileUpload.vue +++ /dev/null @@ -1,373 +0,0 @@ - - - - - diff --git a/web-new/src/components/upload/ImageUpload.vue b/web-new/src/components/upload/ImageUpload.vue deleted file mode 100644 index 99dbaf4..0000000 --- a/web-new/src/components/upload/ImageUpload.vue +++ /dev/null @@ -1,471 +0,0 @@ - - - - - diff --git a/web-new/src/composables/useChat.ts b/web-new/src/composables/useChat.ts deleted file mode 100644 index e430467..0000000 --- a/web-new/src/composables/useChat.ts +++ /dev/null @@ -1,307 +0,0 @@ -/** - * 聊天功能组合式API - * 管理WebSocket连接、消息发送接收等 - */ - -import { ref, computed, onMounted, onUnmounted } from 'vue' -import { ElMessage } from 'element-plus' -import { getWebSocketInstance } from '@/utils/websocket' -import { useAuthStore } from '@/stores/auth' -import { WS_SUBSCRIBE_PATHS, WS_SEND_PATHS, MESSAGE_TYPES, SENDER_TYPES } from '@/config/constants' -import type { MessageInfo, WSChatMessage } from '@/types/api' - -export function useChat() { - const authStore = useAuthStore() - - // 响应式数据 - const messages = ref([]) - const isConnected = ref(false) - const isTyping = ref(false) - const currentConversationId = ref('') - const connectionState = ref('DISCONNECTED') - - // WebSocket实例 - let wsInstance: any = null - let unsubscribeUserMessages: (() => void) | null = null - let unsubscribeChatRoom: (() => void) | null = null - - // 计算属性 - const sortedMessages = computed(() => { - return [...messages.value].sort((a, b) => a.timestamp - b.timestamp) - }) - - const lastMessage = computed(() => { - return sortedMessages.value[sortedMessages.value.length - 1] - }) - - const messageCount = computed(() => messages.value.length) - - /** - * 初始化WebSocket连接 - */ - const initializeWebSocket = () => { - if (!authStore.token || !authStore.userId) { - console.warn('⚠️ 用户未登录,无法建立WebSocket连接') - return - } - - wsInstance = getWebSocketInstance({ - onConnect: () => { - isConnected.value = true - connectionState.value = 'CONNECTED' - console.log('✅ 聊天WebSocket连接成功') - - // 订阅个人消息 - subscribeToUserMessages() - - // 订阅聊天室消息 - subscribeToChatRoom() - }, - - onDisconnect: () => { - isConnected.value = false - connectionState.value = 'DISCONNECTED' - console.log('❌ 聊天WebSocket连接断开') - }, - - onError: (error) => { - connectionState.value = 'ERROR' - console.error('❌ 聊天WebSocket错误:', error) - ElMessage.error('聊天连接出现问题,请刷新页面重试') - }, - - onTokenExpired: () => { - ElMessage.warning('登录已过期,请重新登录') - authStore.logout() - }, - - onReconnect: (attempt) => { - connectionState.value = 'CONNECTING' - console.log(`🔄 聊天WebSocket重连中... (第${attempt}次)`) - } - }) - - // 连接WebSocket - wsInstance.connect(authStore.token) - } - - /** - * 订阅个人消息 - */ - const subscribeToUserMessages = () => { - if (!wsInstance || !authStore.userId) return - - const destination = WS_SUBSCRIBE_PATHS.USER_MESSAGES(authStore.userId) - - unsubscribeUserMessages = wsInstance.subscribe(destination, (message: MessageInfo) => { - handleIncomingMessage(message) - }) - } - - /** - * 订阅聊天室消息 - */ - const subscribeToChatRoom = () => { - if (!wsInstance) return - - unsubscribeChatRoom = wsInstance.subscribe(WS_SUBSCRIBE_PATHS.CHAT_ROOM, (message: MessageInfo) => { - handleIncomingMessage(message) - }) - } - - /** - * 处理接收到的消息 - */ - const handleIncomingMessage = (message: MessageInfo) => { - // 检查是否已存在该消息(避免重复) - const existingMessage = messages.value.find(m => m.id === message.id) - if (existingMessage) return - - // 添加到消息列表 - messages.value.push(message) - - // 如果是AI回复,显示通知 - if (message.senderType === SENDER_TYPES.AI) { - ElMessage.success('收到AI回复') - } - - console.log('📨 收到新消息:', message) - } - - /** - * 发送消息 - */ - const sendMessage = (content: string, type: string = MESSAGE_TYPES.TEXT, metadata?: any) => { - if (!wsInstance || !isConnected.value) { - ElMessage.error('连接已断开,无法发送消息') - return - } - - if (!content.trim()) { - ElMessage.warning('消息内容不能为空') - return - } - - const messageData: WSChatMessage = { - conversationId: currentConversationId.value, - content: content.trim(), - type: type as any, - metadata - } - - try { - wsInstance.send(WS_SEND_PATHS.CHAT_SEND, messageData) - - // 添加到本地消息列表(乐观更新) - const localMessage: MessageInfo = { - id: `temp_${Date.now()}`, - conversationId: currentConversationId.value, - content: content.trim(), - type: type as any, - senderId: authStore.userId!, - senderType: SENDER_TYPES.USER, - senderName: authStore.nickname!, - senderAvatar: authStore.avatar, - status: 'sending', - timestamp: Date.now(), - metadata - } - - messages.value.push(localMessage) - - console.log('📤 发送消息:', messageData) - } catch (error) { - console.error('❌ 发送消息失败:', error) - ElMessage.error('发送消息失败,请重试') - } - } - - /** - * 发送图片消息 - */ - const sendImageMessage = (imageUrl: string, metadata?: any) => { - sendMessage(imageUrl, MESSAGE_TYPES.IMAGE, { - ...metadata, - imageUrl - }) - } - - /** - * 发送文件消息 - */ - const sendFileMessage = (fileUrl: string, fileName: string, fileSize: number) => { - sendMessage(fileUrl, MESSAGE_TYPES.FILE, { - fileUrl, - fileName, - fileSize - }) - } - - /** - * 发送表情消息 - */ - const sendEmojiMessage = (emoji: string) => { - sendMessage(emoji, MESSAGE_TYPES.EMOJI) - } - - /** - * 发送正在输入状态 - */ - const sendTypingStatus = (isTyping: boolean) => { - if (!wsInstance || !isConnected.value) return - - wsInstance.send(WS_SEND_PATHS.TYPING, { - conversationId: currentConversationId.value, - isTyping - }) - } - - /** - * 设置当前会话ID - */ - const setConversationId = (conversationId: string) => { - currentConversationId.value = conversationId - // 清空之前的消息 - messages.value = [] - } - - /** - * 清空消息 - */ - const clearMessages = () => { - messages.value = [] - } - - /** - * 重连WebSocket - */ - const reconnect = () => { - if (wsInstance) { - wsInstance.disconnect() - } - setTimeout(() => { - initializeWebSocket() - }, 1000) - } - - /** - * 断开WebSocket连接 - */ - const disconnect = () => { - // 取消订阅 - if (unsubscribeUserMessages) { - unsubscribeUserMessages() - unsubscribeUserMessages = null - } - - if (unsubscribeChatRoom) { - unsubscribeChatRoom() - unsubscribeChatRoom = null - } - - // 断开连接 - if (wsInstance) { - wsInstance.disconnect() - wsInstance = null - } - - isConnected.value = false - connectionState.value = 'DISCONNECTED' - } - - // 生命周期钩子 - onMounted(() => { - if (authStore.isLoggedIn) { - initializeWebSocket() - } - }) - - onUnmounted(() => { - disconnect() - }) - - return { - // 响应式数据 - messages: sortedMessages, - isConnected, - isTyping, - connectionState, - currentConversationId, - - // 计算属性 - lastMessage, - messageCount, - - // 方法 - sendMessage, - sendImageMessage, - sendFileMessage, - sendEmojiMessage, - sendTypingStatus, - setConversationId, - clearMessages, - reconnect, - disconnect, - initializeWebSocket - } -} diff --git a/web-new/src/composables/useDiary.ts b/web-new/src/composables/useDiary.ts deleted file mode 100644 index 036819b..0000000 --- a/web-new/src/composables/useDiary.ts +++ /dev/null @@ -1,380 +0,0 @@ -/** - * 日记功能组合式API - * 管理日记的创建、编辑、删除、草稿等功能 - */ - -import { ref, computed } from 'vue' -import { ElMessage } from 'element-plus' -import { diaryApi } from '@/api/diary' -import { STORAGE_KEYS } from '@/config/constants' -import storage from '@/utils/storage' -import type { - DiaryPost, - PublishDiaryRequest, - GetUserDiariesRequest -} from '@/types/api' - -export function useDiary() { - // 响应式数据 - const loading = ref(false) - const publishing = ref(false) - const diaries = ref([]) - const currentDiary = ref(null) - const drafts = ref([]) - const total = ref(0) - const currentPage = ref(1) - const pageSize = ref(20) - - // 计算属性 - const hasMore = computed(() => { - return diaries.value.length < total.value - }) - - const draftCount = computed(() => drafts.value.length) - - /** - * 获取用户日记列表 - */ - const fetchUserDiaries = async (params: GetUserDiariesRequest = {}) => { - try { - loading.value = true - - const requestParams = { - page: currentPage.value, - pageSize: pageSize.value, - ...params - } - - const response = await diaryApi.getUserDiaries(requestParams) - - if (currentPage.value === 1) { - diaries.value = response.list - } else { - diaries.value.push(...response.list) - } - - total.value = response.total - - return response - } catch (error) { - console.error('获取日记列表失败:', error) - throw error - } finally { - loading.value = false - } - } - - /** - * 加载更多日记 - */ - const loadMoreDiaries = async (params: GetUserDiariesRequest = {}) => { - if (!hasMore.value || loading.value) return - - currentPage.value++ - await fetchUserDiaries(params) - } - - /** - * 刷新日记列表 - */ - const refreshDiaries = async (params: GetUserDiariesRequest = {}) => { - currentPage.value = 1 - await fetchUserDiaries(params) - } - - /** - * 获取日记详情 - */ - const fetchDiaryDetail = async (diaryId: string) => { - try { - loading.value = true - currentDiary.value = await diaryApi.getDiaryDetail(diaryId) - return currentDiary.value - } catch (error) { - console.error('获取日记详情失败:', error) - throw error - } finally { - loading.value = false - } - } - - /** - * 发布日记 - */ - const publishDiary = async (data: PublishDiaryRequest) => { - try { - // 验证必填字段 - if (!data.title.trim()) { - throw new Error('请输入日记标题') - } - - if (!data.content.trim()) { - throw new Error('请输入日记内容') - } - - if (!data.emotion) { - throw new Error('请选择情绪类型') - } - - if (data.mood < 1 || data.mood > 10) { - throw new Error('心情指数必须在1-10之间') - } - - publishing.value = true - const diary = await diaryApi.publish(data) - - // 添加到列表开头 - diaries.value.unshift(diary) - total.value++ - - // 清除草稿 - clearDraft() - - ElMessage.success('日记发布成功') - return diary - } catch (error: any) { - ElMessage.error(error.message || '日记发布失败') - throw error - } finally { - publishing.value = false - } - } - - /** - * 更新日记 - */ - const updateDiary = async (diaryId: string, data: Partial) => { - try { - const updatedDiary = await diaryApi.updateDiary(diaryId, data) - - // 更新列表中的日记 - const index = diaries.value.findIndex(d => d.id === diaryId) - if (index > -1) { - diaries.value[index] = updatedDiary - } - - // 更新当前日记 - if (currentDiary.value?.id === diaryId) { - currentDiary.value = updatedDiary - } - - ElMessage.success('日记更新成功') - return updatedDiary - } catch (error: any) { - ElMessage.error(error.message || '日记更新失败') - throw error - } - } - - /** - * 删除日记 - */ - const deleteDiary = async (diaryId: string) => { - try { - await diaryApi.deleteDiary(diaryId) - - // 从列表中移除 - const index = diaries.value.findIndex(d => d.id === diaryId) - if (index > -1) { - diaries.value.splice(index, 1) - total.value-- - } - - // 清除当前日记 - if (currentDiary.value?.id === diaryId) { - currentDiary.value = null - } - - ElMessage.success('日记删除成功') - } catch (error: any) { - ElMessage.error(error.message || '日记删除失败') - throw error - } - } - - /** - * 保存草稿 - */ - const saveDraft = async (data: Partial) => { - try { - // 本地保存草稿 - storage.set(STORAGE_KEYS.DRAFT_DIARY, data) - - // 如果有标题和内容,保存到服务器 - if (data.title?.trim() || data.content?.trim()) { - const draft = await diaryApi.saveDraft(data) - - // 更新草稿列表 - const existingIndex = drafts.value.findIndex(d => d.id === draft.id) - if (existingIndex > -1) { - drafts.value[existingIndex] = draft - } else { - drafts.value.unshift(draft) - } - - ElMessage.success('草稿保存成功') - return draft - } - } catch (error: any) { - console.error('保存草稿失败:', error) - // 草稿保存失败不显示错误消息,静默处理 - } - } - - /** - * 获取草稿列表 - */ - const fetchDrafts = async () => { - try { - drafts.value = await diaryApi.getDrafts() - return drafts.value - } catch (error) { - console.error('获取草稿列表失败:', error) - throw error - } - } - - /** - * 获取本地草稿 - */ - const getLocalDraft = (): Partial | null => { - return storage.get(STORAGE_KEYS.DRAFT_DIARY) - } - - /** - * 清除本地草稿 - */ - const clearDraft = () => { - storage.remove(STORAGE_KEYS.DRAFT_DIARY) - } - - /** - * 自动保存草稿 - */ - const autoSaveDraft = (() => { - let timer: NodeJS.Timeout | null = null - - return (data: Partial) => { - if (timer) { - clearTimeout(timer) - } - - timer = setTimeout(() => { - saveDraft(data) - }, 3000) // 3秒后自动保存 - } - })() - - /** - * 搜索日记 - */ - const searchDiaries = async (keyword: string, filters: Partial = {}) => { - const params: GetUserDiariesRequest = { - keyword, - ...filters - } - - currentPage.value = 1 - await fetchUserDiaries(params) - } - - /** - * 筛选日记 - */ - const filterDiaries = async (filters: Partial) => { - currentPage.value = 1 - await fetchUserDiaries(filters) - } - - /** - * 重置状态 - */ - const resetState = () => { - diaries.value = [] - currentDiary.value = null - drafts.value = [] - total.value = 0 - currentPage.value = 1 - loading.value = false - publishing.value = false - } - - /** - * 获取情绪统计 - */ - const getEmotionStats = () => { - const stats: Record = {} - - diaries.value.forEach(diary => { - if (diary.emotion) { - stats[diary.emotion] = (stats[diary.emotion] || 0) + 1 - } - }) - - return stats - } - - /** - * 获取心情趋势 - */ - const getMoodTrend = (days = 7) => { - const now = Date.now() - const dayMs = 24 * 60 * 60 * 1000 - - const trend = [] - for (let i = days - 1; i >= 0; i--) { - const date = new Date(now - i * dayMs) - const dayDiaries = diaries.value.filter(diary => { - const diaryDate = new Date(diary.createTime) - return diaryDate.toDateString() === date.toDateString() - }) - - const avgMood = dayDiaries.length > 0 - ? dayDiaries.reduce((sum, diary) => sum + diary.mood, 0) / dayDiaries.length - : 0 - - trend.push({ - date: date.toISOString().split('T')[0], - mood: Math.round(avgMood * 10) / 10, - count: dayDiaries.length - }) - } - - return trend - } - - return { - // 响应式数据 - loading, - publishing, - diaries, - currentDiary, - drafts, - total, - currentPage, - pageSize, - - // 计算属性 - hasMore, - draftCount, - - // 方法 - fetchUserDiaries, - loadMoreDiaries, - refreshDiaries, - fetchDiaryDetail, - publishDiary, - updateDiary, - deleteDiary, - saveDraft, - fetchDrafts, - getLocalDraft, - clearDraft, - autoSaveDraft, - searchDiaries, - filterDiaries, - resetState, - getEmotionStats, - getMoodTrend - } -} diff --git a/web-new/src/composables/useUser.ts b/web-new/src/composables/useUser.ts deleted file mode 100644 index b98be5f..0000000 --- a/web-new/src/composables/useUser.ts +++ /dev/null @@ -1,283 +0,0 @@ -/** - * 用户功能组合式API - * 管理用户资料、头像上传、密码修改等 - */ - -import { ref, computed } from 'vue' -import { ElMessage } from 'element-plus' -import { userApi } from '@/api/user' -import { useAuthStore } from '@/stores/auth' -import { UPLOAD_CONFIG } from '@/config/constants' -import { validateEmail, validatePhone, validatePassword } from '@/utils/validation' -import type { - UserInfo, - UpdateUserProfileRequest, - ChangePasswordRequest, - UserGrowthStats -} from '@/types/api' - -export function useUser() { - const authStore = useAuthStore() - - // 响应式数据 - const loading = ref(false) - const uploading = ref(false) - const userProfile = ref(null) - const growthStats = ref(null) - - // 计算属性 - const currentUser = computed(() => authStore.user) - const isProfileComplete = computed(() => { - if (!userProfile.value) return false - const { email, phone, bio } = userProfile.value - return !!(email && phone && bio) - }) - - /** - * 获取用户资料 - */ - const fetchUserProfile = async () => { - try { - loading.value = true - userProfile.value = await userApi.getProfile() - return userProfile.value - } catch (error) { - console.error('获取用户资料失败:', error) - throw error - } finally { - loading.value = false - } - } - - /** - * 更新用户资料 - */ - const updateUserProfile = async (data: UpdateUserProfileRequest) => { - try { - // 验证数据 - if (data.email && !validateEmail(data.email)) { - throw new Error('邮箱格式不正确') - } - - if (data.phone && !validatePhone(data.phone)) { - throw new Error('手机号格式不正确') - } - - const updatedUser = await userApi.updateProfile(data) - - // 更新本地状态 - userProfile.value = updatedUser - await authStore.updateUserInfo(updatedUser) - - ElMessage.success('资料更新成功') - return updatedUser - } catch (error: any) { - ElMessage.error(error.message || '资料更新失败') - throw error - } - } - - /** - * 修改密码 - */ - const changePassword = async (data: ChangePasswordRequest) => { - try { - // 验证新密码 - if (!validatePassword(data.newPassword)) { - throw new Error('新密码格式不正确,必须包含字母和数字,长度6-20位') - } - - if (data.newPassword !== data.confirmPassword) { - throw new Error('两次输入的密码不一致') - } - - await userApi.changePassword(data) - ElMessage.success('密码修改成功,请重新登录') - - // 修改密码后需要重新登录 - setTimeout(() => { - authStore.logout() - }, 2000) - } catch (error: any) { - ElMessage.error(error.message || '密码修改失败') - throw error - } - } - - /** - * 上传头像 - */ - const uploadAvatar = async (file: File) => { - try { - // 验证文件类型 - if (!UPLOAD_CONFIG.AVATAR_ALLOWED_TYPES.includes(file.type)) { - throw new Error('只支持 JPG、PNG 格式的图片') - } - - // 验证文件大小 - if (file.size > UPLOAD_CONFIG.AVATAR_MAX_SIZE) { - throw new Error('图片大小不能超过 2MB') - } - - uploading.value = true - const response = await userApi.uploadAvatar(file) - - // 更新用户头像 - if (userProfile.value) { - userProfile.value.avatar = response.url - } - - await authStore.updateUserInfo({ avatar: response.url }) - - ElMessage.success('头像上传成功') - return response - } catch (error: any) { - ElMessage.error(error.message || '头像上传失败') - throw error - } finally { - uploading.value = false - } - } - - /** - * 获取用户成长数据 - */ - const fetchGrowthStats = async () => { - try { - loading.value = true - growthStats.value = await userApi.getGrowthStats() - return growthStats.value - } catch (error) { - console.error('获取成长数据失败:', error) - throw error - } finally { - loading.value = false - } - } - - /** - * 发送邮箱验证码 - */ - const sendEmailVerificationCode = async (email: string, type: 'register' | 'reset_password' | 'verify_email' = 'verify_email') => { - try { - if (!validateEmail(email)) { - throw new Error('邮箱格式不正确') - } - - await userApi.sendEmailCode({ email, type }) - ElMessage.success('验证码已发送到您的邮箱') - } catch (error: any) { - ElMessage.error(error.message || '发送验证码失败') - throw error - } - } - - /** - * 验证邮箱 - */ - const verifyEmail = async (email: string, code: string) => { - try { - await userApi.verifyEmail({ email, code }) - - // 更新用户信息 - if (userProfile.value) { - userProfile.value.email = email - } - - ElMessage.success('邮箱验证成功') - } catch (error: any) { - ElMessage.error(error.message || '邮箱验证失败') - throw error - } - } - - /** - * 发送手机验证码 - */ - const sendPhoneVerificationCode = async (phone: string, type: 'register' | 'reset_password' | 'verify_phone' = 'verify_phone') => { - try { - if (!validatePhone(phone)) { - throw new Error('手机号格式不正确') - } - - await userApi.sendPhoneCode({ phone, type }) - ElMessage.success('验证码已发送到您的手机') - } catch (error: any) { - ElMessage.error(error.message || '发送验证码失败') - throw error - } - } - - /** - * 验证手机号 - */ - const verifyPhone = async (phone: string, code: string) => { - try { - await userApi.verifyPhone({ phone, code }) - - // 更新用户信息 - if (userProfile.value) { - userProfile.value.phone = phone - } - - ElMessage.success('手机号验证成功') - } catch (error: any) { - ElMessage.error(error.message || '手机号验证失败') - throw error - } - } - - /** - * 检查头像文件 - */ - const validateAvatarFile = (file: File): boolean => { - // 检查文件类型 - if (!UPLOAD_CONFIG.AVATAR_ALLOWED_TYPES.includes(file.type)) { - ElMessage.error('只支持 JPG、PNG 格式的图片') - return false - } - - // 检查文件大小 - if (file.size > UPLOAD_CONFIG.AVATAR_MAX_SIZE) { - ElMessage.error('图片大小不能超过 2MB') - return false - } - - return true - } - - /** - * 重置状态 - */ - const resetState = () => { - userProfile.value = null - growthStats.value = null - loading.value = false - uploading.value = false - } - - return { - // 响应式数据 - loading, - uploading, - userProfile, - growthStats, - - // 计算属性 - currentUser, - isProfileComplete, - - // 方法 - fetchUserProfile, - updateUserProfile, - changePassword, - uploadAvatar, - fetchGrowthStats, - sendEmailVerificationCode, - verifyEmail, - sendPhoneVerificationCode, - verifyPhone, - validateAvatarFile, - resetState - } -} diff --git a/web-new/src/config/constants.ts b/web-new/src/config/constants.ts deleted file mode 100644 index e27f5a3..0000000 --- a/web-new/src/config/constants.ts +++ /dev/null @@ -1,214 +0,0 @@ -/** - * 应用常量定义 - */ - -// 存储键名 -export const STORAGE_KEYS = { - TOKEN: 'emotion_museum_token', - REFRESH_TOKEN: 'emotion_museum_refresh_token', - USER_INFO: 'emotion_museum_user_info', - LANGUAGE: 'emotion_museum_language', - THEME: 'emotion_museum_theme', - CHAT_HISTORY: 'emotion_museum_chat_history', - DRAFT_DIARY: 'emotion_museum_draft_diary' -} as const - -// API 路径 -export const API_PATHS = { - // 认证相关 - AUTH: { - LOGIN: '/auth/login', - REGISTER: '/auth/register', - LOGOUT: '/auth/logout', - REFRESH_TOKEN: '/auth/refresh-token', - CAPTCHA: '/auth/captcha', - OAUTH_LOGIN: '/auth/oauth/login', - USER_INFO: '/auth/user/info' - }, - - // 用户相关 - USER: { - PROFILE: '/user/profile', - GROWTH_STATS: '/user/growth-stats', - AVATAR_UPLOAD: '/user/avatar/upload', - PASSWORD: '/user/password', - EMAIL_VERIFY: '/user/email/verify', - EMAIL_SEND_CODE: '/user/email/send-code', - PHONE_VERIFY: '/user/phone/verify', - PHONE_SEND_CODE: '/user/phone/send-code' - }, - - // 对话相关 - CONVERSATION: { - CREATE: '/conversation', - USER_LIST: '/conversation/user', - DELETE: '/conversation' - }, - - // 消息相关 - MESSAGE: { - USER_PAGE: '/message/user/page', - USER_SEARCH: '/message/user/search', - USER_RECENT: '/message/user/recent', - DETAIL: '/message' - }, - - // 日记相关 - DIARY: { - PUBLISH: '/diary-post/publish', - USER_PAGE: '/diary-post/user' - } -} as const - -// WebSocket 路径 -export const WS_PATHS = { - CHAT: '/ws/chat', - NOTIFICATIONS: '/ws/notifications' -} as const - -// WebSocket 订阅路径 -export const WS_SUBSCRIBE_PATHS = { - USER_MESSAGES: (userId: string) => `/user/${userId}/queue/messages`, - CHAT_ROOM: '/topic/chat', - NOTIFICATIONS: (userId: string) => `/user/${userId}/queue/notifications` -} as const - -// WebSocket 发送路径 -export const WS_SEND_PATHS = { - CHAT_SEND: '/app/chat.send', - TYPING: '/app/chat.typing' -} as const - -// 分页配置 -export const PAGINATION = { - DEFAULT_PAGE_SIZE: 20, - MAX_PAGE_SIZE: 100, - DEFAULT_PAGE: 1 -} as const - -// 文件上传配置 -export const UPLOAD_CONFIG = { - MAX_FILE_SIZE: 10 * 1024 * 1024, // 10MB - ALLOWED_IMAGE_TYPES: ['image/jpeg', 'image/png', 'image/gif', 'image/webp'], - ALLOWED_FILE_TYPES: ['application/pdf', 'text/plain', 'application/msword'], - AVATAR_MAX_SIZE: 2 * 1024 * 1024, // 2MB - AVATAR_ALLOWED_TYPES: ['image/jpeg', 'image/png'] -} as const - -// 表单验证规则 -export const VALIDATION_RULES = { - USERNAME: { - MIN_LENGTH: 3, - MAX_LENGTH: 20, - PATTERN: /^[a-zA-Z0-9_\u4e00-\u9fa5]+$/ - }, - PASSWORD: { - MIN_LENGTH: 6, - MAX_LENGTH: 20, - PATTERN: /^(?=.*[a-zA-Z])(?=.*\d)[a-zA-Z\d@$!%*?&]+$/ - }, - EMAIL: { - PATTERN: /^[^\s@]+@[^\s@]+\.[^\s@]+$/ - }, - PHONE: { - PATTERN: /^1[3-9]\d{9}$/ - } -} as const - -// 情绪类型 -export const EMOTION_TYPES = { - HAPPY: 'happy', - SAD: 'sad', - ANGRY: 'angry', - CALM: 'calm', - EXCITED: 'excited', - ANXIOUS: 'anxious', - NEUTRAL: 'neutral' -} as const - -// 情绪颜色映射 -export const EMOTION_COLORS = { - [EMOTION_TYPES.HAPPY]: '#fbbf24', - [EMOTION_TYPES.SAD]: '#3b82f6', - [EMOTION_TYPES.ANGRY]: '#ef4444', - [EMOTION_TYPES.CALM]: '#10b981', - [EMOTION_TYPES.EXCITED]: '#f97316', - [EMOTION_TYPES.ANXIOUS]: '#8b5cf6', - [EMOTION_TYPES.NEUTRAL]: '#6b7280' -} as const - -// 消息类型 -export const MESSAGE_TYPES = { - TEXT: 'text', - IMAGE: 'image', - FILE: 'file', - EMOJI: 'emoji', - SYSTEM: 'system' -} as const - -// 发送者类型 -export const SENDER_TYPES = { - USER: 'USER', - AI: 'AI', - SYSTEM: 'SYSTEM' -} as const - -// 路由名称 -export const ROUTE_NAMES = { - HOME: 'Home', - LOGIN: 'Login', - REGISTER: 'Register', - CHAT: 'Chat', - CHAT_HISTORY: 'ChatHistory', - DIARY: 'Diary', - PERSONAL_DASHBOARD: 'PersonalDashboard', - PROFILE: 'Profile', - ANALYSIS: 'Analysis', - SETTINGS: 'Settings', - NOT_FOUND: 'NotFound' -} as const - -// 主题配置 -export const THEMES = { - LIGHT: 'light', - DARK: 'dark', - AUTO: 'auto' -} as const - -// 语言配置 -export const LANGUAGES = { - ZH_CN: 'zh-CN', - EN_US: 'en-US' -} as const - -// 错误码 -export const ERROR_CODES = { - UNAUTHORIZED: 401, - FORBIDDEN: 403, - NOT_FOUND: 404, - INTERNAL_SERVER_ERROR: 500, - NETWORK_ERROR: 'NETWORK_ERROR', - TIMEOUT: 'TIMEOUT' -} as const - -// 成功状态码 -export const SUCCESS_CODES = { - OK: 200, - CREATED: 201, - NO_CONTENT: 204 -} as const - -// 缓存时间(毫秒) -export const CACHE_TIME = { - SHORT: 5 * 60 * 1000, // 5分钟 - MEDIUM: 30 * 60 * 1000, // 30分钟 - LONG: 2 * 60 * 60 * 1000, // 2小时 - VERY_LONG: 24 * 60 * 60 * 1000 // 24小时 -} as const - -// 动画持续时间 -export const ANIMATION_DURATION = { - FAST: 150, - NORMAL: 300, - SLOW: 500 -} as const diff --git a/web-new/src/config/emoji.ts b/web-new/src/config/emoji.ts deleted file mode 100644 index 0f4ea5b..0000000 --- a/web-new/src/config/emoji.ts +++ /dev/null @@ -1,158 +0,0 @@ -/** - * 表情数据配置 - */ - -export interface EmojiItem { - char: string - code: string - name: string - category: string - keywords: string[] -} - -export const EMOJI_DATA: EmojiItem[] = [ - // 笑脸表情 - { char: '😀', code: 'grinning', name: '咧嘴笑', category: 'smileys', keywords: ['开心', '高兴', '笑'] }, - { char: '😃', code: 'smiley', name: '笑脸', category: 'smileys', keywords: ['开心', '高兴', '笑'] }, - { char: '😄', code: 'smile', name: '大笑', category: 'smileys', keywords: ['开心', '高兴', '大笑'] }, - { char: '😁', code: 'grin', name: '露齿笑', category: 'smileys', keywords: ['开心', '高兴', '笑'] }, - { char: '😆', code: 'laughing', name: '哈哈', category: 'smileys', keywords: ['开心', '高兴', '哈哈'] }, - { char: '😅', code: 'sweat_smile', name: '苦笑', category: 'smileys', keywords: ['苦笑', '尴尬'] }, - { char: '🤣', code: 'rofl', name: '笑哭', category: 'smileys', keywords: ['笑哭', '大笑'] }, - { char: '😂', code: 'joy', name: '喜极而泣', category: 'smileys', keywords: ['喜极而泣', '笑哭'] }, - { char: '🙂', code: 'slightly_smiling_face', name: '微笑', category: 'smileys', keywords: ['微笑', '开心'] }, - { char: '🙃', code: 'upside_down_face', name: '倒脸', category: 'smileys', keywords: ['倒脸', '搞怪'] }, - { char: '😉', code: 'wink', name: '眨眼', category: 'smileys', keywords: ['眨眼', '调皮'] }, - { char: '😊', code: 'blush', name: '害羞', category: 'smileys', keywords: ['害羞', '脸红'] }, - { char: '😇', code: 'innocent', name: '天使', category: 'smileys', keywords: ['天使', '纯真'] }, - { char: '🥰', code: 'smiling_face_with_hearts', name: '爱心眼', category: 'smileys', keywords: ['爱心', '喜欢'] }, - { char: '😍', code: 'heart_eyes', name: '花痴', category: 'smileys', keywords: ['花痴', '爱心眼'] }, - { char: '🤩', code: 'star_struck', name: '星星眼', category: 'smileys', keywords: ['星星眼', '崇拜'] }, - { char: '😘', code: 'kissing_heart', name: '飞吻', category: 'smileys', keywords: ['飞吻', '亲吻'] }, - { char: '😗', code: 'kissing', name: '亲吻', category: 'smileys', keywords: ['亲吻', '吻'] }, - { char: '☺️', code: 'relaxed', name: '满足', category: 'smileys', keywords: ['满足', '开心'] }, - { char: '😚', code: 'kissing_closed_eyes', name: '闭眼亲吻', category: 'smileys', keywords: ['亲吻', '闭眼'] }, - - // 难过表情 - { char: '😢', code: 'cry', name: '哭泣', category: 'smileys', keywords: ['哭泣', '难过', '伤心'] }, - { char: '😭', code: 'sob', name: '大哭', category: 'smileys', keywords: ['大哭', '难过', '伤心'] }, - { char: '😤', code: 'triumph', name: '生气', category: 'smileys', keywords: ['生气', '愤怒'] }, - { char: '😠', code: 'angry', name: '愤怒', category: 'smileys', keywords: ['愤怒', '生气'] }, - { char: '😡', code: 'rage', name: '暴怒', category: 'smileys', keywords: ['暴怒', '愤怒'] }, - { char: '🤬', code: 'swearing', name: '骂人', category: 'smileys', keywords: ['骂人', '愤怒'] }, - { char: '😱', code: 'scream', name: '尖叫', category: 'smileys', keywords: ['尖叫', '惊恐'] }, - { char: '😨', code: 'fearful', name: '恐惧', category: 'smileys', keywords: ['恐惧', '害怕'] }, - { char: '😰', code: 'cold_sweat', name: '冷汗', category: 'smileys', keywords: ['冷汗', '紧张'] }, - { char: '😥', code: 'disappointed_relieved', name: '失望', category: 'smileys', keywords: ['失望', '难过'] }, - - // 其他表情 - { char: '😴', code: 'sleeping', name: '睡觉', category: 'smileys', keywords: ['睡觉', '困'] }, - { char: '🤤', code: 'drooling', name: '流口水', category: 'smileys', keywords: ['流口水', '馋'] }, - { char: '😪', code: 'sleepy', name: '困倦', category: 'smileys', keywords: ['困倦', '累'] }, - { char: '🤔', code: 'thinking', name: '思考', category: 'smileys', keywords: ['思考', '想'] }, - { char: '🤫', code: 'shushing', name: '嘘', category: 'smileys', keywords: ['嘘', '安静'] }, - { char: '🤭', code: 'hand_over_mouth', name: '捂嘴', category: 'smileys', keywords: ['捂嘴', '惊讶'] }, - { char: '🙄', code: 'eye_roll', name: '翻白眼', category: 'smileys', keywords: ['翻白眼', '无语'] }, - { char: '😏', code: 'smirk', name: '得意', category: 'smileys', keywords: ['得意', '坏笑'] }, - { char: '😒', code: 'unamused', name: '无趣', category: 'smileys', keywords: ['无趣', '无聊'] }, - { char: '🙁', code: 'frowning', name: '皱眉', category: 'smileys', keywords: ['皱眉', '不开心'] }, - - // 人物手势 - { char: '👋', code: 'wave', name: '挥手', category: 'people', keywords: ['挥手', '再见', '你好'] }, - { char: '🤚', code: 'raised_back_of_hand', name: '举手', category: 'people', keywords: ['举手', '停'] }, - { char: '🖐️', code: 'raised_hand_with_fingers_splayed', name: '张开手', category: 'people', keywords: ['张开手', '五'] }, - { char: '✋', code: 'raised_hand', name: '举手', category: 'people', keywords: ['举手', '停'] }, - { char: '🖖', code: 'vulcan_salute', name: '瓦肯礼', category: 'people', keywords: ['瓦肯礼', '问候'] }, - { char: '👌', code: 'ok_hand', name: 'OK', category: 'people', keywords: ['OK', '好的'] }, - { char: '🤏', code: 'pinching_hand', name: '捏', category: 'people', keywords: ['捏', '一点点'] }, - { char: '✌️', code: 'v', name: '胜利', category: 'people', keywords: ['胜利', 'V', '耶'] }, - { char: '🤞', code: 'crossed_fingers', name: '祈祷', category: 'people', keywords: ['祈祷', '希望'] }, - { char: '🤟', code: 'love_you_gesture', name: '爱你', category: 'people', keywords: ['爱你', '手势'] }, - { char: '🤘', code: 'metal', name: '摇滚', category: 'people', keywords: ['摇滚', '酷'] }, - { char: '🤙', code: 'call_me_hand', name: '打电话', category: 'people', keywords: ['打电话', '联系'] }, - { char: '👈', code: 'point_left', name: '向左指', category: 'people', keywords: ['向左', '指'] }, - { char: '👉', code: 'point_right', name: '向右指', category: 'people', keywords: ['向右', '指'] }, - { char: '👆', code: 'point_up_2', name: '向上指', category: 'people', keywords: ['向上', '指'] }, - { char: '🖕', code: 'middle_finger', name: '中指', category: 'people', keywords: ['中指', '鄙视'] }, - { char: '👇', code: 'point_down', name: '向下指', category: 'people', keywords: ['向下', '指'] }, - { char: '☝️', code: 'point_up', name: '食指向上', category: 'people', keywords: ['食指', '向上'] }, - { char: '👍', code: 'thumbsup', name: '赞', category: 'people', keywords: ['赞', '好', '棒'] }, - { char: '👎', code: 'thumbsdown', name: '踩', category: 'people', keywords: ['踩', '不好', '差'] }, - - // 自然 - { char: '🌱', code: 'seedling', name: '幼苗', category: 'nature', keywords: ['幼苗', '植物', '成长'] }, - { char: '🌿', code: 'herb', name: '草本', category: 'nature', keywords: ['草本', '植物'] }, - { char: '🍀', code: 'four_leaf_clover', name: '四叶草', category: 'nature', keywords: ['四叶草', '幸运'] }, - { char: '🌸', code: 'cherry_blossom', name: '樱花', category: 'nature', keywords: ['樱花', '花'] }, - { char: '🌺', code: 'hibiscus', name: '芙蓉花', category: 'nature', keywords: ['芙蓉花', '花'] }, - { char: '🌻', code: 'sunflower', name: '向日葵', category: 'nature', keywords: ['向日葵', '花'] }, - { char: '🌹', code: 'rose', name: '玫瑰', category: 'nature', keywords: ['玫瑰', '花', '爱情'] }, - { char: '🌷', code: 'tulip', name: '郁金香', category: 'nature', keywords: ['郁金香', '花'] }, - { char: '🌲', code: 'evergreen_tree', name: '常青树', category: 'nature', keywords: ['常青树', '树'] }, - { char: '🌳', code: 'deciduous_tree', name: '落叶树', category: 'nature', keywords: ['落叶树', '树'] }, - - // 食物 - { char: '🍎', code: 'apple', name: '苹果', category: 'food', keywords: ['苹果', '水果'] }, - { char: '🍊', code: 'tangerine', name: '橘子', category: 'food', keywords: ['橘子', '水果'] }, - { char: '🍋', code: 'lemon', name: '柠檬', category: 'food', keywords: ['柠檬', '水果'] }, - { char: '🍌', code: 'banana', name: '香蕉', category: 'food', keywords: ['香蕉', '水果'] }, - { char: '🍉', code: 'watermelon', name: '西瓜', category: 'food', keywords: ['西瓜', '水果'] }, - { char: '🍇', code: 'grapes', name: '葡萄', category: 'food', keywords: ['葡萄', '水果'] }, - { char: '🍓', code: 'strawberry', name: '草莓', category: 'food', keywords: ['草莓', '水果'] }, - { char: '🍑', code: 'cherries', name: '樱桃', category: 'food', keywords: ['樱桃', '水果'] }, - { char: '🍒', code: 'cherry', name: '樱桃', category: 'food', keywords: ['樱桃', '水果'] }, - { char: '🥝', code: 'kiwi_fruit', name: '猕猴桃', category: 'food', keywords: ['猕猴桃', '水果'] }, - - // 活动 - { char: '⚽', code: 'soccer', name: '足球', category: 'activity', keywords: ['足球', '运动'] }, - { char: '🏀', code: 'basketball', name: '篮球', category: 'activity', keywords: ['篮球', '运动'] }, - { char: '🏈', code: 'football', name: '橄榄球', category: 'activity', keywords: ['橄榄球', '运动'] }, - { char: '⚾', code: 'baseball', name: '棒球', category: 'activity', keywords: ['棒球', '运动'] }, - { char: '🎾', code: 'tennis', name: '网球', category: 'activity', keywords: ['网球', '运动'] }, - { char: '🏐', code: 'volleyball', name: '排球', category: 'activity', keywords: ['排球', '运动'] }, - { char: '🏓', code: 'ping_pong', name: '乒乓球', category: 'activity', keywords: ['乒乓球', '运动'] }, - { char: '🏸', code: 'badminton', name: '羽毛球', category: 'activity', keywords: ['羽毛球', '运动'] }, - { char: '🥅', code: 'goal_net', name: '球门', category: 'activity', keywords: ['球门', '运动'] }, - { char: '🎯', code: 'dart', name: '飞镖', category: 'activity', keywords: ['飞镖', '游戏'] }, - - // 符号 - { char: '❤️', code: 'heart', name: '红心', category: 'symbols', keywords: ['红心', '爱', '喜欢'] }, - { char: '🧡', code: 'orange_heart', name: '橙心', category: 'symbols', keywords: ['橙心', '爱'] }, - { char: '💛', code: 'yellow_heart', name: '黄心', category: 'symbols', keywords: ['黄心', '爱'] }, - { char: '💚', code: 'green_heart', name: '绿心', category: 'symbols', keywords: ['绿心', '爱'] }, - { char: '💙', code: 'blue_heart', name: '蓝心', category: 'symbols', keywords: ['蓝心', '爱'] }, - { char: '💜', code: 'purple_heart', name: '紫心', category: 'symbols', keywords: ['紫心', '爱'] }, - { char: '🖤', code: 'black_heart', name: '黑心', category: 'symbols', keywords: ['黑心', '爱'] }, - { char: '🤍', code: 'white_heart', name: '白心', category: 'symbols', keywords: ['白心', '爱'] }, - { char: '🤎', code: 'brown_heart', name: '棕心', category: 'symbols', keywords: ['棕心', '爱'] }, - { char: '💔', code: 'broken_heart', name: '心碎', category: 'symbols', keywords: ['心碎', '伤心'] }, - { char: '❣️', code: 'heavy_heart_exclamation', name: '心叹号', category: 'symbols', keywords: ['心叹号', '爱'] }, - { char: '💕', code: 'two_hearts', name: '双心', category: 'symbols', keywords: ['双心', '爱'] }, - { char: '💞', code: 'revolving_hearts', name: '旋转心', category: 'symbols', keywords: ['旋转心', '爱'] }, - { char: '💓', code: 'heartbeat', name: '心跳', category: 'symbols', keywords: ['心跳', '爱'] }, - { char: '💗', code: 'heartpulse', name: '心脉', category: 'symbols', keywords: ['心脉', '爱'] }, - { char: '💖', code: 'sparkling_heart', name: '闪亮心', category: 'symbols', keywords: ['闪亮心', '爱'] }, - { char: '💘', code: 'cupid', name: '丘比特', category: 'symbols', keywords: ['丘比特', '爱'] }, - { char: '💝', code: 'gift_heart', name: '礼物心', category: 'symbols', keywords: ['礼物心', '爱'] }, - { char: '💟', code: 'heart_decoration', name: '心装饰', category: 'symbols', keywords: ['心装饰', '爱'] } -] - -// 根据分类获取表情 -export const getEmojisByCategory = (category: string): EmojiItem[] => { - return EMOJI_DATA.filter(emoji => emoji.category === category) -} - -// 搜索表情 -export const searchEmojis = (keyword: string): EmojiItem[] => { - const lowerKeyword = keyword.toLowerCase() - return EMOJI_DATA.filter(emoji => - emoji.name.toLowerCase().includes(lowerKeyword) || - emoji.keywords.some(k => k.toLowerCase().includes(lowerKeyword)) - ) -} - -// 获取随机表情 -export const getRandomEmojis = (count: number = 10): EmojiItem[] => { - const shuffled = [...EMOJI_DATA].sort(() => 0.5 - Math.random()) - return shuffled.slice(0, count) -} diff --git a/web-new/src/config/env.ts b/web-new/src/config/env.ts deleted file mode 100644 index f9f545b..0000000 --- a/web-new/src/config/env.ts +++ /dev/null @@ -1,145 +0,0 @@ -/** - * 环境配置管理 - * 支持 local/dev/test/prod 四种环境 - */ - -export interface EnvConfig { - name: string - apiBaseUrl: string - wsBaseUrl: string - uploadUrl: string - debug: boolean - mock: boolean - appTitle: string - appVersion: string -} - -// 环境配置映射 -const envConfigs: Record = { - local: { - name: '本地环境', - apiBaseUrl: 'http://localhost:19089/api', - wsBaseUrl: 'ws://localhost:19089', - uploadUrl: 'http://localhost:19089/api/upload', - debug: true, - mock: false, - appTitle: '情绪博物馆 - 本地', - appVersion: '1.0.0' - }, - - dev: { - name: '开发环境', - apiBaseUrl: 'https://dev-api.emotion-museum.com/api', - wsBaseUrl: 'wss://dev-api.emotion-museum.com', - uploadUrl: 'https://dev-api.emotion-museum.com/api/upload', - debug: true, - mock: false, - appTitle: '情绪博物馆 - 开发', - appVersion: '1.0.0' - }, - - test: { - name: '测试环境', - apiBaseUrl: 'https://test-api.emotion-museum.com/api', - wsBaseUrl: 'wss://test-api.emotion-museum.com', - uploadUrl: 'https://test-api.emotion-museum.com/api/upload', - debug: false, - mock: false, - appTitle: '情绪博物馆 - 测试', - appVersion: '1.0.0' - }, - - prod: { - name: '生产环境', - apiBaseUrl: 'https://api.emotion-museum.com/api', - wsBaseUrl: 'wss://api.emotion-museum.com', - uploadUrl: 'https://api.emotion-museum.com/api/upload', - debug: false, - mock: false, - appTitle: '情绪博物馆', - appVersion: '1.0.0' - } -} - -// 获取当前环境 -function getCurrentEnv(): string { - // 优先使用环境变量 - const viteEnv = import.meta.env.VITE_APP_ENV - if (viteEnv && envConfigs[viteEnv]) { - return viteEnv - } - - // 根据域名判断环境 - const hostname = window.location.hostname - if (hostname === 'localhost' || hostname === '127.0.0.1') { - return 'local' - } else if (hostname.includes('dev')) { - return 'dev' - } else if (hostname.includes('test')) { - return 'test' - } else { - return 'prod' - } -} - -// 当前环境配置 -export const currentEnv = getCurrentEnv() -export const envConfig = envConfigs[currentEnv] - -// 环境变量覆盖 -if (import.meta.env.VITE_API_BASE_URL) { - envConfig.apiBaseUrl = import.meta.env.VITE_API_BASE_URL -} - -if (import.meta.env.VITE_WS_BASE_URL) { - envConfig.wsBaseUrl = import.meta.env.VITE_WS_BASE_URL -} - -if (import.meta.env.VITE_UPLOAD_URL) { - envConfig.uploadUrl = import.meta.env.VITE_UPLOAD_URL -} - -if (import.meta.env.VITE_DEBUG) { - envConfig.debug = import.meta.env.VITE_DEBUG === 'true' -} - -if (import.meta.env.VITE_MOCK) { - envConfig.mock = import.meta.env.VITE_MOCK === 'true' -} - -if (import.meta.env.VITE_APP_TITLE) { - envConfig.appTitle = import.meta.env.VITE_APP_TITLE -} - -if (import.meta.env.VITE_APP_VERSION) { - envConfig.appVersion = import.meta.env.VITE_APP_VERSION -} - -// 开发环境下打印配置信息 -if (envConfig.debug) { - console.log('🔧 当前环境配置:', { - 环境: envConfig.name, - API地址: envConfig.apiBaseUrl, - WebSocket地址: envConfig.wsBaseUrl, - 上传地址: envConfig.uploadUrl, - 调试模式: envConfig.debug, - Mock模式: envConfig.mock - }) -} - -// 导出配置验证函数 -export function validateConfig(): boolean { - const required = ['apiBaseUrl', 'wsBaseUrl', 'uploadUrl'] - - for (const key of required) { - if (!envConfig[key as keyof EnvConfig]) { - console.error(`❌ 环境配置缺失: ${key}`) - return false - } - } - - return true -} - -// 导出所有环境配置(用于调试) -export { envConfigs } diff --git a/web-new/src/i18n/index.ts b/web-new/src/i18n/index.ts deleted file mode 100644 index c86811d..0000000 --- a/web-new/src/i18n/index.ts +++ /dev/null @@ -1,26 +0,0 @@ -/** - * 国际化配置 - */ - -import { createI18n } from 'vue-i18n' -import { getLanguage } from '@/utils/storage' -import { LANGUAGES } from '@/config/constants' - -// 导入语言文件 -import zhCN from './locales/zh-CN.json' -import enUS from './locales/en-US.json' - -const messages = { - [LANGUAGES.ZH_CN]: zhCN, - [LANGUAGES.EN_US]: enUS -} - -export const i18n = createI18n({ - legacy: false, - locale: getLanguage() || LANGUAGES.ZH_CN, - fallbackLocale: LANGUAGES.ZH_CN, - messages, - globalInjection: true -}) - -export default i18n diff --git a/web-new/src/i18n/locales/en-US.json b/web-new/src/i18n/locales/en-US.json deleted file mode 100644 index 19d2a1f..0000000 --- a/web-new/src/i18n/locales/en-US.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "common": { - "confirm": "Confirm", - "cancel": "Cancel", - "save": "Save", - "delete": "Delete", - "edit": "Edit", - "add": "Add", - "search": "Search", - "reset": "Reset", - "submit": "Submit", - "loading": "Loading...", - "success": "Success", - "error": "Error", - "warning": "Warning", - "info": "Info" - }, - "auth": { - "login": "Login", - "register": "Register", - "logout": "Logout", - "username": "Username", - "password": "Password", - "confirmPassword": "Confirm Password", - "email": "Email", - "phone": "Phone", - "captcha": "Captcha", - "rememberMe": "Remember Me", - "forgotPassword": "Forgot Password?", - "loginSuccess": "Login successful", - "registerSuccess": "Registration successful", - "logoutSuccess": "Logout successful" - }, - "nav": { - "home": "Home", - "chat": "AI Chat", - "diary": "Emotion Diary", - "dashboard": "Dashboard", - "analysis": "Analysis", - "profile": "Profile", - "settings": "Settings" - }, - "chat": { - "sendMessage": "Send Message", - "typing": "Typing...", - "offline": "Offline", - "connected": "Connected", - "connecting": "Connecting...", - "disconnected": "Disconnected", - "reconnecting": "Reconnecting..." - }, - "diary": { - "title": "Title", - "content": "Content", - "emotion": "Emotion", - "mood": "Mood", - "weather": "Weather", - "location": "Location", - "tags": "Tags", - "publish": "Publish", - "draft": "Draft", - "public": "Public", - "private": "Private" - }, - "error": { - "404": "Page Not Found", - "403": "Access Denied", - "500": "Server Error", - "network": "Network Error", - "timeout": "Request Timeout", - "unknown": "Unknown Error" - } -} diff --git a/web-new/src/i18n/locales/zh-CN.json b/web-new/src/i18n/locales/zh-CN.json deleted file mode 100644 index 6217858..0000000 --- a/web-new/src/i18n/locales/zh-CN.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "common": { - "confirm": "确认", - "cancel": "取消", - "save": "保存", - "delete": "删除", - "edit": "编辑", - "add": "添加", - "search": "搜索", - "reset": "重置", - "submit": "提交", - "loading": "加载中...", - "success": "成功", - "error": "错误", - "warning": "警告", - "info": "信息" - }, - "auth": { - "login": "登录", - "register": "注册", - "logout": "退出登录", - "username": "用户名", - "password": "密码", - "confirmPassword": "确认密码", - "email": "邮箱", - "phone": "手机号", - "captcha": "验证码", - "rememberMe": "记住我", - "forgotPassword": "忘记密码?", - "loginSuccess": "登录成功", - "registerSuccess": "注册成功", - "logoutSuccess": "退出登录成功" - }, - "nav": { - "home": "首页", - "chat": "AI对话", - "diary": "情绪日记", - "dashboard": "个人仪表盘", - "analysis": "情绪分析", - "profile": "个人资料", - "settings": "设置" - }, - "chat": { - "sendMessage": "发送消息", - "typing": "正在输入...", - "offline": "离线", - "connected": "已连接", - "connecting": "连接中...", - "disconnected": "已断开", - "reconnecting": "重连中..." - }, - "diary": { - "title": "标题", - "content": "内容", - "emotion": "情绪", - "mood": "心情指数", - "weather": "天气", - "location": "位置", - "tags": "标签", - "publish": "发布", - "draft": "草稿", - "public": "公开", - "private": "私密" - }, - "error": { - "404": "页面不存在", - "403": "权限不足", - "500": "服务器错误", - "network": "网络错误", - "timeout": "请求超时", - "unknown": "未知错误" - } -} diff --git a/web-new/src/layouts/AuthLayout.vue b/web-new/src/layouts/AuthLayout.vue deleted file mode 100644 index 6309595..0000000 --- a/web-new/src/layouts/AuthLayout.vue +++ /dev/null @@ -1,124 +0,0 @@ - - - - - diff --git a/web-new/src/layouts/ChatLayout.vue b/web-new/src/layouts/ChatLayout.vue deleted file mode 100644 index 98e36bb..0000000 --- a/web-new/src/layouts/ChatLayout.vue +++ /dev/null @@ -1,376 +0,0 @@ - - - - - diff --git a/web-new/src/layouts/DefaultLayout.vue b/web-new/src/layouts/DefaultLayout.vue deleted file mode 100644 index 9229caf..0000000 --- a/web-new/src/layouts/DefaultLayout.vue +++ /dev/null @@ -1,307 +0,0 @@ - - - - - diff --git a/web-new/src/main.ts b/web-new/src/main.ts deleted file mode 100644 index b067fc5..0000000 --- a/web-new/src/main.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { createApp } from 'vue' -import { createPinia } from 'pinia' - -// 样式导入 -import 'element-plus/dist/index.css' -import './assets/styles/main.css' - -// 组件导入 -import App from './App.vue' -import router from './router' -// import { i18n } from './i18n' - -// 插件导入 -// import { registerGlobalComponents } from './plugins/global-components' -// import { setupErrorHandler } from './plugins/error-handler' -// import { setupProgressBar } from './plugins/progress-bar' - -// 创建应用实例 -const app = createApp(App) - -// 创建状态管理实例 -const pinia = createPinia() - -// 注册插件 -app.use(pinia) -app.use(router) -// app.use(i18n) - -// 设置路由守卫 -// import { setupRouterGuards } from './router/guards' -// setupRouterGuards(router, pinia) - -// 注册全局组件 -// registerGlobalComponents(app) - -// 设置错误处理 -// setupErrorHandler(app) - -// 设置进度条 -// setupProgressBar(router) - -// 挂载应用 -app.mount('#app') - -// 开发环境下的调试信息 -if (import.meta.env.DEV) { - console.log('🚀 情绪博物馆 Web 应用启动成功') - console.log('📦 Vue版本:', app.version) - console.log('🔧 环境:', import.meta.env.MODE) -} diff --git a/web-new/src/plugins/error-handler.ts b/web-new/src/plugins/error-handler.ts deleted file mode 100644 index af1954f..0000000 --- a/web-new/src/plugins/error-handler.ts +++ /dev/null @@ -1,44 +0,0 @@ -/** - * 全局错误处理 - */ - -import type { App } from 'vue' -import { ElMessage } from 'element-plus' -import { envConfig } from '@/config/env' - -export function setupErrorHandler(app: App) { - // Vue错误处理 - app.config.errorHandler = (error: any, instance, info) => { - console.error('Vue Error:', error) - console.error('Error Info:', info) - - if (envConfig.debug) { - ElMessage.error(`Vue错误: ${error.message}`) - } else { - ElMessage.error('应用出现错误,请刷新页面重试') - } - } - - // 全局未捕获的Promise错误 - window.addEventListener('unhandledrejection', (event) => { - console.error('Unhandled Promise Rejection:', event.reason) - - if (envConfig.debug) { - ElMessage.error(`Promise错误: ${event.reason}`) - } - - // 阻止默认的错误处理 - event.preventDefault() - }) - - // 全局JavaScript错误 - window.addEventListener('error', (event) => { - console.error('Global Error:', event.error) - - if (envConfig.debug) { - ElMessage.error(`JavaScript错误: ${event.error?.message}`) - } - }) - - console.log('✅ 错误处理器设置完成') -} diff --git a/web-new/src/plugins/global-components.ts b/web-new/src/plugins/global-components.ts deleted file mode 100644 index 2b81e6e..0000000 --- a/web-new/src/plugins/global-components.ts +++ /dev/null @@ -1,15 +0,0 @@ -/** - * 全局组件注册 - */ - -import type { App } from 'vue' -import * as ElementPlusIconsVue from '@element-plus/icons-vue' - -export function registerGlobalComponents(app: App) { - // 注册Element Plus图标 - for (const [key, component] of Object.entries(ElementPlusIconsVue)) { - app.component(key, component) - } - - console.log('✅ 全局组件注册完成') -} diff --git a/web-new/src/plugins/progress-bar.ts b/web-new/src/plugins/progress-bar.ts deleted file mode 100644 index 83af532..0000000 --- a/web-new/src/plugins/progress-bar.ts +++ /dev/null @@ -1,29 +0,0 @@ -/** - * 页面加载进度条 - */ - -import type { Router } from 'vue-router' -import NProgress from 'nprogress' -import 'nprogress/nprogress.css' - -// 配置NProgress -NProgress.configure({ - showSpinner: false, - trickleSpeed: 200, - minimum: 0.3 -}) - -export function setupProgressBar(router: Router) { - router.beforeEach((to, from, next) => { - // 开始进度条 - NProgress.start() - next() - }) - - router.afterEach(() => { - // 完成进度条 - NProgress.done() - }) - - console.log('✅ 进度条设置完成') -} diff --git a/web-new/src/router/guards.ts b/web-new/src/router/guards.ts deleted file mode 100644 index 36af6f7..0000000 --- a/web-new/src/router/guards.ts +++ /dev/null @@ -1,159 +0,0 @@ -/** - * 路由守卫 - * 处理认证、权限、页面标题等 - */ - -import type { Router } from 'vue-router' -import type { Pinia } from 'pinia' -import { ElMessage } from 'element-plus' -import { useAuthStore } from '@/stores/auth' -import { useAppStore } from '@/stores/app' -import { envConfig } from '@/config/env' - -export function setupRouterGuards(router: Router, pinia: Pinia) { - // 全局前置守卫 - router.beforeEach(async (to, from, next) => { - const authStore = useAuthStore(pinia) - const appStore = useAppStore(pinia) - - // 开始加载 - appStore.setLoading(true, '页面加载中...') - - try { - // 检查是否需要认证 - const requireAuth = to.meta.requireAuth !== false - - // 如果需要认证但用户未登录 - if (requireAuth && !authStore.isLoggedIn) { - // 检查是否有Token - if (authStore.token) { - try { - // 尝试获取用户信息 - await authStore.checkAuthStatus() - - // 认证成功,继续导航 - next() - } catch (error) { - console.warn('认证检查失败:', error) - - // 认证失败,跳转到登录页 - ElMessage.warning('登录状态已过期,请重新登录') - next({ - path: '/auth/login', - query: { redirect: to.fullPath } - }) - } - } else { - // 没有Token,跳转到登录页 - next({ - path: '/auth/login', - query: { redirect: to.fullPath } - }) - } - return - } - - // 如果已登录但访问认证页面,跳转到首页 - if (authStore.isLoggedIn && to.meta.hideForAuth) { - next('/home') - return - } - - // 检查权限 - if (to.meta.roles && to.meta.roles.length > 0) { - const hasRole = to.meta.roles.some((role: string) => - authStore.hasRole(role) - ) - - if (!hasRole) { - ElMessage.error('权限不足,无法访问该页面') - next('/403') - return - } - } - - // 检查权限 - if (to.meta.permissions && to.meta.permissions.length > 0) { - const hasPermission = to.meta.permissions.some((permission: string) => - authStore.hasPermission(permission) - ) - - if (!hasPermission) { - ElMessage.error('权限不足,无法访问该页面') - next('/403') - return - } - } - - // 生产环境隐藏调试页面 - if (to.meta.hideInProduction && !envConfig.debug) { - next('/404') - return - } - - // 检查Token是否需要刷新 - if (authStore.isLoggedIn) { - await authStore.refreshTokenIfNeeded() - } - - next() - } catch (error) { - console.error('路由守卫错误:', error) - appStore.addError('页面加载失败', 'error') - next('/404') - } - }) - - // 全局后置守卫 - router.afterEach((to, from) => { - const appStore = useAppStore(pinia) - - // 结束加载 - appStore.setLoading(false) - - // 设置页面标题 - const title = to.meta.title as string - if (title) { - document.title = `${title} - ${appStore.title}` - } else { - document.title = appStore.title - } - - // 记录页面访问 - if (envConfig.debug) { - console.log(`📄 页面访问: ${from.path} -> ${to.path}`) - } - - // 埋点统计(如果需要) - // analytics.track('page_view', { - // page: to.path, - // title: to.meta.title - // }) - }) - - // 路由错误处理 - router.onError((error) => { - const appStore = useAppStore(pinia) - - console.error('路由错误:', error) - appStore.setLoading(false) - appStore.addError('页面加载失败', 'error') - }) - - console.log('✅ 路由守卫设置完成') -} - -// 扩展路由元信息类型 -declare module 'vue-router' { - interface RouteMeta { - title?: string - requireAuth?: boolean - hideForAuth?: boolean - roles?: string[] - permissions?: string[] - hideInProduction?: boolean - layout?: string - transition?: string - icon?: string - } -} diff --git a/web-new/src/router/index.ts b/web-new/src/router/index.ts deleted file mode 100644 index c487896..0000000 --- a/web-new/src/router/index.ts +++ /dev/null @@ -1,394 +0,0 @@ -/** - * 路由配置 - * Vue Router 4.x 配置 - */ - -import type { RouteRecordRaw } from 'vue-router' -import { ROUTE_NAMES } from '@/config/constants' - -// 路由懒加载 -const Home = () => import('@/views/Home.vue') -const Login = () => import('@/views/auth/Login.vue') -const Register = () => import('@/views/auth/Register.vue') -const Chat = () => import('@/views/chat/Chat.vue') -const ChatHistory = () => import('@/views/chat/ChatHistory.vue') -const Diary = () => import('@/views/diary/Diary.vue') -const DiaryEditor = () => import('@/views/diary/DiaryEditor.vue') -const DiaryDetail = () => import('@/views/diary/DiaryDetail.vue') -const PersonalDashboard = () => import('@/views/dashboard/PersonalDashboard.vue') -const Profile = () => import('@/views/profile/Profile.vue') -const Analysis = () => import('@/views/analysis/Analysis.vue') -const LifeMilestones = () => import('@/views/milestones/LifeMilestones.vue') -const LifeTrajectory = () => import('@/views/trajectory/LifeTrajectory.vue') -const Messages = () => import('@/views/messages/Messages.vue') -const Settings = () => import('@/views/settings/Settings.vue') -const TopicTracker = () => import('@/views/topic/TopicTracker.vue') -const EmotionManagement = () => import('@/views/emotion/EmotionManagement.vue') -const EmotionMap = () => import('@/views/map/EmotionMap.vue') -const SocialShare = () => import('@/views/social/SocialShare.vue') -const Debug = () => import('@/views/debug/Debug.vue') -const NotFound = () => import('@/views/error/NotFound.vue') -const Forbidden = () => import('@/views/error/Forbidden.vue') - -// 布局组件 -const DefaultLayout = () => import('@/layouts/DefaultLayout.vue') -const AuthLayout = () => import('@/layouts/AuthLayout.vue') -const ChatLayout = () => import('@/layouts/ChatLayout.vue') - -export const routes: RouteRecordRaw[] = [ - { - path: '/', - redirect: '/home' - }, - - // 首页 - { - path: '/home', - name: ROUTE_NAMES.HOME, - component: Home, - meta: { - title: '首页', - requireAuth: false, - layout: 'default', - transition: 'fade' - } - }, - - // 认证相关路由 - { - path: '/auth', - component: AuthLayout, - children: [ - { - path: 'login', - name: ROUTE_NAMES.LOGIN, - component: Login, - meta: { - title: '登录', - requireAuth: false, - hideForAuth: true, - transition: 'slide-up' - } - }, - { - path: 'register', - name: ROUTE_NAMES.REGISTER, - component: Register, - meta: { - title: '注册', - requireAuth: false, - hideForAuth: true, - transition: 'slide-up' - } - } - ] - }, - - // 聊天相关路由 - { - path: '/chat', - component: ChatLayout, - meta: { - requireAuth: true - }, - children: [ - { - path: '', - name: ROUTE_NAMES.CHAT, - component: Chat, - meta: { - title: 'AI对话', - icon: 'ChatDotRound', - transition: 'slide-left' - } - }, - { - path: 'history', - name: ROUTE_NAMES.CHAT_HISTORY, - component: ChatHistory, - meta: { - title: '聊天历史', - icon: 'Clock', - transition: 'slide-left' - } - } - ] - }, - - // 主要功能路由 - { - path: '/app', - component: DefaultLayout, - meta: { - requireAuth: true - }, - children: [ - { - path: 'diary', - name: ROUTE_NAMES.DIARY, - component: Diary, - meta: { - title: '情绪日记', - icon: 'EditPen', - transition: 'fade' - } - }, - { - path: 'diary/create', - name: 'DiaryCreate', - component: DiaryEditor, - meta: { - title: '写日记', - icon: 'EditPen', - transition: 'slide-up' - } - }, - { - path: 'diary/edit/:id', - name: 'DiaryEdit', - component: DiaryEditor, - meta: { - title: '编辑日记', - icon: 'EditPen', - transition: 'slide-up' - } - }, - { - path: 'diary/:id', - name: 'DiaryDetail', - component: DiaryDetail, - meta: { - title: '日记详情', - icon: 'EditPen', - transition: 'fade' - } - }, - { - path: 'dashboard', - name: ROUTE_NAMES.PERSONAL_DASHBOARD, - component: PersonalDashboard, - meta: { - title: '个人仪表盘', - icon: 'DataBoard', - transition: 'fade' - } - }, - { - path: 'profile', - name: ROUTE_NAMES.PROFILE, - component: Profile, - meta: { - title: '个人资料', - icon: 'User', - transition: 'slide-up' - } - }, - { - path: 'analysis', - name: ROUTE_NAMES.ANALYSIS, - component: Analysis, - meta: { - title: '情绪分析', - icon: 'TrendCharts', - transition: 'fade' - } - }, - { - path: 'milestones', - name: 'LifeMilestones', - component: LifeMilestones, - meta: { - title: '人生里程碑', - icon: 'Trophy', - transition: 'fade' - } - }, - { - path: 'trajectory', - name: 'LifeTrajectory', - component: LifeTrajectory, - meta: { - title: '人生轨迹', - icon: 'Connection', - transition: 'fade' - } - }, - { - path: 'messages', - name: 'Messages', - component: Messages, - meta: { - title: '消息中心', - icon: 'Message', - transition: 'slide-up' - } - }, - { - path: 'settings', - name: ROUTE_NAMES.SETTINGS, - component: Settings, - meta: { - title: '设置', - icon: 'Setting', - transition: 'slide-up' - } - }, - { - path: 'topic-tracker', - name: 'TopicTracker', - component: TopicTracker, - meta: { - title: '话题追踪', - icon: 'Search', - transition: 'fade' - } - }, - { - path: 'emotion', - name: 'EmotionManagement', - component: EmotionManagement, - meta: { - title: '情绪管理', - icon: 'Sunny', - transition: 'fade' - } - }, - { - path: 'map', - name: 'EmotionMap', - component: EmotionMap, - meta: { - title: '情绪地图', - icon: 'Location', - transition: 'fade' - } - }, - { - path: 'social', - name: 'SocialShare', - component: SocialShare, - meta: { - title: '社交分享', - icon: 'Share', - transition: 'fade' - } - } - ] - }, - - // 调试页面(仅开发环境) - { - path: '/debug', - name: 'Debug', - component: Debug, - meta: { - title: '调试页面', - requireAuth: true, - hideInProduction: true, - transition: 'fade' - } - }, - - // 错误页面 - { - path: '/403', - name: 'Forbidden', - component: Forbidden, - meta: { - title: '权限不足', - requireAuth: false, - transition: 'fade' - } - }, - - { - path: '/404', - name: ROUTE_NAMES.NOT_FOUND, - component: NotFound, - meta: { - title: '页面不存在', - requireAuth: false, - transition: 'fade' - } - }, - - // 捕获所有未匹配的路由 - { - path: '/:pathMatch(.*)*', - redirect: '/404' - } -] - -// 导出路由配置 -export default routes - -// 导出菜单配置(用于导航菜单生成) -export const menuConfig = [ - { - title: '首页', - path: '/home', - icon: 'House', - requireAuth: false - }, - { - title: 'AI对话', - path: '/chat', - icon: 'ChatDotRound', - requireAuth: true - }, - { - title: '情绪日记', - path: '/app/diary', - icon: 'EditPen', - requireAuth: true - }, - { - title: '个人仪表盘', - path: '/app/dashboard', - icon: 'DataBoard', - requireAuth: true - }, - { - title: '情绪分析', - path: '/app/analysis', - icon: 'TrendCharts', - requireAuth: true - }, - { - title: '更多功能', - icon: 'More', - requireAuth: true, - children: [ - { - title: '人生里程碑', - path: '/app/milestones', - icon: 'Trophy' - }, - { - title: '人生轨迹', - path: '/app/trajectory', - icon: 'Connection' - }, - { - title: '话题追踪', - path: '/app/topic-tracker', - icon: 'Search' - }, - { - title: '情绪管理', - path: '/app/emotion', - icon: 'Sunny' - }, - { - title: '情绪地图', - path: '/app/map', - icon: 'Location' - }, - { - title: '社交分享', - path: '/app/social', - icon: 'Share' - } - ] - } -] diff --git a/web-new/src/stores/app.ts b/web-new/src/stores/app.ts deleted file mode 100644 index 24b16a4..0000000 --- a/web-new/src/stores/app.ts +++ /dev/null @@ -1,411 +0,0 @@ -/** - * 应用状态管理 - * 管理全局应用状态、主题、语言等 - */ - -import { defineStore } from 'pinia' -import { ElMessage } from 'element-plus' -// import { envConfig, validateConfig } from '@/config/env' -// import { THEMES, LANGUAGES } from '@/config/constants' -// import { getTheme, setTheme, getLanguage, setLanguage } from '@/utils/storage' - -interface AppState { - // 应用信息 - title: string - version: string - environment: string - - // 加载状态 - isLoading: boolean - loadingText: string - - // 主题设置 - theme: string - - // 语言设置 - language: string - - // 设备信息 - device: { - isMobile: boolean - isTablet: boolean - isDesktop: boolean - userAgent: string - } - - // 网络状态 - isOnline: boolean - - // 侧边栏状态 - sidebarCollapsed: boolean - - // 页面设置 - pageSettings: { - showBreadcrumb: boolean - showTabs: boolean - fixedHeader: boolean - showFooter: boolean - } - - // 通知设置 - notifications: { - desktop: boolean - sound: boolean - vibration: boolean - } - - // 错误信息 - errors: Array<{ - id: string - message: string - timestamp: number - type: 'error' | 'warning' | 'info' - }> -} - -export const useAppStore = defineStore('app', { - state: (): AppState => ({ - // 应用信息 - title: envConfig.appTitle, - version: envConfig.appVersion, - environment: envConfig.name, - - // 加载状态 - isLoading: false, - loadingText: '加载中...', - - // 主题设置 - theme: getTheme() || THEMES.LIGHT, - - // 语言设置 - language: getLanguage() || LANGUAGES.ZH_CN, - - // 设备信息 - device: { - isMobile: false, - isTablet: false, - isDesktop: true, - userAgent: navigator.userAgent - }, - - // 网络状态 - isOnline: navigator.onLine, - - // 侧边栏状态 - sidebarCollapsed: false, - - // 页面设置 - pageSettings: { - showBreadcrumb: true, - showTabs: true, - fixedHeader: true, - showFooter: true - }, - - // 通知设置 - notifications: { - desktop: false, - sound: true, - vibration: true - }, - - // 错误信息 - errors: [] - }), - - getters: { - /** - * 是否为暗色主题 - */ - isDarkTheme: (state) => state.theme === THEMES.DARK, - - /** - * 是否为移动端 - */ - isMobileDevice: (state) => state.device.isMobile, - - /** - * 应用配置信息 - */ - appInfo: (state) => ({ - title: state.title, - version: state.version, - environment: state.environment, - buildTime: new Date().toISOString() - }), - - /** - * 设备类型 - */ - deviceType: (state) => { - if (state.device.isMobile) return 'mobile' - if (state.device.isTablet) return 'tablet' - return 'desktop' - }, - - /** - * 未读错误数量 - */ - unreadErrorCount: (state) => state.errors.length - }, - - actions: { - /** - * 初始化应用 - */ - async initialize() { - try { - // 验证配置 - if (!validateConfig()) { - throw new Error('应用配置验证失败') - } - - // 检测设备类型 - this.detectDevice() - - // 初始化主题 - this.initializeTheme() - - // 监听网络状态 - this.setupNetworkListener() - - // 请求通知权限 - await this.requestNotificationPermission() - - console.log('✅ 应用初始化完成') - } catch (error) { - console.error('❌ 应用初始化失败:', error) - this.addError('应用初始化失败', 'error') - throw error - } - }, - - /** - * 设置加载状态 - */ - setLoading(loading: boolean, text = '加载中...') { - this.isLoading = loading - this.loadingText = text - }, - - /** - * 切换主题 - */ - toggleTheme() { - const newTheme = this.theme === THEMES.LIGHT ? THEMES.DARK : THEMES.LIGHT - this.setTheme(newTheme) - }, - - /** - * 设置主题 - */ - setTheme(theme: string) { - if (!Object.values(THEMES).includes(theme as any)) { - console.warn('无效的主题:', theme) - return - } - - this.theme = theme - setTheme(theme) - - // 应用主题到DOM - this.applyTheme(theme) - - ElMessage.success(`已切换到${theme === THEMES.DARK ? '暗色' : '亮色'}主题`) - }, - - /** - * 设置语言 - */ - setLanguage(language: string) { - if (!Object.values(LANGUAGES).includes(language as any)) { - console.warn('无效的语言:', language) - return - } - - this.language = language - setLanguage(language) - - // 这里可以触发i18n语言切换 - // i18n.global.locale = language - - ElMessage.success('语言设置已更新') - }, - - /** - * 切换侧边栏 - */ - toggleSidebar() { - this.sidebarCollapsed = !this.sidebarCollapsed - }, - - /** - * 设置侧边栏状态 - */ - setSidebarCollapsed(collapsed: boolean) { - this.sidebarCollapsed = collapsed - }, - - /** - * 更新页面设置 - */ - updatePageSettings(settings: Partial) { - this.pageSettings = { ...this.pageSettings, ...settings } - }, - - /** - * 更新通知设置 - */ - updateNotificationSettings(settings: Partial) { - this.notifications = { ...this.notifications, ...settings } - }, - - /** - * 添加错误信息 - */ - addError(message: string, type: 'error' | 'warning' | 'info' = 'error') { - const error = { - id: Date.now().toString(), - message, - type, - timestamp: Date.now() - } - - this.errors.unshift(error) - - // 限制错误数量 - if (this.errors.length > 100) { - this.errors = this.errors.slice(0, 100) - } - - // 显示错误消息 - if (type === 'error') { - ElMessage.error(message) - } else if (type === 'warning') { - ElMessage.warning(message) - } else { - ElMessage.info(message) - } - }, - - /** - * 清除错误信息 - */ - clearErrors() { - this.errors = [] - }, - - /** - * 移除指定错误 - */ - removeError(id: string) { - const index = this.errors.findIndex(error => error.id === id) - if (index > -1) { - this.errors.splice(index, 1) - } - }, - - /** - * 检测设备类型 - */ - detectDevice() { - const userAgent = navigator.userAgent.toLowerCase() - const width = window.innerWidth - - this.device = { - userAgent: navigator.userAgent, - isMobile: width <= 768 || /mobile|android|iphone|ipad|phone/i.test(userAgent), - isTablet: width > 768 && width <= 1024, - isDesktop: width > 1024 - } - - // 监听窗口大小变化 - window.addEventListener('resize', () => { - const newWidth = window.innerWidth - this.device.isMobile = newWidth <= 768 - this.device.isTablet = newWidth > 768 && newWidth <= 1024 - this.device.isDesktop = newWidth > 1024 - }) - }, - - /** - * 初始化主题 - */ - initializeTheme() { - // 如果是自动主题,根据系统设置 - if (this.theme === THEMES.AUTO) { - const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches - this.theme = prefersDark ? THEMES.DARK : THEMES.LIGHT - } - - this.applyTheme(this.theme) - - // 监听系统主题变化 - window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (e) => { - if (this.theme === THEMES.AUTO) { - const newTheme = e.matches ? THEMES.DARK : THEMES.LIGHT - this.applyTheme(newTheme) - } - }) - }, - - /** - * 应用主题到DOM - */ - applyTheme(theme: string) { - const root = document.documentElement - - if (theme === THEMES.DARK) { - root.classList.add('dark') - root.classList.remove('light') - } else { - root.classList.add('light') - root.classList.remove('dark') - } - - // 更新meta标签 - const metaTheme = document.querySelector('meta[name="theme-color"]') - if (metaTheme) { - metaTheme.setAttribute('content', theme === THEMES.DARK ? '#1f2937' : '#ffffff') - } - }, - - /** - * 设置网络状态监听 - */ - setupNetworkListener() { - window.addEventListener('online', () => { - this.isOnline = true - ElMessage.success('网络连接已恢复') - }) - - window.addEventListener('offline', () => { - this.isOnline = false - ElMessage.warning('网络连接已断开') - }) - }, - - /** - * 请求通知权限 - */ - async requestNotificationPermission() { - if ('Notification' in window) { - const permission = await Notification.requestPermission() - this.notifications.desktop = permission === 'granted' - } - }, - - /** - * 发送桌面通知 - */ - sendNotification(title: string, options?: NotificationOptions) { - if (this.notifications.desktop && 'Notification' in window) { - new Notification(title, { - icon: '/favicon.ico', - badge: '/favicon.ico', - ...options - }) - } - } - } -}) diff --git a/web-new/src/stores/auth.ts b/web-new/src/stores/auth.ts deleted file mode 100644 index 2880a15..0000000 --- a/web-new/src/stores/auth.ts +++ /dev/null @@ -1,399 +0,0 @@ -/** - * 认证状态管理 - * 管理用户登录、注册、Token等认证相关状态 - */ - -import { defineStore } from 'pinia' -import { ElMessage } from 'element-plus' -import type { UserInfo, LoginRequest, RegisterRequest } from '@/types/api' -import { authApi } from '@/api/auth' -import { - getToken, - setToken, - removeToken, - getRefreshToken, - setRefreshToken, - removeRefreshToken, - getUserInfo, - setUserInfo, - removeUserInfo -} from '@/utils/storage' -import { getWebSocketInstance, destroyWebSocketInstance } from '@/utils/websocket' -import router from '@/router' - -interface AuthState { - // 用户信息 - user: UserInfo | null - - // Token信息 - token: string | null - refreshToken: string | null - tokenExpireTime: number | null - - // 登录状态 - isLoggedIn: boolean - isLoggingIn: boolean - isRegistering: boolean - - // 权限信息 - permissions: string[] - roles: string[] - - // 登录历史 - loginHistory: Array<{ - time: number - ip?: string - device?: string - location?: string - }> -} - -export const useAuthStore = defineStore('auth', { - state: (): AuthState => ({ - user: getUserInfo(), - token: getToken(), - refreshToken: getRefreshToken(), - tokenExpireTime: null, - isLoggedIn: false, - isLoggingIn: false, - isRegistering: false, - permissions: [], - roles: [], - loginHistory: [] - }), - - getters: { - /** - * 用户ID - */ - userId: (state) => state.user?.id, - - /** - * 用户名 - */ - username: (state) => state.user?.username, - - /** - * 用户昵称 - */ - nickname: (state) => state.user?.nickname || state.user?.username, - - /** - * 用户头像 - */ - avatar: (state) => state.user?.avatar || '/default-avatar.png', - - /** - * 是否有指定权限 - */ - hasPermission: (state) => (permission: string) => { - return state.permissions.includes(permission) - }, - - /** - * 是否有指定角色 - */ - hasRole: (state) => (role: string) => { - return state.roles.includes(role) - }, - - /** - * Token是否即将过期(30分钟内) - */ - isTokenExpiringSoon: (state) => { - if (!state.tokenExpireTime) return false - const now = Date.now() - const thirtyMinutes = 30 * 60 * 1000 - return state.tokenExpireTime - now < thirtyMinutes - }, - - /** - * 用户完整信息 - */ - userProfile: (state) => ({ - ...state.user, - isLoggedIn: state.isLoggedIn, - permissions: state.permissions, - roles: state.roles - }) - }, - - actions: { - /** - * 用户登录 - */ - async login(loginData: LoginRequest) { - try { - this.isLoggingIn = true - - const response = await authApi.login(loginData) - - // 保存认证信息 - this.setAuthData(response) - - // 建立WebSocket连接 - this.connectWebSocket() - - // 记录登录历史 - this.addLoginHistory() - - ElMessage.success('登录成功') - - // 跳转到首页或之前访问的页面 - const redirect = router.currentRoute.value.query.redirect as string - await router.push(redirect || '/home') - - return response - } catch (error: any) { - ElMessage.error(error.message || '登录失败') - throw error - } finally { - this.isLoggingIn = false - } - }, - - /** - * 用户注册 - */ - async register(registerData: RegisterRequest) { - try { - this.isRegistering = true - - const response = await authApi.register(registerData) - - // 注册成功后自动登录 - this.setAuthData(response) - this.connectWebSocket() - this.addLoginHistory() - - ElMessage.success('注册成功') - - await router.push('/home') - - return response - } catch (error: any) { - ElMessage.error(error.message || '注册失败') - throw error - } finally { - this.isRegistering = false - } - }, - - /** - * 用户登出 - */ - async logout(showMessage = true) { - try { - // 调用登出接口 - if (this.token) { - await authApi.logout() - } - } catch (error) { - console.warn('登出接口调用失败:', error) - } finally { - // 清除本地数据 - this.clearAuthData() - - // 断开WebSocket连接 - this.disconnectWebSocket() - - if (showMessage) { - ElMessage.success('已退出登录') - } - - // 跳转到登录页 - await router.push('/auth/login') - } - }, - - /** - * 刷新Token - */ - async refreshToken() { - try { - if (!this.refreshToken) { - throw new Error('没有刷新Token') - } - - const response = await authApi.refreshToken({ - refreshToken: this.refreshToken - }) - - // 更新Token信息 - this.token = response.token - this.refreshToken = response.refreshToken - this.tokenExpireTime = Date.now() + response.expiresIn * 1000 - - // 保存到本地存储 - setToken(response.token) - setRefreshToken(response.refreshToken) - - // 更新WebSocket连接 - const wsInstance = getWebSocketInstance() - wsInstance.updateToken(response.token) - - console.log('✅ Token刷新成功') - - return response - } catch (error) { - console.error('❌ Token刷新失败:', error) - // 刷新失败,执行登出 - await this.logout(false) - throw error - } - }, - - /** - * 检查认证状态 - */ - async checkAuthStatus() { - try { - if (!this.token) { - this.isLoggedIn = false - return false - } - - // 获取用户信息 - const userInfo = await authApi.getUserInfo() - - this.user = userInfo - this.isLoggedIn = true - this.permissions = userInfo.permissions || [] - this.roles = userInfo.roles || [] - - // 保存用户信息 - setUserInfo(userInfo) - - // 建立WebSocket连接 - this.connectWebSocket() - - return true - } catch (error) { - console.warn('认证状态检查失败:', error) - this.clearAuthData() - return false - } - }, - - /** - * 更新用户信息 - */ - async updateUserInfo(userInfo: Partial) { - if (this.user) { - this.user = { ...this.user, ...userInfo } - setUserInfo(this.user) - } - }, - - /** - * 检查Token是否需要刷新 - */ - async refreshTokenIfNeeded() { - if (this.isTokenExpiringSoon && this.refreshToken) { - try { - await this.refreshToken() - } catch (error) { - console.error('自动刷新Token失败:', error) - } - } - }, - - /** - * 设置认证数据 - */ - setAuthData(data: { - token: string - refreshToken: string - user: UserInfo - expiresIn?: number - }) { - this.token = data.token - this.refreshToken = data.refreshToken - this.user = data.user - this.isLoggedIn = true - this.permissions = data.user.permissions || [] - this.roles = data.user.roles || [] - - if (data.expiresIn) { - this.tokenExpireTime = Date.now() + data.expiresIn * 1000 - } - - // 保存到本地存储 - setToken(data.token) - setRefreshToken(data.refreshToken) - setUserInfo(data.user) - }, - - /** - * 清除认证数据 - */ - clearAuthData() { - this.user = null - this.token = null - this.refreshToken = null - this.tokenExpireTime = null - this.isLoggedIn = false - this.permissions = [] - this.roles = [] - - // 清除本地存储 - removeToken() - removeRefreshToken() - removeUserInfo() - }, - - /** - * 连接WebSocket - */ - connectWebSocket() { - if (this.token) { - const wsInstance = getWebSocketInstance({ - onTokenExpired: () => { - this.logout(false) - } - }) - wsInstance.connect(this.token) - } - }, - - /** - * 断开WebSocket连接 - */ - disconnectWebSocket() { - destroyWebSocketInstance() - }, - - /** - * 添加登录历史 - */ - addLoginHistory() { - const loginRecord = { - time: Date.now(), - ip: '', // 这里可以通过API获取 - device: navigator.userAgent, - location: '' // 这里可以通过地理位置API获取 - } - - this.loginHistory.unshift(loginRecord) - - // 限制历史记录数量 - if (this.loginHistory.length > 10) { - this.loginHistory = this.loginHistory.slice(0, 10) - } - }, - - /** - * 检查权限 - */ - checkPermission(permission: string): boolean { - return this.hasPermission(permission) - }, - - /** - * 检查角色 - */ - checkRole(role: string): boolean { - return this.hasRole(role) - } - } -}) diff --git a/web-new/src/stores/notification.ts b/web-new/src/stores/notification.ts deleted file mode 100644 index 6ef2ebd..0000000 --- a/web-new/src/stores/notification.ts +++ /dev/null @@ -1,382 +0,0 @@ -/** - * 通知状态管理 - */ - -import { defineStore } from 'pinia' -import { ref, computed } from 'vue' -import { ElNotification } from 'element-plus' -import storage from '@/utils/storage' -import { STORAGE_KEYS } from '@/config/constants' - -export interface NotificationItem { - id: string - type: 'message' | 'system' | 'user' | 'warning' | 'info' | 'success' | 'error' - title: string - message: string - read: boolean - createTime: number - data?: any - actions?: NotificationAction[] -} - -export interface NotificationAction { - label: string - action: string - type?: 'primary' | 'success' | 'warning' | 'danger' -} - -export interface NotificationSettings { - desktop: boolean - sound: boolean - vibration: boolean - showInApp: boolean - autoMarkRead: boolean - maxCount: number -} - -export const useNotificationStore = defineStore('notification', () => { - // 状态 - const notifications = ref([]) - const settings = ref({ - desktop: true, - sound: true, - vibration: true, - showInApp: true, - autoMarkRead: false, - maxCount: 100 - }) - const permission = ref('default') - - // 计算属性 - const unreadCount = computed(() => { - return notifications.value.filter(n => !n.read).length - }) - - const hasUnread = computed(() => { - return unreadCount.value > 0 - }) - - const recentNotifications = computed(() => { - return notifications.value - .sort((a, b) => b.createTime - a.createTime) - .slice(0, 10) - }) - - // 方法 - const requestPermission = async (): Promise => { - if (!('Notification' in window)) { - console.warn('浏览器不支持桌面通知') - return false - } - - if (Notification.permission === 'granted') { - permission.value = 'granted' - return true - } - - if (Notification.permission === 'denied') { - permission.value = 'denied' - return false - } - - try { - const result = await Notification.requestPermission() - permission.value = result - return result === 'granted' - } catch (error) { - console.error('请求通知权限失败:', error) - return false - } - } - - const addNotification = (notification: Omit) => { - const newNotification: NotificationItem = { - id: generateId(), - createTime: Date.now(), - read: false, - ...notification - } - - // 添加到列表开头 - notifications.value.unshift(newNotification) - - // 限制通知数量 - if (notifications.value.length > settings.value.maxCount) { - notifications.value = notifications.value.slice(0, settings.value.maxCount) - } - - // 显示通知 - if (settings.value.showInApp) { - showInAppNotification(newNotification) - } - - // 桌面通知 - if (settings.value.desktop && permission.value === 'granted') { - showDesktopNotification(newNotification) - } - - // 声音提醒 - if (settings.value.sound) { - playNotificationSound() - } - - // 震动提醒 - if (settings.value.vibration && 'vibrate' in navigator) { - navigator.vibrate([200, 100, 200]) - } - - // 保存到本地存储 - saveNotifications() - - return newNotification - } - - const markAsRead = (notificationId: string) => { - const notification = notifications.value.find(n => n.id === notificationId) - if (notification && !notification.read) { - notification.read = true - saveNotifications() - } - } - - const markAsUnread = (notificationId: string) => { - const notification = notifications.value.find(n => n.id === notificationId) - if (notification && notification.read) { - notification.read = false - saveNotifications() - } - } - - const markAllAsRead = () => { - notifications.value.forEach(n => { - n.read = true - }) - saveNotifications() - } - - const removeNotification = (notificationId: string) => { - const index = notifications.value.findIndex(n => n.id === notificationId) - if (index > -1) { - notifications.value.splice(index, 1) - saveNotifications() - } - } - - const clearAll = () => { - notifications.value = [] - saveNotifications() - } - - const clearRead = () => { - notifications.value = notifications.value.filter(n => !n.read) - saveNotifications() - } - - const updateSettings = (newSettings: Partial) => { - settings.value = { ...settings.value, ...newSettings } - saveSettings() - } - - const showInAppNotification = (notification: NotificationItem) => { - const type = getElNotificationType(notification.type) - - ElNotification({ - title: notification.title, - message: notification.message, - type, - duration: 4000, - showClose: true, - onClick: () => { - markAsRead(notification.id) - } - }) - } - - const showDesktopNotification = (notification: NotificationItem) => { - if (permission.value !== 'granted') return - - const desktopNotification = new Notification(notification.title, { - body: notification.message, - icon: '/favicon.ico', - tag: notification.id, - requireInteraction: false - }) - - desktopNotification.onclick = () => { - markAsRead(notification.id) - window.focus() - desktopNotification.close() - } - - // 自动关闭 - setTimeout(() => { - desktopNotification.close() - }, 5000) - } - - const playNotificationSound = () => { - try { - const audio = new Audio('/sounds/notification.mp3') - audio.volume = 0.5 - audio.play().catch(error => { - console.warn('播放通知声音失败:', error) - }) - } catch (error) { - console.warn('创建音频对象失败:', error) - } - } - - const getElNotificationType = (type: string): 'success' | 'warning' | 'info' | 'error' => { - switch (type) { - case 'success': - return 'success' - case 'warning': - return 'warning' - case 'error': - return 'error' - default: - return 'info' - } - } - - const generateId = (): string => { - return Date.now().toString(36) + Math.random().toString(36).substr(2) - } - - const saveNotifications = () => { - try { - storage.set(STORAGE_KEYS.NOTIFICATIONS, notifications.value) - } catch (error) { - console.error('保存通知失败:', error) - } - } - - const loadNotifications = () => { - try { - const saved = storage.get(STORAGE_KEYS.NOTIFICATIONS) - if (saved && Array.isArray(saved)) { - notifications.value = saved - } - } catch (error) { - console.error('加载通知失败:', error) - } - } - - const saveSettings = () => { - try { - storage.set(STORAGE_KEYS.NOTIFICATION_SETTINGS, settings.value) - } catch (error) { - console.error('保存通知设置失败:', error) - } - } - - const loadSettings = () => { - try { - const saved = storage.get(STORAGE_KEYS.NOTIFICATION_SETTINGS) - if (saved) { - settings.value = { ...settings.value, ...saved } - } - } catch (error) { - console.error('加载通知设置失败:', error) - } - } - - // 便捷方法 - const success = (title: string, message: string, data?: any) => { - return addNotification({ - type: 'success', - title, - message, - data - }) - } - - const error = (title: string, message: string, data?: any) => { - return addNotification({ - type: 'error', - title, - message, - data - }) - } - - const warning = (title: string, message: string, data?: any) => { - return addNotification({ - type: 'warning', - title, - message, - data - }) - } - - const info = (title: string, message: string, data?: any) => { - return addNotification({ - type: 'info', - title, - message, - data - }) - } - - const message = (title: string, message: string, data?: any) => { - return addNotification({ - type: 'message', - title, - message, - data - }) - } - - const system = (title: string, message: string, data?: any) => { - return addNotification({ - type: 'system', - title, - message, - data - }) - } - - // 初始化 - const init = async () => { - loadSettings() - loadNotifications() - - if (settings.value.desktop) { - await requestPermission() - } - } - - return { - // 状态 - notifications, - settings, - permission, - - // 计算属性 - unreadCount, - hasUnread, - recentNotifications, - - // 方法 - requestPermission, - addNotification, - markAsRead, - markAsUnread, - markAllAsRead, - removeNotification, - clearAll, - clearRead, - updateSettings, - - // 便捷方法 - success, - error, - warning, - info, - message, - system, - - // 初始化 - init - } -}) diff --git a/web-new/src/types/api.ts b/web-new/src/types/api.ts deleted file mode 100644 index b292660..0000000 --- a/web-new/src/types/api.ts +++ /dev/null @@ -1,316 +0,0 @@ -/** - * API 相关类型定义 - */ - -// 认证相关类型 -export interface LoginRequest { - username: string - password: string - captcha?: string - captchaId?: string - rememberMe?: boolean -} - -export interface LoginResponse { - token: string - refreshToken: string - user: UserInfo - expiresIn: number -} - -export interface RegisterRequest { - username: string - password: string - confirmPassword: string - email: string - phone?: string - captcha: string - captchaId: string - inviteCode?: string -} - -export interface RegisterResponse { - token: string - refreshToken: string - user: UserInfo -} - -export interface RefreshTokenRequest { - refreshToken: string -} - -export interface RefreshTokenResponse { - token: string - refreshToken: string - expiresIn: number -} - -export interface CaptchaResponse { - captchaId: string - captchaImage: string // base64 图片 -} - -export interface OAuthLoginRequest { - provider: 'wechat' | 'qq' | 'github' | 'google' - code: string - state?: string -} - -// 用户相关类型 -export interface UserInfo { - id: string - username: string - nickname: string - email: string - phone?: string - avatar: string - gender?: 'male' | 'female' | 'unknown' - birthday?: string - location?: string - bio?: string - status: 'active' | 'inactive' | 'banned' - roles: string[] - permissions: string[] - createTime: Timestamp - updateTime: Timestamp - lastLoginTime?: Timestamp -} - -export interface UpdateUserProfileRequest { - nickname?: string - email?: string - phone?: string - gender?: 'male' | 'female' | 'unknown' - birthday?: string - location?: string - bio?: string -} - -export interface ChangePasswordRequest { - oldPassword: string - newPassword: string - confirmPassword: string -} - -export interface UploadAvatarResponse { - url: string - thumbnailUrl?: string -} - -export interface VerifyEmailRequest { - email: string - code: string -} - -export interface SendEmailCodeRequest { - email: string - type: 'register' | 'reset_password' | 'verify_email' -} - -export interface VerifyPhoneRequest { - phone: string - code: string -} - -export interface SendPhoneCodeRequest { - phone: string - type: 'register' | 'reset_password' | 'verify_phone' -} - -// 用户成长数据类型 -export interface UserGrowthStats { - totalDays: number - totalMessages: number - totalDiaries: number - emotionDistribution: { - [emotion: string]: number - } - weeklyActivity: { - date: string - count: number - }[] - monthlyTrend: { - month: string - messages: number - diaries: number - }[] - achievements: Achievement[] -} - -export interface Achievement { - id: string - name: string - description: string - icon: string - unlockTime: Timestamp - category: string -} - -// 对话相关类型 -export interface CreateConversationRequest { - title?: string - type: 'chat' | 'support' -} - -export interface ConversationInfo { - id: string - title: string - type: 'chat' | 'support' - userId: string - status: 'active' | 'archived' | 'deleted' - createTime: Timestamp - updateTime: Timestamp - lastMessageTime?: Timestamp - messageCount: number -} - -export interface GetUserConversationsRequest extends PageRequest { - status?: 'active' | 'archived' - type?: 'chat' | 'support' -} - -// 消息相关类型 -export interface MessageInfo { - id: string - conversationId: string - content: string - type: 'text' | 'image' | 'file' | 'emoji' | 'system' - senderId: string - senderType: 'USER' | 'AI' | 'SYSTEM' - senderName: string - senderAvatar?: string - status: 'sending' | 'sent' | 'delivered' | 'read' | 'failed' - timestamp: Timestamp - replyTo?: string - metadata?: { - fileSize?: number - fileName?: string - imageWidth?: number - imageHeight?: number - emotion?: string - confidence?: number - } -} - -export interface GetUserMessagesRequest extends PageRequest { - conversationId?: string - type?: 'text' | 'image' | 'file' | 'emoji' | 'system' - startTime?: Timestamp - endTime?: Timestamp -} - -export interface SearchUserMessagesRequest extends PageRequest { - keyword: string - conversationId?: string - type?: 'text' | 'image' | 'file' | 'emoji' | 'system' - startTime?: Timestamp - endTime?: Timestamp -} - -export interface GetRecentMessagesRequest { - limit?: number - conversationId?: string -} - -// 日记相关类型 -export interface DiaryPost { - id: string - userId: string - title: string - content: string - emotion: string - mood: number // 1-10 - weather?: string - location?: string - tags: string[] - images: string[] - isPublic: boolean - status: 'draft' | 'published' | 'archived' - createTime: Timestamp - updateTime: Timestamp - viewCount: number - likeCount: number - commentCount: number - aiComment?: { - content: string - emotion: string - suggestions: string[] - generateTime: Timestamp - } -} - -export interface PublishDiaryRequest { - title: string - content: string - emotion: string - mood: number - weather?: string - location?: string - tags: string[] - images: string[] - isPublic: boolean -} - -export interface GetUserDiariesRequest extends PageRequest { - status?: 'draft' | 'published' | 'archived' - emotion?: string - startTime?: Timestamp - endTime?: Timestamp - keyword?: string -} - -// WebSocket 消息类型 -export interface WSMessage { - type: string - data: T - timestamp: Timestamp - messageId: string -} - -export interface WSChatMessage { - conversationId: string - content: string - type: 'text' | 'image' | 'file' | 'emoji' - replyTo?: string - metadata?: any -} - -export interface WSTypingMessage { - conversationId: string - isTyping: boolean -} - -export interface WSNotificationMessage { - id: string - type: 'system' | 'chat' | 'diary' | 'achievement' - title: string - content: string - data?: any -} - -// 文件上传类型 -export interface UploadFileRequest { - file: File - type: 'avatar' | 'image' | 'document' - category?: string -} - -export interface UploadFileResponse { - id: string - name: string - size: number - type: string - url: string - thumbnailUrl?: string - uploadTime: Timestamp -} - -// 错误响应类型 -export interface ErrorResponse { - code: number - message: string - details?: any - timestamp: Timestamp - path?: string - method?: string -} diff --git a/web-new/src/types/global.d.ts b/web-new/src/types/global.d.ts deleted file mode 100644 index d994bd4..0000000 --- a/web-new/src/types/global.d.ts +++ /dev/null @@ -1,228 +0,0 @@ -/** - * 全局类型定义 - */ - -declare global { - // 环境变量类型 - interface ImportMetaEnv { - readonly VITE_APP_ENV: string - readonly VITE_APP_TITLE: string - readonly VITE_APP_VERSION: string - readonly VITE_API_BASE_URL: string - readonly VITE_WS_BASE_URL: string - readonly VITE_UPLOAD_URL: string - readonly VITE_DEBUG: string - readonly VITE_MOCK: string - readonly VITE_APP_DESCRIPTION: string - } - - interface ImportMeta { - readonly env: ImportMetaEnv - } - - // 窗口对象扩展 - interface Window { - // 全局配置 - __APP_CONFIG__?: { - version: string - buildTime: string - env: string - } - - // 第三方库 - AMap?: any - BMap?: any - - // 调试工具 - __VUE_DEVTOOLS_GLOBAL_HOOK__?: any - } - - // 通用响应类型 - interface ApiResponse { - code: number - message: string - data: T - success: boolean - timestamp: number - } - - // 分页响应类型 - interface PageResponse { - list: T[] - total: number - page: number - pageSize: number - totalPages: number - } - - // 分页请求类型 - interface PageRequest { - page?: number - pageSize?: number - sortBy?: string - sortOrder?: 'asc' | 'desc' - } - - // 通用ID类型 - type ID = string | number - - // 时间戳类型 - type Timestamp = number - - // 文件类型 - interface FileInfo { - id: string - name: string - size: number - type: string - url: string - uploadTime: Timestamp - } - - // 坐标类型 - interface Coordinate { - latitude: number - longitude: number - } - - // 键值对类型 - interface KeyValue { - [key: string]: T - } - - // 选项类型 - interface Option { - label: string - value: T - disabled?: boolean - children?: Option[] - } - - // 菜单项类型 - interface MenuItem { - id: string - title: string - icon?: string - path?: string - children?: MenuItem[] - meta?: { - requireAuth?: boolean - roles?: string[] - hidden?: boolean - } - } - - // 面包屑类型 - interface BreadcrumbItem { - title: string - path?: string - icon?: string - } - - // 表格列类型 - interface TableColumn { - prop: string - label: string - width?: number | string - minWidth?: number | string - fixed?: boolean | 'left' | 'right' - sortable?: boolean - formatter?: (row: any, column: any, cellValue: any) => string - } - - // 表单规则类型 - interface FormRule { - required?: boolean - message?: string - trigger?: string | string[] - min?: number - max?: number - pattern?: RegExp - validator?: (rule: any, value: any, callback: any) => void - } - - // 图表数据类型 - interface ChartData { - name: string - value: number - color?: string - } - - // 统计数据类型 - interface StatData { - title: string - value: number | string - unit?: string - trend?: 'up' | 'down' | 'stable' - trendValue?: number - icon?: string - color?: string - } - - // 通知类型 - interface NotificationData { - id: string - title: string - content: string - type: 'info' | 'success' | 'warning' | 'error' - read: boolean - createTime: Timestamp - link?: string - } - - // 错误信息类型 - interface ErrorInfo { - code: string | number - message: string - details?: any - stack?: string - timestamp: Timestamp - } - - // 主题配置类型 - interface ThemeConfig { - primaryColor: string - backgroundColor: string - textColor: string - borderColor: string - shadowColor: string - } - - // 用户偏好设置类型 - interface UserPreferences { - theme: 'light' | 'dark' | 'auto' - language: string - timezone: string - notifications: { - email: boolean - push: boolean - sms: boolean - } - } - - // 设备信息类型 - interface DeviceInfo { - userAgent: string - platform: string - isMobile: boolean - isTablet: boolean - isDesktop: boolean - browser: string - browserVersion: string - os: string - osVersion: string - } - - // 地理位置类型 - interface LocationInfo { - country: string - province: string - city: string - district?: string - address?: string - coordinate?: Coordinate - } -} - -// 确保这个文件被当作模块处理 -export {} diff --git a/web-new/src/utils/format.ts b/web-new/src/utils/format.ts deleted file mode 100644 index 60697d2..0000000 --- a/web-new/src/utils/format.ts +++ /dev/null @@ -1,353 +0,0 @@ -/** - * 格式化工具函数 - * 提供日期、数字、文件大小等格式化功能 - */ - -import dayjs from 'dayjs' -import relativeTime from 'dayjs/plugin/relativeTime' -import duration from 'dayjs/plugin/duration' -import 'dayjs/locale/zh-cn' - -// 扩展dayjs插件 -dayjs.extend(relativeTime) -dayjs.extend(duration) -dayjs.locale('zh-cn') - -/** - * 格式化日期时间 - */ -export const formatDateTime = ( - date: string | number | Date, - format = 'YYYY-MM-DD HH:mm:ss' -): string => { - if (!date) return '' - return dayjs(date).format(format) -} - -/** - * 格式化日期 - */ -export const formatDate = (date: string | number | Date): string => { - return formatDateTime(date, 'YYYY-MM-DD') -} - -/** - * 格式化时间 - */ -export const formatTime = (date: string | number | Date): string => { - return formatDateTime(date, 'HH:mm:ss') -} - -/** - * 格式化相对时间 - */ -export const formatRelativeTime = (date: string | number | Date): string => { - if (!date) return '' - return dayjs(date).fromNow() -} - -/** - * 格式化持续时间 - */ -export const formatDuration = (milliseconds: number): string => { - const duration = dayjs.duration(milliseconds) - - if (duration.asHours() >= 1) { - return duration.format('H小时m分钟') - } else if (duration.asMinutes() >= 1) { - return duration.format('m分钟s秒') - } else { - return duration.format('s秒') - } -} - -/** - * 格式化文件大小 - */ -export const formatFileSize = (bytes: number): string => { - if (bytes === 0) return '0 B' - - const k = 1024 - const sizes = ['B', 'KB', 'MB', 'GB', 'TB'] - const i = Math.floor(Math.log(bytes) / Math.log(k)) - - return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i] -} - -/** - * 格式化数字 - */ -export const formatNumber = ( - num: number, - options: { - decimals?: number - separator?: string - prefix?: string - suffix?: string - } = {} -): string => { - const { - decimals = 0, - separator = ',', - prefix = '', - suffix = '' - } = options - - const parts = num.toFixed(decimals).split('.') - parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, separator) - - return prefix + parts.join('.') + suffix -} - -/** - * 格式化百分比 - */ -export const formatPercentage = ( - value: number, - total: number, - decimals = 1 -): string => { - if (total === 0) return '0%' - const percentage = (value / total) * 100 - return `${percentage.toFixed(decimals)}%` -} - -/** - * 格式化货币 - */ -export const formatCurrency = ( - amount: number, - currency = '¥', - decimals = 2 -): string => { - return currency + formatNumber(amount, { decimals, separator: ',' }) -} - -/** - * 格式化手机号 - */ -export const formatPhone = (phone: string): string => { - if (!phone) return '' - - // 移除所有非数字字符 - const cleaned = phone.replace(/\D/g, '') - - // 中国手机号格式化 - if (cleaned.length === 11) { - return cleaned.replace(/(\d{3})(\d{4})(\d{4})/, '$1 $2 $3') - } - - return phone -} - -/** - * 格式化身份证号 - */ -export const formatIdCard = (idCard: string): string => { - if (!idCard) return '' - - // 移除所有非字母数字字符 - const cleaned = idCard.replace(/[^0-9X]/gi, '') - - if (cleaned.length === 18) { - return cleaned.replace(/(\d{6})(\d{8})(\d{3}[0-9X])/i, '$1 $2 $3') - } - - return idCard -} - -/** - * 格式化银行卡号 - */ -export const formatBankCard = (cardNumber: string): string => { - if (!cardNumber) return '' - - // 移除所有非数字字符 - const cleaned = cardNumber.replace(/\D/g, '') - - // 每4位添加一个空格 - return cleaned.replace(/(\d{4})(?=\d)/g, '$1 ') -} - -/** - * 脱敏处理 - */ -export const maskString = ( - str: string, - start = 3, - end = 4, - mask = '*' -): string => { - if (!str || str.length <= start + end) return str - - const startStr = str.substring(0, start) - const endStr = str.substring(str.length - end) - const maskStr = mask.repeat(str.length - start - end) - - return startStr + maskStr + endStr -} - -/** - * 脱敏手机号 - */ -export const maskPhone = (phone: string): string => { - return maskString(phone, 3, 4) -} - -/** - * 脱敏邮箱 - */ -export const maskEmail = (email: string): string => { - if (!email || !email.includes('@')) return email - - const [username, domain] = email.split('@') - const maskedUsername = maskString(username, 1, 1) - - return `${maskedUsername}@${domain}` -} - -/** - * 脱敏身份证 - */ -export const maskIdCard = (idCard: string): string => { - return maskString(idCard, 6, 4) -} - -/** - * 脱敏银行卡 - */ -export const maskBankCard = (cardNumber: string): string => { - return maskString(cardNumber, 4, 4) -} - -/** - * 格式化地址 - */ -export const formatAddress = ( - province?: string, - city?: string, - district?: string, - detail?: string -): string => { - const parts = [province, city, district, detail].filter(Boolean) - return parts.join('') -} - -/** - * 截断文本 - */ -export const truncateText = ( - text: string, - maxLength: number, - suffix = '...' -): string => { - if (!text || text.length <= maxLength) return text - - return text.substring(0, maxLength - suffix.length) + suffix -} - -/** - * 格式化JSON - */ -export const formatJSON = (obj: any, indent = 2): string => { - try { - return JSON.stringify(obj, null, indent) - } catch { - return String(obj) - } -} - -/** - * 格式化URL参数 - */ -export const formatUrlParams = (params: Record): string => { - const searchParams = new URLSearchParams() - - Object.entries(params).forEach(([key, value]) => { - if (value !== null && value !== undefined && value !== '') { - searchParams.append(key, String(value)) - } - }) - - return searchParams.toString() -} - -/** - * 解析URL参数 - */ -export const parseUrlParams = (url: string): Record => { - const params: Record = {} - - try { - const urlObj = new URL(url) - urlObj.searchParams.forEach((value, key) => { - params[key] = value - }) - } catch { - // 如果不是完整URL,尝试解析查询字符串 - const queryString = url.includes('?') ? url.split('?')[1] : url - const searchParams = new URLSearchParams(queryString) - searchParams.forEach((value, key) => { - params[key] = value - }) - } - - return params -} - -/** - * 格式化HTML为纯文本 - */ -export const formatHtmlToText = (html: string): string => { - if (!html) return '' - - // 创建临时DOM元素 - const temp = document.createElement('div') - temp.innerHTML = html - - return temp.textContent || temp.innerText || '' -} - -/** - * 格式化换行符为HTML - */ -export const formatTextToHtml = (text: string): string => { - if (!text) return '' - - return text - .replace(/&/g, '&') - .replace(//g, '>') - .replace(/"/g, '"') - .replace(/'/g, ''') - .replace(/\n/g, '
') -} - -/** - * 格式化颜色值 - */ -export const formatColor = (color: string): string => { - if (!color) return '' - - // 如果是hex颜色,确保有#前缀 - if (/^[0-9A-F]{6}$/i.test(color)) { - return `#${color}` - } - - return color -} - -/** - * 格式化版本号 - */ -export const formatVersion = (version: string): string => { - if (!version) return '' - - // 确保版本号格式为 x.y.z - const parts = version.split('.') - while (parts.length < 3) { - parts.push('0') - } - - return parts.slice(0, 3).join('.') -} diff --git a/web-new/src/utils/performance.ts b/web-new/src/utils/performance.ts deleted file mode 100644 index 396b4cb..0000000 --- a/web-new/src/utils/performance.ts +++ /dev/null @@ -1,384 +0,0 @@ -/** - * 性能优化工具 - */ - -// 防抖函数 -export function debounce any>( - func: T, - wait: number, - immediate = false -): (...args: Parameters) => void { - let timeout: NodeJS.Timeout | null = null - - return function executedFunction(...args: Parameters) { - const later = () => { - timeout = null - if (!immediate) func(...args) - } - - const callNow = immediate && !timeout - - if (timeout) clearTimeout(timeout) - timeout = setTimeout(later, wait) - - if (callNow) func(...args) - } -} - -// 节流函数 -export function throttle any>( - func: T, - limit: number -): (...args: Parameters) => void { - let inThrottle: boolean - - return function executedFunction(...args: Parameters) { - if (!inThrottle) { - func.apply(this, args) - inThrottle = true - setTimeout(() => inThrottle = false, limit) - } - } -} - -// 延迟执行 -export function delay(ms: number): Promise { - return new Promise(resolve => setTimeout(resolve, ms)) -} - -// 空闲时执行 -export function requestIdleCallback(callback: () => void, timeout = 5000): void { - if ('requestIdleCallback' in window) { - window.requestIdleCallback(callback, { timeout }) - } else { - setTimeout(callback, 1) - } -} - -// 图片懒加载 -export class LazyImageLoader { - private observer: IntersectionObserver | null = null - private images: Set = new Set() - - constructor(options: IntersectionObserverInit = {}) { - if ('IntersectionObserver' in window) { - this.observer = new IntersectionObserver( - this.handleIntersection.bind(this), - { - rootMargin: '50px', - threshold: 0.1, - ...options - } - ) - } - } - - observe(img: HTMLImageElement): void { - if (this.observer) { - this.images.add(img) - this.observer.observe(img) - } else { - // 降级处理 - this.loadImage(img) - } - } - - unobserve(img: HTMLImageElement): void { - if (this.observer) { - this.images.delete(img) - this.observer.unobserve(img) - } - } - - private handleIntersection(entries: IntersectionObserverEntry[]): void { - entries.forEach(entry => { - if (entry.isIntersecting) { - const img = entry.target as HTMLImageElement - this.loadImage(img) - this.unobserve(img) - } - }) - } - - private loadImage(img: HTMLImageElement): void { - const src = img.dataset.src - if (src) { - img.src = src - img.removeAttribute('data-src') - img.classList.add('loaded') - } - } - - disconnect(): void { - if (this.observer) { - this.observer.disconnect() - this.images.clear() - } - } -} - -// 虚拟滚动 -export class VirtualScroller { - private container: HTMLElement - private items: any[] - private itemHeight: number - private visibleCount: number - private startIndex = 0 - private endIndex = 0 - private scrollTop = 0 - - constructor( - container: HTMLElement, - items: any[], - itemHeight: number, - renderItem: (item: any, index: number) => HTMLElement - ) { - this.container = container - this.items = items - this.itemHeight = itemHeight - this.visibleCount = Math.ceil(container.clientHeight / itemHeight) + 2 - - this.setupContainer() - this.bindEvents() - this.updateVisibleItems() - } - - private setupContainer(): void { - this.container.style.position = 'relative' - this.container.style.overflow = 'auto' - - // 创建占位元素 - const spacer = document.createElement('div') - spacer.style.height = `${this.items.length * this.itemHeight}px` - spacer.style.position = 'absolute' - spacer.style.top = '0' - spacer.style.left = '0' - spacer.style.width = '1px' - spacer.style.pointerEvents = 'none' - this.container.appendChild(spacer) - } - - private bindEvents(): void { - this.container.addEventListener('scroll', throttle(() => { - this.scrollTop = this.container.scrollTop - this.updateVisibleItems() - }, 16)) - } - - private updateVisibleItems(): void { - const newStartIndex = Math.floor(this.scrollTop / this.itemHeight) - const newEndIndex = Math.min( - newStartIndex + this.visibleCount, - this.items.length - ) - - if (newStartIndex !== this.startIndex || newEndIndex !== this.endIndex) { - this.startIndex = newStartIndex - this.endIndex = newEndIndex - this.renderVisibleItems() - } - } - - private renderVisibleItems(): void { - // 清除现有项目(除了占位元素) - const children = Array.from(this.container.children) - children.slice(1).forEach(child => child.remove()) - - // 渲染可见项目 - for (let i = this.startIndex; i < this.endIndex; i++) { - const item = this.items[i] - const element = this.renderItem(item, i) - element.style.position = 'absolute' - element.style.top = `${i * this.itemHeight}px` - element.style.width = '100%' - this.container.appendChild(element) - } - } - - private renderItem(item: any, index: number): HTMLElement { - // 默认渲染函数,应该被重写 - const div = document.createElement('div') - div.textContent = `Item ${index}` - div.style.height = `${this.itemHeight}px` - return div - } - - updateItems(newItems: any[]): void { - this.items = newItems - this.updateVisibleItems() - - // 更新占位元素高度 - const spacer = this.container.firstElementChild as HTMLElement - if (spacer) { - spacer.style.height = `${this.items.length * this.itemHeight}px` - } - } -} - -// 内存管理 -export class MemoryManager { - private cache = new Map() - private maxSize: number - private ttl: number - - constructor(maxSize = 100, ttl = 5 * 60 * 1000) { // 默认5分钟TTL - this.maxSize = maxSize - this.ttl = ttl - } - - set(key: string, value: any): void { - // 如果缓存已满,删除最旧的项 - if (this.cache.size >= this.maxSize) { - const firstKey = this.cache.keys().next().value - this.cache.delete(firstKey) - } - - this.cache.set(key, { - value, - timestamp: Date.now() - }) - } - - get(key: string): any { - const item = this.cache.get(key) - - if (!item) return null - - // 检查是否过期 - if (Date.now() - item.timestamp > this.ttl) { - this.cache.delete(key) - return null - } - - return item.value - } - - delete(key: string): boolean { - return this.cache.delete(key) - } - - clear(): void { - this.cache.clear() - } - - cleanup(): void { - const now = Date.now() - for (const [key, item] of this.cache.entries()) { - if (now - item.timestamp > this.ttl) { - this.cache.delete(key) - } - } - } - - size(): number { - return this.cache.size - } -} - -// 性能监控 -export class PerformanceMonitor { - private metrics: Map = new Map() - - mark(name: string): void { - if ('performance' in window && performance.mark) { - performance.mark(name) - } - } - - measure(name: string, startMark: string, endMark?: string): number { - if ('performance' in window && performance.measure) { - performance.measure(name, startMark, endMark) - - const entries = performance.getEntriesByName(name, 'measure') - if (entries.length > 0) { - const duration = entries[entries.length - 1].duration - this.recordMetric(name, duration) - return duration - } - } - return 0 - } - - recordMetric(name: string, value: number): void { - if (!this.metrics.has(name)) { - this.metrics.set(name, []) - } - - const values = this.metrics.get(name)! - values.push(value) - - // 保持最近100个值 - if (values.length > 100) { - values.shift() - } - } - - getMetrics(name: string): { avg: number; min: number; max: number } | null { - const values = this.metrics.get(name) - if (!values || values.length === 0) return null - - const avg = values.reduce((sum, val) => sum + val, 0) / values.length - const min = Math.min(...values) - const max = Math.max(...values) - - return { avg, min, max } - } - - getAllMetrics(): Record { - const result: Record = {} - - for (const [name] of this.metrics) { - const metrics = this.getMetrics(name) - if (metrics) { - result[name] = metrics - } - } - - return result - } - - clear(): void { - this.metrics.clear() - if ('performance' in window && performance.clearMarks) { - performance.clearMarks() - performance.clearMeasures() - } - } -} - -// 单例实例 -export const lazyImageLoader = new LazyImageLoader() -export const memoryManager = new MemoryManager() -export const performanceMonitor = new PerformanceMonitor() - -// 工具函数 -export function measureAsync( - name: string, - asyncFn: () => Promise -): Promise { - performanceMonitor.mark(`${name}-start`) - - return asyncFn().finally(() => { - performanceMonitor.mark(`${name}-end`) - performanceMonitor.measure(name, `${name}-start`, `${name}-end`) - }) -} - -export function memoize any>( - fn: T, - keyGenerator?: (...args: Parameters) => string -): T { - const cache = new Map>() - - return ((...args: Parameters): ReturnType => { - const key = keyGenerator ? keyGenerator(...args) : JSON.stringify(args) - - if (cache.has(key)) { - return cache.get(key)! - } - - const result = fn(...args) - cache.set(key, result) - return result - }) as T -} diff --git a/web-new/src/utils/request.ts b/web-new/src/utils/request.ts deleted file mode 100644 index 2dcadc0..0000000 --- a/web-new/src/utils/request.ts +++ /dev/null @@ -1,346 +0,0 @@ -/** - * HTTP请求工具 - * 基于Axios封装,支持请求拦截、响应拦截、错误处理等 - */ - -import axios, { type AxiosInstance, type AxiosRequestConfig, type AxiosResponse } from 'axios' -import { ElMessage, ElMessageBox } from 'element-plus' -import { envConfig } from '@/config/env' -import { STORAGE_KEYS, ERROR_CODES } from '@/config/constants' -import { useAuthStore } from '@/stores/auth' -import { useAppStore } from '@/stores/app' -import router from '@/router' - -// 请求配置接口 -interface RequestConfig extends AxiosRequestConfig { - skipAuth?: boolean - skipErrorHandler?: boolean - showLoading?: boolean - loadingText?: string -} - -// 响应数据接口 -interface ResponseData { - code: number - message: string - data: T - success: boolean - timestamp: number -} - -class RequestService { - private instance: AxiosInstance - private pendingRequests = new Map() - - constructor() { - // 创建axios实例 - this.instance = axios.create({ - baseURL: envConfig.apiBaseUrl, - timeout: 30000, - headers: { - 'Content-Type': 'application/json;charset=UTF-8' - } - }) - - // 设置请求拦截器 - this.setupRequestInterceptor() - - // 设置响应拦截器 - this.setupResponseInterceptor() - } - - /** - * 设置请求拦截器 - */ - private setupRequestInterceptor() { - this.instance.interceptors.request.use( - (config: any) => { - const requestConfig = config as RequestConfig - - // 生成请求ID用于追踪 - const requestId = this.generateRequestId(config) - config.metadata = { requestId } - - // 处理重复请求 - this.handleDuplicateRequest(config, requestId) - - // 添加认证头 - if (!requestConfig.skipAuth) { - const token = this.getToken() - if (token) { - config.headers.Authorization = `Bearer ${token}` - } - } - - // 显示加载状态 - if (requestConfig.showLoading) { - const appStore = useAppStore() - appStore.setLoading(true, requestConfig.loadingText) - } - - // 调试模式下打印请求信息 - if (envConfig.debug) { - console.log('🚀 发送请求:', { - url: config.url, - method: config.method, - params: config.params, - data: config.data, - headers: config.headers - }) - } - - return config - }, - (error) => { - console.error('❌ 请求拦截器错误:', error) - return Promise.reject(error) - } - ) - } - - /** - * 设置响应拦截器 - */ - private setupResponseInterceptor() { - this.instance.interceptors.response.use( - (response: AxiosResponse) => { - const config = response.config as RequestConfig - const requestId = config.metadata?.requestId - - // 移除pending请求 - if (requestId) { - this.pendingRequests.delete(requestId) - } - - // 隐藏加载状态 - if (config.showLoading) { - const appStore = useAppStore() - appStore.setLoading(false) - } - - // 调试模式下打印响应信息 - if (envConfig.debug) { - console.log('✅ 收到响应:', { - url: response.config.url, - status: response.status, - data: response.data - }) - } - - const { data } = response - - // 处理业务状态码 - if (data.code === 200 || data.success) { - return data.data - } else { - return this.handleBusinessError(data, config) - } - }, - (error) => { - const config = error.config as RequestConfig - const requestId = config?.metadata?.requestId - - // 移除pending请求 - if (requestId) { - this.pendingRequests.delete(requestId) - } - - // 隐藏加载状态 - if (config?.showLoading) { - const appStore = useAppStore() - appStore.setLoading(false) - } - - return this.handleRequestError(error, config) - } - ) - } - - /** - * 生成请求ID - */ - private generateRequestId(config: AxiosRequestConfig): string { - const { method, url, params, data } = config - return `${method}_${url}_${JSON.stringify(params)}_${JSON.stringify(data)}_${Date.now()}` - } - - /** - * 处理重复请求 - */ - private handleDuplicateRequest(config: AxiosRequestConfig, requestId: string) { - const duplicateKey = `${config.method}_${config.url}` - - // 取消之前的相同请求 - if (this.pendingRequests.has(duplicateKey)) { - const controller = this.pendingRequests.get(duplicateKey) - controller?.abort('请求被取消:发起了新的相同请求') - } - - // 创建新的AbortController - const controller = new AbortController() - config.signal = controller.signal - this.pendingRequests.set(duplicateKey, controller) - } - - /** - * 获取Token - */ - private getToken(): string | null { - return localStorage.getItem(STORAGE_KEYS.TOKEN) - } - - /** - * 处理业务错误 - */ - private handleBusinessError(data: ResponseData, config: RequestConfig) { - if (config.skipErrorHandler) { - return Promise.reject(data) - } - - // 特殊错误码处理 - switch (data.code) { - case ERROR_CODES.UNAUTHORIZED: - this.handleUnauthorized() - break - case ERROR_CODES.FORBIDDEN: - ElMessage.error('权限不足,无法访问该资源') - break - case ERROR_CODES.NOT_FOUND: - ElMessage.error('请求的资源不存在') - break - default: - ElMessage.error(data.message || '请求失败') - } - - return Promise.reject(data) - } - - /** - * 处理请求错误 - */ - private handleRequestError(error: any, config: RequestConfig) { - if (config?.skipErrorHandler) { - return Promise.reject(error) - } - - let message = '网络错误,请稍后重试' - - if (error.code === 'ECONNABORTED') { - message = '请求超时,请稍后重试' - } else if (error.response) { - const { status } = error.response - switch (status) { - case ERROR_CODES.UNAUTHORIZED: - this.handleUnauthorized() - return Promise.reject(error) - case ERROR_CODES.FORBIDDEN: - message = '权限不足,无法访问该资源' - break - case ERROR_CODES.NOT_FOUND: - message = '请求的资源不存在' - break - case ERROR_CODES.INTERNAL_SERVER_ERROR: - message = '服务器内部错误' - break - default: - message = `请求失败 (${status})` - } - } else if (error.request) { - message = '网络连接失败,请检查网络设置' - } - - ElMessage.error(message) - return Promise.reject(error) - } - - /** - * 处理未授权错误 - */ - private async handleUnauthorized() { - const authStore = useAuthStore() - - try { - // 尝试刷新Token - await authStore.refreshToken() - } catch { - // 刷新失败,跳转到登录页 - ElMessageBox.alert('登录已过期,请重新登录', '提示', { - confirmButtonText: '确定', - type: 'warning' - }).then(() => { - authStore.logout() - router.push('/login') - }) - } - } - - /** - * GET请求 - */ - get(url: string, params?: any, config?: RequestConfig): Promise { - return this.instance.get(url, { params, ...config }) - } - - /** - * POST请求 - */ - post(url: string, data?: any, config?: RequestConfig): Promise { - return this.instance.post(url, data, config) - } - - /** - * PUT请求 - */ - put(url: string, data?: any, config?: RequestConfig): Promise { - return this.instance.put(url, data, config) - } - - /** - * DELETE请求 - */ - delete(url: string, config?: RequestConfig): Promise { - return this.instance.delete(url, config) - } - - /** - * 上传文件 - */ - upload(url: string, file: File, config?: RequestConfig): Promise { - const formData = new FormData() - formData.append('file', file) - - return this.instance.post(url, formData, { - headers: { - 'Content-Type': 'multipart/form-data' - }, - ...config - }) - } - - /** - * 取消所有请求 - */ - cancelAllRequests() { - this.pendingRequests.forEach((controller) => { - controller.abort('用户取消请求') - }) - this.pendingRequests.clear() - } - - /** - * 取消指定请求 - */ - cancelRequest(requestId: string) { - const controller = this.pendingRequests.get(requestId) - if (controller) { - controller.abort('用户取消请求') - this.pendingRequests.delete(requestId) - } - } -} - -// 创建请求实例 -const request = new RequestService() - -export default request -export { type RequestConfig } diff --git a/web-new/src/utils/storage.ts b/web-new/src/utils/storage.ts deleted file mode 100644 index 0b82236..0000000 --- a/web-new/src/utils/storage.ts +++ /dev/null @@ -1,339 +0,0 @@ -/** - * 本地存储工具 - * 支持localStorage、sessionStorage,提供加密存储功能 - */ - -import { STORAGE_KEYS } from '@/config/constants' - -// 存储类型 -type StorageType = 'localStorage' | 'sessionStorage' - -// 存储选项 -interface StorageOptions { - type?: StorageType - encrypt?: boolean - expire?: number // 过期时间(毫秒) -} - -// 存储数据结构 -interface StorageData { - value: T - expire?: number - timestamp: number -} - -class StorageService { - private readonly prefix = 'emotion_museum_' - - /** - * 获取存储实例 - */ - private getStorage(type: StorageType): Storage { - return type === 'localStorage' ? localStorage : sessionStorage - } - - /** - * 生成存储键名 - */ - private getKey(key: string): string { - return `${this.prefix}${key}` - } - - /** - * 简单加密 - */ - private encrypt(data: string): string { - try { - return btoa(encodeURIComponent(data)) - } catch { - return data - } - } - - /** - * 简单解密 - */ - private decrypt(data: string): string { - try { - return decodeURIComponent(atob(data)) - } catch { - return data - } - } - - /** - * 检查是否过期 - */ - private isExpired(data: StorageData): boolean { - if (!data.expire) return false - return Date.now() > data.expire - } - - /** - * 设置存储 - */ - set(key: string, value: T, options: StorageOptions = {}): boolean { - try { - const { - type = 'localStorage', - encrypt = false, - expire - } = options - - const storage = this.getStorage(type) - const storageKey = this.getKey(key) - - const data: StorageData = { - value, - timestamp: Date.now(), - expire: expire ? Date.now() + expire : undefined - } - - let serializedData = JSON.stringify(data) - - if (encrypt) { - serializedData = this.encrypt(serializedData) - } - - storage.setItem(storageKey, serializedData) - return true - } catch (error) { - console.error('存储设置失败:', error) - return false - } - } - - /** - * 获取存储 - */ - get(key: string, options: StorageOptions = {}): T | null { - try { - const { - type = 'localStorage', - encrypt = false - } = options - - const storage = this.getStorage(type) - const storageKey = this.getKey(key) - - let serializedData = storage.getItem(storageKey) - - if (!serializedData) return null - - if (encrypt) { - serializedData = this.decrypt(serializedData) - } - - const data: StorageData = JSON.parse(serializedData) - - // 检查是否过期 - if (this.isExpired(data)) { - this.remove(key, options) - return null - } - - return data.value - } catch (error) { - console.error('存储获取失败:', error) - return null - } - } - - /** - * 移除存储 - */ - remove(key: string, options: StorageOptions = {}): boolean { - try { - const { type = 'localStorage' } = options - const storage = this.getStorage(type) - const storageKey = this.getKey(key) - - storage.removeItem(storageKey) - return true - } catch (error) { - console.error('存储移除失败:', error) - return false - } - } - - /** - * 清空存储 - */ - clear(type: StorageType = 'localStorage'): boolean { - try { - const storage = this.getStorage(type) - - // 只清除带有前缀的项目 - const keys = Object.keys(storage) - keys.forEach(key => { - if (key.startsWith(this.prefix)) { - storage.removeItem(key) - } - }) - - return true - } catch (error) { - console.error('存储清空失败:', error) - return false - } - } - - /** - * 获取存储大小 - */ - getSize(type: StorageType = 'localStorage'): number { - try { - const storage = this.getStorage(type) - let size = 0 - - for (const key in storage) { - if (key.startsWith(this.prefix)) { - size += storage[key].length - } - } - - return size - } catch { - return 0 - } - } - - /** - * 检查存储是否可用 - */ - isAvailable(type: StorageType = 'localStorage'): boolean { - try { - const storage = this.getStorage(type) - const testKey = '__storage_test__' - - storage.setItem(testKey, 'test') - storage.removeItem(testKey) - - return true - } catch { - return false - } - } - - /** - * 获取所有键名 - */ - getKeys(type: StorageType = 'localStorage'): string[] { - try { - const storage = this.getStorage(type) - const keys: string[] = [] - - for (let i = 0; i < storage.length; i++) { - const key = storage.key(i) - if (key && key.startsWith(this.prefix)) { - keys.push(key.replace(this.prefix, '')) - } - } - - return keys - } catch { - return [] - } - } - - /** - * 批量设置 - */ - setMultiple(data: Record, options: StorageOptions = {}): boolean { - try { - Object.entries(data).forEach(([key, value]) => { - this.set(key, value, options) - }) - return true - } catch (error) { - console.error('批量设置失败:', error) - return false - } - } - - /** - * 批量获取 - */ - getMultiple(keys: string[], options: StorageOptions = {}): Record { - const result: Record = {} - - keys.forEach(key => { - result[key] = this.get(key, options) - }) - - return result - } - - /** - * 批量移除 - */ - removeMultiple(keys: string[], options: StorageOptions = {}): boolean { - try { - keys.forEach(key => { - this.remove(key, options) - }) - return true - } catch (error) { - console.error('批量移除失败:', error) - return false - } - } -} - -// 创建存储实例 -const storage = new StorageService() - -// 便捷方法 -export const setToken = (token: string) => { - storage.set(STORAGE_KEYS.TOKEN, token, { encrypt: true }) -} - -export const getToken = (): string | null => { - return storage.get(STORAGE_KEYS.TOKEN, { encrypt: true }) -} - -export const removeToken = () => { - storage.remove(STORAGE_KEYS.TOKEN) -} - -export const setRefreshToken = (token: string) => { - storage.set(STORAGE_KEYS.REFRESH_TOKEN, token, { encrypt: true }) -} - -export const getRefreshToken = (): string | null => { - return storage.get(STORAGE_KEYS.REFRESH_TOKEN, { encrypt: true }) -} - -export const removeRefreshToken = () => { - storage.remove(STORAGE_KEYS.REFRESH_TOKEN) -} - -export const setUserInfo = (userInfo: any) => { - storage.set(STORAGE_KEYS.USER_INFO, userInfo) -} - -export const getUserInfo = () => { - return storage.get(STORAGE_KEYS.USER_INFO) -} - -export const removeUserInfo = () => { - storage.remove(STORAGE_KEYS.USER_INFO) -} - -export const setLanguage = (language: string) => { - storage.set(STORAGE_KEYS.LANGUAGE, language) -} - -export const getLanguage = (): string | null => { - return storage.get(STORAGE_KEYS.LANGUAGE) -} - -export const setTheme = (theme: string) => { - storage.set(STORAGE_KEYS.THEME, theme) -} - -export const getTheme = (): string | null => { - return storage.get(STORAGE_KEYS.THEME) -} - -export default storage diff --git a/web-new/src/utils/validation.ts b/web-new/src/utils/validation.ts deleted file mode 100644 index 40a93dd..0000000 --- a/web-new/src/utils/validation.ts +++ /dev/null @@ -1,400 +0,0 @@ -/** - * 验证工具函数 - * 提供各种数据验证功能 - */ - -import { VALIDATION_RULES } from '@/config/constants' - -/** - * 验证用户名 - */ -export const validateUsername = (username: string): boolean => { - if (!username) return false - - const { MIN_LENGTH, MAX_LENGTH, PATTERN } = VALIDATION_RULES.USERNAME - - return ( - username.length >= MIN_LENGTH && - username.length <= MAX_LENGTH && - PATTERN.test(username) - ) -} - -/** - * 验证密码 - */ -export const validatePassword = (password: string): boolean => { - if (!password) return false - - const { MIN_LENGTH, MAX_LENGTH, PATTERN } = VALIDATION_RULES.PASSWORD - - return ( - password.length >= MIN_LENGTH && - password.length <= MAX_LENGTH && - PATTERN.test(password) - ) -} - -/** - * 验证邮箱 - */ -export const validateEmail = (email: string): boolean => { - if (!email) return false - return VALIDATION_RULES.EMAIL.PATTERN.test(email) -} - -/** - * 验证手机号 - */ -export const validatePhone = (phone: string): boolean => { - if (!phone) return false - return VALIDATION_RULES.PHONE.PATTERN.test(phone) -} - -/** - * 验证身份证号 - */ -export const validateIdCard = (idCard: string): boolean => { - if (!idCard) return false - - // 18位身份证号验证 - const pattern = /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/ - - if (!pattern.test(idCard)) return false - - // 校验码验证 - const weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2] - const checkCodes = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'] - - let sum = 0 - for (let i = 0; i < 17; i++) { - sum += parseInt(idCard[i]) * weights[i] - } - - const checkCode = checkCodes[sum % 11] - return checkCode === idCard[17].toUpperCase() -} - -/** - * 验证银行卡号 - */ -export const validateBankCard = (cardNumber: string): boolean => { - if (!cardNumber) return false - - // 移除空格和非数字字符 - const cleaned = cardNumber.replace(/\D/g, '') - - // 长度检查(一般为16-19位) - if (cleaned.length < 16 || cleaned.length > 19) return false - - // Luhn算法验证 - let sum = 0 - let isEven = false - - for (let i = cleaned.length - 1; i >= 0; i--) { - let digit = parseInt(cleaned[i]) - - if (isEven) { - digit *= 2 - if (digit > 9) { - digit -= 9 - } - } - - sum += digit - isEven = !isEven - } - - return sum % 10 === 0 -} - -/** - * 验证URL - */ -export const validateUrl = (url: string): boolean => { - if (!url) return false - - try { - new URL(url) - return true - } catch { - return false - } -} - -/** - * 验证IP地址 - */ -export const validateIP = (ip: string): boolean => { - if (!ip) return false - - const ipv4Pattern = /^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/ - const ipv6Pattern = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/ - - return ipv4Pattern.test(ip) || ipv6Pattern.test(ip) -} - -/** - * 验证端口号 - */ -export const validatePort = (port: string | number): boolean => { - const portNum = typeof port === 'string' ? parseInt(port) : port - return !isNaN(portNum) && portNum >= 1 && portNum <= 65535 -} - -/** - * 验证MAC地址 - */ -export const validateMAC = (mac: string): boolean => { - if (!mac) return false - - const pattern = /^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$/ - return pattern.test(mac) -} - -/** - * 验证颜色值 - */ -export const validateColor = (color: string): boolean => { - if (!color) return false - - // Hex颜色 - const hexPattern = /^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/ - if (hexPattern.test(color)) return true - - // RGB颜色 - const rgbPattern = /^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/ - if (rgbPattern.test(color)) { - const matches = color.match(rgbPattern) - if (matches) { - const [, r, g, b] = matches - return [r, g, b].every(val => parseInt(val) >= 0 && parseInt(val) <= 255) - } - } - - // RGBA颜色 - const rgbaPattern = /^rgba\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3}),\s*(0|1|0?\.\d+)\)$/ - if (rgbaPattern.test(color)) { - const matches = color.match(rgbaPattern) - if (matches) { - const [, r, g, b, a] = matches - return ( - [r, g, b].every(val => parseInt(val) >= 0 && parseInt(val) <= 255) && - parseFloat(a) >= 0 && parseFloat(a) <= 1 - ) - } - } - - return false -} - -/** - * 验证日期格式 - */ -export const validateDate = (date: string, format = 'YYYY-MM-DD'): boolean => { - if (!date) return false - - const patterns: Record = { - 'YYYY-MM-DD': /^\d{4}-\d{2}-\d{2}$/, - 'YYYY/MM/DD': /^\d{4}\/\d{2}\/\d{2}$/, - 'DD/MM/YYYY': /^\d{2}\/\d{2}\/\d{4}$/, - 'MM/DD/YYYY': /^\d{2}\/\d{2}\/\d{4}$/, - 'YYYY-MM-DD HH:mm:ss': /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/ - } - - const pattern = patterns[format] - if (!pattern || !pattern.test(date)) return false - - // 验证日期有效性 - const dateObj = new Date(date) - return dateObj instanceof Date && !isNaN(dateObj.getTime()) -} - -/** - * 验证文件类型 - */ -export const validateFileType = (file: File, allowedTypes: string[]): boolean => { - if (!file || !allowedTypes.length) return false - - return allowedTypes.some(type => { - if (type.includes('*')) { - // 支持通配符,如 image/* - const [mainType] = type.split('/') - return file.type.startsWith(mainType + '/') - } - return file.type === type - }) -} - -/** - * 验证文件大小 - */ -export const validateFileSize = (file: File, maxSize: number): boolean => { - if (!file) return false - return file.size <= maxSize -} - -/** - * 验证图片尺寸 - */ -export const validateImageSize = ( - file: File, - options: { - maxWidth?: number - maxHeight?: number - minWidth?: number - minHeight?: number - } -): Promise => { - return new Promise((resolve) => { - if (!file || !file.type.startsWith('image/')) { - resolve(false) - return - } - - const img = new Image() - const url = URL.createObjectURL(file) - - img.onload = () => { - URL.revokeObjectURL(url) - - const { width, height } = img - const { maxWidth, maxHeight, minWidth, minHeight } = options - - let valid = true - - if (maxWidth && width > maxWidth) valid = false - if (maxHeight && height > maxHeight) valid = false - if (minWidth && width < minWidth) valid = false - if (minHeight && height < minHeight) valid = false - - resolve(valid) - } - - img.onerror = () => { - URL.revokeObjectURL(url) - resolve(false) - } - - img.src = url - }) -} - -/** - * 验证JSON格式 - */ -export const validateJSON = (str: string): boolean => { - if (!str) return false - - try { - JSON.parse(str) - return true - } catch { - return false - } -} - -/** - * 验证正则表达式 - */ -export const validateRegex = (pattern: string): boolean => { - if (!pattern) return false - - try { - new RegExp(pattern) - return true - } catch { - return false - } -} - -/** - * 验证版本号 - */ -export const validateVersion = (version: string): boolean => { - if (!version) return false - - const pattern = /^\d+\.\d+\.\d+(-[a-zA-Z0-9]+)?$/ - return pattern.test(version) -} - -/** - * 验证中文字符 - */ -export const validateChinese = (str: string): boolean => { - if (!str) return false - - const pattern = /^[\u4e00-\u9fa5]+$/ - return pattern.test(str) -} - -/** - * 验证英文字符 - */ -export const validateEnglish = (str: string): boolean => { - if (!str) return false - - const pattern = /^[a-zA-Z]+$/ - return pattern.test(str) -} - -/** - * 验证数字 - */ -export const validateNumber = (str: string): boolean => { - if (!str) return false - - return !isNaN(Number(str)) && isFinite(Number(str)) -} - -/** - * 验证整数 - */ -export const validateInteger = (str: string): boolean => { - if (!str) return false - - const pattern = /^-?\d+$/ - return pattern.test(str) -} - -/** - * 验证正整数 - */ -export const validatePositiveInteger = (str: string): boolean => { - if (!str) return false - - const pattern = /^\d+$/ - return pattern.test(str) && parseInt(str) > 0 -} - -/** - * 验证小数 - */ -export const validateDecimal = (str: string, decimals = 2): boolean => { - if (!str) return false - - const pattern = new RegExp(`^-?\\d+(\\.\\d{1,${decimals}})?$`) - return pattern.test(str) -} - -/** - * 综合验证函数 - */ -export const validate = ( - value: any, - rules: Array<{ - validator: (val: any) => boolean - message: string - }> -): { valid: boolean; message?: string } => { - for (const rule of rules) { - if (!rule.validator(value)) { - return { - valid: false, - message: rule.message - } - } - } - - return { valid: true } -} diff --git a/web-new/src/utils/websocket.ts b/web-new/src/utils/websocket.ts deleted file mode 100644 index 95c4542..0000000 --- a/web-new/src/utils/websocket.ts +++ /dev/null @@ -1,395 +0,0 @@ -/** - * WebSocket工具类 - * 基于@stomp/stompjs,支持Token认证、自动重连、心跳检测 - */ - -import { Client, type IMessage } from '@stomp/stompjs' -import { ElMessage } from 'element-plus' -import { envConfig } from '@/config/env' -import { STORAGE_KEYS } from '@/config/constants' - -// WebSocket连接状态 -export enum WSConnectionState { - CONNECTING = 'CONNECTING', - CONNECTED = 'CONNECTED', - DISCONNECTED = 'DISCONNECTED', - ERROR = 'ERROR' -} - -// 消息订阅接口 -interface Subscription { - destination: string - callback: (message: any) => void - unsubscribe: () => void -} - -// WebSocket事件回调 -interface WSEventCallbacks { - onConnect?: () => void - onDisconnect?: () => void - onError?: (error: any) => void - onTokenExpired?: () => void - onReconnect?: (attempt: number) => void -} - -export class WebSocketService { - private client: Client - private connected = false - private reconnectAttempts = 0 - private maxReconnectAttempts = 5 - private currentToken = '' - private subscriptions = new Map() - private messageQueue: Array<{ destination: string; body: any }> = [] - private callbacks: WSEventCallbacks = {} - private connectionState = WSConnectionState.DISCONNECTED - - constructor(callbacks?: WSEventCallbacks) { - this.callbacks = callbacks || {} - this.initializeClient() - } - - /** - * 初始化STOMP客户端 - */ - private initializeClient() { - this.client = new Client({ - // 使用原生WebSocket,支持Token认证 - brokerURL: `${envConfig.wsBaseUrl}/ws`, - - // 心跳检测 - heartbeatIncoming: 4000, - heartbeatOutgoing: 4000, - - // 重连配置 - reconnectDelay: 5000, - - // 调试模式 - debug: envConfig.debug ? this.debugLog : undefined, - - onConnect: () => { - this.connected = true - this.reconnectAttempts = 0 - this.connectionState = WSConnectionState.CONNECTED - - console.log('✅ WebSocket连接成功') - - // 处理消息队列 - this.processMessageQueue() - - // 重新订阅 - this.resubscribeAll() - - this.callbacks.onConnect?.() - }, - - onDisconnect: () => { - this.connected = false - this.connectionState = WSConnectionState.DISCONNECTED - - console.log('❌ WebSocket连接断开') - this.callbacks.onDisconnect?.() - }, - - onStompError: (frame) => { - console.error('❌ STOMP错误:', frame) - this.connectionState = WSConnectionState.ERROR - this.handleStompError(frame) - }, - - onWebSocketError: (error) => { - console.error('❌ WebSocket错误:', error) - this.connectionState = WSConnectionState.ERROR - this.callbacks.onError?.(error) - }, - - // WebSocket连接前的配置 - beforeConnect: () => { - if (this.currentToken) { - this.client.configure({ - connectHeaders: { - Authorization: `Bearer ${this.currentToken}`, - 'X-Requested-With': 'XMLHttpRequest' - } - }) - } - } - }) - } - - /** - * 调试日志 - */ - private debugLog = (message: string) => { - if (envConfig.debug) { - console.log(`🔌 WebSocket: ${message}`) - } - } - - /** - * 连接WebSocket - */ - connect(token?: string) { - if (token) { - this.currentToken = token - } else { - this.currentToken = localStorage.getItem(STORAGE_KEYS.TOKEN) || '' - } - - if (!this.currentToken) { - console.warn('⚠️ 没有找到Token,无法建立WebSocket连接') - return - } - - this.connectionState = WSConnectionState.CONNECTING - - this.client.configure({ - connectHeaders: { - Authorization: `Bearer ${this.currentToken}`, - 'X-Requested-With': 'XMLHttpRequest' - } - }) - - try { - this.client.activate() - console.log('🔌 正在连接WebSocket...') - } catch (error) { - console.error('❌ WebSocket连接失败:', error) - this.connectionState = WSConnectionState.ERROR - this.callbacks.onError?.(error) - } - } - - /** - * 断开WebSocket连接 - */ - disconnect() { - this.connected = false - this.connectionState = WSConnectionState.DISCONNECTED - this.subscriptions.clear() - this.messageQueue = [] - - try { - this.client.deactivate() - console.log('🔌 WebSocket连接已断开') - } catch (error) { - console.error('❌ 断开WebSocket连接时出错:', error) - } - } - - /** - * 更新Token(用于Token刷新场景) - */ - updateToken(newToken: string) { - this.currentToken = newToken - - if (this.connected) { - // 断开当前连接 - this.disconnect() - // 使用新Token重新连接 - setTimeout(() => { - this.connect(newToken) - }, 1000) - } - } - - /** - * 订阅消息 - */ - subscribe(destination: string, callback: (message: any) => void): () => void { - if (!this.connected) { - console.warn('⚠️ WebSocket未连接,订阅将在连接后自动执行') - } - - const subscription: Subscription = { - destination, - callback, - unsubscribe: () => { - this.subscriptions.delete(destination) - } - } - - this.subscriptions.set(destination, subscription) - - // 如果已连接,立即订阅 - if (this.connected) { - this.doSubscribe(destination, callback) - } - - // 返回取消订阅函数 - return () => { - subscription.unsubscribe() - if (this.connected) { - // 这里可以添加STOMP取消订阅逻辑 - } - } - } - - /** - * 执行订阅 - */ - private doSubscribe(destination: string, callback: (message: any) => void) { - try { - this.client.subscribe(destination, (message: IMessage) => { - try { - const data = JSON.parse(message.body) - callback(data) - } catch (error) { - console.error('❌ 消息解析失败:', error, message.body) - } - }) - } catch (error) { - console.error('❌ 订阅失败:', error) - } - } - - /** - * 重新订阅所有频道 - */ - private resubscribeAll() { - this.subscriptions.forEach((subscription, destination) => { - this.doSubscribe(destination, subscription.callback) - }) - } - - /** - * 发送消息 - */ - send(destination: string, body: any) { - if (!this.connected) { - console.warn('⚠️ WebSocket未连接,消息将被缓存') - this.messageQueue.push({ destination, body }) - return - } - - try { - this.client.publish({ - destination, - body: JSON.stringify(body) - }) - - if (envConfig.debug) { - console.log('📤 发送消息:', { destination, body }) - } - } catch (error) { - console.error('❌ 发送消息失败:', error) - // 发送失败时加入队列 - this.messageQueue.push({ destination, body }) - } - } - - /** - * 处理消息队列 - */ - private processMessageQueue() { - while (this.messageQueue.length > 0) { - const message = this.messageQueue.shift() - if (message) { - this.send(message.destination, message.body) - } - } - } - - /** - * 处理STOMP错误 - */ - private handleStompError(frame: any) { - if (frame.headers && frame.headers.message) { - const errorMessage = frame.headers.message.toLowerCase() - - if (errorMessage.includes('unauthorized') || - errorMessage.includes('invalid token') || - errorMessage.includes('token expired')) { - - console.warn('⚠️ Token认证失败,触发重新登录') - ElMessage.warning('登录状态已过期,请重新登录') - this.callbacks.onTokenExpired?.() - return - } - } - - // 其他错误进行重连 - this.handleReconnect() - } - - /** - * 处理重连 - */ - private handleReconnect() { - if (this.reconnectAttempts < this.maxReconnectAttempts) { - this.reconnectAttempts++ - const delay = 5000 * this.reconnectAttempts - - console.log(`🔄 尝试重连 (${this.reconnectAttempts}/${this.maxReconnectAttempts}),${delay}ms后重试`) - - setTimeout(() => { - if (!this.connected) { - this.connect() - this.callbacks.onReconnect?.(this.reconnectAttempts) - } - }, delay) - } else { - console.error('❌ 重连次数已达上限,停止重连') - ElMessage.error('网络连接不稳定,请刷新页面重试') - } - } - - /** - * 获取连接状态 - */ - getConnectionState(): WSConnectionState { - return this.connectionState - } - - /** - * 是否已连接 - */ - isConnected(): boolean { - return this.connected - } - - /** - * 获取订阅数量 - */ - getSubscriptionCount(): number { - return this.subscriptions.size - } - - /** - * 获取消息队列长度 - */ - getQueueLength(): number { - return this.messageQueue.length - } - - /** - * 清空消息队列 - */ - clearQueue() { - this.messageQueue = [] - } -} - -// 创建全局WebSocket实例 -let globalWSInstance: WebSocketService | null = null - -/** - * 获取全局WebSocket实例 - */ -export function getWebSocketInstance(callbacks?: WSEventCallbacks): WebSocketService { - if (!globalWSInstance) { - globalWSInstance = new WebSocketService(callbacks) - } - return globalWSInstance -} - -/** - * 销毁全局WebSocket实例 - */ -export function destroyWebSocketInstance() { - if (globalWSInstance) { - globalWSInstance.disconnect() - globalWSInstance = null - } -} - -export default WebSocketService diff --git a/web-new/src/views/Home.vue b/web-new/src/views/Home.vue deleted file mode 100644 index f408764..0000000 --- a/web-new/src/views/Home.vue +++ /dev/null @@ -1,242 +0,0 @@ - - - - - diff --git a/web-new/src/views/analysis/Analysis.vue b/web-new/src/views/analysis/Analysis.vue deleted file mode 100644 index 4f40dab..0000000 --- a/web-new/src/views/analysis/Analysis.vue +++ /dev/null @@ -1,538 +0,0 @@ - - - - - diff --git a/web-new/src/views/auth/Login.vue b/web-new/src/views/auth/Login.vue deleted file mode 100644 index af9c945..0000000 --- a/web-new/src/views/auth/Login.vue +++ /dev/null @@ -1,295 +0,0 @@ - - - - - diff --git a/web-new/src/views/auth/Register.vue b/web-new/src/views/auth/Register.vue deleted file mode 100644 index 963a66c..0000000 --- a/web-new/src/views/auth/Register.vue +++ /dev/null @@ -1,399 +0,0 @@ - - - - - diff --git a/web-new/src/views/chat/Chat.vue b/web-new/src/views/chat/Chat.vue deleted file mode 100644 index f43fe53..0000000 --- a/web-new/src/views/chat/Chat.vue +++ /dev/null @@ -1,331 +0,0 @@ - - - - - diff --git a/web-new/src/views/chat/ChatHistory.vue b/web-new/src/views/chat/ChatHistory.vue deleted file mode 100644 index 3f8ef41..0000000 --- a/web-new/src/views/chat/ChatHistory.vue +++ /dev/null @@ -1,474 +0,0 @@ - - - - - diff --git a/web-new/src/views/dashboard/PersonalDashboard.vue b/web-new/src/views/dashboard/PersonalDashboard.vue deleted file mode 100644 index 2bcf7c5..0000000 --- a/web-new/src/views/dashboard/PersonalDashboard.vue +++ /dev/null @@ -1,440 +0,0 @@ - - - - - diff --git a/web-new/src/views/diary/Diary.vue b/web-new/src/views/diary/Diary.vue deleted file mode 100644 index 7445acd..0000000 --- a/web-new/src/views/diary/Diary.vue +++ /dev/null @@ -1,484 +0,0 @@ - - - - - diff --git a/web-new/src/views/diary/DiaryDetail.vue b/web-new/src/views/diary/DiaryDetail.vue deleted file mode 100644 index 4cdd1f5..0000000 --- a/web-new/src/views/diary/DiaryDetail.vue +++ /dev/null @@ -1,543 +0,0 @@ - - - - - diff --git a/web-new/src/views/diary/DiaryEditor.vue b/web-new/src/views/diary/DiaryEditor.vue deleted file mode 100644 index 81bcd35..0000000 --- a/web-new/src/views/diary/DiaryEditor.vue +++ /dev/null @@ -1,578 +0,0 @@ - - - - - diff --git a/web-new/src/views/error/NotFound.vue b/web-new/src/views/error/NotFound.vue deleted file mode 100644 index 74964d2..0000000 --- a/web-new/src/views/error/NotFound.vue +++ /dev/null @@ -1,85 +0,0 @@ - - - - - diff --git a/web-new/src/views/profile/Profile.vue b/web-new/src/views/profile/Profile.vue deleted file mode 100644 index 02eb604..0000000 --- a/web-new/src/views/profile/Profile.vue +++ /dev/null @@ -1,518 +0,0 @@ - - - - - diff --git a/web-new/src/views/settings/Settings.vue b/web-new/src/views/settings/Settings.vue deleted file mode 100644 index ececcd0..0000000 --- a/web-new/src/views/settings/Settings.vue +++ /dev/null @@ -1,430 +0,0 @@ - - - - - diff --git a/web-new/tailwind.config.js b/web-new/tailwind.config.js deleted file mode 100644 index 72735d7..0000000 --- a/web-new/tailwind.config.js +++ /dev/null @@ -1,98 +0,0 @@ -/** @type {import('tailwindcss').Config} */ -export default { - content: [ - './index.html', - './src/**/*.{vue,js,ts,jsx,tsx}' - ], - theme: { - extend: { - colors: { - // 主色调 - primary: { - 50: '#f0f9ff', - 100: '#e0f2fe', - 200: '#bae6fd', - 300: '#7dd3fc', - 400: '#38bdf8', - 500: '#0ea5e9', - 600: '#0284c7', - 700: '#0369a1', - 800: '#075985', - 900: '#0c4a6e' - }, - - // 情绪色彩 - emotion: { - happy: '#fbbf24', - sad: '#3b82f6', - angry: '#ef4444', - calm: '#10b981', - excited: '#f97316', - anxious: '#8b5cf6' - }, - - // 设计系统颜色 - 'tech-blue': '#4A90E2', - 'warm-orange': '#F5A623', - 'light-gray': '#F7F8FA', - 'text-dark': '#333333', - 'text-medium': '#888888' - }, - - fontFamily: { - sans: ['Noto Sans SC', 'Inter', 'system-ui', 'sans-serif'] - }, - - animation: { - 'fade-in': 'fadeIn 0.5s ease-in-out', - 'slide-up': 'slideUp 0.3s ease-out', - 'bounce-gentle': 'bounceGentle 2s infinite', - 'pulse-slow': 'pulse 3s cubic-bezier(0.4, 0, 0.6, 1) infinite' - }, - - keyframes: { - fadeIn: { - '0%': { opacity: '0' }, - '100%': { opacity: '1' } - }, - slideUp: { - '0%': { transform: 'translateY(20px)', opacity: '0' }, - '100%': { transform: 'translateY(0)', opacity: '1' } - }, - bounceGentle: { - '0%, 100%': { transform: 'translateY(0)' }, - '50%': { transform: 'translateY(-5px)' } - } - }, - - spacing: { - '18': '4.5rem', - '88': '22rem', - '128': '32rem' - }, - - borderRadius: { - '4xl': '2rem' - }, - - boxShadow: { - 'soft': '0 2px 15px 0 rgba(0, 0, 0, 0.1)', - 'medium': '0 4px 25px 0 rgba(0, 0, 0, 0.15)', - 'strong': '0 8px 35px 0 rgba(0, 0, 0, 0.2)' - }, - - backdropBlur: { - xs: '2px' - } - } - }, - plugins: [ - require('@tailwindcss/forms'), - require('@tailwindcss/typography') - ], - - // 与Element Plus兼容 - corePlugins: { - preflight: false - } -} diff --git a/web-new/tests/e2e/specs/auth.cy.ts b/web-new/tests/e2e/specs/auth.cy.ts deleted file mode 100644 index 2f04825..0000000 --- a/web-new/tests/e2e/specs/auth.cy.ts +++ /dev/null @@ -1,304 +0,0 @@ -/** - * 认证功能 E2E 测试 - */ - -describe('Authentication', () => { - beforeEach(() => { - cy.visit('/') - }) - - describe('Login', () => { - it('should redirect to login page when not authenticated', () => { - cy.url().should('include', '/auth/login') - cy.shouldBeVisible('[data-cy=login-form]') - }) - - it('should login with valid credentials', () => { - cy.visit('/auth/login') - - // 填写登录表单 - cy.get('[data-cy=username-input]').type(Cypress.env('testUser').username) - cy.get('[data-cy=password-input]').type(Cypress.env('testUser').password) - - // 点击登录按钮 - cy.get('[data-cy=login-button]').click() - - // 等待登录完成 - cy.wait('@login') - - // 验证登录成功 - cy.url().should('not.include', '/auth/login') - cy.shouldBeVisible('[data-cy=user-menu]') - cy.shouldHaveLocalStorage('auth_token') - }) - - it('should show error with invalid credentials', () => { - cy.visit('/auth/login') - - // 模拟登录失败 - cy.intercept('POST', '/api/auth/login', { - statusCode: 401, - body: { message: '用户名或密码错误' } - }).as('loginFailed') - - // 填写错误凭据 - cy.get('[data-cy=username-input]').type('wronguser') - cy.get('[data-cy=password-input]').type('wrongpass') - cy.get('[data-cy=login-button]').click() - - // 验证错误消息 - cy.wait('@loginFailed') - cy.shouldShowError('用户名或密码错误') - cy.url().should('include', '/auth/login') - }) - - it('should validate required fields', () => { - cy.visit('/auth/login') - - // 尝试提交空表单 - cy.get('[data-cy=login-button]').click() - - // 验证验证消息 - cy.get('[data-cy=username-input]').should('have.class', 'error') - cy.get('[data-cy=password-input]').should('have.class', 'error') - }) - - it('should toggle password visibility', () => { - cy.visit('/auth/login') - - cy.get('[data-cy=password-input]').should('have.attr', 'type', 'password') - cy.get('[data-cy=password-toggle]').click() - cy.get('[data-cy=password-input]').should('have.attr', 'type', 'text') - }) - - it('should remember login state', () => { - // 登录 - cy.login() - - // 刷新页面 - cy.reload() - - // 验证仍然登录 - cy.shouldBeVisible('[data-cy=user-menu]') - cy.url().should('not.include', '/auth/login') - }) - }) - - describe('Register', () => { - it('should register new user successfully', () => { - cy.visit('/auth/register') - - // 模拟注册成功 - cy.intercept('POST', '/api/auth/register', { - statusCode: 201, - body: { - token: 'new-token', - user: { - id: '1', - username: 'newuser', - email: 'new@example.com' - } - } - }).as('register') - - // 填写注册表单 - cy.get('[data-cy=username-input]').type('newuser') - cy.get('[data-cy=email-input]').type('new@example.com') - cy.get('[data-cy=password-input]').type('password123') - cy.get('[data-cy=confirm-password-input]').type('password123') - cy.get('[data-cy=agree-terms]').check() - - // 提交注册 - cy.get('[data-cy=register-button]').click() - - // 验证注册成功 - cy.wait('@register') - cy.url().should('not.include', '/auth/register') - cy.shouldShowSuccess('注册成功') - }) - - it('should validate email format', () => { - cy.visit('/auth/register') - - cy.get('[data-cy=email-input]').type('invalid-email') - cy.get('[data-cy=username-input]').click() // 触发验证 - - cy.get('[data-cy=email-input]').should('have.class', 'error') - cy.shouldContainText('[data-cy=email-error]', '邮箱格式不正确') - }) - - it('should validate password strength', () => { - cy.visit('/auth/register') - - // 测试弱密码 - cy.get('[data-cy=password-input]').type('123') - cy.get('[data-cy=username-input]').click() - - cy.shouldContainText('[data-cy=password-strength]', '弱') - - // 测试强密码 - cy.get('[data-cy=password-input]').clear().type('StrongPass123!') - cy.shouldContainText('[data-cy=password-strength]', '强') - }) - - it('should validate password confirmation', () => { - cy.visit('/auth/register') - - cy.get('[data-cy=password-input]').type('password123') - cy.get('[data-cy=confirm-password-input]').type('different') - cy.get('[data-cy=username-input]').click() - - cy.shouldContainText('[data-cy=confirm-password-error]', '两次输入的密码不一致') - }) - - it('should require terms agreement', () => { - cy.visit('/auth/register') - - // 填写所有字段但不同意条款 - cy.get('[data-cy=username-input]').type('newuser') - cy.get('[data-cy=email-input]').type('new@example.com') - cy.get('[data-cy=password-input]').type('password123') - cy.get('[data-cy=confirm-password-input]').type('password123') - - // 尝试提交 - cy.get('[data-cy=register-button]').should('be.disabled') - }) - }) - - describe('Logout', () => { - it('should logout successfully', () => { - // 先登录 - cy.login() - - // 登出 - cy.logout() - - // 验证登出成功 - cy.url().should('include', '/auth/login') - cy.shouldNotHaveLocalStorage('auth_token') - }) - - it('should clear user data on logout', () => { - cy.login() - - // 设置一些用户数据 - cy.setLocalStorage('user_preferences', '{"theme":"dark"}') - - cy.logout() - - // 验证数据被清除 - cy.shouldNotHaveLocalStorage('auth_token') - cy.shouldNotHaveLocalStorage('user_info') - }) - }) - - describe('Password Reset', () => { - it('should send reset email', () => { - cy.visit('/auth/forgot-password') - - cy.intercept('POST', '/api/auth/forgot-password', { - statusCode: 200, - body: { message: '重置邮件已发送' } - }).as('forgotPassword') - - cy.get('[data-cy=email-input]').type('test@example.com') - cy.get('[data-cy=send-reset-button]').click() - - cy.wait('@forgotPassword') - cy.shouldShowSuccess('重置邮件已发送') - }) - - it('should reset password with valid token', () => { - cy.visit('/auth/reset-password?token=valid-token') - - cy.intercept('POST', '/api/auth/reset-password', { - statusCode: 200, - body: { message: '密码重置成功' } - }).as('resetPassword') - - cy.get('[data-cy=new-password-input]').type('newpassword123') - cy.get('[data-cy=confirm-password-input]').type('newpassword123') - cy.get('[data-cy=reset-button]').click() - - cy.wait('@resetPassword') - cy.shouldShowSuccess('密码重置成功') - cy.url().should('include', '/auth/login') - }) - }) - - describe('Session Management', () => { - it('should handle token expiration', () => { - cy.login() - - // 模拟token过期 - cy.intercept('GET', '/api/user/profile', { - statusCode: 401, - body: { message: 'Token expired' } - }).as('tokenExpired') - - // 访问需要认证的页面 - cy.visit('/app/dashboard') - cy.wait('@tokenExpired') - - // 应该重定向到登录页 - cy.url().should('include', '/auth/login') - }) - - it('should refresh token automatically', () => { - cy.login() - - // 模拟token即将过期 - cy.intercept('POST', '/api/auth/refresh', { - statusCode: 200, - body: { - token: 'new-token', - expiresIn: 7200 - } - }).as('refreshToken') - - // 触发token刷新 - cy.visit('/app/dashboard') - cy.wait('@refreshToken') - - // 验证新token被保存 - cy.shouldHaveLocalStorage('auth_token', 'new-token') - }) - }) - - describe('Responsive Design', () => { - it('should work on mobile devices', () => { - cy.setMobileViewport() - cy.visit('/auth/login') - - cy.shouldBeVisible('[data-cy=login-form]') - cy.get('[data-cy=username-input]').should('be.visible') - cy.get('[data-cy=password-input]').should('be.visible') - cy.get('[data-cy=login-button]').should('be.visible') - }) - - it('should adapt to different screen sizes', () => { - cy.visit('/auth/login') - cy.checkResponsive('[data-cy=login-form]') - }) - }) - - describe('Accessibility', () => { - it('should be accessible', () => { - cy.visit('/auth/login') - cy.checkA11y() - }) - - it('should support keyboard navigation', () => { - cy.visit('/auth/login') - - cy.get('body').tab() - cy.focused().should('have.attr', 'data-cy', 'username-input') - - cy.focused().tab() - cy.focused().should('have.attr', 'data-cy', 'password-input') - - cy.focused().tab() - cy.focused().should('have.attr', 'data-cy', 'login-button') - }) - }) -}) diff --git a/web-new/tests/e2e/support/commands.ts b/web-new/tests/e2e/support/commands.ts deleted file mode 100644 index a135d33..0000000 --- a/web-new/tests/e2e/support/commands.ts +++ /dev/null @@ -1,204 +0,0 @@ -/** - * E2E 测试自定义命令 - */ - -// 登录命令 -Cypress.Commands.add('login', (username?: string, password?: string) => { - const user = username || Cypress.env('testUser').username - const pass = password || Cypress.env('testUser').password - - cy.visit('/auth/login') - cy.get('[data-cy=username-input]').type(user) - cy.get('[data-cy=password-input]').type(pass) - cy.get('[data-cy=login-button]').click() - - // 等待登录完成 - cy.wait('@login') - cy.url().should('not.include', '/auth/login') -}) - -// 登出命令 -Cypress.Commands.add('logout', () => { - cy.get('[data-cy=user-menu]').click() - cy.get('[data-cy=logout-button]').click() - cy.wait('@logout') - cy.url().should('include', '/auth/login') -}) - -// 等待页面加载完成 -Cypress.Commands.add('waitForPageLoad', () => { - cy.get('[data-cy=loading]').should('not.exist') - cy.get('body').should('be.visible') -}) - -// 检查元素是否可见 -Cypress.Commands.add('shouldBeVisible', (selector: string) => { - cy.get(selector).should('be.visible') -}) - -// 检查元素是否包含文本 -Cypress.Commands.add('shouldContainText', (selector: string, text: string) => { - cy.get(selector).should('contain.text', text) -}) - -// 上传文件命令 -Cypress.Commands.add('uploadFile', (selector: string, fileName: string) => { - cy.fixture(fileName, 'base64').then(fileContent => { - cy.get(selector).selectFile({ - contents: Cypress.Buffer.from(fileContent, 'base64'), - fileName, - mimeType: 'image/jpeg' - }, { force: true }) - }) -}) - -// 等待 API 请求完成 -Cypress.Commands.add('waitForApi', (alias: string) => { - cy.wait(`@${alias}`) -}) - -// 模拟网络延迟 -Cypress.Commands.add('simulateNetworkDelay', (delay: number) => { - cy.intercept('**', (req) => { - req.reply((res) => { - return new Promise((resolve) => { - setTimeout(() => resolve(res), delay) - }) - }) - }) -}) - -// 检查无障碍性 -Cypress.Commands.add('checkA11y', () => { - cy.injectAxe() - cy.checkA11y() -}) - -// 自定义断言 -Cypress.Commands.add('shouldHaveClass', { prevSubject: true }, (subject, className) => { - cy.wrap(subject).should('have.class', className) -}) - -Cypress.Commands.add('shouldNotHaveClass', { prevSubject: true }, (subject, className) => { - cy.wrap(subject).should('not.have.class', className) -}) - -// 表单填写命令 -Cypress.Commands.add('fillForm', (formData: Record) => { - Object.entries(formData).forEach(([field, value]) => { - cy.get(`[data-cy=${field}-input]`).clear().type(value) - }) -}) - -// 等待元素出现 -Cypress.Commands.add('waitForElement', (selector: string, timeout = 10000) => { - cy.get(selector, { timeout }).should('exist') -}) - -// 滚动到元素 -Cypress.Commands.add('scrollToElement', (selector: string) => { - cy.get(selector).scrollIntoView() -}) - -// 模拟移动设备 -Cypress.Commands.add('setMobileViewport', () => { - cy.viewport(375, 667) // iPhone 6/7/8 尺寸 -}) - -// 模拟平板设备 -Cypress.Commands.add('setTabletViewport', () => { - cy.viewport(768, 1024) // iPad 尺寸 -}) - -// 模拟桌面设备 -Cypress.Commands.add('setDesktopViewport', () => { - cy.viewport(1280, 720) -}) - -// 检查响应式设计 -Cypress.Commands.add('checkResponsive', (selector: string) => { - // 桌面 - cy.setDesktopViewport() - cy.get(selector).should('be.visible') - - // 平板 - cy.setTabletViewport() - cy.get(selector).should('be.visible') - - // 移动 - cy.setMobileViewport() - cy.get(selector).should('be.visible') - - // 恢复桌面 - cy.setDesktopViewport() -}) - -// 模拟键盘导航 -Cypress.Commands.add('navigateWithKeyboard', (selector: string) => { - cy.get('body').tab() - cy.focused().should('have.attr', 'data-cy', selector) -}) - -// 检查加载状态 -Cypress.Commands.add('shouldBeLoading', (selector: string) => { - cy.get(selector).should('have.class', 'loading') -}) - -Cypress.Commands.add('shouldNotBeLoading', (selector: string) => { - cy.get(selector).should('not.have.class', 'loading') -}) - -// 模拟网络错误 -Cypress.Commands.add('simulateNetworkError', (url: string) => { - cy.intercept('GET', url, { forceNetworkError: true }) -}) - -// 检查错误消息 -Cypress.Commands.add('shouldShowError', (message: string) => { - cy.get('[data-cy=error-message]').should('contain.text', message) -}) - -// 检查成功消息 -Cypress.Commands.add('shouldShowSuccess', (message: string) => { - cy.get('[data-cy=success-message]').should('contain.text', message) -}) - -// 清除通知 -Cypress.Commands.add('clearNotifications', () => { - cy.get('[data-cy=notification-close]').each(($el) => { - cy.wrap($el).click() - }) -}) - -// 等待动画完成 -Cypress.Commands.add('waitForAnimation', (selector?: string) => { - if (selector) { - cy.get(selector).should('not.have.class', 'animating') - } else { - cy.wait(300) // 默认等待动画时间 - } -}) - -// 模拟拖拽 -Cypress.Commands.add('dragAndDrop', (sourceSelector: string, targetSelector: string) => { - cy.get(sourceSelector).trigger('mousedown', { which: 1 }) - cy.get(targetSelector).trigger('mousemove').trigger('mouseup') -}) - -// 检查本地存储 -Cypress.Commands.add('shouldHaveLocalStorage', (key: string, value?: string) => { - cy.window().its('localStorage').invoke('getItem', key).should('exist') - if (value) { - cy.window().its('localStorage').invoke('getItem', key).should('eq', value) - } -}) - -// 清除本地存储特定项 -Cypress.Commands.add('clearLocalStorageItem', (key: string) => { - cy.window().its('localStorage').invoke('removeItem', key) -}) - -// 设置本地存储 -Cypress.Commands.add('setLocalStorage', (key: string, value: string) => { - cy.window().its('localStorage').invoke('setItem', key, value) -}) diff --git a/web-new/tests/e2e/support/e2e.ts b/web-new/tests/e2e/support/e2e.ts deleted file mode 100644 index 0b6a332..0000000 --- a/web-new/tests/e2e/support/e2e.ts +++ /dev/null @@ -1,97 +0,0 @@ -/** - * E2E 测试支持文件 - */ - -// 导入 Cypress 命令 -import './commands' - -// 全局配置 -Cypress.on('uncaught:exception', (err, runnable) => { - // 忽略某些预期的错误 - if (err.message.includes('ResizeObserver loop limit exceeded')) { - return false - } - - if (err.message.includes('Non-Error promise rejection captured')) { - return false - } - - // 返回 false 阻止 Cypress 失败测试 - return false -}) - -// 测试前钩子 -beforeEach(() => { - // 清除本地存储 - cy.clearLocalStorage() - cy.clearCookies() - - // 设置视口 - cy.viewport(1280, 720) - - // 拦截 API 请求(可选) - cy.intercept('GET', '/api/user/profile', { fixture: 'user.json' }).as('getUserProfile') - cy.intercept('POST', '/api/auth/login', { fixture: 'auth.json' }).as('login') - cy.intercept('POST', '/api/auth/logout', { statusCode: 200 }).as('logout') -}) - -// 测试后钩子 -afterEach(() => { - // 清理工作 - cy.clearLocalStorage() - - // 截图(失败时) - cy.screenshot({ capture: 'runner', onlyOnFailure: true }) -}) - -// 自定义断言 -declare global { - namespace Cypress { - interface Chainable { - /** - * 登录用户 - */ - login(username?: string, password?: string): Chainable - - /** - * 登出用户 - */ - logout(): Chainable - - /** - * 等待页面加载完成 - */ - waitForPageLoad(): Chainable - - /** - * 检查元素是否可见 - */ - shouldBeVisible(selector: string): Chainable - - /** - * 检查元素是否包含文本 - */ - shouldContainText(selector: string, text: string): Chainable - - /** - * 上传文件 - */ - uploadFile(selector: string, fileName: string): Chainable - - /** - * 等待 API 请求完成 - */ - waitForApi(alias: string): Chainable - - /** - * 模拟网络延迟 - */ - simulateNetworkDelay(delay: number): Chainable - - /** - * 检查无障碍性 - */ - checkA11y(): Chainable - } - } -} diff --git a/web-new/tests/setup.ts b/web-new/tests/setup.ts deleted file mode 100644 index 6d9ea21..0000000 --- a/web-new/tests/setup.ts +++ /dev/null @@ -1,125 +0,0 @@ -/** - * 测试环境设置 - */ - -import { vi } from 'vitest' -import { config } from '@vue/test-utils' -import ElementPlus from 'element-plus' - -// 全局组件注册 -config.global.plugins = [ElementPlus] - -// 全局属性 -config.global.config.globalProperties = { - $t: (key: string) => key, // 模拟国际化 - $route: { - path: '/', - params: {}, - query: {}, - meta: {} - }, - $router: { - push: vi.fn(), - replace: vi.fn(), - go: vi.fn(), - back: vi.fn(), - forward: vi.fn() - } -} - -// 模拟全局对象 -Object.defineProperty(window, 'matchMedia', { - writable: true, - value: vi.fn().mockImplementation(query => ({ - matches: false, - media: query, - onchange: null, - addListener: vi.fn(), // deprecated - removeListener: vi.fn(), // deprecated - addEventListener: vi.fn(), - removeEventListener: vi.fn(), - dispatchEvent: vi.fn(), - })), -}) - -// 模拟 ResizeObserver -global.ResizeObserver = vi.fn().mockImplementation(() => ({ - observe: vi.fn(), - unobserve: vi.fn(), - disconnect: vi.fn(), -})) - -// 模拟 IntersectionObserver -global.IntersectionObserver = vi.fn().mockImplementation(() => ({ - observe: vi.fn(), - unobserve: vi.fn(), - disconnect: vi.fn(), -})) - -// 模拟 localStorage -const localStorageMock = { - getItem: vi.fn(), - setItem: vi.fn(), - removeItem: vi.fn(), - clear: vi.fn(), -} -global.localStorage = localStorageMock - -// 模拟 sessionStorage -const sessionStorageMock = { - getItem: vi.fn(), - setItem: vi.fn(), - removeItem: vi.fn(), - clear: vi.fn(), -} -global.sessionStorage = sessionStorageMock - -// 模拟 fetch -global.fetch = vi.fn() - -// 模拟 URL.createObjectURL -global.URL.createObjectURL = vi.fn(() => 'mocked-url') -global.URL.revokeObjectURL = vi.fn() - -// 模拟 Notification -global.Notification = vi.fn().mockImplementation(() => ({ - close: vi.fn(), -})) - -// 模拟 navigator -Object.defineProperty(navigator, 'clipboard', { - value: { - writeText: vi.fn().mockResolvedValue(undefined), - readText: vi.fn().mockResolvedValue(''), - }, - writable: true, -}) - -Object.defineProperty(navigator, 'vibrate', { - value: vi.fn(), - writable: true, -}) - -// 模拟 document.execCommand -document.execCommand = vi.fn() - -// 模拟 getSelection -global.getSelection = vi.fn().mockReturnValue({ - toString: vi.fn().mockReturnValue(''), - removeAllRanges: vi.fn(), - addRange: vi.fn(), -}) - -// 模拟 console 方法(避免测试时输出过多日志) -global.console = { - ...console, - log: vi.fn(), - debug: vi.fn(), - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), -} - -// 设置测试环境变量 -process.env.NODE_ENV = 'test' -process.env.VITE_APP_ENV = 'test' diff --git a/web-new/tests/unit/components/FileUpload.test.ts b/web-new/tests/unit/components/FileUpload.test.ts deleted file mode 100644 index 9c73f43..0000000 --- a/web-new/tests/unit/components/FileUpload.test.ts +++ /dev/null @@ -1,245 +0,0 @@ -/** - * 文件上传组件测试 - */ - -import { describe, it, expect, vi, beforeEach } from 'vitest' -import { mount } from '@vue/test-utils' -import { ElUpload, ElButton } from 'element-plus' -import FileUpload from '@/components/upload/FileUpload.vue' - -// 模拟 Element Plus 组件 -vi.mock('element-plus', () => ({ - ElUpload: { - name: 'ElUpload', - template: '
', - props: ['action', 'headers', 'data', 'multiple', 'accept', 'limit', 'fileList', 'beforeUpload', 'onProgress', 'onSuccess', 'onError', 'onRemove', 'onExceed', 'autoUpload', 'showFileList', 'drag', 'disabled'] - }, - ElButton: { - name: 'ElButton', - template: '', - props: ['type', 'disabled'] - }, - ElIcon: { - name: 'ElIcon', - template: '' - }, - ElProgress: { - name: 'ElProgress', - template: '
', - props: ['percentage', 'status', 'strokeWidth'] - } -})) - -// 模拟图标组件 -vi.mock('@element-plus/icons-vue', () => ({ - UploadFilled: { name: 'UploadFilled' }, - Upload: { name: 'Upload' }, - Document: { name: 'Document' }, - Picture: { name: 'Picture' } -})) - -// 模拟认证状态 -vi.mock('@/stores/auth', () => ({ - useAuthStore: () => ({ - token: 'mock-token' - }) -})) - -// 模拟配置 -vi.mock('@/config/constants', () => ({ - UPLOAD_CONFIG: { - DEFAULT_UPLOAD_URL: '/api/upload', - IMAGE_TYPES: ['image/jpeg', 'image/png', 'image/gif'], - DOCUMENT_TYPES: ['application/pdf', 'application/msword'], - VIDEO_TYPES: ['video/mp4', 'video/avi'], - AUDIO_TYPES: ['audio/mp3', 'audio/wav'] - } -})) - -// 模拟格式化工具 -vi.mock('@/utils/format', () => ({ - formatFileSize: (size: number) => `${size} B` -})) - -describe('FileUpload', () => { - let wrapper: any - - beforeEach(() => { - wrapper = mount(FileUpload, { - props: { - action: '/api/upload', - multiple: false, - accept: 'image/*', - limit: 5, - maxSize: 1024 * 1024, // 1MB - autoUpload: true - } - }) - }) - - afterEach(() => { - wrapper?.unmount() - }) - - it('should render correctly', () => { - expect(wrapper.exists()).toBe(true) - expect(wrapper.find('.file-upload').exists()).toBe(true) - }) - - it('should render upload button when not drag mode', () => { - expect(wrapper.find('.el-button').exists()).toBe(true) - expect(wrapper.find('.upload-dragger').exists()).toBe(false) - }) - - it('should render drag area when drag mode is enabled', async () => { - await wrapper.setProps({ drag: true }) - expect(wrapper.find('.upload-dragger').exists()).toBe(true) - }) - - it('should show upload hint', () => { - expect(wrapper.find('.upload-tip').exists()).toBe(true) - }) - - it('should emit events correctly', async () => { - const file = new File(['test'], 'test.txt', { type: 'text/plain' }) - - // 模拟文件上传成功 - await wrapper.vm.handleSuccess({ url: 'http://example.com/file.txt' }, { uid: '1', name: 'test.txt' }) - - expect(wrapper.emitted('success')).toBeTruthy() - }) - - it('should validate file type', () => { - const validFile = new File(['test'], 'test.jpg', { type: 'image/jpeg' }) - const invalidFile = new File(['test'], 'test.txt', { type: 'text/plain' }) - - // 设置接受的文件类型 - wrapper.vm.acceptTypes = 'image/jpeg,image/png' - - expect(wrapper.vm.isValidFileType(validFile)).toBe(true) - expect(wrapper.vm.isValidFileType(invalidFile)).toBe(false) - }) - - it('should validate file size', async () => { - const smallFile = new File(['small'], 'small.txt', { type: 'text/plain' }) - Object.defineProperty(smallFile, 'size', { value: 500 }) - - const largeFile = new File(['large'], 'large.txt', { type: 'text/plain' }) - Object.defineProperty(largeFile, 'size', { value: 2 * 1024 * 1024 }) // 2MB - - // 测试文件大小验证 - const result1 = await wrapper.vm.handleBeforeUpload(smallFile) - expect(result1).toBe(true) - - const result2 = await wrapper.vm.handleBeforeUpload(largeFile) - expect(result2).toBe(false) - }) - - it('should handle upload progress', () => { - const progressEvent = { percent: 50 } - const file = { uid: '1', name: 'test.txt' } - - wrapper.vm.handleProgress(progressEvent, file) - - expect(wrapper.vm.uploadPercent).toBe(50) - expect(wrapper.emitted('progress')).toBeTruthy() - }) - - it('should handle upload error', () => { - const error = new Error('Upload failed') - const file = { uid: '1', name: 'test.txt' } - - wrapper.vm.handleError(error, file) - - expect(wrapper.vm.uploadStatus).toBe('exception') - expect(wrapper.emitted('error')).toBeTruthy() - }) - - it('should handle file removal', () => { - const file = { uid: '1', name: 'test.txt' } - - wrapper.vm.handleRemove(file) - - expect(wrapper.emitted('remove')).toBeTruthy() - }) - - it('should handle exceed limit', () => { - wrapper.vm.handleExceed() - - // 应该显示警告消息(这里我们只能检查方法是否被调用) - expect(true).toBe(true) // 占位断言 - }) - - it('should clear files', () => { - wrapper.vm.fileList = [ - { uid: '1', name: 'test1.txt' }, - { uid: '2', name: 'test2.txt' } - ] - - wrapper.vm.clearFiles() - - expect(wrapper.vm.fileList).toEqual([]) - }) - - it('should compute upload headers correctly', () => { - const headers = wrapper.vm.uploadHeaders - - expect(headers).toHaveProperty('Authorization') - expect(headers.Authorization).toBe('Bearer mock-token') - expect(headers['X-Requested-With']).toBe('XMLHttpRequest') - }) - - it('should compute upload data correctly', async () => { - await wrapper.setProps({ - fileType: 'image', - data: { category: 'avatar' } - }) - - const data = wrapper.vm.uploadData - - expect(data.type).toBe('image') - expect(data.category).toBe('avatar') - }) - - it('should compute accept types correctly', async () => { - await wrapper.setProps({ fileType: 'image' }) - expect(wrapper.vm.acceptTypes).toBe('image/jpeg,image/png,image/gif') - - await wrapper.setProps({ fileType: 'document' }) - expect(wrapper.vm.acceptTypes).toBe('application/pdf,application/msword') - - await wrapper.setProps({ accept: 'custom/*' }) - expect(wrapper.vm.acceptTypes).toBe('custom/*') - }) - - it('should compute upload hint correctly', async () => { - await wrapper.setProps({ - fileType: 'image', - limit: 3, - maxSize: 1024 * 1024 - }) - - const hint = wrapper.vm.uploadHint - - expect(hint).toContain('最多3个文件') - expect(hint).toContain('JPG、PNG、GIF') - expect(hint).toContain('1024 B') // 模拟的格式化结果 - }) - - it('should handle disabled state', async () => { - await wrapper.setProps({ disabled: true }) - - expect(wrapper.find('.el-button').attributes('disabled')).toBeDefined() - }) - - it('should handle custom button text and type', async () => { - await wrapper.setProps({ - buttonText: 'Custom Upload', - buttonType: 'success' - }) - - const button = wrapper.find('.el-button') - expect(button.text()).toContain('Custom Upload') - expect(button.attributes('type')).toBe('success') - }) -}) diff --git a/web-new/tests/unit/stores/auth.test.ts b/web-new/tests/unit/stores/auth.test.ts deleted file mode 100644 index 0675f17..0000000 --- a/web-new/tests/unit/stores/auth.test.ts +++ /dev/null @@ -1,349 +0,0 @@ -/** - * 认证状态管理测试 - */ - -import { describe, it, expect, vi, beforeEach } from 'vitest' -import { setActivePinia, createPinia } from 'pinia' -import { useAuthStore } from '@/stores/auth' - -// 模拟 API -vi.mock('@/api/auth', () => ({ - authApi: { - login: vi.fn(), - register: vi.fn(), - logout: vi.fn(), - refreshToken: vi.fn(), - getUserInfo: vi.fn() - } -})) - -// 模拟存储工具 -vi.mock('@/utils/storage', () => ({ - default: { - get: vi.fn(), - set: vi.fn(), - remove: vi.fn(), - clear: vi.fn() - } -})) - -// 模拟路由 -const mockRouter = { - push: vi.fn(), - replace: vi.fn() -} - -vi.mock('vue-router', () => ({ - useRouter: () => mockRouter -})) - -// 模拟配置 -vi.mock('@/config/constants', () => ({ - STORAGE_KEYS: { - TOKEN: 'auth_token', - REFRESH_TOKEN: 'refresh_token', - USER_INFO: 'user_info' - }, - TOKEN_CONFIG: { - EXPIRES_IN: 7200, - REFRESH_THRESHOLD: 300 - } -})) - -describe('useAuthStore', () => { - let authStore: ReturnType - - beforeEach(() => { - setActivePinia(createPinia()) - authStore = useAuthStore() - vi.clearAllMocks() - }) - - describe('initial state', () => { - it('should have correct initial state', () => { - expect(authStore.token).toBe('') - expect(authStore.refreshToken).toBe('') - expect(authStore.user).toBeNull() - expect(authStore.isAuthenticated).toBe(false) - expect(authStore.isTokenExpired).toBe(true) - }) - }) - - describe('getters', () => { - it('should compute isAuthenticated correctly', () => { - expect(authStore.isAuthenticated).toBe(false) - - authStore.token = 'valid-token' - authStore.tokenExpireTime = Date.now() + 3600000 // 1小时后过期 - - expect(authStore.isAuthenticated).toBe(true) - }) - - it('should compute isTokenExpired correctly', () => { - expect(authStore.isTokenExpired).toBe(true) - - authStore.tokenExpireTime = Date.now() + 3600000 // 1小时后过期 - expect(authStore.isTokenExpired).toBe(false) - - authStore.tokenExpireTime = Date.now() - 3600000 // 1小时前过期 - expect(authStore.isTokenExpired).toBe(true) - }) - - it('should compute needsRefresh correctly', () => { - authStore.tokenExpireTime = Date.now() + 600000 // 10分钟后过期 - expect(authStore.needsRefresh).toBe(true) - - authStore.tokenExpireTime = Date.now() + 3600000 // 1小时后过期 - expect(authStore.needsRefresh).toBe(false) - }) - - it('should compute user properties correctly', () => { - authStore.user = { - id: '1', - username: 'testuser', - nickname: 'Test User', - email: 'test@example.com', - avatar: 'avatar.jpg', - role: 'user', - createTime: Date.now(), - updateTime: Date.now() - } - - expect(authStore.userId).toBe('1') - expect(authStore.username).toBe('testuser') - expect(authStore.nickname).toBe('Test User') - expect(authStore.email).toBe('test@example.com') - expect(authStore.avatar).toBe('avatar.jpg') - expect(authStore.userRole).toBe('user') - }) - }) - - describe('actions', () => { - describe('login', () => { - it('should login successfully', async () => { - const mockResponse = { - token: 'new-token', - refreshToken: 'new-refresh-token', - expiresIn: 7200, - user: { - id: '1', - username: 'testuser', - nickname: 'Test User', - email: 'test@example.com' - } - } - - const { authApi } = await import('@/api/auth') - vi.mocked(authApi.login).mockResolvedValue(mockResponse) - - const loginData = { - username: 'testuser', - password: 'password123' - } - - const result = await authStore.login(loginData) - - expect(authApi.login).toHaveBeenCalledWith(loginData) - expect(authStore.token).toBe('new-token') - expect(authStore.refreshToken).toBe('new-refresh-token') - expect(authStore.user).toEqual(mockResponse.user) - expect(result).toEqual(mockResponse) - }) - - it('should handle login failure', async () => { - const { authApi } = await import('@/api/auth') - const error = new Error('Invalid credentials') - vi.mocked(authApi.login).mockRejectedValue(error) - - const loginData = { - username: 'testuser', - password: 'wrongpassword' - } - - await expect(authStore.login(loginData)).rejects.toThrow('Invalid credentials') - expect(authStore.token).toBe('') - expect(authStore.user).toBeNull() - }) - }) - - describe('register', () => { - it('should register successfully', async () => { - const mockResponse = { - token: 'new-token', - refreshToken: 'new-refresh-token', - expiresIn: 7200, - user: { - id: '1', - username: 'newuser', - nickname: 'New User', - email: 'new@example.com' - } - } - - const { authApi } = await import('@/api/auth') - vi.mocked(authApi.register).mockResolvedValue(mockResponse) - - const registerData = { - username: 'newuser', - password: 'password123', - email: 'new@example.com', - nickname: 'New User' - } - - const result = await authStore.register(registerData) - - expect(authApi.register).toHaveBeenCalledWith(registerData) - expect(authStore.token).toBe('new-token') - expect(authStore.user).toEqual(mockResponse.user) - expect(result).toEqual(mockResponse) - }) - }) - - describe('logout', () => { - it('should logout successfully', async () => { - // 设置初始状态 - authStore.token = 'current-token' - authStore.refreshToken = 'current-refresh-token' - authStore.user = { id: '1', username: 'testuser' } as any - - const { authApi } = await import('@/api/auth') - vi.mocked(authApi.logout).mockResolvedValue(undefined) - - await authStore.logout() - - expect(authApi.logout).toHaveBeenCalled() - expect(authStore.token).toBe('') - expect(authStore.refreshToken).toBe('') - expect(authStore.user).toBeNull() - expect(authStore.tokenExpireTime).toBe(0) - }) - - it('should clear state even if API call fails', async () => { - authStore.token = 'current-token' - authStore.user = { id: '1', username: 'testuser' } as any - - const { authApi } = await import('@/api/auth') - vi.mocked(authApi.logout).mockRejectedValue(new Error('Network error')) - - await authStore.logout() - - expect(authStore.token).toBe('') - expect(authStore.user).toBeNull() - }) - }) - - describe('refreshToken', () => { - it('should refresh token successfully', async () => { - authStore.refreshToken = 'current-refresh-token' - - const mockResponse = { - token: 'new-token', - refreshToken: 'new-refresh-token', - expiresIn: 7200 - } - - const { authApi } = await import('@/api/auth') - vi.mocked(authApi.refreshToken).mockResolvedValue(mockResponse) - - const result = await authStore.refreshTokenAction() - - expect(authApi.refreshToken).toHaveBeenCalledWith('current-refresh-token') - expect(authStore.token).toBe('new-token') - expect(authStore.refreshToken).toBe('new-refresh-token') - expect(result).toEqual(mockResponse) - }) - - it('should handle refresh token failure', async () => { - authStore.refreshToken = 'invalid-refresh-token' - - const { authApi } = await import('@/api/auth') - vi.mocked(authApi.refreshToken).mockRejectedValue(new Error('Invalid refresh token')) - - await expect(authStore.refreshTokenAction()).rejects.toThrow('Invalid refresh token') - }) - }) - - describe('updateUserInfo', () => { - it('should update user info', async () => { - authStore.user = { - id: '1', - username: 'testuser', - nickname: 'Old Name', - email: 'old@example.com' - } as any - - const updates = { - nickname: 'New Name', - email: 'new@example.com' - } - - await authStore.updateUserInfo(updates) - - expect(authStore.user?.nickname).toBe('New Name') - expect(authStore.user?.email).toBe('new@example.com') - expect(authStore.user?.username).toBe('testuser') // 保持不变 - }) - }) - - describe('checkAuthStatus', () => { - it('should return true for valid authentication', () => { - authStore.token = 'valid-token' - authStore.tokenExpireTime = Date.now() + 3600000 - - expect(authStore.checkAuthStatus()).toBe(true) - }) - - it('should return false for expired token', () => { - authStore.token = 'expired-token' - authStore.tokenExpireTime = Date.now() - 3600000 - - expect(authStore.checkAuthStatus()).toBe(false) - }) - - it('should return false for missing token', () => { - authStore.token = '' - - expect(authStore.checkAuthStatus()).toBe(false) - }) - }) - }) - - describe('persistence', () => { - it('should save state to storage', () => { - const storage = require('@/utils/storage').default - - authStore.token = 'test-token' - authStore.refreshToken = 'test-refresh-token' - authStore.user = { id: '1', username: 'testuser' } as any - - authStore.saveToStorage() - - expect(storage.set).toHaveBeenCalledWith('auth_token', 'test-token') - expect(storage.set).toHaveBeenCalledWith('refresh_token', 'test-refresh-token') - expect(storage.set).toHaveBeenCalledWith('user_info', authStore.user) - }) - - it('should load state from storage', () => { - const storage = require('@/utils/storage').default - - storage.get.mockImplementation((key: string) => { - switch (key) { - case 'auth_token': - return 'stored-token' - case 'refresh_token': - return 'stored-refresh-token' - case 'user_info': - return { id: '1', username: 'storeduser' } - default: - return null - } - }) - - authStore.loadFromStorage() - - expect(authStore.token).toBe('stored-token') - expect(authStore.refreshToken).toBe('stored-refresh-token') - expect(authStore.user).toEqual({ id: '1', username: 'storeduser' }) - }) - }) -}) diff --git a/web-new/tests/unit/utils/format.test.ts b/web-new/tests/unit/utils/format.test.ts deleted file mode 100644 index befc5c1..0000000 --- a/web-new/tests/unit/utils/format.test.ts +++ /dev/null @@ -1,223 +0,0 @@ -/** - * 格式化工具函数测试 - */ - -import { describe, it, expect, vi, beforeEach } from 'vitest' -import { - formatDate, - formatDateTime, - formatTime, - formatRelativeTime, - formatFileSize, - formatNumber, - formatCurrency, - maskPhone, - maskEmail, - truncateText -} from '@/utils/format' - -describe('format utils', () => { - beforeEach(() => { - // 重置时间相关的模拟 - vi.useFakeTimers() - vi.setSystemTime(new Date('2024-01-15 12:00:00')) - }) - - afterEach(() => { - vi.useRealTimers() - }) - - describe('formatDate', () => { - it('should format timestamp to date string', () => { - const timestamp = new Date('2024-01-15').getTime() - expect(formatDate(timestamp)).toBe('2024-01-15') - }) - - it('should format Date object to date string', () => { - const date = new Date('2024-01-15') - expect(formatDate(date)).toBe('2024-01-15') - }) - - it('should use custom format', () => { - const timestamp = new Date('2024-01-15').getTime() - expect(formatDate(timestamp, 'MM/DD/YYYY')).toBe('01/15/2024') - }) - }) - - describe('formatDateTime', () => { - it('should format timestamp to datetime string', () => { - const timestamp = new Date('2024-01-15 12:30:45').getTime() - expect(formatDateTime(timestamp)).toBe('2024-01-15 12:30:45') - }) - - it('should use custom format', () => { - const timestamp = new Date('2024-01-15 12:30:45').getTime() - expect(formatDateTime(timestamp, 'YYYY年MM月DD日 HH:mm')).toBe('2024年01月15日 12:30') - }) - }) - - describe('formatTime', () => { - it('should format timestamp to time string', () => { - const timestamp = new Date('2024-01-15 12:30:45').getTime() - expect(formatTime(timestamp)).toBe('12:30:45') - }) - - it('should use custom format', () => { - const timestamp = new Date('2024-01-15 12:30:45').getTime() - expect(formatTime(timestamp, 'HH:mm')).toBe('12:30') - }) - }) - - describe('formatRelativeTime', () => { - it('should return "刚刚" for very recent time', () => { - const timestamp = Date.now() - 1000 // 1秒前 - expect(formatRelativeTime(timestamp)).toBe('刚刚') - }) - - it('should return minutes ago', () => { - const timestamp = Date.now() - 5 * 60 * 1000 // 5分钟前 - expect(formatRelativeTime(timestamp)).toBe('5分钟前') - }) - - it('should return hours ago', () => { - const timestamp = Date.now() - 2 * 60 * 60 * 1000 // 2小时前 - expect(formatRelativeTime(timestamp)).toBe('2小时前') - }) - - it('should return days ago', () => { - const timestamp = Date.now() - 3 * 24 * 60 * 60 * 1000 // 3天前 - expect(formatRelativeTime(timestamp)).toBe('3天前') - }) - - it('should return formatted date for old time', () => { - const timestamp = Date.now() - 10 * 24 * 60 * 60 * 1000 // 10天前 - expect(formatRelativeTime(timestamp)).toMatch(/\d{4}-\d{2}-\d{2}/) - }) - }) - - describe('formatFileSize', () => { - it('should format bytes', () => { - expect(formatFileSize(512)).toBe('512 B') - }) - - it('should format KB', () => { - expect(formatFileSize(1024)).toBe('1.0 KB') - expect(formatFileSize(1536)).toBe('1.5 KB') - }) - - it('should format MB', () => { - expect(formatFileSize(1024 * 1024)).toBe('1.0 MB') - expect(formatFileSize(1024 * 1024 * 2.5)).toBe('2.5 MB') - }) - - it('should format GB', () => { - expect(formatFileSize(1024 * 1024 * 1024)).toBe('1.0 GB') - }) - - it('should handle zero size', () => { - expect(formatFileSize(0)).toBe('0 B') - }) - - it('should handle negative size', () => { - expect(formatFileSize(-1024)).toBe('0 B') - }) - }) - - describe('formatNumber', () => { - it('should format number with default options', () => { - expect(formatNumber(1234.567)).toBe('1,234.567') - }) - - it('should format number with custom decimal places', () => { - expect(formatNumber(1234.567, { decimals: 2 })).toBe('1,234.57') - }) - - it('should format number without separator', () => { - expect(formatNumber(1234.567, { separator: false })).toBe('1234.567') - }) - - it('should handle zero', () => { - expect(formatNumber(0)).toBe('0') - }) - - it('should handle negative numbers', () => { - expect(formatNumber(-1234.567)).toBe('-1,234.567') - }) - }) - - describe('formatCurrency', () => { - it('should format currency with default options', () => { - expect(formatCurrency(1234.56)).toBe('¥1,234.56') - }) - - it('should format currency with custom symbol', () => { - expect(formatCurrency(1234.56, { symbol: '$' })).toBe('$1,234.56') - }) - - it('should format currency with custom decimal places', () => { - expect(formatCurrency(1234.567, { decimals: 3 })).toBe('¥1,234.567') - }) - }) - - describe('maskPhone', () => { - it('should mask phone number', () => { - expect(maskPhone('13812345678')).toBe('138****5678') - }) - - it('should handle short phone number', () => { - expect(maskPhone('12345')).toBe('12345') - }) - - it('should handle empty phone number', () => { - expect(maskPhone('')).toBe('') - }) - - it('should handle null/undefined', () => { - expect(maskPhone(null)).toBe('') - expect(maskPhone(undefined)).toBe('') - }) - }) - - describe('maskEmail', () => { - it('should mask email address', () => { - expect(maskEmail('test@example.com')).toBe('t***@example.com') - }) - - it('should handle short email', () => { - expect(maskEmail('a@b.c')).toBe('a***@b.c') - }) - - it('should handle invalid email', () => { - expect(maskEmail('invalid-email')).toBe('invalid-email') - }) - - it('should handle empty email', () => { - expect(maskEmail('')).toBe('') - }) - }) - - describe('truncateText', () => { - it('should truncate long text', () => { - const text = 'This is a very long text that should be truncated' - expect(truncateText(text, 20)).toBe('This is a very long...') - }) - - it('should not truncate short text', () => { - const text = 'Short text' - expect(truncateText(text, 20)).toBe('Short text') - }) - - it('should use custom suffix', () => { - const text = 'This is a very long text' - expect(truncateText(text, 10, '---')).toBe('This is a---') - }) - - it('should handle empty text', () => { - expect(truncateText('', 10)).toBe('') - }) - - it('should handle zero length', () => { - expect(truncateText('Hello', 0)).toBe('...') - }) - }) -}) diff --git a/web-new/tests/unit/utils/validation.test.ts b/web-new/tests/unit/utils/validation.test.ts deleted file mode 100644 index 0214d35..0000000 --- a/web-new/tests/unit/utils/validation.test.ts +++ /dev/null @@ -1,220 +0,0 @@ -/** - * 验证工具函数测试 - */ - -import { describe, it, expect } from 'vitest' -import { - validateEmail, - validatePhone, - validatePassword, - validateUsername, - validateUrl, - validateIdCard, - validateRequired, - validateLength, - validateNumber, - validateInteger, - validatePositive, - validateRange -} from '@/utils/validation' - -describe('validation utils', () => { - describe('validateEmail', () => { - it('should validate correct email addresses', () => { - expect(validateEmail('test@example.com')).toBe(true) - expect(validateEmail('user.name@domain.co.uk')).toBe(true) - expect(validateEmail('user+tag@example.org')).toBe(true) - expect(validateEmail('123@456.com')).toBe(true) - }) - - it('should reject invalid email addresses', () => { - expect(validateEmail('invalid-email')).toBe(false) - expect(validateEmail('test@')).toBe(false) - expect(validateEmail('@example.com')).toBe(false) - expect(validateEmail('test..test@example.com')).toBe(false) - expect(validateEmail('')).toBe(false) - }) - }) - - describe('validatePhone', () => { - it('should validate correct phone numbers', () => { - expect(validatePhone('13812345678')).toBe(true) - expect(validatePhone('15987654321')).toBe(true) - expect(validatePhone('18612345678')).toBe(true) - }) - - it('should reject invalid phone numbers', () => { - expect(validatePhone('12345678901')).toBe(false) // 不是1开头 - expect(validatePhone('1381234567')).toBe(false) // 长度不够 - expect(validatePhone('138123456789')).toBe(false) // 长度过长 - expect(validatePhone('13a12345678')).toBe(false) // 包含字母 - expect(validatePhone('')).toBe(false) - }) - }) - - describe('validatePassword', () => { - it('should validate correct passwords', () => { - expect(validatePassword('abc123')).toBe(true) - expect(validatePassword('Password1')).toBe(true) - expect(validatePassword('test123456')).toBe(true) - }) - - it('should reject invalid passwords', () => { - expect(validatePassword('12345')).toBe(false) // 长度不够 - expect(validatePassword('abcdef')).toBe(false) // 只有字母 - expect(validatePassword('123456')).toBe(false) // 只有数字 - expect(validatePassword('')).toBe(false) - expect(validatePassword('a'.repeat(21))).toBe(false) // 长度过长 - }) - }) - - describe('validateUsername', () => { - it('should validate correct usernames', () => { - expect(validateUsername('user123')).toBe(true) - expect(validateUsername('test_user')).toBe(true) - expect(validateUsername('用户名')).toBe(true) - expect(validateUsername('user_123')).toBe(true) - }) - - it('should reject invalid usernames', () => { - expect(validateUsername('ab')).toBe(false) // 长度不够 - expect(validateUsername('user-name')).toBe(false) // 包含连字符 - expect(validateUsername('user@name')).toBe(false) // 包含特殊字符 - expect(validateUsername('')).toBe(false) - expect(validateUsername('a'.repeat(21))).toBe(false) // 长度过长 - }) - }) - - describe('validateUrl', () => { - it('should validate correct URLs', () => { - expect(validateUrl('https://example.com')).toBe(true) - expect(validateUrl('http://test.org')).toBe(true) - expect(validateUrl('https://sub.domain.com/path?query=1')).toBe(true) - expect(validateUrl('ftp://files.example.com')).toBe(true) - }) - - it('should reject invalid URLs', () => { - expect(validateUrl('not-a-url')).toBe(false) - expect(validateUrl('example.com')).toBe(false) // 缺少协议 - expect(validateUrl('http://')).toBe(false) - expect(validateUrl('')).toBe(false) - }) - }) - - describe('validateIdCard', () => { - it('should validate correct ID card numbers', () => { - expect(validateIdCard('110101199003077777')).toBe(true) - expect(validateIdCard('11010119900307777X')).toBe(true) - }) - - it('should reject invalid ID card numbers', () => { - expect(validateIdCard('12345678901234567')).toBe(false) // 长度不够 - expect(validateIdCard('1234567890123456789')).toBe(false) // 长度过长 - expect(validateIdCard('11010119900307777Y')).toBe(false) // 最后一位不是X - expect(validateIdCard('')).toBe(false) - }) - }) - - describe('validateRequired', () => { - it('should validate required values', () => { - expect(validateRequired('test')).toBe(true) - expect(validateRequired(123)).toBe(true) - expect(validateRequired(0)).toBe(true) - expect(validateRequired(false)).toBe(true) - }) - - it('should reject empty values', () => { - expect(validateRequired('')).toBe(false) - expect(validateRequired(' ')).toBe(false) // 只有空格 - expect(validateRequired(null)).toBe(false) - expect(validateRequired(undefined)).toBe(false) - }) - }) - - describe('validateLength', () => { - it('should validate correct length', () => { - expect(validateLength('test', 3, 5)).toBe(true) - expect(validateLength('hello', 5, 10)).toBe(true) - expect(validateLength('ab', 1, 3)).toBe(true) - }) - - it('should reject incorrect length', () => { - expect(validateLength('ab', 3, 5)).toBe(false) // 太短 - expect(validateLength('toolong', 3, 5)).toBe(false) // 太长 - expect(validateLength('', 1, 5)).toBe(false) // 空字符串 - }) - - it('should handle edge cases', () => { - expect(validateLength('test', 4, 4)).toBe(true) // 正好等于边界 - expect(validateLength('test', 0, 10)).toBe(true) // 最小长度为0 - }) - }) - - describe('validateNumber', () => { - it('should validate numbers', () => { - expect(validateNumber(123)).toBe(true) - expect(validateNumber(0)).toBe(true) - expect(validateNumber(-456)).toBe(true) - expect(validateNumber(3.14)).toBe(true) - expect(validateNumber('123')).toBe(true) - expect(validateNumber('3.14')).toBe(true) - }) - - it('should reject non-numbers', () => { - expect(validateNumber('abc')).toBe(false) - expect(validateNumber('12abc')).toBe(false) - expect(validateNumber('')).toBe(false) - expect(validateNumber(null)).toBe(false) - expect(validateNumber(undefined)).toBe(false) - expect(validateNumber(NaN)).toBe(false) - }) - }) - - describe('validateInteger', () => { - it('should validate integers', () => { - expect(validateInteger(123)).toBe(true) - expect(validateInteger(0)).toBe(true) - expect(validateInteger(-456)).toBe(true) - expect(validateInteger('123')).toBe(true) - expect(validateInteger('-456')).toBe(true) - }) - - it('should reject non-integers', () => { - expect(validateInteger(3.14)).toBe(false) - expect(validateInteger('3.14')).toBe(false) - expect(validateInteger('abc')).toBe(false) - expect(validateInteger('')).toBe(false) - }) - }) - - describe('validatePositive', () => { - it('should validate positive numbers', () => { - expect(validatePositive(123)).toBe(true) - expect(validatePositive(0.1)).toBe(true) - expect(validatePositive('123')).toBe(true) - }) - - it('should reject non-positive numbers', () => { - expect(validatePositive(0)).toBe(false) - expect(validatePositive(-123)).toBe(false) - expect(validatePositive('-123')).toBe(false) - expect(validatePositive('abc')).toBe(false) - }) - }) - - describe('validateRange', () => { - it('should validate numbers in range', () => { - expect(validateRange(5, 1, 10)).toBe(true) - expect(validateRange(1, 1, 10)).toBe(true) // 边界值 - expect(validateRange(10, 1, 10)).toBe(true) // 边界值 - expect(validateRange('5', 1, 10)).toBe(true) - }) - - it('should reject numbers out of range', () => { - expect(validateRange(0, 1, 10)).toBe(false) - expect(validateRange(11, 1, 10)).toBe(false) - expect(validateRange(-5, 1, 10)).toBe(false) - expect(validateRange('abc', 1, 10)).toBe(false) - }) - }) -}) diff --git a/web-new/tsconfig.json b/web-new/tsconfig.json deleted file mode 100644 index d5358ed..0000000 --- a/web-new/tsconfig.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2020", - "useDefineForClassFields": true, - "lib": ["ES2020", "DOM", "DOM.Iterable"], - "module": "ESNext", - "skipLibCheck": true, - - /* Bundler mode */ - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true, - "jsx": "preserve", - - /* Linting */ - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true, - - /* Path mapping */ - "baseUrl": ".", - "paths": { - "@/*": ["src/*"], - "~/*": ["src/*"] - }, - - /* Additional options */ - "allowSyntheticDefaultImports": true, - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "types": [ - "node", - "vite/client", - "element-plus/global", - "unplugin-auto-import/client" - ] - }, - "include": [ - "src/**/*.ts", - "src/**/*.d.ts", - "src/**/*.tsx", - "src/**/*.vue", - "src/types/global.d.ts", - "auto-imports.d.ts", - "components.d.ts" - ], - "exclude": [ - "node_modules", - "dist" - ], - "references": [ - { "path": "./tsconfig.node.json" } - ] -} diff --git a/web-new/tsconfig.node.json b/web-new/tsconfig.node.json deleted file mode 100644 index 7238f1f..0000000 --- a/web-new/tsconfig.node.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "compilerOptions": { - "composite": true, - "skipLibCheck": true, - "module": "ESNext", - "moduleResolution": "bundler", - "allowSyntheticDefaultImports": true, - "strict": true, - "types": ["node"] - }, - "include": [ - "vite.config.*", - "vitest.config.*", - "cypress.config.*", - "playwright.config.*" - ] -} diff --git a/web-new/vite.config.ts b/web-new/vite.config.ts deleted file mode 100644 index ab2933f..0000000 --- a/web-new/vite.config.ts +++ /dev/null @@ -1,223 +0,0 @@ -import { defineConfig } from 'vite' -import vue from '@vitejs/plugin-vue' -import { resolve } from 'path' -import AutoImport from 'unplugin-auto-import/vite' -import Components from 'unplugin-vue-components/vite' -import { ElementPlusResolver } from 'unplugin-vue-components/resolvers' -import { VitePWA } from 'vite-plugin-pwa' -import { visualizer } from 'rollup-plugin-visualizer' -import viteCompression from 'vite-plugin-compression' -import VueI18nPlugin from '@intlify/unplugin-vue-i18n/vite' - -// https://vitejs.dev/config/ -export default defineConfig(({ mode, command }) => { - const isProduction = mode === 'production' - const isAnalyze = mode === 'analyze' - - return { - base: isProduction ? '/emotion-museum/' : '/', - plugins: [ - vue(), - - // 自动导入 - AutoImport({ - imports: [ - 'vue', - 'vue-router', - 'pinia', - '@vueuse/core', - { - 'vue-i18n': ['useI18n'] - } - ], - resolvers: [ElementPlusResolver()], - dts: true, - eslintrc: { - enabled: true - } - }), - - // 组件自动导入 - Components({ - resolvers: [ElementPlusResolver()], - dts: true - }), - - // PWA支持 - VitePWA({ - registerType: 'autoUpdate', - includeAssets: ['favicon.ico', 'apple-touch-icon.png'], - manifest: { - name: '情绪博物馆', - short_name: '情绪博物馆', - description: '记录情绪,分享心情的温暖空间', - theme_color: '#4A90E2', - background_color: '#ffffff', - display: 'standalone', - icons: [ - { - src: 'pwa-192x192.png', - sizes: '192x192', - type: 'image/png' - }, - { - src: 'pwa-512x512.png', - sizes: '512x512', - type: 'image/png' - } - ] - }, - workbox: { - globPatterns: ['**/*.{js,css,html,ico,png,svg}'] - } - }), - - // 国际化支持 - VueI18nPlugin({ - include: resolve(__dirname, './src/i18n/locales/**') - }), - - // Gzip压缩(仅生产环境) - isProduction && viteCompression({ - verbose: true, - disable: false, - threshold: 10240, - algorithm: 'gzip', - ext: '.gz' - }), - - // 构建分析(仅分析模式) - isAnalyze && visualizer({ - filename: 'dist/stats.html', - open: true, - gzipSize: true, - brotliSize: true - }) - ].filter(Boolean), - - resolve: { - alias: { - '@': resolve(__dirname, 'src'), - '~': resolve(__dirname, 'src') - } - }, - - define: { - global: 'globalThis', - __VUE_I18N_FULL_INSTALL__: true, - __VUE_I18N_LEGACY_API__: false, - __INTLIFY_PROD_DEVTOOLS__: false - }, - - server: { - port: 5173, - open: true, - proxy: { - '/api': { - target: 'http://localhost:19089', - changeOrigin: true, - secure: false - }, - '/ws': { - target: 'ws://localhost:19089', - ws: true, - changeOrigin: true - } - } - }, - - build: { - outDir: 'dist', - sourcemap: !isProduction, - minify: isProduction ? 'terser' : false, - terserOptions: isProduction ? { - compress: { - drop_console: true, - drop_debugger: true, - pure_funcs: ['console.log', 'console.info', 'console.debug'] - }, - mangle: { - safari10: true - } - } : {}, - rollupOptions: { - external: (id) => { - if (id.includes('echarts') && id.includes('extension')) { - return true - } - return false - }, - output: { - chunkFileNames: 'js/[name]-[hash].js', - entryFileNames: 'js/[name]-[hash].js', - assetFileNames: (assetInfo) => { - const fileName = assetInfo.name || 'asset' - const info = fileName.split('.') - const ext = info[info.length - 1] - if (/\.(mp4|webm|ogg|mp3|wav|flac|aac)$/.test(fileName)) { - return `media/[name]-[hash].${ext}` - } - if (/\.(png|jpe?g|gif|svg|webp|ico)$/.test(fileName)) { - return `images/[name]-[hash].${ext}` - } - if (/\.(woff2?|eot|ttf|otf)$/.test(fileName)) { - return `fonts/[name]-[hash].${ext}` - } - return `assets/[name]-[hash].${ext}` - }, - manualChunks: (id) => { - // 第三方库分包 - if (id.includes('node_modules')) { - if (id.includes('vue') || id.includes('pinia') || id.includes('vue-router')) { - return 'vue-vendor' - } - if (id.includes('element-plus')) { - return 'element-plus' - } - if (id.includes('echarts')) { - return 'echarts' - } - if (id.includes('lodash') || id.includes('dayjs') || id.includes('axios')) { - return 'utils' - } - return 'vendor' - } - - // 业务模块分包 - if (id.includes('/src/views/')) { - const pathSegments = id.split('/src/views/')[1].split('/') - if (pathSegments.length > 1) { - return `pages-${pathSegments[0]}` - } - } - - if (id.includes('/src/components/')) { - return 'components' - } - } - } - }, - - // 构建性能优化 - chunkSizeWarningLimit: 1000, - reportCompressedSize: !isProduction, - - // 目标浏览器 - target: ['es2015', 'chrome63', 'firefox67', 'safari12'] - }, - - optimizeDeps: { - include: [ - 'vue', - 'vue-router', - 'pinia', - 'element-plus', - 'echarts', - 'vue-echarts', - '@vueuse/core', - 'dayjs', - 'lodash-es' - ] - } - } -}) diff --git a/web-new/vitest.config.ts b/web-new/vitest.config.ts deleted file mode 100644 index 5554783..0000000 --- a/web-new/vitest.config.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { defineConfig } from 'vitest/config' -import vue from '@vitejs/plugin-vue' -import { resolve } from 'path' - -export default defineConfig({ - plugins: [vue()], - test: { - // 测试环境 - environment: 'jsdom', - - // 全局测试设置 - globals: true, - - // 测试文件匹配模式 - include: [ - 'src/**/*.{test,spec}.{js,ts,vue}', - 'tests/unit/**/*.{test,spec}.{js,ts,vue}' - ], - - // 排除文件 - exclude: [ - 'node_modules', - 'dist', - 'cypress', - 'tests/e2e' - ], - - // 覆盖率配置 - coverage: { - provider: 'v8', - reporter: ['text', 'json', 'html'], - reportsDirectory: './coverage', - exclude: [ - 'node_modules/', - 'src/main.ts', - 'src/vite-env.d.ts', - '**/*.d.ts', - 'tests/', - 'coverage/', - 'dist/', - '**/*.config.{js,ts}', - 'src/assets/', - 'src/styles/', - 'public/' - ], - thresholds: { - global: { - branches: 70, - functions: 70, - lines: 70, - statements: 70 - } - } - }, - - // 设置文件 - setupFiles: ['./tests/setup.ts'], - - // 测试超时时间 - testTimeout: 10000, - - // 并发运行 - threads: true, - - // 监听模式下的配置 - watch: { - exclude: ['node_modules', 'dist'] - } - }, - resolve: { - alias: { - '@': resolve(__dirname, 'src'), - '~': resolve(__dirname, 'src') - } - } -}) diff --git a/web-new/web功能与页面梳理.md b/web-new/web功能与页面梳理.md deleted file mode 100644 index 5b3e365..0000000 --- a/web-new/web功能与页面梳理.md +++ /dev/null @@ -1,131 +0,0 @@ -# 情绪博物馆Web端功能与页面梳理 - -## 1. 总览 -情绪博物馆Web端基于Vue3+TypeScript开发,主要功能包括AI对话、情绪日记、个人仪表盘、情绪分析、社交分享等。前端通过RESTful API与后端服务交互,部分功能(如AI对话)支持WebSocket实时通信。 - -## 2. 页面与功能列表 - -### 首页(/) -- **功能描述**:产品介绍、引导注册/登录、快速入口。 -- **主要流程**:展示产品亮点,未登录用户可跳转登录/注册,已登录用户可直接进入AI对话。 -- **涉及接口**:无直接数据接口。 - -### 登录页(/login) -- **功能描述**:用户登录,支持验证码、第三方登录。 -- **主要流程**:输入账号/密码/验证码,调用登录接口,登录成功后跳转首页或上次访问页。 -- **涉及接口**: - - POST /auth/login 用户登录 - - GET /auth/captcha 获取验证码 - - POST /auth/oauth/login 第三方登录 - -### 注册页(/register) -- **功能描述**:新用户注册。 -- **主要流程**:填写注册信息,获取验证码,注册成功自动登录。 -- **涉及接口**: - - POST /auth/register 用户注册 - - GET /auth/captcha 获取验证码 - -### AI对话(/chat) -- **功能描述**:与AI(开开)进行实时情绪对话。 -- **主要流程**: - 1. 进入页面自动建立WebSocket连接。 - 2. 用户输入消息,前端通过WebSocket发送到后端。 - 3. AI回复通过WebSocket推送到前端。 -- **涉及接口**: - - WebSocket /ws/chat 实时对话 - - POST /conversation 创建会话 - - GET /conversation/user/{userId} 获取用户会话 - - DELETE /conversation/{sessionId} 删除会话 - -### 聊天历史(/chat-history) -- **功能描述**:查看历史对话记录。 -- **主要流程**:分页加载历史会话和消息。 -- **涉及接口**: - - GET /conversation/user/{userId} 获取用户会话 - - GET /message/user/page 分页获取消息 - -### 情绪日记(/diary) -- **功能描述**:发布、查看个人情绪日记,AI自动点评。 -- **主要流程**: - 1. 用户输入日记内容,点击发布。 - 2. 日记发布后自动刷新列表,AI生成点评。 -- **涉及接口**: - - POST /diary-post/publish 发布日记 - - GET /diary-post/user/{userId}/page 获取用户日记 - -### 个人仪表盘(/personal-dashboard) -- **功能描述**:展示用户基础信息、成长数据、兴趣、技能等。 -- **主要流程**:页面加载时获取用户信息和成长统计。 -- **涉及接口**: - - GET /user/profile 获取用户资料 - - GET /user/growth-stats 获取成长数据 - -### 情绪分析(/analysis) -- **功能描述**:情绪趋势、雷达图等可视化分析(开发中)。 -- **主要流程**:后续补充。 -- **涉及接口**:后续补充。 - -### 其他页面 -- **人生里程碑(/life-milestones)**:展示用户重要事件。 -- **人生轨迹(/life-trajectory)**:可视化用户成长轨迹。 -- **消息中心(/messages)**:系统与AI消息通知。 -- **设置(/settings)**:账号与隐私设置。 -- **话题追踪(/topic-tracker)**:追踪关注的话题。 -- **情绪管理(/emotion)**:情绪记录与管理。 -- **情绪地图(/map)**:情绪地理分布。 -- **社交分享(/social)**:分享内容到社交平台。 -- **个人中心(/profile)**:个人信息管理。 -- **调试/错误页面**:/debug, /404, /403等。 - -## 3. 主要流程说明 - -### 登录流程 -1. 用户输入账号、密码、验证码,点击登录。 -2. 前端调用POST /auth/login,成功后保存token,跳转首页。 -3. 登录后可获取当前用户信息(GET /auth/user/info)。 - -### AI对话流程 -1. 进入/chat页面,自动建立WebSocket连接。 -2. 用户输入消息,通过WebSocket发送到后端(/ws/chat,/app/chat.send)。 -3. AI回复通过WebSocket推送到前端。 -4. 会话和消息历史通过REST接口管理。 - -### 日记发布流程 -1. 用户输入日记内容,点击发布。 -2. 前端调用POST /diary-post/publish。 -3. 发布成功后刷新日记列表(GET /diary-post/user/{userId}/page)。 -4. AI自动生成点评并展示。 - -## 4. 附录:接口汇总表 - -#### 除了/auth的接口,其他所有接口都要在请求头中携带token调用 - -| 接口路径 | 方法 | 说明 | -| --- | --- | --- | -| /auth/login | POST | 用户登录 | -| /auth/register | POST | 用户注册 | -| /auth/captcha | GET | 获取验证码 | -| /auth/logout | POST | 用户登出 | -| /auth/user/info | GET | 获取当前用户信息 | -| /auth/refresh-token | POST | 刷新Token | -| /conversation | POST | 创建会话 | -| /conversation/user/{userId} | GET | 获取用户会话列表 | -| /conversation/{sessionId} | DELETE | 删除会话 | -| /message/user/page | GET | 分页获取用户消息 | -| /message/user/search | POST | 搜索用户消息 | -| /message/user/recent | POST | 获取最近消息 | -| /message/{id} | GET | 获取消息详情 | -| /diary-post/publish | POST | 发布日记 | -| /diary-post/user/{userId}/page | GET | 获取用户日记 | -| /user/profile | GET | 获取用户资料 | -| /user/growth-stats | GET | 获取成长数据 | -| /user/profile | PUT | 更新用户资料 | -| /user/avatar/upload | POST | 上传头像 | -| /user/password | PUT | 修改密码 | -| /user/email/verify | POST | 验证邮箱 | -| /user/email/send-code | POST | 发送邮箱验证码 | -| /user/phone/verify | POST | 验证手机号 | -| /user/phone/send-code | POST | 发送手机验证码 | -| /ws/chat | WebSocket | AI对话实时通信 | - -> 说明:部分页面如“人生里程碑”“情绪分析”等功能正在开发中,接口和流程会持续完善。 \ No newline at end of file diff --git a/web-new/前端技术方案Augment.md b/web-new/前端技术方案Augment.md deleted file mode 100644 index 172e9f1..0000000 --- a/web-new/前端技术方案Augment.md +++ /dev/null @@ -1,1138 +0,0 @@ -# 情绪博物馆Web端技术方案 - -## 技术选型说明 - -### WebSocket通信方案选择 - -本方案选择 **STOMP + 原生WebSocket** 而非 Socket.io 的原因: - -1. **后端集成优势**: 项目后端使用Spring Boot,STOMP是Spring WebSocket的原生支持协议 -2. **标准化协议**: STOMP是标准的消息传递协议,不依赖特定实现 -3. **消息队列支持**: 天然支持点对点和发布订阅模式,适合聊天和通知场景 -4. **轻量级**: 相比Socket.io更轻量,减少前端包体积 -5. **Token认证支持**: 原生WebSocket支持在握手时传递自定义请求头进行Token认证 - -### 技术栈版本策略 - -- **稳定性优先**: 选择经过验证的稳定版本 -- **生态兼容**: 确保各组件间良好兼容 -- **长期支持**: 优先选择有LTS支持的版本 -- **性能考虑**: 新版本的性能优化和bug修复 - -## 1. 核心技术栈(推荐版本) - -### 1.1 前端框架 - -- **Vue.js**: `3.4.21` (最新稳定版) -- **TypeScript**: `5.4.2` (最新稳定版) -- **Vite**: `5.1.6` (最新稳定版,更好的构建性能) - -### 1.2 UI框架与样式 - -- **Element Plus**: `2.6.1` (最新稳定版,更好的Vue3支持) -- **Tailwind CSS**: `3.4.1` (最新稳定版) -- **@tailwindcss/forms**: `0.5.7` (表单样式增强) -- **@tailwindcss/typography**: `0.5.10` (文本排版增强) - -### 1.3 状态管理与路由 - -- **Pinia**: `2.1.7` (保持现有版本,稳定可靠) -- **Vue Router**: `4.3.0` (最新稳定版) -- **@pinia/nuxt**: `0.5.1` (如果需要SSR支持) - -### 1.4 HTTP客户端与实时通信 - -- **Axios**: `1.6.8` (最新稳定版) -- **@stomp/stompjs**: `7.1.1` (WebSocket通信,与Spring Boot后端集成,支持Token认证) - -### 1.5 数据可视化 - -- **ECharts**: `5.5.0` (最新稳定版) -- **vue-echarts**: `6.7.3` (Vue3专用ECharts组件) -- **@antv/g2**: `5.1.15` (备选图表库,更现代化) - -### 1.6 工具库 - -- **Day.js**: `1.11.10` (最新稳定版) -- **Lodash-es**: `4.17.21` (ES模块版本) -- **Zod**: `3.22.4` (数据验证) -- **VueUse**: `10.9.0` (Vue组合式API工具集) - -### 1.7 开发工具 - -- **@vitejs/plugin-vue**: `5.0.4` -- **@vue/tsconfig**: `0.5.1` -- **vue-tsc**: `2.0.6` -- **unplugin-auto-import**: `0.17.5` (自动导入) -- **unplugin-vue-components**: `0.26.0` (组件自动导入) - -## 2. 新增推荐技术栈 - -### 2.1 表单处理 - -- **@vuelidate/core**: `2.0.3` (表单验证) -- **@vuelidate/validators**: `2.0.4` -- **vue-hooks-form**: `0.8.6` (表单状态管理) - -### 2.2 动画与交互 - -- **@vueuse/motion**: `2.0.0` (动画库) -- **vue-toastification**: `2.0.0-rc.5` (通知组件) -- **nprogress**: `0.2.0` (页面加载进度条) - -### 2.3 文件处理 -- **vue-upload-component**: `3.1.4` (文件上传) -- **cropperjs**: `1.6.1` (图片裁剪) -- **file-saver**: `2.0.5` (文件下载) - -### 2.4 富文本编辑 -- **@tiptap/vue-3**: `2.2.4` (现代富文本编辑器) -- **@tiptap/starter-kit**: `2.2.4` -- **@tiptap/extension-image**: `2.2.4` - -### 2.5 PWA支持 -- **vite-plugin-pwa**: `0.19.2` (PWA支持) -- **workbox-window**: `7.0.0` (Service Worker管理) - -## 3. 开发工具与代码质量 - -### 3.1 代码规范 -- **ESLint**: `8.57.0` -- **@vue/eslint-config-typescript**: `12.0.0` -- **@vue/eslint-config-prettier**: `9.0.0` -- **Prettier**: `3.2.5` -- **lint-staged**: `15.2.2` -- **husky**: `9.0.11` - -### 3.2 测试框架 -- **Vitest**: `1.4.0` (单元测试) -- **@vue/test-utils**: `2.4.5` (Vue组件测试) -- **jsdom**: `24.0.0` (DOM环境模拟) -- **Cypress**: `13.7.1` (E2E测试) - -### 3.3 构建优化 -- **rollup-plugin-visualizer**: `5.12.0` (构建分析) -- **vite-plugin-compression**: `0.5.1` (Gzip压缩) -- **vite-plugin-mock**: `3.0.1` (Mock数据) - -## 4. 项目结构设计 - -``` -src/ -├── api/ # API接口定义 -│ ├── auth.ts # 认证相关接口 -│ ├── chat.ts # 聊天相关接口 -│ ├── diary.ts # 日记相关接口 -│ └── user.ts # 用户相关接口 -├── assets/ # 静态资源 -│ ├── images/ # 图片资源 -│ ├── icons/ # 图标资源 -│ └── styles/ # 全局样式 -├── components/ # 公共组件 -│ ├── common/ # 通用组件 -│ ├── forms/ # 表单组件 -│ ├── charts/ # 图表组件 -│ └── layout/ # 布局组件 -├── composables/ # 组合式API -│ ├── useAuth.ts # 认证逻辑 -│ ├── useChat.ts # 聊天逻辑 -│ ├── useWebSocket.ts # WebSocket逻辑 -│ └── useApi.ts # API调用逻辑 -├── config/ # 配置文件 -│ ├── env.ts # 环境配置 -│ ├── constants.ts # 常量定义 -│ └── routes.ts # 路由配置 -├── layouts/ # 页面布局 -│ ├── DefaultLayout.vue # 默认布局 -│ ├── AuthLayout.vue # 认证布局 -│ └── ChatLayout.vue # 聊天布局 -├── pages/ # 页面组件 -│ ├── auth/ # 认证页面 -│ ├── chat/ # 聊天页面 -│ ├── diary/ # 日记页面 -│ └── dashboard/ # 仪表盘页面 -├── stores/ # 状态管理 -│ ├── auth.ts # 认证状态 -│ ├── chat.ts # 聊天状态 -│ ├── user.ts # 用户状态 -│ └── app.ts # 应用状态 -├── types/ # 类型定义 -│ ├── api.ts # API类型 -│ ├── user.ts # 用户类型 -│ ├── chat.ts # 聊天类型 -│ └── global.d.ts # 全局类型 -├── utils/ # 工具函数 -│ ├── request.ts # HTTP请求工具 -│ ├── websocket.ts # WebSocket工具 -│ ├── storage.ts # 存储工具 -│ ├── validation.ts # 验证工具 -│ └── format.ts # 格式化工具 -└── views/ # 页面视图 - ├── Home.vue # 首页 - ├── Login.vue # 登录页 - ├── Chat.vue # 聊天页 - └── Dashboard.vue # 仪表盘 -``` - -## 5. 核心功能实现方案 - -### 5.1 认证系统 -- **JWT Token管理**: 使用Pinia存储,自动刷新机制 -- **路由守卫**: 基于Vue Router的权限控制 -- **第三方登录**: 支持微信、QQ、GitHub等 -- **验证码**: 图形验证码 + 短信验证码 - -### 5.2 实时通信 -- **STOMP协议**: 基于@stomp/stompjs,与Spring Boot WebSocket集成 -- **原生WebSocket**: 支持Token认证,无需降级方案 -- **连接管理**: 自动重连、心跳检测、连接状态监控 -- **消息队列**: 支持点对点和发布订阅模式 -- **Token认证**: 在WebSocket握手时传递Authorization头部 -- **消息类型**: 文本、图片、表情、文件、系统通知 -- **离线处理**: 离线消息缓存和同步机制 - -### 5.3 数据可视化 -- **情绪趋势图**: 基于ECharts的时间序列图 -- **情绪雷达图**: 多维度情绪分析 -- **成长轨迹**: 交互式时间轴 -- **数据导出**: 支持PDF、Excel导出 - -### 5.4 响应式设计 -- **移动端适配**: 基于Tailwind CSS的响应式布局 -- **触摸手势**: 支持滑动、缩放等手势操作 -- **PWA支持**: 离线缓存、桌面安装 -- **性能优化**: 虚拟滚动、懒加载 - -## 6. 环境配置优化 - -### 6.1 多环境配置 -```typescript -// config/env.ts -export const envConfigs = { - local: { - name: '本地环境', - apiBaseUrl: 'http://localhost:19089/api', - wsBaseUrl: 'ws://localhost:19089', - uploadUrl: 'http://localhost:19089/api/upload', - debug: true, - mock: false - }, - dev: { - name: '开发环境', - apiBaseUrl: 'https://dev-api.emotion-museum.com/api', - wsBaseUrl: 'wss://dev-api.emotion-museum.com', - uploadUrl: 'https://dev-api.emotion-museum.com/api/upload', - debug: true, - mock: false - }, - test: { - name: '测试环境', - apiBaseUrl: 'https://test-api.emotion-museum.com/api', - wsBaseUrl: 'wss://test-api.emotion-museum.com', - uploadUrl: 'https://test-api.emotion-museum.com/api/upload', - debug: false, - mock: false - }, - prod: { - name: '生产环境', - apiBaseUrl: 'https://api.emotion-museum.com/api', - wsBaseUrl: 'wss://api.emotion-museum.com', - uploadUrl: 'https://api.emotion-museum.com/api/upload', - debug: false, - mock: false - } -} -``` - -### 6.2 构建优化配置 -```typescript -// vite.config.ts -export default defineConfig({ - plugins: [ - vue(), - AutoImport({ - imports: ['vue', 'vue-router', 'pinia', '@vueuse/core'], - dts: true - }), - Components({ - resolvers: [ElementPlusResolver()], - dts: true - }), - VitePWA({ - registerType: 'autoUpdate', - workbox: { - globPatterns: ['**/*.{js,css,html,ico,png,svg}'] - } - }) - ], - build: { - rollupOptions: { - output: { - manualChunks: { - vendor: ['vue', 'vue-router', 'pinia'], - elementPlus: ['element-plus'], - echarts: ['echarts'], - utils: ['axios', 'dayjs', 'lodash-es'] - } - } - } - } -}) -``` - -## 7. 部署方案 - -### 7.1 Docker部署 -```dockerfile -# Dockerfile -FROM node:18-alpine as builder -WORKDIR /app -COPY package*.json ./ -RUN npm ci --only=production -COPY . . -RUN npm run build - -FROM nginx:alpine -COPY --from=builder /app/dist /usr/share/nginx/html -COPY nginx.conf /etc/nginx/nginx.conf -EXPOSE 80 -CMD ["nginx", "-g", "daemon off;"] -``` - -### 7.2 CI/CD配置 -```yaml -# .github/workflows/deploy.yml -name: Deploy -on: - push: - branches: [main] -jobs: - deploy: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - with: - node-version: '18' - - run: npm ci - - run: npm run build - - run: npm run test - - name: Deploy to server - run: | - # 部署脚本 -``` - -### 7.3 Nginx配置 -```nginx -# nginx.conf -server { - listen 80; - server_name localhost; - root /usr/share/nginx/html; - index index.html; - - # 处理Vue Router的history模式 - location / { - try_files $uri $uri/ /index.html; - } - - # 静态资源缓存 - location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ { - expires 1y; - add_header Cache-Control "public, immutable"; - } - - # API代理 - location /api/ { - proxy_pass http://backend:19089/api/; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - } - - # WebSocket代理 - location /ws/ { - proxy_pass http://backend:19089/ws/; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - } -} -``` - -## 8. 性能优化策略 - -### 8.1 代码分割 -- **路由级别懒加载**: 使用动态import() -- **组件级别动态导入**: 按需加载大型组件 -- **第三方库按需加载**: Tree-shaking优化 -- **图片懒加载**: Intersection Observer API - -### 8.2 缓存策略 -- **HTTP缓存配置**: 静态资源长期缓存 -- **Service Worker缓存**: 离线访问支持 -- **本地存储优化**: IndexedDB存储大量数据 -- **CDN加速**: 静态资源CDN分发 - -### 8.3 监控与分析 -- **Sentry**: `7.108.0` (错误监控) -- **Google Analytics**: `gtag` (用户行为分析) -- **Web Vitals**: `3.5.2` (性能指标监控) -- **Bundle Analyzer**: 构建分析工具 - -### 8.4 性能指标 -- **首屏加载时间**: < 2秒 -- **交互响应时间**: < 100ms -- **代码分割**: 单个chunk < 250KB -- **图片优化**: WebP格式,响应式图片 - -## 9. 安全考虑 - -### 9.1 前端安全 -- **XSS防护**: 内容安全策略(CSP) -- **CSRF防护**: Token验证 -- **敏感信息加密**: 本地存储加密 -- **依赖安全**: 定期更新依赖包 - -### 9.2 API安全 -- **Token自动刷新**: JWT令牌管理 -- **请求签名验证**: HMAC签名 -- **接口限流**: 防止恶意请求 -- **数据加密传输**: HTTPS强制 - -### 9.3 内容安全策略 -```html - - -``` - -## 10. 开发规范 - -### 10.1 代码规范 -- **命名规范**: - - 组件: PascalCase (UserProfile.vue) - - 文件: kebab-case (user-profile.ts) - - 变量: camelCase (userName) - - 常量: UPPER_SNAKE_CASE (API_BASE_URL) - -### 10.2 Git提交规范 -``` -feat: 新功能 -fix: 修复bug -docs: 文档更新 -style: 代码格式调整 -refactor: 代码重构 -test: 测试相关 -chore: 构建工具或辅助工具的变动 -``` - -### 10.3 组件开发规范 -```vue - - - - - -``` - -### 10.4 API接口规范 -```typescript -// api/user.ts -import type { User, UserProfile, UpdateUserRequest } from '@/types/user' -import { request } from '@/utils/request' - -export const userApi = { - // 获取用户信息 - getProfile(): Promise { - return request.get('/user/profile') - }, - - // 更新用户信息 - updateProfile(data: UpdateUserRequest): Promise { - return request.put('/user/profile', data) - }, - - // 上传头像 - uploadAvatar(file: File): Promise<{ url: string }> { - const formData = new FormData() - formData.append('avatar', file) - return request.post('/user/avatar/upload', formData, { - headers: { 'Content-Type': 'multipart/form-data' } - }) - } -} -``` - -### 10.5 WebSocket实现方案 - -#### 为什么选择STOMP而不是Socket.io? - -1. **后端集成**: 项目后端使用Spring Boot,STOMP是Spring WebSocket的标准协议 -2. **消息队列**: STOMP天然支持消息队列模式,适合聊天和通知场景 -3. **标准化**: STOMP是标准协议,不依赖特定实现 -4. **轻量级**: 相比Socket.io更轻量,减少包体积 - -#### WebSocket工具类实现 -```typescript -// utils/websocket.ts -import { Client } from '@stomp/stompjs' -import { envConfig } from '@/config/env' - -export class WebSocketService { - private client: Client - private connected = false - private reconnectAttempts = 0 - private maxReconnectAttempts = 5 - private currentToken = '' - - constructor() { - this.client = new Client({ - // 使用原生WebSocket,支持Token认证 - brokerURL: `${envConfig.wsBaseUrl}/ws`, - - // 心跳检测 - heartbeatIncoming: 4000, - heartbeatOutgoing: 4000, - - // 重连配置 - reconnectDelay: 5000, - - // 调试模式 - debug: envConfig.debug ? console.log : undefined, - - onConnect: () => { - this.connected = true - this.reconnectAttempts = 0 - console.log('WebSocket连接成功') - }, - - onDisconnect: () => { - this.connected = false - console.log('WebSocket连接断开') - }, - - onStompError: (frame) => { - console.error('STOMP错误:', frame) - this.handleReconnect() - }, - - // WebSocket连接前的配置 - beforeConnect: () => { - // 在WebSocket握手时添加Token - if (this.currentToken) { - this.client.configure({ - connectHeaders: { - Authorization: `Bearer ${this.currentToken}`, - 'X-Requested-With': 'XMLHttpRequest' - } - }) - } - } - }) - } - - // 连接WebSocket - connect(token: string) { - this.currentToken = token - this.client.configure({ - connectHeaders: { - Authorization: `Bearer ${token}`, - 'X-Requested-With': 'XMLHttpRequest' - } - }) - this.client.activate() - } - - // 更新Token(用于Token刷新场景) - updateToken(newToken: string) { - this.currentToken = newToken - if (this.connected) { - // 断开当前连接 - this.disconnect() - // 使用新Token重新连接 - setTimeout(() => { - this.connect(newToken) - }, 1000) - } - } - - // 断开连接 - disconnect() { - this.client.deactivate() - } - - // 订阅消息 - subscribe(destination: string, callback: (message: any) => void) { - if (!this.connected) { - console.warn('WebSocket未连接') - return - } - - return this.client.subscribe(destination, (message) => { - try { - const data = JSON.parse(message.body) - callback(data) - } catch (error) { - console.error('消息解析失败:', error) - } - }) - } - - // 发送消息 - send(destination: string, body: any) { - if (!this.connected) { - console.warn('WebSocket未连接,消息将被缓存') - // 这里可以实现消息缓存逻辑 - return - } - - this.client.publish({ - destination, - body: JSON.stringify(body) - }) - } - - // 处理重连 - private handleReconnect() { - if (this.reconnectAttempts < this.maxReconnectAttempts) { - this.reconnectAttempts++ - setTimeout(() => { - console.log(`尝试重连 (${this.reconnectAttempts}/${this.maxReconnectAttempts})`) - this.client.activate() - }, 5000 * this.reconnectAttempts) - } - } -} -``` - -#### 聊天功能使用示例 -```typescript -// composables/useChat.ts -import { ref, onMounted, onUnmounted } from 'vue' -import { WebSocketService } from '@/utils/websocket' -import { useAuthStore } from '@/stores/auth' - -export function useChat() { - const authStore = useAuthStore() - const wsService = new WebSocketService() - const messages = ref([]) - const isConnected = ref(false) - - // 连接WebSocket - const connect = () => { - if (authStore.token) { - wsService.connect(authStore.token) - - // 订阅个人消息 - wsService.subscribe(`/user/${authStore.user.id}/queue/messages`, (message) => { - messages.value.push(message) - }) - - // 订阅聊天室消息 - wsService.subscribe('/topic/chat', (message) => { - messages.value.push(message) - }) - - isConnected.value = true - } - } - - // 发送消息 - const sendMessage = (content: string, type: 'text' | 'image' = 'text') => { - const message = { - content, - type, - timestamp: Date.now(), - userId: authStore.user.id - } - - wsService.send('/app/chat.send', message) - } - - // 组件挂载时连接 - onMounted(() => { - connect() - }) - - // 组件卸载时断开连接 - onUnmounted(() => { - wsService.disconnect() - }) - - return { - messages, - isConnected, - sendMessage, - connect - } -} -``` - -### 10.6 WebSocket Token认证详解 - -#### Token传递方式 -原生WebSocket + STOMP协议支持Token认证: - -1. **WebSocket握手时传递** (推荐) -```typescript -// 在WebSocket连接建立时传递Token -brokerURL: `${envConfig.wsBaseUrl}/ws`, -connectHeaders: { - Authorization: `Bearer ${token}`, - 'X-Requested-With': 'XMLHttpRequest' -} -``` - -2. **URL参数传递** (备选方案) -```typescript -// 如果后端不支持连接头部,可以通过URL传递 -brokerURL: `${envConfig.wsBaseUrl}/ws?token=${token}` -``` - -**为什么移除SockJS?** -- ❌ SockJS不支持在WebSocket握手时传递自定义请求头 -- ❌ 无法在连接建立时进行Token认证 -- ❌ 只能通过URL参数传递Token,安全性较低 -- ✅ 原生WebSocket完全支持Token认证 -- ✅ 现代浏览器WebSocket支持度已经很好 - -#### WebSocket方案对比 - -| 特性 | 原生WebSocket + STOMP | SockJS + STOMP | Socket.io | -|------|---------------------|----------------|-----------| -| **Token认证** | ✅ 支持请求头传递 | ❌ 不支持请求头 | ✅ 支持 | -| **浏览器兼容** | ✅ 现代浏览器完全支持 | ✅ 兼容性最好 | ✅ 兼容性好 | -| **包体积** | ✅ 最小 | ⚠️ 中等 | ❌ 最大 | -| **Spring Boot集成** | ✅ 原生支持 | ✅ 原生支持 | ❌ 需要额外配置 | -| **标准化** | ✅ 标准协议 | ✅ 标准协议 | ❌ 私有协议 | -| **安全性** | ✅ 握手时认证 | ⚠️ URL参数认证 | ✅ 握手时认证 | - -**最终选择:原生WebSocket + STOMP** -- 🎯 **安全性优先**: 支持在握手时进行Token认证 -- 🎯 **性能最优**: 无额外协议层,直接使用WebSocket -- 🎯 **标准化**: 基于标准STOMP协议 -- 🎯 **轻量级**: 最小的包体积 -- 🎯 **兼容性**: 现代浏览器支持度已经足够 - -#### Token刷新处理 -```typescript -// stores/auth.ts - 认证状态管理 -import { defineStore } from 'pinia' -import { ref, watch } from 'vue' -import { WebSocketService } from '@/utils/websocket' - -export const useAuthStore = defineStore('auth', () => { - const token = ref('') - const user = ref(null) - const wsService = ref(null) - - // 监听Token变化,自动更新WebSocket连接 - watch(token, (newToken, oldToken) => { - if (newToken && newToken !== oldToken && wsService.value) { - wsService.value.updateToken(newToken) - } - }) - - // 登录 - const login = async (credentials: LoginRequest) => { - try { - const response = await authApi.login(credentials) - token.value = response.token - user.value = response.user - - // 登录成功后建立WebSocket连接 - if (!wsService.value) { - wsService.value = new WebSocketService() - } - wsService.value.connect(token.value) - - return response - } catch (error) { - throw error - } - } - - // 登出 - const logout = () => { - // 断开WebSocket连接 - if (wsService.value) { - wsService.value.disconnect() - wsService.value = null - } - - token.value = '' - user.value = null - } - - // Token刷新 - const refreshToken = async () => { - try { - const response = await authApi.refreshToken() - token.value = response.token - // watch会自动处理WebSocket重连 - return response - } catch (error) { - // Token刷新失败,执行登出 - logout() - throw error - } - } - - return { - token, - user, - wsService, - login, - logout, - refreshToken - } -}) -``` - -#### 后端WebSocket安全配置 -对应的Spring Boot后端配置示例: - -```java -// WebSocketConfig.java -@Configuration -@EnableWebSocketMessageBroker -public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { - - @Override - public void configureMessageBroker(MessageBrokerRegistry config) { - config.enableSimpleBroker("/topic", "/queue"); - config.setApplicationDestinationPrefixes("/app"); - config.setUserDestinationPrefix("/user"); - } - - @Override - public void registerStompEndpoints(StompEndpointRegistry registry) { - registry.addEndpoint("/ws") - .setAllowedOriginPatterns("*"); - // 移除.withSockJS(),使用原生WebSocket支持Token认证 - } - - @Override - public void configureClientInboundChannel(ChannelRegistration registration) { - registration.interceptors(new AuthChannelInterceptor()); - } -} - -// AuthChannelInterceptor.java - Token验证拦截器 -@Component -public class AuthChannelInterceptor implements ChannelInterceptor { - - @Override - public Message preSend(Message message, MessageChannel channel) { - StompHeaderAccessor accessor = StompHeaderAccessor.wrap(message); - - if (StompCommand.CONNECT.equals(accessor.getCommand())) { - String token = accessor.getFirstNativeHeader("Authorization"); - if (token != null && token.startsWith("Bearer ")) { - String jwt = token.substring(7); - // 验证JWT Token - if (jwtTokenProvider.validateToken(jwt)) { - String userId = jwtTokenProvider.getUserIdFromToken(jwt); - accessor.setUser(new StompPrincipal(userId)); - } else { - throw new IllegalArgumentException("Invalid token"); - } - } else { - throw new IllegalArgumentException("Missing token"); - } - } - - return message; - } -} -``` - -#### 错误处理和重连机制 -```typescript -// 增强的WebSocket错误处理 -export class WebSocketService { - private tokenExpiredCallback?: () => void - - constructor(onTokenExpired?: () => void) { - this.tokenExpiredCallback = onTokenExpired - // ... 其他初始化代码 - } - - private handleStompError(frame: any) { - console.error('STOMP错误:', frame) - - // 检查是否是Token相关错误 - if (frame.headers && frame.headers.message) { - const errorMessage = frame.headers.message.toLowerCase() - - if (errorMessage.includes('unauthorized') || - errorMessage.includes('invalid token') || - errorMessage.includes('token expired')) { - - console.warn('Token认证失败,触发重新登录') - this.tokenExpiredCallback?.() - return - } - } - - // 其他错误进行重连 - this.handleReconnect() - } -} - -// 在应用中使用 -const authStore = useAuthStore() -const wsService = new WebSocketService(() => { - // Token过期回调 - authStore.logout() - router.push('/login') -}) -``` - -#### 安全最佳实践 - -1. **Token验证**: 每次WebSocket连接都验证Token有效性 -2. **权限控制**: 基于用户角色限制订阅和发送权限 -3. **连接限制**: 限制单用户的并发连接数 -4. **消息加密**: 敏感消息内容加密传输 -5. **审计日志**: 记录WebSocket连接和消息日志 - -这个方案完全支持Token认证,并且提供了完整的Token生命周期管理,包括刷新、过期处理和安全重连机制。 - -## 11. 测试策略 - -### 11.1 单元测试 -```typescript -// tests/components/UserProfile.test.ts -import { mount } from '@vue/test-utils' -import { describe, it, expect } from 'vitest' -import UserProfile from '@/components/UserProfile.vue' - -describe('UserProfile', () => { - it('renders user information correctly', () => { - const user = { - id: '1', - username: 'testuser', - nickname: 'Test User', - avatar: 'https://example.com/avatar.jpg' - } - - const wrapper = mount(UserProfile, { - props: { user } - }) - - expect(wrapper.text()).toContain('Test User') - expect(wrapper.find('img').attributes('src')).toBe(user.avatar) - }) -}) -``` - -### 11.2 E2E测试 -```typescript -// cypress/e2e/auth.cy.ts -describe('Authentication', () => { - it('should login successfully', () => { - cy.visit('/login') - cy.get('[data-cy=username]').type('testuser') - cy.get('[data-cy=password]').type('password123') - cy.get('[data-cy=login-btn]').click() - - cy.url().should('include', '/dashboard') - cy.get('[data-cy=user-menu]').should('be.visible') - }) -}) -``` - -### 11.3 测试配置 -```typescript -// vitest.config.ts -import { defineConfig } from 'vitest/config' -import vue from '@vitejs/plugin-vue' - -export default defineConfig({ - plugins: [vue()], - test: { - environment: 'jsdom', - globals: true, - setupFiles: ['./tests/setup.ts'] - }, - resolve: { - alias: { - '@': '/src' - } - } -}) -``` - -## 12. 国际化支持 - -### 12.1 i18n配置 -- **vue-i18n**: `9.10.2` (国际化支持) -- **@intlify/unplugin-vue-i18n**: `4.0.0` (构建时优化) - -```typescript -// i18n/index.ts -import { createI18n } from 'vue-i18n' -import zh from './locales/zh.json' -import en from './locales/en.json' - -export const i18n = createI18n({ - legacy: false, - locale: 'zh', - fallbackLocale: 'en', - messages: { - zh, - en - } -}) -``` - -### 12.2 语言文件结构 -```json -// i18n/locales/zh.json -{ - "common": { - "confirm": "确认", - "cancel": "取消", - "save": "保存", - "delete": "删除" - }, - "auth": { - "login": "登录", - "register": "注册", - "logout": "退出登录" - }, - "chat": { - "sendMessage": "发送消息", - "typing": "正在输入...", - "offline": "离线" - } -} -``` - -## 13. 移动端适配 - -### 13.1 响应式断点 -```css -/* tailwind.config.js */ -module.exports = { - theme: { - screens: { - 'xs': '475px', - 'sm': '640px', - 'md': '768px', - 'lg': '1024px', - 'xl': '1280px', - '2xl': '1536px', - } - } -} -``` - -### 13.2 移动端优化 -- **触摸优化**: 44px最小触摸目标 -- **手势支持**: 滑动、缩放、长按 -- **性能优化**: 虚拟滚动、图片懒加载 -- **离线支持**: Service Worker缓存 - -### 13.3 PWA配置 -```typescript -// vite.config.ts PWA配置 -VitePWA({ - registerType: 'autoUpdate', - includeAssets: ['favicon.ico', 'apple-touch-icon.png'], - manifest: { - name: '情绪博物馆', - short_name: '情绪博物馆', - description: '记录情绪,分享心情的温暖空间', - theme_color: '#4A90E2', - background_color: '#ffffff', - display: 'standalone', - icons: [ - { - src: 'pwa-192x192.png', - sizes: '192x192', - type: 'image/png' - }, - { - src: 'pwa-512x512.png', - sizes: '512x512', - type: 'image/png' - } - ] - } -}) -``` - -## 14. 总结 - -本技术方案基于现代化的Vue3生态系统,采用TypeScript提供类型安全,使用Vite构建工具提升开发体验。方案涵盖了: - -### 14.1 技术优势 -- **现代化技术栈**: Vue3 + TypeScript + Vite -- **完整的工具链**: 从开发到部署的全流程支持 -- **性能优化**: 代码分割、懒加载、缓存策略 -- **开发体验**: 热更新、自动导入、类型检查 - -### 14.2 可扩展性 -- **模块化设计**: 清晰的项目结构和职责分离 -- **组件化开发**: 可复用的UI组件库 -- **插件系统**: 支持功能扩展和第三方集成 -- **国际化支持**: 多语言适配能力 - -### 14.3 维护性 -- **代码规范**: ESLint + Prettier统一代码风格 -- **测试覆盖**: 单元测试 + E2E测试 -- **文档完善**: 组件文档和API文档 -- **版本管理**: 语义化版本控制 - -### 14.4 部署方案 -- **多环境支持**: local/dev/test/prod环境配置 -- **容器化部署**: Docker + Nginx部署方案 -- **CI/CD流程**: 自动化构建和部署 -- **监控告警**: 错误监控和性能分析 - -这个技术方案能够很好地支持情绪博物馆Web端的所有功能需求,同时具备良好的可维护性和扩展性,为项目的长期发展奠定坚实基础。 diff --git a/web-new/前端环境配置梳理.md b/web-new/前端环境配置梳理.md deleted file mode 100644 index 5cbe3db..0000000 --- a/web-new/前端环境配置梳理.md +++ /dev/null @@ -1,517 +0,0 @@ -# 情绪博物馆前端环境配置梳理 - -## 1. 项目概述 - -情绪博物馆前端基于Vue3 + TypeScript + Vite开发,采用现代化的前端技术栈,支持多环境部署。 - -### 技术栈 -- **框架**: Vue 3.4.0 -- **构建工具**: Vite 5.0.8 -- **语言**: TypeScript 5.3.3 -- **UI框架**: Element Plus 2.4.4 -- **状态管理**: Pinia 2.1.7 -- **路由**: Vue Router 4.2.5 -- **样式**: Tailwind CSS 3.4.0 -- **HTTP客户端**: Axios 1.6.2 -- **WebSocket**: Socket.io-client 4.7.4, @stomp/stompjs 7.1.1 -- **图表**: ECharts 5.4.3 -- **工具库**: Day.js, Lodash-es, Zod - -## 2. 环境配置文件 - -### 2.1 环境变量类型定义 (`src/types/env.d.ts`) - -```typescript -interface ImportMetaEnv { - readonly VITE_APP_ENV: string // 应用环境 - readonly VITE_APP_TITLE: string // 应用标题 - readonly VITE_APP_VERSION: string // 应用版本 - readonly VITE_API_BASE_URL: string // API基础URL - readonly VITE_WS_BASE_URL: string // WebSocket基础URL - readonly VITE_UPLOAD_URL: string // 文件上传URL - readonly VITE_DEBUG: string // 调试模式 - readonly VITE_MOCK: string // Mock模式 - readonly VITE_APP_DESCRIPTION: string // 应用描述 -} -``` - -### 2.2 环境配置管理 (`src/config/env.ts`) - -环境配置支持四种环境: -- **local**: 本地开发环境 -- **dev**: 开发环境 -- **test**: 测试环境 -- **prod**: 生产环境 - -#### 环境配置接口 -```typescript -interface EnvConfig { - name: string // 环境名称 - apiBaseUrl: string // API基础URL - wsBaseUrl: string // WebSocket URL - uploadUrl: string // 文件上传URL - debug: boolean // 调试模式 - mock: boolean // Mock模式 - appTitle: string // 应用标题 - appVersion: string // 应用版本 -} -``` - -#### 各环境配置详情 - -**本地环境 (local)** -```typescript -{ - name: '本地环境', - apiBaseUrl: 'http://localhost:19089/api', - wsBaseUrl: 'ws://localhost:19089/api', - uploadUrl: 'http://localhost:19089/api/upload', - debug: true, - mock: false, - appTitle: '情绪博物馆 - 本地', - appVersion: '1.0.0' -} -``` - -**开发环境 (dev)** -```typescript -{ - name: '开发环境', - apiBaseUrl: 'http://localhost:19089/api', - wsBaseUrl: 'ws://localhost:19089/api', - uploadUrl: 'http://localhost:19089/api/upload', - debug: true, - mock: false, - appTitle: '情绪博物馆 - 开发', - appVersion: '1.0.0' -} -``` - -**测试环境 (test)** -```typescript -{ - name: '测试环境', - apiBaseUrl: 'http://test.emotion-museum.com/api', - wsBaseUrl: 'ws://test.emotion-museum.com', - uploadUrl: 'http://test.emotion-museum.com/api/upload', - debug: false, - mock: false, - appTitle: '情绪博物馆 - 测试', - appVersion: '1.0.0' -} -``` - -**生产环境 (prod)** -```typescript -{ - name: '生产环境', - apiBaseUrl: 'https://api.emotion-museum.com/api', - wsBaseUrl: 'wss://api.emotion-museum.com', - uploadUrl: 'https://api.emotion-museum.com/api/upload', - debug: false, - mock: false, - appTitle: '情绪博物馆', - appVersion: '1.0.0' -} -``` - -## 3. 构建配置 - -### 3.1 Vite配置 (`vite.config.ts`) - -```typescript -export default defineConfig({ - base: '/emotion-museum/', // 部署基础路径 - plugins: [vue()], - resolve: { - alias: { - '@': resolve(__dirname, 'src'), // 路径别名 - }, - }, - define: { - global: 'globalThis', // 全局变量定义 - }, - server: { - port: 5173, // 开发服务器端口 - open: true, // 自动打开浏览器 - proxy: { // 代理配置 - '/api': { - target: 'http://localhost:19089', - changeOrigin: true, - secure: false, - } - } - }, - build: { - outDir: 'dist', // 输出目录 - sourcemap: false, // 不生成sourcemap - rollupOptions: { - external: (id) => { // 外部依赖处理 - if (id.includes('echarts') && id.includes('extension')) { - return true - } - return false - }, - output: { - manualChunks: { // 代码分割 - vendor: ['vue', 'vue-router', 'pinia'], - elementPlus: ['element-plus'], - }, - }, - }, - }, -}) -``` - -### 3.2 TypeScript配置 (`tsconfig.json`) - -```json -{ - "compilerOptions": { - "target": "ES2020", // 目标版本 - "useDefineForClassFields": true, - "lib": ["ES2020", "DOM", "DOM.Iterable"], - "module": "ESNext", - "skipLibCheck": true, - "moduleResolution": "bundler", // 模块解析策略 - "allowImportingTsExtensions": true, - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true, - "jsx": "preserve", - "strict": true, // 严格模式 - "noUnusedLocals": true, - "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true, - "baseUrl": ".", - "paths": { // 路径映射 - "@/*": ["src/*"] - }, - "allowSyntheticDefaultImports": true, - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "types": ["node"] - }, - "include": [ - "src/**/*.ts", - "src/**/*.d.ts", - "src/**/*.tsx", - "src/**/*.vue", - "src/types/global.d.ts" - ], - "references": [{ "path": "./tsconfig.node.json" }] -} -``` - -### 3.3 Tailwind CSS配置 (`tailwind.config.js`) - -```javascript -export default { - content: [ - "./index.html", - "./src/**/*.{vue,js,ts,jsx,tsx}", - ], - theme: { - extend: { - colors: { - primary: { // 主色调 - 50: '#f0f9ff', - 100: '#e0f2fe', - 200: '#bae6fd', - 300: '#7dd3fc', - 400: '#38bdf8', - 500: '#0ea5e9', - 600: '#0284c7', - 700: '#0369a1', - 800: '#075985', - 900: '#0c4a6e', - }, - emotion: { // 情绪色彩 - happy: '#fbbf24', - sad: '#3b82f6', - angry: '#ef4444', - calm: '#10b981', - excited: '#f97316', - anxious: '#8b5cf6', - }, - // 设计系统颜色 - 'tech-blue': '#4A90E2', - 'warm-orange': '#F5A623', - 'light-gray': '#F7F8FA', - 'text-dark': '#333333', - 'text-medium': '#888888', - }, - fontFamily: { - sans: ['Noto Sans SC', 'Inter', 'system-ui', 'sans-serif'], - }, - animation: { // 自定义动画 - 'fade-in': 'fadeIn 0.5s ease-in-out', - 'slide-up': 'slideUp 0.3s ease-out', - 'bounce-gentle': 'bounceGentle 2s infinite', - }, - keyframes: { - fadeIn: { - '0%': { opacity: '0' }, - '100%': { opacity: '1' }, - }, - slideUp: { - '0%': { transform: 'translateY(20px)', opacity: '0' }, - '100%': { transform: 'translateY(0)', opacity: '1' }, - }, - bounceGentle: { - '0%, 100%': { transform: 'translateY(0)' }, - '50%': { transform: 'translateY(-5px)' }, - }, - }, - }, - }, - plugins: [], -} -``` - -### 3.4 PostCSS配置 (`postcss.config.js`) - -```javascript -export default { - plugins: { - tailwindcss: {}, // Tailwind CSS - autoprefixer: {}, // 自动添加CSS前缀 - }, -} -``` - -## 4. 代码规范配置 - -### 4.1 ESLint配置 (`.eslintrc.cjs`) - -```javascript -module.exports = { - root: true, - extends: [ - 'plugin:vue/vue3-essential', // Vue3基础规则 - 'eslint:recommended', // ESLint推荐规则 - '@vue/eslint-config-typescript', // TypeScript规则 - '@vue/eslint-config-prettier/skip-formatting' // Prettier集成 - ], - parserOptions: { - ecmaVersion: 'latest' - }, - rules: { - 'vue/multi-word-component-names': 'off', // 允许单词组件名 - '@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }], // 忽略下划线参数 - 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', // 生产环境警告console - 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off' // 生产环境警告debugger - } -} -``` - -### 4.2 Prettier配置 (`.prettierrc`) - -```json -{ - "semi": false, // 不使用分号 - "singleQuote": true, // 使用单引号 - "tabWidth": 2, // 缩进2个空格 - "trailingComma": "es5", // ES5兼容的尾随逗号 - "printWidth": 100, // 行宽100字符 - "bracketSpacing": true, // 对象字面量括号内空格 - "arrowParens": "avoid" // 箭头函数参数避免括号 -} -``` - -## 5. HTTP请求配置 - -### 5.1 请求工具配置 (`src/utils/request.ts`) - -#### 基础配置 -```typescript -const instance = axios.create({ - baseURL: envConfig.apiBaseUrl, // 从环境配置获取基础URL - timeout: 30000, // 30秒超时 - headers: { - 'Content-Type': 'application/json;charset=UTF-8' - } -}) -``` - -#### 请求拦截器 -- 自动添加Authorization头(Bearer Token) -- 生成请求ID用于追踪 -- 调试模式下打印请求日志 - -#### 响应拦截器 -- 统一处理业务状态码 -- 特殊错误码处理(401、403、404、500等) -- 自动处理未授权情况 -- 调试模式下打印响应日志 - -#### 错误处理 -- 网络错误处理 -- 服务器错误处理 -- 业务错误处理 -- 401未授权自动跳转登录 - -## 6. 部署配置 - -### 6.1 构建脚本 (`package.json`) - -```json -{ - "scripts": { - "dev": "vite", // 开发环境 - "build": "vite build", // 生产构建 - "build:check": "vue-tsc && vite build", // 类型检查+构建 - "preview": "vite preview", // 预览构建结果 - "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore", - "type-check": "vue-tsc --noEmit", // TypeScript类型检查 - "test": "vitest", // 单元测试 - "test:e2e": "cypress run" // E2E测试 - } -} -``` - -### 6.2 Linux部署脚本 (`deploy.sh`) - -```bash -#!/bin/bash -# 部署脚本 - 将构建好的文件上传到服务器 - -SERVER_IP="47.111.10.27" -USERNAME="root" -REMOTE_PATH="/data/www/emotion-museum" - -# 检查dist目录是否存在 -if [ ! -d "dist" ]; then - echo "错误: dist目录不存在,请先运行 npm run build" - exit 1 -fi - -# 上传文件到服务器 -scp dist/index.html "${USERNAME}@${SERVER_IP}:${REMOTE_PATH}/" -scp -r dist/assets "${USERNAME}@${SERVER_IP}:${REMOTE_PATH}/" -scp dist/test-*.html "${USERNAME}@${SERVER_IP}:${REMOTE_PATH}/" -``` - -### 6.3 Windows部署脚本 (`deploy.ps1`) - -```powershell -# 部署脚本 - PowerShell版本 - -param( - [string]$ServerIP = "47.111.10.27", - [string]$Username = "root", - [string]$RemotePath = "/data/www/emotion-museum" -) - -# 检查dist目录 -if (-not (Test-Path "dist")) { - Write-Host "错误: dist目录不存在,请先运行 npm run build" -ForegroundColor Red - exit 1 -} - -# 上传文件到服务器 -scp "dist/index.html" "${Username}@${ServerIP}:${RemotePath}/" -scp -r "dist/assets" "${Username}@${ServerIP}:${RemotePath}/" -scp "dist/test-*.html" "${Username}@${ServerIP}:${RemotePath}/" -``` - -## 7. 环境变量使用 - -### 7.1 环境变量获取方式 - -```typescript -// 在组件中使用环境变量 -const apiUrl = import.meta.env.VITE_API_BASE_URL -const isDebug = import.meta.env.VITE_DEBUG === 'true' -const appTitle = import.meta.env.VITE_APP_TITLE -``` - -### 7.2 环境变量设置 - -开发时可以通过以下方式设置环境变量: - -**Linux/Mac:** -```bash -export VITE_APP_ENV=dev -export VITE_API_BASE_URL=http://localhost:19089/api -npm run dev -``` - -**Windows:** -```cmd -set VITE_APP_ENV=dev -set VITE_API_BASE_URL=http://localhost:19089/api -npm run dev -``` - -**或者创建.env文件:** -```env -VITE_APP_ENV=dev -VITE_API_BASE_URL=http://localhost:19089/api -VITE_WS_BASE_URL=ws://localhost:19089/api -VITE_DEBUG=true -VITE_MOCK=false -``` - -## 8. 开发环境配置 - -### 8.1 开发服务器配置 -- **端口**: 5173 -- **自动打开**: 是 -- **代理**: `/api` -> `http://localhost:19089` -- **热更新**: 启用 - -### 8.2 调试配置 -- **Vue DevTools**: 支持 -- **TypeScript**: 严格模式 -- **ESLint**: 实时检查 -- **Prettier**: 自动格式化 - -### 8.3 构建优化 -- **代码分割**: 按模块分割 -- **Tree Shaking**: 自动移除未使用代码 -- **压缩**: 生产环境自动压缩 -- **缓存**: 文件名包含哈希值 - -## 9. 生产环境配置 - -### 9.1 构建优化 -- **Source Map**: 禁用 -- **压缩**: 启用 -- **代码分割**: 启用 -- **CDN**: 支持 - -### 9.2 部署路径 -- **基础路径**: `/emotion-museum/` -- **静态资源**: 自动添加哈希值 -- **缓存策略**: 长期缓存静态资源 - -### 9.3 性能优化 -- **懒加载**: 路由级别懒加载 -- **预加载**: 关键资源预加载 -- **压缩**: Gzip/Brotli压缩 -- **缓存**: 浏览器缓存优化 - -## 10. 注意事项 - -1. **环境变量**: 必须以`VITE_`开头才能在客户端使用 -2. **API代理**: 开发环境使用代理,生产环境使用真实域名 -3. **WebSocket**: 开发环境使用ws协议,生产环境使用wss协议 -4. **构建路径**: 确保部署路径与`vite.config.ts`中的`base`配置一致 -5. **类型检查**: 构建前建议运行`npm run type-check`确保类型安全 -6. **代码规范**: 提交前运行`npm run lint`确保代码质量 - -## 11. 故障排除 - -### 常见问题 -1. **构建失败**: 检查TypeScript类型错误 -2. **代理不生效**: 检查vite.config.ts中的proxy配置 -3. **环境变量未生效**: 确保变量名以`VITE_`开头 -4. **部署404**: 检查nginx配置和base路径设置 -5. **WebSocket连接失败**: 检查协议和端口配置 - -### 调试技巧 -1. 使用浏览器开发者工具查看网络请求 -2. 检查控制台错误信息 -3. 使用Vue DevTools调试组件状态 -4. 查看构建日志定位问题 \ No newline at end of file diff --git a/web-new/重构计划.md b/web-new/重构计划.md deleted file mode 100644 index 8b79ede..0000000 --- a/web-new/重构计划.md +++ /dev/null @@ -1,711 +0,0 @@ -# 情绪博物馆Web端重构计划 - -## 1. 重构概述 - -### 1.1 重构目标 -基于前端技术方案Augment.md,使用最新的Vue3+TypeScript技术栈重构情绪博物馆Web端,在保持所有现有功能、页面布局、样式和用户体验完全一致的前提下,提升代码质量、性能和可维护性。 - -### 1.2 重构原则 -- **功能一致性**:确保所有现有功能完全保留 -- **视觉一致性**:保持所有页面布局、样式、图片完全一致 -- **用户体验一致性**:保持所有交互流程和用户体验不变 -- **数据一致性**:保持所有API接口和数据流不变 -- **渐进式重构**:分阶段进行,确保每个阶段都可独立测试 - -### 1.3 技术栈升级 -- **Vue**: 2.x → 3.4.21 (最新稳定版) -- **TypeScript**: 无 → 5.4.2 (最新稳定版) -- **构建工具**: Vite 5.1.6 (更好的构建性能) -- **UI框架**: Element Plus 2.6.1 (更好的Vue3支持) -- **样式框架**: Tailwind CSS 3.4.1 + @tailwindcss/forms + @tailwindcss/typography -- **状态管理**: Pinia 2.1.7 (Vue3官方推荐) -- **路由**: Vue Router 4.3.0 (最新稳定版) -- **HTTP客户端**: Axios 1.6.8 (最新稳定版) -- **WebSocket**: @stomp/stompjs 7.1.1 (原生WebSocket,支持Token认证) -- **数据可视化**: ECharts 5.5.0 + vue-echarts 6.7.3 -- **工具库**: VueUse 10.9.0 + Day.js 1.11.10 + Lodash-es 4.17.21 - -## 2. 重构阶段规划 - -### 第一阶段:项目初始化与基础架构 (1-2周) - -#### 2.1 项目初始化 -- [ ] 创建新的Vue3+TypeScript项目 -- [ ] 配置Vite 5.1.6构建工具 -- [ ] 安装和配置核心依赖包 -- [ ] 设置TypeScript 5.4.2配置 -- [ ] 配置ESLint 8.57.0和Prettier 3.2.5 -- [ ] 配置unplugin-auto-import自动导入 -- [ ] 配置unplugin-vue-components组件自动导入 -- [ ] 设置Git仓库和分支策略 -- [ ] 配置Husky和lint-staged - -#### 2.2 基础架构搭建 -- [ ] 配置路由系统 (Vue Router 4.3.0) -- [ ] 配置状态管理 (Pinia 2.1.7) -- [ ] 配置HTTP客户端 (Axios 1.6.8) -- [ ] 配置WebSocket服务 (@stomp/stompjs 7.1.1,原生WebSocket) -- [ ] 配置多环境变量管理 (local/dev/test/prod) -- [ ] 配置Tailwind CSS 3.4.1样式系统 -- [ ] 配置Element Plus 2.6.1 UI组件库 -- [ ] 配置ECharts 5.5.0数据可视化 -- [ ] 配置VueUse 10.9.0工具库 -- [ ] 配置PWA支持 (vite-plugin-pwa) - -#### 2.3 工具函数和类型定义 -- [ ] 创建HTTP请求工具 (utils/request.ts) -- [ ] 创建WebSocket工具类 (utils/websocket.ts,支持Token认证) -- [ ] 创建存储工具 (utils/storage.ts) -- [ ] 创建格式化工具 (utils/format.ts) -- [ ] 创建验证工具 (utils/validation.ts) -- [ ] 定义API类型 (types/api.ts) -- [ ] 定义用户类型 (types/user.ts) -- [ ] 定义聊天类型 (types/chat.ts) -- [ ] 定义日记类型 (types/diary.ts) -- [ ] 定义全局类型 (types/global.d.ts) -- [ ] 创建API接口定义 (api/auth.ts, api/chat.ts, api/diary.ts, api/user.ts) -- [ ] 创建组合式API (composables/useAuth.ts, useChat.ts, useWebSocket.ts) -- [ ] 配置全局组件注册 - -### 第二阶段:核心页面重构 (3-4周) - -#### 2.4 认证页面重构 -- [ ] **登录页面** (/login) - - 实现POST /auth/login用户登录接口 - - 实现GET /auth/captcha获取验证码接口 - - 实现POST /auth/oauth/login第三方登录接口 - - 保持现有UI布局和样式完全一致 - - 保持验证码功能和第三方登录功能 - - 保持错误提示和交互逻辑 - - 升级到Vue3 Composition API + TypeScript - - 使用Pinia管理认证状态 - -- [ ] **注册页面** (/register) - - 实现POST /auth/register用户注册接口 - - 实现GET /auth/captcha获取验证码接口 - - 保持现有UI布局和样式完全一致 - - 保持表单验证逻辑和验证码功能 - - 保持注册成功自动登录流程 - - 使用@vuelidate/core进行表单验证 - -- [ ] **认证相关组件和状态管理** - - UserDropdown组件 (Element Plus重构) - - UserAvatar组件 (支持头像上传) - - 认证状态管理 (stores/auth.ts) - - Token自动刷新机制 - - 路由守卫实现 - -#### 2.5 首页重构 -- [ ] **首页** (/) - - 保持现有UI布局和样式完全一致 - - 保持导航栏样式和交互 - - 保持产品介绍内容 - - 保持响应式设计 - - 保持动画效果 - -#### 2.6 聊天功能重构 -- [ ] **AI对话页面** (/chat) - - 实现WebSocket /ws/chat实时对话连接 - - 实现POST /conversation创建会话接口 - - 实现GET /conversation/user/{userId}获取用户会话接口 - - 实现DELETE /conversation/{sessionId}删除会话接口 - - 保持现有UI布局和样式完全一致 - - 保持消息气泡样式和输入框交互 - - 升级到原生WebSocket + STOMP (支持Token认证) - - 实现自动重连、心跳检测机制 - - 使用composables/useChat.ts管理聊天逻辑 - - 支持文本、图片、表情、文件消息类型 - -- [ ] **聊天历史页面** (/chat-history) - - 实现GET /conversation/user/{userId}获取用户会话接口 - - 实现GET /message/user/page分页获取消息接口 - - 实现POST /message/user/search搜索用户消息接口 - - 实现POST /message/user/recent获取最近消息接口 - - 保持现有UI布局和样式完全一致 - - 保持历史记录展示、搜索功能、分页功能 - - 使用虚拟滚动优化大量消息展示 - -- [ ] **聊天相关组件和状态管理** - - ChatHistoryModal组件 (Element Plus重构) - - MessageBubble消息气泡组件 - - ChatInput输入框组件 (支持多媒体) - - 聊天状态管理 (stores/chat.ts) - - WebSocket连接状态管理 - - 离线消息缓存和同步机制 - -### 第三阶段:功能页面重构 (3-4周) - -#### 2.7 日记功能重构 -- [ ] **情绪日记页面** (/diary) - - 实现POST /diary-post/publish发布日记接口 - - 实现GET /diary-post/user/{userId}/page获取用户日记接口 - - 保持现有UI布局和样式完全一致 - - 保持日记发布功能和AI自动点评功能 - - 保持日记列表展示和分页功能 - - 使用@tiptap/vue-3实现富文本编辑 - - 支持图片上传和表情插入 - - 实现日记草稿保存功能 - -#### 2.8 个人中心重构 -- [ ] **个人仪表盘** (/personal-dashboard) - - 实现GET /user/profile获取用户资料接口 - - 实现GET /user/growth-stats获取成长数据接口 - - 保持现有UI布局和样式完全一致 - - 保持用户信息展示和成长数据展示 - - 使用ECharts 5.5.0重构统计图表 - - 实现情绪趋势图、雷达图等可视化 - - 支持数据导出功能 (PDF、Excel) - -- [ ] **个人资料页面** (/profile) - - 实现GET /user/profile获取用户资料接口 - - 实现PUT /user/profile更新用户资料接口 - - 实现POST /user/avatar/upload上传头像接口 - - 实现PUT /user/password修改密码接口 - - 实现邮箱和手机验证接口 - - 保持现有UI布局和样式完全一致 - - 保持信息编辑、头像上传、密码修改功能 - - 使用cropperjs实现头像裁剪功能 - - 使用@vuelidate/core进行表单验证 - -#### 2.9 分析功能重构 -- [ ] **情绪分析页面** (/analysis) - - 实现情绪数据分析接口 (开发中) - - 保持现有UI布局和样式完全一致 - - 使用ECharts实现情绪趋势图、雷达图 - - 使用@antv/g2实现高级数据可视化 - - 保持图表展示和交互功能 - - 支持时间范围筛选和数据导出 - -### 第四阶段:其他页面重构 (2-3周) - -#### 2.10 扩展功能页面 -- [ ] **人生里程碑** (/life-milestones) - - 展示用户重要事件和成就 - - 使用时间轴组件展示里程碑 - - 支持里程碑添加、编辑、删除 - -- [ ] **人生轨迹** (/life-trajectory) - - 可视化用户成长轨迹 - - 使用交互式图表展示成长路径 - - 支持轨迹数据分析和导出 - -- [ ] **消息中心** (/messages) - - 系统消息和AI消息通知 - - 消息分类和状态管理 - - 支持消息标记和批量操作 - -- [ ] **设置页面** (/settings) - - 账号设置和隐私设置 - - 通知设置和主题设置 - - 数据导出和账号注销 - -#### 2.11 工具和辅助页面 -- [ ] **话题追踪** (/topic-tracker) - - 追踪关注的话题和趋势 - - 话题订阅和推荐功能 - -- [ ] **情绪管理** (/emotion) - - 情绪记录和管理工具 - - 情绪调节建议和技巧 - -- [ ] **情绪地图** (/map) - - 情绪地理分布可视化 - - 基于地理位置的情绪分析 - -- [ ] **社交分享** (/social) - - 分享内容到社交平台 - - 社交媒体集成和管理 - -#### 2.12 系统页面 -- [ ] **调试页面** (/debug) - - 开发调试工具和信息 - - 系统状态监控 - -- [ ] **错误页面** (/404, /403) - - 友好的错误提示页面 - - 错误日志收集和上报 - -### 第五阶段:优化与测试 (2-3周) - -#### 2.13 性能优化 -- [ ] **代码分割优化** - - 路由级别懒加载 (Vue Router动态导入) - - 组件级别懒加载 (defineAsyncComponent) - - 第三方库按需加载 (Tree-shaking) - - 使用rollup-plugin-visualizer分析包体积 - -- [ ] **资源优化** - - 图片懒加载 (Intersection Observer API) - - 图片格式优化 (WebP、响应式图片) - - 使用vite-plugin-compression启用Gzip压缩 - - CDN资源配置和缓存策略 - -- [ ] **运行时优化** - - 虚拟滚动 (大量数据列表) - - 防抖和节流优化 - - 内存泄漏检测和修复 - - WebSocket连接池优化 - -#### 2.14 测试与验证 -- [ ] **单元测试** (Vitest 1.4.0) - - 组件测试 (@vue/test-utils 2.4.5) - - 工具函数测试 - - API接口测试 - - 状态管理测试 (Pinia) - - 目标覆盖率 > 80% - -- [ ] **集成测试** - - WebSocket连接测试 - - 认证流程测试 - - 文件上传测试 - - 数据可视化测试 - -- [ ] **E2E测试** (Cypress 13.7.1) - - 用户注册登录流程 - - AI对话功能测试 - - 日记发布流程测试 - - 个人资料编辑测试 - -- [ ] **兼容性和性能测试** - - 多浏览器兼容性测试 - - 移动端响应式测试 - - 性能指标监控 (Web Vitals) - - 错误监控 (Sentry 7.108.0) - -#### 2.15 文档和部署 -- [ ] **技术文档** - - API接口文档 - - 组件使用文档 - - 开发规范文档 - - 故障排除文档 - -- [ ] **部署配置** - - Docker容器化部署 - - CI/CD流程配置 - - 多环境部署脚本 - - 监控和日志配置 - -- [ ] **用户文档** - - 功能使用手册 - - 常见问题解答 - - 更新日志维护 - -## 3. 详细重构指南 - -### 3.1 页面重构标准流程 - -#### 步骤1:分析现有页面 -1. **UI分析**:截图记录当前页面布局 -2. **功能分析**:梳理所有交互功能 -3. **API分析**:确认所有接口调用 -4. **样式分析**:提取所有CSS样式 -5. **图片资源**:收集所有图片和图标 - -#### 步骤2:创建新页面结构 -```typescript -// pages/chat/index.vue - - - - - -``` - -### 3.2 样式迁移策略 - -#### 3.2.1 Tailwind CSS迁移 -```css -/* 原有CSS */ -.chat-message { - background: #f0f0f0; - border-radius: 8px; - padding: 12px; - margin: 8px 0; -} - -/* 迁移到Tailwind */ -
-``` - -### 3.3 WebSocket重构 - -#### 3.3.1 原生WebSocket + STOMP实现 -```typescript -// utils/websocket.ts -import { Client } from '@stomp/stompjs' -import { envConfig } from '@/config/env' - -export class WebSocketService { - private client: Client - private connected = false - private reconnectAttempts = 0 - private maxReconnectAttempts = 5 - private currentToken = '' - private tokenExpiredCallback?: () => void - - constructor(onTokenExpired?: () => void) { - this.tokenExpiredCallback = onTokenExpired - this.client = new Client({ - // 使用原生WebSocket,支持Token认证 - brokerURL: `${envConfig.wsBaseUrl}/ws`, - - // 心跳检测 - heartbeatIncoming: 4000, - heartbeatOutgoing: 4000, - - // 重连配置 - reconnectDelay: 5000, - - // 调试模式 - debug: envConfig.debug ? console.log : undefined, - - onConnect: () => { - this.connected = true - this.reconnectAttempts = 0 - console.log('WebSocket连接成功') - }, - - onDisconnect: () => { - this.connected = false - console.log('WebSocket连接断开') - }, - - onStompError: (frame) => { - console.error('STOMP错误:', frame) - this.handleStompError(frame) - }, - - // WebSocket连接前的配置 - beforeConnect: () => { - if (this.currentToken) { - this.client.configure({ - connectHeaders: { - Authorization: `Bearer ${this.currentToken}`, - 'X-Requested-With': 'XMLHttpRequest' - } - }) - } - } - }) - } - - // 连接WebSocket - connect(token: string) { - this.currentToken = token - this.client.configure({ - connectHeaders: { - Authorization: `Bearer ${token}`, - 'X-Requested-With': 'XMLHttpRequest' - } - }) - this.client.activate() - } - - // 断开连接 - disconnect() { - this.client.deactivate() - } - - // 更新Token(用于Token刷新场景) - updateToken(newToken: string) { - this.currentToken = newToken - if (this.connected) { - this.disconnect() - setTimeout(() => { - this.connect(newToken) - }, 1000) - } - } - - // 订阅消息 - subscribe(destination: string, callback: (message: any) => void) { - if (!this.connected) { - console.warn('WebSocket未连接') - return - } - - return this.client.subscribe(destination, (message) => { - try { - const data = JSON.parse(message.body) - callback(data) - } catch (error) { - console.error('消息解析失败:', error) - } - }) - } - - // 发送消息 - send(destination: string, body: any) { - if (!this.connected) { - console.warn('WebSocket未连接,消息将被缓存') - return - } - - this.client.publish({ - destination, - body: JSON.stringify(body) - }) - } - - // 处理STOMP错误 - private handleStompError(frame: any) { - if (frame.headers && frame.headers.message) { - const errorMessage = frame.headers.message.toLowerCase() - - if (errorMessage.includes('unauthorized') || - errorMessage.includes('invalid token') || - errorMessage.includes('token expired')) { - - console.warn('Token认证失败,触发重新登录') - this.tokenExpiredCallback?.() - return - } - } - - this.handleReconnect() - } - - // 处理重连 - private handleReconnect() { - if (this.reconnectAttempts < this.maxReconnectAttempts) { - this.reconnectAttempts++ - setTimeout(() => { - console.log(`尝试重连 (${this.reconnectAttempts}/${this.maxReconnectAttempts})`) - this.client.activate() - }, 5000 * this.reconnectAttempts) - } - } -} -``` - -#### 3.3.2 聊天组合式API -```typescript -// composables/useChat.ts -import { ref, onMounted, onUnmounted } from 'vue' -import { WebSocketService } from '@/utils/websocket' -import { useAuthStore } from '@/stores/auth' -import type { ChatMessage } from '@/types/chat' - -export function useChat() { - const authStore = useAuthStore() - const wsService = new WebSocketService(() => { - // Token过期回调 - authStore.logout() - router.push('/login') - }) - - const messages = ref([]) - const isConnected = ref(false) - - // 连接WebSocket - const connect = () => { - if (authStore.token) { - wsService.connect(authStore.token) - - // 订阅个人消息 - wsService.subscribe(`/user/${authStore.user.id}/queue/messages`, (message) => { - messages.value.push(message) - }) - - // 订阅聊天室消息 - wsService.subscribe('/topic/chat', (message) => { - messages.value.push(message) - }) - - isConnected.value = true - } - } - - // 发送消息 - const sendMessage = (content: string, type: 'text' | 'image' = 'text') => { - const message = { - content, - type, - timestamp: Date.now(), - userId: authStore.user.id - } - - wsService.send('/app/chat.send', message) - } - - // 组件挂载时连接 - onMounted(() => { - connect() - }) - - // 组件卸载时断开连接 - onUnmounted(() => { - wsService.disconnect() - }) - - return { - messages, - isConnected, - sendMessage, - connect - } -} -``` - -## 4. 质量保证措施 - -### 4.1 功能一致性检查清单 - -#### 页面功能检查 -- [ ] 页面布局完全一致 -- [ ] 所有按钮和链接功能正常 -- [ ] 表单验证逻辑一致 -- [ ] 错误提示信息一致 -- [ ] 加载状态显示一致 -- [ ] 响应式设计一致 - -#### 交互功能检查 -- [ ] 点击事件响应一致 -- [ ] 键盘快捷键一致 -- [ ] 滚动行为一致 -- [ ] 动画效果一致 -- [ ] 拖拽功能一致 - -### 4.2 视觉一致性检查清单 - -#### 样式检查 -- [ ] 颜色方案完全一致 -- [ ] 字体大小和样式一致 -- [ ] 间距和布局一致 -- [ ] 边框和圆角一致 -- [ ] 阴影效果一致 - -#### 图片和图标检查 -- [ ] 所有图片显示正常 -- [ ] 图标样式一致 -- [ ] 图片尺寸一致 -- [ ] 图片加载状态一致 - -## 5. 测试策略 - -### 5.1 自动化测试 - -#### 单元测试 -```typescript -// tests/components/ChatMessage.test.ts -import { mount } from '@vue/test-utils' -import { describe, it, expect } from 'vitest' -import ChatMessage from '@/components/ChatMessage.vue' - -describe('ChatMessage', () => { - it('renders message content correctly', () => { - const message = { - id: '1', - content: 'Hello World', - senderId: 'user1', - senderType: 'USER' as const, - timestamp: Date.now() - } - - const wrapper = mount(ChatMessage, { - props: { message, isOwn: true } - }) - - expect(wrapper.text()).toContain('Hello World') - }) -}) -``` - -### 5.2 手动测试清单 - -#### 功能测试 -- [ ] 用户注册流程 -- [ ] 用户登录流程 -- [ ] AI对话功能 -- [ ] 日记发布功能 -- [ ] 个人资料编辑 -- [ ] 设置页面功能 - -#### 兼容性测试 -- [ ] Chrome浏览器 -- [ ] Firefox浏览器 -- [ ] Safari浏览器 -- [ ] Edge浏览器 -- [ ] 移动端浏览器 - -## 6. 成功标准 - -### 6.1 功能标准 -- [ ] 所有现有功能100%保留 -- [ ] 所有页面UI完全一致 -- [ ] 所有交互流程正常 -- [ ] 所有API接口正常工作 - -### 6.2 性能标准 -- [ ] 首屏加载时间 < 2秒 -- [ ] 页面切换时间 < 500ms -- [ ] 内存使用增长 < 50MB -- [ ] 构建时间 < 3分钟 - -### 6.3 质量标准 -- [ ] 代码覆盖率 > 80% -- [ ] 无严重bug -- [ ] 通过所有测试用例 -- [ ] 符合代码规范 - -## 7. 总结 - -本重构计划确保在升级到最新技术栈的同时,完全保持现有的功能、UI和用户体验。通过分阶段的重构策略,可以降低风险并确保每个阶段的质量。重构完成后,项目将具备更好的性能、可维护性和扩展性,为未来的功能开发奠定坚实基础。 - -### 7.1 关键成功因素 -1. **严格的功能一致性检查** -2. **详细的UI对比验证** -3. **完善的测试覆盖** -4. **渐进式的重构策略** -5. **充分的团队协作** - -### 7.2 预期收益 - -#### 技术层面收益 -1. **技术栈现代化**:Vue3.4.21 + TypeScript5.4.2 + Vite5.1.6 -2. **性能显著提升**: - - 首屏加载时间减少40% (目标<2秒) - - 运行时性能提升30% (Vue3 Proxy响应式) - - 包体积减少25% (Tree-shaking + 代码分割) - - WebSocket连接更稳定 (原生WebSocket + Token认证) - -3. **开发体验提升**: - - TypeScript类型安全,减少90%的类型错误 - - 自动导入和组件注册,提升开发效率50% - - 热更新速度提升3倍 (Vite vs Webpack) - - 更好的调试工具和错误提示 - -#### 业务层面收益 -4. **功能稳定性提升**: - - WebSocket连接稳定性提升 (自动重连 + Token认证) - - 错误监控和日志收集 (Sentry集成) - - 完善的测试覆盖 (单元测试 + E2E测试) - -5. **用户体验优化**: - - 响应式设计优化,移动端体验提升 - - 数据可视化效果增强 (ECharts5.5.0) - - PWA支持,离线访问能力 - - 国际化支持,多语言适配 - -6. **维护和扩展性**: - - 组件化架构,代码复用率提升60% - - 模块化设计,新功能开发效率提升40% - - 完善的文档和规范,团队协作效率提升 - - CI/CD自动化,部署效率提升80% - -#### 长期价值 -7. **技术债务清理**:清理历史技术债务,为未来发展奠定基础 -8. **团队技能提升**:掌握现代前端技术栈,提升团队竞争力 -9. **可持续发展**:基于最新技术栈,保证3-5年技术先进性 diff --git a/web/deploy.ps1 b/web/deploy.ps1 deleted file mode 100644 index 325586c..0000000 --- a/web/deploy.ps1 +++ /dev/null @@ -1,52 +0,0 @@ -# 部署脚本 - 将构建好的文件上传到服务器 -# 使用方法: .\deploy.ps1 - -param( - [string]$ServerIP = "47.111.10.27", - [string]$Username = "root", - [string]$RemotePath = "/data/www/emotion-museum" -) - -Write-Host "开始部署前端应用到服务器..." -ForegroundColor Green - -# 检查dist目录是否存在 -if (-not (Test-Path "dist")) { - Write-Host "错误: dist目录不存在,请先运行 npm run build" -ForegroundColor Red - exit 1 -} - -# 检查是否安装了scp命令(需要安装OpenSSH客户端) -try { - scp 2>&1 | Out-Null -} catch { - Write-Host "错误: 未找到scp命令,请安装OpenSSH客户端" -ForegroundColor Red - Write-Host "可以通过以下方式安装:" -ForegroundColor Yellow - Write-Host "1. Windows 10/11: 设置 -> 应用 -> 可选功能 -> 添加功能 -> OpenSSH客户端" -ForegroundColor Yellow - Write-Host "2. 或者使用 WinSCP 等工具手动上传" -ForegroundColor Yellow - exit 1 -} - -Write-Host "正在上传文件到服务器 $ServerIP..." -ForegroundColor Yellow - -# 上传所有文件到服务器 -try { - # 上传index.html - scp "dist/index.html" "${Username}@${ServerIP}:${RemotePath}/" - - # 上传assets目录 - scp -r "dist/assets" "${Username}@${ServerIP}:${RemotePath}/" - - # 上传测试文件 - scp "dist/test-*.html" "${Username}@${ServerIP}:${RemotePath}/" - - Write-Host "部署完成!" -ForegroundColor Green - Write-Host "访问地址: http://$ServerIP/emotion-museum/" -ForegroundColor Cyan - -} catch { - Write-Host "部署失败: $($_.Exception.Message)" -ForegroundColor Red - Write-Host "请检查:" -ForegroundColor Yellow - Write-Host "1. 服务器IP地址是否正确" -ForegroundColor Yellow - Write-Host "2. SSH密钥是否配置正确" -ForegroundColor Yellow - Write-Host "3. 服务器目录权限是否正确" -ForegroundColor Yellow - exit 1 -} diff --git a/web/src/router/index.ts b/web/src/router/index.ts index ef35dd8..df3ab24 100644 --- a/web/src/router/index.ts +++ b/web/src/router/index.ts @@ -189,6 +189,21 @@ const routes: RouteRecordRaw[] = [ hidden: true } }, + { + path: '/forgot-password', + name: 'ForgotPassword', + component: () => import('@/views/ForgotPassword/index.vue'), + meta: { + title: '重置密码', + requiresAuth: false, + hidden: true + } + }, + { + path: '/reset-password', + redirect: '/forgot-password', + meta: { hidden: true } + }, // 调试页面(仅开发环境) { path: '/debug', diff --git a/web/src/services/auth.ts b/web/src/services/auth.ts index fe2c62c..7532642 100644 --- a/web/src/services/auth.ts +++ b/web/src/services/auth.ts @@ -44,13 +44,22 @@ export class AuthService { } /** - * 获取验证码 + * 获取图形验证码(备用) */ static async getCaptcha(): Promise { const response = await http.get('/auth/captcha') return response.data } + /** + * 发送短信验证码(用于登录/注册/找回密码等场景) + */ + static async sendSmsCode(phone: string) { + // backend-single: GET /auth/sms-code?phone=xxx + const response = await http.get('/auth/sms-code', { params: { phone } }) + return response.data + } + /** * 用户登出 */ @@ -71,7 +80,8 @@ export class AuthService { * 获取当前用户信息 */ static async getCurrentUserInfo(): Promise { - const response = await http.get('/auth/user/info') + // backend-single: GET /auth/userInfo + const response = await http.get('/auth/userInfo') return response.data } @@ -94,21 +104,24 @@ export class AuthService { * 重置密码 */ static async resetPassword(data: ResetPasswordRequest): Promise { - return http.post('/auth/reset-password', data) + return http.post('/auth/resetPassword', data) + } + + // 废弃:后端未提供该接口,保留新 sendSmsCode() + /** + * 发送验证码(已废弃:统一使用 sendSmsCode(phone)) + */ + static async sendCode(_data: SendCodeRequest): Promise { + console.warn('sendCode 已废弃,请使用 sendSmsCode(phone)') + return Promise.resolve() } /** - * 发送验证码 + * 验证验证码(不使用,登录由后端校验短信验证码) */ - static async sendCode(data: SendCodeRequest): Promise { - return http.post('/auth/send-code', data) - } - - /** - * 验证验证码 - */ - static async verifyCode(data: VerifyCodeRequest): Promise { - return http.post('/auth/verify-code', data) + static async verifyCode(_data: VerifyCodeRequest): Promise { + console.warn('verifyCode 不需要在前端调用,登录时由后端校验短信验证码') + return Promise.resolve(true) } /** diff --git a/web/src/types/auth.ts b/web/src/types/auth.ts index 1225f43..e643ad1 100644 --- a/web/src/types/auth.ts +++ b/web/src/types/auth.ts @@ -2,17 +2,13 @@ * 认证相关类型定义 */ -// 登录请求 +// 登录请求(对齐 backend-single:手机号 + 短信验证码) export interface LoginRequest { - /** 账号(支持账号/邮箱/手机号) */ - account: string - /** 密码 */ - password: string - /** 验证码 */ - captcha: string - /** 验证码key */ - captchaKey: string - /** 记住我 */ + /** 手机号 */ + phone: string + /** 短信验证码(开发期为固定 123456) */ + smsCode: string + /** 记住我(前端本地使用,可选) */ rememberMe?: boolean } @@ -138,16 +134,12 @@ export interface ChangePasswordRequest { // 重置密码请求 export interface ResetPasswordRequest { - /** 账号 */ - account: string + /** 手机号 */ + phone: string /** 新密码 */ newPassword: string - /** 确认新密码 */ - confirmPassword: string - /** 验证码 */ + /** 验证码(固定 123456) */ captcha: string - /** 验证码key */ - captchaKey: string } // 发送验证码请求 diff --git a/web/src/views/Login/index.vue b/web/src/views/Login/index.vue index 52d0260..154bcfb 100644 --- a/web/src/views/Login/index.vue +++ b/web/src/views/Login/index.vue @@ -14,49 +14,31 @@ label-width="80px" @submit.prevent="handleLogin" > - + - - - - - -
+ +
-
- 验证码 -
- -
-
+ + {{ countdown > 0 ? `${countdown}s` : (smsSending ? '发送中...' : '获取验证码') }} +
@@ -135,56 +117,61 @@ const loginFormRef = ref() // 加载状态 const loading = ref(false) -// 验证码相关 -const captchaImage = ref('') -const captchaKey = ref('') +// 短信验证码发送状态 +const smsSending = ref(false) +const countdown = ref(0) +let timer: number | null = null -// 登录表单数据 +// 登录表单数据(手机号+短信验证码) const loginForm = reactive({ - account: '', - password: '', - captcha: '', - captchaKey: '', + phone: '', + smsCode: '', rememberMe: false }) -// 表单验证规则 +// 表单验证规则(手机号 + 短信验证码) const loginRules: FormRules = { - account: [ - { required: true, message: '请输入账号', trigger: 'blur' } + phone: [ + { required: true, message: '请输入手机号', trigger: 'blur' }, + { pattern: /^1[3-9]\d{9}$/, message: '手机号格式不正确', trigger: 'blur' } ], - password: [ - { required: true, message: '请输入密码', trigger: 'blur' }, - { min: 6, max: 20, message: '密码长度必须在6-20位之间', trigger: 'blur' } - ], - captcha: [ + smsCode: [ { required: true, message: '请输入验证码', trigger: 'blur' }, - { min: 4, max: 6, message: '验证码长度不正确', trigger: 'blur' } + { min: 6, max: 6, message: '验证码必须为6位', trigger: 'blur' } ] } /** - * 获取验证码 + * 发送短信验证码 */ -const getCaptcha = async () => { - try { - const response = await AuthService.getCaptcha() - // 后端返回的数据已经包含了 data:image/png;base64, 前缀,直接使用 - captchaImage.value = response.captchaImage - captchaKey.value = response.captchaKey - loginForm.captchaKey = response.captchaKey - } catch (error) { - console.error('获取验证码失败:', error) - ElMessage.error('获取验证码失败') +const handleSendSmsCode = async () => { + if (!loginForm.phone) { + ElMessage.warning('请先填写手机号') + return + } + if (!/^1[3-9]\d{9}$/.test(loginForm.phone)) { + ElMessage.warning('手机号格式不正确') + return + } + try { + smsSending.value = true + await AuthService.sendSmsCode(loginForm.phone) + ElMessage.success('验证码已发送,请注意查收') + // 启动倒计时 + countdown.value = 60 + timer && clearInterval(timer) + timer = window.setInterval(() => { + countdown.value -= 1 + if (countdown.value <= 0 && timer) { + clearInterval(timer) + timer = null + } + }, 1000) + } catch (error) { + console.error('发送短信验证码失败:', error) + } finally { + smsSending.value = false } -} - -/** - * 刷新验证码 - */ -const refreshCaptcha = () => { - loginForm.captcha = '' - getCaptcha() } /** @@ -194,44 +181,23 @@ const handleLogin = async () => { if (!loginFormRef.value) return try { - console.log('开始登录流程...') - console.log('登录表单数据:', loginForm) + console.log('🔐 开始登录流程...') // 表单验证 await loginFormRef.value.validate() - console.log('表单验证通过') loading.value = true - // 调用登录接口 - console.log('调用登录接口...') + // 调用登录接口(手机号 + 短信验证码) const success = await authStore.login(loginForm) - console.log('登录结果:', success) if (success) { - // 登录成功,确保认证状态已正确设置 - console.log('登录成功,当前认证状态:', { - isLoggedIn: authStore.isLoggedIn, - hasToken: !!authStore.accessToken, - hasUserInfo: !!authStore.userInfo - }) - - // 跳转到目标页面或首页 - const redirect = route.query.redirect as string || '/' - console.log('登录成功,跳转到:', redirect) - - // 使用路由跳转而不是window.location.href,避免base路径问题 + const redirect = (route.query.redirect as string) || '/' await router.push(redirect) - } else { - // 登录失败,刷新验证码 - console.log('登录失败,刷新验证码') - refreshCaptcha() } } catch (error) { console.error('登录过程中发生错误:', error) ElMessage.error('登录失败,请检查网络连接或稍后重试') - // 刷新验证码 - refreshCaptcha() } finally { loading.value = false } @@ -245,13 +211,10 @@ const handleSocialLogin = (platform: 'wechat' | 'qq') => { // TODO: 实现第三方登录逻辑 } -// 组件挂载时获取验证码 +// 组件挂载时:如果已登录直接跳转 onMounted(() => { - getCaptcha() - - // 如果已经登录,直接跳转 if (authStore.isLoggedIn) { - const redirect = route.query.redirect as string || '/' + const redirect = (route.query.redirect as string) || '/' router.push(redirect) } }) diff --git a/开心APP网页代码v1.1.zip b/开心APP网页代码v1.1.zip deleted file mode 100644 index 1da10bc62953085bc4d8456cabc3a422b145ed70..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54574 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 z 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 B[注册登录] - B --> C[个人信息设置] - C --> D[情绪状态评估] - D --> E[AI对话引导] - E --> F[功能介绍] - F --> G[开始使用] -``` - -#### 日常使用流程 -```mermaid -graph TD - A[打开应用] --> B[查看今日情绪] - B --> C[开始对话/浏览内容] - C --> D[AI分析反馈] - D --> E[查看成长建议] - E --> F[探索推荐内容] - F --> G[记录/分享] -``` - -### 🎮 用户激励机制 - -| 行为 | 奖励机制 | 说明 | -| --- | --- | --- | -| 每日对话 | 积分+连续天数 | 培养使用习惯 | -| 完成课题 | 经验值+称号 | 促进成长目标 | -| 分享内容 | 影响力积分 | 鼓励社区参与 | -| 邀请好友 | 特殊奖励 | 促进用户增长 | - ---- - -## 5. 开发优先级 - -### 🚀 MVP开发路线图 - -#### Phase 1: 核心对话系统 (2-3周) -- ✅ 基础UI框架搭建 -- ✅ AI对话功能实现 -- ✅ 语音输入集成 -- ✅ 本地数据存储 -- ✅ 情绪日历基础版 - -#### Phase 2: 个人成长模块 (2-3周) -- ✅ 情绪分析算法 -- ✅ 课题推荐系统 -- ✅ 用户画像建模 -- ✅ 数据可视化组件 -- ✅ 成就系统基础版 - -#### Phase 3: 地图和社区 (3-4周) -- ✅ 地图SDK集成 -- ✅ 位置服务功能 -- ✅ 内容分享系统 -- ✅ 社区互动功能 -- ✅ 内容审核机制 - -#### Phase 4: 优化和完善 (1-2周) -- ✅ 性能优化 -- ✅ 用户体验改进 -- ✅ 数据分析完善 -- ✅ 安全和隐私加强 - -### 📊 功能优先级矩阵 - -| 功能模块 | 用户价值 | 技术复杂度 | 开发优先级 | 预估工期 | -| --- | --- | --- | --- | --- | -| AI对话系统 | 高 | 中 | P0 | 1周 | -| 情绪日历 | 高 | 低 | P0 | 3天 | -| 对话记录 | 高 | 低 | P0 | 2天 | -| 成长课题 | 中 | 中 | P1 | 1周 | -| 情绪分析 | 中 | 高 | P1 | 1.5周 | -| 地图功能 | 中 | 高 | P2 | 2周 | -| 社区分享 | 低 | 中 | P2 | 1周 | -| 用户画像 | 低 | 中 | P3 | 3天 | - ---- - -## 6. 技术实现建议 - -### 🛠 关键技术组件 - -#### AI对话服务 -```swift -// AI服务协议 -protocol AIServiceProtocol { - func sendMessage(_ message: String) async throws -> AIResponse - func analyzeEmotion(_ text: String) async throws -> EmotionAnalysis -} - -// GPT-4集成示例 -class OpenAIService: AIServiceProtocol { - private let apiKey = "your-api-key" - private let endpoint = "https://api.openai.com/v1/chat/completions" - - func sendMessage(_ message: String) async throws -> AIResponse { - // 实现GPT-4 API调用 - } -} -``` - -#### 语音识别集成 -```swift -import Speech - -class SpeechRecognitionService { - private let speechRecognizer = SFSpeechRecognizer(locale: Locale(identifier: "zh-CN")) - - func startRecording() async throws -> String { - // 实现语音转文字功能 - } -} -``` - -#### 情绪数据模型 -```swift -struct EmotionRecord { - let id: UUID - let date: Date - let emotionType: EmotionType - let intensity: Float // 0.0 - 1.0 - let context: String - let aiAnalysis: String? -} - -enum EmotionType: String, CaseIterable { - case joy = "喜悦" - case sadness = "悲伤" - case anger = "愤怒" - case fear = "恐惧" - case surprise = "惊讶" - case neutral = "平静" -} -``` - -### 🔧 第三方依赖 - -| 依赖库 | 用途 | 集成方式 | -| --- | --- | --- | -| AMapFoundation | 地图服务 | SPM/CocoaPods | -| AMapLocation | 定位服务 | SPM/CocoaPods | -| Charts | 数据可视化 | SPM | -| Alamofire | 网络请求 | SPM | -| Kingfisher | 图片加载 | SPM | - ---- - -## 7. 数据模型设计 - -### 📊 Core Data实体关系 - -``` -User (用户) -├── conversations: [Conversation] (对话记录) -├── emotionRecords: [EmotionRecord] (情绪记录) -├── growthTopics: [GrowthTopic] (成长课题) -├── achievements: [Achievement] (成就记录) -├── locations: [UserLocation] (用户地点) -└── posts: [CommunityPost] (社区分享) - -Conversation (对话) -├── messages: [Message] (消息列表) -├── emotionAnalysis: EmotionAnalysis (情绪分析) -└── topics: [String] (关联话题) - -GrowthTopic (成长课题) -├── category: TopicCategory (课题分类) -├── progress: Float (完成进度) -├── interactions: [TopicInteraction] (互动记录) -└── rewards: [Reward] (获得奖励) -``` - -### 🗃 数据表结构 - -#### 用户表 (User) -| 字段 | 类型 | 说明 | 索引 | -| --- | --- | --- | --- | -| id | UUID | 主键 | PK | -| username | String | 用户名 | UNIQUE | -| email | String | 邮箱 | UNIQUE | -| profile | UserProfile | 用户档案 | - | -| createdAt | Date | 创建时间 | INDEX | -| lastActiveAt | Date | 最后活跃 | INDEX | - -#### 对话表 (Conversation) -| 字段 | 类型 | 说明 | 索引 | -| --- | --- | --- | --- | -| id | UUID | 主键 | PK | -| userId | UUID | 用户ID | FK | -| title | String | 对话标题 | - | -| startTime | Date | 开始时间 | INDEX | -| endTime | Date | 结束时间 | INDEX | -| messageCount | Int | 消息数量 | - | - -#### 情绪记录表 (EmotionRecord) -| 字段 | 类型 | 说明 | 索引 | -| --- | --- | --- | --- | -| id | UUID | 主键 | PK | -| userId | UUID | 用户ID | FK | -| emotionType | String | 情绪类型 | INDEX | -| intensity | Float | 情绪强度 | - | -| recordDate | Date | 记录日期 | INDEX | -| context | String | 情绪背景 | - | - -### 💾 数据同步策略 - -- **本地优先**: 所有数据本地存储,确保离线可用 -- **增量同步**: 只同步变化的数据,减少网络开销 -- **冲突解决**: 时间戳优先,客户端胜出策略 -- **数据备份**: 定期备份到iCloud,支持设备间同步 - ---- - -## 📄 附录 - -### 版本历史 -- **v1.0** (2025-07-03): 初始版本,完整的MVP需求规格 - -### 相关文档 -- 设计规范文档 -- API接口文档 -- 测试用例文档 -- 部署运维文档 - ---- - -*本文档将根据开发进度持续更新和完善*