diff --git a/README.md b/README.md index b426919..5110a6c 100644 --- a/README.md +++ b/README.md @@ -1,188 +1,278 @@ # Winupdate Neo -这是使用 Next.js + Prisma + PostgreSQL 重写的 Winupdate 项目的 API 部分。 +一个基于 Next.js + Prisma + MinIO 的“主机截图与版本分发平台”。用于接收客户端上报的屏幕截图与窗口信息,保存到对象存储;配套 Web UI 浏览、检索与收藏记录,并提供将一段时间内的截图压制为视频的能力。同时支持客户端版本文件的上传与分发,以及主机浏览器凭据(含历史密码)入库与查询。 + +## 功能一览 + +- 主机与记录 + - 接收主机上报的多张截图与窗口信息,自动建档并存储 + - 按主机、时间范围检索记录;星标记录管理与分页 + - 小时维度“活跃度”时间分布统计 +- 媒体处理与下载 + - 截图以 AV1(.avif)压缩后存入 MinIO + - 将一段时间内的截图转码为 MP4(SVT-AV1 编码)供下载 + - 文件直链下载(版本文件/截图等) +- 凭据采集 + - 上报主机浏览器凭据(含历史密码版本),去重合并保存 +- 版本分发 + - 上传客户端新版本(.exe),自动生成校验和与下载地址,并标记最新 + - 查询最新版本信息与下载链接 +- 计划任务与通知 + - node-cron 定时任务管理(示例:整点任务、每日清理)与前端管理页 /tasks + - 可选 QQ 机器人 WebHook 推送“主机上线/离线”等通知 +- 安全与访问控制 + - 页面侧(非 API)支持 Basic Auth;API 默认允许跨域(withCors) ## 技术栈 -- **前端框架**: Next.js 15 -- **数据库**: PostgreSQL + Prisma ORM -- **包管理器**: Bun -- **文件存储**: MinIO(替代 GridFS) -- **语言**: TypeScript +- Next.js 15 + React 19 + TypeScript +- Prisma 6(PostgreSQL) +- MinIO(S3 兼容对象存储) +- node-cron 定时任务 +- Tailwind CSS v4 +- 运行与进程管理:Bun、PM2 +- 媒体处理:FFmpeg(libsvtav1) -## 项目结构 +## 目录结构(节选) ``` app/ -├── api/ # API 路由 -│ ├── hosts/ -│ │ ├── route.ts # 主机列表 API -│ │ └── [hostname]/ -│ │ ├── screenshots/ -│ │ │ └── route.ts # 截图上传/获取 API -│ │ ├── credentials/ -│ │ │ └── route.ts # 凭据管理 API -│ │ └── time-distribution/ -│ │ └── route.ts # 时间分布统计 API -│ ├── screenshots/ -│ │ └── [fileId]/ -│ │ └── route.ts # 截图文件服务 API -│ ├── downloads/ -│ │ └── [fileId]/ -│ │ └── route.ts # 文件下载 API -│ ├── version/ -│ │ └── route.ts # 版本信息 API -│ └── upload/ -│ └── version/ -│ └── route.ts # 版本上传 API -├── api-test/ # API 测试页面 -└── ... # 其他 Next.js 文件 - + hosts/ + route.ts # 主机列表 API(GET) + [hostname]/ + page.tsx # 主机详情页(UI) + credentials/route.ts # 凭据:GET/POST + screenshots/route.ts # 截图:GET(查询)/POST(上传) + starred/route.ts # 星标记录:GET(分页)/POST(批量标记) + time-distribution/route.ts# 小时分布统计 + downloads/[fileId]/route.ts # 文件下载(版本、nssm) + screenshots/[fileId]/route.ts # 截图文件回源 + api/ + tasks/route.ts # 计划任务状态/控制 + generate/video/route.ts # 按时间段合成视频(MP4) + version/route.ts # 获取最新版本(API 变体) + version/route.ts # 获取最新版本(App 路由变体) lib/ -├── prisma.ts # Prisma 客户端配置 -├── config.ts # 应用配置 -├── fileStorage.ts # 文件存储工具 -├── middleware.ts # 中间件工具 -└── push.ts # 推送通知工具 - + prisma.ts # PrismaClient 单例 + config.ts # 端口与 Basic Auth 配置 + middleware.ts # withAuth / withCors 辅助 + fileStorage.ts # MinIO 存储封装(put/get/delete/stat) + minioClient.ts # MinIO 客户端与初始化 + encodeVideo.ts # 图片压制为 AV1 视频 + scheduler.ts / init-scheduler.ts # 定时任务注册 + push/qq.ts # QQ Bot 推送 prisma/ -├── schema.prisma # 数据库模式 -└── migrations/ # 数据库迁移文件 + schema.prisma # 数据模型 +pm2.config.js # PM2 生产运行配置 +middleware.ts # Next 中间件:页面 Basic Auth ``` -## 快速开始 +## 前置依赖 -### 1. 安装依赖 +- Node.js 18+(推荐 20+) +- Bun(推荐,仓库包含 bun.lock) +- PostgreSQL 数据库 +- MinIO(或任意 S3 兼容对象存储) +- FFmpeg(需包含 libsvtav1 编码器) + +## 环境变量 + +在项目根目录创建 .env(生产环境同样需要): + +``` +# Server +PORT=3000 +NODE_ENV=development + +# Basic Auth(仅页面侧使用,API 默认不校验) +AUTH_USERNAME=admin +AUTH_PASSWORD=password + +# Database(PostgreSQL) +DATABASE_URL="postgresql://user:pass@localhost:5432/winupdate_neo?schema=public" + +# MinIO / S3 +MINIO_ENDPOINT=127.0.0.1 +MINIO_PORT=9000 +MINIO_USE_SSL=false +MINIO_ACCESS_KEY=your_minio_access_key +MINIO_SECRET_KEY=your_minio_secret_key +MINIO_BUCKET_NAME=winupdate + +# 可选:QQ Bot 推送 +QQ_BOT_URL= +QQ_BOT_TARGET_ID= +``` + +提示:PM2 配置会读取当前目录下的 .env(pm2.config.js 内部使用 dotenv 载入),生产环境注意设置强口令与私密变量。 + +## 安装与运行 + +- 安装依赖 ```bash bun install ``` -### 2. 配置环境变量 - -复制 `.env.example` 文件为 `.env` 并配置相应的设置: +- 生成 Prisma Client 并迁移数据库(开发) ```bash -cp .env.example .env -``` - -配置文件内容示例: - -```env -# Database -DATABASE_URL="postgresql://username:password@localhost:5432/winupdate_neo?schema=public" - -# Auth -AUTH_USERNAME=admin -AUTH_PASSWORD=password - -# Port -PORT=3000 - -# MinIO Configuration -MINIO_ENDPOINT=192.168.5.13 -MINIO_PORT=9000 -MINIO_USE_SSL=false -MINIO_ACCESS_KEY=your_access_key -MINIO_SECRET_KEY=your_secret_key -MINIO_BUCKET_NAME=winupdate -``` - -### 3. 初始化数据库 - -```bash -# 生成 Prisma 客户端 bun run db:generate - -# 运行数据库迁移 bun run db:migrate ``` -### 4. 启动开发服务器 +- 开发运行 ```bash bun run dev ``` -## API 端点 - -### 主机管理 - -- `GET /api/hosts` - 获取主机列表 -- `POST /api/hosts/{hostname}/screenshots` - 上传截图 -- `GET /api/hosts/{hostname}/screenshots` - 获取截图记录 -- `GET /api/hosts/{hostname}/time-distribution` - 获取时间分布统计 - -### 凭据管理 - -- `POST /api/hosts/{hostname}/credentials` - 上传凭据 -- `GET /api/hosts/{hostname}/credentials` - 获取凭据 - -### 文件服务 - -- `GET /api/screenshots/{fileId}` - 获取截图文件 -- `GET /api/downloads/{fileId}` - 下载文件 - -### 版本管理 - -- `GET /api/version` - 获取最新版本信息 -- `POST /api/upload/version` - 上传新版本 - -## 数据库模型 - -### Host -- 主机基本信息(hostname, lastUpdate) - -### Record -- 截图记录(timestamp, windows, screenshots) - -### Window -- 窗口信息(title, path, memory) - -### Screenshot -- 截图文件信息(fileId, filename, monitorName) - -### Credential -- 凭据信息(hostname, username, browser, url, login) - -### Password -- 密码历史(value, timestamp) - -### Version -- 版本信息(version, fileId, checksum, isLatest) - -## 与原项目的区别 - -1. **数据库**: 从 MongoDB 迁移到 PostgreSQL -2. **ORM**: 使用 Prisma 替代 Mongoose -3. **文件存储**: 使用本地文件系统替代 GridFS -4. **框架**: 从 Express 迁移到 Next.js API Routes -5. **包管理**: 使用 Bun 替代 npm/yarn - -## 开发工具 +- 构建与启动(本地/容器) ```bash -# 数据库相关 -bun run db:generate # 生成 Prisma 客户端 -bun run db:migrate # 运行数据库迁移 -bun run db:reset # 重置数据库 -bun run db:studio # 打开 Prisma Studio - -# 开发 -bun run dev # 启动开发服务器 -bun run build # 构建生产版本 -bun run start # 启动生产服务器 -bun run lint # 代码检查 +bun run build +bun run start ``` -## 注意事项 +- 使用 PM2 生产部署(推荐) -1. 文件存储在 MinIO 对象存储中,按分层结构组织 -2. 需要确保 PostgreSQL 数据库和 MinIO 服务正在运行 -3. 所有配置通过环境变量管理,包括数据库、认证和 MinIO 设置 -4. MinIO 需要预先创建对应的 bucket -5. 推送通知功能目前只是控制台日志,可以根据需要集成真实的推送服务 +```bash +# 首次 +pm2 start pm2.config.js +# 查看状态 +pm2 status +# 查看日志 +pm2 logs winupdate-neo --lines 200 +# 更新版本后重启 +pm2 restart winupdate-neo +``` -## API 兼容性 +日志默认输出至 logs/,可在 pm2.config.js 中调整。 -这个重写版本保持了与原始 Express 应用相同的 API 接口,确保客户端代码无需修改即可使用。 +## 数据模型(Prisma) + +- Host:主机,按 hostname 唯一 +- Record:一次上报记录,关联若干 Window 与 Screenshot,支持 isStarred +- Window:窗口信息(title/path/memory),memory 为 BigInt +- Screenshot:截图文件元信息,核心为 objectName(MinIO 对象名) +- Credential:主机-用户-浏览器-URL-Login 唯一,含 lastSyncTime +- Password:凭据的历史密码值(时间序列) +- Version:版本文件元信息(fileId/objectName/checksum/isLatest) +- Nssm:辅助可下载文件的元信息 + +## MinIO 存储约定 + +- 桶名:MINIO_BUCKET_NAME(默认 winupdate) +- 对象路径: + - 截图:screenshots/YYYY/MM/DD/{hostname}/{uuid}.avif + - 版本:versions/YYYY/MM/{uuid}.exe + - 其他:files/YYYY/MM/DD/{uuid} +- 常用元数据: + - Content-Type、X-Original-Filename、X-File-ID、X-Upload-Time、X-File-Type、X-Hostname + +## 核心 API(节选) + +- 主机列表 + - GET /hosts +- 截图上传/查询(按主机) + - POST /hosts/{hostname}/screenshots(multipart/form-data) + - 字段:windows_info(JSON 字符串),screenshot_0..n(文件) + - GET /hosts/{hostname}/screenshots?startTime=...&endTime=... + - 支持 Unix 秒或 ISO 时间,返回 records + windows + screenshots(windows.memory 已转 string) +- 星标记录(按主机) + - GET /hosts/{hostname}/starred?page=1&limit=50 + - POST /hosts/{hostname}/starred + - JSON:{ "action": "star"|"unstar", "recordIds": ["..."] } +- 切换单条记录星标 + - PATCH /api/records/{recordId}/star +- 凭据 + - POST /hosts/{hostname}/credentials(Body 为特殊数组结构,首项形如 ["User", "username"],其后为浏览器项) + - GET /hosts/{hostname}/credentials(包含密码历史,降序) +- 时间分布统计(小时) + - GET /hosts/{hostname}/time-distribution?from=ISO&to=ISO + - 返回:[{ timestamp: 秒, count }...] +- 截图文件 + - GET /screenshots/{fileId} +- 版本文件下载 + - GET /downloads/{fileId} +- 最新版本查询 + - GET /version(App 路由)或 GET /api/version(API 路由),均返回 { version, download_url, checksum } +- 截图合成视频(MP4) + - GET /api/generate/video?hostname=xxx&startTime=unixSec&endTime=unixSec + +跨域:大多数 API 通过 withCors 允许跨域(Access-Control-Allow-Origin: *)。 + +### 示例:上传截图 + +```bash +curl -X POST "http://localhost:3000/hosts/TEST-PC/screenshots" \ + -F "windows_info=[{\"title\":\"Explorer\",\"path\":\"C:/Windows/explorer.exe\",\"memory\":12345}]" \ + -F "screenshot_0=@/path/to/a.png" \ + -F "screenshot_1=@/path/to/b.png" +``` + +### 示例:批量星标 + +```bash +curl -X POST "http://localhost:3000/hosts/TEST-PC/starred" \ + -H "Content-Type: application/json" \ + -d '{"action":"star","recordIds":["rec_xxx","rec_yyy"]}' +``` + +### 示例:生成时间段视频 + +```bash +curl -L "http://localhost:3000/api/generate/video?hostname=TEST-PC&startTime=1751104800&endTime=1751108400" -o out.mp4 +``` + +## 认证与安全 + +- 页面 Basic Auth:根中间件对大多数页面启用基本认证(用户名/密码来自 AUTH_USERNAME/AUTH_PASSWORD)。以下路径跳过认证: + - /api/、/screenshots/、/downloads/、/_next/、/favicon.ico,以及所有 POST 请求等 +- API 跨域:默认允许任意来源(可按需收紧) +- 建议: + - 生产开启 HTTPS + - 使用强口令并限制来源 IP + - 为数据库与对象存储设置最小权限账号 + +## 定时任务 + +- 由 lib/scheduler.ts 定义并在服务端初始化(lib/init-scheduler.ts) +- 已内置: + - 每小时第 30 分执行的示例任务 + - 每日 02:00 清理任务(示例) +- 管理界面:/tasks,可查看状态并启动/停止 +- 通过 /api/tasks 提供状态与控制 API + +## 部署要点(PM2) + +- 确保 .env、数据库与 MinIO 可用 +- FFmpeg 必须包含 libsvtav1(否则截图转码/视频合成会失败) +- 启动:pm2 start pm2.config.js(脚本使用 bun run start,端口默认 12398,可由 .env PORT 覆盖) +- 日志:logs/ 目录 + +## 常见问题(FAQ) + +- MinIO 连接失败 + - 检查 MINIO_ENDPOINT/MINIO_PORT/MINIO_ACCESS_KEY/MINIO_SECRET_KEY + - 确认桶 MINIO_BUCKET_NAME 已存在 +- 截图上传 500/视频生失败 + - 确认 FFmpeg 安装且包含 libsvtav1;服务器有足够的 CPU 与临时磁盘 +- JSON 序列化 BigInt 报错 + - API 层已处理 window.memory 的 BigInt->string,前端请按字符串消费 +- 版本下载 404 + - /downloads/{fileId} 会在 versions 与 nssm 两表中查找,请确认 fileId 与库内记录一致 + +## 开发提示 + +- 新增模型后:更新 prisma/schema.prisma -> bun run db:generate -> bun run db:migrate +- 新增静态/下载接口时:优先只暴露 fileId,后端内部解析为 objectName 再从 MinIO 取文件 +- encodeVideo.ts 的 concat+SVT-AV1 管道对输入图片顺序敏感,注意生成 list.txt 的顺序 + +## 许可 + +未设置许可(License)。如需开源或分发,请在提交前添加合适的 LICENSE 文件。 + +--- + +如需更多部署细节,可参考仓库中的 DEPLOYMENT.md。 diff --git a/app/hosts/[hostname]/page.tsx b/app/hosts/[hostname]/page.tsx index b956b14..bef964e 100644 --- a/app/hosts/[hostname]/page.tsx +++ b/app/hosts/[hostname]/page.tsx @@ -50,7 +50,9 @@ interface Password { } interface Credential { - _id: string; + // 后端有的可能返回 _id,有的可能返回 id,这里都兼容 + _id?: string; + id?: string; hostname: string; username: string; browser: string; @@ -127,6 +129,7 @@ export default function HostDetail() { const [autoPlaySpeed, setAutoPlaySpeed] = useState(100); const [imagesLoadedCount, setImagesLoadedCount] = useState(0); const [imageAspectRatio, setImageAspectRatio] = useState(16 / 9); + const [loadingImageIds, setLoadingImageIds] = useState>(new Set()); const autoPlayTimer = useRef(null); const wheelDeltaAccumulator = useRef(0); @@ -590,6 +593,19 @@ export default function HostDetail() { if (imgEl.naturalHeight !== 0) { setImageAspectRatio(imgEl.naturalWidth / imgEl.naturalHeight); } + setLoadingImageIds(prev => { + const next = new Set(prev); + next.delete(fileId); + return next; + }); + }; + + const onImageError = (fileId: string) => { + setLoadingImageIds(prev => { + const next = new Set(prev); + next.delete(fileId); + return next; + }); }; // 键盘快捷键处理 @@ -709,6 +725,14 @@ export default function HostDetail() { } }, [selectedRecord, records, autoPlay, startAutoPlayTimer]); + useEffect(() => { + if (selectedRecord) { + setLoadingImageIds(new Set(selectedRecord.screenshots.map(s => s.fileId))); + } else { + setLoadingImageIds(new Set()); + } + }, [selectedRecord]); + useEffect(() => { if (autoPlay) { stopAutoPlayTimer(); @@ -879,11 +903,17 @@ export default function HostDetail() { alt={screenshot.monitorName} className="absolute top-0 left-0 w-full h-full object-contain shadow-sm hover:shadow-md transition-shadow" onLoad={(e) => onImageLoad(e, screenshot.fileId)} + onError={() => onImageError(screenshot.fileId)} /> + {loadingImageIds.has(screenshot.fileId) && ( +
+ +
+ )} {/* 图片说明 */} -
+
{screenshot.monitorName}
{new Date(selectedRecord.timestamp).toLocaleString()} @@ -1203,84 +1233,85 @@ export default function HostDetail() { {/* 浏览器凭据列表 */} {expandedBrowsers.includes(`${userGroup.username}-${browser.name}`) && (
- {browser.credentials.map((cred) => ( -
- {/* 凭据网站头部 */} + {browser.credentials.map((cred) => { + // 统一计算凭据唯一 ID(兼容 _id / id),若都不存在,用组合键兜底 + const credentialId = cred._id || cred.id || `${userGroup.username}-${browser.name}-${cred.url}-${cred.login}`; + const isExpanded = expandedCredentials.includes(credentialId); + return (
toggleCredentialExpanded(cred._id)} + key={credentialId} + className="border border-gray-200 dark:border-gray-600 rounded-md overflow-hidden" > -
- -
- {cred.url} + {/* 凭据网站头部 */} +
toggleCredentialExpanded(credentialId)} + > +
+ +
+ {cred.url} +
+
- + + {/* 凭据详情 */} + {isExpanded && ( +
+
+
+ 用户名: + {cred.login} +
+ +
+
+ 密码历史: + + {cred.passwords.length} 条记录 + +
+ +
+ {cred.passwords.map((pwd, pwdIndex) => { + const pwdKey = `${credentialId}-${pwdIndex}`; + const revealed = revealedPasswords.includes(pwdKey); + return ( +
+ + {formatDate(pwd.timestamp, 'short')} + +
+ revealed ? null : revealPassword(pwdKey)} + > + {revealed ? pwd.value : '••••••••'} + + +
+
+ ); + })} +
+
+
+
+ )}
- - {/* 凭据详情 */} - {expandedCredentials.includes(cred._id) && ( -
-
-
- 用户名: - {cred.login} -
- -
-
- 密码历史: - - {cred.passwords.length} 条记录 - -
- -
- {cred.passwords.map((pwd, pwdIndex) => ( -
- - {formatDate(pwd.timestamp, 'short')} - -
- - revealedPasswords.includes(`${cred._id}-${pwdIndex}`) - ? null - : revealPassword(`${cred._id}-${pwdIndex}`) - } - > - {revealedPasswords.includes(`${cred._id}-${pwdIndex}`) - ? pwd.value - : '••••••••' - } - - -
-
- ))} -
-
-
-
- )} -
- ))} + ); + })}
)}
diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..bdd484a --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1990 @@ +{ + "name": "winupdate-neo", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "winupdate-neo", + "version": "0.1.0", + "dependencies": { + "@prisma/client": "^6.10.1", + "@types/bcryptjs": "^3.0.0", + "@types/cors": "^2.8.19", + "@types/fluent-ffmpeg": "^2.1.27", + "@types/minio": "^7.1.1", + "@types/multer": "^1.4.13", + "bcryptjs": "^3.0.2", + "cors": "^2.8.5", + "date-fns": "^4.1.0", + "dotenv-cli": "^8.0.0", + "fluent-ffmpeg": "^2.1.3", + "lucide-react": "^0.525.0", + "minio": "^8.0.5", + "multer": "^2.0.1", + "next": "15.3.4", + "node-cron": "^4.1.1", + "prisma": "^6.10.1", + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@tailwindcss/postcss": "^4", + "@types/node": "^20", + "@types/node-cron": "^3.0.11", + "@types/react": "^19", + "@types/react-dom": "^19", + "tailwindcss": "^4", + "typescript": "^5" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.1.0", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.1.0", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.2", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.1.0" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.2", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.1.0" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@next/env": { + "version": "15.3.4", + "license": "MIT" + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "15.3.4", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "15.3.4", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@prisma/client": { + "version": "6.10.1", + "hasInstallScript": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "peerDependencies": { + "prisma": "*", + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/@prisma/config": { + "version": "6.10.1", + "license": "Apache-2.0", + "dependencies": { + "jiti": "2.4.2" + } + }, + "node_modules/@prisma/debug": { + "version": "6.10.1", + "license": "Apache-2.0" + }, + "node_modules/@prisma/engines": { + "version": "6.10.1", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "6.10.1", + "@prisma/engines-version": "6.10.1-1.9b628578b3b7cae625e8c927178f15a170e74a9c", + "@prisma/fetch-engine": "6.10.1", + "@prisma/get-platform": "6.10.1" + } + }, + "node_modules/@prisma/engines-version": { + "version": "6.10.1-1.9b628578b3b7cae625e8c927178f15a170e74a9c", + "license": "Apache-2.0" + }, + "node_modules/@prisma/fetch-engine": { + "version": "6.10.1", + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "6.10.1", + "@prisma/engines-version": "6.10.1-1.9b628578b3b7cae625e8c927178f15a170e74a9c", + "@prisma/get-platform": "6.10.1" + } + }, + "node_modules/@prisma/get-platform": { + "version": "6.10.1", + "license": "Apache-2.0", + "dependencies": { + "@prisma/debug": "6.10.1" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "license": "Apache-2.0" + }, + "node_modules/@swc/helpers": { + "version": "0.5.15", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.3.0", + "enhanced-resolve": "^5.18.1", + "jiti": "^2.4.2", + "lightningcss": "1.30.1", + "magic-string": "^0.30.17", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.11" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.11", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.4", + "tar": "^7.4.3" + }, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.11", + "@tailwindcss/oxide-darwin-arm64": "4.1.11", + "@tailwindcss/oxide-darwin-x64": "4.1.11", + "@tailwindcss/oxide-freebsd-x64": "4.1.11", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.11", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.11", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.11", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.11", + "@tailwindcss/oxide-linux-x64-musl": "4.1.11", + "@tailwindcss/oxide-wasm32-wasi": "4.1.11", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.11", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.11" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.11", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.11", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.1.11", + "@tailwindcss/oxide": "4.1.11", + "postcss": "^8.4.41", + "tailwindcss": "4.1.11" + } + }, + "node_modules/@types/bcryptjs": { + "version": "3.0.0", + "deprecated": "This is a stub types definition. bcryptjs provides its own type definitions, so you do not need this installed.", + "license": "MIT", + "dependencies": { + "bcryptjs": "*" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cors": { + "version": "2.8.19", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "5.0.3", + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^5.0.0", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.0.6", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/fluent-ffmpeg": { + "version": "2.1.27", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "license": "MIT" + }, + "node_modules/@types/minio": { + "version": "7.1.1", + "deprecated": "This is a stub types definition. minio provides its own type definitions, so you do not need this installed.", + "license": "MIT", + "dependencies": { + "minio": "*" + } + }, + "node_modules/@types/multer": { + "version": "1.4.13", + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/node": { + "version": "20.19.1", + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/node-cron": { + "version": "3.0.11", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/qs": { + "version": "6.14.0", + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.1.8", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.1.6", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.0.0" + } + }, + "node_modules/@types/send": { + "version": "0.17.5", + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.8", + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@zxing/text-encoding": { + "version": "0.9.0", + "license": "(Unlicense OR Apache-2.0)", + "optional": true + }, + "node_modules/append-field": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/async": { + "version": "0.2.10" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/bcryptjs": { + "version": "3.0.2", + "license": "BSD-3-Clause", + "bin": { + "bcrypt": "bin/bcrypt" + } + }, + "node_modules/block-stream2": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "readable-stream": "^3.4.0" + } + }, + "node_modules/browser-or-node": { + "version": "2.1.1", + "license": "MIT" + }, + "node_modules/buffer-crc32": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "license": "MIT" + }, + "node_modules/busboy": { + "version": "1.6.0", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001726", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chownr": { + "version": "3.0.0", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/client-only": { + "version": "0.0.1", + "license": "MIT" + }, + "node_modules/color": { + "version": "4.2.3", + "license": "MIT", + "optional": true, + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.9.0" + }, + "engines": { + "node": ">=12.5.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "license": "MIT", + "optional": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "license": "MIT", + "optional": true + }, + "node_modules/color-string": { + "version": "1.9.1", + "license": "MIT", + "optional": true, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/concat-stream": { + "version": "2.0.0", + "engines": [ + "node >= 6.0" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/cors": { + "version": "2.8.5", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/date-fns": { + "version": "4.1.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/detect-libc": { + "version": "2.0.4", + "devOptional": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/dotenv": { + "version": "16.6.1", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dotenv-cli": { + "version": "8.0.0", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.6", + "dotenv": "^16.3.0", + "dotenv-expand": "^10.0.0", + "minimist": "^1.2.6" + }, + "bin": { + "dotenv": "cli.js" + } + }, + "node_modules/dotenv-expand": { + "version": "10.0.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.18.2", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "license": "MIT" + }, + "node_modules/fast-xml-parser": { + "version": "4.5.3", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "strnum": "^1.1.1" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/filter-obj": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fluent-ffmpeg": { + "version": "2.1.3", + "license": "MIT", + "dependencies": { + "async": "^0.2.9", + "which": "^1.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "dev": true, + "license": "ISC" + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "license": "ISC" + }, + "node_modules/ipaddr.js": { + "version": "2.2.0", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-arguments": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "license": "MIT", + "optional": true + }, + "node_modules/is-callable": { + "version": "1.2.7", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "license": "ISC" + }, + "node_modules/jiti": { + "version": "2.4.2", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/lightningcss": { + "version": "1.30.1", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.30.1", + "lightningcss-darwin-x64": "1.30.1", + "lightningcss-freebsd-x64": "1.30.1", + "lightningcss-linux-arm-gnueabihf": "1.30.1", + "lightningcss-linux-arm64-gnu": "1.30.1", + "lightningcss-linux-arm64-musl": "1.30.1", + "lightningcss-linux-x64-gnu": "1.30.1", + "lightningcss-linux-x64-musl": "1.30.1", + "lightningcss-win32-arm64-msvc": "1.30.1", + "lightningcss-win32-x64-msvc": "1.30.1" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.1", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.1", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "license": "MIT" + }, + "node_modules/lucide-react": { + "version": "0.525.0", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/magic-string": { + "version": "0.30.17", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minio": { + "version": "8.0.5", + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.4", + "block-stream2": "^2.1.0", + "browser-or-node": "^2.1.1", + "buffer-crc32": "^1.0.0", + "eventemitter3": "^5.0.1", + "fast-xml-parser": "^4.4.1", + "ipaddr.js": "^2.0.1", + "lodash": "^4.17.21", + "mime-types": "^2.1.35", + "query-string": "^7.1.3", + "stream-json": "^1.8.0", + "through2": "^4.0.2", + "web-encoding": "^1.1.5", + "xml2js": "^0.5.0 || ^0.6.2" + }, + "engines": { + "node": "^16 || ^18 || >=20" + } + }, + "node_modules/minio/node_modules/async": { + "version": "3.2.6", + "license": "MIT" + }, + "node_modules/minipass": { + "version": "7.1.2", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/multer": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "append-field": "^1.0.0", + "busboy": "^1.6.0", + "concat-stream": "^2.0.0", + "mkdirp": "^0.5.6", + "object-assign": "^4.1.1", + "type-is": "^1.6.18", + "xtend": "^4.0.2" + }, + "engines": { + "node": ">= 10.16.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/next": { + "version": "15.3.4", + "license": "MIT", + "dependencies": { + "@next/env": "15.3.4", + "@swc/counter": "0.1.3", + "@swc/helpers": "0.5.15", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001579", + "postcss": "8.4.31", + "styled-jsx": "5.1.6" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "15.3.4", + "@next/swc-darwin-x64": "15.3.4", + "@next/swc-linux-arm64-gnu": "15.3.4", + "@next/swc-linux-arm64-musl": "15.3.4", + "@next/swc-linux-x64-gnu": "15.3.4", + "@next/swc-linux-x64-musl": "15.3.4", + "@next/swc-win32-arm64-msvc": "15.3.4", + "@next/swc-win32-x64-msvc": "15.3.4", + "sharp": "^0.34.1" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.41.2", + "babel-plugin-react-compiler": "*", + "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/next/node_modules/postcss": { + "version": "8.4.31", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/node-cron": { + "version": "4.1.1", + "license": "ISC", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "license": "ISC" + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prisma": { + "version": "6.10.1", + "hasInstallScript": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@prisma/config": "6.10.1", + "@prisma/engines": "6.10.1" + }, + "bin": { + "prisma": "build/index.js" + }, + "engines": { + "node": ">=18.18" + }, + "peerDependencies": { + "typescript": ">=5.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/query-string": { + "version": "7.1.3", + "license": "MIT", + "dependencies": { + "decode-uri-component": "^0.2.2", + "filter-obj": "^1.1.0", + "split-on-first": "^1.0.0", + "strict-uri-encode": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react": { + "version": "19.1.0", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.1.0", + "license": "MIT", + "peer": true, + "dependencies": { + "scheduler": "^0.26.0" + }, + "peerDependencies": { + "react": "^19.1.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sax": { + "version": "1.4.1", + "license": "ISC" + }, + "node_modules/scheduler": { + "version": "0.26.0", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.2", + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/sharp": { + "version": "0.34.2", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "color": "^4.2.3", + "detect-libc": "^2.0.4", + "semver": "^7.7.2" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.2", + "@img/sharp-darwin-x64": "0.34.2", + "@img/sharp-libvips-darwin-arm64": "1.1.0", + "@img/sharp-libvips-darwin-x64": "1.1.0", + "@img/sharp-libvips-linux-arm": "1.1.0", + "@img/sharp-libvips-linux-arm64": "1.1.0", + "@img/sharp-libvips-linux-ppc64": "1.1.0", + "@img/sharp-libvips-linux-s390x": "1.1.0", + "@img/sharp-libvips-linux-x64": "1.1.0", + "@img/sharp-libvips-linuxmusl-arm64": "1.1.0", + "@img/sharp-libvips-linuxmusl-x64": "1.1.0", + "@img/sharp-linux-arm": "0.34.2", + "@img/sharp-linux-arm64": "0.34.2", + "@img/sharp-linux-s390x": "0.34.2", + "@img/sharp-linux-x64": "0.34.2", + "@img/sharp-linuxmusl-arm64": "0.34.2", + "@img/sharp-linuxmusl-x64": "0.34.2", + "@img/sharp-wasm32": "0.34.2", + "@img/sharp-win32-arm64": "0.34.2", + "@img/sharp-win32-ia32": "0.34.2", + "@img/sharp-win32-x64": "0.34.2" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "license": "MIT", + "optional": true, + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-on-first": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/stream-chain": { + "version": "2.2.5", + "license": "BSD-3-Clause" + }, + "node_modules/stream-json": { + "version": "1.9.1", + "license": "BSD-3-Clause", + "dependencies": { + "stream-chain": "^2.2.5" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/strict-uri-encode": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/strnum": { + "version": "1.1.2", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, + "node_modules/styled-jsx": { + "version": "5.1.6", + "license": "MIT", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/tailwindcss": { + "version": "4.1.11", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.2.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "7.4.3", + "dev": true, + "license": "ISC", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/through2": { + "version": "4.0.2", + "license": "MIT", + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "license": "0BSD" + }, + "node_modules/type-is": { + "version": "1.6.18", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "license": "MIT" + }, + "node_modules/typescript": { + "version": "5.8.3", + "devOptional": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "license": "MIT" + }, + "node_modules/util": { + "version": "0.12.5", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/vary": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/web-encoding": { + "version": "1.1.5", + "license": "MIT", + "dependencies": { + "util": "^0.12.3" + }, + "optionalDependencies": { + "@zxing/text-encoding": "0.9.0" + } + }, + "node_modules/which": { + "version": "1.3.1", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/xml2js": { + "version": "0.6.2", + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/yallist": { + "version": "5.0.0", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "15.3.4", + "resolved": "https://registry.npmmirror.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.3.4.tgz", + "integrity": "sha512-z0qIYTONmPRbwHWvpyrFXJd5F9YWLCsw3Sjrzj2ZvMYy9NPQMPZ1NjOJh4ojr4oQzcGYwgJKfidzehaNa1BpEg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "15.3.4", + "resolved": "https://registry.npmmirror.com/@next/swc-darwin-x64/-/swc-darwin-x64-15.3.4.tgz", + "integrity": "sha512-Z0FYJM8lritw5Wq+vpHYuCIzIlEMjewG2aRkc3Hi2rcbULknYL/xqfpBL23jQnCSrDUGAo/AEv0Z+s2bff9Zkw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "15.3.4", + "resolved": "https://registry.npmmirror.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.3.4.tgz", + "integrity": "sha512-l8ZQOCCg7adwmsnFm8m5q9eIPAHdaB2F3cxhufYtVo84pymwKuWfpYTKcUiFcutJdp9xGHC+F1Uq3xnFU1B/7g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "15.3.4", + "resolved": "https://registry.npmmirror.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.3.4.tgz", + "integrity": "sha512-wFyZ7X470YJQtpKot4xCY3gpdn8lE9nTlldG07/kJYexCUpX1piX+MBfZdvulo+t1yADFVEuzFfVHfklfEx8kw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "15.3.4", + "resolved": "https://registry.npmmirror.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.3.4.tgz", + "integrity": "sha512-ay5+qADDN3rwRbRpEhTOreOn1OyJIXS60tg9WMYTWCy3fB6rGoyjLVxc4dR9PYjEdR2iDYsaF5h03NA+XuYPQQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "15.3.4", + "resolved": "https://registry.npmmirror.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.3.4.tgz", + "integrity": "sha512-4kDt31Bc9DGyYs41FTL1/kNpDeHyha2TC0j5sRRoKCyrhNcfZ/nRQkAUlF27mETwm8QyHqIjHJitfcza2Iykfg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + } + } +}