diff --git a/.env.example b/.env.example index 73f5a45..966a036 100644 --- a/.env.example +++ b/.env.example @@ -1,24 +1,8 @@ -# # 数据库配置 -# DB_HOST=localhost -# DB_USER=your_username -# DB_PASSWORD=your_password +# jwt密钥 用于生成token加密 +JWT_SECRET="" -# # API密钥 -# API_KEY=your_api_key +# 用户注册码 +REGISTER_CODE='9527' -# # 其他敏感信息 -# CLOUD115_TOKEN=your_token - -# 代理信息 -HTTP_PROXY_HOST=127.0.0.1 -HTTP_PROXY_PORT=7890 - -# 115网盘配置 -CLOUD115_USER_ID=your_user_id # 用户ID 可以不填 -CLOUD115_COOKIE=your_cookie - -# 夸克网盘配置 -QUARK_COOKIE='your_cookie' - -# RSS配置 -RSS_BASE_URL=https://rsshub.rssforever.com/telegram/channel \ No newline at end of file +# 服务端口 +PORT=8009 diff --git a/.gitignore b/.gitignore index d6a73ff..8c87e52 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,11 @@ dist/ .env.local .env.*.local +*.tar + +# 数据库数据 +*.sqlite + # 保留模板 !.env.example diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..57bac04 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,45 @@ +# 构建前端项目 +FROM node:18-alpine as frontend-build +WORKDIR /app +COPY frontend/package*.json ./ +RUN npm install -g pnpm +RUN pnpm install +COPY frontend/ ./ +RUN npm run build + +# 构建后端项目 +FROM node:18-alpine as backend-build +WORKDIR /app +COPY backend/package*.json ./ +RUN npm install -g pnpm +RUN pnpm install +COPY backend/ ./ +RUN rm -f database.sqlite +RUN npm run build + +# 生产环境镜像 +FROM node:18-alpine + +# 安装 Nginx +RUN apk add --no-cache nginx + +# 设置工作目录 +WORKDIR /app + +# 复制前端构建产物到 Nginx +COPY --from=frontend-build /app/dist /usr/share/nginx/html + +# 复制 Nginx 配置文件 +COPY nginx.conf /etc/nginx/nginx.conf + +# 复制后端构建产物到生产环境镜像 +COPY --from=backend-build /app /app + +# 安装生产环境依赖 +RUN npm install --production + +# 暴露端口 +EXPOSE 8008 + +# 启动 Nginx 和后端服务 +CMD ["sh", "-c", "nginx -g 'daemon off;' & npm run start && wait"] diff --git a/README.md b/README.md index 3c5dae9..7582bb2 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # CloudSaver 一个基于 Vue 3 + Express 的网盘资源搜索与转存工具。 +可通过docker 一键部署。 ## 特别声明 @@ -12,32 +13,48 @@ ## 注意事项 1. 此项目的资源搜索需要用到代理环境,请自行搭建。 -2. 默认的代理地址为:`http://127.0.0.1`,端口为:`7890`,如需修改,请自行 `.env`中配置。 +2. 新用户注册,管理员默认注册码:230713;普通用户默认注册码:9527 ## 功能特性 - 支持多个资源订阅(电报群)源搜索 -- 支持 115 网盘与夸克网盘资源转存 +- 支持 115 网盘与夸克网盘**一键**资源转存 - 支持关键词搜索与资源链接解析 - 支持转存文件夹展示与选择 +- 支持多用户使用 +- 支持豆瓣热门榜单 +- 支持热门榜单资源搜索 ## 预览 +### 登录/注册 + + + + ### 最新资源搜索 - - -### 转存 - - + ### 关键词搜索 - + + +### 热门榜单 + + + + +### 转存 + + + + +### 系统设置 + + -### 直接链接解析 - ## 技术栈 @@ -55,6 +72,7 @@ - Node.js - Express - TypeScript +- Sqlite3 - RSS Parser ## 环境配置 @@ -63,6 +81,8 @@ 本项目需要 `Node.js` 版本 `18.x` 或更高版本。请确保在运行项目之前安装了正确的版本。 +推荐使用pnpm进行依赖包安装,默认支持workspace,可以避免版本冲突。 + ### 后端配置项 复制环境变量模板文件: @@ -72,8 +92,6 @@ cp .env.example ./backend/.env ``` - 根据 `.env.example`文件在 `backend`目录下创建 `.env`文件。 -- `CLOUD115_COOKIE`:115 用户 cookie -- `QUARK_COOKIE`:quark cookie ## 使用 @@ -89,8 +107,21 @@ cp .env.example ./backend/.env - 后端服务:先进入后端目录`backend`下`npm run build`构建,然后执行 `npm run start`启动,默认端口为`8009`。 - 通过`nginx`配置代理服务,将前端api的请求映射到后端服务。 +## Docker 部署 + +- 构建镜像: +```bash +# 构建示例 +docker build --platform linux/amd64 -t cloud-saver . --no-cache +``` +- 运行容器: +```bash +docker run -d -p 8008:8008 --name cloud-saver cloud-saver +``` + ## 交流沟通 + ## License diff --git a/backend/package.json b/backend/package.json index 968c4e0..2849e0f 100644 --- a/backend/package.json +++ b/backend/package.json @@ -9,19 +9,25 @@ }, "dependencies": { "axios": "^1.6.7", + "bcrypt": "^5.1.1", "cheerio": "^1.0.0", "cookie-parser": "^1.4.6", "cors": "^2.8.5", "dotenv": "^16.4.5", "express": "^4.18.3", + "jsonwebtoken": "^9.0.2", "rss-parser": "^3.13.0", + "sequelize": "^6.37.5", "socket.io": "^4.8.1", + "sqlite3": "^5.1.7", "tunnel": "^0.0.6" }, "devDependencies": { + "@types/bcrypt": "^5.0.2", "@types/cookie-parser": "^1.4.7", "@types/cors": "^2.8.17", "@types/express": "^4.17.21", + "@types/jsonwebtoken": "^9.0.7", "@types/node": "^20.11.25", "@types/tunnel": "^0.0.7", "nodemon": "^3.1.0", diff --git a/backend/src/app.ts b/backend/src/app.ts index 046e5d3..51951fa 100644 --- a/backend/src/app.ts +++ b/backend/src/app.ts @@ -1,8 +1,14 @@ +// filepath: /d:/code/CloudDiskDown/backend/src/app.ts +import "./types/express"; import express from "express"; import cors from "cors"; import cookieParser from "cookie-parser"; import routes from "./routes/api"; import { errorHandler } from "./middleware/errorHandler"; +import sequelize from "./config/database"; +import { authMiddleware } from "./middleware/auth"; +import GlobalSetting from "./models/GlobalSetting"; +import Searcher from "./services/Searcher"; const app = express(); @@ -17,14 +23,54 @@ app.use( app.use(cookieParser()); app.use(express.json()); + +// 应用 token 验证中间件,排除登录和注册接口 +app.use((req, res, next) => { + if ( + req.path === "/user/login" || + req.path === "/user/register" || + req.path.includes("tele-images") + ) { + return next(); + } + authMiddleware(req, res, next); +}); + app.use("/", routes); +const initializeGlobalSettings = async () => { + const settings = await GlobalSetting.findOne(); + if (!settings) { + await GlobalSetting.create({ + httpProxyHost: "127.0.0.1", + httpProxyPort: 7890, + isProxyEnabled: true, + CommonUserCode: 9527, + AdminUserCode: 230713, + }); + console.log("Global settings initialized with default values."); + } + await Searcher.updateAxiosInstance(); +}; + // 错误处理 app.use(errorHandler); const PORT = process.env.PORT || 8009; -app.listen(PORT, () => { - console.log(`Server is running on port ${PORT}`); -}); + +// 在同步前禁用外键约束,同步后重新启用 +sequelize + .query("PRAGMA foreign_keys = OFF") // 禁用外键 + .then(() => sequelize.sync({ alter: true })) + .then(() => sequelize.query("PRAGMA foreign_keys = ON")) // 重新启用外键 + .then(() => { + app.listen(PORT, async () => { + await initializeGlobalSettings(); + console.log(`Server is running on port ${PORT}`); + }); + }) + .catch((error) => { + console.error("Database sync failed:", error); + }); export default app; diff --git a/backend/src/config/database.ts b/backend/src/config/database.ts new file mode 100644 index 0000000..7c19515 --- /dev/null +++ b/backend/src/config/database.ts @@ -0,0 +1,9 @@ +// backend/src/config/database.ts +import { Sequelize } from "sequelize"; + +const sequelize = new Sequelize({ + dialect: "sqlite", + storage: "./data/database.sqlite", +}); + +export default sequelize; diff --git a/backend/src/config/index.ts b/backend/src/config/index.ts index d5300ad..9b03c69 100644 --- a/backend/src/config/index.ts +++ b/backend/src/config/index.ts @@ -30,6 +30,8 @@ interface HttpProxyConfig { port: string; } interface Config { + jwtSecret: string; + registerCode: string; rss: { baseUrl: string; channels: Channel[]; @@ -44,6 +46,7 @@ interface Config { } export const config: Config = { + jwtSecret: process.env.JWT_SECRET || "uV7Y$k92#LkF^q1b!", rss: { baseUrl: process.env.RSS_BASE_URL || "https://rsshub.rssforever.com/telegram/channel", channels: [ @@ -61,14 +64,15 @@ export const config: Config = { }, ], }, + registerCode: process.env.REGISTER_CODE || "9527", telegram: { baseUrl: process.env.TELEGRAM_BASE_URL || "https://t.me/s", }, httpProxy: { - host: process.env.HTTP_PROXY_HOST || "127.0.0.1", - port: process.env.HTTP_PROXY_PORT || "7890", + host: process.env.HTTP_PROXY_HOST || "", + port: process.env.HTTP_PROXY_PORT || "", }, cloudPatterns: { @@ -77,7 +81,7 @@ export const config: Config = { weiyun: /https?:\/\/share\.weiyun\.com\/[^\s<>"]+/g, aliyun: /https?:\/\/\w+\.aliyundrive\.com\/[^\s<>"]+/g, // pan115有两个域名 115.com 和 anxia.com - pan115: /https?:\/\/(?:115|anxia)\.com\/s\/[^\s<>"]+/g, + pan115: /https?:\/\/(?:115|anxia|115cdn)\.com\/s\/[^\s<>"]+/g, quark: /https?:\/\/pan\.quark\.cn\/[^\s<>"]+/g, }, diff --git a/backend/src/controllers/cloud115.ts b/backend/src/controllers/cloud115.ts index f84cb19..f289098 100644 --- a/backend/src/controllers/cloud115.ts +++ b/backend/src/controllers/cloud115.ts @@ -1,46 +1,61 @@ import { Request, Response, NextFunction } from "express"; import { Cloud115Service } from "../services/Cloud115Service"; -import { config } from "../config"; -import handleError from "../utils/handleError"; -import { handleResponse } from "../utils/responseHandler"; +import { sendSuccess, sendError } from "../utils/response"; +import UserSetting from "../models/UserSetting"; -const { cookie } = config.cloud115; - -const cloud115 = new Cloud115Service(cookie); +const cloud115 = new Cloud115Service(); +const setCookie = async (req: Request) => { + const userId = req.user?.userId; + const userSetting = await UserSetting.findOne({ + where: { userId }, + }); + console.log(userSetting?.dataValues.cloud115Cookie); + if (userSetting && userSetting.dataValues.cloud115Cookie) { + cloud115.setCookie(userSetting.dataValues.cloud115Cookie); + } else { + throw new Error("请先设置115网盘cookie"); + } +}; export const cloud115Controller = { async getShareInfo(req: Request, res: Response, next: NextFunction) { try { const { shareCode, receiveCode } = req.query; + await setCookie(req); const result = await cloud115.getShareInfo(shareCode as string, receiveCode as string); - handleResponse(res, result, true); + sendSuccess(res, result); } catch (error) { - handleError(res, error, "获取分享信息失败", next); + console.log(error); + sendError(res, { message: (error as Error).message || "获取分享信息失败" }); } }, async getFolderList(req: Request, res: Response, next: NextFunction) { try { const { parentCid } = req.query; + await setCookie(req); const result = await cloud115.getFolderList(parentCid as string); - handleResponse(res, result, true); + sendSuccess(res, result); } catch (error) { - handleError(res, error, "获取目录列表失败", next); + sendError(res, { message: (error as Error).message || "获取目录列表失败" }); } }, async saveFile(req: Request, res: Response, next: NextFunction) { try { const { shareCode, receiveCode, fileId, folderId } = req.body; + await setCookie(req); const result = await cloud115.saveSharedFile({ shareCode, receiveCode, fileId, cid: folderId, }); - handleResponse(res, result, true); + sendSuccess(res, result); } catch (error) { - handleError(res, error, "保存文件失败", next); + sendError(res, { message: (error as Error).message || "保存文件失败" }); } }, }; + +export const Cloud115ServiceInstance = cloud115; diff --git a/backend/src/controllers/douban.ts b/backend/src/controllers/douban.ts new file mode 100644 index 0000000..2af3246 --- /dev/null +++ b/backend/src/controllers/douban.ts @@ -0,0 +1,22 @@ +import { Request, Response, NextFunction } from "express"; +import DoubanService from "../services/DoubanService"; +import { sendSuccess, sendError } from "../utils/response"; + +const doubanService = new DoubanService(); + +export const doubanController = { + async getDoubanHotList(req: Request, res: Response, next: NextFunction) { + try { + const { type = "movie", tag = "热门", page_limit = "50", page_start = "0" } = req.query; + const result = await doubanService.getHotList({ + type: type as string, + tag: tag as string, + page_limit: page_limit as string, + page_start: page_start as string, + }); + sendSuccess(res, result); + } catch (error) { + sendError(res, { message: "获取热门列表失败" }); + } + }, +}; diff --git a/backend/src/controllers/quark.ts b/backend/src/controllers/quark.ts index 385da4a..631e88f 100644 --- a/backend/src/controllers/quark.ts +++ b/backend/src/controllers/quark.ts @@ -1,40 +1,52 @@ import { Request, Response, NextFunction } from "express"; import { QuarkService } from "../services/QuarkService"; -import { config } from "../config"; -import { handleResponse } from "../utils/responseHandler"; -import handleError from "../utils/handleError"; +import { sendSuccess, sendError } from "../utils/response"; +import UserSetting from "../models/UserSetting"; -const { cookie } = config.quark; +const quark = new QuarkService(); -const quark = new QuarkService(cookie); +const setCookie = async (req: Request) => { + const userId = req.user?.userId; + const userSetting = await UserSetting.findOne({ + where: { userId }, + }); + if (userSetting && userSetting.dataValues.quarkCookie) { + quark.setCookie(userSetting.dataValues.quarkCookie); + } else { + throw new Error("请先设置夸克网盘cookie"); + } +}; export const quarkController = { async getShareInfo(req: Request, res: Response, next: NextFunction) { try { const { pwdId, passcode } = req.query; + await setCookie(req); const result = await quark.getShareInfo(pwdId as string, passcode as string); - handleResponse(res, result, true); + sendSuccess(res, result); } catch (error) { - handleError(res, error, "获取分享信息失败", next); + sendError(res, { message: "获取分享信息失败" }); } }, async getFolderList(req: Request, res: Response, next: NextFunction) { try { const { parentCid } = req.query; + await setCookie(req); const result = await quark.getFolderList(parentCid as string); - handleResponse(res, result, true); + sendSuccess(res, result); } catch (error) { - handleError(res, error, "获取目录列表失败", next); + sendError(res, { message: (error as Error).message || "获取目录列表失败" }); } }, async saveFile(req: Request, res: Response, next: NextFunction) { try { + await setCookie(req); const result = await quark.saveSharedFile(req.body); - handleResponse(res, result, true); + sendSuccess(res, result); } catch (error) { - handleError(res, error, "保存文件失败", next); + sendError(res, { message: (error as Error).message || "保存文件失败" }); } }, }; diff --git a/backend/src/controllers/resource.ts b/backend/src/controllers/resource.ts index 2191d8c..f07dbbd 100644 --- a/backend/src/controllers/resource.ts +++ b/backend/src/controllers/resource.ts @@ -1,8 +1,7 @@ import { Request, Response, NextFunction } from "express"; import { RSSSearcher } from "../services/RSSSearcher"; -import { Searcher } from "../services/Searcher"; -import { handleResponse } from "../utils/responseHandler"; -import handleError from "../utils/handleError"; +import Searcher from "../services/Searcher"; +import { sendSuccess, sendError } from "../utils/response"; export const resourceController = { async rssSearch(req: Request, res: Response, next: NextFunction) { @@ -10,23 +9,26 @@ export const resourceController = { const { keyword } = req.query; const searcher = new RSSSearcher(); const result = await searcher.searchAll(keyword as string); - handleResponse(res, result, true); + sendSuccess(res, result); } catch (error) { - handleError(res, error, "获取资源发生未知错误", next); + sendError(res, { + message: (error as Error).message || "RSS 搜索失败", + }); } }, async search(req: Request, res: Response, next: NextFunction) { try { const { keyword, channelId = "", lastMessageId = "" } = req.query; // Remove `: string` from here - const searcher = new Searcher(); - const result = await searcher.searchAll( + const result = await Searcher.searchAll( keyword as string, channelId as string, lastMessageId as string ); - handleResponse(res, result, true); + sendSuccess(res, result); } catch (error) { - handleError(res, error, "获取资源发生未知错误", next); + sendError(res, { + message: (error as Error).message || "搜索资源失败", + }); } }, }; diff --git a/backend/src/controllers/setting.ts b/backend/src/controllers/setting.ts new file mode 100644 index 0000000..3931810 --- /dev/null +++ b/backend/src/controllers/setting.ts @@ -0,0 +1,57 @@ +import { Request, Response, NextFunction } from "express"; +import { sendSuccess, sendError } from "../utils/response"; +import Searcher from "../services/Searcher"; +import UserSetting from "../models/UserSetting"; +import GlobalSetting from "../models/GlobalSetting"; + +export const settingController = { + async get(req: Request, res: Response) { + try { + const userId = req.user?.userId; + const role = req.user?.role; + if (userId !== null) { + let userSettings = await UserSetting.findOne({ where: { userId } }); + if (!userSettings) { + userSettings = { + userId: userId, + cloud115Cookie: "", + quarkCookie: "", + } as UserSetting; + if (userSettings) { + await UserSetting.create(userSettings); + } + } + const globalSetting = await GlobalSetting.findOne(); + sendSuccess(res, { + data: { + userSettings, + globalSetting: role === 1 ? globalSetting : null, + }, + }); + } else { + sendError(res, { message: "用户ID无效" }); + } + } catch (error) { + console.log("获取设置失败:" + error); + sendError(res, { message: (error as Error).message || "获取设置失败" }); + } + }, + async save(req: Request, res: Response) { + try { + const userId = req.user?.userId; + const role = req.user?.role; + if (userId !== null) { + const { userSettings, globalSetting } = req.body; + await UserSetting.update(userSettings, { where: { userId } }); + if (role === 1 && globalSetting) await GlobalSetting.update(globalSetting, { where: {} }); + Searcher.updateAxiosInstance(); + sendSuccess(res, { + message: "保存成功", + }); + } + } catch (error) { + console.log("保存设置失败:" + error); + sendError(res, { message: (error as Error).message || "保存设置失败" }); + } + }, +}; diff --git a/backend/src/controllers/teleImages.ts b/backend/src/controllers/teleImages.ts new file mode 100644 index 0000000..c1eccf2 --- /dev/null +++ b/backend/src/controllers/teleImages.ts @@ -0,0 +1,57 @@ +import axios, { AxiosInstance } from "axios"; +import { Request, Response } from "express"; +import tunnel from "tunnel"; +import GlobalSetting from "../models/GlobalSetting"; +import { GlobalSettingAttributes } from "../models/GlobalSetting"; + +export class ImageControll { + private axiosInstance: AxiosInstance | null = null; + private isUpdate = false; + + constructor() { + this.initializeAxiosInstance(); + } + + private async initializeAxiosInstance(isUpdate = false) { + let settings = null; + if (isUpdate) { + settings = await GlobalSetting.findOne(); + this.isUpdate = isUpdate; + } else { + return; + } + const globalSetting = settings?.dataValues || ({} as GlobalSettingAttributes); + this.axiosInstance = axios.create({ + timeout: 3000, + httpsAgent: tunnel.httpsOverHttp({ + proxy: { + host: globalSetting.httpProxyHost, + port: globalSetting.httpProxyPort, + headers: { + "Proxy-Authorization": "", + }, + }, + }), + withCredentials: true, + }); + } + async getImages(req: Request, res: Response, url: string) { + try { + if (!this.isUpdate) await this.initializeAxiosInstance(true); + const response = await this.axiosInstance?.get(url, { responseType: "stream" }); + res.set("Content-Type", response?.headers["content-type"]); + response?.data.pipe(res); + } catch (error) { + res.status(500).send("Image fetch error"); + } + } +} + +const iamgesInstance = new ImageControll(); + +export const imageControll = { + getImages: async (req: Request, res: Response) => { + const url = req.query.url as string; + iamgesInstance.getImages(req, res, url); + }, +}; diff --git a/backend/src/controllers/user.ts b/backend/src/controllers/user.ts new file mode 100644 index 0000000..9340910 --- /dev/null +++ b/backend/src/controllers/user.ts @@ -0,0 +1,62 @@ +import { Request, Response } from "express"; +import bcrypt from "bcrypt"; +import jwt from "jsonwebtoken"; +import GlobalSetting from "../models/GlobalSetting"; +import User from "../models/User"; +import { config } from "../config"; +import { sendSuccess, sendError } from "../utils/response"; + +const isValidInput = (input: string): boolean => { + // 检查是否包含空格或汉字 + const regex = /^[^\s\u4e00-\u9fa5]+$/; + return regex.test(input); +}; +export const userController = { + async register(req: Request, res: Response) { + const { username, password, registerCode } = req.body; + const globalSetting = await GlobalSetting.findOne(); + const registerCodeList = [ + globalSetting?.dataValues.CommonUserCode, + globalSetting?.dataValues.AdminUserCode, + ]; + if (!registerCode || !registerCodeList.includes(Number(registerCode))) { + return sendError(res, { message: "注册码错误" }); + } + // 验证输入 + if (!isValidInput(username) || !isValidInput(password)) { + return sendError(res, { message: "用户名、密码或注册码不能包含空格或汉字" }); + } + // 检查用户名是否已存在 + const existingUser = await User.findOne({ where: { username } }); + if (existingUser) { + return sendError(res, { message: "用户名已存在" }); + } + const hashedPassword = await bcrypt.hash(password, 10); + try { + const role = registerCodeList.findIndex((x) => x === Number(registerCode)); + const user = await User.create({ username, password: hashedPassword, role }); + sendSuccess(res, { + data: user, + message: "用户注册成功", + }); + } catch (error: any) { + sendError(res, { message: error.message || "用户注册失败" }); + } + }, + + async login(req: Request, res: Response) { + const { username, password } = req.body; + const user = await User.findOne({ where: { username } }); + if (!user || !(await bcrypt.compare(password, user.password))) { + return sendError(res, { message: "用户名或密码错误" }); + } + const token = jwt.sign({ userId: user.userId, role: user.role }, config.jwtSecret, { + expiresIn: "6h", + }); + sendSuccess(res, { + data: { + token, + }, + }); + }, +}; diff --git a/backend/src/middleware/auth.ts b/backend/src/middleware/auth.ts new file mode 100644 index 0000000..ffbd8f3 --- /dev/null +++ b/backend/src/middleware/auth.ts @@ -0,0 +1,43 @@ +// filepath: /D:/code/CloudDiskDown/backend/src/middleware/auth.ts +import { Request, Response, NextFunction } from "express"; +import jwt, { JwtPayload } from "jsonwebtoken"; +import User from "../models/User"; +import { config } from "../config"; + +interface AuthenticatedRequest extends Request { + user?: { + userId: string; + role: number; + }; +} + +export const authMiddleware = async ( + req: AuthenticatedRequest, + res: Response, + next: NextFunction +) => { + if (req.path === "/user/login" || req.path === "/user/register") { + return next(); + } + + const token = req.headers.authorization?.split(" ")[1]; + if (!token) { + return res.status(401).json({ message: "未提供 token" }); + } + + try { + const decoded = jwt.verify(token, config.jwtSecret) as JwtPayload; + + req.user = { + userId: decoded.userId, + role: decoded.role, + }; + const user = await User.findOne({ where: { userId: decoded.userId } }); + if (!user) { + return res.status(401).json({ message: "无效的 token" }); + } + next(); + } catch (error) { + res.status(401).json({ message: "无效的 token" }); + } +}; diff --git a/backend/src/models/GlobalSetting.ts b/backend/src/models/GlobalSetting.ts new file mode 100644 index 0000000..ffd1cfa --- /dev/null +++ b/backend/src/models/GlobalSetting.ts @@ -0,0 +1,67 @@ +import { DataTypes, Model, Optional } from "sequelize"; +import sequelize from "../config/database"; + +export interface GlobalSettingAttributes { + id: number; + httpProxyHost: string; + httpProxyPort: number; + isProxyEnabled: boolean; + CommonUserCode: number; + AdminUserCode: number; +} + +interface GlobalSettingCreationAttributes extends Optional {} + +class GlobalSetting + extends Model + implements GlobalSettingAttributes +{ + public id!: number; + public httpProxyHost!: string; + public httpProxyPort!: number; + public isProxyEnabled!: boolean; + public CommonUserCode!: number; + public AdminUserCode!: number; +} + +GlobalSetting.init( + { + id: { + type: DataTypes.INTEGER, + autoIncrement: true, + primaryKey: true, + }, + httpProxyHost: { + type: DataTypes.STRING, + allowNull: false, + defaultValue: "127.0.0.1", + }, + httpProxyPort: { + type: DataTypes.INTEGER, + allowNull: false, + defaultValue: 7890, + }, + isProxyEnabled: { + type: DataTypes.BOOLEAN, + allowNull: false, + defaultValue: true, + }, + CommonUserCode: { + type: DataTypes.INTEGER, + allowNull: true, + defaultValue: 9527, + }, + AdminUserCode: { + type: DataTypes.INTEGER, + allowNull: false, + defaultValue: 230713, + }, + }, + { + sequelize, + modelName: "GlobalSetting", + tableName: "global_settings", + } +); + +export default GlobalSetting; diff --git a/backend/src/models/User.ts b/backend/src/models/User.ts new file mode 100644 index 0000000..d34678b --- /dev/null +++ b/backend/src/models/User.ts @@ -0,0 +1,62 @@ +import { DataTypes, Model, Optional } from "sequelize"; +import sequelize from "../config/database"; + +interface UserAttributes { + id: number; + userId?: number; + username: string; + password: string; + role: number; // 修改为数字类型 +} + +interface UserCreationAttributes extends Optional {} + +class User extends Model implements UserAttributes { + public id!: number; + public userId!: number; + public username!: string; + public password!: string; + public role!: number; // 实现数字类型的角色属性 +} + +User.init( + { + id: { + type: DataTypes.INTEGER, + autoIncrement: true, + primaryKey: true, + allowNull: false, // 显式设置为不可为空 + }, + userId: { + type: DataTypes.UUID, // 对外暴露的不可预测ID + defaultValue: DataTypes.UUIDV4, + unique: true, + allowNull: false, // 显式设置为不可为空 + }, + username: { + type: DataTypes.STRING, + allowNull: false, + unique: true, + }, + password: { + type: DataTypes.STRING, + allowNull: false, + }, + role: { + type: DataTypes.INTEGER, // 修改为数字类型 + allowNull: false, + defaultValue: 0, // 默认值为普通用户 + }, + }, + { + sequelize, + modelName: "User", + tableName: "users", + } +); + +// 角色映射 +// 0: 普通用户 +// 1: 管理员 + +export default User; diff --git a/backend/src/models/UserSetting.ts b/backend/src/models/UserSetting.ts new file mode 100644 index 0000000..88e8912 --- /dev/null +++ b/backend/src/models/UserSetting.ts @@ -0,0 +1,72 @@ +import { DataTypes, Model, Optional } from "sequelize"; +import sequelize from "../config/database"; +import User from "./User"; + +interface UserSettingAttributes { + id: number; + userId: string; + cloud115UserId?: string; + cloud115Cookie: string; + quarkCookie: string; +} + +interface UserSettingCreationAttributes extends Optional {} + +class UserSetting + extends Model + implements UserSettingAttributes +{ + public id!: number; + public userId!: string; + public cloud115UserId?: string; + public cloud115Cookie!: string; + public quarkCookie!: string; +} + +UserSetting.init( + { + id: { + type: DataTypes.INTEGER, + autoIncrement: true, + primaryKey: true, + }, + userId: { + type: DataTypes.UUID, + allowNull: false, + unique: true, + references: { + model: User, + key: "userId", + }, + onDelete: "CASCADE", + }, + cloud115UserId: { + type: DataTypes.STRING, + allowNull: true, + }, + cloud115Cookie: { + type: DataTypes.STRING, + allowNull: true, + }, + quarkCookie: { + type: DataTypes.STRING, + allowNull: true, + }, + }, + { + sequelize, + modelName: "UserSetting", + tableName: "user_settings", + } +); + +User.hasOne(UserSetting, { + foreignKey: "userId", + as: "settings", +}); +UserSetting.belongsTo(User, { + foreignKey: "userId", + as: "user", +}); + +export default UserSetting; diff --git a/backend/src/routes/api.ts b/backend/src/routes/api.ts index 986c22b..a8c5aa1 100644 --- a/backend/src/routes/api.ts +++ b/backend/src/routes/api.ts @@ -2,9 +2,21 @@ import express from "express"; import { cloud115Controller } from "../controllers/cloud115"; import { quarkController } from "../controllers/quark"; import { resourceController } from "../controllers/resource"; +import { doubanController } from "../controllers/douban"; +import { imageControll } from "../controllers/teleImages"; +import settingRoutes from "./setting"; +import userRoutes from "./user"; const router = express.Router(); +// 用户相关路由 +router.use("/user", userRoutes); + +router.use("/tele-images", imageControll.getImages); + +// 设置相关路由 +router.use("/setting", settingRoutes); + // 资源搜索 router.get("/search", resourceController.search); router.get("/rssSearch", resourceController.rssSearch); @@ -19,4 +31,7 @@ router.get("/quark/share-info", quarkController.getShareInfo); router.get("/quark/folders", quarkController.getFolderList); router.post("/quark/save", quarkController.saveFile); +// 获取豆瓣热门列表 +router.get("/douban/hot", doubanController.getDoubanHotList); + export default router; diff --git a/backend/src/routes/setting.ts b/backend/src/routes/setting.ts new file mode 100644 index 0000000..474c116 --- /dev/null +++ b/backend/src/routes/setting.ts @@ -0,0 +1,9 @@ +import express from "express"; +import { settingController } from "../controllers/setting"; + +const router = express.Router(); + +router.get("/get", settingController.get); +router.post("/save", settingController.save); + +export default router; diff --git a/backend/src/routes/user.ts b/backend/src/routes/user.ts new file mode 100644 index 0000000..8d49002 --- /dev/null +++ b/backend/src/routes/user.ts @@ -0,0 +1,10 @@ +// backend/src/routes/user.ts +import express from "express"; +import { userController } from "../controllers/user"; + +const router = express.Router(); + +router.post("/register", userController.register); +router.post("/login", userController.login); + +export default router; \ No newline at end of file diff --git a/backend/src/services/Cloud115Service.ts b/backend/src/services/Cloud115Service.ts index d6bd485..7b19968 100644 --- a/backend/src/services/Cloud115Service.ts +++ b/backend/src/services/Cloud115Service.ts @@ -6,12 +6,9 @@ import { ShareInfoResponse } from "../types/cloud115"; export class Cloud115Service { private api: AxiosInstance; + private cookie: string = ""; - constructor(cookie: string) { - if (!cookie) { - throw new Error("115网盘需要提供cookie进行身份验证"); - } - + constructor(cookie?: string) { this.api = createAxiosInstance( "https://webapi.115.com", AxiosHeaders.from({ @@ -29,91 +26,77 @@ export class Cloud115Service { Referer: "https://servicewechat.com/wx2c744c010a61b0fa/94/page-frame.html", "Accept-Encoding": "gzip, deflate, br", "Accept-Language": "zh-CN,zh;q=0.9", - cookie: cookie, }) ); + if (cookie) { + this.setCookie(cookie); + } else { + console.log("请注意:115网盘需要提供cookie进行身份验证"); + } + this.api.interceptors.request.use((config) => { + config.headers.cookie = cookie || this.cookie; + return config; + }); + } + + public setCookie(cookie: string) { + this.cookie = cookie; } async getShareInfo(shareCode: string, receiveCode = ""): Promise { - try { - const response = await this.api.get("/share/snap", { - params: { - share_code: shareCode, - receive_code: receiveCode, - offset: 0, - limit: 20, - cid: "", - }, - }); - - if (response.data?.state && response.data.data?.list?.length > 0) { - return { - success: true, - data: { - list: response.data.data.list.map((item: any) => ({ - fileId: item.cid, - fileName: item.n, - fileSize: item.s, - })), - }, - }; - } + const response = await this.api.get("/share/snap", { + params: { + share_code: shareCode, + receive_code: receiveCode, + offset: 0, + limit: 20, + cid: "", + }, + }); + if (response.data?.state && response.data.data?.list?.length > 0) { return { - success: false, - error: "未找到文件信息", - }; - } catch (error) { - return { - success: false, - error: error instanceof Error ? error.message : "未知错误", + data: response.data.data.list.map((item: any) => ({ + fileId: item.cid, + fileName: item.n, + fileSize: item.s, + })), }; } + throw new Error("未找到文件信息"); } async getFolderList(parentCid = "0") { - try { - const response = await this.api.get("/files", { - params: { - aid: 1, - cid: parentCid, - o: "user_ptime", - asc: 0, - offset: 0, - show_dir: 1, - limit: 50, - type: 0, - format: "json", - star: 0, - suffix: "", - natsort: 1, - }, - }); + const response = await this.api.get("/files", { + params: { + aid: 1, + cid: parentCid, + o: "user_ptime", + asc: 0, + offset: 0, + show_dir: 1, + limit: 50, + type: 0, + format: "json", + star: 0, + suffix: "", + natsort: 1, + }, + }); - if (response.data?.state) { - return { - success: true, - data: response.data.data - .filter((item: any) => item.cid) - .map((folder: any) => ({ - cid: folder.cid, - name: folder.n, - path: response.data.path, - })), - }; - } else { - Logger.error("获取目录列表失败:", response.data.error); - return { - success: false, - error: "获取115pan目录列表失败:" + response.data.error, - }; - } - } catch (error) { - Logger.error("获取目录列表失败:", error); + if (response.data?.state) { return { - success: false, - error: "获取115pan目录列表失败", + data: response.data.data + .filter((item: any) => item.cid && !!item.ns) + .map((folder: any) => ({ + cid: folder.cid, + name: folder.n, + path: response.data.path, + })), }; + } else { + Logger.error("获取目录列表失败:", response.data.error); + throw new Error("获取115pan目录列表失败:" + response.data.error); } } @@ -123,26 +106,23 @@ export class Cloud115Service { receiveCode: string; fileId: string; }) { - try { - const param = new URLSearchParams({ - cid: params.cid, - user_id: config.cloud115.userId, - share_code: params.shareCode, - receive_code: params.receiveCode, - file_id: params.fileId, - }); - const response = await this.api.post("/share/receive", param.toString()); - + const param = new URLSearchParams({ + cid: params.cid, + user_id: config.cloud115.userId, + share_code: params.shareCode, + receive_code: params.receiveCode, + file_id: params.fileId, + }); + const response = await this.api.post("/share/receive", param.toString()); + Logger.info("保存文件:", response.data); + if (response.data.state) { return { - success: response.data.state, - error: response.data.error, - data: response.data, - }; - } catch (error) { - return { - success: false, - error: error instanceof Error ? error.message : "未知错误", + message: response.data.error, + data: response.data.data, }; + } else { + Logger.error("保存文件失败:", response.data.error); + throw new Error("保存115pan文件失败:" + response.data.error); } } } diff --git a/backend/src/services/DoubanService.ts b/backend/src/services/DoubanService.ts new file mode 100644 index 0000000..a6f54ce --- /dev/null +++ b/backend/src/services/DoubanService.ts @@ -0,0 +1,52 @@ +import { AxiosHeaders, AxiosInstance } from "axios"; +import { createAxiosInstance } from "../utils/axiosInstance"; + +class DoubanService { + private baseUrl: string; + private api: AxiosInstance; + + constructor() { + this.baseUrl = "https://movie.douban.com/j"; + this.api = createAxiosInstance( + this.baseUrl, + AxiosHeaders.from({ + accept: "*/*", + "accept-language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6", + priority: "u=1, i", + "sec-ch-ua": '"Not A(Brand";v="8", "Chromium";v="132", "Microsoft Edge";v="132"', + "sec-ch-ua-mobile": "?0", + "sec-ch-ua-platform": '"Windows"', + "sec-fetch-dest": "empty", + "sec-fetch-mode": "cors", + "sec-fetch-site": "same-origin", + "x-requested-with": "XMLHttpRequest", + cookie: + 'll="118282"; bid=StA6AQFsAWQ; _pk_id.100001.4cf6=6448be57b1b5ca7e.1723172321.; _vwo_uuid_v2=DC15B8183560FF1E538FFE1D480723310|c08e2d213ecb5510005f90a6ff332121; __utmv=30149280.6282; _vwo_uuid_v2=DC15B8183560FF1E538FFE1D480723310|c08e2d213ecb5510005f90a6ff332121; __utmz=30149280.1731915179.21.6.utmcsr=search.douban.com|utmccn=(referral)|utmcmd=referral|utmcct=/movie/subject_search; __utmz=223695111.1731915179.21.6.utmcsr=search.douban.com|utmccn=(referral)|utmcmd=referral|utmcct=/movie/subject_search; douban-fav-remind=1; __utmc=30149280; __utmc=223695111; _pk_ref.100001.4cf6=%5B%22%22%2C%22%22%2C1739176523%2C%22https%3A%2F%2Fsearch.douban.com%2Fmovie%2Fsubject_search%3Fsearch_text%3D%E8%84%91%E6%B4%9E%E5%A4%A7%E5%BC%80%26cat%3D1002%22%5D; _pk_ses.100001.4cf6=1; ap_v=0,6.0; __utma=30149280.859303574.1723448979.1739167503.1739176523.42; __utmb=30149280.0.10.1739176523; __utma=223695111.1882744177.1723448979.1739167503.1739176523.42; __utmb=223695111.0.10.1739176523', + Referer: "https://movie.douban.com/", + "Referrer-Policy": "unsafe-url", + }) + ); + } + + async getHotList(params: { type: string; tag: string; page_limit: string; page_start: string }) { + try { + const response = await this.api.get("/search_subjects", { + params: params, + }); + if (response.data && response.data.subjects) { + return { + data: response.data.subjects, + }; + } else { + return { + data: [], + }; + } + } catch (error) { + console.error("Error fetching hot list:", error); + throw error; + } + } +} + +export default DoubanService; diff --git a/backend/src/services/QuarkService.ts b/backend/src/services/QuarkService.ts index 152ad1d..e0f7642 100644 --- a/backend/src/services/QuarkService.ts +++ b/backend/src/services/QuarkService.ts @@ -4,16 +4,13 @@ import { createAxiosInstance } from "../utils/axiosInstance"; export class QuarkService { private api: AxiosInstance; + private cookie: string = ""; - constructor(cookie: string) { - if (!cookie) { - throw new Error("115网盘需要提供cookie进行身份验证"); - } - + constructor(cookie?: string) { this.api = createAxiosInstance( "https://drive-h.quark.cn", AxiosHeaders.from({ - cookie: cookie, + cookie: this.cookie, accept: "application/json, text/plain, */*", "accept-language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6", "content-type": "application/json", @@ -26,125 +23,112 @@ export class QuarkService { "sec-fetch-site": "same-site", }) ); + if (cookie) { + this.setCookie(cookie); + } else { + console.log("请注意:夸克网盘需要提供cookie进行身份验证"); + } + this.api.interceptors.request.use((config) => { + config.headers.cookie = cookie || this.cookie; + return config; + }); + } + + public setCookie(cookie: string) { + this.cookie = cookie; } async getShareInfo(pwdId: string, passcode = "") { - try { - const response = await this.api.post( - `/1/clouddrive/share/sharepage/token?pr=ucpro&fr=pc&uc_param_str=&__dt=994&__t=${Date.now()}`, - { - pwd_id: pwdId, - passcode: "", - } - ); - if (response.data?.status === 200 && response.data.data) { - const fileInfo = response.data.data; - if (fileInfo.stoken) { - let res = await this.getShareList(pwdId, fileInfo.stoken); - return { - success: true, - data: res, - }; - } + const response = await this.api.post( + `/1/clouddrive/share/sharepage/token?pr=ucpro&fr=pc&uc_param_str=&__dt=994&__t=${Date.now()}`, + { + pwd_id: pwdId, + passcode, + } + ); + if (response.data?.status === 200 && response.data.data) { + const fileInfo = response.data.data; + if (fileInfo.stoken) { + let res = await this.getShareList(pwdId, fileInfo.stoken); + return { + data: res, + }; } - return { - success: false, - error: "未找到文件信息", - }; - } catch (error) { - return { - success: false, - error: error instanceof Error ? error.message : "未知错误", - }; } + throw new Error("获取夸克分享信息失败"); } async getShareList(pwdId: string, stoken: string) { - try { - const response = await this.api.get("/1/clouddrive/share/sharepage/detail", { - params: { - pr: "ucpro", - fr: "pc", - uc_param_str: "", - pwd_id: pwdId, - stoken: stoken, - pdir_fid: "0", - force: "0", - _page: "1", - _size: "50", - _fetch_banner: "1", - _fetch_share: "1", - _fetch_total: "1", - _sort: "file_type:asc,updated_at:desc", - __dt: "1589", - __t: Date.now(), - }, - }); - if (response.data?.data) { - const list = response.data.data.list - .filter((item: any) => item.fid) - .map((folder: any) => ({ - fileId: folder.fid, - fileName: folder.file_name, - fileIdToken: folder.share_fid_token, - })); - return { - list, - pwdId, - stoken: stoken, - }; - } else { - return { - list: [], - }; - } - } catch (error) { - Logger.error("获取目录列表失败:", error); - return []; + const response = await this.api.get("/1/clouddrive/share/sharepage/detail", { + params: { + pr: "ucpro", + fr: "pc", + uc_param_str: "", + pwd_id: pwdId, + stoken: stoken, + pdir_fid: "0", + force: "0", + _page: "1", + _size: "50", + _fetch_banner: "1", + _fetch_share: "1", + _fetch_total: "1", + _sort: "file_type:asc,updated_at:desc", + __dt: "1589", + __t: Date.now(), + }, + }); + if (response.data?.data) { + const list = response.data.data.list + .filter((item: any) => item.fid) + .map((folder: any) => ({ + fileId: folder.fid, + fileName: folder.file_name, + fileIdToken: folder.share_fid_token, + })); + return { + list, + pwdId, + stoken: stoken, + }; + } else { + return { + list: [], + }; } } async getFolderList(parentCid = "0") { - try { - const response = await this.api.get("/1/clouddrive/file/sort", { - params: { - pr: "ucpro", - fr: "pc", - uc_param_str: "", - pdir_fid: parentCid, - _page: "1", - _size: "100", - _fetch_total: "false", - _fetch_sub_dirs: "1", - _sort: "", - __dt: "2093126", - __t: Date.now(), - }, - }); - if (response.data?.data && response.data.data.list.length) { - return { - success: true, - data: response.data.data.list - .filter((item: any) => item.fid) - .map((folder: any) => ({ - cid: folder.fid, - name: folder.file_name, - path: [], - })), - }; - } else { - Logger.error("获取目录列表失败:", response.data.error); - return { - success: false, - error: "获取夸克目录列表失败:" + response.data.error, - }; - } - } catch (error) { - Logger.error("获取目录列表失败:", error); + const response = await this.api.get("/1/clouddrive/file/sort", { + params: { + pr: "ucpro", + fr: "pc", + uc_param_str: "", + pdir_fid: parentCid, + _page: "1", + _size: "100", + _fetch_total: "false", + _fetch_sub_dirs: "1", + _sort: "", + __dt: "2093126", + __t: Date.now(), + }, + }); + if (response.data?.data && response.data.data.list.length) { + const data = response.data.data.list + .filter((item: any) => item.fid && item.file_type === 0) + .map((folder: any) => ({ + cid: folder.fid, + name: folder.file_name, + path: [], + })); return { - success: false, - error: "获取夸克目录列表失败", + data, }; + } else { + const message = "获取夸克目录列表失败:" + response.data.error; + Logger.error(message); + throw new Error(message); } } @@ -164,15 +148,11 @@ export class QuarkService { ); return { - success: response.data.code === 0, - error: response.data.message, + message: response.data.message, data: response.data.data, }; } catch (error) { - return { - success: false, - error: error instanceof Error ? error.message : "未知错误", - }; + throw new Error(error instanceof Error ? error.message : "未知错误"); } } } diff --git a/backend/src/services/RSSSearcher.ts b/backend/src/services/RSSSearcher.ts index abaeea6..e9da9d3 100644 --- a/backend/src/services/RSSSearcher.ts +++ b/backend/src/services/RSSSearcher.ts @@ -3,6 +3,7 @@ import { AxiosInstance, AxiosHeaders } from "axios"; import { config } from "../config"; import { Logger } from "../utils/logger"; import { createAxiosInstance } from "../utils/axiosInstance"; +import { data } from "cheerio/dist/commonjs/api/attributes"; interface RSSItem { title?: string; @@ -81,7 +82,10 @@ export class RSSSearcher { } } - return allResults; + return { + data: allResults, + message: "搜索成功", + }; } async searchInRSSFeed(rssUrl: string) { diff --git a/backend/src/services/Searcher.ts b/backend/src/services/Searcher.ts index a303b28..0fd7f9b 100644 --- a/backend/src/services/Searcher.ts +++ b/backend/src/services/Searcher.ts @@ -1,5 +1,7 @@ import { AxiosInstance, AxiosHeaders } from "axios"; import { createAxiosInstance } from "../utils/axiosInstance"; +import GlobalSetting from "../models/GlobalSetting"; +import { GlobalSettingAttributes } from "../models/GlobalSetting"; import * as cheerio from "cheerio"; import { config } from "../config"; import { Logger } from "../utils/logger"; @@ -7,19 +9,30 @@ import { Logger } from "../utils/logger"; interface sourceItem { messageId?: string; title?: string; + completeTitle?: string; link?: string; pubDate?: string; content?: string; description?: string; image?: string; cloudLinks?: string[]; + tags?: string[]; cloudType?: string; } export class Searcher { - private axiosInstance: AxiosInstance; + private axiosInstance: AxiosInstance | null = null; constructor() { + this.initializeAxiosInstance(); + } + + private async initializeAxiosInstance(isUpdate = false) { + let settings = null; + if (isUpdate) { + settings = await GlobalSetting.findOne(); + } + const globalSetting = settings?.dataValues || ({} as GlobalSettingAttributes); this.axiosInstance = createAxiosInstance( config.telegram.baseUrl, AxiosHeaders.from({ @@ -37,9 +50,15 @@ export class Searcher { "sec-fetch-user": "?1", "upgrade-insecure-requests": "1", }), - true + globalSetting?.isProxyEnabled, + globalSetting?.isProxyEnabled + ? { host: globalSetting?.httpProxyHost, port: globalSetting?.httpProxyPort } + : undefined ); } + public async updateAxiosInstance() { + await this.initializeAxiosInstance(true); + } private extractCloudLinks(text: string): { links: string[]; cloudType: string } { const links: string[] = []; @@ -82,22 +101,38 @@ export class Searcher { channelId: channel.id, })); - allResults.push(...channelResults); + allResults.push({ + list: channelResults, + channelInfo: { + ...channel, + channelLogo: results.channelLogo, + }, + id: channel.id, + }); } } catch (error) { Logger.error(`搜索频道 ${channel.name} 失败:`, error); } } - return allResults; + return { + data: allResults, + }; } async searchInWeb(url: string, channelId: string) { try { + if (!this.axiosInstance) { + throw new Error("Axios instance is not initialized"); + } const response = await this.axiosInstance.get(url); const html = response.data; const $ = cheerio.load(html); const items: sourceItem[] = []; + let channelLogo = ""; + $(".tgme_header_link").each((_, element) => { + channelLogo = $(element).find("img").attr("src") || ""; + }); // 遍历每个消息容器 $(".tgme_widget_message_wrap").each((_, element) => { const messageEl = $(element); @@ -109,8 +144,24 @@ export class Searcher { ?.toString() .split("/")[1]; - // 提取标题 (消息截取100长度) - const title = messageEl.find(".js-message_text").text().trim().substring(0, 50) + "..."; + // 提取标题 (第一个
标签前的内容) + const title = + messageEl + .find(".js-message_text") + .html() + ?.split("
")[0] + .replace(/<[^>]+>/g, "") + .replace(/\n/g, "") || ""; + + // 提取描述 (第一个标签前面的内容,不包含标题) + const content = + messageEl + .find(".js-message_text") + .html() + ?.replace(title, "") + .split("/g, "") + .trim() || ""; // 提取链接 (消息中的链接) // const link = messageEl.find('.tgme_widget_message').data('post'); @@ -118,23 +169,24 @@ export class Searcher { // 提取发布时间 const pubDate = messageEl.find("time").attr("datetime"); - // 提取内容 (完整消息文本) - const content = messageEl.find(".js-message_text").text(); - - // 提取描述 (消息文本中"描述:"后的内容) - const description = content.split("描述:")[1]?.split("\n")[0]?.trim(); - // 提取图片 const image = messageEl .find(".tgme_widget_message_photo_wrap") .attr("style") ?.match(/url\('(.+?)'\)/)?.[1]; + const tags: string[] = []; // 提取云盘链接 const links = messageEl .find(".tgme_widget_message_text a") .map((_, el) => $(el).attr("href")) .get(); + messageEl.find(".tgme_widget_message_text a").each((index, element) => { + const tagText = $(element).text(); + if (tagText && tagText.startsWith("#")) { + tags.push(tagText); + } + }); const cloudInfo = this.extractCloudLinks(links.join(" ")); // 添加到数组第一位 items.unshift({ @@ -142,18 +194,21 @@ export class Searcher { title, pubDate, content, - description, image, cloudLinks: cloudInfo.links, cloudType: cloudInfo.cloudType, + tags, }); }); - return { items }; + return { items: items, channelLogo }; } catch (error) { - Logger.error(`RSS源解析错误: ${url}`, error); + Logger.error(`搜索错误: ${url}`, error); return { items: [], + channelLogo: "", }; } } } + +export default new Searcher(); diff --git a/backend/src/types/cloud115.ts b/backend/src/types/cloud115.ts index 35d9748..3ef814f 100644 --- a/backend/src/types/cloud115.ts +++ b/backend/src/types/cloud115.ts @@ -5,9 +5,6 @@ export interface ShareInfo { } export interface ShareInfoResponse { - success: boolean; - data?: { - list: ShareInfo[]; - }; - error?: string; + data?: ShareInfo[]; + message?: string; } diff --git a/backend/src/types/express.ts b/backend/src/types/express.ts new file mode 100644 index 0000000..7f7e104 --- /dev/null +++ b/backend/src/types/express.ts @@ -0,0 +1,10 @@ +import { Request } from "express"; + +declare module "express" { + interface Request { + user?: { + userId: string; + role: number; + }; + } +} diff --git a/backend/src/utils/axiosInstance.ts b/backend/src/utils/axiosInstance.ts index 3dc660a..04b2af4 100644 --- a/backend/src/utils/axiosInstance.ts +++ b/backend/src/utils/axiosInstance.ts @@ -1,20 +1,24 @@ import axios, { AxiosInstance, AxiosRequestHeaders } from "axios"; import tunnel from "tunnel"; import { config } from "../config"; +import GlobalSetting from "../models/GlobalSetting"; + +interface ProxyConfig { + host: string; + port: number; +} export function createAxiosInstance( baseURL: string, headers: AxiosRequestHeaders, - useProxy: boolean = false + useProxy: boolean = false, + proxyConfig?: ProxyConfig ): AxiosInstance { let agent; - - if (useProxy) { + console.log(proxyConfig); + if (useProxy && proxyConfig) { agent = tunnel.httpsOverHttp({ - proxy: { - host: config.httpProxy.host, - port: Number(config.httpProxy.port), - }, + proxy: proxyConfig, }); } diff --git a/backend/src/utils/index.ts b/backend/src/utils/index.ts new file mode 100644 index 0000000..4757619 --- /dev/null +++ b/backend/src/utils/index.ts @@ -0,0 +1,21 @@ +import jwt from "jsonwebtoken"; +import { Request } from "express"; +import { config } from "../config"; + +interface JwtPayload { + userId: string; +} + +export function getUserIdFromToken(req: Request): string | null { + try { + const token = req.headers.authorization?.split(" ")[1]; + if (!token) { + throw new Error("Token not found"); + } + const decoded = jwt.verify(token, config.jwtSecret) as JwtPayload; + return decoded.userId; + } catch (error) { + console.error("Invalid token:", error); + return null; + } +} diff --git a/backend/src/utils/response.ts b/backend/src/utils/response.ts new file mode 100644 index 0000000..acd7bb2 --- /dev/null +++ b/backend/src/utils/response.ts @@ -0,0 +1,17 @@ +import { Response } from "express"; + +interface ResponseData { + code?: number; // 业务状态码 + message?: string; + data?: any; +} + +export const sendSuccess = (res: Response, response: ResponseData, businessCode: number = 0) => { + response.code = businessCode; + res.status(200).json(response); +}; + +export const sendError = (res: Response, response: ResponseData, businessCode: number = 10000) => { + response.code = businessCode; + res.status(200).json(response); +}; diff --git a/backend/tsconfig.json b/backend/tsconfig.json index 3eadd44..dd10083 100644 --- a/backend/tsconfig.json +++ b/backend/tsconfig.json @@ -12,6 +12,7 @@ "moduleResolution": "node", "resolveJsonModule": true, "baseUrl": ".", + "typeRoots": ["./node_modules/@types", "./src/types"], "paths": { "@/*": ["src/*"] } diff --git a/docs/images/20250220115710.jpg b/docs/images/20250220115710.jpg new file mode 100644 index 0000000..ea32acf Binary files /dev/null and b/docs/images/20250220115710.jpg differ diff --git a/docs/images/hotmovie.png b/docs/images/hotmovie.png new file mode 100644 index 0000000..6ad5cb3 Binary files /dev/null and b/docs/images/hotmovie.png differ diff --git a/docs/images/login.png b/docs/images/login.png new file mode 100644 index 0000000..3c13de5 Binary files /dev/null and b/docs/images/login.png differ diff --git a/docs/images/register.png b/docs/images/register.png new file mode 100644 index 0000000..217dd51 Binary files /dev/null and b/docs/images/register.png differ diff --git a/docs/images/save.png b/docs/images/save.png new file mode 100644 index 0000000..cd2fedf Binary files /dev/null and b/docs/images/save.png differ diff --git a/docs/images/search-movie.png b/docs/images/search-movie.png new file mode 100644 index 0000000..bf797dc Binary files /dev/null and b/docs/images/search-movie.png differ diff --git a/docs/images/search.png b/docs/images/search.png new file mode 100644 index 0000000..aaf93d4 Binary files /dev/null and b/docs/images/search.png differ diff --git a/docs/images/setting.png b/docs/images/setting.png new file mode 100644 index 0000000..aea29e5 Binary files /dev/null and b/docs/images/setting.png differ diff --git a/frontend/auto-imports.d.ts b/frontend/auto-imports.d.ts index 1d89ee8..78813d8 100644 --- a/frontend/auto-imports.d.ts +++ b/frontend/auto-imports.d.ts @@ -5,5 +5,5 @@ // Generated by unplugin-auto-import export {} declare global { - + const ElMessage: typeof import('element-plus/es')['ElMessage'] } diff --git a/frontend/components.d.ts b/frontend/components.d.ts index 55a3150..c6f269f 100644 --- a/frontend/components.d.ts +++ b/frontend/components.d.ts @@ -7,22 +7,44 @@ export {} declare module 'vue' { export interface GlobalComponents { - ElAlert: typeof import('element-plus/es')['ElAlert'] + AsideMenu: typeof import('./src/components/AsideMenu.vue')['default'] + DoubanMovie: typeof import('./src/components/Home/DoubanMovie.vue')['default'] + ElAside: typeof import('element-plus/es')['ElAside'] ElBacktop: typeof import('element-plus/es')['ElBacktop'] ElButton: typeof import('element-plus/es')['ElButton'] + ElCard: typeof import('element-plus/es')['ElCard'] + ElCheckbox: (typeof import("element-plus/es"))["ElCheckbox"] + ElCol: typeof import('element-plus/es')['ElCol'] ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider'] + ElContainer: typeof import('element-plus/es')['ElContainer'] ElDialog: typeof import('element-plus/es')['ElDialog'] + ElEmpty: typeof import('element-plus/es')['ElEmpty'] + ElForm: typeof import('element-plus/es')['ElForm'] + ElFormItem: typeof import('element-plus/es')['ElFormItem'] + ElHeader: typeof import('element-plus/es')['ElHeader'] ElIcon: typeof import('element-plus/es')['ElIcon'] ElImage: typeof import('element-plus/es')['ElImage'] ElInput: typeof import('element-plus/es')['ElInput'] + ElInputNumber: typeof import('element-plus/es')['ElInputNumber'] ElLink: typeof import('element-plus/es')['ElLink'] + ElMain: typeof import('element-plus/es')['ElMain'] + ElMenu: typeof import('element-plus/es')['ElMenu'] + ElMenuItem: typeof import('element-plus/es')['ElMenuItem'] + ElMenuItemGroup: typeof import('element-plus/es')['ElMenuItemGroup'] + ElRow: typeof import('element-plus/es')['ElRow'] + ElSubMenu: typeof import('element-plus/es')['ElSubMenu'] ElSwitch: typeof import('element-plus/es')['ElSwitch'] ElTable: typeof import('element-plus/es')['ElTable'] ElTableColumn: typeof import('element-plus/es')['ElTableColumn'] + ElTabPane: typeof import('element-plus/es')['ElTabPane'] + ElTabs: typeof import('element-plus/es')['ElTabs'] ElTag: typeof import('element-plus/es')['ElTag'] + ElTooltip: typeof import('element-plus/es')['ElTooltip'] ElTree: typeof import('element-plus/es')['ElTree'] - FolderSelect: typeof import('./src/components/FolderSelect.vue')['default'] - ResourceList: typeof import('./src/components/ResourceList.vue')['default'] + FolderSelect: typeof import('./src/components/Home/FolderSelect.vue')['default'] + ResourceCard: typeof import('./src/components/Home/ResourceCard.vue')['default'] + ResourceList: typeof import('./src/components/Home/ResourceList.vue')['default'] + ResourceTable: typeof import('./src/components/Home/ResourceTable.vue')['default'] RouterLink: typeof import('vue-router')['RouterLink'] RouterView: typeof import('vue-router')['RouterView'] SearchBar: typeof import('./src/components/SearchBar.vue')['default'] diff --git a/frontend/favicon.ico b/frontend/favicon.ico new file mode 100644 index 0000000..d6fa5ab Binary files /dev/null and b/frontend/favicon.ico differ diff --git a/frontend/index.html b/frontend/index.html index 80f3389..74a7acb 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -3,7 +3,12 @@ - + + + CloudSaver diff --git a/frontend/package.json b/frontend/package.json index de5ba48..7480697 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -20,6 +20,7 @@ "devDependencies": { "@types/node": "^20.11.25", "@vitejs/plugin-vue": "^5.0.4", + "sass": "^1.83.4", "typescript": "^5.4.2", "unplugin-auto-import": "^0.17.5", "unplugin-vue-components": "^0.26.0", diff --git a/frontend/src/App.vue b/frontend/src/App.vue index d10ea02..8de459e 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -5,7 +5,32 @@ diff --git a/frontend/src/api/cloud115.ts b/frontend/src/api/cloud115.ts index 196290e..73c016f 100644 --- a/frontend/src/api/cloud115.ts +++ b/frontend/src/api/cloud115.ts @@ -2,22 +2,22 @@ import request from "@/utils/request"; import type { ShareInfoResponse, Folder, Save115FileParams } from "@/types"; export const cloud115Api = { - async getShareInfo(shareCode: string, receiveCode = ""): Promise { - const { data } = await request.get("/api/cloud115/share-info", { + async getShareInfo(shareCode: string, receiveCode = "") { + const { data } = await request.get("/api/cloud115/share-info", { params: { shareCode, receiveCode }, }); - return data; + return data as ShareInfoResponse; }, - async getFolderList(parentCid = "0"): Promise<{ data: Folder[] }> { - const { data } = await request.get("/api/cloud115/folders", { + async getFolderList(parentCid = "0") { + const res = await request.get("/api/cloud115/folders", { params: { parentCid }, }); - return data; + return res; }, async saveFile(params: Save115FileParams) { - const { data } = await request.post("/api/cloud115/save", params); - return data; + const res = await request.post("/api/cloud115/save", params); + return res; }, }; diff --git a/frontend/src/api/douban.ts b/frontend/src/api/douban.ts new file mode 100644 index 0000000..61e2d5b --- /dev/null +++ b/frontend/src/api/douban.ts @@ -0,0 +1,11 @@ +import request from "@/utils/request"; +import { HotListItem, HotListParams } from "@/types/douban"; + +export const doubanApi = { + async getHotList(params: HotListParams) { + const { data } = await request.get("/api/douban/hot", { + params, + }); + return data; + }, +}; diff --git a/frontend/src/api/quark.ts b/frontend/src/api/quark.ts index 55c84cd..68bebb5 100644 --- a/frontend/src/api/quark.ts +++ b/frontend/src/api/quark.ts @@ -2,22 +2,21 @@ import request from "@/utils/request"; import type { ShareInfoResponse, Folder, SaveQuarkFileParams } from "@/types"; export const quarkApi = { - async getShareInfo(pwdId: string, passcode = ""): Promise { - const { data } = await request.get("/api/quark/share-info", { + async getShareInfo(pwdId: string, passcode = "") { + const { data } = await request.get("/api/quark/share-info", { params: { pwdId, passcode }, }); - return data; + return data as ShareInfoResponse; }, - async getFolderList(parentCid = "0"): Promise<{ data: Folder[] }> { - const { data } = await request.get("/api/quark/folders", { + async getFolderList(parentCid = "0") { + const data = await request.get("/api/quark/folders", { params: { parentCid }, }); return data; }, async saveFile(params: SaveQuarkFileParams) { - const { data } = await request.post("/api/quark/save", params); - return data; + return await request.post("/api/quark/save", params); }, }; diff --git a/frontend/src/api/resource.ts b/frontend/src/api/resource.ts index c2d88b9..e7b3411 100644 --- a/frontend/src/api/resource.ts +++ b/frontend/src/api/resource.ts @@ -2,8 +2,8 @@ import request from "@/utils/request"; import type { Resource } from "@/types/index"; export const resourceApi = { - search(keyword: string, backupPlan: boolean, channelId?: string, lastMessageId?: string) { - return request.get(`/api/${backupPlan ? "rssSearch" : "search"}`, { + search(keyword: string, channelId?: string, lastMessageId?: string) { + return request.get(`/api/search`, { params: { keyword, channelId, lastMessageId }, }); }, diff --git a/frontend/src/api/setting.ts b/frontend/src/api/setting.ts new file mode 100644 index 0000000..ec62940 --- /dev/null +++ b/frontend/src/api/setting.ts @@ -0,0 +1,17 @@ +import request from "@/utils/request"; +import type { GlobalSettingAttributes, UserSettingAttributes } from "@/types"; + +export const settingApi = { + getSetting: () => { + return request.get<{ + userSettings: UserSettingAttributes; + globalSetting: GlobalSettingAttributes; + }>("/api/setting/get"); + }, + saveSetting: (data: { + userSettings: UserSettingAttributes; + globalSetting?: GlobalSettingAttributes | null; + }) => { + return request.post("/api/setting/save", data); + }, +}; diff --git a/frontend/src/api/user.ts b/frontend/src/api/user.ts new file mode 100644 index 0000000..ba63441 --- /dev/null +++ b/frontend/src/api/user.ts @@ -0,0 +1,10 @@ +import request from "@/utils/request"; + +export const userApi = { + login: (data: { username: string; password: string }) => { + return request.post<{ token: string }>("/api/user/login", data); + }, + register: (data: { username: string; password: string }) => { + return request.post<{ token: string }>("/api/user/register", data); + }, +}; diff --git a/frontend/src/assets/images/login-bg.jpg b/frontend/src/assets/images/login-bg.jpg new file mode 100644 index 0000000..a5048e4 Binary files /dev/null and b/frontend/src/assets/images/login-bg.jpg differ diff --git a/frontend/src/assets/images/logo-1.png b/frontend/src/assets/images/logo-1.png new file mode 100644 index 0000000..e1b0f44 Binary files /dev/null and b/frontend/src/assets/images/logo-1.png differ diff --git a/frontend/src/assets/images/logo.png b/frontend/src/assets/images/logo.png new file mode 100644 index 0000000..ce30f59 Binary files /dev/null and b/frontend/src/assets/images/logo.png differ diff --git a/frontend/src/components/AsideMenu.vue b/frontend/src/components/AsideMenu.vue new file mode 100644 index 0000000..92534d7 --- /dev/null +++ b/frontend/src/components/AsideMenu.vue @@ -0,0 +1,155 @@ + + + + diff --git a/frontend/src/components/Home/DoubanMovie.vue b/frontend/src/components/Home/DoubanMovie.vue new file mode 100644 index 0000000..e69de29 diff --git a/frontend/src/components/FolderSelect.vue b/frontend/src/components/Home/FolderSelect.vue similarity index 89% rename from frontend/src/components/FolderSelect.vue rename to frontend/src/components/Home/FolderSelect.vue index de79f0b..339e4aa 100644 --- a/frontend/src/components/FolderSelect.vue +++ b/frontend/src/components/Home/FolderSelect.vue @@ -30,6 +30,7 @@ import { quarkApi } from "@/api/quark"; import type { TreeInstance } from "element-plus"; import type { Folder } from "@/types"; + import { type RequestResult } from "@/types/response"; import { ElMessage } from "element-plus"; const props = defineProps({ @@ -58,13 +59,10 @@ quark: quarkApi, }; - const loadNode = async (node: any, resolve: (data: Folder[]) => void) => { + const loadNode = async (node: any, resolve: (list: Folder[]) => void) => { const api = cloudTypeApiMap[props.cloudType as keyof typeof cloudTypeApiMap]; try { - let res: { - data: Folder[]; - error?: string; - } = { data: [] }; + let res: RequestResult = { code: 0, data: [] as Folder[], message: "" }; if (node.level === 0) { if (api.getFolderList) { // 使用类型保护检查方法是否存在 @@ -76,11 +74,10 @@ res = await api.getFolderList(node.data.cid); } } - if (res.data?.length > 0) { - resolve(res.data); + if (res?.code === 0) { + resolve(res.data.length ? res.data : []); } else { - resolve([]); - throw new Error(res.error); + throw new Error(res.message); } } catch (error) { ElMessage.error(error instanceof Error ? `${error.message}` : "获取目录失败"); diff --git a/frontend/src/components/Home/ResourceCard.vue b/frontend/src/components/Home/ResourceCard.vue new file mode 100644 index 0000000..9b4b4b8 --- /dev/null +++ b/frontend/src/components/Home/ResourceCard.vue @@ -0,0 +1,189 @@ + + + + + diff --git a/frontend/src/components/Home/ResourceTable.vue b/frontend/src/components/Home/ResourceTable.vue new file mode 100644 index 0000000..dee9c03 --- /dev/null +++ b/frontend/src/components/Home/ResourceTable.vue @@ -0,0 +1,197 @@ + + + + + diff --git a/frontend/src/components/ResourceList.vue b/frontend/src/components/ResourceList.vue deleted file mode 100644 index 89ddddf..0000000 --- a/frontend/src/components/ResourceList.vue +++ /dev/null @@ -1,221 +0,0 @@ - - - - - diff --git a/frontend/src/components/SearchBar.vue b/frontend/src/components/SearchBar.vue index 5dee46e..595dafe 100644 --- a/frontend/src/components/SearchBar.vue +++ b/frontend/src/components/SearchBar.vue @@ -1,70 +1,115 @@ - diff --git a/frontend/src/router/index.ts b/frontend/src/router/index.ts index 1c7c85d..5946833 100644 --- a/frontend/src/router/index.ts +++ b/frontend/src/router/index.ts @@ -1,12 +1,35 @@ import { createRouter, createWebHistory } from "vue-router"; import type { RouteRecordRaw } from "vue-router"; -import HomeView from "@/views/HomeView.vue"; +import Login from "@/views/Login.vue"; +import Home from "@/views/Home.vue"; const routes: RouteRecordRaw[] = [ { path: "/", name: "home", - component: HomeView, + component: Home, + children: [ + { + path: "", + name: "resource", + component: () => import("@/views/ResourceList.vue"), + }, + { + path: "/douban", + name: "douban", + component: () => import("@/views/Douban.vue"), + }, + { + path: "/setting", + name: "setting", + component: () => import("@/views/Setting.vue"), + }, + ], + }, + { + path: "/login", + name: "login", + component: Login, }, ]; diff --git a/frontend/src/stores/douban.ts b/frontend/src/stores/douban.ts new file mode 100644 index 0000000..4914ea7 --- /dev/null +++ b/frontend/src/stores/douban.ts @@ -0,0 +1,50 @@ +import { defineStore } from "pinia"; +import { doubanApi } from "@/api/douban"; +import { HotListItem } from "@/types/douban"; +import { ElMessage } from "element-plus"; + +interface StoreType { + hotList: HotListItem[]; + currentParams: CurrentParams; +} + +interface CurrentParams { + type: string; + tag?: string; +} + +export const useDoubanStore = defineStore("douban", { + state: (): StoreType => ({ + hotList: [], + currentParams: { + type: "movie", + tag: "热门", + }, + }), + + actions: { + async getHotList() { + try { + const params = { + type: this.currentParams.type, + tag: this.currentParams.tag || "热门", + page_limit: "20", + page_start: "0", + }; + const result = await doubanApi.getHotList(params); + if (result && result.length > 0) { + this.hotList = result; + } else { + console.log("获取热门列表失败"); + ElMessage.warning("获取热门列表失败"); + } + } catch (error) { + ElMessage.error(error || "获取热门列表失败"); + } + }, + setCurrentParams(currentParams: CurrentParams) { + this.currentParams = currentParams; + this.getHotList(); + }, + }, +}); diff --git a/frontend/src/stores/index.ts b/frontend/src/stores/index.ts new file mode 100644 index 0000000..9d035e3 --- /dev/null +++ b/frontend/src/stores/index.ts @@ -0,0 +1,17 @@ +import { defineStore } from "pinia"; + +interface StoreType { + scrollTop: boolean; +} + +export const useStore = defineStore("global", { + state: (): StoreType => ({ + scrollTop: true, + }), + + actions: { + setScrollTop(top: boolean) { + this.scrollTop = top; + }, + }, +}); diff --git a/frontend/src/stores/resource.ts b/frontend/src/stores/resource.ts index af12f8d..a7ae390 100644 --- a/frontend/src/stores/resource.ts +++ b/frontend/src/stores/resource.ts @@ -2,9 +2,26 @@ import { defineStore } from "pinia"; import { cloud115Api } from "@/api/cloud115"; import { resourceApi } from "@/api/resource"; import { quarkApi } from "@/api/quark"; -import type { Resource, ShareInfoResponse, Save115FileParams, SaveQuarkFileParams } from "@/types"; +import type { + Resource, + ShareInfoResponse, + Save115FileParams, + SaveQuarkFileParams, + ResourceItem, +} from "@/types"; import { ElMessage } from "element-plus"; +interface StorageListObject { + list: Resource[]; + lastUpdateTime?: string; +} + +const lastResource = ( + localStorage.getItem("last_resource_list") + ? JSON.parse(localStorage.getItem("last_resource_list") as string) + : { list: [] } +) as StorageListObject; + // 定义云盘驱动配置类型 interface CloudDriveConfig { name: string; @@ -12,7 +29,7 @@ interface CloudDriveConfig { regex: RegExp; api: { getShareInfo: (parsedCode: any) => Promise; - saveFile: (params: Record) => Promise<{ success: boolean; error?: string }>; + saveFile: (params: Record) => Promise; }; parseShareCode: (match: RegExpMatchArray) => Record; getSaveParams: (shareInfo: ShareInfoResponse, folderId: string) => Record; @@ -23,20 +40,20 @@ export const CLOUD_DRIVES: CloudDriveConfig[] = [ { name: "115网盘", type: "pan115", - regex: /(?:115|anxia)\.com\/s\/([^?]+)(?:\?password=([^#]+))?/, + regex: /(?:115|anxia|115cdn)\.com\/s\/([^?]+)(?:\?password=([^&#]+))?/, api: { getShareInfo: (parsedCode: { shareCode: string; receiveCode: string }) => cloud115Api.getShareInfo(parsedCode.shareCode, parsedCode.receiveCode), - saveFile: (params) => cloud115Api.saveFile(params as Save115FileParams), + saveFile: async (params) => await cloud115Api.saveFile(params as Save115FileParams), }, parseShareCode: (match) => ({ shareCode: match[1], receiveCode: match[2] || "", }), getSaveParams: (shareInfo, folderId) => ({ - shareCode: shareInfo.data.shareCode, - receiveCode: shareInfo.data.receiveCode, - fileId: shareInfo.data.list[0].fileId, + shareCode: shareInfo.shareCode, + receiveCode: shareInfo.receiveCode, + fileId: shareInfo.list[0].fileId, folderId, }), }, @@ -46,15 +63,15 @@ export const CLOUD_DRIVES: CloudDriveConfig[] = [ regex: /pan\.quark\.cn\/s\/([a-zA-Z0-9]+)/, api: { getShareInfo: (parsedCode: { pwdId: string }) => quarkApi.getShareInfo(parsedCode.pwdId), - saveFile: (params) => quarkApi.saveFile(params as SaveQuarkFileParams), + saveFile: async (params) => await quarkApi.saveFile(params as SaveQuarkFileParams), }, parseShareCode: (match) => ({ pwdId: match[1] }), getSaveParams: (shareInfo, folderId) => ({ - fid_list: shareInfo.data.list.map((item) => item.fileId || ""), - fid_token_list: shareInfo.data.list.map((item) => item.fileIdToken || ""), + fid_list: shareInfo.list.map((item) => item.fileId || ""), + fid_token_list: shareInfo.list.map((item) => item.fileIdToken || ""), to_pdir_fid: folderId, - pwd_id: shareInfo.data.pwdId || "", - stoken: shareInfo.data.stoken || "", + pwd_id: shareInfo.pwdId || "", + stoken: shareInfo.stoken || "", pdir_fid: "0", scene: "link", }), @@ -63,7 +80,15 @@ export const CLOUD_DRIVES: CloudDriveConfig[] = [ export const useResourceStore = defineStore("resource", { state: () => ({ - resources: [] as Resource[], + tagColor: { + baiduPan: "primary", + weiyun: "info", + aliyun: "warning", + pan115: "danger", + quark: "success", + }, + resources: lastResource.list, + lastUpdateTime: lastResource.lastUpdateTime || "", selectedResources: [] as Resource[], loading: false, lastKeyWord: "", @@ -72,65 +97,64 @@ export const useResourceStore = defineStore("resource", { actions: { // 搜索资源 - async searchResources( - keyword?: string, - backupPlan = false, - isLoadMore = false, - channelId?: string, - lastMessageId?: string - ): Promise { + async searchResources(keyword?: string, isLoadMore = false, channelId?: string): Promise { this.loading = true; if (!isLoadMore) this.resources = []; try { + let lastMessageId = ""; if (isLoadMore) { + const list = this.resources.find((x) => x.id === channelId)?.list || []; + lastMessageId = list[list.length - 1].messageId || ""; if (!lastMessageId) { ElMessage.error("当次搜索源不支持加载更多"); return; } keyword = this.lastKeyWord; - backupPlan = this.backupPlan; } - const { data } = await resourceApi.search( - keyword || "", - backupPlan, - channelId, - lastMessageId - ); + let { data = [] } = await resourceApi.search(keyword || "", channelId, lastMessageId); + data = data.filter((item) => item.list.length > 0); this.lastKeyWord = keyword || ""; if (isLoadMore) { - this.resources.push( - ...data.filter( - (item) => !this.selectedResources.some((selectedItem) => selectedItem.id === item.id) - ) - ); + const findedIndex = this.resources.findIndex((item) => item.id === data[0]?.id); + if (findedIndex !== -1) { + this.resources[findedIndex].list.push(...data[0].list); + } + if (data.length === 0) { + ElMessage.warning("没有更多了~"); + } } else { - this.resources = data; + this.resources = data.map((item) => ({ ...item, displayList: true })); + if (this.resources.length === 0) { + ElMessage.warning("未搜索到相关资源"); + } } + // 获取当前时间字符串 用于存储到本地 + this.lastUpdateTime = new Date().toLocaleString(); + localStorage.setItem( + "last_resource_list", + JSON.stringify({ list: this.resources, lastUpdateTime: this.lastUpdateTime }) + ); } catch (error) { - this.handleError("搜索失败,请重试", error); + this.handleError("搜索失败,请重试", null); } finally { this.loading = false; } }, // 转存资源 - async saveResource(resource: Resource, folderId: string): Promise { - try { - const savePromises: Promise[] = []; - CLOUD_DRIVES.forEach((drive) => { - if (resource.cloudLinks.some((link) => drive.regex.test(link))) { - savePromises.push(this.saveResourceToDrive(resource, folderId, drive)); - } - }); - await Promise.all(savePromises); - } catch (error) { - this.handleError("转存失败,请重试", error); - } + async saveResource(resource: ResourceItem, folderId: string): Promise { + const savePromises: Promise[] = []; + CLOUD_DRIVES.forEach((drive) => { + if (resource.cloudLinks.some((link) => drive.regex.test(link))) { + savePromises.push(this.saveResourceToDrive(resource, folderId, drive)); + } + }); + await Promise.all(savePromises); }, // 保存资源到网盘 async saveResourceToDrive( - resource: Resource, + resource: ResourceItem, folderId: string, drive: CloudDriveConfig ): Promise { @@ -141,27 +165,28 @@ export const useResourceStore = defineStore("resource", { if (!match) throw new Error("链接解析失败"); const parsedCode = drive.parseShareCode(match); - try { - let shareInfo = await drive.api.getShareInfo(parsedCode); - if (shareInfo?.data) { + + let shareInfo = await drive.api.getShareInfo(parsedCode); + if (shareInfo) { + if (Array.isArray(shareInfo)) { + shareInfo = { + list: shareInfo, + ...parsedCode, + }; + } else { shareInfo = { ...shareInfo, - data: { - ...shareInfo.data, - ...parsedCode, - }, + ...parsedCode, }; } - const params = drive.getSaveParams(shareInfo, folderId); - const result = await drive.api.saveFile(params); + } + const params = drive.getSaveParams(shareInfo, folderId); + const result = await drive.api.saveFile(params); - if (result.success) { - ElMessage.success(`${drive.name} 转存成功`); - } else { - throw new Error(result.error); - } - } catch (error) { - throw new Error(error instanceof Error ? error.message : `${drive.name} 转存失败`); + if (result.code === 0) { + ElMessage.success(`${drive.name} 转存成功`); + } else { + ElMessage.error(result.message); } }, @@ -177,17 +202,33 @@ export const useResourceStore = defineStore("resource", { if (!match) throw new Error("链接解析失败"); const parsedCode = matchedDrive.parseShareCode(match); - const shareInfo = await matchedDrive.api.getShareInfo(parsedCode); + let shareInfo = await matchedDrive.api.getShareInfo(parsedCode); + if (Array.isArray(shareInfo)) { + shareInfo = { + list: shareInfo, + }; + } - if (shareInfo?.data?.list?.length) { + if (shareInfo?.list?.length) { this.resources = [ { - id: "1", - title: shareInfo.data.list.map((item) => item.fileName).join(", "), - cloudLinks: [url], - cloudType: matchedDrive.type, - channel: matchedDrive.name, - pubDate: "", + id: "", + channelInfo: { + name: "自定义搜索", + channelLogo: "", + channelId: "", + }, + displayList: true, + list: [ + { + id: "1", + title: shareInfo.list.map((item) => item.fileName).join(", "), + cloudLinks: [url], + cloudType: matchedDrive.type, + channel: matchedDrive.name, + pubDate: "", + }, + ], }, ]; } else { diff --git a/frontend/src/stores/userSetting.ts b/frontend/src/stores/userSetting.ts new file mode 100644 index 0000000..21b84b5 --- /dev/null +++ b/frontend/src/stores/userSetting.ts @@ -0,0 +1,42 @@ +import { defineStore } from "pinia"; +import type { UserSettingStore } from "@/types/user"; +import { settingApi } from "@/api/setting"; +import { ElMessage } from "element-plus"; + +export const useUserSettingStore = defineStore("user", { + state: (): UserSettingStore => ({ + globalSetting: null, + userSettings: { + cloud115Cookie: "", + quarkCookie: "", + }, + displayStyle: "card", + }), + + actions: { + async getSettings() { + const { data } = await settingApi.getSetting(); + if (data) { + this.globalSetting = data.globalSetting; + this.userSettings = data.userSettings; + } + }, + async saveSettings() { + if (this.userSettings) { + const setting: UserSettingStore = { + userSettings: this.userSettings, + }; + if (this.globalSetting) setting.globalSetting = this.globalSetting; + const res = await settingApi.saveSetting(setting); + if (res) { + this.getSettings(); + ElMessage.success("保存成功"); + } + } + }, + setDisplayStyle(style: "table" | "card") { + this.displayStyle = style; + ElMessage.success(`切换成功,当前为${style}模式`); + }, + }, +}); diff --git a/frontend/src/styles/global.scss b/frontend/src/styles/global.scss new file mode 100644 index 0000000..4e02c80 --- /dev/null +++ b/frontend/src/styles/global.scss @@ -0,0 +1,11 @@ +:root { + --theme-color: #3e3e3e; + --theme-theme: #133ab3; + --theme-background: #fafafa; + --theme-other_background: #ffffff; +} + +input { + border: none; + outline: none; +} \ No newline at end of file diff --git a/frontend/src/types/douban.ts b/frontend/src/types/douban.ts new file mode 100644 index 0000000..5f2a0c2 --- /dev/null +++ b/frontend/src/types/douban.ts @@ -0,0 +1,18 @@ +export interface HotListParams { + type: string; + tag?: string; + page_limit?: string; + page_start?: string; +} +export interface HotListItem { + cover: string; + cover_x: number; + cover_y: number; + episodes_info: string; + id: string; + is_new: boolean; + playable: boolean; + rate: string; + title: string; + url: string; +} diff --git a/frontend/src/types/globals.d.ts b/frontend/src/types/globals.d.ts new file mode 100644 index 0000000..ed17a97 --- /dev/null +++ b/frontend/src/types/globals.d.ts @@ -0,0 +1,15 @@ +declare global { + interface Location { + // 根据你的需求定义 location 的属性和方法 + pathname: string; + search: string; + hash: string; + host: string; + // 其他属性和方法... + } + interface Window { + location: Location; + } +} + +export {}; diff --git a/frontend/src/types/index.ts b/frontend/src/types/index.ts index d1d51b8..4036e59 100644 --- a/frontend/src/types/index.ts +++ b/frontend/src/types/index.ts @@ -1,14 +1,28 @@ -export interface Resource { +export interface ResourceItem { id: string; title: string; channel: string; channelId?: string; + image?: string; cloudLinks: string[]; + tags?: string[]; + content?: string; pubDate: string; cloudType: string; messageId?: string; } +export interface Resource { + list: ResourceItem[]; + displayList?: boolean; + channelInfo: { + channelId: string; + name: string; + channelLogo: string; + }; + id: string; +} + export interface ShareInfo { fileId: string; fileName: string; @@ -17,13 +31,11 @@ export interface ShareInfo { } export interface ShareInfoResponse { - data: { - list: ShareInfo[]; - pwdId?: string; - stoken?: string; - shareCode?: string; - receiveCode?: string; - }; + list: ShareInfo[]; + pwdId?: string; + stoken?: string; + shareCode?: string; + receiveCode?: string; } export interface Folder { @@ -61,3 +73,23 @@ export interface SaveQuarkFileParams { pdir_fid: string; scene: string; } + +export interface TagColor { + baiduPan: string; + weiyun: string; + aliyun: string; + pan115: string; + quark: string; +} + +export interface GlobalSettingAttributes { + httpProxyHost: string; + httpProxyPort: number | string; + isProxyEnabled: boolean; + AdminUserCode: number; + CommonUserCode: number; +} +export interface UserSettingAttributes { + cloud115Cookie: string; + quarkCookie: string; +} diff --git a/frontend/src/types/response.ts b/frontend/src/types/response.ts new file mode 100644 index 0000000..8ecc363 --- /dev/null +++ b/frontend/src/types/response.ts @@ -0,0 +1,15 @@ +export type RequestErrorCode = -1 | 400 | 401 | 402 | 403 | 500 | 501; + +export interface RequestSuccess { + code: 0; + data: T; + message: string; +} + +export interface RequestError { + code: RequestErrorCode; + message: string; + data?: T; +} + +export type RequestResult = RequestSuccess | RequestError; diff --git a/frontend/src/types/user.ts b/frontend/src/types/user.ts new file mode 100644 index 0000000..0e84638 --- /dev/null +++ b/frontend/src/types/user.ts @@ -0,0 +1,6 @@ +import { GlobalSettingAttributes, UserSettingAttributes } from "@/types"; +export interface UserSettingStore { + globalSetting?: GlobalSettingAttributes | null; + userSettings: UserSettingAttributes; + displayStyle?: "table" | "card"; +} diff --git a/frontend/src/utils/request.ts b/frontend/src/utils/request.ts index 615a5e8..eef7c58 100644 --- a/frontend/src/utils/request.ts +++ b/frontend/src/utils/request.ts @@ -1,28 +1,63 @@ import axios, { AxiosResponse } from "axios"; import { ElMessage } from "element-plus"; +import { RequestResult } from "../types/response"; -const request = axios.create({ +const axiosInstance = axios.create({ baseURL: import.meta.env.VITE_API_BASE_URL as string, - timeout: 60000, + timeout: 9000, withCredentials: true, headers: { "Content-Type": "application/json", }, }); -request.interceptors.response.use( - (response: AxiosResponse) => { - const res = response.data; - if (!res.success) { - ElMessage.error(res.error || "请求失败"); - return Promise.reject(new Error(res.error || "请求失败")); +function isLoginAndRedirect(url: string) { + return url.includes("/api/user/login") || url.includes("/api/user/register"); +} + +axiosInstance.interceptors.request.use( + (config) => { + const token = localStorage.getItem("token"); + if (token) { + config.headers.Authorization = `Bearer ${token}`; + } else if (!isLoginAndRedirect(config.url || "")) { + ElMessage.error("请先登录"); + window.location.href = "/login"; } - return res; + return config; }, (error) => { - ElMessage.error(error.message || "网络错误"); return Promise.reject(error); } ); +axiosInstance.interceptors.response.use( + (response: AxiosResponse) => { + const res = response.data; + return res; + }, + (error) => { + if (error.response.status === 401) { + ElMessage.error("登录过期,请重新登录"); + localStorage.removeItem("token"); + window.location.href = "/login"; + return Promise.reject(new Error("登录过期,请重新登录")); + } + ElMessage.error(error.response.statusText); + return Promise.reject(new Error(error.response.statusText)); + } +); + +const request = { + get: ( + url: string, + config?: Record + ): Promise> => { + return axiosInstance.get(url, { ...config }); + }, + post: axiosInstance.post, + put: axiosInstance.put, + delete: axiosInstance.delete, +}; + export default request; diff --git a/frontend/src/views/Douban.vue b/frontend/src/views/Douban.vue new file mode 100644 index 0000000..5172faf --- /dev/null +++ b/frontend/src/views/Douban.vue @@ -0,0 +1,149 @@ + + + + + diff --git a/frontend/src/views/Home.vue b/frontend/src/views/Home.vue new file mode 100644 index 0000000..2eef3ca --- /dev/null +++ b/frontend/src/views/Home.vue @@ -0,0 +1,93 @@ + + + + + diff --git a/frontend/src/views/HomeView.vue b/frontend/src/views/HomeView.vue deleted file mode 100644 index c3ba47d..0000000 --- a/frontend/src/views/HomeView.vue +++ /dev/null @@ -1,32 +0,0 @@ - - - - - diff --git a/frontend/src/views/Login.vue b/frontend/src/views/Login.vue new file mode 100644 index 0000000..5682529 --- /dev/null +++ b/frontend/src/views/Login.vue @@ -0,0 +1,259 @@ + + + + + diff --git a/frontend/src/views/ResourceList.vue b/frontend/src/views/ResourceList.vue new file mode 100644 index 0000000..b4ad348 --- /dev/null +++ b/frontend/src/views/ResourceList.vue @@ -0,0 +1,186 @@ + + + + + diff --git a/frontend/src/views/Setting.vue b/frontend/src/views/Setting.vue new file mode 100644 index 0000000..80b82c4 --- /dev/null +++ b/frontend/src/views/Setting.vue @@ -0,0 +1,162 @@ + + + + + diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json index 4e5ea1b..8c60b26 100644 --- a/frontend/tsconfig.json +++ b/frontend/tsconfig.json @@ -16,6 +16,7 @@ "noUnusedParameters": true, "noFallthroughCasesInSwitch": true, "baseUrl": ".", + "typeRoots": ["./node_modules/@types", "./types"], "paths": { "@/*": ["src/*"] } diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts index 93049d8..e7e446c 100644 --- a/frontend/vite.config.ts +++ b/frontend/vite.config.ts @@ -16,6 +16,13 @@ export default defineConfig({ resolvers: [ElementPlusResolver()], }), ], + css: { + preprocessorOptions: { + scss: { + additionalData: `@use "@/styles/global.scss";`, + }, + }, + }, resolve: { alias: { "@": fileURLToPath(new URL("./src", import.meta.url)), @@ -41,6 +48,10 @@ export default defineConfig({ }); }, }, + "/tele-images": { + target: process.env.VITE_API_BASE_URL_PROXY || "http://127.0.0.1:8009", + changeOrigin: true, + }, }, }, build: { diff --git a/nginx.conf b/nginx.conf new file mode 100644 index 0000000..5247df1 --- /dev/null +++ b/nginx.conf @@ -0,0 +1,35 @@ +# nginx.conf +user nginx; # 定义 Nginx 进程的运行用户 +worker_processes 1; # 设置 Nginx 进程数 + +events { + worker_connections 1024; # 每个 worker 进程最大连接数 +} + +http { + include mime.types; + default_type application/octet-stream; + server { + listen 8008; + server_name localhost; + + location / { + root /usr/share/nginx/html; + try_files $uri $uri/ /index.html; + } + + location /api/ { + rewrite ^/api/(.*)$ /$1 break; + proxy_pass http://localhost:8009; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + location /tele-images/ { + proxy_pass http://localhost:8009; + proxy_set_header Host $host; + } + } +} diff --git a/package.json b/package.json index 0217c86..b8ccecc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cloud-saver", - "version": "0.0.8", + "version": "0.1.0", "private": true, "workspaces": [ "frontend", @@ -22,11 +22,19 @@ }, "devDependencies": { "npm-run-all": "^4.1.5", - "rimraf": "^5.0.5", - "prettier": "^3.2.5" + "prettier": "^3.2.5", + "rimraf": "^5.0.5" }, - "dependencies": {}, "engines": { "pnpm": ">=6.0.0" + }, + "pnpm": { + "onlyBuiltDependencies": [ + "@parcel/watcher", + "bcrypt", + "esbuild", + "sqlite3", + "vue-demi" + ] } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 67480d6..27afdbf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,6 +23,9 @@ importers: axios: specifier: ^1.6.7 version: 1.7.9 + bcrypt: + specifier: ^5.1.1 + version: 5.1.1(encoding@0.1.13) cheerio: specifier: ^1.0.0 version: 1.0.0 @@ -38,16 +41,28 @@ importers: express: specifier: ^4.18.3 version: 4.21.2 + jsonwebtoken: + specifier: ^9.0.2 + version: 9.0.2 rss-parser: specifier: ^3.13.0 version: 3.13.0 + sequelize: + specifier: ^6.37.5 + version: 6.37.5(sqlite3@5.1.7) socket.io: specifier: ^4.8.1 version: 4.8.1 + sqlite3: + specifier: ^5.1.7 + version: 5.1.7 tunnel: specifier: ^0.0.6 version: 0.0.6 devDependencies: + '@types/bcrypt': + specifier: ^5.0.2 + version: 5.0.2 '@types/cookie-parser': specifier: ^1.4.7 version: 1.4.8(@types/express@4.17.21) @@ -57,9 +72,12 @@ importers: '@types/express': specifier: ^4.17.21 version: 4.17.21 + '@types/jsonwebtoken': + specifier: ^9.0.7 + version: 9.0.7 '@types/node': specifier: ^20.11.25 - version: 20.17.10 + version: 20.17.14 '@types/tunnel': specifier: ^0.0.7 version: 0.0.7 @@ -68,56 +86,59 @@ importers: version: 3.1.9 ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@20.17.10)(typescript@5.7.2) + version: 10.9.2(@types/node@20.17.14)(typescript@5.7.3) typescript: specifier: ^5.4.2 - version: 5.7.2 + version: 5.7.3 frontend: dependencies: '@element-plus/icons-vue': specifier: ^2.3.1 - version: 2.3.1(vue@3.5.13(typescript@5.7.2)) + version: 2.3.1(vue@3.5.13(typescript@5.7.3)) axios: specifier: ^1.6.7 version: 1.7.9 element-plus: specifier: ^2.6.1 - version: 2.9.1(vue@3.5.13(typescript@5.7.2)) + version: 2.9.3(vue@3.5.13(typescript@5.7.3)) pinia: specifier: ^2.1.7 - version: 2.3.0(typescript@5.7.2)(vue@3.5.13(typescript@5.7.2)) + version: 2.3.1(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3)) socket.io-client: specifier: ^4.8.1 version: 4.8.1 vue: specifier: ^3.4.21 - version: 3.5.13(typescript@5.7.2) + version: 3.5.13(typescript@5.7.3) vue-router: specifier: ^4.3.0 - version: 4.5.0(vue@3.5.13(typescript@5.7.2)) + version: 4.5.0(vue@3.5.13(typescript@5.7.3)) devDependencies: '@types/node': specifier: ^20.11.25 - version: 20.17.10 + version: 20.17.14 '@vitejs/plugin-vue': specifier: ^5.0.4 - version: 5.2.1(vite@5.4.11(@types/node@20.17.10))(vue@3.5.13(typescript@5.7.2)) + version: 5.2.1(vite@5.4.14(@types/node@20.17.14)(sass@1.83.4))(vue@3.5.13(typescript@5.7.3)) + sass: + specifier: ^1.83.4 + version: 1.83.4 typescript: specifier: ^5.4.2 - version: 5.7.2 + version: 5.7.3 unplugin-auto-import: specifier: ^0.17.5 - version: 0.17.8(@vueuse/core@9.13.0(vue@3.5.13(typescript@5.7.2)))(rollup@4.28.1) + version: 0.17.8(@vueuse/core@9.13.0(vue@3.5.13(typescript@5.7.3)))(rollup@4.31.0) unplugin-vue-components: specifier: ^0.26.0 - version: 0.26.0(@babel/parser@7.26.3)(rollup@4.28.1)(vue@3.5.13(typescript@5.7.2)) + version: 0.26.0(@babel/parser@7.26.5)(rollup@4.31.0)(vue@3.5.13(typescript@5.7.3)) vite: specifier: ^5.1.5 - version: 5.4.11(@types/node@20.17.10) + version: 5.4.14(@types/node@20.17.14)(sass@1.83.4) vue-tsc: specifier: ^2.0.6 - version: 2.1.10(typescript@5.7.2) + version: 2.2.0(typescript@5.7.3) packages: @@ -132,13 +153,13 @@ packages: resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} - '@babel/parser@7.26.3': - resolution: {integrity: sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==} + '@babel/parser@7.26.5': + resolution: {integrity: sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/types@7.26.3': - resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==} + '@babel/types@7.26.5': + resolution: {integrity: sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==} engines: {node: '>=6.9.0'} '@cspotcode/source-map-support@0.8.1': @@ -292,14 +313,17 @@ packages: cpu: [x64] os: [win32] - '@floating-ui/core@1.6.8': - resolution: {integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==} + '@floating-ui/core@1.6.9': + resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==} - '@floating-ui/dom@1.6.12': - resolution: {integrity: sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==} + '@floating-ui/dom@1.6.13': + resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==} - '@floating-ui/utils@0.2.8': - resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==} + '@floating-ui/utils@0.2.9': + resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} + + '@gar/promisify@1.1.3': + resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} @@ -315,6 +339,10 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@mapbox/node-pre-gyp@1.0.11': + resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} + hasBin: true + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -327,6 +355,102 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@npmcli/fs@1.1.1': + resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==} + + '@npmcli/move-file@1.1.2': + resolution: {integrity: sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==} + engines: {node: '>=10'} + deprecated: This functionality has been moved to @npmcli/fs + + '@parcel/watcher-android-arm64@2.5.0': + resolution: {integrity: sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.5.0': + resolution: {integrity: sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.5.0': + resolution: {integrity: sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.5.0': + resolution: {integrity: sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.5.0': + resolution: {integrity: sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-arm-musl@2.5.0': + resolution: {integrity: sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [musl] + + '@parcel/watcher-linux-arm64-glibc@2.5.0': + resolution: {integrity: sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-arm64-musl@2.5.0': + resolution: {integrity: sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@parcel/watcher-linux-x64-glibc@2.5.0': + resolution: {integrity: sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-x64-musl@2.5.0': + resolution: {integrity: sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@parcel/watcher-win32-arm64@2.5.0': + resolution: {integrity: sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-ia32@2.5.0': + resolution: {integrity: sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.5.0': + resolution: {integrity: sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.5.0': + resolution: {integrity: sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==} + engines: {node: '>= 10.0.0'} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -340,108 +464,108 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.28.1': - resolution: {integrity: sha512-2aZp8AES04KI2dy3Ss6/MDjXbwBzj+i0GqKtWXgw2/Ma6E4jJvujryO6gJAghIRVz7Vwr9Gtl/8na3nDUKpraQ==} + '@rollup/rollup-android-arm-eabi@4.31.0': + resolution: {integrity: sha512-9NrR4033uCbUBRgvLcBrJofa2KY9DzxL2UKZ1/4xA/mnTNyhZCWBuD8X3tPm1n4KxcgaraOYgrFKSgwjASfmlA==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.28.1': - resolution: {integrity: sha512-EbkK285O+1YMrg57xVA+Dp0tDBRB93/BZKph9XhMjezf6F4TpYjaUSuPt5J0fZXlSag0LmZAsTmdGGqPp4pQFA==} + '@rollup/rollup-android-arm64@4.31.0': + resolution: {integrity: sha512-iBbODqT86YBFHajxxF8ebj2hwKm1k8PTBQSojSt3d1FFt1gN+xf4CowE47iN0vOSdnd+5ierMHBbu/rHc7nq5g==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.28.1': - resolution: {integrity: sha512-prduvrMKU6NzMq6nxzQw445zXgaDBbMQvmKSJaxpaZ5R1QDM8w+eGxo6Y/jhT/cLoCvnZI42oEqf9KQNYz1fqQ==} + '@rollup/rollup-darwin-arm64@4.31.0': + resolution: {integrity: sha512-WHIZfXgVBX30SWuTMhlHPXTyN20AXrLH4TEeH/D0Bolvx9PjgZnn4H677PlSGvU6MKNsjCQJYczkpvBbrBnG6g==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.28.1': - resolution: {integrity: sha512-WsvbOunsUk0wccO/TV4o7IKgloJ942hVFK1CLatwv6TJspcCZb9umQkPdvB7FihmdxgaKR5JyxDjWpCOp4uZlQ==} + '@rollup/rollup-darwin-x64@4.31.0': + resolution: {integrity: sha512-hrWL7uQacTEF8gdrQAqcDy9xllQ0w0zuL1wk1HV8wKGSGbKPVjVUv/DEwT2+Asabf8Dh/As+IvfdU+H8hhzrQQ==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.28.1': - resolution: {integrity: sha512-HTDPdY1caUcU4qK23FeeGxCdJF64cKkqajU0iBnTVxS8F7H/7BewvYoG+va1KPSL63kQ1PGNyiwKOfReavzvNA==} + '@rollup/rollup-freebsd-arm64@4.31.0': + resolution: {integrity: sha512-S2oCsZ4hJviG1QjPY1h6sVJLBI6ekBeAEssYKad1soRFv3SocsQCzX6cwnk6fID6UQQACTjeIMB+hyYrFacRew==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.28.1': - resolution: {integrity: sha512-m/uYasxkUevcFTeRSM9TeLyPe2QDuqtjkeoTpP9SW0XxUWfcYrGDMkO/m2tTw+4NMAF9P2fU3Mw4ahNvo7QmsQ==} + '@rollup/rollup-freebsd-x64@4.31.0': + resolution: {integrity: sha512-pCANqpynRS4Jirn4IKZH4tnm2+2CqCNLKD7gAdEjzdLGbH1iO0zouHz4mxqg0uEMpO030ejJ0aA6e1PJo2xrPA==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.28.1': - resolution: {integrity: sha512-QAg11ZIt6mcmzpNE6JZBpKfJaKkqTm1A9+y9O+frdZJEuhQxiugM05gnCWiANHj4RmbgeVJpTdmKRmH/a+0QbA==} + '@rollup/rollup-linux-arm-gnueabihf@4.31.0': + resolution: {integrity: sha512-0O8ViX+QcBd3ZmGlcFTnYXZKGbFu09EhgD27tgTdGnkcYXLat4KIsBBQeKLR2xZDCXdIBAlWLkiXE1+rJpCxFw==} cpu: [arm] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm-musleabihf@4.28.1': - resolution: {integrity: sha512-dRP9PEBfolq1dmMcFqbEPSd9VlRuVWEGSmbxVEfiq2cs2jlZAl0YNxFzAQS2OrQmsLBLAATDMb3Z6MFv5vOcXg==} + '@rollup/rollup-linux-arm-musleabihf@4.31.0': + resolution: {integrity: sha512-w5IzG0wTVv7B0/SwDnMYmbr2uERQp999q8FMkKG1I+j8hpPX2BYFjWe69xbhbP6J9h2gId/7ogesl9hwblFwwg==} cpu: [arm] os: [linux] libc: [musl] - '@rollup/rollup-linux-arm64-gnu@4.28.1': - resolution: {integrity: sha512-uGr8khxO+CKT4XU8ZUH1TTEUtlktK6Kgtv0+6bIFSeiSlnGJHG1tSFSjm41uQ9sAO/5ULx9mWOz70jYLyv1QkA==} + '@rollup/rollup-linux-arm64-gnu@4.31.0': + resolution: {integrity: sha512-JyFFshbN5xwy6fulZ8B/8qOqENRmDdEkcIMF0Zz+RsfamEW+Zabl5jAb0IozP/8UKnJ7g2FtZZPEUIAlUSX8cA==} cpu: [arm64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.28.1': - resolution: {integrity: sha512-QF54q8MYGAqMLrX2t7tNpi01nvq5RI59UBNx+3+37zoKX5KViPo/gk2QLhsuqok05sSCRluj0D00LzCwBikb0A==} + '@rollup/rollup-linux-arm64-musl@4.31.0': + resolution: {integrity: sha512-kpQXQ0UPFeMPmPYksiBL9WS/BDiQEjRGMfklVIsA0Sng347H8W2iexch+IEwaR7OVSKtr2ZFxggt11zVIlZ25g==} cpu: [arm64] os: [linux] libc: [musl] - '@rollup/rollup-linux-loongarch64-gnu@4.28.1': - resolution: {integrity: sha512-vPul4uodvWvLhRco2w0GcyZcdyBfpfDRgNKU+p35AWEbJ/HPs1tOUrkSueVbBS0RQHAf/A+nNtDpvw95PeVKOA==} + '@rollup/rollup-linux-loongarch64-gnu@4.31.0': + resolution: {integrity: sha512-pMlxLjt60iQTzt9iBb3jZphFIl55a70wexvo8p+vVFK+7ifTRookdoXX3bOsRdmfD+OKnMozKO6XM4zR0sHRrQ==} cpu: [loong64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-powerpc64le-gnu@4.28.1': - resolution: {integrity: sha512-pTnTdBuC2+pt1Rmm2SV7JWRqzhYpEILML4PKODqLz+C7Ou2apEV52h19CR7es+u04KlqplggmN9sqZlekg3R1A==} + '@rollup/rollup-linux-powerpc64le-gnu@4.31.0': + resolution: {integrity: sha512-D7TXT7I/uKEuWiRkEFbed1UUYZwcJDU4vZQdPTcepK7ecPhzKOYk4Er2YR4uHKme4qDeIh6N3XrLfpuM7vzRWQ==} cpu: [ppc64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-riscv64-gnu@4.28.1': - resolution: {integrity: sha512-vWXy1Nfg7TPBSuAncfInmAI/WZDd5vOklyLJDdIRKABcZWojNDY0NJwruY2AcnCLnRJKSaBgf/GiJfauu8cQZA==} + '@rollup/rollup-linux-riscv64-gnu@4.31.0': + resolution: {integrity: sha512-wal2Tc8O5lMBtoePLBYRKj2CImUCJ4UNGJlLwspx7QApYny7K1cUYlzQ/4IGQBLmm+y0RS7dwc3TDO/pmcneTw==} cpu: [riscv64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-s390x-gnu@4.28.1': - resolution: {integrity: sha512-/yqC2Y53oZjb0yz8PVuGOQQNOTwxcizudunl/tFs1aLvObTclTwZ0JhXF2XcPT/zuaymemCDSuuUPXJJyqeDOg==} + '@rollup/rollup-linux-s390x-gnu@4.31.0': + resolution: {integrity: sha512-O1o5EUI0+RRMkK9wiTVpk2tyzXdXefHtRTIjBbmFREmNMy7pFeYXCFGbhKFwISA3UOExlo5GGUuuj3oMKdK6JQ==} cpu: [s390x] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.28.1': - resolution: {integrity: sha512-fzgeABz7rrAlKYB0y2kSEiURrI0691CSL0+KXwKwhxvj92VULEDQLpBYLHpF49MSiPG4sq5CK3qHMnb9tlCjBw==} + '@rollup/rollup-linux-x64-gnu@4.31.0': + resolution: {integrity: sha512-zSoHl356vKnNxwOWnLd60ixHNPRBglxpv2g7q0Cd3Pmr561gf0HiAcUBRL3S1vPqRC17Zo2CX/9cPkqTIiai1g==} cpu: [x64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-musl@4.28.1': - resolution: {integrity: sha512-xQTDVzSGiMlSshpJCtudbWyRfLaNiVPXt1WgdWTwWz9n0U12cI2ZVtWe/Jgwyv/6wjL7b66uu61Vg0POWVfz4g==} + '@rollup/rollup-linux-x64-musl@4.31.0': + resolution: {integrity: sha512-ypB/HMtcSGhKUQNiFwqgdclWNRrAYDH8iMYH4etw/ZlGwiTVxBz2tDrGRrPlfZu6QjXwtd+C3Zib5pFqID97ZA==} cpu: [x64] os: [linux] libc: [musl] - '@rollup/rollup-win32-arm64-msvc@4.28.1': - resolution: {integrity: sha512-wSXmDRVupJstFP7elGMgv+2HqXelQhuNf+IS4V+nUpNVi/GUiBgDmfwD0UGN3pcAnWsgKG3I52wMOBnk1VHr/A==} + '@rollup/rollup-win32-arm64-msvc@4.31.0': + resolution: {integrity: sha512-JuhN2xdI/m8Hr+aVO3vspO7OQfUFO6bKLIRTAy0U15vmWjnZDLrEgCZ2s6+scAYaQVpYSh9tZtRijApw9IXyMw==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.28.1': - resolution: {integrity: sha512-ZkyTJ/9vkgrE/Rk9vhMXhf8l9D+eAhbAVbsGsXKy2ohmJaWg0LPQLnIxRdRp/bKyr8tXuPlXhIoGlEB5XpJnGA==} + '@rollup/rollup-win32-ia32-msvc@4.31.0': + resolution: {integrity: sha512-U1xZZXYkvdf5MIWmftU8wrM5PPXzyaY1nGCI4KI4BFfoZxHamsIe+BtnPLIvvPykvQWlVbqUXdLa4aJUuilwLQ==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.28.1': - resolution: {integrity: sha512-ZvK2jBafvttJjoIdKm/Q/Bh7IJ1Ose9IBOwpOXcOvW3ikGTQGmKDgxTC6oCAzW6PynbkKP8+um1du81XJHZ0JA==} + '@rollup/rollup-win32-x64-msvc@4.31.0': + resolution: {integrity: sha512-ul8rnCsUumNln5YWwz0ted2ZHFhzhRRnkpBZ+YRuHoRAlUji9KChpOUOndY7uykrPEPXVbHLlsdo6v5yXo/TXw==} cpu: [x64] os: [win32] @@ -451,6 +575,10 @@ packages: '@sxzz/popperjs-es@2.11.7': resolution: {integrity: sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==} + '@tootallnate/once@1.1.2': + resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} + engines: {node: '>= 6'} + '@tsconfig/node10@1.0.11': resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} @@ -463,6 +591,9 @@ packages: '@tsconfig/node16@1.0.4': resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + '@types/bcrypt@5.0.2': + resolution: {integrity: sha512-6atioO8Y75fNcbmj0G7UjI9lXN2pQ/IGJ2FWT4a/btd0Lk9lQalHLKhkgKVZ3r+spnmWUKfbMi1GEe9wyHQfNQ==} + '@types/body-parser@1.19.5': resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} @@ -480,6 +611,9 @@ packages: '@types/cors@2.8.17': resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==} + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} @@ -492,20 +626,26 @@ packages: '@types/http-errors@2.0.4': resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + '@types/jsonwebtoken@9.0.7': + resolution: {integrity: sha512-ugo316mmTYBl2g81zDFnZ7cfxlut3o+/EQdaP7J8QN2kY6lJ22hmQYCK5EHcJHbrW+dkCGSCPgbG8JtYj6qSrg==} + '@types/lodash-es@4.17.12': resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} - '@types/lodash@4.17.13': - resolution: {integrity: sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==} + '@types/lodash@4.17.14': + resolution: {integrity: sha512-jsxagdikDiDBeIRaPYtArcT8my4tN1og7MtMRquFT3XNA6axxyHDRUemqDz/taRDdOUn0GnGHRCuff4q48sW9A==} '@types/mime@1.3.5': resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - '@types/node@20.17.10': - resolution: {integrity: sha512-/jrvh5h6NXhEauFFexRin69nA0uHJ5gwk4iDivp/DeoEua3uwCUto6PC86IpRITBOs4+6i2I56K5x5b6WYGXHA==} + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/qs@6.9.17': - resolution: {integrity: sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==} + '@types/node@20.17.14': + resolution: {integrity: sha512-w6qdYetNL5KRBiSClK/KWai+2IMEJuAj+EujKCumalFOwXtvOXaEan9AuwcRID2IcOIAWSIfR495hBtgKlx2zg==} + + '@types/qs@6.9.18': + resolution: {integrity: sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==} '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} @@ -519,6 +659,9 @@ packages: '@types/tunnel@0.0.7': resolution: {integrity: sha512-VYKjZSmb2PvUwXoux4Gy4LAk7kzOB1ktkjyL4lxvpkqL2adgR+Qrh/yFyWluvJgIXWFicqs7XuzPI2NbTO/r3Q==} + '@types/validator@13.12.2': + resolution: {integrity: sha512-6SlHBzUW8Jhf3liqrGGXyTJSIFe4nqlJ5A5KaMZ2l/vbM3Wh3KSybots/wfWVzNLK4D1NZluDlSQIbIEPx6oyA==} + '@types/web-bluetooth@0.0.16': resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==} @@ -556,8 +699,8 @@ packages: '@vue/devtools-api@6.6.4': resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} - '@vue/language-core@2.1.10': - resolution: {integrity: sha512-DAI289d0K3AB5TUG3xDp9OuQ71CnrujQwJrQnfuZDwo6eGNf0UoRlPuaVNO+Zrn65PC3j0oB2i7mNmVPggeGeQ==} + '@vue/language-core@2.2.0': + resolution: {integrity: sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw==} peerDependencies: typescript: '*' peerDependenciesMeta: @@ -590,6 +733,9 @@ packages: '@vueuse/shared@9.13.0': resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==} + abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} @@ -603,8 +749,20 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - alien-signals@0.2.2: - resolution: {integrity: sha512-cZIRkbERILsBOXTQmMrxc9hgpxglstn69zm+F1ARf4aPAzdAFYd6sBq87ErO0Fj3DV94tglcyHG5kQz9nDC/8A==} + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + agentkeepalive@4.6.0: + resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} + engines: {node: '>= 8.0.0'} + + aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + + alien-signals@0.4.14: + resolution: {integrity: sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==} ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} @@ -630,11 +788,24 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} + aproba@2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + + are-we-there-yet@2.0.0: + resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} + engines: {node: '>=10'} + deprecated: This package is no longer supported. + + are-we-there-yet@3.0.1: + resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This package is no longer supported. + arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} engines: {node: '>= 0.4'} array-flatten@1.1.1: @@ -660,14 +831,27 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + base64id@2.0.0: resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} engines: {node: ^4.5.0 || >= 5.9} + bcrypt@5.1.1: + resolution: {integrity: sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==} + engines: {node: '>= 10.0.0'} + binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} + bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + body-parser@1.20.3: resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -685,10 +869,20 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} + buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} + cacache@15.3.0: + resolution: {integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==} + engines: {node: '>= 10'} + call-bind-apply-helpers@1.0.1: resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} engines: {node: '>= 0.4'} @@ -716,6 +910,21 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + + clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} @@ -729,6 +938,10 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} @@ -739,6 +952,9 @@ packages: confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + content-disposition@0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} @@ -787,16 +1003,16 @@ packages: csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} engines: {node: '>= 0.4'} - data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} engines: {node: '>= 0.4'} - data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} dayjs@1.11.13: @@ -831,6 +1047,14 @@ packages: supports-color: optional: true + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} @@ -843,6 +1067,9 @@ packages: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} + delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} @@ -851,6 +1078,15 @@ packages: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + + detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} @@ -865,13 +1101,16 @@ packages: resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} engines: {node: '>= 4'} - domutils@3.1.0: - resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + domutils@3.2.2: + resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} dotenv@16.4.7: resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} engines: {node: '>=12'} + dottie@2.0.6: + resolution: {integrity: sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA==} + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -879,11 +1118,14 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + ecdsa-sig-formatter@1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - element-plus@2.9.1: - resolution: {integrity: sha512-9Agqf/jt4Ugk7EZ6C5LME71sgkvauPCsnvJN12Xid2XVobjufxMGpRE4L7pS4luJMOmFAH3J0NgYEGZT5r+NDg==} + element-plus@2.9.3: + resolution: {integrity: sha512-6tSLp5XytDS4TMZ0P3aGZnr7MXTagfNycepNfIDitd9IgwM9y01+Ssu6mglNi8RiXYhek6LBWNOd/cvpIO12+w==} peerDependencies: vue: ^3.2.0 @@ -904,6 +1146,12 @@ packages: encoding-sniffer@0.2.0: resolution: {integrity: sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==} + encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + engine.io-client@6.6.2: resolution: {integrity: sha512-TAr+NKeoVTjEVW8P3iHguO1LO6RlUz9O5Y8o7EY0fU+gY1NYqas7NN3slpFtbXEsLMHk0h90fJMfKjRkQ0qUIw==} @@ -922,11 +1170,18 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - es-abstract@1.23.6: - resolution: {integrity: sha512-Ifco6n3yj2tMZDWNLyloZrytt9lqqlwvS83P3HtaETR0NUOYnIULGGHpktqYGObGy+8wc1okO25p8TjemhImvA==} + es-abstract@1.23.9: + resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} engines: {node: '>= 0.4'} es-define-property@1.0.1: @@ -937,12 +1192,12 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} - es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} es-to-primitive@1.3.0: @@ -975,16 +1230,23 @@ packages: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} + expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + express@4.21.2: resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} engines: {node: '>= 0.10.0'} - fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} - fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fastq@1.18.0: + resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==} + + file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} @@ -1022,6 +1284,16 @@ packages: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -1030,21 +1302,38 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function.prototype.name@1.1.7: - resolution: {integrity: sha512-2g4x+HqTJKM9zcJqBSpjoRmdcPFtJM60J3xJisTQSXBWka5XqyBN/2tNUgma1mztTXyDuUsEtYe5qcs7xYzYQA==} + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} engines: {node: '>= 0.4'} functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - get-intrinsic@1.2.6: - resolution: {integrity: sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==} + gauge@3.0.2: + resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} + engines: {node: '>=10'} + deprecated: This package is no longer supported. + + gauge@4.0.4: + resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This package is no longer supported. + + get-intrinsic@1.2.7: + resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} engines: {node: '>= 0.4'} - get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -1053,6 +1342,10 @@ packages: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + globalthis@1.0.4: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} @@ -1064,8 +1357,9 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} @@ -1086,6 +1380,9 @@ packages: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} + has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -1100,10 +1397,24 @@ packages: htmlparser2@9.1.0: resolution: {integrity: sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==} + http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} + http-proxy-agent@4.0.1: + resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} + engines: {node: '>= 6'} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -1112,16 +1423,48 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + ignore-by-default@1.0.1: resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} + immutable@5.0.3: + resolution: {integrity: sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + infer-owner@1.0.4: + resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} + + inflection@1.13.4: + resolution: {integrity: sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw==} + engines: {'0': node >= 0.4.0} + + inflight@1.0.6: + resolution: {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. + inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + internal-slot@1.1.0: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} + ip-address@9.0.5: + resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} + engines: {node: '>= 12'} + ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} @@ -1133,8 +1476,8 @@ packages: is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - is-async-function@2.0.0: - resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + is-async-function@2.1.0: + resolution: {integrity: sha512-GExz9MtyhlZyXYLxzlJRj5WUCE661zhDa1Yna52CN57AJsymh+DvXXjyveSioqSRdxvUrdKdvqB1b5cVKsNpWQ==} engines: {node: '>= 0.4'} is-bigint@1.1.0: @@ -1153,8 +1496,8 @@ packages: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - is-core-module@2.16.0: - resolution: {integrity: sha512-urTSINYfAYgcbLb0yDQ6egFm6h3Mo1DcF9EkyXSRjjzdHbsulg01qhwWuXdOoUBuTkbQ80KDboXa0vFJ+BDH+g==} + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} is-data-view@1.0.2: @@ -1169,30 +1512,29 @@ packages: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - is-finalizationregistry@1.1.0: - resolution: {integrity: sha512-qfMdqbAQEwBw78ZyReKnlA8ezmPdb9BemzIIip/JkjaZUhitfXDkkr+3QTboW0JrSXT1QWyYShpvnNHGZ4c4yA==} + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} engines: {node: '>= 0.4'} is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} engines: {node: '>= 0.4'} is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-lambda@1.0.1: + resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} + is-map@2.0.3: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} - is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - is-number-object@1.1.1: resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} engines: {node: '>= 0.4'} @@ -1209,8 +1551,8 @@ packages: resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} engines: {node: '>= 0.4'} - is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} engines: {node: '>= 0.4'} is-string@1.1.1: @@ -1221,8 +1563,8 @@ packages: resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} engines: {node: '>= 0.4'} - is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} is-weakmap@2.0.2: @@ -1233,8 +1575,8 @@ packages: resolution: {integrity: sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==} engines: {node: '>= 0.4'} - is-weakset@2.0.3: - resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} engines: {node: '>= 0.4'} isarray@2.0.5: @@ -1249,9 +1591,22 @@ packages: js-tokens@9.0.1: resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + jsbn@1.1.0: + resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + json-parse-better-errors@1.0.2: resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + jsonwebtoken@9.0.2: + resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} + engines: {node: '>=12', npm: '>=6'} + + jwa@1.4.1: + resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} + + jws@3.2.2: + resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} + load-json-file@4.0.0: resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} engines: {node: '>=4'} @@ -1264,6 +1619,10 @@ packages: resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==} engines: {node: '>=14'} + local-pkg@1.0.0: + resolution: {integrity: sha512-bbgPw/wmroJsil/GgL4qjDzs5YLTBMQ99weRsok1XCDccQeehbHA/I1oRvk2NPtr7KGZgT/Y5tPRnAtMqeG2Kg==} + engines: {node: '>=14'} + lodash-es@4.17.21: resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} @@ -1274,20 +1633,53 @@ packages: lodash: '*' lodash-es: '*' + lodash.includes@4.3.0: + resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} + + lodash.isboolean@3.0.3: + resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} + + lodash.isinteger@4.0.4: + resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} + + lodash.isnumber@3.0.3: + resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.isstring@4.0.1: + resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + + lodash.once@4.1.1: + resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - math-intrinsics@1.0.0: - resolution: {integrity: sha512-4MqMiKP90ybymYvsut0CH2g4XWbfLtmlCkXmtmdcDCxNB+mQcu1w/1+L/VD7vi/PSv7X2JYV7SCcR+jiPXnQtA==} + make-fetch-happen@9.1.0: + resolution: {integrity: sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==} + engines: {node: '>= 10'} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} media-typer@0.3.0: @@ -1329,6 +1721,10 @@ packages: engines: {node: '>=4'} hasBin: true + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -1336,12 +1732,61 @@ packages: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass-collect@1.0.2: + resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} + engines: {node: '>= 8'} + + minipass-fetch@1.4.1: + resolution: {integrity: sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==} + engines: {node: '>=8'} + + minipass-flush@1.0.5: + resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} + engines: {node: '>= 8'} + + minipass-pipeline@1.2.4: + resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} + engines: {node: '>=8'} + + minipass-sized@1.0.3: + resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} + engines: {node: '>=8'} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} - mlly@1.7.3: - resolution: {integrity: sha512-xUsx5n/mN0uQf4V548PKQ+YShA4/IW0KI1dZhrNrPCLG+xizETbHTkOa1f8/xut9JRPp8kQuMnz0oqwkTiLo/A==} + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + mlly@1.7.4: + resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} + + moment-timezone@0.5.46: + resolution: {integrity: sha512-ZXm9b36esbe7OmdABqIWJuBBiLLwAjrN7CE+7sYdCCx82Nabt1wHDj8TVseS59QIlfFPbOoiBPm6ca9BioG4hw==} + + moment@2.30.1: + resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} @@ -1357,18 +1802,54 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + napi-build-utils@2.0.0: + resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} + negotiator@0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} + negotiator@0.6.4: + resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} + engines: {node: '>= 0.6'} + nice-try@1.0.5: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} + node-abi@3.73.0: + resolution: {integrity: sha512-z8iYzQGBu35ZkTQ9mtR8RqugJZ9RCLn8fv3d7LsgDBzOijGQP3RdKTX4LA7LXw03ZhU5z0l4xfhIMgSES31+cg==} + engines: {node: '>=10'} + + node-addon-api@5.1.0: + resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} + + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-gyp@8.4.1: + resolution: {integrity: sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==} + engines: {node: '>= 10.12.0'} + hasBin: true + nodemon@3.1.9: resolution: {integrity: sha512-hdr1oIb2p6ZSxu3PB2JWWYS7ZQ0qvaZsc3hK8DR8f02kRzc8rjYmxAIvdz+aYC+8F2IjNaB7HMcSDg8nQpJxyg==} engines: {node: '>=10'} hasBin: true + nopt@5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true + normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} @@ -1384,6 +1865,15 @@ packages: engines: {node: '>= 4'} hasBin: true + npmlog@5.0.1: + resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} + deprecated: This package is no longer supported. + + npmlog@6.0.2: + resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This package is no longer supported. + nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} @@ -1399,14 +1889,25 @@ packages: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} - object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} engines: {node: '>= 0.4'} on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + + p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} @@ -1430,6 +1931,10 @@ packages: path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + path-key@2.0.1: resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} engines: {node: '>=4'} @@ -1452,8 +1957,11 @@ packages: resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} engines: {node: '>=4'} - pathe@1.1.2: - resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + pathe@2.0.2: + resolution: {integrity: sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==} + + pg-connection-string@2.7.0: + resolution: {integrity: sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA==} picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -1475,8 +1983,8 @@ packages: resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} engines: {node: '>=4'} - pinia@2.3.0: - resolution: {integrity: sha512-ohZj3jla0LL0OH5PlLTDMzqKiVw2XARmC1XYLdLWIPBMdhDW/123ZWr4zVAhtJm+aoSkFa13pYXskAvAscIkhQ==} + pinia@2.3.1: + resolution: {integrity: sha512-khUlZSwt9xXCaTbbxFYBKDc/bWAGWJjOgvxETwkTN7KRm66EeT1ZdZj6i2ceh9sP2Pzqsbc704r2yngBrxBVug==} peerDependencies: typescript: '>=4.4.4' vue: ^2.7.0 || ^3.5.11 @@ -1484,22 +1992,39 @@ packages: typescript: optional: true - pkg-types@1.2.1: - resolution: {integrity: sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==} + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} possible-typed-array-names@1.0.0: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} engines: {node: '>= 0.4'} - postcss@8.4.49: - resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} + postcss@8.5.1: + resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==} engines: {node: ^10 || ^12 || >=14} + prebuild-install@7.1.3: + resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} + engines: {node: '>=10'} + hasBin: true + prettier@3.4.2: resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} engines: {node: '>=14'} hasBin: true + promise-inflight@1.0.1: + resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} + peerDependencies: + bluebird: '*' + peerDependenciesMeta: + bluebird: + optional: true + + promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -1510,6 +2035,9 @@ packages: pstree.remy@1.1.8: resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} + pump@3.0.2: + resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + qs@6.13.0: resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} engines: {node: '>=0.6'} @@ -1525,36 +2053,61 @@ packages: resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + read-pkg@3.0.0: resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} engines: {node: '>=4'} + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} - reflect.getprototypeof@1.0.8: - resolution: {integrity: sha512-B5dj6usc5dkk8uFliwjwDHM8To5/QwdKz9JcBZ8Ic4G1f0YmeeJTtE/ZTdgRFPAfxZFiUaPhZ1Jcs4qeagItGQ==} + readdirp@4.1.1: + resolution: {integrity: sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==} + engines: {node: '>= 14.18.0'} + + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} - regexp.prototype.flags@1.5.3: - resolution: {integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==} + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} - resolve@1.22.9: - resolution: {integrity: sha512-QxrmX1DzraFIi9PxdG5VkRfRwIgjwyud+z/iBwfRRrVmHc+P9Q7u2lSSpQ6bjr2gy5lrqIiU9vb6iAeGf2400A==} + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} hasBin: true + retry-as-promised@7.0.4: + resolution: {integrity: sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA==} + + retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + rimraf@5.0.10: resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} hasBin: true - rollup@4.28.1: - resolution: {integrity: sha512-61fXYl/qNVinKmGSTHAZ6Yy8I3YIJC/r2m9feHo6SwVAVcLT5MPwOUFe7EuURA/4m0NR8lXG4BBXuo/IZEsjMg==} + rollup@4.31.0: + resolution: {integrity: sha512-9cCE8P4rZLx9+PjoyqHLs31V9a9Vpvfo4qNcs6JCiGWYhw2gijSetFbH6SSy1whnkgcefnUwr8sad7tgqsGvnw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -1571,6 +2124,10 @@ packages: safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + safe-regex-test@1.1.0: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} @@ -1578,6 +2135,11 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + sass@1.83.4: + resolution: {integrity: sha512-B1bozCeNQiOgDcLd33e2Cs2U60wZwjUUXzh900ZyQF5qUasvMdDZYbQ566LJu7cqR+sAHlAfO6RMkaID5s6qpA==} + engines: {node: '>=14.0.0'} + hasBin: true + sax@1.4.1: resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} @@ -1588,6 +2150,10 @@ packages: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + semver@7.6.3: resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} engines: {node: '>=10'} @@ -1597,10 +2163,50 @@ packages: resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} engines: {node: '>= 0.8.0'} + sequelize-pool@7.1.0: + resolution: {integrity: sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg==} + engines: {node: '>= 10.0.0'} + + sequelize@6.37.5: + resolution: {integrity: sha512-10WA4poUb3XWnUROThqL2Apq9C2NhyV1xHPMZuybNMCucDsbbFuKg51jhmyvvAUyUqCiimwTZamc3AHhMoBr2Q==} + engines: {node: '>=10.0.0'} + peerDependencies: + ibm_db: '*' + mariadb: '*' + mysql2: '*' + oracledb: '*' + pg: '*' + pg-hstore: '*' + snowflake-sdk: '*' + sqlite3: '*' + tedious: '*' + peerDependenciesMeta: + ibm_db: + optional: true + mariadb: + optional: true + mysql2: + optional: true + oracledb: + optional: true + pg: + optional: true + pg-hstore: + optional: true + snowflake-sdk: + optional: true + sqlite3: + optional: true + tedious: + optional: true + serve-static@1.16.2: resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} engines: {node: '>= 0.8.0'} + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -1609,6 +2215,10 @@ packages: resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} engines: {node: '>= 0.4'} + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} @@ -1648,14 +2258,27 @@ packages: resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + + simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + simple-update-notifier@2.0.0: resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} engines: {node: '>=10'} + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + socket.io-adapter@2.5.5: resolution: {integrity: sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==} @@ -1671,6 +2294,14 @@ packages: resolution: {integrity: sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==} engines: {node: '>=10.2.0'} + socks-proxy-agent@6.2.1: + resolution: {integrity: sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==} + engines: {node: '>= 10'} + + socks@2.8.3: + resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} @@ -1684,8 +2315,18 @@ packages: spdx-expression-parse@3.0.1: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - spdx-license-ids@3.0.20: - resolution: {integrity: sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==} + spdx-license-ids@3.0.21: + resolution: {integrity: sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==} + + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + + sqlite3@5.1.7: + resolution: {integrity: sha512-GGIyOiFaG+TUra3JIfkI/zGP8yZYLPQ0pl1bH+ODjiX57sPhrLU5sQJn1y9bDKZUFYkX1crlrPfSYt0BKKdkog==} + + ssri@8.0.1: + resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==} + engines: {node: '>= 8'} statuses@2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} @@ -1715,6 +2356,9 @@ packages: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} engines: {node: '>= 0.4'} + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -1727,6 +2371,10 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + strip-literal@2.1.1: resolution: {integrity: sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==} @@ -1738,6 +2386,17 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + tar-fs@2.1.2: + resolution: {integrity: sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -1746,10 +2405,16 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} + toposort-class@1.0.1: + resolution: {integrity: sha512-OsLcGGbYF3rMjPUf8oKktyvCiUxSbqMMS39m33MAjLTC1DVIH6x3WSt63/M77ihI09+Sdfk1AXvfhCEeUmC7mg==} + touch@3.1.1: resolution: {integrity: sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==} hasBin: true + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + ts-node@10.9.2: resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true @@ -1764,6 +2429,9 @@ packages: '@swc/wasm': optional: true + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + tunnel@0.0.6: resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} @@ -1772,24 +2440,24 @@ packages: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} - typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} - typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} engines: {node: '>= 0.4'} - typed-array-byte-offset@1.0.3: - resolution: {integrity: sha512-GsvTyUHTriq6o/bHcTd0vM7OQ9JEdlvluu9YISaA7+KzDzPaIzEeDFNkTfhdE3MYcNhNi0vq/LlegYgIs5yPAw==} + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} engines: {node: '>= 0.4'} typed-array-length@1.0.7: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typescript@5.7.2: - resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} + typescript@5.7.3: + resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} engines: {node: '>=14.17'} hasBin: true @@ -1806,12 +2474,18 @@ packages: undici-types@6.19.8: resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} - undici@6.21.0: - resolution: {integrity: sha512-BUgJXc752Kou3oOIuU1i+yZZypyZRqNPW0vqoMPl8VaoalSfeR0D8/t4iAS3yirs79SSMTxTag+ZC86uswv+Cw==} + undici@6.21.1: + resolution: {integrity: sha512-q/1rj5D0/zayJB2FraXdaWxbhWiNKDvu8naDT2dl1yTlvJp4BLtOcp2a5BvgGNQpYYJzau7tf1WgKv3b+7mqpQ==} engines: {node: '>=18.17'} - unimport@3.14.5: - resolution: {integrity: sha512-tn890SwFFZxqaJSKQPPd+yygfKSATbM8BZWW1aCR2TJBTs1SDrmLamBueaFtYsGjHtQaRgqEbQflOjN2iW12gA==} + unimport@3.14.6: + resolution: {integrity: sha512-CYvbDaTT04Rh8bmD8jz3WPmHYZRG/NnvYVzwD6V1YAlvvKROlAeNDUBhkBGzNav2RKaeuXvlWYaa1V4Lfi/O0g==} + + unique-filename@1.1.1: + resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==} + + unique-slug@2.0.2: + resolution: {integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==} unpipe@1.0.0: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} @@ -1842,26 +2516,37 @@ packages: '@nuxt/kit': optional: true - unplugin@1.16.0: - resolution: {integrity: sha512-5liCNPuJW8dqh3+DM6uNM2EI3MLLpCKp/KY+9pB5M2S2SR2qvvDHhKgBOaTWEbZTAws3CXfB0rKTIolWKL05VQ==} + unplugin@1.16.1: + resolution: {integrity: sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==} engines: {node: '>=14.0.0'} + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + utils-merge@1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + validator@13.12.0: + resolution: {integrity: sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==} + engines: {node: '>= 0.10'} + vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - vite@5.4.11: - resolution: {integrity: sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==} + vite@5.4.14: + resolution: {integrity: sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -1910,8 +2595,8 @@ packages: peerDependencies: vue: ^3.2.0 - vue-tsc@2.1.10: - resolution: {integrity: sha512-RBNSfaaRHcN5uqVqJSZh++Gy/YUzryuv9u1aFWhsammDJXNtUiJMNoJ747lZcQ68wUQFx6E73y4FY3D8E7FGMA==} + vue-tsc@2.2.0: + resolution: {integrity: sha512-gtmM1sUuJ8aSb0KoAFmK9yMxb8TxjewmxqTJ1aKphD5Cbu0rULFY6+UQT51zW7SpUcenfPUuflKyVwyx9Qdnxg==} hasBin: true peerDependencies: typescript: '>=5.0.0' @@ -1924,6 +2609,9 @@ packages: typescript: optional: true + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} @@ -1935,6 +2623,9 @@ packages: resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} engines: {node: '>=18'} + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + which-boxed-primitive@1.1.1: resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} engines: {node: '>= 0.4'} @@ -1947,8 +2638,8 @@ packages: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} - which-typed-array@1.1.16: - resolution: {integrity: sha512-g+N+GAWiRj66DngFwHvISJd+ITsyphZvD1vChfVg6cEdnzy53GzB3oy0fUNlvhz7H7+MiqhYr26qxQShCpKTTQ==} + which-typed-array@1.1.18: + resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} engines: {node: '>= 0.4'} which@1.3.1: @@ -1960,6 +2651,12 @@ packages: engines: {node: '>= 8'} hasBin: true + wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + + wkx@0.5.0: + resolution: {integrity: sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==} + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -1968,6 +2665,9 @@ packages: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + ws@8.17.1: resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} engines: {node: '>=10.0.0'} @@ -1992,6 +2692,9 @@ packages: resolution: {integrity: sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==} engines: {node: '>=0.4.0'} + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} @@ -2004,11 +2707,11 @@ snapshots: '@babel/helper-validator-identifier@7.25.9': {} - '@babel/parser@7.26.3': + '@babel/parser@7.26.5': dependencies: - '@babel/types': 7.26.3 + '@babel/types': 7.26.5 - '@babel/types@7.26.3': + '@babel/types@7.26.5': dependencies: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 @@ -2019,9 +2722,9 @@ snapshots: '@ctrl/tinycolor@3.6.1': {} - '@element-plus/icons-vue@2.3.1(vue@3.5.13(typescript@5.7.2))': + '@element-plus/icons-vue@2.3.1(vue@3.5.13(typescript@5.7.3))': dependencies: - vue: 3.5.13(typescript@5.7.2) + vue: 3.5.13(typescript@5.7.3) '@esbuild/aix-ppc64@0.21.5': optional: true @@ -2092,16 +2795,19 @@ snapshots: '@esbuild/win32-x64@0.21.5': optional: true - '@floating-ui/core@1.6.8': + '@floating-ui/core@1.6.9': dependencies: - '@floating-ui/utils': 0.2.8 + '@floating-ui/utils': 0.2.9 - '@floating-ui/dom@1.6.12': + '@floating-ui/dom@1.6.13': dependencies: - '@floating-ui/core': 1.6.8 - '@floating-ui/utils': 0.2.8 + '@floating-ui/core': 1.6.9 + '@floating-ui/utils': 0.2.9 - '@floating-ui/utils@0.2.8': {} + '@floating-ui/utils@0.2.9': {} + + '@gar/promisify@1.1.3': + optional: true '@isaacs/cliui@8.0.2': dependencies: @@ -2121,6 +2827,21 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@mapbox/node-pre-gyp@1.0.11(encoding@0.1.13)': + dependencies: + detect-libc: 2.0.3 + https-proxy-agent: 5.0.1 + make-dir: 3.1.0 + node-fetch: 2.7.0(encoding@0.1.13) + nopt: 5.0.0 + npmlog: 5.0.1 + rimraf: 3.0.2 + semver: 7.6.3 + tar: 6.2.1 + transitivePeerDependencies: + - encoding + - supports-color + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -2131,80 +2852,156 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 + fastq: 1.18.0 + + '@npmcli/fs@1.1.1': + dependencies: + '@gar/promisify': 1.1.3 + semver: 7.6.3 + optional: true + + '@npmcli/move-file@1.1.2': + dependencies: + mkdirp: 1.0.4 + rimraf: 3.0.2 + optional: true + + '@parcel/watcher-android-arm64@2.5.0': + optional: true + + '@parcel/watcher-darwin-arm64@2.5.0': + optional: true + + '@parcel/watcher-darwin-x64@2.5.0': + optional: true + + '@parcel/watcher-freebsd-x64@2.5.0': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.5.0': + optional: true + + '@parcel/watcher-linux-arm-musl@2.5.0': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.5.0': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.5.0': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.5.0': + optional: true + + '@parcel/watcher-linux-x64-musl@2.5.0': + optional: true + + '@parcel/watcher-win32-arm64@2.5.0': + optional: true + + '@parcel/watcher-win32-ia32@2.5.0': + optional: true + + '@parcel/watcher-win32-x64@2.5.0': + optional: true + + '@parcel/watcher@2.5.0': + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.8 + node-addon-api: 7.1.1 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.5.0 + '@parcel/watcher-darwin-arm64': 2.5.0 + '@parcel/watcher-darwin-x64': 2.5.0 + '@parcel/watcher-freebsd-x64': 2.5.0 + '@parcel/watcher-linux-arm-glibc': 2.5.0 + '@parcel/watcher-linux-arm-musl': 2.5.0 + '@parcel/watcher-linux-arm64-glibc': 2.5.0 + '@parcel/watcher-linux-arm64-musl': 2.5.0 + '@parcel/watcher-linux-x64-glibc': 2.5.0 + '@parcel/watcher-linux-x64-musl': 2.5.0 + '@parcel/watcher-win32-arm64': 2.5.0 + '@parcel/watcher-win32-ia32': 2.5.0 + '@parcel/watcher-win32-x64': 2.5.0 + optional: true '@pkgjs/parseargs@0.11.0': optional: true - '@rollup/pluginutils@5.1.4(rollup@4.28.1)': + '@rollup/pluginutils@5.1.4(rollup@4.31.0)': dependencies: '@types/estree': 1.0.6 estree-walker: 2.0.2 picomatch: 4.0.2 optionalDependencies: - rollup: 4.28.1 + rollup: 4.31.0 - '@rollup/rollup-android-arm-eabi@4.28.1': + '@rollup/rollup-android-arm-eabi@4.31.0': optional: true - '@rollup/rollup-android-arm64@4.28.1': + '@rollup/rollup-android-arm64@4.31.0': optional: true - '@rollup/rollup-darwin-arm64@4.28.1': + '@rollup/rollup-darwin-arm64@4.31.0': optional: true - '@rollup/rollup-darwin-x64@4.28.1': + '@rollup/rollup-darwin-x64@4.31.0': optional: true - '@rollup/rollup-freebsd-arm64@4.28.1': + '@rollup/rollup-freebsd-arm64@4.31.0': optional: true - '@rollup/rollup-freebsd-x64@4.28.1': + '@rollup/rollup-freebsd-x64@4.31.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.28.1': + '@rollup/rollup-linux-arm-gnueabihf@4.31.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.28.1': + '@rollup/rollup-linux-arm-musleabihf@4.31.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.28.1': + '@rollup/rollup-linux-arm64-gnu@4.31.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.28.1': + '@rollup/rollup-linux-arm64-musl@4.31.0': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.28.1': + '@rollup/rollup-linux-loongarch64-gnu@4.31.0': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.28.1': + '@rollup/rollup-linux-powerpc64le-gnu@4.31.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.28.1': + '@rollup/rollup-linux-riscv64-gnu@4.31.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.28.1': + '@rollup/rollup-linux-s390x-gnu@4.31.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.28.1': + '@rollup/rollup-linux-x64-gnu@4.31.0': optional: true - '@rollup/rollup-linux-x64-musl@4.28.1': + '@rollup/rollup-linux-x64-musl@4.31.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.28.1': + '@rollup/rollup-win32-arm64-msvc@4.31.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.28.1': + '@rollup/rollup-win32-ia32-msvc@4.31.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.28.1': + '@rollup/rollup-win32-x64-msvc@4.31.0': optional: true '@socket.io/component-emitter@3.1.2': {} '@sxzz/popperjs-es@2.11.7': {} + '@tootallnate/once@1.1.2': + optional: true + '@tsconfig/node10@1.0.11': {} '@tsconfig/node12@1.0.11': {} @@ -2213,14 +3010,18 @@ snapshots: '@tsconfig/node16@1.0.4': {} + '@types/bcrypt@5.0.2': + dependencies: + '@types/node': 20.17.14 + '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 - '@types/node': 20.17.10 + '@types/node': 20.17.14 '@types/connect@3.4.38': dependencies: - '@types/node': 20.17.10 + '@types/node': 20.17.14 '@types/cookie-parser@1.4.8(@types/express@4.17.21)': dependencies: @@ -2230,14 +3031,18 @@ snapshots: '@types/cors@2.8.17': dependencies: - '@types/node': 20.17.10 + '@types/node': 20.17.14 + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 2.1.0 '@types/estree@1.0.6': {} '@types/express-serve-static-core@4.19.6': dependencies: - '@types/node': 20.17.10 - '@types/qs': 6.9.17 + '@types/node': 20.17.14 + '@types/qs': 6.9.18 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 @@ -2245,48 +3050,56 @@ snapshots: dependencies: '@types/body-parser': 1.19.5 '@types/express-serve-static-core': 4.19.6 - '@types/qs': 6.9.17 + '@types/qs': 6.9.18 '@types/serve-static': 1.15.7 '@types/http-errors@2.0.4': {} + '@types/jsonwebtoken@9.0.7': + dependencies: + '@types/node': 20.17.14 + '@types/lodash-es@4.17.12': dependencies: - '@types/lodash': 4.17.13 + '@types/lodash': 4.17.14 - '@types/lodash@4.17.13': {} + '@types/lodash@4.17.14': {} '@types/mime@1.3.5': {} - '@types/node@20.17.10': + '@types/ms@2.1.0': {} + + '@types/node@20.17.14': dependencies: undici-types: 6.19.8 - '@types/qs@6.9.17': {} + '@types/qs@6.9.18': {} '@types/range-parser@1.2.7': {} '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 - '@types/node': 20.17.10 + '@types/node': 20.17.14 '@types/serve-static@1.15.7': dependencies: '@types/http-errors': 2.0.4 - '@types/node': 20.17.10 + '@types/node': 20.17.14 '@types/send': 0.17.4 '@types/tunnel@0.0.7': dependencies: - '@types/node': 20.17.10 + '@types/node': 20.17.14 + + '@types/validator@13.12.2': {} '@types/web-bluetooth@0.0.16': {} - '@vitejs/plugin-vue@5.2.1(vite@5.4.11(@types/node@20.17.10))(vue@3.5.13(typescript@5.7.2))': + '@vitejs/plugin-vue@5.2.1(vite@5.4.14(@types/node@20.17.14)(sass@1.83.4))(vue@3.5.13(typescript@5.7.3))': dependencies: - vite: 5.4.11(@types/node@20.17.10) - vue: 3.5.13(typescript@5.7.2) + vite: 5.4.14(@types/node@20.17.14)(sass@1.83.4) + vue: 3.5.13(typescript@5.7.3) '@volar/language-core@2.4.11': dependencies: @@ -2302,7 +3115,7 @@ snapshots: '@vue/compiler-core@3.5.13': dependencies: - '@babel/parser': 7.26.3 + '@babel/parser': 7.26.5 '@vue/shared': 3.5.13 entities: 4.5.0 estree-walker: 2.0.2 @@ -2315,14 +3128,14 @@ snapshots: '@vue/compiler-sfc@3.5.13': dependencies: - '@babel/parser': 7.26.3 + '@babel/parser': 7.26.5 '@vue/compiler-core': 3.5.13 '@vue/compiler-dom': 3.5.13 '@vue/compiler-ssr': 3.5.13 '@vue/shared': 3.5.13 estree-walker: 2.0.2 magic-string: 0.30.17 - postcss: 8.4.49 + postcss: 8.5.1 source-map-js: 1.2.1 '@vue/compiler-ssr@3.5.13': @@ -2337,18 +3150,18 @@ snapshots: '@vue/devtools-api@6.6.4': {} - '@vue/language-core@2.1.10(typescript@5.7.2)': + '@vue/language-core@2.2.0(typescript@5.7.3)': dependencies: '@volar/language-core': 2.4.11 '@vue/compiler-dom': 3.5.13 '@vue/compiler-vue2': 2.7.16 '@vue/shared': 3.5.13 - alien-signals: 0.2.2 + alien-signals: 0.4.14 minimatch: 9.0.5 muggle-string: 0.4.1 path-browserify: 1.0.1 optionalDependencies: - typescript: 5.7.2 + typescript: 5.7.3 '@vue/reactivity@3.5.13': dependencies: @@ -2366,33 +3179,35 @@ snapshots: '@vue/shared': 3.5.13 csstype: 3.1.3 - '@vue/server-renderer@3.5.13(vue@3.5.13(typescript@5.7.2))': + '@vue/server-renderer@3.5.13(vue@3.5.13(typescript@5.7.3))': dependencies: '@vue/compiler-ssr': 3.5.13 '@vue/shared': 3.5.13 - vue: 3.5.13(typescript@5.7.2) + vue: 3.5.13(typescript@5.7.3) '@vue/shared@3.5.13': {} - '@vueuse/core@9.13.0(vue@3.5.13(typescript@5.7.2))': + '@vueuse/core@9.13.0(vue@3.5.13(typescript@5.7.3))': dependencies: '@types/web-bluetooth': 0.0.16 '@vueuse/metadata': 9.13.0 - '@vueuse/shared': 9.13.0(vue@3.5.13(typescript@5.7.2)) - vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.2)) + '@vueuse/shared': 9.13.0(vue@3.5.13(typescript@5.7.3)) + vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.3)) transitivePeerDependencies: - '@vue/composition-api' - vue '@vueuse/metadata@9.13.0': {} - '@vueuse/shared@9.13.0(vue@3.5.13(typescript@5.7.2))': + '@vueuse/shared@9.13.0(vue@3.5.13(typescript@5.7.3))': dependencies: - vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.2)) + vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.3)) transitivePeerDependencies: - '@vue/composition-api' - vue + abbrev@1.1.1: {} + accepts@1.3.8: dependencies: mime-types: 2.1.35 @@ -2404,7 +3219,24 @@ snapshots: acorn@8.14.0: {} - alien-signals@0.2.2: {} + agent-base@6.0.2: + dependencies: + debug: 4.4.0(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + + agentkeepalive@4.6.0: + dependencies: + humanize-ms: 1.2.1 + optional: true + + aggregate-error@3.1.0: + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + optional: true + + alien-signals@0.4.14: {} ansi-regex@5.0.1: {} @@ -2425,23 +3257,36 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 + aproba@2.0.0: {} + + are-we-there-yet@2.0.0: + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + + are-we-there-yet@3.0.1: + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + optional: true + arg@4.1.3: {} - array-buffer-byte-length@1.0.1: + array-buffer-byte-length@1.0.2: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 is-array-buffer: 3.0.5 array-flatten@1.1.1: {} arraybuffer.prototype.slice@1.0.4: dependencies: - array-buffer-byte-length: 1.0.1 + array-buffer-byte-length: 1.0.2 call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.6 + es-abstract: 1.23.9 es-errors: 1.3.0 - get-intrinsic: 1.2.6 + get-intrinsic: 1.2.7 is-array-buffer: 3.0.5 async-validator@4.2.5: {} @@ -2462,10 +3307,30 @@ snapshots: balanced-match@1.0.2: {} + base64-js@1.5.1: {} + base64id@2.0.0: {} + bcrypt@5.1.1(encoding@0.1.13): + dependencies: + '@mapbox/node-pre-gyp': 1.0.11(encoding@0.1.13) + node-addon-api: 5.1.0 + transitivePeerDependencies: + - encoding + - supports-color + binary-extensions@2.3.0: {} + bindings@1.5.0: + dependencies: + file-uri-to-path: 1.0.0 + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + body-parser@1.20.3: dependencies: bytes: 3.1.2 @@ -2498,8 +3363,39 @@ snapshots: dependencies: fill-range: 7.1.1 + buffer-equal-constant-time@1.0.1: {} + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + bytes@3.1.2: {} + cacache@15.3.0: + dependencies: + '@npmcli/fs': 1.1.1 + '@npmcli/move-file': 1.1.2 + chownr: 2.0.0 + fs-minipass: 2.1.0 + glob: 7.2.3 + infer-owner: 1.0.4 + lru-cache: 6.0.0 + minipass: 3.3.6 + minipass-collect: 1.0.2 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + mkdirp: 1.0.4 + p-map: 4.0.0 + promise-inflight: 1.0.1 + rimraf: 3.0.2 + ssri: 8.0.1 + tar: 6.2.1 + unique-filename: 1.1.1 + transitivePeerDependencies: + - bluebird + optional: true + call-bind-apply-helpers@1.0.1: dependencies: es-errors: 1.3.0 @@ -2509,13 +3405,13 @@ snapshots: dependencies: call-bind-apply-helpers: 1.0.1 es-define-property: 1.0.1 - get-intrinsic: 1.2.6 + get-intrinsic: 1.2.7 set-function-length: 1.2.2 call-bound@1.0.3: dependencies: call-bind-apply-helpers: 1.0.1 - get-intrinsic: 1.2.6 + get-intrinsic: 1.2.7 chalk@2.4.2: dependencies: @@ -2530,20 +3426,20 @@ snapshots: css-what: 6.1.0 domelementtype: 2.3.0 domhandler: 5.0.3 - domutils: 3.1.0 + domutils: 3.2.2 cheerio@1.0.0: dependencies: cheerio-select: 2.1.0 dom-serializer: 2.0.0 domhandler: 5.0.3 - domutils: 3.1.0 + domutils: 3.2.2 encoding-sniffer: 0.2.0 htmlparser2: 9.1.0 parse5: 7.2.1 parse5-htmlparser2-tree-adapter: 7.1.0 parse5-parser-stream: 7.1.2 - undici: 6.21.0 + undici: 6.21.1 whatwg-mimetype: 4.0.0 chokidar@3.6.0: @@ -2558,6 +3454,17 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + chokidar@4.0.3: + dependencies: + readdirp: 4.1.1 + + chownr@1.1.4: {} + + chownr@2.0.0: {} + + clean-stack@2.2.0: + optional: true + color-convert@1.9.3: dependencies: color-name: 1.1.3 @@ -2570,6 +3477,8 @@ snapshots: color-name@1.1.4: {} + color-support@1.1.3: {} + combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 @@ -2578,6 +3487,8 @@ snapshots: confbox@0.1.8: {} + console-control-strings@1.1.0: {} + content-disposition@0.5.4: dependencies: safe-buffer: 5.2.1 @@ -2621,28 +3532,28 @@ snapshots: boolbase: 1.0.0 css-what: 6.1.0 domhandler: 5.0.3 - domutils: 3.1.0 + domutils: 3.2.2 nth-check: 2.1.1 css-what@6.1.0: {} csstype@3.1.3: {} - data-view-buffer@1.0.1: + data-view-buffer@1.0.2: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 es-errors: 1.3.0 is-data-view: 1.0.2 - data-view-byte-length@1.0.1: + data-view-byte-length@1.0.2: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 es-errors: 1.3.0 is-data-view: 1.0.2 - data-view-byte-offset@1.0.0: + data-view-byte-offset@1.0.1: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 es-errors: 1.3.0 is-data-view: 1.0.2 @@ -2664,6 +3575,12 @@ snapshots: optionalDependencies: supports-color: 5.5.0 + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + + deep-extend@0.6.0: {} + define-data-property@1.1.4: dependencies: es-define-property: 1.0.1 @@ -2678,10 +3595,17 @@ snapshots: delayed-stream@1.0.0: {} + delegates@1.0.0: {} + depd@2.0.0: {} destroy@1.2.0: {} + detect-libc@1.0.3: + optional: true + + detect-libc@2.0.3: {} + diff@4.0.2: {} dom-serializer@2.0.0: @@ -2696,7 +3620,7 @@ snapshots: dependencies: domelementtype: 2.3.0 - domutils@3.1.0: + domutils@3.2.2: dependencies: dom-serializer: 2.0.0 domelementtype: 2.3.0 @@ -2704,6 +3628,8 @@ snapshots: dotenv@16.4.7: {} + dottie@2.0.6: {} + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.1 @@ -2712,17 +3638,21 @@ snapshots: eastasianwidth@0.2.0: {} + ecdsa-sig-formatter@1.0.11: + dependencies: + safe-buffer: 5.2.1 + ee-first@1.1.1: {} - element-plus@2.9.1(vue@3.5.13(typescript@5.7.2)): + element-plus@2.9.3(vue@3.5.13(typescript@5.7.3)): dependencies: '@ctrl/tinycolor': 3.6.1 - '@element-plus/icons-vue': 2.3.1(vue@3.5.13(typescript@5.7.2)) - '@floating-ui/dom': 1.6.12 + '@element-plus/icons-vue': 2.3.1(vue@3.5.13(typescript@5.7.3)) + '@floating-ui/dom': 1.6.13 '@popperjs/core': '@sxzz/popperjs-es@2.11.7' - '@types/lodash': 4.17.13 + '@types/lodash': 4.17.14 '@types/lodash-es': 4.17.12 - '@vueuse/core': 9.13.0(vue@3.5.13(typescript@5.7.2)) + '@vueuse/core': 9.13.0(vue@3.5.13(typescript@5.7.3)) async-validator: 4.2.5 dayjs: 1.11.13 escape-html: 1.0.3 @@ -2731,7 +3661,7 @@ snapshots: lodash-unified: 1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21) memoize-one: 6.0.0 normalize-wheel-es: 1.2.0 - vue: 3.5.13(typescript@5.7.2) + vue: 3.5.13(typescript@5.7.3) transitivePeerDependencies: - '@vue/composition-api' @@ -2748,6 +3678,15 @@ snapshots: iconv-lite: 0.6.3 whatwg-encoding: 3.1.1 + encoding@0.1.13: + dependencies: + iconv-lite: 0.6.3 + optional: true + + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + engine.io-client@6.6.2: dependencies: '@socket.io/component-emitter': 3.1.2 @@ -2766,7 +3705,7 @@ snapshots: dependencies: '@types/cookie': 0.4.1 '@types/cors': 2.8.17 - '@types/node': 20.17.10 + '@types/node': 20.17.14 accepts: 1.3.8 base64id: 2.0.0 cookie: 0.7.2 @@ -2783,28 +3722,35 @@ snapshots: entities@4.5.0: {} + env-paths@2.2.1: + optional: true + + err-code@2.0.3: + optional: true + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 - es-abstract@1.23.6: + es-abstract@1.23.9: dependencies: - array-buffer-byte-length: 1.0.1 + 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.3 - data-view-buffer: 1.0.1 - data-view-byte-length: 1.0.1 - data-view-byte-offset: 1.0.0 + 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.0.0 - es-set-tostringtag: 2.0.3 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 es-to-primitive: 1.3.0 - function.prototype.name: 1.1.7 - get-intrinsic: 1.2.6 - get-symbol-description: 1.0.2 + function.prototype.name: 1.1.8 + get-intrinsic: 1.2.7 + 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 @@ -2815,40 +3761,43 @@ snapshots: 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-shared-array-buffer: 1.0.3 + is-shared-array-buffer: 1.0.4 is-string: 1.1.1 - is-typed-array: 1.1.13 + is-typed-array: 1.1.15 is-weakref: 1.1.0 - math-intrinsics: 1.0.0 + math-intrinsics: 1.1.0 object-inspect: 1.13.3 object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.3 + 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 string.prototype.trim: 1.2.10 string.prototype.trimend: 1.0.9 string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.2 - typed-array-byte-length: 1.0.1 - typed-array-byte-offset: 1.0.3 + 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.16 + which-typed-array: 1.1.18 es-define-property@1.0.1: {} es-errors@1.3.0: {} - es-object-atoms@1.0.0: + es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 - es-set-tostringtag@2.0.3: + es-set-tostringtag@2.1.0: dependencies: - get-intrinsic: 1.2.6 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 has-tostringtag: 1.0.2 hasown: 2.0.2 @@ -2898,6 +3847,8 @@ snapshots: etag@1.8.1: {} + expand-template@2.0.3: {} + express@4.21.2: dependencies: accepts: 1.3.8 @@ -2934,7 +3885,7 @@ snapshots: transitivePeerDependencies: - supports-color - fast-glob@3.3.2: + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 @@ -2942,10 +3893,12 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.8 - fastq@1.17.1: + fastq@1.18.0: dependencies: reusify: 1.0.4 + file-uri-to-path@1.0.0: {} + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -2983,14 +3936,23 @@ snapshots: fresh@0.5.2: {} + fs-constants@1.0.0: {} + + fs-minipass@2.1.0: + dependencies: + minipass: 3.3.6 + + fs.realpath@1.0.0: {} + fsevents@2.3.3: optional: true function-bind@1.1.2: {} - function.prototype.name@1.1.7: + function.prototype.name@1.1.8: dependencies: call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 functions-have-names: 1.2.3 hasown: 2.0.2 @@ -2998,24 +3960,55 @@ snapshots: functions-have-names@1.2.3: {} - get-intrinsic@1.2.6: + gauge@3.0.2: + dependencies: + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + object-assign: 4.1.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + + gauge@4.0.4: + dependencies: + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + optional: true + + get-intrinsic@1.2.7: dependencies: call-bind-apply-helpers: 1.0.1 - dunder-proto: 1.0.1 es-define-property: 1.0.1 es-errors: 1.3.0 - es-object-atoms: 1.0.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.0.0 + math-intrinsics: 1.1.0 - get-symbol-description@1.0.2: + get-proto@1.0.1: dependencies: - call-bind: 1.0.8 + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.2.6 + get-intrinsic: 1.2.7 + + github-from-package@0.0.0: {} glob-parent@5.1.2: dependencies: @@ -3030,6 +4023,15 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + globalthis@1.0.4: dependencies: define-properties: 1.2.1 @@ -3039,7 +4041,7 @@ snapshots: graceful-fs@4.2.11: {} - has-bigints@1.0.2: {} + has-bigints@1.1.0: {} has-flag@3.0.0: {} @@ -3057,6 +4059,8 @@ snapshots: dependencies: has-symbols: 1.1.0 + has-unicode@2.0.1: {} + hasown@2.0.2: dependencies: function-bind: 1.1.2 @@ -3069,9 +4073,12 @@ snapshots: dependencies: domelementtype: 2.3.0 domhandler: 5.0.3 - domutils: 3.1.0 + domutils: 3.2.2 entities: 4.5.0 + http-cache-semantics@4.1.1: + optional: true + http-errors@2.0.0: dependencies: depd: 2.0.0 @@ -3080,6 +4087,27 @@ snapshots: statuses: 2.0.1 toidentifier: 1.0.1 + http-proxy-agent@4.0.1: + dependencies: + '@tootallnate/once': 1.1.2 + agent-base: 6.0.2 + debug: 4.4.0(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + optional: true + + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.4.0(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + + humanize-ms@1.2.1: + dependencies: + ms: 2.1.3 + optional: true + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 @@ -3088,33 +4116,64 @@ snapshots: dependencies: safer-buffer: 2.1.2 + ieee754@1.2.1: {} + ignore-by-default@1.0.1: {} + immutable@5.0.3: {} + + imurmurhash@0.1.4: + optional: true + + indent-string@4.0.0: + optional: true + + infer-owner@1.0.4: + optional: true + + inflection@1.13.4: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + inherits@2.0.4: {} + ini@1.3.8: {} + internal-slot@1.1.0: dependencies: es-errors: 1.3.0 hasown: 2.0.2 side-channel: 1.1.0 + ip-address@9.0.5: + dependencies: + jsbn: 1.1.0 + sprintf-js: 1.1.3 + optional: true + ipaddr.js@1.9.1: {} is-array-buffer@3.0.5: dependencies: call-bind: 1.0.8 call-bound: 1.0.3 - get-intrinsic: 1.2.6 + get-intrinsic: 1.2.7 is-arrayish@0.2.1: {} - is-async-function@2.0.0: + is-async-function@2.1.0: dependencies: + call-bound: 1.0.3 + get-proto: 1.0.1 has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 is-bigint@1.1.0: dependencies: - has-bigints: 1.0.2 + has-bigints: 1.1.0 is-binary-path@2.1.0: dependencies: @@ -3127,15 +4186,15 @@ snapshots: is-callable@1.2.7: {} - is-core-module@2.16.0: + is-core-module@2.16.1: dependencies: hasown: 2.0.2 is-data-view@1.0.2: dependencies: call-bound: 1.0.3 - get-intrinsic: 1.2.6 - is-typed-array: 1.1.13 + get-intrinsic: 1.2.7 + is-typed-array: 1.1.15 is-date-object@1.1.0: dependencies: @@ -3144,23 +4203,27 @@ snapshots: is-extglob@2.1.1: {} - is-finalizationregistry@1.1.0: + is-finalizationregistry@1.1.1: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 is-fullwidth-code-point@3.0.0: {} - is-generator-function@1.0.10: + is-generator-function@1.1.0: dependencies: + call-bound: 1.0.3 + get-proto: 1.0.1 has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 is-glob@4.0.3: dependencies: is-extglob: 2.1.1 - is-map@2.0.3: {} + is-lambda@1.0.1: + optional: true - is-negative-zero@2.0.3: {} + is-map@2.0.3: {} is-number-object@1.1.1: dependencies: @@ -3178,9 +4241,9 @@ snapshots: is-set@2.0.3: {} - is-shared-array-buffer@1.0.3: + is-shared-array-buffer@1.0.4: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 is-string@1.1.1: dependencies: @@ -3193,9 +4256,9 @@ snapshots: has-symbols: 1.1.0 safe-regex-test: 1.1.0 - is-typed-array@1.1.13: + is-typed-array@1.1.15: dependencies: - which-typed-array: 1.1.16 + which-typed-array: 1.1.18 is-weakmap@2.0.2: {} @@ -3203,10 +4266,10 @@ snapshots: dependencies: call-bound: 1.0.3 - is-weakset@2.0.3: + is-weakset@2.0.4: dependencies: - call-bind: 1.0.8 - get-intrinsic: 1.2.6 + call-bound: 1.0.3 + get-intrinsic: 1.2.7 isarray@2.0.5: {} @@ -3220,8 +4283,35 @@ snapshots: js-tokens@9.0.1: {} + jsbn@1.1.0: + optional: true + json-parse-better-errors@1.0.2: {} + jsonwebtoken@9.0.2: + dependencies: + jws: 3.2.2 + lodash.includes: 4.3.0 + lodash.isboolean: 3.0.3 + lodash.isinteger: 4.0.4 + lodash.isnumber: 3.0.3 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.once: 4.1.1 + ms: 2.1.3 + semver: 7.6.3 + + jwa@1.4.1: + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + + jws@3.2.2: + dependencies: + jwa: 1.4.1 + safe-buffer: 5.2.1 + load-json-file@4.0.0: dependencies: graceful-fs: 4.2.11 @@ -3233,8 +4323,13 @@ snapshots: local-pkg@0.5.1: dependencies: - mlly: 1.7.3 - pkg-types: 1.2.1 + mlly: 1.7.4 + pkg-types: 1.3.1 + + local-pkg@1.0.0: + dependencies: + mlly: 1.7.4 + pkg-types: 1.3.1 lodash-es@4.17.21: {} @@ -3244,17 +4339,63 @@ snapshots: lodash: 4.17.21 lodash-es: 4.17.21 + lodash.includes@4.3.0: {} + + lodash.isboolean@3.0.3: {} + + lodash.isinteger@4.0.4: {} + + lodash.isnumber@3.0.3: {} + + lodash.isplainobject@4.0.6: {} + + lodash.isstring@4.0.1: {} + + lodash.once@4.1.1: {} + lodash@4.17.21: {} lru-cache@10.4.3: {} + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + optional: true + magic-string@0.30.17: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 + make-dir@3.1.0: + dependencies: + semver: 6.3.1 + make-error@1.3.6: {} - math-intrinsics@1.0.0: {} + make-fetch-happen@9.1.0: + dependencies: + agentkeepalive: 4.6.0 + cacache: 15.3.0 + http-cache-semantics: 4.1.1 + http-proxy-agent: 4.0.1 + https-proxy-agent: 5.0.1 + is-lambda: 1.0.1 + lru-cache: 6.0.0 + minipass: 3.3.6 + minipass-collect: 1.0.2 + minipass-fetch: 1.4.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 0.6.4 + promise-retry: 2.0.1 + socks-proxy-agent: 6.2.1 + ssri: 8.0.1 + transitivePeerDependencies: + - bluebird + - supports-color + optional: true + + math-intrinsics@1.1.0: {} media-typer@0.3.0: {} @@ -3281,6 +4422,8 @@ snapshots: mime@1.6.0: {} + mimic-response@3.1.0: {} + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 @@ -3289,15 +4432,67 @@ snapshots: dependencies: brace-expansion: 2.0.1 + minimist@1.2.8: {} + + minipass-collect@1.0.2: + dependencies: + minipass: 3.3.6 + optional: true + + minipass-fetch@1.4.1: + dependencies: + minipass: 3.3.6 + minipass-sized: 1.0.3 + minizlib: 2.1.2 + optionalDependencies: + encoding: 0.1.13 + optional: true + + minipass-flush@1.0.5: + dependencies: + minipass: 3.3.6 + optional: true + + minipass-pipeline@1.2.4: + dependencies: + minipass: 3.3.6 + optional: true + + minipass-sized@1.0.3: + dependencies: + minipass: 3.3.6 + optional: true + + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + + minipass@5.0.0: {} + minipass@7.1.2: {} - mlly@1.7.3: + minizlib@2.1.2: + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + + mkdirp-classic@0.5.3: {} + + mkdirp@1.0.4: {} + + mlly@1.7.4: dependencies: acorn: 8.14.0 - pathe: 1.1.2 - pkg-types: 1.2.1 + pathe: 2.0.2 + pkg-types: 1.3.1 ufo: 1.5.4 + moment-timezone@0.5.46: + dependencies: + moment: 2.30.1 + + moment@2.30.1: {} + ms@2.0.0: {} ms@2.1.3: {} @@ -3306,10 +4501,46 @@ snapshots: nanoid@3.3.8: {} + napi-build-utils@2.0.0: {} + negotiator@0.6.3: {} + negotiator@0.6.4: + optional: true + nice-try@1.0.5: {} + node-abi@3.73.0: + dependencies: + semver: 7.6.3 + + node-addon-api@5.1.0: {} + + node-addon-api@7.1.1: {} + + node-fetch@2.7.0(encoding@0.1.13): + dependencies: + whatwg-url: 5.0.0 + optionalDependencies: + encoding: 0.1.13 + + node-gyp@8.4.1: + dependencies: + env-paths: 2.2.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + make-fetch-happen: 9.1.0 + nopt: 5.0.0 + npmlog: 6.0.2 + rimraf: 3.0.2 + semver: 7.6.3 + tar: 6.2.1 + which: 2.0.2 + transitivePeerDependencies: + - bluebird + - supports-color + optional: true + nodemon@3.1.9: dependencies: chokidar: 3.6.0 @@ -3323,10 +4554,14 @@ snapshots: touch: 3.1.1 undefsafe: 2.0.5 + nopt@5.0.0: + dependencies: + abbrev: 1.1.1 + normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 - resolve: 1.22.9 + resolve: 1.22.10 semver: 5.7.2 validate-npm-package-license: 3.0.4 @@ -3346,6 +4581,21 @@ snapshots: shell-quote: 1.8.2 string.prototype.padend: 3.1.6 + npmlog@5.0.1: + dependencies: + are-we-there-yet: 2.0.0 + console-control-strings: 1.1.0 + gauge: 3.0.2 + set-blocking: 2.0.0 + + npmlog@6.0.2: + dependencies: + are-we-there-yet: 3.0.1 + console-control-strings: 1.1.0 + gauge: 4.0.4 + set-blocking: 2.0.0 + optional: true + nth-check@2.1.1: dependencies: boolbase: 1.0.0 @@ -3356,10 +4606,12 @@ snapshots: object-keys@1.1.1: {} - object.assign@4.1.5: + object.assign@4.1.7: dependencies: call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 + es-object-atoms: 1.1.1 has-symbols: 1.1.0 object-keys: 1.1.1 @@ -3367,6 +4619,21 @@ snapshots: dependencies: ee-first: 1.1.1 + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.2.7 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + + p-map@4.0.0: + dependencies: + aggregate-error: 3.1.0 + optional: true + package-json-from-dist@1.0.1: {} parse-json@4.0.0: @@ -3391,6 +4658,8 @@ snapshots: path-browserify@1.0.1: {} + path-is-absolute@1.0.1: {} + path-key@2.0.1: {} path-key@3.1.1: {} @@ -3408,7 +4677,9 @@ snapshots: dependencies: pify: 3.0.0 - pathe@1.1.2: {} + pathe@2.0.2: {} + + pg-connection-string@2.7.0: {} picocolors@1.1.1: {} @@ -3420,32 +4691,56 @@ snapshots: pify@3.0.0: {} - pinia@2.3.0(typescript@5.7.2)(vue@3.5.13(typescript@5.7.2)): + pinia@2.3.1(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3)): dependencies: '@vue/devtools-api': 6.6.4 - vue: 3.5.13(typescript@5.7.2) - vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.2)) + vue: 3.5.13(typescript@5.7.3) + vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.3)) optionalDependencies: - typescript: 5.7.2 + typescript: 5.7.3 transitivePeerDependencies: - '@vue/composition-api' - pkg-types@1.2.1: + pkg-types@1.3.1: dependencies: confbox: 0.1.8 - mlly: 1.7.3 - pathe: 1.1.2 + mlly: 1.7.4 + pathe: 2.0.2 possible-typed-array-names@1.0.0: {} - postcss@8.4.49: + postcss@8.5.1: dependencies: nanoid: 3.3.8 picocolors: 1.1.1 source-map-js: 1.2.1 + prebuild-install@7.1.3: + dependencies: + detect-libc: 2.0.3 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 2.0.0 + node-abi: 3.73.0 + pump: 3.0.2 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.2 + tunnel-agent: 0.6.0 + prettier@3.4.2: {} + promise-inflight@1.0.1: + optional: true + + promise-retry@2.0.1: + dependencies: + err-code: 2.0.3 + retry: 0.12.0 + optional: true + proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 @@ -3455,6 +4750,11 @@ snapshots: pstree.remy@1.1.8: {} + pump@3.0.2: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + qs@6.13.0: dependencies: side-channel: 1.1.0 @@ -3470,69 +4770,95 @@ snapshots: iconv-lite: 0.4.24 unpipe: 1.0.0 + rc@1.2.8: + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + read-pkg@3.0.0: dependencies: load-json-file: 4.0.0 normalize-package-data: 2.5.0 path-type: 3.0.0 + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + readdirp@3.6.0: dependencies: picomatch: 2.3.1 - reflect.getprototypeof@1.0.8: + readdirp@4.1.1: {} + + reflect.getprototypeof@1.0.10: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - dunder-proto: 1.0.1 - es-abstract: 1.23.6 + es-abstract: 1.23.9 es-errors: 1.3.0 - get-intrinsic: 1.2.6 - gopd: 1.2.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.2.7 + get-proto: 1.0.1 which-builtin-type: 1.2.1 - regexp.prototype.flags@1.5.3: + regexp.prototype.flags@1.5.4: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 set-function-name: 2.0.2 - resolve@1.22.9: + resolve@1.22.10: dependencies: - is-core-module: 2.16.0 + is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + retry-as-promised@7.0.4: {} + + retry@0.12.0: + optional: true + reusify@1.0.4: {} + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + rimraf@5.0.10: dependencies: glob: 10.4.5 - rollup@4.28.1: + rollup@4.31.0: dependencies: '@types/estree': 1.0.6 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.28.1 - '@rollup/rollup-android-arm64': 4.28.1 - '@rollup/rollup-darwin-arm64': 4.28.1 - '@rollup/rollup-darwin-x64': 4.28.1 - '@rollup/rollup-freebsd-arm64': 4.28.1 - '@rollup/rollup-freebsd-x64': 4.28.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.28.1 - '@rollup/rollup-linux-arm-musleabihf': 4.28.1 - '@rollup/rollup-linux-arm64-gnu': 4.28.1 - '@rollup/rollup-linux-arm64-musl': 4.28.1 - '@rollup/rollup-linux-loongarch64-gnu': 4.28.1 - '@rollup/rollup-linux-powerpc64le-gnu': 4.28.1 - '@rollup/rollup-linux-riscv64-gnu': 4.28.1 - '@rollup/rollup-linux-s390x-gnu': 4.28.1 - '@rollup/rollup-linux-x64-gnu': 4.28.1 - '@rollup/rollup-linux-x64-musl': 4.28.1 - '@rollup/rollup-win32-arm64-msvc': 4.28.1 - '@rollup/rollup-win32-ia32-msvc': 4.28.1 - '@rollup/rollup-win32-x64-msvc': 4.28.1 + '@rollup/rollup-android-arm-eabi': 4.31.0 + '@rollup/rollup-android-arm64': 4.31.0 + '@rollup/rollup-darwin-arm64': 4.31.0 + '@rollup/rollup-darwin-x64': 4.31.0 + '@rollup/rollup-freebsd-arm64': 4.31.0 + '@rollup/rollup-freebsd-x64': 4.31.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.31.0 + '@rollup/rollup-linux-arm-musleabihf': 4.31.0 + '@rollup/rollup-linux-arm64-gnu': 4.31.0 + '@rollup/rollup-linux-arm64-musl': 4.31.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.31.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.31.0 + '@rollup/rollup-linux-riscv64-gnu': 4.31.0 + '@rollup/rollup-linux-s390x-gnu': 4.31.0 + '@rollup/rollup-linux-x64-gnu': 4.31.0 + '@rollup/rollup-linux-x64-musl': 4.31.0 + '@rollup/rollup-win32-arm64-msvc': 4.31.0 + '@rollup/rollup-win32-ia32-msvc': 4.31.0 + '@rollup/rollup-win32-x64-msvc': 4.31.0 fsevents: 2.3.3 rss-parser@3.13.0: @@ -3548,12 +4874,17 @@ snapshots: dependencies: call-bind: 1.0.8 call-bound: 1.0.3 - get-intrinsic: 1.2.6 + get-intrinsic: 1.2.7 has-symbols: 1.1.0 isarray: 2.0.5 safe-buffer@5.2.1: {} + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + safe-regex-test@1.1.0: dependencies: call-bound: 1.0.3 @@ -3562,12 +4893,22 @@ snapshots: safer-buffer@2.1.2: {} + sass@1.83.4: + dependencies: + chokidar: 4.0.3 + immutable: 5.0.3 + source-map-js: 1.2.1 + optionalDependencies: + '@parcel/watcher': 2.5.0 + sax@1.4.1: {} scule@1.3.0: {} semver@5.7.2: {} + semver@6.3.1: {} + semver@7.6.3: {} send@0.19.0: @@ -3588,6 +4929,31 @@ snapshots: transitivePeerDependencies: - supports-color + sequelize-pool@7.1.0: {} + + sequelize@6.37.5(sqlite3@5.1.7): + dependencies: + '@types/debug': 4.1.12 + '@types/validator': 13.12.2 + debug: 4.4.0(supports-color@5.5.0) + dottie: 2.0.6 + inflection: 1.13.4 + lodash: 4.17.21 + moment: 2.30.1 + moment-timezone: 0.5.46 + pg-connection-string: 2.7.0 + retry-as-promised: 7.0.4 + semver: 7.6.3 + sequelize-pool: 7.1.0 + toposort-class: 1.0.1 + uuid: 8.3.2 + validator: 13.12.0 + wkx: 0.5.0 + optionalDependencies: + sqlite3: 5.1.7 + transitivePeerDependencies: + - supports-color + serve-static@1.16.2: dependencies: encodeurl: 2.0.0 @@ -3597,12 +4963,14 @@ snapshots: transitivePeerDependencies: - supports-color + set-blocking@2.0.0: {} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.6 + get-intrinsic: 1.2.7 gopd: 1.2.0 has-property-descriptors: 1.0.2 @@ -3613,6 +4981,12 @@ snapshots: functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + setprototypeof@1.2.0: {} shebang-command@1.2.0: @@ -3638,14 +5012,14 @@ snapshots: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.2.6 + get-intrinsic: 1.2.7 object-inspect: 1.13.3 side-channel-weakmap@1.0.2: dependencies: call-bound: 1.0.3 es-errors: 1.3.0 - get-intrinsic: 1.2.6 + get-intrinsic: 1.2.7 object-inspect: 1.13.3 side-channel-map: 1.0.1 @@ -3657,12 +5031,25 @@ snapshots: side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 + signal-exit@3.0.7: {} + signal-exit@4.1.0: {} + simple-concat@1.0.1: {} + + simple-get@4.0.1: + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + simple-update-notifier@2.0.0: dependencies: semver: 7.6.3 + smart-buffer@4.2.0: + optional: true + socket.io-adapter@2.5.5: dependencies: debug: 4.3.7 @@ -3704,21 +5091,56 @@ snapshots: - supports-color - utf-8-validate + socks-proxy-agent@6.2.1: + dependencies: + agent-base: 6.0.2 + debug: 4.4.0(supports-color@5.5.0) + socks: 2.8.3 + transitivePeerDependencies: + - supports-color + optional: true + + socks@2.8.3: + dependencies: + ip-address: 9.0.5 + smart-buffer: 4.2.0 + optional: true + source-map-js@1.2.1: {} spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.20 + spdx-license-ids: 3.0.21 spdx-exceptions@2.5.0: {} spdx-expression-parse@3.0.1: dependencies: spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.20 + spdx-license-ids: 3.0.21 - spdx-license-ids@3.0.20: {} + spdx-license-ids@3.0.21: {} + + sprintf-js@1.1.3: + optional: true + + sqlite3@5.1.7: + dependencies: + bindings: 1.5.0 + node-addon-api: 7.1.1 + prebuild-install: 7.1.3 + tar: 6.2.1 + optionalDependencies: + node-gyp: 8.4.1 + transitivePeerDependencies: + - bluebird + - supports-color + + ssri@8.0.1: + dependencies: + minipass: 3.3.6 + optional: true statuses@2.0.1: {} @@ -3738,8 +5160,8 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.6 - es-object-atoms: 1.0.0 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 string.prototype.trim@1.2.10: dependencies: @@ -3747,8 +5169,8 @@ snapshots: call-bound: 1.0.3 define-data-property: 1.1.4 define-properties: 1.2.1 - es-abstract: 1.23.6 - es-object-atoms: 1.0.0 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 has-property-descriptors: 1.0.2 string.prototype.trimend@1.0.9: @@ -3756,13 +5178,17 @@ snapshots: call-bind: 1.0.8 call-bound: 1.0.3 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 string.prototype.trimstart@1.0.8: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 strip-ansi@6.0.1: dependencies: @@ -3774,6 +5200,8 @@ snapshots: strip-bom@3.0.0: {} + strip-json-comments@2.0.1: {} + strip-literal@2.1.1: dependencies: js-tokens: 9.0.1 @@ -3784,32 +5212,64 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + tar-fs@2.1.2: + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.2 + tar-stream: 2.2.0 + + tar-stream@2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + + tar@6.2.1: + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 toidentifier@1.0.1: {} + toposort-class@1.0.1: {} + touch@3.1.1: {} - ts-node@10.9.2(@types/node@20.17.10)(typescript@5.7.2): + tr46@0.0.3: {} + + ts-node@10.9.2(@types/node@20.17.14)(typescript@5.7.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.17.10 + '@types/node': 20.17.14 acorn: 8.14.0 acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.7.2 + typescript: 5.7.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + tunnel@0.0.6: {} type-is@1.6.18: @@ -3817,47 +5277,47 @@ snapshots: media-typer: 0.3.0 mime-types: 2.1.35 - typed-array-buffer@1.0.2: + typed-array-buffer@1.0.3: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 es-errors: 1.3.0 - is-typed-array: 1.1.13 + is-typed-array: 1.1.15 - typed-array-byte-length@1.0.1: + typed-array-byte-length@1.0.3: dependencies: call-bind: 1.0.8 for-each: 0.3.3 gopd: 1.2.0 has-proto: 1.2.0 - is-typed-array: 1.1.13 + is-typed-array: 1.1.15 - typed-array-byte-offset@1.0.3: + typed-array-byte-offset@1.0.4: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.8 for-each: 0.3.3 gopd: 1.2.0 has-proto: 1.2.0 - is-typed-array: 1.1.13 - reflect.getprototypeof: 1.0.8 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 typed-array-length@1.0.7: dependencies: call-bind: 1.0.8 for-each: 0.3.3 gopd: 1.2.0 - is-typed-array: 1.1.13 + is-typed-array: 1.1.15 possible-typed-array-names: 1.0.0 - reflect.getprototypeof: 1.0.8 + reflect.getprototypeof: 1.0.10 - typescript@5.7.2: {} + typescript@5.7.3: {} ufo@1.5.4: {} unbox-primitive@1.1.0: dependencies: call-bound: 1.0.3 - has-bigints: 1.0.2 + has-bigints: 1.1.0 has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 @@ -3865,70 +5325,84 @@ snapshots: undici-types@6.19.8: {} - undici@6.21.0: {} + undici@6.21.1: {} - unimport@3.14.5(rollup@4.28.1): + unimport@3.14.6(rollup@4.31.0): dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.28.1) + '@rollup/pluginutils': 5.1.4(rollup@4.31.0) acorn: 8.14.0 escape-string-regexp: 5.0.0 estree-walker: 3.0.3 - fast-glob: 3.3.2 - local-pkg: 0.5.1 + fast-glob: 3.3.3 + local-pkg: 1.0.0 magic-string: 0.30.17 - mlly: 1.7.3 - pathe: 1.1.2 + mlly: 1.7.4 + pathe: 2.0.2 picomatch: 4.0.2 - pkg-types: 1.2.1 + pkg-types: 1.3.1 scule: 1.3.0 strip-literal: 2.1.1 - unplugin: 1.16.0 + unplugin: 1.16.1 transitivePeerDependencies: - rollup + unique-filename@1.1.1: + dependencies: + unique-slug: 2.0.2 + optional: true + + unique-slug@2.0.2: + dependencies: + imurmurhash: 0.1.4 + optional: true + unpipe@1.0.0: {} - unplugin-auto-import@0.17.8(@vueuse/core@9.13.0(vue@3.5.13(typescript@5.7.2)))(rollup@4.28.1): + unplugin-auto-import@0.17.8(@vueuse/core@9.13.0(vue@3.5.13(typescript@5.7.3)))(rollup@4.31.0): dependencies: '@antfu/utils': 0.7.10 - '@rollup/pluginutils': 5.1.4(rollup@4.28.1) - fast-glob: 3.3.2 + '@rollup/pluginutils': 5.1.4(rollup@4.31.0) + fast-glob: 3.3.3 local-pkg: 0.5.1 magic-string: 0.30.17 minimatch: 9.0.5 - unimport: 3.14.5(rollup@4.28.1) - unplugin: 1.16.0 + unimport: 3.14.6(rollup@4.31.0) + unplugin: 1.16.1 optionalDependencies: - '@vueuse/core': 9.13.0(vue@3.5.13(typescript@5.7.2)) + '@vueuse/core': 9.13.0(vue@3.5.13(typescript@5.7.3)) transitivePeerDependencies: - rollup - unplugin-vue-components@0.26.0(@babel/parser@7.26.3)(rollup@4.28.1)(vue@3.5.13(typescript@5.7.2)): + unplugin-vue-components@0.26.0(@babel/parser@7.26.5)(rollup@4.31.0)(vue@3.5.13(typescript@5.7.3)): dependencies: '@antfu/utils': 0.7.10 - '@rollup/pluginutils': 5.1.4(rollup@4.28.1) + '@rollup/pluginutils': 5.1.4(rollup@4.31.0) chokidar: 3.6.0 debug: 4.4.0(supports-color@5.5.0) - fast-glob: 3.3.2 + fast-glob: 3.3.3 local-pkg: 0.4.3 magic-string: 0.30.17 minimatch: 9.0.5 - resolve: 1.22.9 - unplugin: 1.16.0 - vue: 3.5.13(typescript@5.7.2) + resolve: 1.22.10 + unplugin: 1.16.1 + vue: 3.5.13(typescript@5.7.3) optionalDependencies: - '@babel/parser': 7.26.3 + '@babel/parser': 7.26.5 transitivePeerDependencies: - rollup - supports-color - unplugin@1.16.0: + unplugin@1.16.1: dependencies: acorn: 8.14.0 webpack-virtual-modules: 0.6.2 + util-deprecate@1.0.2: {} + utils-merge@1.0.1: {} + uuid@8.3.2: {} + v8-compile-cache-lib@3.0.1: {} validate-npm-package-license@3.0.4: @@ -3936,44 +5410,48 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 + validator@13.12.0: {} + vary@1.1.2: {} - vite@5.4.11(@types/node@20.17.10): + vite@5.4.14(@types/node@20.17.14)(sass@1.83.4): dependencies: esbuild: 0.21.5 - postcss: 8.4.49 - rollup: 4.28.1 + postcss: 8.5.1 + rollup: 4.31.0 optionalDependencies: - '@types/node': 20.17.10 + '@types/node': 20.17.14 fsevents: 2.3.3 + sass: 1.83.4 vscode-uri@3.0.8: {} - vue-demi@0.14.10(vue@3.5.13(typescript@5.7.2)): + vue-demi@0.14.10(vue@3.5.13(typescript@5.7.3)): dependencies: - vue: 3.5.13(typescript@5.7.2) + vue: 3.5.13(typescript@5.7.3) - vue-router@4.5.0(vue@3.5.13(typescript@5.7.2)): + vue-router@4.5.0(vue@3.5.13(typescript@5.7.3)): dependencies: '@vue/devtools-api': 6.6.4 - vue: 3.5.13(typescript@5.7.2) + vue: 3.5.13(typescript@5.7.3) - vue-tsc@2.1.10(typescript@5.7.2): + vue-tsc@2.2.0(typescript@5.7.3): dependencies: '@volar/typescript': 2.4.11 - '@vue/language-core': 2.1.10(typescript@5.7.2) - semver: 7.6.3 - typescript: 5.7.2 + '@vue/language-core': 2.2.0(typescript@5.7.3) + typescript: 5.7.3 - vue@3.5.13(typescript@5.7.2): + vue@3.5.13(typescript@5.7.3): dependencies: '@vue/compiler-dom': 3.5.13 '@vue/compiler-sfc': 3.5.13 '@vue/runtime-dom': 3.5.13 - '@vue/server-renderer': 3.5.13(vue@3.5.13(typescript@5.7.2)) + '@vue/server-renderer': 3.5.13(vue@3.5.13(typescript@5.7.3)) '@vue/shared': 3.5.13 optionalDependencies: - typescript: 5.7.2 + typescript: 5.7.3 + + webidl-conversions@3.0.1: {} webpack-virtual-modules@0.6.2: {} @@ -3983,6 +5461,11 @@ snapshots: whatwg-mimetype@4.0.0: {} + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 @@ -3994,30 +5477,31 @@ snapshots: which-builtin-type@1.2.1: dependencies: call-bound: 1.0.3 - function.prototype.name: 1.1.7 + function.prototype.name: 1.1.8 has-tostringtag: 1.0.2 - is-async-function: 2.0.0 + is-async-function: 2.1.0 is-date-object: 1.1.0 - is-finalizationregistry: 1.1.0 - is-generator-function: 1.0.10 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.0 is-regex: 1.2.1 is-weakref: 1.1.0 isarray: 2.0.5 which-boxed-primitive: 1.1.1 which-collection: 1.0.2 - which-typed-array: 1.1.16 + which-typed-array: 1.1.18 which-collection@1.0.2: dependencies: is-map: 2.0.3 is-set: 2.0.3 is-weakmap: 2.0.2 - is-weakset: 2.0.3 + is-weakset: 2.0.4 - which-typed-array@1.1.16: + which-typed-array@1.1.18: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.8 + call-bound: 1.0.3 for-each: 0.3.3 gopd: 1.2.0 has-tostringtag: 1.0.2 @@ -4030,6 +5514,14 @@ snapshots: dependencies: isexe: 2.0.0 + wide-align@1.1.5: + dependencies: + string-width: 4.2.3 + + wkx@0.5.0: + dependencies: + '@types/node': 20.17.14 + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -4042,6 +5534,8 @@ snapshots: string-width: 5.1.2 strip-ansi: 7.1.0 + wrappy@1.0.2: {} + ws@8.17.1: {} xml2js@0.5.0: @@ -4053,4 +5547,6 @@ snapshots: xmlhttprequest-ssl@2.1.2: {} + yallist@4.0.0: {} + yn@3.1.1: {}