新增 .cursorrules 文件以规范代码生成和修改规则;更新 request.ts 中的 token 获取逻辑以支持可选链;修正 video_flow.ts 中的 API 路径;删除不再使用的 ScriptService.test.ts 文件;新增 Script.test.ts 测试文件以覆盖 generateScriptStream 接口;新增 UML 图以描述剧本生成流程。

This commit is contained in:
海龙 2025-08-02 13:48:24 +08:00
parent 200bddb031
commit d0ff43fee4
7 changed files with 776 additions and 519 deletions

64
.cursorrules Normal file
View File

@ -0,0 +1,64 @@
# .cursorrules
# Code Generation and Modification Rules
- When generating or modifying code, strictly adhere to the user-specified task requirements and do not add extra functionality, edge cases, or unrequested sanity code.
- Keep code concise, including only the minimum required to complete the task.
- Avoid generating files, classes, functions, or configuration that are not explicitly required.
- If the task does not clearly specify implementation details, prioritize the simplest, most direct solution.
- When generating business logic code, do not generate sample code or unit test code unless explicitly requested by the user.
# CSS Style Rules
- All CSS styles must use Tailwind CSS 3.x syntax.
- Use of native CSS (e.g., style attributes or .css files) or other CSS frameworks (e.g., less) is prohibited.
- If Tailwind CSS configuration is required, ensure that the syntax of the latest stable version of Tailwind CSS 3.x is used.
# HTML and Component Tag Rules
- When generating HTML or components, all meaningful tags (such as div , section , button , etc.) must include a data-alt="xxxx" attribute describing the tag's purpose.
- The value of the data-alt attribute should be concise, clear, and accurately reflect the tag's function or purpose (e.g., "main-content" or "submit-button").
- Examples:
- <div data-alt="main-content" class="p-4 bg-gray-100">...</div>
- <button data-alt="submit-button" class="bg-blue-500 text-white">Submit</button>
- Avoid adding data-alt to meaningless tags (such as empty divs or simple containers) unless explicitly specified.
# Feature Solution Design Rules
- When writing a feature solution for a particular function, always provide up to three optimal implementation options in plain text.
- Each solution should briefly describe its core concept, advantages and disadvantages, and applicable scenarios. - Wait until the user explicitly agrees or selects a solution before generating the corresponding code.
- Avoid verbose solution descriptions, limiting them to 3-5 sentences per solution.
# Comment Style
- For fields, properties, or small code blocks, use concise documentation comments in the /** xxx */ style to describe their core purpose.
- For complex functions, use full JSDoc comments in the following format:
- Start with /** and include * to align each line.
- Include @description to describe the function's main functionality.
- For each parameter, use the @param {type} name - description format to clearly indicate its type and purpose.
- For return values, use the @returns {type} - description format to describe the return value.
- If a function throws an exception, use @throws {Error} - description to indicate the possible exception.
- If appropriate, include @example to provide a brief usage example.
- Example:
/**
* Calculates the sum of two numbers.
* @param {number} a - The first number.
* @param {number} b - The second number.
* @returns {number} - The sum of a and b.
* @throws {Error} - If inputs are not numbers.
* @example
* sum(2, 3); // Returns 5
*/
- Avoid lengthy comments for simple code (such as getters/setters or single-line functions).
- Comments should be concise and avoid lengthy descriptions.
- Ensure that comments are comprehensive.
# Code Analysis Rules
- When analyzing code, allow sufficient time to ensure that the results are accurate and comprehensive.
- Provide complete analysis results, covering all relevant details but without irrelevant speculation or assumptions.
- If the analysis involves potential problems, list the specific problems and provide concise solution suggestions.
- Analyze but don't directly modify files to generate code. Instead, provide suggestions and let users choose whether to copy and use.
# General Preferences
- Follow the latest stable TypeScript syntax (currently 5.x).
- Use camelCase for variable and function names, and PascalCase for class and interface names.
- Prefer const to declare variables, using let only when reassigning values; avoid using var.
- Follow Airbnb TypeScript standards for coding style (e.g., 4-space indentation, single quotes).
- Avoid generating console.log or debugging code unless explicitly requested by the user.
- Unless explicitly requested by the user, combine hook handlers where possible.
- Always use async over .then for asynchronous functions.

View File

@ -13,7 +13,7 @@ const request: AxiosInstance = axios.create({
request.interceptors.request.use(
(config: InternalAxiosRequestConfig) => {
// 从 localStorage 获取 token
const token = localStorage.getItem('token') || 'mock-token';
const token = localStorage?.getItem('token') || 'mock-token';
if (token && config.headers) {
(config.headers as AxiosHeaders).set('Authorization', `Bearer ${token}`);
}
@ -35,7 +35,7 @@ request.interceptors.response.use(
switch (error.response.status) {
case 401:
// 未授权,清除 token 并跳转到登录页
localStorage.removeItem('token');
localStorage?.removeItem('token');
window.location.href = '/login';
break;
case 403:
@ -91,7 +91,7 @@ export async function streamJsonPost<T = any>(
onJson: (json: T) => void
) {
try {
const token = localStorage.getItem('token') || 'mock-token';
const token = localStorage?.getItem('token') || 'mock-token';
const response = await fetch(`${BASE_URL}${url}`, {
method: 'POST',
headers: {
@ -116,7 +116,7 @@ export async function streamJsonPost<T = any>(
try {
while (true) {
const { done, value } = await reader.read();
if (done) {
// Process any remaining data in the buffer
if (buffer.trim()) {
@ -261,4 +261,4 @@ export const downloadStream = async (
};
// 导出 request 实例
export default request;
export default request;

View File

@ -577,7 +577,7 @@ export const generateScriptStream = async (request: {
/** 剧本提示词 */
prompt: string;
}) => {
return post<ApiResponse<any>>('/movie/generate_script_stream', request,{
return post<ApiResponse<any>>('/text_to_script/generate_script_stream', request,{
responseType: 'stream',
});
};

View File

@ -0,0 +1,46 @@
import { generateScriptStream } from '../../../api/video_flow';
describe('ScriptService 业务逻辑测试', () => {
describe('generateScriptStream 真实接口测试', () => {
it('应该成功调用 generateScriptStream 接口并输出流数据', async () => {
/**
* generateScriptStream
*/
const stream = await generateScriptStream({
prompt: '一个年轻人在咖啡店里等待他的约会对象,心情紧张地摆弄着手机。'
});
let allData = '';
let isSuccessful: boolean | undefined = undefined;
let message: string | undefined = undefined;
// 假设 stream 是一个异步可迭代对象
try {
for await (const chunk of stream.data) {
console.log(chunk);
if (typeof chunk.data === 'string') {
allData += chunk.data;
}
if (typeof chunk.successful === 'boolean') {
isSuccessful = chunk.successful;
}
if (typeof chunk.message === 'string') {
message = chunk.message;
}
}
} catch (err) {
console.error('流式接口监听出错:', err);
throw err;
}
// 输出流式数据及状态
console.log('generateScriptStream 流式数据:', allData);
console.log('响应状态:', isSuccessful);
console.log('响应消息:', message);
expect(allData).toBeDefined();
expect(typeof isSuccessful).toBe('boolean');
});
});
});

View File

@ -1,484 +0,0 @@
import { generateScriptStream, applyScriptToShot, getProjectScript } from '../../../api/video_flow';
import { ScriptEditUseCase } from '../usecase/ScriptEditUseCase';
import { ScriptSlice, ScriptSliceType } from '../domain/valueObject';
// Mock API模块
jest.mock('@/api/video_flow', () => ({
generateScriptStream: jest.fn(),
applyScriptToShot: jest.fn(),
getProjectScript: jest.fn(),
}));
// Mock UseCase模块
jest.mock('../usecase/ScriptEditUseCase');
describe('ScriptService 业务逻辑测试', () => {
let mockScriptEditUseCase: jest.Mocked<ScriptEditUseCase>;
// 测试数据
const mockScriptSlices: ScriptSlice[] = [
{
id: 'slice1',
type: ScriptSliceType.role,
text: '你好,我是主角',
metaData: { speaker: '主角', emotion: '友好' }
},
{
id: 'slice2',
type: ScriptSliceType.scene,
text: '场景:阳光明媚的公园',
metaData: { location: '公园', weather: '晴天' }
},
{
id: 'slice3',
type: ScriptSliceType.text,
text: '这是一个温馨的故事',
metaData: { style: '温馨' }
}
];
const mockStreamData = [
{ id: 'slice1', type: 'role', text: '你好,我是主角', metaData: { speaker: '主角' } },
{ id: 'slice2', type: 'scene', text: '场景:阳光明媚的公园', metaData: { location: '公园' } },
{ id: 'slice3', type: 'text', text: '这是一个温馨的故事', metaData: { style: '温馨' } }
];
beforeEach(() => {
jest.clearAllMocks();
// 设置Mock UseCase实例
mockScriptEditUseCase = {
generateScript: jest.fn(),
applyScript: jest.fn(),
updateScriptSlice: jest.fn(),
getScriptSlices: jest.fn(),
toString: jest.fn(),
} as any;
// 设置Mock构造函数
(ScriptEditUseCase as jest.MockedClass<typeof ScriptEditUseCase>).mockImplementation(() => mockScriptEditUseCase);
// 设置默认的Mock返回值
mockScriptEditUseCase.getScriptSlices.mockReturnValue(mockScriptSlices);
mockScriptEditUseCase.toString.mockReturnValue('你好,我是主角\n场景阳光明媚的公园\n这是一个温馨的故事');
mockScriptEditUseCase.updateScriptSlice.mockReturnValue(true);
mockScriptEditUseCase.generateScript.mockResolvedValue();
mockScriptEditUseCase.applyScript.mockResolvedValue();
// Mock流式数据
(generateScriptStream as jest.Mock).mockResolvedValue(mockStreamData);
(applyScriptToShot as jest.Mock).mockResolvedValue({
successful: true,
data: { success: true },
});
(getProjectScript as jest.Mock).mockResolvedValue({
successful: true,
data: {
prompt: '创建一个关于友谊的温馨故事',
scriptText: '你好,我是主角\n场景阳光明媚的公园\n这是一个温馨的故事'
}
});
});
describe('剧本业务流程测试', () => {
it('应该完成完整的剧本编辑流程:根据提示词生成剧本→修改提示词重新生成→重置提示词重新生成→修改剧本→应用剧本', async () => {
// 1. 用户操作:根据提示词生成新剧本
const initialPrompt = '创建一个关于友谊的温馨故事';
// 模拟AI生成剧本的流式数据
const mockStream = (async function* () {
for (const data of mockStreamData) {
yield data;
}
})();
(generateScriptStream as jest.Mock).mockResolvedValue(mockStream);
mockScriptEditUseCase.generateScript.mockImplementation(async (prompt) => {
// 模拟流式处理
for await (const chunk of mockStream) {
// 这里可以模拟逐步添加剧本片段
}
});
// 创建剧本编辑用例并生成剧本
const scriptEditUseCase = new ScriptEditUseCase('');
await scriptEditUseCase.generateScript(initialPrompt);
expect(ScriptEditUseCase).toHaveBeenCalledWith('');
expect(mockScriptEditUseCase.generateScript).toHaveBeenCalledWith(initialPrompt);
// 验证生成的剧本内容
const generatedScript = scriptEditUseCase.toString();
expect(generatedScript).toContain('你好,我是主角');
expect(generatedScript).toContain('场景:阳光明媚的公园');
// 验证剧本片段
const scriptSlices = scriptEditUseCase.getScriptSlices();
expect(scriptSlices).toHaveLength(3);
expect(scriptSlices[0].type).toBe(ScriptSliceType.role);
expect(scriptSlices[1].type).toBe(ScriptSliceType.scene);
// 2. 用户操作:修改提示词重新生成剧本
const modifiedPrompt = '创建一个关于冒险的刺激故事';
// 模拟修改后的剧本数据
const modifiedScriptSlices: ScriptSlice[] = [
{
id: 'slice1',
type: ScriptSliceType.role,
text: '我们出发吧!',
metaData: { speaker: '冒险者', emotion: '兴奋' }
},
{
id: 'slice2',
type: ScriptSliceType.scene,
text: '场景:神秘的森林',
metaData: { location: '森林', atmosphere: '神秘' }
},
{
id: 'slice3',
type: ScriptSliceType.text,
text: '这是一个充满挑战的冒险',
metaData: { style: '冒险' }
}
];
mockScriptEditUseCase.getScriptSlices.mockReturnValue(modifiedScriptSlices);
mockScriptEditUseCase.toString.mockReturnValue('我们出发吧!\n场景神秘的森林\n这是一个充满挑战的冒险');
// 重新生成剧本
await scriptEditUseCase.generateScript(modifiedPrompt);
expect(mockScriptEditUseCase.generateScript).toHaveBeenCalledWith(modifiedPrompt);
// 验证修改后的剧本内容
const modifiedScript = scriptEditUseCase.toString();
expect(modifiedScript).toContain('我们出发吧!');
expect(modifiedScript).toContain('神秘的森林');
expect(modifiedScript).toContain('充满挑战的冒险');
// 3. 用户操作:重置提示词重新生成剧本
const resetPrompt = '创建一个关于友谊的温馨故事'; // 回到初始提示词
// 模拟重置后的剧本数据(回到初始状态)
mockScriptEditUseCase.getScriptSlices.mockReturnValue(mockScriptSlices);
mockScriptEditUseCase.toString.mockReturnValue('你好,我是主角\n场景阳光明媚的公园\n这是一个温馨的故事');
// 重置并重新生成剧本
await scriptEditUseCase.generateScript(resetPrompt);
expect(mockScriptEditUseCase.generateScript).toHaveBeenCalledWith(resetPrompt);
// 验证重置后的剧本内容
const resetScript = scriptEditUseCase.toString();
expect(resetScript).toContain('你好,我是主角');
expect(resetScript).toContain('阳光明媚的公园');
expect(resetScript).toContain('温馨的故事');
// 4. 用户操作:修改剧本片段
const updatedText = '你好,我是勇敢的主角';
const updatedMetaData = { speaker: '主角', emotion: '勇敢' };
// 修改第一个剧本片段
const updateSuccess = scriptEditUseCase.updateScriptSlice('slice1', updatedText, updatedMetaData);
expect(updateSuccess).toBe(true);
expect(mockScriptEditUseCase.updateScriptSlice).toHaveBeenCalledWith('slice1', updatedText, updatedMetaData);
// 验证修改后的片段
const updatedSlices = scriptEditUseCase.getScriptSlices();
// 注意mock返回的数据不会因为updateScriptSlice调用而改变
// 这里只是验证getScriptSlices被正确调用
expect(updatedSlices).toEqual(mockScriptSlices);
// 5. 用户操作:应用剧本到分镜
// 应用剧本
await scriptEditUseCase.applyScript();
expect(mockScriptEditUseCase.applyScript).toHaveBeenCalled();
// 验证API调用
expect(applyScriptToShot).toHaveBeenCalledWith({
scriptSlices: updatedSlices
});
});
it('应该验证剧本生成的不同提示词效果', async () => {
const scriptEditUseCase = new ScriptEditUseCase('');
// 测试不同类型的提示词
const testPrompts = [
'创建一个浪漫的爱情故事',
'创建一个悬疑的侦探故事',
'创建一个科幻的未来故事'
];
for (const prompt of testPrompts) {
await scriptEditUseCase.generateScript(prompt);
expect(mockScriptEditUseCase.generateScript).toHaveBeenCalledWith(prompt);
}
// 验证每个提示词都被正确处理
expect(mockScriptEditUseCase.generateScript).toHaveBeenCalledTimes(testPrompts.length);
});
it('应该验证剧本片段的修改和更新', async () => {
const scriptEditUseCase = new ScriptEditUseCase('');
await scriptEditUseCase.generateScript('测试剧本');
// 测试修改不同类型的剧本片段
const testUpdates = [
{
id: 'slice1',
text: '修改后的对话',
metaData: { speaker: '新角色', emotion: '愤怒' }
},
{
id: 'slice2',
text: '修改后的场景描述',
metaData: { location: '新地点', weather: '雨天' }
},
{
id: 'slice3',
text: '修改后的文本内容',
metaData: { style: '新风格', tone: '严肃' }
}
];
for (const update of testUpdates) {
const success = scriptEditUseCase.updateScriptSlice(update.id, update.text, update.metaData);
expect(success).toBe(true);
expect(mockScriptEditUseCase.updateScriptSlice).toHaveBeenCalledWith(
update.id,
update.text,
update.metaData
);
}
// 验证所有修改都被正确处理
expect(mockScriptEditUseCase.updateScriptSlice).toHaveBeenCalledTimes(testUpdates.length);
});
it('应该处理剧本编辑流程中的错误情况', async () => {
const scriptEditUseCase = new ScriptEditUseCase('');
// 模拟生成剧本失败
mockScriptEditUseCase.generateScript.mockRejectedValue(new Error('AI生成失败'));
await expect(scriptEditUseCase.generateScript('测试提示词')).rejects.toThrow('AI生成失败');
// 模拟更新剧本片段失败
mockScriptEditUseCase.updateScriptSlice.mockReturnValue(false);
const updateResult = scriptEditUseCase.updateScriptSlice('nonexistent', '新文本');
expect(updateResult).toBe(false);
// 模拟应用剧本失败
mockScriptEditUseCase.applyScript.mockRejectedValue(new Error('应用剧本失败'));
await expect(scriptEditUseCase.applyScript()).rejects.toThrow('应用剧本失败');
});
});
describe('剧本流式生成测试', () => {
it('应该正确处理流式剧本生成', async () => {
const scriptEditUseCase = new ScriptEditUseCase('');
// 模拟流式数据生成
const streamChunks = [
{ id: 'slice1', type: 'role', text: '第一段对话', metaData: { speaker: '角色1' } },
{ id: 'slice2', type: 'scene', text: '场景描述', metaData: { location: '地点1' } },
{ id: 'slice3', type: 'text', text: '叙述文本', metaData: { style: '风格1' } }
];
let chunkIndex = 0;
const mockStream = (async function* () {
for (const chunk of streamChunks) {
yield chunk;
chunkIndex++;
}
})();
(generateScriptStream as jest.Mock).mockResolvedValue(mockStream);
// 模拟流式处理
mockScriptEditUseCase.generateScript.mockImplementation(async (prompt) => {
for await (const chunk of mockStream) {
// 模拟逐步处理每个片段
// 注意这里不需要验证chunk因为mockStream已经包含了正确的数据
}
});
await scriptEditUseCase.generateScript('流式生成测试');
expect(mockScriptEditUseCase.generateScript).toHaveBeenCalledWith('流式生成测试');
expect(chunkIndex).toBe(streamChunks.length);
});
it('应该处理流式生成中的错误', async () => {
const scriptEditUseCase = new ScriptEditUseCase('');
// 模拟流式数据生成失败
const mockErrorStream = (async function* () {
throw new Error('流式生成错误');
})();
(generateScriptStream as jest.Mock).mockResolvedValue(mockErrorStream);
mockScriptEditUseCase.generateScript.mockImplementation(async () => {
for await (const chunk of mockErrorStream) {
// 这里不会执行,因为流会抛出错误
}
});
await expect(scriptEditUseCase.generateScript('错误测试')).rejects.toThrow('流式生成错误');
});
});
describe('剧本应用测试', () => {
it('应该成功应用剧本到分镜', async () => {
const scriptEditUseCase = new ScriptEditUseCase('');
// 先生成剧本
await scriptEditUseCase.generateScript('应用测试');
// 应用剧本
await scriptEditUseCase.applyScript();
expect(mockScriptEditUseCase.applyScript).toHaveBeenCalled();
});
it('应该处理应用剧本失败的情况', async () => {
const scriptEditUseCase = new ScriptEditUseCase('');
// 模拟应用失败
(applyScriptToShot as jest.Mock).mockResolvedValue({
successful: false,
message: '应用剧本失败',
});
mockScriptEditUseCase.applyScript.mockRejectedValue(new Error('应用失败'));
await expect(scriptEditUseCase.applyScript()).rejects.toThrow('应用失败');
});
});
describe('剧本状态管理测试', () => {
it('应该正确管理剧本的生成状态', async () => {
const scriptEditUseCase = new ScriptEditUseCase('');
// 设置初始状态为空数组
mockScriptEditUseCase.getScriptSlices.mockReturnValue([]);
// 初始状态应该是空的
const initialSlices = scriptEditUseCase.getScriptSlices();
expect(initialSlices).toEqual([]);
// 生成剧本后应该有内容
await scriptEditUseCase.generateScript('状态测试');
// 重新设置mock返回值为有内容的数组
mockScriptEditUseCase.getScriptSlices.mockReturnValue(mockScriptSlices);
const generatedSlices = scriptEditUseCase.getScriptSlices();
expect(generatedSlices).toEqual(mockScriptSlices);
// 修改后状态应该更新
scriptEditUseCase.updateScriptSlice('slice1', '新文本', undefined);
expect(mockScriptEditUseCase.updateScriptSlice).toHaveBeenCalledWith('slice1', '新文本', undefined);
});
it('应该验证剧本文本的完整性', async () => {
const scriptEditUseCase = new ScriptEditUseCase('');
await scriptEditUseCase.generateScript('完整性测试');
const scriptText = scriptEditUseCase.toString();
const scriptSlices = scriptEditUseCase.getScriptSlices();
// 验证文本包含所有片段的内容
for (const slice of scriptSlices) {
expect(scriptText).toContain(slice.text);
}
// 验证片段数量与文本行数匹配
const textLines = scriptText.split('\n').filter(line => line.trim());
expect(textLines.length).toBeGreaterThan(0);
});
it('应该根据项目ID获取已存在的剧本数据', async () => {
const projectId = 'test-project-123';
// 模拟API返回项目剧本数据只包含提示词和剧本文本
const mockProjectScriptData = {
prompt: '创建一个关于冒险的故事',
scriptText: '我们出发吧!\n场景神秘的森林\n这是一个充满挑战的冒险'
};
(getProjectScript as jest.Mock).mockResolvedValue({
successful: true,
data: mockProjectScriptData
});
// 创建剧本编辑用例并模拟解析逻辑
const scriptEditUseCase = new ScriptEditUseCase(mockProjectScriptData.scriptText);
// 模拟解析后的剧本片段这是UseCase内部逻辑的结果
const mockParsedSlices = [
{
id: 'slice1',
type: ScriptSliceType.role,
text: '我们出发吧!',
metaData: { speaker: '冒险者', emotion: '兴奋' }
},
{
id: 'slice2',
type: ScriptSliceType.scene,
text: '场景:神秘的森林',
metaData: { location: '森林', atmosphere: '神秘' }
},
{
id: 'slice3',
type: ScriptSliceType.text,
text: '这是一个充满挑战的冒险',
metaData: { style: '冒险' }
}
];
// 模拟从项目获取剧本数据
const response = await getProjectScript({ projectId });
expect(response.successful).toBe(true);
expect(response.data.prompt).toBe('创建一个关于冒险的故事');
expect(response.data.scriptText).toContain('我们出发吧!');
// 验证API只返回提示词和剧本文本不包含解析后的片段
expect(response.data).not.toHaveProperty('scriptSlices');
// 验证UseCase能够正确解析剧本文本
const parsedSlices = scriptEditUseCase.getScriptSlices();
// 注意由于ScriptValueObject.parseFromString目前是TODO这里只是验证调用不会出错
expect(Array.isArray(parsedSlices)).toBe(true);
// 验证API调用参数
expect(getProjectScript).toHaveBeenCalledWith({ projectId });
});
it('应该处理获取项目剧本失败的情况', async () => {
const projectId = 'invalid-project';
// 模拟API失败
(getProjectScript as jest.Mock).mockResolvedValue({
successful: false,
message: '项目不存在'
});
await expect(getProjectScript({ projectId })).resolves.toEqual({
successful: false,
message: '项目不存在'
});
expect(getProjectScript).toHaveBeenCalledWith({ projectId });
});
});
});

View File

@ -0,0 +1,42 @@
@startuml 剧本生成
title 剧本生成与视频制作流程
object "用户输入想法"
object "调用剧本生成接口"
object "暂停生成过程"
object "用户修改想法"
object "作废旧的生成结果"
object "继续生成剧本"
object "剧本生成完成"
object "创建项目"
object "保存到数据库"
object "想法锁定"
object "用户手动修改剧本"
object "AI修改已有剧本"
object "用户点击应用"
object "走后端异步任务生成视频"
"用户输入想法" --> "调用剧本生成接口"
"调用剧本生成接口" --> "暂停生成过程" : 用户触发暂停?
"调用剧本生成接口" --> "继续生成剧本" : 用户不暂停
"暂停生成过程" --> "用户修改想法"
"用户修改想法" --> "作废旧的生成结果"
"作废旧的生成结果" --> "调用剧本生成接口"
"继续生成剧本" --> "剧本生成完成"
"剧本生成完成" --> "创建项目"
"创建项目" --> "保存到数据库"
"保存到数据库" --> "想法锁定"
"想法锁定" --> "用户手动修改剧本"
"想法锁定" --> "AI修改已有剧本"
"用户手动修改剧本" --> "用户点击应用"
"AI修改已有剧本" --> "用户点击应用"
"用户点击应用" --> "走后端异步任务生成视频"
@enduml
' https://www.plantuml.com/plantuml/uml/ZLJRJl904BxVfsXwpmly5xzuwMDuu4A3ccXz042bW1m89Hge4ZHO4gKs4WHQbPVfp9QtiCaOMpPRyOPavZlixCv7qwVQzebsTfXLe6IX-SoD7keDfkrhsSnAov_L0kjoUTy4_St_C76IuyCAOySx1vbTJL6vCKHz6dosu6A0XJ6Es-eF5ZY548wROMq0zOU8WPqyv4p2WaKnT5O5PtzXep4NdSD1mEtXjSKxvwJcNWllp9ZQixWt8emcY32gEM7sLVWRm_GkUEwoF-TTEtRUuXP6Dw0xs7QmQeFRYZ2QRMdamEw8qsEf0kKXtK6SOdFhkpzzHRCaegJd-JaKFN2Di8ozwyI1Heq_lS1x7aS3t_EWtAVhqAfKnfXiCqegzV-tjIH2f9IjI_cdS3h8UeHwanWRQvnawucS_5cLR1YJdaW6adJ8ciHEpaiojEwncEmI9985Z4cwH1SojreIGvO_IPFOGYBPQasKv7ZAsFAe9fkGIXPXqMeTdycwHF_Blo2TETeBlt7i2m00

647
package-lock.json generated
View File

@ -130,7 +130,6 @@
},
"node_modules/@ampproject/remapping": {
"version": "2.3.0",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"@jridgewell/gen-mapping": "^0.3.5",
@ -239,7 +238,6 @@
},
"node_modules/@babel/code-frame": {
"version": "7.27.1",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-validator-identifier": "^7.27.1",
@ -252,7 +250,6 @@
},
"node_modules/@babel/compat-data": {
"version": "7.28.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6.9.0"
@ -260,7 +257,6 @@
},
"node_modules/@babel/core": {
"version": "7.28.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@ampproject/remapping": "^2.2.0",
@ -291,7 +287,6 @@
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
"integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
"dev": true,
"license": "MIT",
"bin": {
"json5": "lib/cli.js"
@ -304,7 +299,6 @@
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"dev": true,
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
@ -312,7 +306,6 @@
},
"node_modules/@babel/generator": {
"version": "7.28.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/parser": "^7.28.0",
@ -327,7 +320,6 @@
},
"node_modules/@babel/helper-compilation-targets": {
"version": "7.27.2",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/compat-data": "^7.27.2",
@ -342,7 +334,6 @@
},
"node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": {
"version": "5.1.1",
"dev": true,
"license": "ISC",
"dependencies": {
"yallist": "^3.0.2"
@ -352,7 +343,6 @@
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"dev": true,
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
@ -360,7 +350,6 @@
},
"node_modules/@babel/helper-globals": {
"version": "7.28.0",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6.9.0"
@ -368,7 +357,6 @@
},
"node_modules/@babel/helper-module-imports": {
"version": "7.27.1",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/traverse": "^7.27.1",
@ -380,7 +368,6 @@
},
"node_modules/@babel/helper-module-transforms": {
"version": "7.27.3",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-module-imports": "^7.27.1",
@ -406,7 +393,6 @@
},
"node_modules/@babel/helper-string-parser": {
"version": "7.27.1",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6.9.0"
@ -414,7 +400,6 @@
},
"node_modules/@babel/helper-validator-identifier": {
"version": "7.27.1",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6.9.0"
@ -422,7 +407,6 @@
},
"node_modules/@babel/helper-validator-option": {
"version": "7.27.1",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6.9.0"
@ -430,7 +414,6 @@
},
"node_modules/@babel/helpers": {
"version": "7.28.2",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/template": "^7.27.2",
@ -442,7 +425,6 @@
},
"node_modules/@babel/parser": {
"version": "7.28.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/types": "^7.28.0"
@ -704,7 +686,6 @@
},
"node_modules/@babel/template": {
"version": "7.27.2",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.27.1",
@ -717,7 +698,6 @@
},
"node_modules/@babel/traverse": {
"version": "7.28.0",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.27.1",
@ -734,7 +714,6 @@
},
"node_modules/@babel/types": {
"version": "7.28.2",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-string-parser": "^7.27.1",
@ -1738,6 +1717,17 @@
"node": ">=6.0.0"
}
},
"node_modules/@jridgewell/source-map": {
"version": "0.3.10",
"resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.10.tgz",
"integrity": "sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q==",
"license": "MIT",
"peer": true,
"dependencies": {
"@jridgewell/gen-mapping": "^0.3.5",
"@jridgewell/trace-mapping": "^0.3.25"
}
},
"node_modules/@jridgewell/sourcemap-codec": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
@ -8225,6 +8215,28 @@
"@types/ms": "*"
}
},
"node_modules/@types/eslint": {
"version": "9.6.1",
"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz",
"integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==",
"license": "MIT",
"peer": true,
"dependencies": {
"@types/estree": "*",
"@types/json-schema": "*"
}
},
"node_modules/@types/eslint-scope": {
"version": "3.7.7",
"resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz",
"integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==",
"license": "MIT",
"peer": true,
"dependencies": {
"@types/eslint": "*",
"@types/estree": "*"
}
},
"node_modules/@types/estree": {
"version": "1.0.8",
"resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.8.tgz",
@ -8303,6 +8315,13 @@
"pretty-format": "^30.0.0"
}
},
"node_modules/@types/json-schema": {
"version": "7.0.15",
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
"integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
"license": "MIT",
"peer": true
},
"node_modules/@types/json5": {
"version": "0.0.29",
"resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
@ -8956,12 +8975,187 @@
"win32"
]
},
"node_modules/@webassemblyjs/ast": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz",
"integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==",
"license": "MIT",
"peer": true,
"dependencies": {
"@webassemblyjs/helper-numbers": "1.13.2",
"@webassemblyjs/helper-wasm-bytecode": "1.13.2"
}
},
"node_modules/@webassemblyjs/floating-point-hex-parser": {
"version": "1.13.2",
"resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz",
"integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==",
"license": "MIT",
"peer": true
},
"node_modules/@webassemblyjs/helper-api-error": {
"version": "1.13.2",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz",
"integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==",
"license": "MIT",
"peer": true
},
"node_modules/@webassemblyjs/helper-buffer": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz",
"integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==",
"license": "MIT",
"peer": true
},
"node_modules/@webassemblyjs/helper-numbers": {
"version": "1.13.2",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz",
"integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==",
"license": "MIT",
"peer": true,
"dependencies": {
"@webassemblyjs/floating-point-hex-parser": "1.13.2",
"@webassemblyjs/helper-api-error": "1.13.2",
"@xtuc/long": "4.2.2"
}
},
"node_modules/@webassemblyjs/helper-wasm-bytecode": {
"version": "1.13.2",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz",
"integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==",
"license": "MIT",
"peer": true
},
"node_modules/@webassemblyjs/helper-wasm-section": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz",
"integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==",
"license": "MIT",
"peer": true,
"dependencies": {
"@webassemblyjs/ast": "1.14.1",
"@webassemblyjs/helper-buffer": "1.14.1",
"@webassemblyjs/helper-wasm-bytecode": "1.13.2",
"@webassemblyjs/wasm-gen": "1.14.1"
}
},
"node_modules/@webassemblyjs/ieee754": {
"version": "1.13.2",
"resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz",
"integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==",
"license": "MIT",
"peer": true,
"dependencies": {
"@xtuc/ieee754": "^1.2.0"
}
},
"node_modules/@webassemblyjs/leb128": {
"version": "1.13.2",
"resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz",
"integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==",
"license": "Apache-2.0",
"peer": true,
"dependencies": {
"@xtuc/long": "4.2.2"
}
},
"node_modules/@webassemblyjs/utf8": {
"version": "1.13.2",
"resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz",
"integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==",
"license": "MIT",
"peer": true
},
"node_modules/@webassemblyjs/wasm-edit": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz",
"integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==",
"license": "MIT",
"peer": true,
"dependencies": {
"@webassemblyjs/ast": "1.14.1",
"@webassemblyjs/helper-buffer": "1.14.1",
"@webassemblyjs/helper-wasm-bytecode": "1.13.2",
"@webassemblyjs/helper-wasm-section": "1.14.1",
"@webassemblyjs/wasm-gen": "1.14.1",
"@webassemblyjs/wasm-opt": "1.14.1",
"@webassemblyjs/wasm-parser": "1.14.1",
"@webassemblyjs/wast-printer": "1.14.1"
}
},
"node_modules/@webassemblyjs/wasm-gen": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz",
"integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==",
"license": "MIT",
"peer": true,
"dependencies": {
"@webassemblyjs/ast": "1.14.1",
"@webassemblyjs/helper-wasm-bytecode": "1.13.2",
"@webassemblyjs/ieee754": "1.13.2",
"@webassemblyjs/leb128": "1.13.2",
"@webassemblyjs/utf8": "1.13.2"
}
},
"node_modules/@webassemblyjs/wasm-opt": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz",
"integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==",
"license": "MIT",
"peer": true,
"dependencies": {
"@webassemblyjs/ast": "1.14.1",
"@webassemblyjs/helper-buffer": "1.14.1",
"@webassemblyjs/wasm-gen": "1.14.1",
"@webassemblyjs/wasm-parser": "1.14.1"
}
},
"node_modules/@webassemblyjs/wasm-parser": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz",
"integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==",
"license": "MIT",
"peer": true,
"dependencies": {
"@webassemblyjs/ast": "1.14.1",
"@webassemblyjs/helper-api-error": "1.13.2",
"@webassemblyjs/helper-wasm-bytecode": "1.13.2",
"@webassemblyjs/ieee754": "1.13.2",
"@webassemblyjs/leb128": "1.13.2",
"@webassemblyjs/utf8": "1.13.2"
}
},
"node_modules/@webassemblyjs/wast-printer": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz",
"integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==",
"license": "MIT",
"peer": true,
"dependencies": {
"@webassemblyjs/ast": "1.14.1",
"@xtuc/long": "4.2.2"
}
},
"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/@xtuc/ieee754": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
"integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
"license": "BSD-3-Clause",
"peer": true
},
"node_modules/@xtuc/long": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
"integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
"license": "Apache-2.0",
"peer": true
},
"node_modules/acorn": {
"version": "8.15.0",
"resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.15.0.tgz",
@ -8974,6 +9168,19 @@
"node": ">=0.4.0"
}
},
"node_modules/acorn-import-phases": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz",
"integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==",
"license": "MIT",
"peer": true,
"engines": {
"node": ">=10.13.0"
},
"peerDependencies": {
"acorn": "^8.14.0"
}
},
"node_modules/acorn-jsx": {
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
@ -8999,6 +9206,48 @@
"url": "https://github.com/sponsors/epoberezkin"
}
},
"node_modules/ajv-formats": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
"integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
"license": "MIT",
"peer": true,
"dependencies": {
"ajv": "^8.0.0"
},
"peerDependencies": {
"ajv": "^8.0.0"
},
"peerDependenciesMeta": {
"ajv": {
"optional": true
}
}
},
"node_modules/ajv-formats/node_modules/ajv": {
"version": "8.17.1",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
"integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
"license": "MIT",
"peer": true,
"dependencies": {
"fast-deep-equal": "^3.1.3",
"fast-uri": "^3.0.1",
"json-schema-traverse": "^1.0.0",
"require-from-string": "^2.0.2"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/epoberezkin"
}
},
"node_modules/ajv-formats/node_modules/json-schema-traverse": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
"license": "MIT",
"peer": true
},
"node_modules/ansi-escapes": {
"version": "4.3.2",
"resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
@ -9666,7 +9915,6 @@
},
"node_modules/buffer-from": {
"version": "1.1.2",
"dev": true,
"license": "MIT"
},
"node_modules/busboy": {
@ -9896,6 +10144,16 @@
"node": ">= 6"
}
},
"node_modules/chrome-trace-event": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz",
"integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==",
"license": "MIT",
"peer": true,
"engines": {
"node": ">=6.0"
}
},
"node_modules/ci-info": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.0.tgz",
@ -10145,7 +10403,6 @@
},
"node_modules/convert-source-map": {
"version": "2.0.0",
"dev": true,
"license": "MIT"
},
"node_modules/copy-to-clipboard": {
@ -10904,6 +11161,13 @@
"node": ">= 0.4"
}
},
"node_modules/es-module-lexer": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz",
"integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==",
"license": "MIT",
"peer": true
},
"node_modules/es-object-atoms": {
"version": "1.1.1",
"resolved": "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
@ -11553,6 +11817,16 @@
"integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
"license": "MIT"
},
"node_modules/events": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
"integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
"license": "MIT",
"peer": true,
"engines": {
"node": ">=0.8.x"
}
},
"node_modules/execa": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
@ -11670,6 +11944,23 @@
"integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
"license": "MIT"
},
"node_modules/fast-uri": {
"version": "3.0.6",
"resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz",
"integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/fastify"
},
{
"type": "opencollective",
"url": "https://opencollective.com/fastify"
}
],
"license": "BSD-3-Clause",
"peer": true
},
"node_modules/fastq": {
"version": "1.17.1",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
@ -11955,7 +12246,6 @@
},
"node_modules/gensync": {
"version": "1.0.0-beta.2",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6.9.0"
@ -13955,6 +14245,37 @@
"node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
}
},
"node_modules/jest-worker": {
"version": "27.5.1",
"resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
"integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
"license": "MIT",
"peer": true,
"dependencies": {
"@types/node": "*",
"merge-stream": "^2.0.0",
"supports-color": "^8.0.0"
},
"engines": {
"node": ">= 10.13.0"
}
},
"node_modules/jest-worker/node_modules/supports-color": {
"version": "8.1.1",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
"integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
"license": "MIT",
"peer": true,
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/supports-color?sponsor=1"
}
},
"node_modules/jiti": {
"version": "1.21.6",
"resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz",
@ -13984,7 +14305,6 @@
},
"node_modules/jsesc": {
"version": "3.1.0",
"dev": true,
"license": "MIT",
"bin": {
"jsesc": "bin/jsesc"
@ -14001,7 +14321,6 @@
},
"node_modules/json-parse-even-better-errors": {
"version": "2.3.1",
"dev": true,
"license": "MIT"
},
"node_modules/json-schema-traverse": {
@ -14132,6 +14451,16 @@
"integrity": "sha512-NT1CJtq3hHIreOianA8aSXn6Cw0JzYOuDQbOrSPe7gqFnCpKP++MQe3ODgO3oh2GJFORkAAdqredOa60z63GbA==",
"license": "MIT"
},
"node_modules/loader-runner": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
"integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
"license": "MIT",
"peer": true,
"engines": {
"node": ">=6.11.5"
}
},
"node_modules/locate-path": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
@ -14464,7 +14793,6 @@
},
"node_modules/merge-stream": {
"version": "2.0.0",
"dev": true,
"license": "MIT"
},
"node_modules/merge2": {
@ -15259,6 +15587,13 @@
"node": ">= 0.6"
}
},
"node_modules/neo-async": {
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
"integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
"license": "MIT",
"peer": true
},
"node_modules/next": {
"version": "13.5.1",
"resolved": "https://registry.npmjs.org/next/-/next-13.5.1.tgz",
@ -16382,6 +16717,16 @@
"integrity": "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==",
"license": "MIT"
},
"node_modules/randombytes": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
"integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
"license": "MIT",
"peer": true,
"dependencies": {
"safe-buffer": "^5.1.0"
}
},
"node_modules/rc-cascader": {
"version": "3.34.0",
"resolved": "https://registry.npmmirror.com/rc-cascader/-/rc-cascader-3.34.0.tgz",
@ -17700,6 +18045,16 @@
"node": ">=0.10.0"
}
},
"node_modules/require-from-string": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
"integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
"license": "MIT",
"peer": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/reselect": {
"version": "5.1.1",
"resolved": "https://registry.npmmirror.com/reselect/-/reselect-5.1.1.tgz",
@ -17911,6 +18266,63 @@
"loose-envify": "^1.1.0"
}
},
"node_modules/schema-utils": {
"version": "4.3.2",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz",
"integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==",
"license": "MIT",
"peer": true,
"dependencies": {
"@types/json-schema": "^7.0.9",
"ajv": "^8.9.0",
"ajv-formats": "^2.1.1",
"ajv-keywords": "^5.1.0"
},
"engines": {
"node": ">= 10.13.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
}
},
"node_modules/schema-utils/node_modules/ajv": {
"version": "8.17.1",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
"integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
"license": "MIT",
"peer": true,
"dependencies": {
"fast-deep-equal": "^3.1.3",
"fast-uri": "^3.0.1",
"json-schema-traverse": "^1.0.0",
"require-from-string": "^2.0.2"
},
"funding": {
"type": "github",
"url": "https://github.com/sponsors/epoberezkin"
}
},
"node_modules/schema-utils/node_modules/ajv-keywords": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
"integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
"license": "MIT",
"peer": true,
"dependencies": {
"fast-deep-equal": "^3.1.3"
},
"peerDependencies": {
"ajv": "^8.8.2"
}
},
"node_modules/schema-utils/node_modules/json-schema-traverse": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
"license": "MIT",
"peer": true
},
"node_modules/scroll": {
"version": "3.0.1",
"resolved": "https://registry.npmmirror.com/scroll/-/scroll-3.0.1.tgz",
@ -17950,6 +18362,16 @@
"node": ">=10"
}
},
"node_modules/serialize-javascript": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
"integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
"license": "BSD-3-Clause",
"peer": true,
"dependencies": {
"randombytes": "^2.1.0"
}
},
"node_modules/set-function-length": {
"version": "1.2.2",
"license": "MIT",
@ -18126,7 +18548,6 @@
},
"node_modules/source-map": {
"version": "0.6.1",
"dev": true,
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
@ -18141,6 +18562,17 @@
"node": ">=0.10.0"
}
},
"node_modules/source-map-support": {
"version": "0.5.21",
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
"integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
"license": "MIT",
"peer": true,
"dependencies": {
"buffer-from": "^1.0.0",
"source-map": "^0.6.0"
}
},
"node_modules/space-separated-tokens": {
"version": "2.0.2",
"resolved": "https://registry.npmmirror.com/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz",
@ -18784,6 +19216,67 @@
"node": ">=6"
}
},
"node_modules/terser": {
"version": "5.43.1",
"resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz",
"integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==",
"license": "BSD-2-Clause",
"peer": true,
"dependencies": {
"@jridgewell/source-map": "^0.3.3",
"acorn": "^8.14.0",
"commander": "^2.20.0",
"source-map-support": "~0.5.20"
},
"bin": {
"terser": "bin/terser"
},
"engines": {
"node": ">=10"
}
},
"node_modules/terser-webpack-plugin": {
"version": "5.3.14",
"resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz",
"integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==",
"license": "MIT",
"peer": true,
"dependencies": {
"@jridgewell/trace-mapping": "^0.3.25",
"jest-worker": "^27.4.5",
"schema-utils": "^4.3.0",
"serialize-javascript": "^6.0.2",
"terser": "^5.31.1"
},
"engines": {
"node": ">= 10.13.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
},
"peerDependencies": {
"webpack": "^5.1.0"
},
"peerDependenciesMeta": {
"@swc/core": {
"optional": true
},
"esbuild": {
"optional": true
},
"uglify-js": {
"optional": true
}
}
},
"node_modules/terser/node_modules/commander": {
"version": "2.20.3",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
"license": "MIT",
"peer": true
},
"node_modules/test-exclude": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
@ -19583,6 +20076,103 @@
"integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
"license": "BSD-2-Clause"
},
"node_modules/webpack": {
"version": "5.101.0",
"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.101.0.tgz",
"integrity": "sha512-B4t+nJqytPeuZlHuIKTbalhljIFXeNRqrUGAQgTGlfOl2lXXKXw+yZu6bicycP+PUlM44CxBjCFD6aciKFT3LQ==",
"license": "MIT",
"peer": true,
"dependencies": {
"@types/eslint-scope": "^3.7.7",
"@types/estree": "^1.0.8",
"@types/json-schema": "^7.0.15",
"@webassemblyjs/ast": "^1.14.1",
"@webassemblyjs/wasm-edit": "^1.14.1",
"@webassemblyjs/wasm-parser": "^1.14.1",
"acorn": "^8.15.0",
"acorn-import-phases": "^1.0.3",
"browserslist": "^4.24.0",
"chrome-trace-event": "^1.0.2",
"enhanced-resolve": "^5.17.2",
"es-module-lexer": "^1.2.1",
"eslint-scope": "5.1.1",
"events": "^3.2.0",
"glob-to-regexp": "^0.4.1",
"graceful-fs": "^4.2.11",
"json-parse-even-better-errors": "^2.3.1",
"loader-runner": "^4.2.0",
"mime-types": "^2.1.27",
"neo-async": "^2.6.2",
"schema-utils": "^4.3.2",
"tapable": "^2.1.1",
"terser-webpack-plugin": "^5.3.11",
"watchpack": "^2.4.1",
"webpack-sources": "^3.3.3"
},
"bin": {
"webpack": "bin/webpack.js"
},
"engines": {
"node": ">=10.13.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
},
"peerDependenciesMeta": {
"webpack-cli": {
"optional": true
}
}
},
"node_modules/webpack-sources": {
"version": "3.3.3",
"resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz",
"integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==",
"license": "MIT",
"peer": true,
"engines": {
"node": ">=10.13.0"
}
},
"node_modules/webpack/node_modules/eslint-scope": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
"integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
"license": "BSD-2-Clause",
"peer": true,
"dependencies": {
"esrecurse": "^4.3.0",
"estraverse": "^4.1.1"
},
"engines": {
"node": ">=8.0.0"
}
},
"node_modules/webpack/node_modules/estraverse": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
"integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
"license": "BSD-2-Clause",
"peer": true,
"engines": {
"node": ">=4.0"
}
},
"node_modules/webpack/node_modules/watchpack": {
"version": "2.4.4",
"resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz",
"integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==",
"license": "MIT",
"peer": true,
"dependencies": {
"glob-to-regexp": "^0.4.1",
"graceful-fs": "^4.1.2"
},
"engines": {
"node": ">=10.13.0"
}
},
"node_modules/whatwg-url": {
"version": "5.0.0",
"resolved": "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-5.0.0.tgz",
@ -19827,7 +20417,6 @@
},
"node_modules/yallist": {
"version": "3.1.1",
"dev": true,
"license": "ISC"
},
"node_modules/yaml": {