From 88fa136ad7853ec123e502f9c5f28e2777f56ab8 Mon Sep 17 00:00:00 2001 From: qikongjian Date: Mon, 29 Sep 2025 10:48:25 +0800 Subject: [PATCH 01/16] =?UTF-8?q?=E6=89=B9=E9=87=8F=E5=A4=84=E7=90=86?= =?UTF-8?q?=E6=9C=AA=E5=89=AA=E8=BE=91=E7=9A=84=E8=A7=86=E9=A2=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/README.md | 309 ++++++++++ scripts/batch-export.js | 606 ++++++++++++++++++++ scripts/projects.example.txt | 74 +++ test-output/batch-report-1759072351624.json | 27 + 4 files changed, 1016 insertions(+) create mode 100644 scripts/README.md create mode 100644 scripts/batch-export.js create mode 100644 scripts/projects.example.txt create mode 100644 test-output/batch-report-1759072351624.json diff --git a/scripts/README.md b/scripts/README.md new file mode 100644 index 0000000..507c230 --- /dev/null +++ b/scripts/README.md @@ -0,0 +1,309 @@ +# 批量视频导出脚本 + +这个脚本用于批量处理项目ID,生成剪辑计划并调用导出接口,实现自动化的视频处理流程。 + +## 功能特性 + +- ✅ 批量处理多个项目ID +- ✅ 自动生成剪辑计划(调用 `/edit-plan/generate-by-project` 接口) +- ✅ 自动调用导出接口(调用 `/api/export/stream` 接口) +- ✅ 支持并发处理,提高效率 +- ✅ 完整的错误处理和重试机制 +- ✅ 实时进度跟踪和日志记录 +- ✅ 生成详细的处理报告 +- ✅ 支持从命令行或文件读取项目ID + +## 文件说明 + +- `batch-export.js` - JavaScript版本的主脚本(推荐使用) +- `batch-video-export.ts` - TypeScript版本的主脚本 +- `batch-config.example.env` - 配置文件示例 +- `projects.example.txt` - 项目ID列表文件示例 + +## 快速开始 + +### 1. 配置环境变量 + +复制配置文件并填入实际值: + +```bash +cp scripts/batch-config.example.env scripts/batch-config.env +``` + +编辑 `batch-config.env` 文件: + +```env +# API配置 +API_BASE_URL=https://your-api-domain.com +AUTH_TOKEN=your-actual-auth-token +USER_ID=your-actual-user-id + +# 处理配置 +CONCURRENCY=3 # 并发处理数量 +MAX_RETRIES=3 # 最大重试次数 +RETRY_DELAY=5000 # 重试间隔(毫秒) + +# 导出配置 +EXPORT_QUALITY=standard # 导出质量: standard | high | ultra + +# 输出配置 +OUTPUT_DIR=./batch-export-output # 输出目录 +``` + +### 2. 准备项目ID列表 + +**方法一:命令行参数** +```bash +node scripts/batch-export.js --projects "project-001,project-002,project-003" +``` + +**方法二:文件列表** + +创建项目ID文件: +```bash +cp scripts/projects.example.txt scripts/projects.txt +``` + +编辑 `projects.txt` 文件: +```text +project-001 +project-002 +project-003 +project-004 +# project-005 # 注释行会被忽略 +``` + +然后运行: +```bash +node scripts/batch-export.js --file scripts/projects.txt +``` + +### 3. 运行脚本 + +加载环境变量并运行: + +```bash +# 加载配置文件 +source scripts/batch-config.env + +# 运行脚本 +node scripts/batch-export.js --projects "project-001,project-002" +``` + +或者一次性运行: + +```bash +API_BASE_URL=https://your-api.com AUTH_TOKEN=your-token node scripts/batch-export.js --projects "project-001,project-002" +``` + +## 使用方法 + +### 命令行选项 + +```bash +# 使用项目ID参数 +node scripts/batch-export.js --projects "id1,id2,id3" + +# 使用文件列表 +node scripts/batch-export.js --file projects.txt +``` + +### 环境变量配置 + +| 变量名 | 说明 | 默认值 | 必填 | +|--------|------|--------|------| +| `API_BASE_URL` | API基础URL | - | ✅ | +| `AUTH_TOKEN` | 认证Token | - | ✅ | +| `USER_ID` | 用户ID | - | ✅ | +| `CONCURRENCY` | 并发处理数量 | 3 | ❌ | +| `MAX_RETRIES` | 最大重试次数 | 3 | ❌ | +| `RETRY_DELAY` | 重试间隔(毫秒) | 5000 | ❌ | +| `EXPORT_QUALITY` | 导出质量 | standard | ❌ | +| `OUTPUT_DIR` | 输出目录 | ./batch-export-output | ❌ | + +## 工作流程 + +脚本会按以下步骤处理每个项目: + +1. **生成剪辑计划** + - 调用 `/edit-plan/generate-by-project` 接口 + - 支持自动重试(最多10分钟,8秒间隔) + - 等待剪辑计划生成完成 + +2. **构建导出请求** + - 解析剪辑计划中的时间线信息 + - 构建符合API规范的导出请求数据 + - 包含视频片段、字幕、转场等信息 + +3. **调用导出接口** + - 调用 `/api/export/stream` 流式导出接口 + - 实时处理SSE事件流 + - 监控导出进度 + +4. **轮询导出状态** + - 如果SSE未返回完整结果,自动轮询进度 + - 调用 `/api/export/task/{taskId}/progress` 接口 + - 等待导出完成并获取视频URL + +## 输出文件 + +脚本运行后会在输出目录生成以下文件: + +- `batch-export-{timestamp}.log` - 详细日志文件 +- `batch-report-{timestamp}.json` - 处理结果报告 + +### 报告格式示例 + +```json +{ + "timestamp": "2023-12-07T10:30:00.000Z", + "config": { + "concurrency": 3, + "maxRetries": 3, + "exportQuality": "standard" + }, + "results": { + "total": 5, + "completed": 4, + "failed": 1, + "errors": [ + { + "projectId": "project-005", + "error": "剪辑计划生成失败" + } + ] + }, + "projects": [ + { + "projectId": "project-001", + "status": "completed", + "videoUrl": "https://example.com/video1.mp4", + "duration": 125.5 + } + ] +} +``` + +## 错误处理 + +脚本包含完善的错误处理机制: + +### 自动重试 +- 剪辑计划生成失败:最多重试10分钟 +- 导出接口调用失败:根据配置重试 +- 网络错误:自动重试 + +### 错误类型 +- **剪辑计划生成失败**:API返回错误或超时 +- **导出接口错误**:请求格式错误或服务器错误 +- **网络连接错误**:网络不稳定或服务不可用 +- **认证错误**:Token无效或过期 + +### 故障恢复 +- 单个项目失败不影响其他项目处理 +- 详细错误日志帮助定位问题 +- 支持断点续传(可以只处理失败的项目) + +## 性能优化 + +### 并发控制 +- 默认并发数为3,可根据服务器性能调整 +- 避免同时处理太多项目导致服务器压力 + +### 内存管理 +- 流式处理SSE响应,避免内存积累 +- 及时释放不需要的数据 + +### 网络优化 +- 合理的重试间隔,避免频繁请求 +- 长连接处理SSE流 + +## 故障排除 + +### 常见问题 + +1. **认证失败** + ``` + 错误:HTTP 401: Unauthorized + 解决:检查 AUTH_TOKEN 是否正确 + ``` + +2. **API地址错误** + ``` + 错误:ENOTFOUND your-api-domain.com + 解决:检查 API_BASE_URL 是否正确 + ``` + +3. **剪辑计划生成超时** + ``` + 错误:获取剪辑计划超时,已重试75次 + 解决:检查项目状态,可能需要更长等待时间 + ``` + +4. **Node.js版本问题** + ``` + 错误:fetch is not defined + 解决:升级到 Node.js 18+ 或安装 node-fetch + ``` + +### 调试技巧 + +1. **查看详细日志** + ```bash + tail -f batch-export-output/batch-export-*.log + ``` + +2. **测试单个项目** + ```bash + node scripts/batch-export.js --projects "single-project-id" + ``` + +3. **检查API连通性** + ```bash + curl -H "Authorization: Bearer $AUTH_TOKEN" $API_BASE_URL/health + ``` + +## 高级用法 + +### 自定义配置 + +可以通过修改脚本中的配置对象来自定义更多选项: + +```javascript +const config = { + apiBaseUrl: process.env.API_BASE_URL, + token: process.env.AUTH_TOKEN, + // 自定义超时时间 + requestTimeout: 30000, + // 自定义User-Agent + userAgent: 'BatchVideoExporter/1.0', + // 其他配置... +}; +``` + +### 集成到CI/CD + +可以将脚本集成到自动化流程中: + +```yaml +# GitHub Actions 示例 +- name: Batch Export Videos + env: + API_BASE_URL: ${{ secrets.API_BASE_URL }} + AUTH_TOKEN: ${{ secrets.AUTH_TOKEN }} + USER_ID: ${{ secrets.USER_ID }} + run: | + node scripts/batch-export.js --file projects.txt +``` + +## 注意事项 + +1. **资源使用**:批量处理会消耗较多服务器资源,建议在低峰期运行 +2. **网络稳定性**:确保网络连接稳定,避免长时间处理中断 +3. **存储空间**:确保有足够的存储空间保存日志和报告文件 +4. **API限制**:注意API的调用频率限制,避免被限流 +5. **数据备份**:重要项目建议先备份,避免处理过程中数据丢失 + +## 许可证 + +MIT License diff --git a/scripts/batch-export.js b/scripts/batch-export.js new file mode 100644 index 0000000..1bbf8dc --- /dev/null +++ b/scripts/batch-export.js @@ -0,0 +1,606 @@ +#!/usr/bin/env node +/** + * 批量视频导出脚本 - JavaScript版本 + * 用于批量处理项目ID,生成剪辑计划并调用导出接口 + * + * 使用方法: + * node scripts/batch-export.js --projects "project1,project2,project3" + * 或者 + * node scripts/batch-export.js --file projects.txt + */ + +const fs = require('fs'); +const path = require('path'); +const https = require('https'); +const http = require('http'); + +/** + * 批量视频导出处理器 + */ +class BatchVideoExporter { + constructor(config) { + this.config = config; + this.projectStatuses = new Map(); + this.logFile = path.join(config.outputDir, `batch-export-${Date.now()}.log`); + + // 确保输出目录存在 + if (!fs.existsSync(config.outputDir)) { + fs.mkdirSync(config.outputDir, { recursive: true }); + } + } + + /** 记录日志 */ + log(message, level = 'info') { + const timestamp = new Date().toISOString(); + const logMessage = `[${timestamp}] [${level.toUpperCase()}] ${message}`; + + console.log(logMessage); + fs.appendFileSync(this.logFile, logMessage + '\n'); + } + + /** HTTP请求封装 */ + async makeRequest(endpoint, data = null, method = 'POST') { + return new Promise((resolve, reject) => { + const url = new URL(`${this.config.apiBaseUrl}${endpoint}`); + const isHttps = url.protocol === 'https:'; + const httpModule = isHttps ? https : http; + + const options = { + hostname: url.hostname, + port: url.port || (isHttps ? 443 : 80), + path: url.pathname + url.search, + method: method, + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${this.config.token}`, + 'X-EASE-ADMIN-TOKEN': this.config.token, + } + }; + + const req = httpModule.request(options, (res) => { + let responseData = ''; + + res.on('data', (chunk) => { + responseData += chunk; + }); + + res.on('end', () => { + if (res.statusCode >= 200 && res.statusCode < 300) { + try { + resolve(JSON.parse(responseData)); + } catch (e) { + resolve(responseData); + } + } else { + reject(new Error(`HTTP ${res.statusCode}: ${responseData}`)); + } + }); + }); + + req.on('error', (error) => { + reject(error); + }); + + if (data && method === 'POST') { + req.write(JSON.stringify(data)); + } + + req.end(); + }); + } + + /** 生成剪辑计划 */ + async generateEditPlan(projectId) { + this.log(`开始为项目 ${projectId} 生成剪辑计划...`); + + const maxRetryTime = 10 * 60 * 1000; // 10分钟 + const retryInterval = 8 * 1000; // 8秒 + const maxAttempts = Math.floor(maxRetryTime / retryInterval); + + let attempts = 0; + + while (attempts < maxAttempts) { + attempts++; + + try { + this.log(`项目 ${projectId}: 第${attempts}次尝试获取剪辑计划...`); + + const response = await this.makeRequest('/edit-plan/generate-by-project', { + project_id: projectId + }); + + if (response.code === 0 && response.data && response.data.success && response.data.editing_plan) { + this.log(`项目 ${projectId}: 剪辑计划生成成功`); + return response.data.editing_plan; + } + + if (attempts >= maxAttempts) { + throw new Error(`剪辑计划生成失败: ${response.message || '未知错误'}`); + } + + this.log(`项目 ${projectId}: 第${attempts}次尝试失败,${retryInterval/1000}秒后重试...`); + await new Promise(resolve => setTimeout(resolve, retryInterval)); + + } catch (error) { + if (attempts >= maxAttempts) { + throw new Error(`获取剪辑计划失败,已重试${maxAttempts}次: ${error.message}`); + } + + this.log(`项目 ${projectId}: 第${attempts}次尝试出现错误: ${error.message}`); + await new Promise(resolve => setTimeout(resolve, retryInterval)); + } + } + + throw new Error(`获取剪辑计划超时,已重试${maxAttempts}次`); + } + + /** 解析时间码为毫秒 */ + parseTimecodeToMs(timecode) { + const parts = timecode.split(':'); + if (parts.length !== 3) return 0; + + const hours = parseInt(parts[0]) || 0; + const minutes = parseInt(parts[1]) || 0; + const secondsParts = parts[2].split('.'); + const seconds = parseInt(secondsParts[0]) || 0; + const milliseconds = parseInt((secondsParts[1] || '').padEnd(3, '0').slice(0, 3)) || 0; + + return Math.round((hours * 3600 + minutes * 60 + seconds) * 1000 + milliseconds); + } + + /** 构建导出请求数据 */ + buildExportRequest(projectId, editingPlan) { + this.log(`项目 ${projectId}: 构建导出请求数据...`); + + const defaultClipDuration = 8000; // 8秒 + let currentStartTime = 0; + const videoElements = []; + + // 处理剪辑计划中的时间线信息 + if (editingPlan.editing_sequence_plans && editingPlan.editing_sequence_plans.length > 0) { + const timelineClips = editingPlan.editing_sequence_plans[0].timeline_clips || []; + this.log(`项目 ${projectId}: 使用剪辑计划中的 ${timelineClips.length} 个时间线片段`); + + timelineClips.forEach((clip, index) => { + const sequenceStartMs = this.parseTimecodeToMs(clip.sequence_start_timecode || "00:00:00.000"); + const sourceInMs = this.parseTimecodeToMs(clip.source_in_timecode || "00:00:00.000"); + const sourceOutMs = this.parseTimecodeToMs(clip.source_out_timecode || "00:00:08.000"); + const clipDurationMs = this.parseTimecodeToMs(clip.clip_duration_in_sequence || "00:00:08.000"); + + const element = { + id: clip.sequence_clip_id || `video_${index + 1}`, + src: clip.video_url, + start: currentStartTime, + end: currentStartTime + clipDurationMs, + in: sourceInMs, + out: sourceOutMs, + _source_type: (clip.video_url && clip.video_url.startsWith('http')) ? 'remote_url' : 'local' + }; + + videoElements.push(element); + currentStartTime += clipDurationMs; + }); + } + + const totalDuration = currentStartTime || defaultClipDuration; + + // 处理字幕 + const texts = []; + if (editingPlan.finalized_dialogue_track && editingPlan.finalized_dialogue_track.final_dialogue_segments) { + editingPlan.finalized_dialogue_track.final_dialogue_segments.forEach((dialogue, index) => { + texts.push({ + id: dialogue.sequence_clip_id || `text_${index + 1}`, + text: dialogue.transcript, + start: this.parseTimecodeToMs(dialogue.start_timecode || "00:00:00.000"), + end: this.parseTimecodeToMs(dialogue.end_timecode || "00:00:02.000"), + style: { + fontFamily: 'Arial', + fontSize: 40, + color: '#FFFFFF', + backgroundColor: 'transparent', + fontWeight: 'normal', + fontStyle: 'normal', + align: 'center', + shadow: true + } + }); + }); + } + + // 构建导出请求 + const exportRequest = { + project_id: projectId, + ir: { + width: 1920, + height: 1080, + fps: 30, + duration: totalDuration, + video: videoElements, + texts: texts, + audio: [], + transitions: [] + }, + options: { + quality: this.config.exportQuality, + codec: 'h264', + subtitleMode: 'hard' + } + }; + + this.log(`项目 ${projectId}: 导出请求数据构建完成,视频片段: ${videoElements.length}, 字幕片段: ${texts.length}`); + return exportRequest; + } + + /** 调用导出流接口 */ + async callExportStream(exportRequest) { + const projectId = exportRequest.project_id; + this.log(`项目 ${projectId}: 开始调用导出流接口...`); + + // 使用fetch API(Node.js 18+支持) + let fetch; + try { + fetch = globalThis.fetch; + } catch { + // 如果没有fetch,使用node-fetch或提示升级Node.js + throw new Error('需要Node.js 18+或安装node-fetch包'); + } + + const response = await fetch(`${this.config.exportApiBaseUrl}/api/export/stream`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Accept': 'text/event-stream', + 'Authorization': `Bearer ${this.config.token}`, + 'X-EASE-ADMIN-TOKEN': this.config.token, + }, + body: JSON.stringify(exportRequest) + }); + + if (!response.ok) { + const errorText = await response.text(); + throw new Error(`导出接口错误: ${response.status} ${errorText}`); + } + + this.log(`项目 ${projectId}: 导出接口调用成功,开始处理SSE流...`); + + // 处理SSE流式响应 + const reader = response.body.getReader(); + const decoder = new TextDecoder(); + let finalResult = null; + let detectedTaskId = null; + + try { + while (true) { + const { done, value } = await reader.read(); + if (done) break; + + const chunk = decoder.decode(value); + const lines = chunk.split('\n'); + + for (const line of lines) { + if (line.startsWith('data: ')) { + try { + const eventData = JSON.parse(line.slice(6)); + + // 提取任务ID + if (eventData.export_id || eventData.task_id) { + detectedTaskId = eventData.export_id || eventData.task_id; + } + + // 处理不同类型的事件 + switch (eventData.type) { + case 'start': + this.log(`项目 ${projectId}: 导出开始 - ${eventData.message}`); + if (eventData.export_id || eventData.task_id) { + detectedTaskId = eventData.export_id || eventData.task_id; + } + break; + + case 'progress': + const progressPercent = Math.round((eventData.progress || 0) * 100); + this.log(`项目 ${projectId}: 导出进度 ${progressPercent}% - ${eventData.stage || 'processing'} - ${eventData.message}`); + break; + + case 'complete': + this.log(`项目 ${projectId}: 导出完成!`); + finalResult = eventData; + if (detectedTaskId && !finalResult.export_id && !finalResult.task_id) { + finalResult.export_id = detectedTaskId; + } + return finalResult; + + case 'error': + throw new Error(`导出失败: ${eventData.message}`); + } + } catch (parseError) { + this.log(`项目 ${projectId}: 解析SSE事件失败: ${line}`, 'warn'); + } + } + } + } + } finally { + reader.releaseLock(); + } + + return finalResult; + } + + /** 轮询导出进度 */ + async pollExportProgress(taskId, projectId) { + this.log(`项目 ${projectId}: 开始轮询导出进度,任务ID: ${taskId}`); + const maxAttempts = 120; // 最多轮询10分钟 + let attempts = 0; + + while (attempts < maxAttempts) { + try { + // 使用导出API基础URL进行轮询 + const progressUrl = `${this.config.exportApiBaseUrl}/api/export/task/${taskId}/progress`; + const progressResponse = await fetch(progressUrl, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + 'Authorization': `Bearer ${this.config.token}`, + 'X-EASE-ADMIN-TOKEN': this.config.token, + } + }); + + if (!progressResponse.ok) { + throw new Error(`进度查询失败: ${progressResponse.status} ${progressResponse.statusText}`); + } + + const response = await progressResponse.json(); + const { status, progress } = response; + + if (status === 'completed') { + this.log(`项目 ${projectId}: 导出任务完成!视频URL: ${progress && progress.video_url}`); + return { + task_id: taskId, + status: status, + video_url: progress && progress.video_url, + file_size: progress && progress.file_size, + export_id: progress && progress.export_id + }; + } else if (status === 'failed') { + throw new Error(`导出任务失败: ${(progress && progress.message) || '未知错误'}`); + } else if (status === 'error') { + throw new Error(`导出任务错误: ${(progress && progress.message) || '未知错误'}`); + } else { + const percentage = (progress && progress.percentage) || 0; + const message = (progress && progress.message) || '处理中...'; + this.log(`项目 ${projectId}: 导出进度 ${percentage}% - ${message}`); + } + + attempts++; + await new Promise(resolve => setTimeout(resolve, 5000)); // 5秒间隔 + } catch (error) { + this.log(`项目 ${projectId}: 轮询进度出错: ${error.message}`, 'error'); + attempts++; + if (attempts >= maxAttempts) { + throw error; + } + await new Promise(resolve => setTimeout(resolve, 5000)); + } + } + + throw new Error(`轮询超时,已尝试${maxAttempts}次`); + } + + /** 处理单个项目 */ + async processProject(projectId) { + const status = { + projectId, + status: 'pending', + editPlanGenerated: false, + exportStarted: false, + exportCompleted: false, + attempts: 0, + startTime: Date.now() + }; + + this.projectStatuses.set(projectId, status); + + try { + // 1. 生成剪辑计划 + status.status = 'generating_plan'; + this.log(`项目 ${projectId}: 开始处理...`); + + const editingPlan = await this.generateEditPlan(projectId); + status.editPlanGenerated = true; + this.log(`项目 ${projectId}: 剪辑计划生成完成`); + + // 2. 构建导出请求 + const exportRequest = this.buildExportRequest(projectId, editingPlan); + + // 3. 调用导出接口 + status.status = 'exporting'; + status.exportStarted = true; + + let exportResult = await this.callExportStream(exportRequest); + + // 4. 如果SSE没有返回完整结果,使用轮询 + if (!exportResult || !exportResult.video_url) { + const taskId = (exportResult && exportResult.export_id) || (exportResult && exportResult.task_id); + if (taskId) { + exportResult = await this.pollExportProgress(taskId, projectId); + } else { + throw new Error('无法获取任务ID,无法轮询进度'); + } + } + + // 5. 处理完成 + status.status = 'completed'; + status.exportCompleted = true; + status.videoUrl = exportResult.video_url; + status.endTime = Date.now(); + + this.log(`项目 ${projectId}: 处理完成!视频URL: ${exportResult.video_url}`); + this.log(`项目 ${projectId}: 总耗时: ${((status.endTime - status.startTime) / 1000).toFixed(2)}秒`); + + } catch (error) { + status.status = 'failed'; + status.error = error.message; + status.endTime = Date.now(); + + this.log(`项目 ${projectId}: 处理失败: ${status.error}`, 'error'); + throw error; + } + } + + /** 批量处理项目 */ + async processProjects(projectIds) { + this.log(`开始批量处理 ${projectIds.length} 个项目...`); + this.log(`配置: 并发数=${this.config.concurrency}, 最大重试=${this.config.maxRetries}`); + + const results = { + total: projectIds.length, + completed: 0, + failed: 0, + errors: [] + }; + + // 分批并发处理 + for (let i = 0; i < projectIds.length; i += this.config.concurrency) { + const batch = projectIds.slice(i, i + this.config.concurrency); + this.log(`处理第 ${Math.floor(i/this.config.concurrency) + 1} 批,项目: ${batch.join(', ')}`); + + const promises = batch.map(async (projectId) => { + let attempts = 0; + + while (attempts < this.config.maxRetries) { + try { + await this.processProject(projectId); + results.completed++; + break; + } catch (error) { + attempts++; + const errorMsg = error.message; + + if (attempts >= this.config.maxRetries) { + this.log(`项目 ${projectId}: 达到最大重试次数,放弃处理`, 'error'); + results.failed++; + results.errors.push({ projectId, error: errorMsg }); + } else { + this.log(`项目 ${projectId}: 第${attempts}次尝试失败,${this.config.retryDelay/1000}秒后重试...`, 'warn'); + await new Promise(resolve => setTimeout(resolve, this.config.retryDelay)); + } + } + } + }); + + await Promise.all(promises); + } + + // 生成处理报告 + this.generateReport(results); + } + + /** 生成处理报告 */ + generateReport(results) { + const reportPath = path.join(this.config.outputDir, `batch-report-${Date.now()}.json`); + + const report = { + timestamp: new Date().toISOString(), + config: { + concurrency: this.config.concurrency, + maxRetries: this.config.maxRetries, + exportQuality: this.config.exportQuality + }, + results: results, + projects: Array.from(this.projectStatuses.values()).map(status => ({ + projectId: status.projectId, + status: status.status, + videoUrl: status.videoUrl, + error: status.error, + duration: status.endTime && status.startTime ? + ((status.endTime - status.startTime) / 1000) : null + })) + }; + + fs.writeFileSync(reportPath, JSON.stringify(report, null, 2)); + + this.log(`\n=== 批量处理完成 ===`); + this.log(`总项目数: ${results.total}`); + this.log(`成功: ${results.completed}`); + this.log(`失败: ${results.failed}`); + this.log(`处理报告: ${reportPath}`); + this.log(`详细日志: ${this.logFile}`); + + if (results.errors.length > 0) { + this.log(`\n失败项目:`); + results.errors.forEach((error) => { + this.log(` - ${error.projectId}: ${error.error}`, 'error'); + }); + } + } +} + +/** 从命令行参数解析项目ID列表 */ +function parseProjectIds() { + const args = process.argv.slice(2); + const projectIds = []; + + for (let i = 0; i < args.length; i++) { + if (args[i] === '--projects' && i + 1 < args.length) { + // 从命令行参数解析 + projectIds.push(...args[i + 1].split(',').map(id => id.trim()).filter(Boolean)); + } else if (args[i] === '--file' && i + 1 < args.length) { + // 从文件读取 + const filePath = args[i + 1]; + if (fs.existsSync(filePath)) { + const content = fs.readFileSync(filePath, 'utf-8'); + projectIds.push(...content.split('\n').map(id => id.trim()).filter(id => id && !id.startsWith('#'))); + } else { + console.error(`文件不存在: ${filePath}`); + process.exit(1); + } + } + } + + if (projectIds.length === 0) { + console.error('请提供项目ID列表:'); + console.error(' 使用 --projects "id1,id2,id3"'); + console.error(' 或者 --file projects.txt'); + process.exit(1); + } + + return projectIds; +} + +/** 主函数 */ +async function main() { + try { + // 解析项目ID列表 + const projectIds = parseProjectIds(); + + // 配置参数(可以通过环境变量或配置文件自定义) + const config = { + apiBaseUrl: process.env.API_BASE_URL || 'https://api.video.movieflow.ai', + exportApiBaseUrl: process.env.EXPORT_API_BASE_URL || 'https://smartcut.api.movieflow.ai', + token: process.env.AUTH_TOKEN || 'your-auth-token', + userId: process.env.USER_ID || 'your-user-id', + concurrency: parseInt(process.env.CONCURRENCY || '3'), + maxRetries: parseInt(process.env.MAX_RETRIES || '3'), + retryDelay: parseInt(process.env.RETRY_DELAY || '5000'), + exportQuality: process.env.EXPORT_QUALITY || 'standard', + outputDir: process.env.OUTPUT_DIR || './batch-export-output' + }; + + console.log(`开始批量处理 ${projectIds.length} 个项目...`); + console.log(`项目列表: ${projectIds.join(', ')}`); + + // 创建处理器并执行 + const exporter = new BatchVideoExporter(config); + await exporter.processProjects(projectIds); + + } catch (error) { + console.error('批量处理失败:', error); + process.exit(1); + } +} + +// 运行主函数 +if (require.main === module) { + main(); +} + +module.exports = { BatchVideoExporter }; diff --git a/scripts/projects.example.txt b/scripts/projects.example.txt new file mode 100644 index 0000000..5b7ba92 --- /dev/null +++ b/scripts/projects.example.txt @@ -0,0 +1,74 @@ +# 项目ID列表示例文件 +# 每行一个项目ID,以#开头的行为注释 + +107c5fcc-8348-4c3b-b9f3-f7474e24295d +6243a491-d8cd-46cf-8d11-933300f27569 +2b296c0f-dcc3-4141-8977-b9f3579bdb04 +2238ca87-1c6a-484a-9405-9e25d0999072 +481e672d-3a00-454f-bee0-71797d40ea17 +de805e6c-2374-4a5d-9f8a-f0b6baa3fad5 +64f137e0-06e5-4d30-86e7-28c6b8644de1 +8a132503-456a-462f-83e3-367636cd0286 +8d81241b-ae7c-431a-b953-85cfd6af77f3 +98b53d49-a02d-4fed-aa4e-62b6cc45fae8 +f23d558c-6f18-43f3-a373-8e3d1e8d278a +12daaba2-79c0-4fe8-bdc8-5b746b6bee3b +6b7ca8b9-5760-4908-aac6-b7388402652d +19db2b3e-9fb7-408c-90d5-35f9969b3d01 +89c20909-4ebf-4ccc-a5e7-401ef91ef242 +4de9ef61-cefd-4027-b07e-a2520a62f218 +d2e23eaf-e806-44c9-a241-7fc1af53dab4 +64941470-7689-4ea1-872c-672f2b5e4628 +469c5792-aa1a-4489-bfea-779d3782218c +7c55bd8e-8f16-4caa-a001-1a34497a9711 +86dcc7cf-f116-429f-b298-fe0878aa25ef +ded3ed74-b6fa-48fd-ad7e-fbfa717d54f5 +96da7e21-7284-4056-900e-59835e99b651 +892083d2-a7e7-4436-aac9-91cfdf24feae +52543696-fbe0-4fd9-bbe2-ef31e642fb8e +675ae612-d6ac-4017-98a6-ac9c4fd4eac9 +e430dfe1-3cb8-40bd-a6a9-f6b223052ff7 +3b12c5d3-7899-4ef6-97c4-8ff07ee5bc8e +35abfaba-d5b8-4caf-bbb7-89feaa007415 +71d52c66-b83b-4d51-91a2-be26f88f9eba +8013eeb8-6938-43e1-b5e1-91f68d860eb8 +30c8582f-5231-4a31-af08-5bba4b6171f3 +0cece1ba-ea3b-43cb-a7f2-10ce0de96936 +9a0e2fc9-73c0-43b5-b3d2-d6c1491cf9e5 +8659867f-0887-4a59-a5e4-22c1db88fff1 +f24bc59e-acbe-40a4-9383-c2d6f238475f +530500f8-8320-4bef-a7d8-7f1114c69a16 +8d926de6-4089-49a8-a58b-c71c9c0b9e87 +c7a08757-8c78-437c-9a75-10298fbd58e3 +af559e8b-2c36-4d21-a60d-3f6e8c9ce9a1 +2971aaa9-2d9f-46cb-b09b-e3d8ad0ba9de +63a03433-f1df-4e0f-99f3-58933ee7fe8e +92e0944d-183a-4e42-aad1-c54f2a70a29b +160493c9-235b-4d75-ba59-d97cd41d7bff +3ffeffe3-0191-47a8-8112-bda7bac5c983 +1b433f0d-bf02-449d-bb51-0b51ee4ffee9 +a563afec-afe3-4eca-b347-861bc6e00a82 +3d66b6ff-80ec-439b-a0f8-ffcd31663166 +1e5d52d3-c3b4-46c1-b555-8d507cd4b81f +ecae91fc-bd4a-4f3c-a086-a2f8970e2fc0 +5c6ca83f-3a32-45ff-baad-0a2036bf2d35 +8d725266-f62f-4e1e-984a-17414f8ca937 +4e200654-5af5-448a-bac2-9f421cde1272 +8574e0a4-10b9-494b-ab7f-6544197480d6 +4c1182a2-13cb-4422-a551-b89dc2cc1f0c +f42ad2b3-1f29-45b1-9b25-ba3eed23b03c +e923af63-0df2-4609-b3fa-2a19232f26ae +4e468c8b-1ba3-4fa7-bfc9-2d96aff78d32 +57a82669-5fcc-4289-be8a-9179cf535aa1 +49915888-c999-4d0c-9504-98146ae2fea1 +001c33b6-fefb-4807-b0ef-2c332bd881ca +d963c23c-a5b6-4b43-a6f1-7d801ea7bf34 +8e879443-1a98-4a1f-811a-4c98cb1d6e60 +d291dc06-15de-49d2-a140-6eef8da8de22 +2f7b5b56-e20e-4b29-9e09-6ca9b4dcee1b +5ad180ae-c4a6-435a-8f94-2ae0e081c91f +475f90f4-2a02-4e0b-aaa2-eae68ee4c6ac +9d609d66-51d0-4392-9023-96172eaa94ca +3c46b89d-44b1-47fd-ac2a-61c0b439bc27 +35be5718-1036-44e3-89a5-d8431bcb3b50 + diff --git a/test-output/batch-report-1759072351624.json b/test-output/batch-report-1759072351624.json new file mode 100644 index 0000000..62f0058 --- /dev/null +++ b/test-output/batch-report-1759072351624.json @@ -0,0 +1,27 @@ +{ + "timestamp": "2025-09-28T15:12:31.624Z", + "config": { + "concurrency": 1, + "maxRetries": 3, + "exportQuality": "standard" + }, + "results": { + "total": 1, + "completed": 0, + "failed": 1, + "errors": [ + { + "projectId": "107c5fcc-8348-4c3b-b9f3-f7474e24295d", + "error": "无法获取任务ID,无法轮询进度" + } + ] + }, + "projects": [ + { + "projectId": "107c5fcc-8348-4c3b-b9f3-f7474e24295d", + "status": "failed", + "error": "无法获取任务ID,无法轮询进度", + "duration": 6.201 + } + ] +} \ No newline at end of file From 38807ebcafcb7db588e903cd73fb57c88878409e Mon Sep 17 00:00:00 2001 From: qikongjian Date: Mon, 29 Sep 2025 10:58:24 +0800 Subject: [PATCH 02/16] =?UTF-8?q?=E6=9B=B4=E6=96=B0.env.production?= =?UTF-8?q?=E4=B8=BA=E8=BF=9C=E7=A8=8B=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.production | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.env.production b/.env.production index 8c74643..1720734 100644 --- a/.env.production +++ b/.env.production @@ -19,3 +19,6 @@ NEXT_PUBLIC_ERROR_CONFIG = 0.2 # Google OAuth配置 NEXT_PUBLIC_GOOGLE_CLIENT_ID=847079918888-o1nne8d3ij80dn20qurivo987pv07225.apps.googleusercontent.com +# google analysis +NEXT_PUBLIC_GA_MEASUREMENT_ID = G-E6VBGZ4ER5 +NEXT_PUBLIC_GA_ENABLED = true \ No newline at end of file From 3d16750ed0fb767f372d69b5df77687dbf8ea584 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8C=97=E6=9E=B3?= <7854742+wang_rumeng@user.noreply.gitee.com> Date: Mon, 29 Sep 2025 11:39:27 +0800 Subject: [PATCH 03/16] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=BC=B9=E7=AA=97?= =?UTF-8?q?=E5=B1=82=E7=BA=A7=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/ui/dialog.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/ui/dialog.tsx b/components/ui/dialog.tsx index 597a15d..f52250f 100644 --- a/components/ui/dialog.tsx +++ b/components/ui/dialog.tsx @@ -21,7 +21,7 @@ const DialogOverlay = React.forwardRef< Date: Mon, 29 Sep 2025 12:06:20 +0800 Subject: [PATCH 04/16] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20=E9=A6=96=E9=A1=B5?= =?UTF-8?q?=E7=BB=84=E4=BB=B6=E9=81=AE=E7=BD=A9=E5=B1=82=E7=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/layout/H5TopBar.tsx | 2 - components/pages/home-page2.tsx | 6 +- package-lock.json | 1428 +------------------------------ package.json | 29 +- 4 files changed, 23 insertions(+), 1442 deletions(-) diff --git a/components/layout/H5TopBar.tsx b/components/layout/H5TopBar.tsx index f3057cb..6c6cfdf 100644 --- a/components/layout/H5TopBar.tsx +++ b/components/layout/H5TopBar.tsx @@ -278,10 +278,8 @@ export default function H5TopBar({ onSelectHomeTab }: H5TopBarProps) { title={null} closable height={undefined} - bodyStyle={{ padding: 0 }} maskClosable // 64px 顶栏高度 + 8px 安全间距 - maskStyle={{ position: 'absolute', top: '3.5rem', height: 'calc(100dvh - 3.5rem)', backgroundColor: 'transparent' }} styles={{ content: { position: 'absolute', top: '3.5rem', height: isHome ? 'auto' : 'calc(100dvh - 3.5rem)' }, body: { padding: 0 }, diff --git a/components/pages/home-page2.tsx b/components/pages/home-page2.tsx index 6e976f5..c4a12a2 100644 --- a/components/pages/home-page2.tsx +++ b/components/pages/home-page2.tsx @@ -836,7 +836,7 @@ function HomeModule3() { > {/* 上方阴影遮罩 */}
{pcVideoList.map((column, columnIndex) => ( -
+
=17.0.0", - "react-dom": ">=17.0.0" - } - }, "node_modules/@floating-ui/react-dom": { "version": "2.1.5", "resolved": "https://registry.npmmirror.com/@floating-ui/react-dom/-/react-dom-2.1.5.tgz", @@ -974,30 +926,6 @@ "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", "license": "MIT" }, - "node_modules/@formatjs/intl-localematcher": { - "version": "0.6.1", - "resolved": "https://registry.npmmirror.com/@formatjs/intl-localematcher/-/intl-localematcher-0.6.1.tgz", - "integrity": "sha512-ePEgLgVCqi2BBFnTMWPfIghu6FkbZnnBVhO2sSxvLfrdFw7wCHAHiDoM2h4NRgjbaY7+B7HgOLZGkK187pZTZg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.8.0" - } - }, - "node_modules/@gilbarbara/deep-equal": { - "version": "0.3.1", - "resolved": "https://registry.npmmirror.com/@gilbarbara/deep-equal/-/deep-equal-0.3.1.tgz", - "integrity": "sha512-I7xWjLs2YSVMc5gGx1Z3ZG1lgFpITPndpi8Ku55GeEIKpACCPQNS/OTqQbxgTCfq0Ncvcc+CrFov96itVh6Qvw==", - "license": "MIT" - }, - "node_modules/@hookform/resolvers": { - "version": "3.10.0", - "resolved": "https://registry.npmmirror.com/@hookform/resolvers/-/resolvers-3.10.0.tgz", - "integrity": "sha512-79Dv+3mDF7i+2ajj7SkypSKHhl1cbln1OGavqrsF7p6mbUv11xpqpacPsGDCTRvCSjEEIez2ef1NveSVL3b0Ag==", - "license": "MIT", - "peerDependencies": { - "react-hook-form": "^7.0.0" - } - }, "node_modules/@humanwhocodes/config-array": { "version": "0.13.0", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", @@ -1784,11 +1712,6 @@ "node": ">= 10" } }, - "node_modules/@next/swc-wasm-nodejs": { - "version": "14.2.10", - "resolved": "https://registry.npmjs.org/@next/swc-wasm-nodejs/-/swc-wasm-nodejs-14.2.10.tgz", - "integrity": "sha512-2clF3OrSwx8ChrBRRzmklRYrywhJXyt9cxF4ZGAJzUzBgYBTwIVqPPK2Jsx4yQ7LnzEXMn5co+diihL3xdj81Q==" - }, "node_modules/@next/swc-win32-arm64-msvc": { "version": "14.2.10", "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.10.tgz", @@ -4498,68 +4421,6 @@ } } }, - "node_modules/@radix-ui/react-progress": { - "version": "1.1.7", - "resolved": "https://registry.npmmirror.com/@radix-ui/react-progress/-/react-progress-1.1.7.tgz", - "integrity": "sha512-vPdg/tF6YC/ynuBIJlk1mm7Le0VgW6ub6J2UWnTQ7/D23KXcPI1qy+0vBkgKgd38RCMJavBXpB83HPNFMTb0Fg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-progress/node_modules/@radix-ui/react-context": { - "version": "1.1.2", - "resolved": "https://registry.npmmirror.com/@radix-ui/react-context/-/react-context-1.1.2.tgz", - "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-progress/node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmmirror.com/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-radio-group": { "version": "1.3.7", "resolved": "https://registry.npmmirror.com/@radix-ui/react-radio-group/-/react-radio-group-1.3.7.tgz", @@ -6194,40 +6055,6 @@ } } }, - "node_modules/@radix-ui/react-toast": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.2.tgz", - "integrity": "sha512-Z6pqSzmAP/bFJoqMAston4eSNa+ud44NSZTiZUmUen+IOZ5nBY8kzuU5WDBVyFXPtcW6yUalOHsxM/BP6Sv8ww==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-collection": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.1", - "@radix-ui/react-portal": "1.1.2", - "@radix-ui/react-presence": "1.1.1", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-controllable-state": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0", - "@radix-ui/react-visually-hidden": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-toggle": { "version": "1.1.9", "resolved": "https://registry.npmmirror.com/@radix-ui/react-toggle/-/react-toggle-1.1.9.tgz", @@ -7361,155 +7188,6 @@ "tslib": "^2.4.0" } }, - "node_modules/@tensorflow-models/coco-ssd": { - "version": "2.2.3", - "resolved": "https://registry.npmmirror.com/@tensorflow-models/coco-ssd/-/coco-ssd-2.2.3.tgz", - "integrity": "sha512-iCLGktG/XhHbP6h2FWxqCKMp/Px0lCp6MZU1fjNhjDHeaWEC9G7S7cZrnPXsfH+NewCM53YShlrHnknxU3SQig==", - "license": "Apache-2.0", - "peerDependencies": { - "@tensorflow/tfjs-converter": "^4.10.0", - "@tensorflow/tfjs-core": "^4.10.0" - } - }, - "node_modules/@tensorflow/tfjs": { - "version": "4.22.0", - "resolved": "https://registry.npmmirror.com/@tensorflow/tfjs/-/tfjs-4.22.0.tgz", - "integrity": "sha512-0TrIrXs6/b7FLhLVNmfh8Sah6JgjBPH4mZ8JGb7NU6WW+cx00qK5BcAZxw7NCzxj6N8MRAIfHq+oNbPUNG5VAg==", - "license": "Apache-2.0", - "dependencies": { - "@tensorflow/tfjs-backend-cpu": "4.22.0", - "@tensorflow/tfjs-backend-webgl": "4.22.0", - "@tensorflow/tfjs-converter": "4.22.0", - "@tensorflow/tfjs-core": "4.22.0", - "@tensorflow/tfjs-data": "4.22.0", - "@tensorflow/tfjs-layers": "4.22.0", - "argparse": "^1.0.10", - "chalk": "^4.1.0", - "core-js": "3.29.1", - "regenerator-runtime": "^0.13.5", - "yargs": "^16.0.3" - }, - "bin": { - "tfjs-custom-module": "dist/tools/custom_module/cli.js" - } - }, - "node_modules/@tensorflow/tfjs-backend-cpu": { - "version": "4.22.0", - "resolved": "https://registry.npmmirror.com/@tensorflow/tfjs-backend-cpu/-/tfjs-backend-cpu-4.22.0.tgz", - "integrity": "sha512-1u0FmuLGuRAi8D2c3cocHTASGXOmHc/4OvoVDENJayjYkS119fcTcQf4iHrtLthWyDIPy3JiPhRrZQC9EwnhLw==", - "license": "Apache-2.0", - "dependencies": { - "@types/seedrandom": "^2.4.28", - "seedrandom": "^3.0.5" - }, - "engines": { - "yarn": ">= 1.3.2" - }, - "peerDependencies": { - "@tensorflow/tfjs-core": "4.22.0" - } - }, - "node_modules/@tensorflow/tfjs-backend-webgl": { - "version": "4.22.0", - "resolved": "https://registry.npmmirror.com/@tensorflow/tfjs-backend-webgl/-/tfjs-backend-webgl-4.22.0.tgz", - "integrity": "sha512-H535XtZWnWgNwSzv538czjVlbJebDl5QTMOth4RXr2p/kJ1qSIXE0vZvEtO+5EC9b00SvhplECny2yDewQb/Yg==", - "license": "Apache-2.0", - "dependencies": { - "@tensorflow/tfjs-backend-cpu": "4.22.0", - "@types/offscreencanvas": "~2019.3.0", - "@types/seedrandom": "^2.4.28", - "seedrandom": "^3.0.5" - }, - "engines": { - "yarn": ">= 1.3.2" - }, - "peerDependencies": { - "@tensorflow/tfjs-core": "4.22.0" - } - }, - "node_modules/@tensorflow/tfjs-converter": { - "version": "4.22.0", - "resolved": "https://registry.npmmirror.com/@tensorflow/tfjs-converter/-/tfjs-converter-4.22.0.tgz", - "integrity": "sha512-PT43MGlnzIo+YfbsjM79Lxk9lOq6uUwZuCc8rrp0hfpLjF6Jv8jS84u2jFb+WpUeuF4K33ZDNx8CjiYrGQ2trQ==", - "license": "Apache-2.0", - "peerDependencies": { - "@tensorflow/tfjs-core": "4.22.0" - } - }, - "node_modules/@tensorflow/tfjs-core": { - "version": "4.22.0", - "resolved": "https://registry.npmmirror.com/@tensorflow/tfjs-core/-/tfjs-core-4.22.0.tgz", - "integrity": "sha512-LEkOyzbknKFoWUwfkr59vSB68DMJ4cjwwHgicXN0DUi3a0Vh1Er3JQqCI1Hl86GGZQvY8ezVrtDIvqR1ZFW55A==", - "license": "Apache-2.0", - "dependencies": { - "@types/long": "^4.0.1", - "@types/offscreencanvas": "~2019.7.0", - "@types/seedrandom": "^2.4.28", - "@webgpu/types": "0.1.38", - "long": "4.0.0", - "node-fetch": "~2.6.1", - "seedrandom": "^3.0.5" - }, - "engines": { - "yarn": ">= 1.3.2" - } - }, - "node_modules/@tensorflow/tfjs-core/node_modules/@types/offscreencanvas": { - "version": "2019.7.3", - "resolved": "https://registry.npmmirror.com/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", - "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==", - "license": "MIT" - }, - "node_modules/@tensorflow/tfjs-core/node_modules/@webgpu/types": { - "version": "0.1.38", - "resolved": "https://registry.npmmirror.com/@webgpu/types/-/types-0.1.38.tgz", - "integrity": "sha512-7LrhVKz2PRh+DD7+S+PVaFd5HxaWQvoMqBbsV9fNJO1pjUs1P8bM2vQVNfk+3URTqbuTI7gkXi0rfsN0IadoBA==", - "license": "BSD-3-Clause" - }, - "node_modules/@tensorflow/tfjs-data": { - "version": "4.22.0", - "resolved": "https://registry.npmmirror.com/@tensorflow/tfjs-data/-/tfjs-data-4.22.0.tgz", - "integrity": "sha512-dYmF3LihQIGvtgJrt382hSRH4S0QuAp2w1hXJI2+kOaEqo5HnUPG0k5KA6va+S1yUhx7UBToUKCBHeLHFQRV4w==", - "license": "Apache-2.0", - "dependencies": { - "@types/node-fetch": "^2.1.2", - "node-fetch": "~2.6.1", - "string_decoder": "^1.3.0" - }, - "peerDependencies": { - "@tensorflow/tfjs-core": "4.22.0", - "seedrandom": "^3.0.5" - } - }, - "node_modules/@tensorflow/tfjs-layers": { - "version": "4.22.0", - "resolved": "https://registry.npmmirror.com/@tensorflow/tfjs-layers/-/tfjs-layers-4.22.0.tgz", - "integrity": "sha512-lybPj4ZNj9iIAPUj7a8ZW1hg8KQGfqWLlCZDi9eM/oNKCCAgchiyzx8OrYoWmRrB+AM6VNEeIT+2gZKg5ReihA==", - "license": "Apache-2.0 AND MIT", - "peerDependencies": { - "@tensorflow/tfjs-core": "4.22.0" - } - }, - "node_modules/@tensorflow/tfjs/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@tensorflow/tfjs/node_modules/core-js": { - "version": "3.29.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.29.1.tgz", - "integrity": "sha512-+jwgnhg6cQxKYIIjGtAHq2nwUOolo9eoFZ4sHfUH09BLXBgxnH4gA0zEd+t+BO2cNB8idaBtZFcFTRjQJRJmAw==", - "hasInstallScript": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, "node_modules/@tiptap/core": { "version": "3.0.9", "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-3.0.9.tgz", @@ -7955,12 +7633,6 @@ "url": "https://github.com/sponsors/ueberdosis" } }, - "node_modules/@tweenjs/tween.js": { - "version": "23.1.3", - "resolved": "https://registry.npmmirror.com/@tweenjs/tween.js/-/tween.js-23.1.3.tgz", - "integrity": "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==", - "license": "MIT" - }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmmirror.com/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -8197,12 +7869,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/long": { - "version": "4.0.2", - "resolved": "https://registry.npmmirror.com/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==", - "license": "MIT" - }, "node_modules/@types/markdown-it": { "version": "14.1.2", "resolved": "https://registry.npmmirror.com/@types/markdown-it/-/markdown-it-14.1.2.tgz", @@ -8246,22 +7912,6 @@ "integrity": "sha512-Y+/1vGBHV/cYk6OI1Na/LHzwnlNCAfU3ZNGrc1LdRe/LAIbdDPTTv/HU3M7yXN448aTVDq3eKRm2cg7iKLb8gw==", "license": "MIT" }, - "node_modules/@types/node-fetch": { - "version": "2.6.12", - "resolved": "https://registry.npmmirror.com/@types/node-fetch/-/node-fetch-2.6.12.tgz", - "integrity": "sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "form-data": "^4.0.0" - } - }, - "node_modules/@types/offscreencanvas": { - "version": "2019.3.0", - "resolved": "https://registry.npmmirror.com/@types/offscreencanvas/-/offscreencanvas-2019.3.0.tgz", - "integrity": "sha512-esIJx9bQg+QYF0ra8GnvfianIY8qWB0GBx54PK5Eps6m+xTj86KLavHv6qDhzKcu5UUOgNfJ2pWaIIV7TRUd9Q==", - "license": "MIT" - }, "node_modules/@types/prop-types": { "version": "15.7.13", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", @@ -8269,68 +7919,29 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "18.3.24", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.24.tgz", - "integrity": "sha512-0dLEBsA1kI3OezMBF8nSsb7Nk19ZnsyE1LLhB8r27KbgU5H4pvuqZLdtE+aUkJVoXgTVuA+iLIwmZ0TuK4tx6A==", + "version": "18.2.25", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.25.tgz", + "integrity": "sha512-24xqse6+VByVLIr+xWaQ9muX1B4bXJKXBbjszbld/UEDslGLY53+ZucF44HCmLbMPejTzGG9XgR+3m2/Wqu1kw==", "license": "MIT", "dependencies": { "@types/prop-types": "*", + "@types/scheduler": "*", "csstype": "^3.0.2" } }, - "node_modules/@types/react-beautiful-dnd": { - "version": "13.1.8", - "resolved": "https://registry.npmmirror.com/@types/react-beautiful-dnd/-/react-beautiful-dnd-13.1.8.tgz", - "integrity": "sha512-E3TyFsro9pQuK4r8S/OL6G99eq7p8v29sX0PM7oT8Z+PJfZvSQTx4zTQbUJ+QZXioAF0e7TGBEcA1XhYhCweyQ==", - "license": "MIT", - "dependencies": { - "@types/react": "*" - } - }, "node_modules/@types/react-dom": { - "version": "18.3.7", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", - "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", - "license": "MIT", - "peerDependencies": { - "@types/react": "^18.0.0" - } - }, - "node_modules/@types/react-grid-layout": { - "version": "1.3.5", - "resolved": "https://registry.npmmirror.com/@types/react-grid-layout/-/react-grid-layout-1.3.5.tgz", - "integrity": "sha512-WH/po1gcEcoR6y857yAnPGug+ZhkF4PaTUxgAbwfeSH/QOgVSakKHBXoPGad/sEznmkiaK3pqHk+etdWisoeBQ==", - "dev": true, + "version": "18.2.15", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.15.tgz", + "integrity": "sha512-HWMdW+7r7MR5+PZqJF6YFNSCtjz1T0dsvo/f1BV6HkV+6erD/nA7wd9NM00KVG83zf2nJ7uATPO9ttdIPvi3gg==", "license": "MIT", "dependencies": { "@types/react": "*" } }, - "node_modules/@types/react-redux": { - "version": "7.1.34", - "resolved": "https://registry.npmmirror.com/@types/react-redux/-/react-redux-7.1.34.tgz", - "integrity": "sha512-GdFaVjEbYv4Fthm2ZLvj1VSCedV7TqE5y1kNwnjSdBOTXuRSgowux6J8TAct15T3CKBr63UMk+2CO7ilRhyrAQ==", - "license": "MIT", - "dependencies": { - "@types/hoist-non-react-statics": "^3.3.0", - "@types/react": "*", - "hoist-non-react-statics": "^3.3.0", - "redux": "^4.0.0" - } - }, - "node_modules/@types/react-redux/node_modules/redux": { - "version": "4.2.1", - "resolved": "https://registry.npmmirror.com/redux/-/redux-4.2.1.tgz", - "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.9.2" - } - }, - "node_modules/@types/seedrandom": { - "version": "2.4.34", - "resolved": "https://registry.npmmirror.com/@types/seedrandom/-/seedrandom-2.4.34.tgz", - "integrity": "sha512-ytDiArvrn/3Xk6/vtylys5tlY6eo7Ane0hvcx++TKo6RxQXuVfW0AF/oeWqAj9dN29SyhtawuXstgmPlwNcv/A==", + "node_modules/@types/scheduler": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.26.0.tgz", + "integrity": "sha512-WFHp9YUJQ6CKshqoC37iOlHnQSmxNc795UhB26CyBBttrN9svdIrUjl/NjnNmfcwtncN0h/0PPAFWv9ovP8mLA==", "license": "MIT" }, "node_modules/@types/semver": { @@ -8346,12 +7957,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/stats.js": { - "version": "0.17.4", - "resolved": "https://registry.npmmirror.com/@types/stats.js/-/stats.js-0.17.4.tgz", - "integrity": "sha512-jIBvWWShCvlBqBNIZt0KAshWpvSjhkwkEu4ZUcASoAvhmrgAUI2t1dXrjSL4xXVLB4FznPrIsX3nKXFl/Dt4vA==", - "license": "MIT" - }, "node_modules/@types/styled-components": { "version": "5.1.34", "resolved": "https://registry.npmmirror.com/@types/styled-components/-/styled-components-5.1.34.tgz", @@ -8369,21 +7974,6 @@ "integrity": "sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==", "license": "MIT" }, - "node_modules/@types/three": { - "version": "0.177.0", - "resolved": "https://registry.npmmirror.com/@types/three/-/three-0.177.0.tgz", - "integrity": "sha512-/ZAkn4OLUijKQySNci47lFO+4JLE1TihEjsGWPUT+4jWqxtwOPPEwJV1C3k5MEx0mcBPCdkFjzRzDOnHEI1R+A==", - "license": "MIT", - "dependencies": { - "@dimforge/rapier3d-compat": "~0.12.0", - "@tweenjs/tween.js": "~23.1.3", - "@types/stats.js": "*", - "@types/webxr": "*", - "@webgpu/types": "*", - "fflate": "~0.8.2", - "meshoptimizer": "~0.18.1" - } - }, "node_modules/@types/unist": { "version": "3.0.3", "resolved": "https://registry.npmmirror.com/@types/unist/-/unist-3.0.3.tgz", @@ -8405,12 +7995,6 @@ "@types/debounce": "*" } }, - "node_modules/@types/webxr": { - "version": "0.5.22", - "resolved": "https://registry.npmmirror.com/@types/webxr/-/webxr-0.5.22.tgz", - "integrity": "sha512-Vr6Stjv5jPRqH690f5I5GLjVk8GSsoQSYJ2FVd/3jJF7KaqfwPi3ehfBS96mlQ2kPCwZaX6U0rG2+NGHBKkA/A==", - "license": "MIT" - }, "node_modules/@types/yargs": { "version": "17.0.33", "resolved": "https://registry.npmmirror.com/@types/yargs/-/yargs-17.0.33.tgz", @@ -8876,12 +8460,6 @@ "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", "license": "ISC" }, - "node_modules/@webgpu/types": { - "version": "0.1.63", - "resolved": "https://registry.npmmirror.com/@webgpu/types/-/types-0.1.63.tgz", - "integrity": "sha512-s9Kuh0nE/2+nKrvmKNMB2fE5Zlr3DL2t3OFKM55v5jRcfCOxbkOHhQoshoFum5mmXIfEtRXtLCWmkeTJsVjE9w==", - "license": "BSD-3-Clause" - }, "node_modules/acorn": { "version": "8.15.0", "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.15.0.tgz", @@ -9387,22 +8965,6 @@ "@babel/core": "^7.8.0" } }, - "node_modules/babel-loader": { - "version": "10.0.0", - "resolved": "https://registry.npmmirror.com/babel-loader/-/babel-loader-10.0.0.tgz", - "integrity": "sha512-z8jt+EdS61AMw22nSfoNJAZ0vrtmhPRVi6ghL3rCeRZI8cdNYFiV5xeV3HbE7rlZZNmGH8BVccwWt8/ED0QOHA==", - "license": "MIT", - "dependencies": { - "find-up": "^5.0.0" - }, - "engines": { - "node": "^18.20.0 || ^20.10.0 || >=22.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0", - "webpack": ">=5.61.0" - } - }, "node_modules/babel-plugin-istanbul": { "version": "6.1.1", "resolved": "https://registry.npmmirror.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", @@ -9893,54 +9455,6 @@ "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", "license": "MIT" }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmmirror.com/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmmirror.com/clsx/-/clsx-2.1.1.tgz", @@ -10151,15 +9665,6 @@ "node": ">= 8" } }, - "node_modules/css-box-model": { - "version": "1.2.1", - "resolved": "https://registry.npmmirror.com/css-box-model/-/css-box-model-1.2.1.tgz", - "integrity": "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==", - "license": "MIT", - "dependencies": { - "tiny-invariant": "^1.0.6" - } - }, "node_modules/css-color-keywords": { "version": "1.0.0", "resolved": "https://registry.npmmirror.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz", @@ -10443,12 +9948,6 @@ } } }, - "node_modules/deep-diff": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/deep-diff/-/deep-diff-1.0.2.tgz", - "integrity": "sha512-aWS3UIVH+NPGCD1kki+DCU9Dua032iSsO43LqQpcs4R3+dVv7tX0qBGjiVHJHjplsoUM2XRO/KB92glqc68awg==", - "license": "MIT" - }, "node_modules/deep-equal": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", @@ -10491,6 +9990,7 @@ "version": "4.3.1", "resolved": "https://registry.npmmirror.com/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -11609,12 +11109,6 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "license": "MIT" }, - "node_modules/fast-equals": { - "version": "4.0.3", - "resolved": "https://registry.npmmirror.com/fast-equals/-/fast-equals-4.0.3.tgz", - "integrity": "sha512-G3BSX9cfKttjr+2o1O22tYMLq0DPluZnYtq1rXumE1SpL/F/SLIfHx08WYQoWSIpeMYf8sRbJ8++71+v6Pnxfg==", - "license": "MIT" - }, "node_modules/fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", @@ -11674,12 +11168,6 @@ "bser": "2.1.1" } }, - "node_modules/fflate": { - "version": "0.8.2", - "resolved": "https://registry.npmmirror.com/fflate/-/fflate-0.8.2.tgz", - "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", - "license": "MIT" - }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -11952,6 +11440,7 @@ "version": "2.0.5", "resolved": "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" @@ -12336,16 +11825,6 @@ "dev": true, "license": "MIT" }, - "node_modules/html-url-attributes": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/html-url-attributes/-/html-url-attributes-3.0.1.tgz", - "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmmirror.com/human-signals/-/human-signals-2.1.0.tgz", @@ -12763,12 +12242,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/is-lite": { - "version": "1.2.1", - "resolved": "https://registry.npmmirror.com/is-lite/-/is-lite-1.2.1.tgz", - "integrity": "sha512-pgF+L5bxC+10hLBgf6R2P4ZZUBOQIIacbdo8YvuCP8/JvsWxG7aZ9p10DYuLtifFci4l3VITphhMlMV4Y+urPw==", - "license": "MIT" - }, "node_modules/is-map": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", @@ -14066,12 +13539,6 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "license": "MIT" }, - "node_modules/long": { - "version": "4.0.0", - "resolved": "https://registry.npmmirror.com/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", - "license": "Apache-2.0" - }, "node_modules/longest-streak": { "version": "3.1.0", "resolved": "https://registry.npmmirror.com/longest-streak/-/longest-streak-3.1.0.tgz", @@ -14171,16 +13638,6 @@ "markdown-it": "bin/markdown-it.mjs" } }, - "node_modules/markdown-table": { - "version": "3.0.4", - "resolved": "https://registry.npmmirror.com/markdown-table/-/markdown-table-3.0.4.tgz", - "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -14190,34 +13647,6 @@ "node": ">= 0.4" } }, - "node_modules/mdast-util-find-and-replace": { - "version": "3.0.2", - "resolved": "https://registry.npmmirror.com/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", - "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "escape-string-regexp": "^5.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/mdast-util-from-markdown": { "version": "2.0.2", "resolved": "https://registry.npmmirror.com/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", @@ -14242,107 +13671,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/mdast-util-gfm": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", - "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", - "license": "MIT", - "dependencies": { - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-gfm-autolink-literal": "^2.0.0", - "mdast-util-gfm-footnote": "^2.0.0", - "mdast-util-gfm-strikethrough": "^2.0.0", - "mdast-util-gfm-table": "^2.0.0", - "mdast-util-gfm-task-list-item": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-autolink-literal": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", - "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "ccount": "^2.0.0", - "devlop": "^1.0.0", - "mdast-util-find-and-replace": "^3.0.0", - "micromark-util-character": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-footnote": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", - "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.1.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-strikethrough": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", - "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-table": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", - "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "markdown-table": "^3.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-gfm-task-list-item": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", - "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "mdast-util-from-markdown": "^2.0.0", - "mdast-util-to-markdown": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/mdast-util-mdx": { "version": "3.0.0", "resolved": "https://registry.npmmirror.com/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", @@ -14495,12 +13823,6 @@ "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", "license": "MIT" }, - "node_modules/memoize-one": { - "version": "5.2.1", - "resolved": "https://registry.npmmirror.com/memoize-one/-/memoize-one-5.2.1.tgz", - "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", - "license": "MIT" - }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz", @@ -14517,12 +13839,6 @@ "node": ">= 8" } }, - "node_modules/meshoptimizer": { - "version": "0.18.1", - "resolved": "https://registry.npmmirror.com/meshoptimizer/-/meshoptimizer-0.18.1.tgz", - "integrity": "sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==", - "license": "MIT" - }, "node_modules/micromark": { "version": "4.0.2", "resolved": "https://registry.npmmirror.com/micromark/-/micromark-4.0.2.tgz", @@ -14592,127 +13908,6 @@ "micromark-util-types": "^2.0.0" } }, - "node_modules/micromark-extension-gfm": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", - "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", - "license": "MIT", - "dependencies": { - "micromark-extension-gfm-autolink-literal": "^2.0.0", - "micromark-extension-gfm-footnote": "^2.0.0", - "micromark-extension-gfm-strikethrough": "^2.0.0", - "micromark-extension-gfm-table": "^2.0.0", - "micromark-extension-gfm-tagfilter": "^2.0.0", - "micromark-extension-gfm-task-list-item": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-autolink-literal": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", - "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-footnote": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", - "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-strikethrough": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", - "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-table": { - "version": "2.1.1", - "resolved": "https://registry.npmmirror.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", - "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-tagfilter": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", - "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", - "license": "MIT", - "dependencies": { - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-task-list-item": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", - "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/micromark-extension-mdx-expression": { "version": "3.0.1", "resolved": "https://registry.npmmirror.com/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz", @@ -15314,32 +14509,6 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/motion": { - "version": "12.19.2", - "resolved": "https://registry.npmmirror.com/motion/-/motion-12.19.2.tgz", - "integrity": "sha512-Yb69HXE4ryhVd1xwpgWMMQAQgqEGMSGWG+NOumans2fvSCtT8gsj8JK7jhcGnc410CLT3BFPgquP67zmjbA5Jw==", - "license": "MIT", - "dependencies": { - "framer-motion": "^12.19.2", - "tslib": "^2.4.0" - }, - "peerDependencies": { - "@emotion/is-prop-valid": "*", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@emotion/is-prop-valid": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, "node_modules/motion-dom": { "version": "12.22.0", "resolved": "https://registry.npmmirror.com/motion-dom/-/motion-dom-12.22.0.tgz", @@ -15396,15 +14565,6 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "license": "MIT" }, - "node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/next": { "version": "14.2.10", "resolved": "https://registry.npmjs.org/next/-/next-14.2.10.tgz", @@ -15493,26 +14653,6 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/node-fetch": { - "version": "2.6.13", - "resolved": "https://registry.npmmirror.com/node-fetch/-/node-fetch-2.6.13.tgz", - "integrity": "sha512-StxNAxh15zr77QvvkmveSQ8uCQ4+v5FkvNTj0OESmiHu+VRi/gXArXtkWMElOsOUNLtUEvI4yS+rdtOHZTwlQA==", - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmmirror.com/node-int64/-/node-int64-0.4.0.tgz", @@ -16025,16 +15165,6 @@ "node": ">=8" } }, - "node_modules/popper.js": { - "version": "1.16.1", - "resolved": "https://registry.npmmirror.com/popper.js/-/popper.js-1.16.1.tgz", - "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, "node_modules/possible-typed-array-names": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", @@ -16534,12 +15664,6 @@ ], "license": "MIT" }, - "node_modules/raf-schd": { - "version": "4.0.3", - "resolved": "https://registry.npmmirror.com/raf-schd/-/raf-schd-4.0.3.tgz", - "integrity": "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==", - "license": "MIT" - }, "node_modules/rc-cascader": { "version": "3.34.0", "resolved": "https://registry.npmmirror.com/rc-cascader/-/rc-cascader-3.34.0.tgz", @@ -17164,65 +16288,6 @@ "node": ">=0.10.0" } }, - "node_modules/react-beautiful-dnd": { - "version": "13.1.1", - "resolved": "https://registry.npmmirror.com/react-beautiful-dnd/-/react-beautiful-dnd-13.1.1.tgz", - "integrity": "sha512-0Lvs4tq2VcrEjEgDXHjT98r+63drkKEgqyxdA7qD3mvKwga6a5SscbdLPO2IExotU1jW8L0Ksdl0Cj2AF67nPQ==", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime": "^7.9.2", - "css-box-model": "^1.2.0", - "memoize-one": "^5.1.1", - "raf-schd": "^4.0.2", - "react-redux": "^7.2.0", - "redux": "^4.0.4", - "use-memo-one": "^1.1.1" - }, - "peerDependencies": { - "react": "^16.8.5 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.5 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-beautiful-dnd/node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmmirror.com/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "license": "MIT" - }, - "node_modules/react-beautiful-dnd/node_modules/react-redux": { - "version": "7.2.9", - "resolved": "https://registry.npmmirror.com/react-redux/-/react-redux-7.2.9.tgz", - "integrity": "sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.15.4", - "@types/react-redux": "^7.1.20", - "hoist-non-react-statics": "^3.3.2", - "loose-envify": "^1.4.0", - "prop-types": "^15.7.2", - "react-is": "^17.0.2" - }, - "peerDependencies": { - "react": "^16.8.3 || ^17 || ^18" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "node_modules/react-beautiful-dnd/node_modules/redux": { - "version": "4.2.1", - "resolved": "https://registry.npmmirror.com/redux/-/redux-4.2.1.tgz", - "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.9.2" - } - }, "node_modules/react-contenteditable": { "version": "3.3.7", "resolved": "https://registry.npmmirror.com/react-contenteditable/-/react-contenteditable-3.3.7.tgz", @@ -17263,77 +16328,6 @@ "react": "^18.2.0" } }, - "node_modules/react-draggable": { - "version": "4.5.0", - "resolved": "https://registry.npmmirror.com/react-draggable/-/react-draggable-4.5.0.tgz", - "integrity": "sha512-VC+HBLEZ0XJxnOxVAZsdRi8rD04Iz3SiiKOoYzamjylUcju/hP9np/aZdLHf/7WOD268WMoNJMvYfB5yAK45cw==", - "license": "MIT", - "dependencies": { - "clsx": "^2.1.1", - "prop-types": "^15.8.1" - }, - "peerDependencies": { - "react": ">= 16.3.0", - "react-dom": ">= 16.3.0" - } - }, - "node_modules/react-floater": { - "version": "0.7.9", - "resolved": "https://registry.npmmirror.com/react-floater/-/react-floater-0.7.9.tgz", - "integrity": "sha512-NXqyp9o8FAXOATOEo0ZpyaQ2KPb4cmPMXGWkx377QtJkIXHlHRAGer7ai0r0C1kG5gf+KJ6Gy+gdNIiosvSicg==", - "license": "MIT", - "dependencies": { - "deepmerge": "^4.3.1", - "is-lite": "^0.8.2", - "popper.js": "^1.16.0", - "prop-types": "^15.8.1", - "tree-changes": "^0.9.1" - }, - "peerDependencies": { - "react": "15 - 18", - "react-dom": "15 - 18" - } - }, - "node_modules/react-floater/node_modules/@gilbarbara/deep-equal": { - "version": "0.1.2", - "resolved": "https://registry.npmmirror.com/@gilbarbara/deep-equal/-/deep-equal-0.1.2.tgz", - "integrity": "sha512-jk+qzItoEb0D0xSSmrKDDzf9sheQj/BAPxlgNxgmOaA3mxpUa6ndJLYGZKsJnIVEQSD8zcTbyILz7I0HcnBCRA==", - "license": "MIT" - }, - "node_modules/react-floater/node_modules/is-lite": { - "version": "0.8.2", - "resolved": "https://registry.npmmirror.com/is-lite/-/is-lite-0.8.2.tgz", - "integrity": "sha512-JZfH47qTsslwaAsqbMI3Q6HNNjUuq6Cmzzww50TdP5Esb6e1y2sK2UAaZZuzfAzpoI2AkxoPQapZdlDuP6Vlsw==", - "license": "MIT" - }, - "node_modules/react-floater/node_modules/tree-changes": { - "version": "0.9.3", - "resolved": "https://registry.npmmirror.com/tree-changes/-/tree-changes-0.9.3.tgz", - "integrity": "sha512-vvvS+O6kEeGRzMglTKbc19ltLWNtmNt1cpBoSYLj/iEcPVvpJasemKOlxBrmZaCtDJoF+4bwv3m01UKYi8mukQ==", - "license": "MIT", - "dependencies": { - "@gilbarbara/deep-equal": "^0.1.1", - "is-lite": "^0.8.2" - } - }, - "node_modules/react-grid-layout": { - "version": "1.5.2", - "resolved": "https://registry.npmmirror.com/react-grid-layout/-/react-grid-layout-1.5.2.tgz", - "integrity": "sha512-vT7xmQqszTT+sQw/LfisrEO4le1EPNnSEMVHy6sBZyzS3yGkMywdOd+5iEFFwQwt0NSaGkxuRmYwa1JsP6OJdw==", - "license": "MIT", - "dependencies": { - "clsx": "^2.1.1", - "fast-equals": "^4.0.3", - "prop-types": "^15.8.1", - "react-draggable": "^4.4.6", - "react-resizable": "^3.0.5", - "resize-observer-polyfill": "^1.5.1" - }, - "peerDependencies": { - "react": ">= 16.3.0", - "react-dom": ">= 16.3.0" - } - }, "node_modules/react-hook-form": { "version": "7.59.0", "resolved": "https://registry.npmmirror.com/react-hook-form/-/react-hook-form-7.59.0.tgz", @@ -17350,72 +16344,12 @@ "react": "^16.8.0 || ^17 || ^18 || ^19" } }, - "node_modules/react-innertext": { - "version": "1.1.5", - "resolved": "https://registry.npmmirror.com/react-innertext/-/react-innertext-1.1.5.tgz", - "integrity": "sha512-PWAqdqhxhHIv80dT9znP2KvS+hfkbRovFp4zFYHFFlOoQLRiawIic81gKb3U1wEyJZgMwgs3JoLtwryASRWP3Q==", - "license": "MIT", - "peerDependencies": { - "@types/react": ">=0.0.0 <=99", - "react": ">=0.0.0 <=99" - } - }, - "node_modules/react-intersection-observer": { - "version": "9.16.0", - "resolved": "https://registry.npmmirror.com/react-intersection-observer/-/react-intersection-observer-9.16.0.tgz", - "integrity": "sha512-w9nJSEp+DrW9KmQmeWHQyfaP6b03v+TdXynaoA964Wxt7mdR3An11z4NNCQgL4gKSK7y1ver2Fq+JKH6CWEzUA==", - "license": "MIT", - "peerDependencies": { - "react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - } - } - }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "license": "MIT" }, - "node_modules/react-joyride": { - "version": "2.9.3", - "resolved": "https://registry.npmmirror.com/react-joyride/-/react-joyride-2.9.3.tgz", - "integrity": "sha512-1+Mg34XK5zaqJ63eeBhqdbk7dlGCFp36FXwsEvgpjqrtyywX2C6h9vr3jgxP0bGHCw8Ilsp/nRDzNVq6HJ3rNw==", - "license": "MIT", - "dependencies": { - "@gilbarbara/deep-equal": "^0.3.1", - "deep-diff": "^1.0.2", - "deepmerge": "^4.3.1", - "is-lite": "^1.2.1", - "react-floater": "^0.7.9", - "react-innertext": "^1.1.5", - "react-is": "^16.13.1", - "scroll": "^3.0.1", - "scrollparent": "^2.1.0", - "tree-changes": "^0.11.2", - "type-fest": "^4.27.0" - }, - "peerDependencies": { - "react": "15 - 18", - "react-dom": "15 - 18" - } - }, - "node_modules/react-joyride/node_modules/type-fest": { - "version": "4.41.0", - "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/react-lazyload": { "version": "3.2.1", "resolved": "https://registry.npmmirror.com/react-lazyload/-/react-lazyload-3.2.1.tgz", @@ -17426,33 +16360,6 @@ "react-dom": "^0.14.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/react-markdown": { - "version": "10.1.0", - "resolved": "https://registry.npmmirror.com/react-markdown/-/react-markdown-10.1.0.tgz", - "integrity": "sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==", - "license": "MIT", - "dependencies": { - "@types/hast": "^3.0.0", - "@types/mdast": "^4.0.0", - "devlop": "^1.0.0", - "hast-util-to-jsx-runtime": "^2.0.0", - "html-url-attributes": "^3.0.0", - "mdast-util-to-hast": "^13.0.0", - "remark-parse": "^11.0.0", - "remark-rehype": "^11.0.0", - "unified": "^11.0.0", - "unist-util-visit": "^5.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - }, - "peerDependencies": { - "@types/react": ">=18", - "react": ">=18" - } - }, "node_modules/react-masonry-css": { "version": "1.0.16", "resolved": "https://registry.npmmirror.com/react-masonry-css/-/react-masonry-css-1.0.16.tgz", @@ -17532,19 +16439,6 @@ } } }, - "node_modules/react-resizable": { - "version": "3.0.5", - "resolved": "https://registry.npmmirror.com/react-resizable/-/react-resizable-3.0.5.tgz", - "integrity": "sha512-vKpeHhI5OZvYn82kXOs1bC8aOXktGU5AmKAgaZS4F5JPburCtbmDPqE7Pzp+1kN4+Wb81LlF33VpGwWwtXem+w==", - "license": "MIT", - "dependencies": { - "prop-types": "15.x", - "react-draggable": "^4.0.3" - }, - "peerDependencies": { - "react": ">= 16.3" - } - }, "node_modules/react-resizable-panels": { "version": "2.1.9", "resolved": "https://registry.npmmirror.com/react-resizable-panels/-/react-resizable-panels-2.1.9.tgz", @@ -17555,19 +16449,6 @@ "react-dom": "^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" } }, - "node_modules/react-rough-notation": { - "version": "1.0.5", - "resolved": "https://registry.npmmirror.com/react-rough-notation/-/react-rough-notation-1.0.5.tgz", - "integrity": "sha512-TTDnw1Qn96PwitGsBsjNh4911+o26Vivj/dhHbsHHhN6lDgkQsFhv1X/eOnCjHA2EOyDE5JBQ1HEZ1yW8sCmKA==", - "license": "MIT", - "dependencies": { - "rough-notation": "^0.5.1" - }, - "peerDependencies": { - "react": "^18.2.0", - "react-dom": "^18.2.0" - } - }, "node_modules/react-smooth": { "version": "4.0.4", "resolved": "https://registry.npmmirror.com/react-smooth/-/react-smooth-4.0.4.tgz", @@ -17614,23 +16495,6 @@ } } }, - "node_modules/react-textarea-autosize": { - "version": "8.5.9", - "resolved": "https://registry.npmmirror.com/react-textarea-autosize/-/react-textarea-autosize-8.5.9.tgz", - "integrity": "sha512-U1DGlIQN5AwgjTyOEnI1oCcMuEr1pv1qOtklB2l4nyMGbHzWrI0eFsYK0zos2YWqAolJyG0IWJaqWmWj5ETh0A==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.20.13", - "use-composed-ref": "^1.3.0", - "use-latest": "^1.2.1" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, "node_modules/react-transition-group": { "version": "4.4.5", "resolved": "https://registry.npmmirror.com/react-transition-group/-/react-transition-group-4.4.5.tgz", @@ -17647,17 +16511,6 @@ "react-dom": ">=16.6.0" } }, - "node_modules/react-wavesurfer.js": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/react-wavesurfer.js/-/react-wavesurfer.js-0.0.8.tgz", - "integrity": "sha512-73UDCIbHolcKsT8mVKiMxsgBwNvjOtq1eVisLV/d7W7+1W/y0cpBsEfSHfEIS63au9bXpepC+pGiN5kepWrUuw==", - "license": "MIT", - "peerDependencies": { - "react": ">=17.0.2", - "react-dom": ">=17.0.2", - "wavesurfer.js": "5.x.x || 6.x.x" - } - }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -17818,12 +16671,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "license": "MIT" - }, "node_modules/regexp.prototype.flags": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", @@ -17859,24 +16706,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/remark-gfm": { - "version": "4.0.1", - "resolved": "https://registry.npmmirror.com/remark-gfm/-/remark-gfm-4.0.1.tgz", - "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-gfm": "^3.0.0", - "micromark-extension-gfm": "^3.0.0", - "remark-parse": "^11.0.0", - "remark-stringify": "^11.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/remark-mdx": { "version": "3.1.0", "resolved": "https://registry.npmmirror.com/remark-mdx/-/remark-mdx-3.1.0.tgz", @@ -17924,25 +16753,11 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/remark-stringify": { - "version": "11.0.0", - "resolved": "https://registry.npmmirror.com/remark-stringify/-/remark-stringify-11.0.0.tgz", - "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", - "license": "MIT", - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-to-markdown": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -18059,12 +16874,6 @@ "integrity": "sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==", "license": "MIT" }, - "node_modules/rough-notation": { - "version": "0.5.1", - "resolved": "https://registry.npmmirror.com/rough-notation/-/rough-notation-0.5.1.tgz", - "integrity": "sha512-ITHofTzm13cWFVfoGsh/4c/k2Mg8geKgBCwex71UZLnNuw403tCRjYPQ68jSAd37DMbZIePXPjDgY0XdZi9HPw==", - "license": "MIT" - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -18107,26 +16916,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, "node_modules/safe-push-apply": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", @@ -18169,12 +16958,6 @@ "loose-envify": "^1.1.0" } }, - "node_modules/scroll": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/scroll/-/scroll-3.0.1.tgz", - "integrity": "sha512-pz7y517OVls1maEzlirKO5nPYle9AXsFzTMNJrRGmT951mzpIBy7sNHOg5o/0MQd/NqliCiWnAi0kZneMPFLcg==", - "license": "MIT" - }, "node_modules/scroll-into-view-if-needed": { "version": "3.1.0", "resolved": "https://registry.npmmirror.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz", @@ -18184,18 +16967,6 @@ "compute-scroll-into-view": "^3.0.2" } }, - "node_modules/scrollparent": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/scrollparent/-/scrollparent-2.1.0.tgz", - "integrity": "sha512-bnnvJL28/Rtz/kz2+4wpBjHzWoEzXhVg/TE8BeVGJHUqE8THNIRnDxDWMktwM+qahvlRdvlLdsQfYe+cuqfZeA==", - "license": "ISC" - }, - "node_modules/seedrandom": { - "version": "3.0.5", - "resolved": "https://registry.npmmirror.com/seedrandom/-/seedrandom-3.0.5.tgz", - "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==", - "license": "MIT" - }, "node_modules/semver": { "version": "7.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", @@ -18424,6 +17195,7 @@ "version": "1.0.3", "resolved": "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, "license": "BSD-3-Clause" }, "node_modules/stack-utils": { @@ -18470,15 +17242,6 @@ "node": ">=10.0.0" } }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, "node_modules/string-convert": { "version": "0.2.1", "resolved": "https://registry.npmmirror.com/string-convert/-/string-convert-0.2.1.tgz", @@ -18966,12 +17729,6 @@ "node": ">= 4.7.0" } }, - "node_modules/tabbable": { - "version": "6.2.0", - "resolved": "https://registry.npmmirror.com/tabbable/-/tabbable-6.2.0.tgz", - "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", - "license": "MIT" - }, "node_modules/tailwind-merge": { "version": "2.6.0", "resolved": "https://registry.npmmirror.com/tailwind-merge/-/tailwind-merge-2.6.0.tgz", @@ -19079,12 +17836,6 @@ "node": ">=0.8" } }, - "node_modules/three": { - "version": "0.177.0", - "resolved": "https://registry.npmmirror.com/three/-/three-0.177.0.tgz", - "integrity": "sha512-EiXv5/qWAaGI+Vz2A+JfavwYCMdGjxVsrn3oBwllUoqYeaBO75J63ZfyaQKoiLrqNHoTlUc6PFgMXnS0kI45zg==", - "license": "MIT" - }, "node_modules/throttle-debounce": { "version": "5.0.2", "resolved": "https://registry.npmmirror.com/throttle-debounce/-/throttle-debounce-5.0.2.tgz", @@ -19125,22 +17876,6 @@ "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==", "license": "MIT" }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmmirror.com/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" - }, - "node_modules/tree-changes": { - "version": "0.11.3", - "resolved": "https://registry.npmmirror.com/tree-changes/-/tree-changes-0.11.3.tgz", - "integrity": "sha512-r14mvDZ6tqz8PRQmlFKjhUVngu4VZ9d92ON3tp0EGpFBE6PAHOq8Bx8m8ahbNoGE3uI/npjYcJiqVydyOiYXag==", - "license": "MIT", - "dependencies": { - "@gilbarbara/deep-equal": "^0.3.1", - "is-lite": "^1.2.1" - } - }, "node_modules/trim-lines": { "version": "3.0.1", "resolved": "https://registry.npmmirror.com/trim-lines/-/trim-lines-3.0.1.tgz", @@ -19591,60 +18326,6 @@ } } }, - "node_modules/use-composed-ref": { - "version": "1.4.0", - "resolved": "https://registry.npmmirror.com/use-composed-ref/-/use-composed-ref-1.4.0.tgz", - "integrity": "sha512-djviaxuOOh7wkj0paeO1Q/4wMZ8Zrnag5H6yBvzN7AKKe8beOaED9SF5/ByLqsku8NP4zQqsvM2u3ew/tJK8/w==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-isomorphic-layout-effect": { - "version": "1.2.1", - "resolved": "https://registry.npmmirror.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.2.1.tgz", - "integrity": "sha512-tpZZ+EX0gaghDAiFR37hj5MgY6ZN55kLiPkJsKxBMZ6GZdOSPJXiOzPM984oPYZ5AnehYx5WQp1+ME8I/P/pRA==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-latest": { - "version": "1.3.0", - "resolved": "https://registry.npmmirror.com/use-latest/-/use-latest-1.3.0.tgz", - "integrity": "sha512-mhg3xdm9NaM8q+gLT8KryJPnRFOz1/5XPBhmDEVZK1webPzDjrPk7f/mbpeLqTgB9msytYWANxgALOCJKnLvcQ==", - "license": "MIT", - "dependencies": { - "use-isomorphic-layout-effect": "^1.1.1" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-memo-one": { - "version": "1.1.3", - "resolved": "https://registry.npmmirror.com/use-memo-one/-/use-memo-one-1.1.3.tgz", - "integrity": "sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, "node_modules/use-sidecar": { "version": "1.1.3", "resolved": "https://registry.npmmirror.com/use-sidecar/-/use-sidecar-1.1.3.tgz", @@ -19782,22 +18463,6 @@ "integrity": "sha512-tF1ptFCAi8SAqKbM1e7705zouLC3z4ulXCg15kSP5dQ7VDV30Q3x/xFRcuVIYTT5+jB/PdkhiBRCfsMshZG1Ug==", "license": "BSD-3-Clause" }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -20032,6 +18697,7 @@ "version": "5.0.8", "resolved": "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, "license": "ISC", "engines": { "node": ">=10" @@ -20056,53 +18722,6 @@ "node": ">= 14" } }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmmirror.com/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "license": "MIT", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -20115,15 +18734,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/zod": { - "version": "3.25.67", - "resolved": "https://registry.npmmirror.com/zod/-/zod-3.25.67.tgz", - "integrity": "sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, "node_modules/zwitch": { "version": "2.0.4", "resolved": "https://registry.npmmirror.com/zwitch/-/zwitch-2.0.4.tgz", diff --git a/package.json b/package.json index 3d9245c..3828b4d 100644 --- a/package.json +++ b/package.json @@ -14,11 +14,7 @@ "@dnd-kit/core": "^6.3.1", "@dnd-kit/sortable": "^10.0.0", "@dnd-kit/utilities": "^3.2.2", - "@floating-ui/react": "^0.27.15", - "@formatjs/intl-localematcher": "^0.6.1", - "@hookform/resolvers": "^3.9.0", "@mdx-js/mdx": "^3.1.0", - "@next/swc-wasm-nodejs": "14.2.10", "@radix-ui/react-accordion": "^1.2.0", "@radix-ui/react-alert-dialog": "^1.1.1", "@radix-ui/react-aspect-ratio": "^1.1.0", @@ -33,7 +29,6 @@ "@radix-ui/react-menubar": "^1.1.1", "@radix-ui/react-navigation-menu": "^1.2.0", "@radix-ui/react-popover": "^1.1.1", - "@radix-ui/react-progress": "^1.1.7", "@radix-ui/react-radio-group": "^1.2.0", "@radix-ui/react-scroll-area": "^1.1.0", "@radix-ui/react-select": "^2.2.5", @@ -42,13 +37,10 @@ "@radix-ui/react-slot": "^1.2.3", "@radix-ui/react-switch": "^1.1.0", "@radix-ui/react-tabs": "^1.1.0", - "@radix-ui/react-toast": "^1.2.1", "@radix-ui/react-toggle": "^1.1.0", "@radix-ui/react-toggle-group": "^1.1.0", "@radix-ui/react-tooltip": "^1.1.2", "@reduxjs/toolkit": "^2.8.2", - "@tensorflow-models/coco-ssd": "^2.2.3", - "@tensorflow/tfjs": "^4.22.0", "@tiptap/core": "^3.0.7", "@tiptap/extension-placeholder": "^3.0.9", "@tiptap/react": "^3.0.7", @@ -56,15 +48,12 @@ "@types/gsap": "^1.20.2", "@types/node": "20.6.2", "@types/react": "18.2.25", - "@types/react-beautiful-dnd": "^13.1.8", "@types/react-dom": "18.2.15", "@types/styled-components": "^5.1.34", - "@types/three": "^0.177.0", "@types/wavesurfer.js": "^6.0.12", "antd": "^5.26.2", "autoprefixer": "10.4.15", "axios": "^1.10.0", - "babel-loader": "^10.0.0", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "cmdk": "^1.0.0", @@ -80,47 +69,31 @@ "mdast-util-from-markdown": "^2.0.2", "mdast-util-mdx": "^3.0.0", "micromark-extension-mdxjs": "^3.0.0", - "motion": "^12.18.1", - "negotiator": "^1.0.0", "next": "14.2.10", "next-themes": "^0.3.0", - "postcss": "8.4.31", "react": "18.2.0", - "react-beautiful-dnd": "^13.1.1", "react-contenteditable": "^3.3.7", "react-day-picker": "^8.10.1", "react-dom": "18.2.0", - "react-grid-layout": "^1.5.1", "react-hook-form": "^7.53.0", - "react-intersection-observer": "^9.16.0", - "react-joyride": "^2.9.3", "react-lazyload": "^3.2.1", - "react-markdown": "^10.1.0", "react-masonry-css": "^1.0.16", "react-redux": "^9.2.0", - "react-resizable": "^3.0.5", "react-resizable-panels": "^2.1.3", - "react-rough-notation": "^1.0.5", - "react-textarea-autosize": "^8.5.9", - "react-wavesurfer.js": "^0.0.8", "recharts": "^2.15.4", - "remark-gfm": "^4.0.1", "sonner": "^1.5.0", "styled-components": "^6.1.19", "swiper": "^11.2.10", "tailwind-merge": "^2.6.0", "tailwindcss": "3.3.3", "tailwindcss-animate": "^1.0.7", - "three": "^0.177.0", "typescript": "5.2.2", "vaul": "^0.9.9", - "wavesurfer.js": "^7.10.1", - "zod": "^3.23.8" + "wavesurfer.js": "^7.10.1" }, "devDependencies": { "@types/jest": "^29.5.12", "@types/lodash": "^4.17.19", - "@types/react-grid-layout": "^1.3.5", "jest": "^29.7.0", "ts-jest": "^29.1.2" } From fa524af5b5820872ec68dd0b66404867dc76e596 Mon Sep 17 00:00:00 2001 From: moux1024 <403053463@qq.com> Date: Mon, 29 Sep 2025 14:18:01 +0800 Subject: [PATCH 05/16] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20env=E5=8F=98?= =?UTF-8?q?=E9=87=8F=E4=BD=BF=E7=94=A8=E6=94=B6=E5=8F=A3=E5=88=B0env.ts,co?= =?UTF-8?q?nstants=E6=9A=82=E6=97=B6=E7=A7=BB=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/README.md | 8 +- api/common.ts | 4 +- api/constants.ts | 4 - api/request.ts | 6 +- api/serversetting.ts | 4 +- api/video_flow.ts | 1 - app/layout.tsx | 7 +- app/users/oauth/callback/page.tsx | 4 +- .../pages/work-flow/ai-editing-iframe.tsx | 2 +- .../pages/work-flow/use-workflow-data.tsx | 4 +- .../pages/work-flow/video-edit/config.ts | 35 ++- components/vanta-halo-background.tsx | 1 + lib/auth.ts | 46 ++-- lib/env.ts | 202 ++++++++++++++++++ lib/server-config.ts | 5 +- utils/analytics.ts | 12 +- utils/dev-helper.ts | 5 +- utils/export-service.ts | 5 +- 18 files changed, 268 insertions(+), 87 deletions(-) delete mode 100644 api/constants.ts create mode 100644 lib/env.ts diff --git a/api/README.md b/api/README.md index f378220..6351e6b 100644 --- a/api/README.md +++ b/api/README.md @@ -4,7 +4,7 @@ ### 目录结构与职责 -- `constants.ts`:基础配置(`BASE_URL` 从 `NEXT_PUBLIC_BASE_URL` 注入) +- 基础配置从 `@/lib/env` 导入 `baseUrl` - `request.ts`:Axios 实例与拦截器、通用 `get/post/put/del`、`stream`(SSE风格下载进度)、`downloadStream`、`streamJsonPost` - `errorHandle.ts`:错误码映射与统一提示、特殊码处理(如 401 跳转登录、402 不弹提示) - `common.ts`:通用类型与与上传相关的工具(获取七牛 Token、上传) @@ -16,7 +16,7 @@ 1. 使用 `request.ts` 提供的 `get/post/put/del` 包装函数发起请求,返回后端响应体(已通过响应拦截器做业务码检查)。 2. 业务成功码:`code === 0` 或 `code === 202`(长任务/排队等需要前端自行处理状态)。若非成功码,拦截器会调用 `errorHandle` 并 `Promise.reject`。 3. 认证:前端从 `localStorage.token` 注入 `Authorization: Bearer `,请确保登录流程写入 `token`。 -4. 基础地址:通过环境变量 `NEXT_PUBLIC_BASE_URL` 注入,构建前需设置。 +4. 基础地址:从 `@/lib/env` 的 `baseUrl` 获取,统一管理环境变量。 ### 错误处理约定 @@ -90,7 +90,7 @@ await downloadStream('/download/file', 'result.mp4'); #### 浏览器前端(React/Next.js CSR) - 直接使用 `get/post/put/del`;确保登录后将 `token` 写入 `localStorage` -- 环境变量:在 `.env.local` 配置 `NEXT_PUBLIC_BASE_URL` +- 环境变量:在 `.env.local` 配置 `NEXT_PUBLIC_BASE_URL`,通过 `@/lib/env` 统一管理 - 错误提示:由 `errorHandle` 统一处理;402 会展示积分不足通知 #### Next.js Route Handler(服务端 API) @@ -101,7 +101,7 @@ await downloadStream('/download/file', 'result.mp4'); #### Next.js Server Components/SSR - 服务端不具备 `localStorage`,如需鉴权请改为从 Cookie/Headers 传递 token,并在转发时设置 `Authorization` -- 服务器端可直接使用 `fetch(BASE_URL + path, { headers })` +- 服务器端可直接使用 `fetch(baseUrl + path, { headers })` #### Node/Serverless(Vercel/Cloudflare) diff --git a/api/common.ts b/api/common.ts index 4fef3e8..7c3daa4 100644 --- a/api/common.ts +++ b/api/common.ts @@ -1,5 +1,5 @@ // Common API 相关接口 -import { BASE_URL } from './constants' +import { baseUrl } from '@/lib/env'; export interface ApiResponse { code: number @@ -44,7 +44,7 @@ export const getUploadToken = async (timeoutMs: number = 10000): Promise<{ token }, timeoutMs) try { - const response = await fetch(`${BASE_URL}/common/get-upload-token`, { + const response = await fetch(`${baseUrl}/common/get-upload-token`, { method: "GET", headers: { Accept: "application/json", diff --git a/api/constants.ts b/api/constants.ts deleted file mode 100644 index a2dd979..0000000 --- a/api/constants.ts +++ /dev/null @@ -1,4 +0,0 @@ -export const BASE_URL = process.env.NEXT_PUBLIC_BASE_URL -// export const BASE_URL = 'https://77.smartvideo.py.qikongjian.com' -// export const BASE_URL ='http://192.168.120.5:8000' -// diff --git a/api/request.ts b/api/request.ts index 701f549..0afcc2e 100644 --- a/api/request.ts +++ b/api/request.ts @@ -1,5 +1,5 @@ import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse, InternalAxiosRequestConfig, AxiosHeaders } from 'axios'; -import { BASE_URL } from './constants' +import { baseUrl } from '@/lib/env'; import { errorHandle } from './errorHandle'; /** @@ -20,7 +20,7 @@ const handleRequestError = (error: any, defaultMessage: string = '请求失败') }; // 创建 axios 实例 const request: AxiosInstance = axios.create({ - baseURL: BASE_URL, // 设置基础URL + baseURL: baseUrl, // 设置基础URL timeout: 300000, // 请求超时时间 headers: { 'Content-Type': 'application/json', @@ -102,7 +102,7 @@ export async function streamJsonPost( ) { try { const token = localStorage?.getItem('token') || ''; - const response = await fetch(`${BASE_URL}${url}`, { + const response = await fetch(`${baseUrl}${url}`, { method: 'POST', headers: { 'Content-Type': 'application/json', diff --git a/api/serversetting.ts b/api/serversetting.ts index 2a2f198..e101de4 100644 --- a/api/serversetting.ts +++ b/api/serversetting.ts @@ -1,4 +1,4 @@ -import { BASE_URL } from "./constants"; +import { baseUrl } from '@/lib/env'; import { post } from './request'; // 获取路演配置数据 @@ -8,7 +8,7 @@ export const fetchRoadshowConfigs = async () => { try { console.log('开始请求接口数据...'); - const response = await fetch(BASE_URL + '/serversetting/roadshow-configs', { + const response = await fetch(baseUrl + '/serversetting/roadshow-configs', { method: 'POST', headers: { 'Content-Type': 'application/json', diff --git a/api/video_flow.ts b/api/video_flow.ts index a4f2cec..95113ff 100644 --- a/api/video_flow.ts +++ b/api/video_flow.ts @@ -1,7 +1,6 @@ import { post, streamJsonPost } from "./request"; import { ProjectTypeEnum } from "@/app/model/enums"; import { ApiResponse } from "@/api/common"; -import { BASE_URL } from "./constants"; import { AITextEntity, RoleEntity, diff --git a/app/layout.tsx b/app/layout.tsx index da2fb2f..9631a78 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -5,6 +5,7 @@ import { Providers } from '@/components/providers'; import { ConfigProvider, theme } from 'antd'; import CallbackModal from '@/components/common/CallbackModal'; import { useAppStartupAnalytics } from '@/hooks/useAppStartupAnalytics'; +import { gaEnabled, gaMeasurementId } from '@/lib/env'; // 创建上下文来传递弹窗控制方法 const CallbackModalContext = createContext<{ @@ -53,16 +54,16 @@ export default function RootLayout({ - {process.env.NEXT_PUBLIC_GA_ENABLED === 'true' && ( + {gaEnabled && ( <> - +