commit 134d84d933f0caa2d2343939864d03143c76df84 Author: Ebenezer Date: Wed Mar 25 14:15:04 2026 +0800 First Commit diff --git a/有维项目/.qoder/repowiki/zh/content/JavaScript核心逻辑/AI对话系统.md b/有维项目/.qoder/repowiki/zh/content/JavaScript核心逻辑/AI对话系统.md new file mode 100644 index 0000000..518f594 --- /dev/null +++ b/有维项目/.qoder/repowiki/zh/content/JavaScript核心逻辑/AI对话系统.md @@ -0,0 +1,334 @@ +# AI对话系统 + + +**本文档引用的文件** +- [index.html](file://index.html) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构总览](#架构总览) +5. [详细组件分析](#详细组件分析) +6. [依赖关系分析](#依赖关系分析) +7. [性能考虑](#性能考虑) +8. [故障排查指南](#故障排查指南) +9. [结论](#结论) +10. [附录](#附录) + +## 简介 +本项目为“有维商学”平台中的AI对话系统,提供嵌入在页面内的聊天弹窗,支持用户与不同类型的AI智能体进行交互。系统包含完整的前端交互逻辑:打开聊天窗口、输入处理、消息发送与渲染、快捷问题、以及关闭机制。本文档聚焦于三个核心函数: +- openChat:聊天窗口初始化与DOM元素创建、事件绑定 +- sendMessage:消息发送机制与异步响应模拟 +- addMessage:消息渲染与滚动定位 + +同时给出完整的对话流程示例、消息格式规范、错误处理建议、消息持久化建议与性能优化策略。 + +## 项目结构 +本项目采用单页应用结构,所有页面与交互逻辑集中在单一HTML文件中,通过CSS样式与内联脚本实现完整的前端功能。 + +```mermaid +graph TB +A["index.html
主页面"] --> B["样式层
CSS定义"] +A --> C["脚本层
内联JavaScript"] +C --> D["页面切换函数
showPage()"] +C --> E["登录处理函数
handleLogin()"] +C --> F["聊天窗口控制
openChat()/closeChat()"] +C --> G["消息发送与渲染
sendMessage()/addMessage()"] +C --> H["快捷消息
sendQuickMessage()"] +C --> I["键盘事件处理
handleKeyPress()"] +``` + +图表来源 +- [index.html](file://index.html) + +章节来源 +- [index.html](file://index.html) + +## 核心组件 +本节概述与AI对话系统直接相关的组件与职责: +- 聊天弹窗容器:负责承载聊天头部、消息列表、快捷问题区、输入区域与发送按钮 +- 聊天消息列表:动态渲染用户与AI的消息气泡,并自动滚动至最新消息 +- 快捷问题区:预设常见问题按钮,点击即发送对应文本 +- 输入与发送:支持单行/多行输入,Enter键触发发送,Shift+Enter换行 +- 会话初始化:根据点击的AI卡片动态设置标题、头像图标与背景色 + +章节来源 +- [index.html](file://index.html) + +## 架构总览 +下图展示了AI对话系统在页面中的整体架构与交互流程: + +```mermaid +graph TB +subgraph "页面层" +P["页面容器
.page"] +L["登录页面
.login-page"] +D["仪表盘页面
.dashboard-page"] +A["AI智能体页面
.ai-page"] +end +subgraph "对话弹窗" +M["聊天模态框
.chat-modal"] +C["聊天容器
.chat-container"] +H["聊天头部
.chat-header"] +MSG["消息列表
.chat-messages"] +Q["快捷问题区
.quick-questions"] +IA["输入区域
.chat-input-area"] +IN["输入框
#chatInput"] +BTN["发送按钮
.chat-send"] +CL["关闭按钮
.chat-close"] +end +subgraph "脚本层" +OC["openChat()
初始化聊天"] +SC["sendMessage()
发送消息"] +AM["addMessage()
渲染消息"] +SQ["sendQuickMessage()
快捷消息"] +HK["handleKeyPress()
键盘事件"] +CC["closeChat()
关闭聊天"] +end +A --> OC +OC --> M +M --> C +C --> H +C --> MSG +C --> Q +C --> IA +IA --> IN +IA --> BTN +C --> CL +IN --> HK +BTN --> SC +Q --> SQ +SC --> AM +AM --> MSG +CL --> CC +``` + +图表来源 +- [index.html](file://index.html) + +## 详细组件分析 + +### openChat 函数:聊天窗口初始化与DOM元素创建 +openChat函数负责: +- 设置聊天标题与头像图标及背景色 +- 打开模态框并清空消息列表,插入一条来自AI的欢迎消息 +- 该函数在点击AI卡片时被调用,参数包括智能体名称、图标与背景色 + +关键行为与实现要点: +- 动态更新聊天标题与头像背景色,确保与所选智能体一致 +- 初始化消息列表,插入一条机器人消息作为开场白 +- 将模态框标记为激活状态,显示聊天界面 + +```mermaid +sequenceDiagram +participant U as "用户" +participant Card as "AI卡片" +participant OC as "openChat()" +participant DOM as "DOM元素" +participant Modal as "聊天模态框" +U->>Card : 点击卡片 +Card->>OC : 传入(name, icon, bgColor) +OC->>DOM : 更新#chatTitle与#chatAvatar +OC->>DOM : 清空#chatMessages并插入欢迎消息 +OC->>Modal : 为.chat-modal添加.active类 +Modal-->>U : 显示聊天界面 +``` + +图表来源 +- [index.html](file://index.html) + +章节来源 +- [index.html](file://index.html) + +### sendMessage 函数:消息发送机制 +sendMessage函数负责: +- 获取输入框内容并去除首尾空白 +- 验证非空后调用addMessage渲染用户消息 +- 清空输入框 +- 使用定时器模拟异步响应,随机选择一条回复并渲染AI消息 +- 该函数在点击发送按钮或按Enter键触发 + +消息发送流程: +- 输入校验:仅当消息非空时才发送 +- 用户消息渲染:调用addMessage(type='user') +- 异步响应模拟:延时约1秒后随机选择回复并渲染AI消息 +- 自动滚动:每次新增消息后滚动至底部 + +```mermaid +flowchart TD +Start(["进入 sendMessage"]) --> GetInput["读取输入框值并去空白"] +GetInput --> IsEmpty{"是否为空?"} +IsEmpty --> |是| End(["结束"]) +IsEmpty --> |否| AddUser["调用 addMessage(text,'user')"] +AddUser --> ClearInput["清空输入框"] +ClearInput --> Delay["等待约1秒"] +Delay --> PickResp["随机选择AI回复"] +PickResp --> AddBot["调用 addMessage(resp,'bot')"] +AddBot --> Scroll["滚动至底部"] +Scroll --> End +``` + +图表来源 +- [index.html](file://index.html) + +章节来源 +- [index.html](file://index.html) + +### addMessage 函数:消息渲染与滚动定位 +addMessage函数负责: +- 根据消息类型(用户/机器人)生成不同的消息气泡HTML +- 用户消息使用固定头像与主题色背景,机器人消息使用当前智能体头像与背景色 +- 将新消息追加到消息列表末尾 +- 自动滚动到最新消息位置 + +消息渲染细节: +- 用户消息气泡右对齐,头像位于右侧 +- 机器人消息气泡左对齐,头像位于左侧 +- 头像与背景色与当前智能体保持一致,增强识别度 + +```mermaid +flowchart TD +Enter(["进入 addMessage"]) --> GetType["判断消息类型"] +GetType --> BuildUser{"用户消息?"} +BuildUser --> |是| CreateUser["生成用户消息HTML
固定头像与主题色"] +BuildUser --> |否| CreateBot["生成机器人消息HTML
使用当前智能体头像与背景色"] +CreateUser --> Append["追加到#chatMessages"] +CreateBot --> Append +Append --> Scroll["messagesContainer.scrollTop = scrollHeight"] +Scroll --> Exit(["结束"]) +``` + +图表来源 +- [index.html](file://index.html) + +章节来源 +- [index.html](file://index.html) + +### 快捷消息与键盘事件 +- 快捷消息:sendQuickMessage函数用于填充输入框并触发发送,提升用户体验 +- 键盘事件:handleKeyPress监听Enter键,Shift+Enter保留换行,Enter触发发送 + +章节来源 +- [index.html](file://index.html) + +## 依赖关系分析 +- openChat依赖DOM元素:#chatTitle、#chatAvatar、#chatMessages、.chat-modal +- sendMessage依赖DOM元素:#chatInput、.chat-send、#chatMessages +- addMessage依赖DOM元素:#chatMessages、#chatAvatar +- 事件绑定:模态框背景点击关闭、输入框键盘事件、发送按钮点击事件 + +```mermaid +graph LR +OC["openChat()"] --> DOM1["#chatTitle"] +OC --> DOM2["#chatAvatar"] +OC --> DOM3["#chatMessages"] +OC --> MOD[".chat-modal"] +SC["sendMessage()"] --> INP["#chatInput"] +SC --> BTN[".chat-send"] +SC --> AM["addMessage()"] +AM --> MSG["#chatMessages"] +AM --> AV["#chatAvatar"] +HK["handleKeyPress()"] --> INP +CC["closeChat()"] --> MOD +``` + +图表来源 +- [index.html](file://index.html) + +章节来源 +- [index.html](file://index.html) + +## 性能考虑 +- DOM操作优化 + - 在渲染大量消息时,避免频繁读写布局属性;可考虑虚拟滚动或分页加载 + - 合并多次DOM更新,减少重排与重绘 +- 消息渲染优化 + - 使用DocumentFragment批量插入消息,降低主线程阻塞 + - 控制消息列表最大长度,超出阈值时移除旧消息 +- 输入处理优化 + - 防抖Enter键触发,避免重复提交 + - 多行输入时限制高度,防止过度占用内存 +- 异步响应优化 + - 使用Web Workers或Service Worker处理复杂AI响应逻辑(如需) + - 缓存常用回复,减少随机选择开销 +- 内存管理 + - 关闭聊天时清理事件监听与定时器 + - 长时间会话中定期清理未使用的DOM节点 + +## 故障排查指南 +- 打不开聊天窗口 + - 检查.openChat()是否正确设置了#chatTitle、#chatAvatar与#chatMessages + - 确认.chat-modal存在且可添加.active类 +- 发送按钮无效 + - 检查.sendMessage()是否被绑定到.click事件 + - 确认#chatInput存在且可读取 +- 消息不显示或不滚动 + - 检查.addMessage()是否正确拼接HTML并追加到#chatMessages + - 确认messagesContainer.scrollHeight有效 +- Enter键无反应 + - 检查.handleKeyPress()是否绑定到#chatInput + - 确认事件对象的key为'Enter'且shiftKey为false +- 快捷消息无效 + - 检查.sendQuickMessage()是否正确设置#chatInput并调用.sendMessage() + +章节来源 +- [index.html](file://index.html) + +## 结论 +本AI对话系统以简洁的单页结构实现了完整的聊天功能:从打开窗口、输入处理、消息发送与渲染,到快捷消息与键盘事件,形成闭环。通过合理组织DOM与事件,系统具备良好的可维护性与扩展性。建议后续引入消息持久化与性能优化策略,进一步提升用户体验与系统稳定性。 + +## 附录 + +### 完整对话流程示例 +- 步骤1:用户点击AI卡片,调用openChat()初始化聊天 +- 步骤2:用户在输入框输入问题,点击发送或按Enter +- 步骤3:sendMessage()验证输入并渲染用户消息 +- 步骤4:系统延时约1秒后随机选择AI回复并渲染机器人消息 +- 步骤5:消息列表自动滚动至最新消息 +- 步骤6:用户可点击快捷问题或继续输入,重复上述流程 +- 步骤7:点击关闭按钮或点击模态框背景关闭聊天 + +章节来源 +- [index.html](file://index.html) + +### 消息格式规范 +- 用户消息 + - 类型:user + - 头像:固定头像(例如“张”) + - 背景:主题色背景 + - 文本:用户输入的纯文本 +- 机器人消息 + - 类型:bot + - 头像:当前智能体图标 + - 背景:当前智能体背景色 + - 文本:系统随机回复或业务逻辑生成的内容 + +章节来源 +- [index.html](file://index.html) + +### AI响应模拟机制 +- 使用定时器模拟网络延迟,提升交互真实感 +- 随机选择预设回复,保证多样性 +- 可扩展为HTTP请求或WebSocket,接入真实AI服务 + +章节来源 +- [index.html](file://index.html) + +### 错误处理建议 +- 输入为空:阻止发送并提示用户 +- 网络异常:在模拟响应失败时显示错误提示并允许重试 +- DOM缺失:在关键元素不存在时降级处理或提示用户刷新页面 + +章节来源 +- [index.html](file://index.html) + +### 消息持久化建议 +- 本地存储:使用localStorage或IndexedDB保存最近N条消息 +- 会话标识:为每个智能体会话生成唯一ID,便于检索与恢复 +- 同步策略:在用户登录后同步云端历史消息 +- 清理策略:超过一定时间或数量后清理过期消息 + +章节来源 +- [index.html](file://index.html) \ No newline at end of file diff --git a/有维项目/.qoder/repowiki/zh/content/JavaScript核心逻辑/JavaScript核心逻辑.md b/有维项目/.qoder/repowiki/zh/content/JavaScript核心逻辑/JavaScript核心逻辑.md new file mode 100644 index 0000000..5aa3c69 --- /dev/null +++ b/有维项目/.qoder/repowiki/zh/content/JavaScript核心逻辑/JavaScript核心逻辑.md @@ -0,0 +1,393 @@ +# JavaScript核心逻辑 + + +**本文引用的文件** +- [index.html](file://index.html) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构总览](#架构总览) +5. [详细组件分析](#详细组件分析) +6. [依赖关系分析](#依赖关系分析) +7. [性能考量](#性能考量) +8. [故障排查指南](#故障排查指南) +9. [结论](#结论) +10. [附录](#附录) + +## 简介 +本文件面向“有维项目”的前端JavaScript核心逻辑,聚焦以下主题: +- 页面管理系统:showPage函数、CSS类控制、页面切换动画 +- Tab导航系统:showTab函数、动态激活状态管理 +- AI对话系统:openChat函数、sendMessage函数、addMessage函数、消息渲染与快捷问答 +- 事件处理机制:用户交互监听、表单验证、异步操作 +- 数据交互逻辑:本地存储、状态管理、数据持久化 + +文档将提供完整的代码注释说明与执行流程图,并解释关键算法与数据结构的使用,给出性能优化建议与最佳实践,以及扩展功能与调试技巧。 + +## 项目结构 +该项目采用单页应用(SPA)结构,所有页面与交互逻辑集中在单一HTML文件中,通过内联样式与内联脚本实现: +- 页面容器与切换:通过页面元素的显示/隐藏与CSS类切换实现 +- 导航与Tab:通过按钮点击事件触发状态更新 +- AI对话:通过模态框与消息列表实现交互 +- 事件绑定:通过DOM事件监听与键盘事件处理 + +```mermaid +graph TB +A["index.html
页面与样式定义"] --> B["showPage
页面切换"] +A --> C["showTab
Tab导航切换"] +A --> D["openChat/sendMessage/addMessage
AI对话系统"] +A --> E["事件监听
键盘事件/点击事件"] +B --> F["CSS类控制
.page/.active"] +C --> G["CSS类控制
.tab-btn/.tab-content"] +D --> H["模态框与消息容器
.chat-modal/.chat-messages"] +``` + +图表来源 +- [index.html](file://index.html) + +章节来源 +- [index.html](file://index.html) + +## 核心组件 +本节概述关键JavaScript函数及其职责: +- 页面管理:showPage负责页面切换与激活状态 +- 导航管理:showTab负责Tab按钮与内容区的激活状态 +- 登录处理:handleLogin负责表单校验与页面跳转 +- AI对话:openChat初始化对话、sendMessage发送消息、addMessage渲染消息、sendQuickMessage快捷问答、handleKeyPress回车发送、closeChat关闭对话 +- 事件绑定:模态框背景点击关闭 + +章节来源 +- [index.html](file://index.html) + +## 架构总览 +整体架构围绕“页面容器 + 导航 + 对话”三大部分展开,通过CSS类控制与DOM操作实现无刷新切换与交互。 + +```mermaid +graph TB +subgraph "页面层" +P1["登录页面
.login-page.active"] +P2["仪表盘页面
.dashboard-page"] +P3["AI智能体页面
.ai-page"] +end +subgraph "导航层" +N1["导航栏
.navbar"] +N2["Tab导航
.tab-nav"] +end +subgraph "对话层" +M1["对话模态框
.chat-modal"] +M2["消息列表
.chat-messages"] +M3["输入区域
.chat-input-area"] +end +P1 --> N1 +P2 --> N1 +P2 --> N2 +P3 --> N1 +N1 --> M1 +M1 --> M2 +M1 --> M3 +``` + +图表来源 +- [index.html](file://index.html) + +## 详细组件分析 + +### 页面管理系统 +- 功能职责 + - 切换页面:隐藏所有页面容器,显示目标页面 + - CSS类控制:通过添加/移除“.active”类实现显示与动画 + - 动画效果:页面切换使用淡入动画(fadeIn) + +- 关键实现点 + - 遍历所有页面容器并移除“.active” + - 获取目标页面并添加“.active” + - 页面容器与激活类由CSS定义 + +- 复杂度与性能 + - 时间复杂度:O(n),n为页面数量 + - DOM操作:批量类名切换,性能良好 + - 动画:CSS动画,避免JS动画阻塞 + +- 扩展建议 + - 支持路由参数与历史记录 + - 增加过渡动画参数化 + - 将页面映射抽象为配置对象 + +```mermaid +sequenceDiagram +participant U as "用户" +participant BTN as "导航按钮" +participant JS as "showPage" +participant DOM as "页面容器" +U->>BTN : 点击导航项 +BTN->>JS : 调用 showPage(pageId) +JS->>DOM : 移除所有.page.active +JS->>DOM : 为目标页面添加.active +DOM-->>U : 显示新页面并触发动画 +``` + +图表来源 +- [index.html](file://index.html) + +章节来源 +- [index.html](file://index.html) + +### Tab导航系统 +- 功能职责 + - 切换Tab:隐藏所有Tab按钮与内容区,激活当前项 + - 动态激活状态:按钮与内容区同步更新“.active” + +- 关键实现点 + - 遍历所有“.tab-btn”,移除“.active” + - 遍历所有“.tab-content”,移除“.active” + - 为当前按钮与对应内容区添加“.active” + +- 复杂度与性能 + - 时间复杂度:O(b + c),b为按钮数,c为内容区数 + - DOM操作:批量类名切换,性能良好 + +- 扩展建议 + - 使用事件委托减少监听器数量 + - 支持键盘导航(Tab/Shift+Tab) + - 将按钮与内容区映射抽象为配置对象 + +```mermaid +flowchart TD +Start(["点击Tab按钮"]) --> RemoveActive["移除所有.tab-btn/.tab-content的.active"] +RemoveActive --> AddBtnActive["为当前按钮添加.active"] +AddBtnActive --> AddContentActive["为对应内容区添加.active"] +AddContentActive --> End(["完成切换"]) +``` + +图表来源 +- [index.html](file://index.html) + +章节来源 +- [index.html](file://index.html) + +### 登录处理机制 +- 功能职责 + - 表单验证:检查用户名与密码是否非空 + - 页面跳转:验证通过后切换至仪表盘页面 + +- 关键实现点 + - 阻止默认提交行为 + - 获取输入值并去空白 + - 非空即视为有效,切换页面 + +- 复杂度与性能 + - 时间复杂度:O(1) + - DOM操作:少量输入字段访问 + +- 扩展建议 + - 增加格式校验(邮箱/手机号) + - 引入后端接口进行认证 + - 记住登录状态(localStorage/sessionStorage) + +```mermaid +flowchart TD +S(["提交登录表单"]) --> Prevent["阻止默认提交"] +Prevent --> GetInputs["获取用户名/密码"] +GetInputs --> Validate{"输入非空?"} +Validate --> |否| Alert["提示错误"] +Validate --> |是| Switch["切换到仪表盘页面"] +Alert --> End(["结束"]) +Switch --> End +``` + +图表来源 +- [index.html](file://index.html) + +章节来源 +- [index.html](file://index.html) + +### AI对话系统 +- 功能职责 + - 打开对话:设置标题、头像图标与背景色,显示模态框 + - 发送消息:用户输入消息,渲染用户消息,模拟AI回复 + - 快捷问答:预设问题一键发送 + - 输入处理:回车发送,文本域自适应高度 + - 关闭对话:点击关闭按钮或模态框背景关闭 + +- 关键实现点 + - openChat:更新标题、头像与背景色,初始化消息列表 + - sendMessage:清空输入,调用addMessage渲染用户消息,定时器模拟AI回复 + - addMessage:根据消息类型(用户/机器人)渲染不同样式 + - sendQuickMessage:填充输入并触发发送 + - handleKeyPress:Enter键发送,Shift+Enter换行 + - closeChat:移除模态框“.active” + - 背景点击关闭:事件冒泡判断目标元素 + +- 复杂度与性能 + - 发送消息:O(1)渲染一条消息 + - 消息滚动:每次追加后滚动到底部 + - 定时器:setTimeout用于模拟异步响应 + +- 扩展建议 + - 引入WebSocket或HTTP接口实现真实AI回复 + - 增加消息历史与分页加载 + - 支持表情、图片等富文本消息 + - 本地持久化对话历史(localStorage) + +```mermaid +sequenceDiagram +participant U as "用户" +participant BTN as "快捷问答按钮" +participant JS as "sendQuickMessage" +participant IN as "输入框" +participant SEND as "sendMessage" +participant ADD as "addMessage" +participant TIMER as "定时器" +participant BOT as "AI回复" +U->>BTN : 点击快捷问答 +BTN->>JS : 触发 sendQuickMessage(text) +JS->>IN : 设置输入值 +JS->>SEND : 调用 sendMessage() +SEND->>ADD : 渲染用户消息 +SEND->>TIMER : 设置1秒延迟 +TIMER-->>SEND : 回调 +SEND->>ADD : 渲染AI回复 +ADD-->>U : 显示消息 +``` + +图表来源 +- [index.html](file://index.html) + +章节来源 +- [index.html](file://index.html) + +### 事件处理机制 +- 用户交互监听 + - 导航点击:showPage(pageId) + - Tab点击:showTab(tabId) + - 打开/关闭对话:openChat/closeChat + - 发送消息:sendMessage + - 快捷问答:sendQuickMessage + - 背景点击关闭:模态框事件监听 + +- 表单验证 + - handleLogin:非空校验,任意输入即可通过 + +- 异步操作 + - sendMessage:使用setTimeout模拟AI响应 + - 可替换为fetch或WebSocket实现真实异步 + +- 键盘事件 + - handleKeyPress:Enter发送,Shift+Enter换行 + +- 性能与健壮性 + - 事件委托:可考虑在父容器上统一监听 + - 防抖/节流:对频繁输入可增加防抖 + - 错误处理:当前版本未包含异常捕获,建议补充 + +章节来源 +- [index.html](file://index.html) + +### 数据交互逻辑 +- 本地存储 + - 当前版本未使用localStorage/sessionStorage + - 建议:将用户信息、登录状态、对话历史持久化 + +- 状态管理 + - 页面与Tab状态:通过DOM类名切换维护 + - 对话状态:通过模态框显示/隐藏与消息列表维护 + - 建议:引入轻量状态库或自定义状态管理器 + +- 数据持久化 + - 可通过浏览器存储或后端接口实现 + - 建议:对话历史、用户偏好、登录令牌 + +章节来源 +- [index.html](file://index.html) + +## 依赖关系分析 +- 组件耦合 + - 页面切换与Tab切换相互独立,均依赖DOM类名控制 + - AI对话系统依赖模态框与消息容器 + - 登录处理依赖页面切换 + +- 外部依赖 + - 无外部库依赖,纯原生JavaScript与CSS + +- 潜在循环依赖 + - 未发现循环依赖 + +```mermaid +graph LR +Login["handleLogin"] --> PageSwitch["showPage"] +NavBtn["导航按钮"] --> PageSwitch +TabBtn["Tab按钮"] --> TabSwitch["showTab"] +Card["AI卡片"] --> OpenChat["openChat"] +OpenChat --> Modal["模态框"] +Modal --> SendMsg["sendMessage"] +SendMsg --> AddMsg["addMessage"] +Quick["快捷问答"] --> SendMsg +Close["关闭按钮/背景"] --> CloseChat["closeChat"] +``` + +图表来源 +- [index.html](file://index.html) + +章节来源 +- [index.html](file://index.html) + +## 性能考量 +- DOM操作优化 + - 批量类名切换:已采用遍历移除再添加的方式,性能良好 + - 避免频繁重排:仅在必要时更新类名与内容 + +- 动画与渲染 + - 使用CSS动画(fadeIn/slideUp),避免JS动画阻塞 + - 消息滚动:每次新增消息滚动到底部,建议在大量消息时采用虚拟滚动 + +- 异步处理 + - 当前使用setTimeout模拟异步,建议替换为真实异步请求 + - 对高频输入可增加防抖/节流 + +- 存储与状态 + - 建议引入轻量状态管理与本地存储,减少重复渲染 + +## 故障排查指南 +- 页面无法切换 + - 检查目标页面ID是否存在 + - 确认“.page.active”类是否正确添加/移除 + +- Tab切换无效 + - 检查“.tab-btn”与“.tab-content”的ID是否一致 + - 确认事件绑定是否生效 + +- 对话无法打开/关闭 + - 检查模态框“.chat-modal”类名与点击事件 + - 确认openChat/closeChat函数调用链 + +- 消息不显示 + - 检查addMessage函数的消息拼接与容器ID + - 确认消息列表滚动逻辑 + +- 回车发送无效 + - 检查handleKeyPress事件绑定与按键判断 + +章节来源 +- [index.html](file://index.html) + +## 结论 +本项目以简洁的原生JavaScript实现了页面切换、Tab导航与AI对话交互,配合CSS动画与类名控制,达到良好的用户体验。建议后续引入: +- 真实异步通信(WebSocket/Fetch) +- 本地存储与状态管理 +- 事件委托与防抖/节流 +- 更完善的错误处理与可访问性 + +## 附录 +- 最佳实践 + - 使用事件委托减少监听器数量 + - 将UI状态与业务逻辑分离 + - 为高频操作增加防抖/节流 + - 引入单元测试与集成测试 + +- 扩展方向 + - 对话历史持久化与分页 + - 多语言与主题切换 + - 离线缓存与PWA支持 \ No newline at end of file diff --git a/有维项目/.qoder/repowiki/zh/content/JavaScript核心逻辑/Tab导航系统.md b/有维项目/.qoder/repowiki/zh/content/JavaScript核心逻辑/Tab导航系统.md new file mode 100644 index 0000000..cfd6f13 --- /dev/null +++ b/有维项目/.qoder/repowiki/zh/content/JavaScript核心逻辑/Tab导航系统.md @@ -0,0 +1,366 @@ +# Tab导航系统 + + +**本文档引用的文件** +- [index.html](file://index.html) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概览](#架构概览) +5. [详细组件分析](#详细组件分析) +6. [依赖关系分析](#依赖关系分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 + +有维项目的Tab导航系统是一个基于纯JavaScript实现的前端组件,负责在仪表盘页面中管理多个内容区域的切换。该系统采用简洁的CSS类名切换机制,实现了平滑的动画过渡效果和良好的用户体验。 + +系统的核心功能包括: +- Tab按钮的激活状态管理 +- Tab内容区域的显示隐藏控制 +- CSS类名切换机制 +- 事件处理机制 +- 动画过渡效果 + +## 项目结构 + +有维项目采用单页应用架构,所有功能都集成在一个HTML文件中。Tab导航系统位于仪表盘页面的特定区域内。 + +```mermaid +graph TB +subgraph "页面结构" +LoginPage["登录页面
.login-page"] +DashboardPage["仪表盘页面
.dashboard-page"] +AIPage["AI智能体页面
.ai-page"] +end +subgraph "仪表盘页面内部结构" +Navbar["导航栏
.navbar"] +TabNav["Tab导航
.tab-nav"] +TabContent["Tab内容区域
.tab-content"] +Overview["平台概览
#overview"] +Education["有维教育
#education"] +AITools["AI工具
#ai-tools"] +Alumni["有维校友
#alumni"] +Membership["会员体系
#membership"] +end +DashboardPage --> Navbar +DashboardPage --> TabNav +DashboardPage --> TabContent +TabNav --> Overview +TabNav --> Education +TabNav --> AITools +TabNav --> Alumni +TabNav --> Membership +``` + +**图表来源** +- [index.html:1626-1674](file://index.html#L1626-L1674) + +**章节来源** +- [index.html:1626-1674](file://index.html#L1626-L1674) + +## 核心组件 + +Tab导航系统由三个主要组件构成: + +### 1. Tab按钮组 +- 容器:`.tab-nav` +- 单个按钮:`.tab-btn` +- 激活状态:`.active` + +### 2. Tab内容区域 +- 容器:`.tab-content` +- 单个内容:对应ID元素(如`#overview`) +- 激活状态:`.active` + +### 3. JavaScript控制器 +- 主函数:`showTab(tabId)` +- 辅助函数:`getTabName(tabId)` + +**章节来源** +- [index.html:544-584](file://index.html#L544-L584) +- [index.html:2511-2540](file://index.html#L2511-L2540) + +## 架构概览 + +Tab导航系统采用事件驱动的设计模式,通过点击事件触发状态切换。 + +```mermaid +sequenceDiagram +participant User as "用户" +participant Button as "Tab按钮" +participant JS as "showTab函数" +participant DOM as "DOM元素" +participant CSS as "CSS类名" +User->>Button : 点击Tab按钮 +Button->>JS : 调用showTab(tabId) +JS->>DOM : 获取所有.tab-btn元素 +JS->>DOM : 移除所有.active类名 +JS->>DOM : 获取所有.tab-content元素 +JS->>DOM : 移除所有.active类名 +JS->>DOM : 查找对应按钮并添加.active +JS->>DOM : 为目标内容添加.active +DOM->>CSS : 触发CSS动画效果 +CSS-->>User : 显示新内容 +Note over JS,CSS : 状态同步完成 +``` + +**图表来源** +- [index.html:2511-2528](file://index.html#L2511-L2528) + +## 详细组件分析 + +### showTab函数实现详解 + +`showTab`函数是整个Tab导航系统的核心,负责管理所有状态切换逻辑。 + +#### 函数签名与参数 +- 函数名:`showTab(tabId)` +- 参数:`tabId`(字符串类型,对应目标内容区域的ID) + +#### 实现逻辑分析 + +```mermaid +flowchart TD +Start([函数调用]) --> GetButtons["获取所有.tab-btn元素"] +GetButtons --> RemoveActiveBtns["移除所有按钮的.active类"] +RemoveActiveBtns --> GetContent["获取所有.tab-content元素"] +GetContent --> RemoveActiveContent["移除所有内容的.active类"] +RemoveActiveContent --> FindTargetBtn["查找目标按钮"] +FindTargetBtn --> AddActiveBtn["为目标按钮添加.active类"] +AddActiveBtn --> ShowTargetContent["为目标内容添加.active类"] +ShowTargetContent --> End([函数结束]) +FindTargetBtn --> CheckText{"按钮文本是否包含目标Tab名称?"} +CheckText --> |是| AddActiveBtn +CheckText --> |否| FindNextBtn["检查下一个按钮"] +FindNextBtn --> CheckText +``` + +**图表来源** +- [index.html:2511-2528](file://index.html#L2511-L2528) + +#### 状态管理机制 + +系统采用"全局状态重置 + 局部状态更新"的策略: + +1. **状态重置阶段**:遍历所有Tab按钮和内容区域,统一移除`active`类名 +2. **状态更新阶段**:根据传入的`tabId`定位目标元素,添加`active`类名 + +#### CSS类名切换机制 + +系统使用标准的CSS类名切换来控制视觉状态: + +```mermaid +classDiagram +class TabButton { ++string className ++addActiveClass() ++removeActiveClass() ++isActive() boolean +} +class TabContent { ++string id ++string className ++show() ++hide() ++isVisible() boolean +} +class ActiveState { ++string activeClass = "active" ++applyTo(element) ++removeFrom(element) +} +TabButton --> ActiveState : "切换" +TabContent --> ActiveState : "切换" +``` + +**图表来源** +- [index.html:572-584](file://index.html#L572-L584) + +**章节来源** +- [index.html:2511-2540](file://index.html#L2511-L2540) + +### 事件处理机制 + +#### 点击事件监听 + +每个Tab按钮都绑定了`onclick`事件处理器: + +```javascript + + +``` + +#### 事件传播与处理流程 + +```mermaid +flowchart LR +ClickEvent["点击事件"] --> ButtonHandler["按钮.onclick处理器"] +ButtonHandler --> ShowTab["调用showTab函数"] +ShowTab --> StateReset["重置所有状态"] +StateReset --> StateUpdate["更新目标状态"] +StateUpdate --> DOMUpdate["更新DOM结构"] +DOMUpdate --> CSSAnimation["触发动画效果"] +CSSAnimation --> UserFeedback["用户反馈"] +``` + +**图表来源** +- [index.html:1668-1674](file://index.html#L1668-L1674) + +**章节来源** +- [index.html:1668-1674](file://index.html#L1668-L1674) + +### 动画过渡效果 + +系统实现了多种CSS动画效果来增强用户体验: + +#### 显示动画 +- 使用`fadeIn`动画:0.3秒缓和曲线 +- 应用于所有内容区域的显示切换 + +#### 按钮状态动画 +- 使用`scaleIn`动画:0.2秒缓和曲线 +- 应用于用户菜单的显示 + +#### 滑动动画 +- 使用`slideInRight`动画:0.3秒缓和曲线 +- 应用于页面切换的过渡效果 + +**章节来源** +- [index.html:51-64](file://index.html#L51-L64) +- [index.html:121](file://index.html#L121) + +## 依赖关系分析 + +### 组件间依赖关系 + +```mermaid +graph TD +subgraph "Tab导航系统" +ShowTab["showTab函数"] +GetTabName["getTabName函数"] +TabButtons[".tab-btn元素"] +TabContent[".tab-content元素"] +end +subgraph "样式系统" +ActiveClass["active类名"] +FadeIn["fadeIn动画"] +ScaleIn["scaleIn动画"] +end +subgraph "事件系统" +ClickEvent["点击事件"] +DOMQuery["DOM查询"] +end +ShowTab --> GetTabName +ShowTab --> TabButtons +ShowTab --> TabContent +ShowTab --> ActiveClass +ActiveClass --> FadeIn +ActiveClass --> ScaleIn +TabButtons --> ClickEvent +TabContent --> DOMQuery +``` + +**图表来源** +- [index.html:2511-2540](file://index.html#L2511-L2540) + +### 外部依赖 + +系统具有以下外部依赖特征: + +1. **无外部库依赖**:完全基于原生JavaScript实现 +2. **浏览器兼容性**:使用标准DOM API和CSS3动画 +3. **性能特征**:轻量级实现,无额外运行时开销 + +**章节来源** +- [index.html:2511-2540](file://index.html#L2511-L2540) + +## 性能考虑 + +### 时间复杂度分析 + +- **showTab函数**:O(n)时间复杂度,其中n是页面中Tab按钮和内容区域的总数 +- **状态切换**:每次切换涉及两次DOM查询和多次类名操作 +- **内存使用**:常数级内存开销,仅存储当前用户状态 + +### 优化建议 + +1. **批量DOM操作**:可以考虑使用DocumentFragment减少重排重绘 +2. **事件委托**:对于大量Tab按钮,可以使用事件委托优化性能 +3. **缓存DOM查询结果**:避免重复查询相同元素 + +### 浏览器兼容性 + +系统确保在现代浏览器中的良好兼容性: +- 支持所有主流浏览器(Chrome、Firefox、Safari、Edge) +- 使用标准CSS3动画属性 +- 采用原生JavaScript API + +## 故障排除指南 + +### 常见问题及解决方案 + +#### 问题1:Tab切换无效 +**症状**:点击Tab按钮但内容不变化 +**可能原因**: +- `tabId`参数与实际元素ID不匹配 +- CSS类名冲突 +- JavaScript错误阻止函数执行 + +**解决步骤**: +1. 检查按钮的`onclick`属性中的`tabId`值 +2. 验证对应元素是否存在且ID正确 +3. 打开浏览器开发者工具查看JavaScript错误 + +#### 问题2:激活状态不正确 +**症状**:目标Tab按钮未显示为激活状态 +**可能原因**: +- `getTabName`函数返回值与按钮文本不匹配 +- 按钮文本被修改但逻辑未更新 + +**解决步骤**: +1. 检查`getTabName`函数中的映射表 +2. 验证按钮的`textContent`是否与映射值一致 + +#### 问题3:动画效果异常 +**症状**:切换时缺少动画效果或动画异常 +**可能原因**: +- CSS类名定义缺失 +- CSS动画规则错误 +- 浏览器不支持相关CSS属性 + +**解决步骤**: +1. 检查`.active`类名的CSS定义 +2. 验证动画关键帧定义 +3. 测试不同浏览器的兼容性 + +**章节来源** +- [index.html:2530-2540](file://index.html#L2530-L2540) + +## 结论 + +有维项目的Tab导航系统展现了优秀的前端架构设计: + +### 设计优势 +1. **简洁性**:使用纯JavaScript实现,代码简洁易懂 +2. **可维护性**:清晰的状态管理机制,易于扩展和维护 +3. **用户体验**:流畅的动画过渡效果,提供良好的交互体验 +4. **性能表现**:轻量级实现,无额外性能负担 + +### 技术亮点 +- 采用事件驱动的设计模式 +- 实现了完整的状态同步机制 +- 提供了丰富的CSS动画效果 +- 具备良好的浏览器兼容性 + +### 改进建议 +1. 可以考虑引入更高级的事件处理机制 +2. 对于大量Tab的情况,可以优化DOM查询性能 +3. 增加更多的可访问性支持(键盘导航、屏幕阅读器支持) + +该系统为有维平台提供了稳定可靠的Tab导航功能,为用户提供了直观便捷的内容切换体验。 \ No newline at end of file diff --git a/有维项目/.qoder/repowiki/zh/content/JavaScript核心逻辑/事件处理系统.md b/有维项目/.qoder/repowiki/zh/content/JavaScript核心逻辑/事件处理系统.md new file mode 100644 index 0000000..05dcb9c --- /dev/null +++ b/有维项目/.qoder/repowiki/zh/content/JavaScript核心逻辑/事件处理系统.md @@ -0,0 +1,288 @@ +# 事件处理系统 + + +**本文档引用的文件** +- [index.html](file://index.html) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构总览](#架构总览) +5. [详细组件分析](#详细组件分析) +6. [依赖关系分析](#依赖关系分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 +本文件针对有维项目的事件处理系统进行全面技术文档化,聚焦于用户交互事件的监听与处理机制,涵盖表单提交、按钮点击、键盘输入等事件类型;同时深入解析表单验证逻辑、错误提示与提交状态控制;并结合异步操作(Promise 使用、错误捕获、加载状态管理)给出完整流程图与错误处理示例。文档还解释事件冒泡与委托机制在项目中的应用,并提供性能优化建议与调试技巧,帮助开发者快速理解与维护该系统。 + +## 项目结构 +该项目采用单页应用(SPA)结构,所有页面与交互逻辑集中在单一 HTML 文件中,通过 JavaScript 控制页面切换、用户菜单、Tab 切换、行业筛选以及 AI 聊天对话等交互行为。 + +```mermaid +graph TB +A["index.html
主页面与样式"] --> B["脚本区域
事件处理器与业务逻辑"] +B --> C["页面切换
showPage()"] +B --> D["登录处理
handleLogin()"] +B --> E["用户菜单
toggleUserMenu()/closeAllMenus()"] +B --> F["Tab切换
showTab()"] +B --> G["行业筛选
filterByIndustry()/toggleIndustryMore()"] +B --> H["聊天对话
openChat()/sendMessage()"] +``` + +图表来源 +- [index.html](file://index.html) + +章节来源 +- [index.html](file://index.html) + +## 核心组件 +- 页面切换组件:负责在登录页、仪表盘页、AI 智能体页之间切换,使用类名控制显示隐藏。 +- 登录表单组件:处理用户凭据输入与提交,包含基本校验与加载状态管理。 +- 用户下拉菜单组件:支持点击头像展开菜单,点击外部区域自动收起。 +- Tab 导航组件:在仪表盘页内切换不同内容区。 +- 行业场景筛选组件:支持多标签筛选与“更多”下拉菜单。 +- AI 聊天对话组件:提供模态框、消息列表、快捷问题与键盘输入处理。 + +章节来源 +- [index.html](file://index.html) + +## 架构总览 +事件处理系统围绕 DOM 事件监听与回调函数组织,采用事件委托与直接绑定相结合的方式,确保低耦合与高可维护性。整体交互流程如下: + +```mermaid +sequenceDiagram +participant U as "用户" +participant DOM as "DOM元素" +participant JS as "事件处理器" +participant UI as "UI更新" +U->>DOM : 触发事件点击/输入 +DOM->>JS : 分派事件回调 +JS->>JS : 验证/处理逻辑 +JS->>UI : 更新页面状态/显示提示 +UI-->>U : 反馈结果成功/失败/加载中 +``` + +图表来源 +- [index.html](file://index.html) + +## 详细组件分析 + +### 登录表单事件处理 +- 事件监听:表单元素使用内联属性 onsubmit 绑定处理函数。 +- 处理流程: + - 阻止默认提交(preventDefault),读取用户名与密码字段值; + - 基本非空校验,若通过则显示加载遮罩; + - 模拟异步登录(setTimeout),成功后隐藏加载遮罩、更新用户信息、切换到仪表盘页。 +- 错误处理:输入为空时弹出提示;未实现网络错误捕获与重试逻辑。 +- 加载状态:通过遮罩层控制提交期间的 UI 状态。 + +```mermaid +flowchart TD +Start(["表单提交"]) --> Prevent["阻止默认提交"] +Prevent --> Read["读取用户名/密码"] +Read --> Validate{"是否为空?"} +Validate --> |否| ShowLoading["显示加载遮罩"] +Validate --> |是| Alert["提示输入完整"] +ShowLoading --> Delay["模拟登录延迟"] +Delay --> Success["更新用户信息并切换页面"] +Success --> HideLoading["隐藏加载遮罩"] +Alert --> End(["结束"]) +HideLoading --> End +``` + +图表来源 +- [index.html](file://index.html) + +章节来源 +- [index.html](file://index.html) + +### 用户下拉菜单事件处理 +- 事件监听:头像点击触发菜单展开;文档级点击监听用于关闭菜单。 +- 处理流程: + - 切换菜单激活状态; + - 关闭所有菜单后再按需打开目标菜单; + - 点击页面空白处自动关闭。 +- 事件机制:使用事件冒泡与委托,避免为每个菜单单独绑定监听。 + +```mermaid +sequenceDiagram +participant U as "用户" +participant Avatar as "头像元素" +participant Doc as "文档" +participant Menu as "用户菜单" +U->>Avatar : 点击头像 +Avatar->>Menu : 切换激活状态 +U->>Doc : 点击页面空白 +Doc->>Menu : 关闭所有菜单 +``` + +图表来源 +- [index.html](file://index.html) + +章节来源 +- [index.html](file://index.html) + +### Tab 导航事件处理 +- 事件监听:每个 Tab 按钮绑定点击事件。 +- 处理流程: + - 清除所有按钮与内容的激活状态; + - 根据目标 Tab ID 激活对应按钮与内容区; + - 支持动态映射 Tab 名称与 ID 的关系。 + +```mermaid +flowchart TD +Click["点击Tab按钮"] --> Clear["清除所有激活状态"] +Clear --> ActivateBtn["激活对应按钮"] +ActivateBtn --> ActivateContent["激活对应内容区"] +ActivateContent --> End(["完成"]) +``` + +图表来源 +- [index.html](file://index.html) + +章节来源 +- [index.html](file://index.html) + +### 行业场景筛选事件处理 +- 事件监听:筛选按钮与“更多”按钮分别绑定点击事件;文档级点击监听用于关闭“更多”下拉。 +- 处理流程: + - 切换当前按钮激活状态; + - 关闭“更多”下拉菜单; + - 演示用:显示筛选提示(Toast)。 +- 事件机制:事件冒泡与委托,统一在文档级监听关闭逻辑。 + +```mermaid +sequenceDiagram +participant U as "用户" +participant Filter as "筛选按钮" +participant More as "更多按钮" +participant Drop as "更多下拉" +participant Doc as "文档" +U->>Filter : 点击筛选按钮 +Filter->>Filter : 切换激活状态 +Filter->>Drop : 关闭下拉 +U->>More : 点击“更多” +More->>Drop : 切换激活状态 +U->>Doc : 点击页面空白 +Doc->>Drop : 关闭下拉 +``` + +图表来源 +- [index.html](file://index.html) + +章节来源 +- [index.html](file://index.html) + +### AI 聊天对话事件处理 +- 事件监听:打开聊天、发送消息、快捷问题、键盘输入、模态框背景点击等。 +- 处理流程: + - 打开聊天:设置标题、头像与背景色,初始化消息列表; + - 发送消息:读取输入框内容,添加用户消息,模拟 AI 响应; + - 快捷问题:填充输入框并触发发送; + - 键盘事件:Enter(不含 Shift)触发发送; + - 背景点击:关闭模态框。 +- 异步处理:使用定时器模拟异步响应,便于演示。 + +```mermaid +sequenceDiagram +participant U as "用户" +participant Open as "打开聊天" +participant Send as "发送消息" +participant Quick as "快捷问题" +participant Enter as "键盘事件" +participant Chat as "聊天容器" +U->>Open : 点击卡片 +Open->>Chat : 设置标题/头像/背景 +U->>Send : 点击发送按钮 +Send->>Chat : 添加用户消息 +Send->>Chat : 模拟AI响应 +U->>Quick : 点击快捷问题 +Quick->>Send : 触发发送 +U->>Enter : 按下Enter键 +Enter->>Send : 触发发送 +U->>Chat : 点击背景 +Chat->>Chat : 关闭模态框 +``` + +图表来源 +- [index.html](file://index.html) + +章节来源 +- [index.html](file://index.html) + +## 依赖关系分析 +- 组件间依赖: + - 登录处理依赖页面切换与用户信息更新; + - 用户菜单依赖页面切换(关闭菜单时调用); + - Tab 切换依赖按钮与内容区的类名控制; + - 行业筛选依赖“更多”下拉与文档级点击监听; + - 聊天对话依赖模态框与消息列表。 +- 事件依赖: + - 文档级事件监听用于通用关闭逻辑; + - 按钮点击事件用于具体功能触发; + - 键盘事件用于便捷输入。 + +```mermaid +graph LR +Login["登录处理"] --> PageSwitch["页面切换"] +Login --> UserInfo["用户信息更新"] +UserMenu["用户菜单"] --> PageSwitch +Tabs["Tab切换"] --> Content["内容区"] +Industry["行业筛选"] --> More["更多下拉"] +Chat["聊天对话"] --> Modal["模态框"] +Chat --> Messages["消息列表"] +``` + +图表来源 +- [index.html](file://index.html) + +章节来源 +- [index.html](file://index.html) + +## 性能考虑 +- 事件绑定优化 + - 使用事件委托减少重复绑定,降低内存占用。 + - 将高频事件(如键盘输入)与复杂 DOM 更新分离,避免阻塞主线程。 +- DOM 访问优化 + - 缓存常用节点引用,减少重复查询。 + - 合并多次 DOM 修改,使用批量更新策略。 +- 动画与渲染 + - 使用 CSS 动画替代 JS 动画,提高流畅度。 + - 在长列表渲染时采用虚拟滚动或分页策略。 +- 异步处理 + - 使用防抖/节流控制频繁事件(如输入、滚动)。 + - 对网络请求进行超时与重试策略,避免长时间无响应。 +- 资源管理 + - 及时移除不再使用的事件监听器,防止内存泄漏。 + - 在页面切换时清理定时器与全局状态。 + +## 故障排除指南 +- 登录失败或无反应 + - 检查表单 onsubmit 是否正确绑定; + - 确认 preventDefault 是否生效; + - 查看加载遮罩是否正确显示/隐藏。 +- 用户菜单无法关闭 + - 确认文档级点击监听是否绑定; + - 检查事件冒泡是否被阻止; + - 确保 closeAllMenus 逻辑正确执行。 +- Tab 切换异常 + - 检查按钮与内容区的类名一致性; + - 确认 showTab 中的映射关系是否正确。 +- 行业筛选无效 + - 检查按钮激活状态切换逻辑; + - 确认“更多”下拉的开关逻辑; + - 查看 Toast 提示是否正常显示。 +- 聊天对话无响应 + - 检查输入框是否为空; + - 确认 Enter 键事件是否触发; + - 查看消息列表是否正确追加与滚动到底部。 + +章节来源 +- [index.html](file://index.html) + +## 结论 +有维项目的事件处理系统以简洁的单页结构实现了完整的用户交互闭环,涵盖了登录、菜单、导航、筛选与聊天等核心场景。系统通过事件委托与直接绑定相结合的方式,既保证了灵活性,也兼顾了性能与可维护性。建议后续在以下方面进一步完善:引入更完善的表单验证与错误提示、增强异步错误处理与重试机制、优化键盘输入与高频事件的性能表现,并补充单元测试与集成测试以提升质量保障。 \ No newline at end of file diff --git a/有维项目/.qoder/repowiki/zh/content/JavaScript核心逻辑/数据交互逻辑.md b/有维项目/.qoder/repowiki/zh/content/JavaScript核心逻辑/数据交互逻辑.md new file mode 100644 index 0000000..a887bd1 --- /dev/null +++ b/有维项目/.qoder/repowiki/zh/content/JavaScript核心逻辑/数据交互逻辑.md @@ -0,0 +1,336 @@ +# 数据交互逻辑 + + +**本文引用的文件** +- [index.html](file://index.html) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构总览](#架构总览) +5. [详细组件分析](#详细组件分析) +6. [依赖关系分析](#依赖关系分析) +7. [性能考量](#性能考量) +8. [故障排查指南](#故障排查指南) +9. [结论](#结论) +10. [附录](#附录) + +## 简介 +本文件面向“有维项目”的前端数据交互逻辑,聚焦于本地存储机制(localStorage 使用与替代方案)、状态管理(全局状态变量、页面状态同步、数据更新通知)、数据持久化(用户偏好设置保存、会话状态管理、缓存策略)、数据模型与 API 接口规范、数据流向与状态转换、以及数据安全与隐私保护。由于当前仓库仅包含单页 HTML 文件,本文将基于该文件中的实现进行系统性分析,并在必要处提供概念性补充与最佳实践建议。 + +## 项目结构 +- 项目采用单页应用(SPA)结构,所有页面与交互逻辑集中在单一 HTML 文件中,通过内联样式与脚本实现页面切换、用户交互、AI 对话等功能。 +- 页面由多个“页面容器”组成,通过 JavaScript 控制显示与隐藏,实现无刷新导航。 +- 交互逻辑集中于内联脚本区域,包含用户登录、页面切换、Tab 切换、用户菜单、行业筛选、AI 对话等。 + +```mermaid +graph TB +A["index.html
主入口"] --> B["登录页面(login-page)"] +A --> C["仪表盘页面(dashboard-page)"] +A --> D["AI智能体页面(ai-page)"] +B --> E["登录表单与遮罩(login-loading)"] +C --> F["导航栏(navbar)与Tab导航(tab-nav)"] +C --> G["统计卡片(stats-grid)与内容卡片(content-card)"] +D --> H["行业场景筛选(industry-filter)与AI卡片(ai-grid)"] +A --> I["AI对话弹窗(chat-modal)"] +``` + +图表来源 +- [index.html](file://index.html) + +章节来源 +- [index.html](file://index.html) + +## 核心组件 +- 全局状态变量 + - 当前登录用户:用于标识当前会话用户,影响页面显示与用户信息。 + - 页面切换控制:通过页面容器类名切换实现页面显示。 + - Tab 切换控制:通过按钮与内容块的对应关系实现 Tab 切换。 + - 用户菜单与行业筛选状态:通过类名控制显示/隐藏。 + - AI 对话状态:通过模态框类名控制显示/隐藏。 +- 页面状态同步 + - 登录成功后,更新用户头像、显示名称与欢迎语,确保多处显示一致。 + - Tab 切换时,同步激活按钮与内容块。 + - 用户菜单与行业筛选的互斥显示,避免重叠。 +- 数据更新通知 + - 登录遮罩在登录过程中显示,完成后隐藏,形成“加载完成”的视觉反馈。 + - 行业筛选通过 Toast 提示当前筛选结果,增强用户感知。 +- 本地存储机制 + - 当前实现未直接使用 localStorage 或 IndexedDB;用户偏好与会话状态主要通过内存变量与 DOM 状态维持。 + - 可选替代方案:使用 localStorage 存储用户偏好(如“记住我”)、会话令牌、最近访问页面等;使用 sessionStorage 存储临时会话状态。 +- 数据持久化方案 + - 用户偏好设置:可持久化“记住我”选项、主题偏好、语言偏好等。 + - 会话状态管理:可持久化登录状态、上次访问页面、用户头像与昵称等。 + - 缓存策略:对静态资源(如图标、图片)采用浏览器缓存;对动态数据(如课程列表、AI卡片)采用内存缓存或短期缓存。 +- 数据模型与 API 接口规范 + - 当前实现为前端演示,未涉及真实 API;可定义如下数据模型与接口: + - 用户模型:id、用户名、邮箱、头像、会员等级、注册时间等。 + - 课程模型:id、标题、描述、时长、学员数、标签等。 + - AI 智能体模型:id、名称、类型、描述、图标、标签、功能列表等。 + - 会话模型:会话ID、用户ID、登录时间、过期时间、设备信息等。 + - API 规范:统一的请求头、错误码、分页参数、鉴权方式等。 +- 数据流向与状态转换 + - 登录流程:输入校验 -> 显示加载 -> 设置当前用户 -> 更新用户显示 -> 切换页面。 + - Tab 切换:点击按钮 -> 移除所有激活 -> 激活对应按钮与内容 -> 同步显示。 + - 用户菜单:点击头像 -> 关闭其他菜单 -> 切换当前菜单显示。 + - 行业筛选:点击按钮 -> 移除激活 -> 激活当前按钮 -> 关闭更多下拉 -> 显示提示。 + - AI 对话:点击卡片 -> 设置标题与头像 -> 打开模态框 -> 清空消息 -> 发送消息 -> 模拟回复 -> 自动滚动。 +- 数据安全与隐私保护 + - 当前实现未涉及敏感数据传输;建议在接入真实后端时,采用 HTTPS、JWT 鉴权、CSRF 防护、输入校验与输出编码、最小权限原则等。 + - 本地存储建议:避免存储敏感信息;对存储的数据进行最小化与匿名化处理;提供清除数据的入口与默认清理策略。 + +章节来源 +- [index.html](file://index.html) + +## 架构总览 +本项目采用“单页应用 + 内联脚本”的轻量架构,所有页面与交互逻辑集中在 index.html 中。前端负责状态管理、UI 切换与用户交互,AI 对话采用模拟响应。若扩展为真实系统,建议引入后端 API、数据库与鉴权层,并完善本地存储与缓存策略。 + +```mermaid +graph TB +subgraph "前端" +U["用户界面(UI)"] +S["状态管理(全局变量)"] +L["本地存储(localStorage/sessionStorage)"] +C["缓存策略(内存/短期缓存)"] +A["AI对话(模拟响应)"] +end +subgraph "后端" +API["API服务"] +DB["数据库"] +AUTH["鉴权/会话"] +end +U --> S +S --> L +S --> C +U --> A +A --> S +S --> API +API --> DB +AUTH --> API +``` + +图表来源 +- [index.html](file://index.html) + +## 详细组件分析 + +### 登录与会话管理 +- 功能概述 + - 处理登录表单提交,进行输入校验,显示加载遮罩,设置当前用户,更新用户显示信息,切换至仪表盘页面。 +- 关键流程 + - 输入校验:用户名与密码非空。 + - 加载反馈:显示登录遮罩,模拟登录延迟。 + - 状态更新:设置当前用户、更新头像与显示名称、更新欢迎语。 + - 页面切换:隐藏登录页,显示仪表盘页。 +- 数据模型 + - 用户模型:用户名、头像字符、显示名称等。 +- 安全与隐私 + - 建议:密码不应明文存储;会话令牌应安全存储与传输;提供强制登出与超时处理。 + +```mermaid +sequenceDiagram +participant U as "用户" +participant F as "登录表单" +participant JS as "handleLogin()" +participant UI as "UI更新" +participant LS as "本地存储(可选)" +U->>F : 提交登录 +F->>JS : 触发handleLogin() +JS->>JS : 校验用户名/密码 +JS->>UI : 显示登录遮罩 +JS->>JS : 模拟登录延迟 +JS->>JS : 设置currentUser +JS->>UI : 更新用户头像/名称/欢迎语 +JS->>UI : 隐藏遮罩 +JS->>UI : 切换至仪表盘页面 +JS->>LS : 可选:保存“记住我”偏好 +``` + +图表来源 +- [index.html](file://index.html) + +章节来源 +- [index.html](file://index.html) + +### 页面与Tab切换 +- 功能概述 + - 页面切换:通过页面容器类名控制显示与隐藏。 + - Tab 切换:通过按钮与内容块的对应关系实现激活状态同步。 +- 关键流程 + - 页面切换:移除所有页面的激活类,为目标页面添加激活类。 + - Tab 切换:移除所有按钮与内容的激活类,为目标按钮与内容添加激活类。 +- 数据模型 + - Tab 名称映射:overview、education、ai-tools、alumni、membership。 +- 性能与可用性 + - 建议:避免频繁 DOM 查询,可缓存节点引用;Tab 切换时可考虑懒加载内容。 + +```mermaid +flowchart TD +Start(["Tab切换入口"]) --> RemoveActive["移除所有按钮与内容的激活类"] +RemoveActive --> FindTarget["查找目标按钮与内容"] +FindTarget --> AddActive["为目标按钮与内容添加激活类"] +AddActive --> SyncDisplay["同步显示状态"] +SyncDisplay --> End(["结束"]) +``` + +图表来源 +- [index.html](file://index.html) + +章节来源 +- [index.html](file://index.html) + +### 用户菜单与行业筛选 +- 功能概述 + - 用户菜单:点击头像切换菜单显示,点击外部区域关闭菜单。 + - 行业筛选:点击筛选按钮切换激活状态,支持“更多”下拉菜单。 +- 关键流程 + - 用户菜单:先关闭所有菜单,再根据当前状态切换目标菜单。 + - 行业筛选:移除所有按钮激活状态,激活当前按钮,关闭“更多”下拉,显示筛选提示。 +- 数据模型 + - 行业枚举:all、hr、legal、marketing、admin、education、healthcare、industry、finance、retail、logistics、realestate、agriculture。 +- 可用性与可维护性 + - 建议:将行业列表抽取为配置,便于维护;为筛选增加防抖与键盘导航支持。 + +```mermaid +sequenceDiagram +participant U as "用户" +participant H as "行业筛选按钮" +participant JS as "filterByIndustry()" +participant UI as "UI更新" +U->>H : 点击筛选按钮 +H->>JS : 触发filterByIndustry() +JS->>JS : 移除所有按钮激活状态 +JS->>JS : 激活当前按钮 +JS->>JS : 关闭更多下拉 +JS->>UI : 显示筛选提示 +``` + +图表来源 +- [index.html](file://index.html) + +章节来源 +- [index.html](file://index.html) + +### AI对话系统 +- 功能概述 + - 打开对话:设置标题与头像,清空消息,显示模态框。 + - 发送消息:添加用户消息,模拟 AI 回复,自动滚动到底部。 + - 快捷消息:预设常见问题,一键发送。 +- 关键流程 + - 打开对话:设置标题与头像背景色,清空消息区。 + - 发送消息:输入非空则添加用户消息,延时后添加 AI 回复。 + - 关闭对话:点击背景或关闭按钮关闭模态框。 +- 数据模型 + - 消息模型:文本、发送者(用户/机器人)、时间戳等。 +- 可扩展性 + - 建议:接入真实 API,支持流式响应、上下文管理、消息历史持久化。 + +```mermaid +sequenceDiagram +participant U as "用户" +participant Card as "AI卡片" +participant Open as "openChat()" +participant Modal as "chat-modal" +participant Send as "sendMessage()" +participant Bot as "AI响应" +U->>Card : 点击卡片 +Card->>Open : 设置标题/头像/背景色 +Open->>Modal : 显示模态框并清空消息 +U->>Send : 输入消息并发送 +Send->>Modal : 添加用户消息 +Send->>Bot : 模拟AI回复 +Bot->>Modal : 添加AI消息并自动滚动 +``` + +图表来源 +- [index.html](file://index.html) + +章节来源 +- [index.html](file://index.html) + +## 依赖关系分析 +- 组件耦合 + - 页面切换与 Tab 切换相互独立,但都依赖 DOM 结构的一致性。 + - 用户菜单与行业筛选均依赖“active”类名控制显示状态。 + - AI 对话与页面切换解耦,通过模态框实现独立交互。 +- 外部依赖 + - 本项目未引入第三方库,完全依赖原生 DOM 与浏览器 API。 +- 潜在风险 + - 类名与 ID 的一致性要求较高;DOM 结构变更可能破坏交互。 + - 缺少本地存储与缓存策略,导致刷新后状态丢失。 + +```mermaid +graph TB +P["页面切换(showPage)"] --> DOM["DOM类名控制"] +T["Tab切换(showTab)"] --> DOM +M["用户菜单(toggleUserMenu)"] --> DOM +I["行业筛选(filterByIndustry)"] --> DOM +C["AI对话(openChat/sendMessage)"] --> DOM +``` + +图表来源 +- [index.html](file://index.html) + +章节来源 +- [index.html](file://index.html) + +## 性能考量 +- DOM 操作优化 + - 减少重复查询:将常用节点缓存为变量。 + - 批量更新:合并多次 DOM 修改,减少重排重绘。 +- 事件处理 + - 为高频事件绑定使用节流/防抖,降低 CPU 占用。 +- 资源加载 + - 图片与静态资源启用浏览器缓存;对动态内容采用内存缓存。 +- 交互反馈 + - 加载遮罩与 Toast 提示提升用户体验,但需避免过度使用。 + +## 故障排查指南 +- 登录失败 + - 检查用户名与密码是否为空;确认遮罩是否正确显示与隐藏。 + - 若出现“无法切换页面”,检查页面容器 ID 是否与切换函数一致。 +- Tab 不显示 + - 检查按钮文本与内容块 ID 是否匹配;确认“active”类名是否正确添加。 +- 用户菜单不关闭 + - 检查点击外部区域的事件监听是否生效;确认“active”类名移除逻辑。 +- 行业筛选无效 + - 检查按钮点击事件绑定;确认“active”类名切换与“更多”下拉关闭逻辑。 +- AI 对话异常 + - 检查输入框值是否为空;确认消息添加与自动滚动逻辑;查看模拟响应是否触发。 + +章节来源 +- [index.html](file://index.html) + +## 结论 +本项目以单页 HTML 实现了完整的前端交互逻辑,涵盖登录、页面切换、Tab 导航、用户菜单、行业筛选与 AI 对话等核心功能。当前实现未使用本地存储与缓存策略,状态依赖内存与 DOM。建议后续引入本地存储(localStorage/sessionStorage)、缓存策略、真实 API 接入与鉴权机制,并完善数据安全与隐私保护措施,以满足生产环境的需求。 + +## 附录 +- 数据模型示例(概念性) + - 用户模型 + - 字段:id、username、email、avatar、memberLevel、createdAt + - 示例:{"id":"user_001","username":"张三","email":"zhang@example.com","avatar":"Z","memberLevel":"professional","createdAt":"2025-01-01T00:00:00Z"} + - 课程模型 + - 字段:id、title、description、duration、students + - 示例:{"id":"course_001","title":"商业模式设计","description":"掌握商业画布、价值主张设计","duration":"32课时","students":1200} + - AI智能体模型 + - 字段:id、name、type、description、icon、tags + - 示例:{"id":"ai_001","name":"AISM平台智能客服","type":"客服","description":"7×24小时在线服务","icon":"🎯","tags":["客户服务","即时响应"]} + - 会话模型 + - 字段:sessionId、userId、loginTime、expiresAt、deviceInfo + - 示例:{"sessionId":"sess_abc","userId":"user_001","loginTime":"2025-03-20T10:00:00Z","expiresAt":"2025-03-20T11:00:00Z","deviceInfo":"Web Chrome"} +- API 接口规范(概念性) + - 认证 + - POST /api/auth/login + - 请求体:{"username":"张三","password":"...","rememberMe":true} + - 成功响应:{"token":"...","user":{"id":"user_001","username":"张三","avatar":"Z"}} + - 课程 + - GET /api/courses?page=1&limit=12 + - 成功响应:{"data":[{"id":"course_001","title":"商业模式设计","duration":"32课时"}],"total":100} + - AI智能体 + - GET /api/ai/list?type=客服&industry=all + - 成功响应:{"data":[{"id":"ai_001","name":"AISM平台智能客服","icon":"🎯"}]} + - 会话 + - GET /api/session/current + - 成功响应:{"sessionId":"sess_abc","userId":"user_001","expiresAt":"2025-03-20T11:00:00Z"} \ No newline at end of file diff --git a/有维项目/.qoder/repowiki/zh/content/JavaScript核心逻辑/页面管理系统.md b/有维项目/.qoder/repowiki/zh/content/JavaScript核心逻辑/页面管理系统.md new file mode 100644 index 0000000..cef6e6f --- /dev/null +++ b/有维项目/.qoder/repowiki/zh/content/JavaScript核心逻辑/页面管理系统.md @@ -0,0 +1,422 @@ +# 页面管理系统 + + +**本文档引用的文件** +- [index.html](file://index.html) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概览](#架构概览) +5. [详细组件分析](#详细组件分析) +6. [依赖关系分析](#依赖关系分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) + +## 简介 + +有维项目是一个基于HTML/CSS/JavaScript的单页应用页面管理系统,采用纯前端技术实现页面切换、动画效果和用户交互。该系统实现了完整的页面管理功能,包括页面容器结构、CSS动画实现、事件绑定机制等核心特性。 + +系统主要包含三个核心页面: +- 登录页面:用户认证入口 +- 仪表盘页面:主控制面板,包含多个功能模块 +- AI智能体页面:AI助手功能集合 + +## 项目结构 + +该项目采用单一HTML文件的架构设计,所有页面、样式和JavaScript代码都集成在一个文件中,便于部署和维护。 + +```mermaid +graph TB +subgraph "页面容器" +LoginPage["登录页面
.page.login-page.active"] +DashboardPage["仪表盘页面
.page.dashboard-page"] +AIPage["AI智能体页面
.page.ai-page"] +end +subgraph "UI组件" +Navbar["导航栏
.navbar"] +TabNav["标签导航
.tab-nav"] +ChatModal["聊天弹窗
.chat-modal"] +end +subgraph "动画系统" +FadeIn["淡入动画
@keyframes fadeIn"] +SlideUp["滑入动画
@keyframes slideUp"] +ScaleIn["缩放动画
@keyframes scaleIn"] +end +LoginPage --> FadeIn +DashboardPage --> FadeIn +AIPage --> FadeIn +ChatModal --> SlideUp +Navbar --> ScaleIn +``` + +**图表来源** +- [index.html:40-54](file://index.html#L40-L54) +- [index.html:1083-1115](file://index.html#L1083-L1115) +- [index.html:1461-1528](file://index.html#L1461-L1528) + +**章节来源** +- [index.html:1461-1528](file://index.html#L1461-L1528) +- [index.html:1531-2135](file://index.html#L1531-L2135) +- [index.html:2138-2292](file://index.html#L2138-L2292) + +## 核心组件 + +### 页面容器系统 + +系统采用统一的页面容器结构,每个页面都封装在具有`.page`类的容器中,并通过`.active`类控制显示状态。 + +```mermaid +classDiagram +class PageContainer { ++string className ++HTMLElement element ++show() void ++hide() void ++isActive() boolean +} +class LoginPage { ++HTMLElement loginForm ++handleLogin() void ++show() void +} +class DashboardPage { ++HTMLElement navbar ++HTMLElement tabNav ++showTab() void +} +class AIPage { ++HTMLElement aiGrid ++openChat() void +} +PageContainer <|-- LoginPage +PageContainer <|-- DashboardPage +PageContainer <|-- AIPage +``` + +**图表来源** +- [index.html:41-49](file://index.html#L41-L49) +- [index.html:1461-1528](file://index.html#L1461-L1528) +- [index.html:1531-2135](file://index.html#L1531-L2135) +- [index.html:2138-2292](file://index.html#L2138-L2292) + +### CSS类名控制机制 + +系统通过CSS类名控制页面显示状态,核心机制如下: + +- `.page`:定义页面容器的基础样式,初始状态为隐藏 +- `.page.active`:激活类,控制页面显示 +- `.tab-content`:标签内容区域的显示控制 +- `.tab-content.active`:标签内容的激活状态 + +**章节来源** +- [index.html:41-49](file://index.html#L41-L49) +- [index.html:577-584](file://index.html#L577-L584) + +## 架构概览 + +系统采用事件驱动的架构模式,通过JavaScript事件处理器控制页面切换和状态管理。 + +```mermaid +sequenceDiagram +participant User as "用户" +participant DOM as "DOM元素" +participant JS as "JavaScript" +participant Page as "页面容器" +User->>DOM : 点击导航按钮 +DOM->>JS : 触发onclick事件 +JS->>JS : showPage(pageId) +JS->>Page : 隐藏所有页面 +JS->>Page : 显示目标页面 +Page->>DOM : 应用active类 +DOM->>User : 显示新页面 +Note over JS,Page : 页面切换完成 +``` + +**图表来源** +- [index.html:2333-2338](file://index.html#L2333-L2338) +- [index.html:1538](file://index.html#L1538) +- [index.html:2146](file://index.html#L2146) + +## 详细组件分析 + +### showPage函数实现原理 + +`showPage`函数是页面管理系统的核心控制器,负责页面间的切换和状态管理。 + +#### 函数执行流程 + +```mermaid +flowchart TD +Start([函数调用 showPage]) --> GetElements["获取所有.page元素"] +GetElements --> RemoveActive["移除所有.active类"] +RemoveActive --> GetTarget["获取目标页面元素"] +GetTarget --> AddActive["添加.active类到目标页面"] +AddActive --> End([切换完成]) +GetElements --> ValidateInput{"验证参数"} +ValidateInput --> |无效| ErrorHandler["错误处理"] +ValidateInput --> |有效| RemoveActive +ErrorHandler --> End +``` + +**图表来源** +- [index.html:2333-2338](file://index.html#L2333-L2338) + +#### 实现细节分析 + +1. **元素选择机制**:使用`querySelectorAll('.page')`获取所有页面容器 +2. **状态清理**:遍历所有页面,移除`active`类确保只有一个页面处于激活状态 +3. **目标定位**:通过`getElementById(pageId)`精确定位目标页面 +4. **状态应用**:为目标页面添加`active`类触发动画效果 + +**章节来源** +- [index.html:2333-2338](file://index.html#L2333-L2338) + +### 页面切换动画效果 + +系统实现了多层次的动画效果,通过CSS关键帧动画实现流畅的页面切换体验。 + +#### 动画类型与实现 + +```mermaid +graph LR +subgraph "页面切换动画" +FadeIn["fadeIn
0.3秒
透明度+位移"] +SlideUp["slideUp
0.3秒
垂直位移"] +ScaleIn["scaleIn
0.2秒
缩放效果"] +end +subgraph "应用位置" +LoginPage["登录页面
.login-page"] +DashboardPage["仪表盘页面
.dashboard-page"] +ChatModal["聊天弹窗
.chat-modal"] +UserMenu["用户菜单
.user-menu"] +end +FadeIn --> LoginPage +FadeIn --> DashboardPage +SlideUp --> ChatModal +ScaleIn --> UserMenu +``` + +**图表来源** +- [index.html:51-54](file://index.html#L51-L54) +- [index.html:1112-1115](file://index.html#L1112-L1115) +- [index.html:121-126](file://index.html#L121-L126) + +#### 动画实现机制 + +1. **CSS关键帧定义**:在样式表中预定义动画效果 +2. **类名控制**:通过添加/移除`active`类触发动画 +3. **硬件加速**:使用`transform`属性实现GPU加速 +4. **性能优化**:合理的时间设置避免动画卡顿 + +**章节来源** +- [index.html:51-54](file://index.html#L51-L54) +- [index.html:1112-1115](file://index.html#L1112-L1115) + +### 页面显示隐藏逻辑 + +系统采用"显示-隐藏"的双层控制机制,确保页面切换的准确性和一致性。 + +#### 显示控制机制 + +```mermaid +stateDiagram-v2 +[*] --> Hidden +Hidden --> Active : 添加.active类 +Active --> Hidden : 移除.active类 +note right of Active +页面可见 +执行动画效果 +end note +note right of Hidden +页面隐藏 +不执行动画 +end note +``` + +**图表来源** +- [index.html:41-49](file://index.html#L41-L49) +- [index.html:577-584](file://index.html#L577-L584) + +#### DOM元素操作策略 + +1. **批量操作**:使用`querySelectorAll`一次性获取所有相关元素 +2. **循环处理**:通过`forEach`遍历并统一处理元素状态 +3. **精确控制**:使用`getElementById`精确定位目标元素 +4. **状态同步**:确保同一时刻只有一个页面处于激活状态 + +**章节来源** +- [index.html:2334-2337](file://index.html#L2334-L2337) + +### 事件绑定机制 + +系统采用内联事件绑定和事件监听器两种方式实现用户交互。 + +#### 事件绑定模式 + +```mermaid +graph TB +subgraph "事件绑定方式" +InlineEvents["内联事件
onclick/onsubmit"] +EventListeners["事件监听器
addEventListener"] +end +subgraph "应用场景" +NavButtons["导航按钮
showPage()"] +LoginForm["登录表单
handleLogin()"] +ChatWindow["聊天窗口
openChat/closeChat"] +QuickButtons["快捷按钮
sendQuickMessage()"] +end +InlineEvents --> NavButtons +InlineEvents --> LoginForm +EventListeners --> ChatWindow +EventListeners --> QuickButtons +``` + +**图表来源** +- [index.html:1538](file://index.html#L1538) +- [index.html:1497](file://index.html#L1497) +- [index.html:2449-2453](file://index.html#L2449-L2453) + +#### 事件处理流程 + +1. **用户交互**:用户点击或提交表单 +2. **事件捕获**:浏览器捕获事件并传递给处理器 +3. **业务逻辑**:执行相应的JavaScript函数 +4. **状态更新**:更新DOM状态和页面显示 + +**章节来源** +- [index.html:1538](file://index.html#L1538) +- [index.html:1497](file://index.html#L1497) +- [index.html:2449-2453](file://index.html#L2449-L2453) + +## 依赖关系分析 + +系统采用松耦合的设计,各组件之间通过标准的DOM API进行通信。 + +```mermaid +graph TD +subgraph "核心依赖" +DOMAPI["DOM API
getElementById/querySelectorAll"] +CSSClasses["CSS类名
.page/.active"] +EventHandlers["事件处理器
onclick/onsubmit"] +end +subgraph "页面组件" +LoginPage["登录页面"] +DashboardPage["仪表盘页面"] +AIPage["AI智能体页面"] +ChatModal["聊天弹窗"] +end +subgraph "动画系统" +FadeAnimation["淡入动画"] +SlideAnimation["滑入动画"] +ScaleAnimation["缩放动画"] +end +DOMAPI --> LoginPage +DOMAPI --> DashboardPage +DOMAPI --> AIPage +DOMAPI --> ChatModal +CSSClasses --> FadeAnimation +CSSClasses --> SlideAnimation +CSSClasses --> ScaleAnimation +EventHandlers --> LoginPage +EventHandlers --> DashboardPage +EventHandlers --> AIPage +``` + +**图表来源** +- [index.html:2333-2338](file://index.html#L2333-L2338) +- [index.html:41-49](file://index.html#L41-L49) + +### 组件耦合度分析 + +- **低耦合**:各页面组件相互独立,通过统一的接口进行通信 +- **高内聚**:每个组件专注于特定的功能领域 +- **可扩展性**:新增页面只需遵循现有的命名规范和事件模式 + +**章节来源** +- [index.html:2333-2338](file://index.html#L2333-L2338) +- [index.html:41-49](file://index.html#L41-L49) + +## 性能考虑 + +### 动画性能优化 + +1. **硬件加速**:使用`transform`属性而非改变布局属性 +2. **动画时长**:合理的动画时长避免过度消耗CPU资源 +3. **批量DOM操作**:减少DOM查询和修改次数 + +### 内存管理 + +1. **事件清理**:及时移除不需要的事件监听器 +2. **对象复用**:避免创建不必要的临时对象 +3. **垃圾回收**:及时释放不再使用的变量引用 + +### 加载优化 + +1. **单文件架构**:减少HTTP请求次数 +2. **内联样式**:避免额外的CSS文件请求 +3. **延迟初始化**:按需加载非关键功能 + +## 故障排除指南 + +### 常见问题及解决方案 + +#### 页面无法切换 + +**问题症状**:点击导航按钮后页面无变化 + +**可能原因**: +1. `pageId`参数传递错误 +2. 目标元素不存在 +3. CSS类名冲突 + +**解决步骤**: +1. 检查页面ID是否正确 +2. 验证元素是否存在 +3. 确认CSS类名拼写 + +#### 动画效果异常 + +**问题症状**:页面切换时无动画效果 + +**可能原因**: +1. CSS关键帧定义缺失 +2. `active`类未正确应用 +3. 浏览器不支持相关CSS属性 + +**解决步骤**: +1. 检查CSS关键帧定义 +2. 验证类名应用逻辑 +3. 测试不同浏览器兼容性 + +#### 事件绑定失效 + +**问题症状**:点击按钮无响应 + +**可能原因**: +1. 事件处理器未正确绑定 +2. 元素加载时机问题 +3. JavaScript语法错误 + +**解决步骤**: +1. 检查事件绑定语法 +2. 验证元素加载顺序 +3. 使用浏览器开发者工具调试 + +**章节来源** +- [index.html:2333-2338](file://index.html#L2333-L2338) +- [index.html:2341-2352](file://index.html#L2341-L2352) + +## 结论 + +有维项目的页面管理系统展现了优秀的前端架构设计,通过简洁的代码实现了复杂的功能。系统的主要优势包括: + +1. **架构清晰**:采用统一的页面容器和类名控制机制 +2. **性能优秀**:合理的动画实现和DOM操作策略 +3. **易于维护**:松耦合的设计和标准化的事件处理 +4. **用户体验佳**:流畅的动画效果和直观的交互设计 + +该系统为类似的应用程序提供了良好的参考模板,展示了如何在保持代码简洁的同时实现丰富的用户界面功能。 \ No newline at end of file diff --git a/有维项目/.qoder/repowiki/zh/content/快速开始.md b/有维项目/.qoder/repowiki/zh/content/快速开始.md new file mode 100644 index 0000000..f687920 --- /dev/null +++ b/有维项目/.qoder/repowiki/zh/content/快速开始.md @@ -0,0 +1,270 @@ +# 快速开始 + + +**本文引用的文件** +- [index.html](file://index.html) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构总览](#架构总览) +5. [详细组件分析](#详细组件分析) +6. [依赖关系分析](#依赖关系分析) +7. [性能注意事项](#性能注意事项) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) +10. [附录](#附录) + +## 简介 +本指南面向新用户,帮助你在5分钟内完成“有维商学”项目的本地运行与核心体验。该项目是一个单页应用(SPA),无需服务器或数据库,直接在现代浏览器中打开 index.html 即可运行。你将体验到: +- 注册/登录流程(任意账号均可登录) +- 仪表盘概览与导航 +- AI智能体对话入口与演示对话 +- 教育资源浏览与学习路径 +- 校友社群与活动信息 +- 会员体系与权益对比 + +## 项目结构 +项目采用单文件 HTML 架构,所有样式、交互逻辑均内嵌于 index.html 中,便于零配置运行。 + +```mermaid +graph TB +A["index.html
主页面文件"] --> B["登录页面(login-page)"] +A --> C["仪表盘页面(dashboard-page)"] +A --> D["AI智能体页面(ai-page)"] +A --> E["AI对话弹窗(chat-modal)"] +B --> F["表单与登录逻辑"] +C --> G["导航栏与Tab切换"] +C --> H["统计卡片与内容网格"] +C --> I["教育/AI/校友/会员四个Tab"] +D --> J["智能体卡片与筛选"] +E --> K["消息列表与快捷问答"] +``` + +图表来源 +- [index.html](file://index.html) + +章节来源 +- [index.html](file://index.html) + +## 核心组件 +- 登录页面:提供手机号/邮箱与密码登录,支持微信与手机验证码登录,以及“立即注册”跳转提示。 +- 仪表盘页面:包含导航栏、Tab导航(平台概览、有维教育、AI工具、有维校友、会员体系),以及各模块的内容卡片与网格布局。 +- AI智能体页面:集中展示各类AI助手卡片,支持搜索与分类筛选。 +- AI对话弹窗:用于与不同AI助手进行对话,内置快捷问答与消息发送逻辑。 + +章节来源 +- [index.html](file://index.html) + +## 架构总览 +该应用为纯前端 SPA,页面切换与交互通过 JavaScript 控制,无任何外部依赖。核心交互包括: +- 页面切换:通过类名控制页面显示/隐藏 +- Tab切换:激活对应 Tab 的按钮与内容区域 +- 登录校验:任意非空账号密码均可登录 +- AI对话:打开弹窗、发送消息、模拟响应 + +```mermaid +sequenceDiagram +participant U as "用户" +participant L as "登录页面" +participant D as "仪表盘页面" +participant A as "AI智能体页面" +participant M as "AI对话弹窗" +U->>L : 输入账号/密码并提交 +L->>L : 校验输入 +L-->>U : 登录成功 +L->>D : 切换到仪表盘页面 +U->>D : 点击导航或Tab +D-->>U : 展示对应内容 +U->>A : 点击“AI智能体” +A-->>U : 展示智能体卡片 +U->>M : 点击卡片打开对话 +M-->>U : 显示欢迎消息 +U->>M : 输入问题并发送 +M-->>U : 模拟AI回复 +``` + +图表来源 +- [index.html](file://index.html) + +## 详细组件分析 + +### 登录页面 +- 功能要点 + - 表单字段:手机号/邮箱、密码 + - 选项:记住我、忘记密码 + - 社交登录:微信、手机验证码 + - 注册引导 +- 登录逻辑 + - 阻止默认提交,校验用户名与密码非空 + - 任意有效输入即切换到仪表盘页面 + +```mermaid +flowchart TD +Start(["进入登录页面"]) --> Input["填写账号/密码"] +Input --> Submit{"点击登录"} +Submit --> |任意非空| GoDash["切换到仪表盘页面"] +Submit --> |为空| Alert["提示输入完整"] +GoDash --> End(["完成"]) +Alert --> Input +``` + +图表来源 +- [index.html](file://index.html) + +章节来源 +- [index.html](file://index.html) + +### 仪表盘页面 +- 导航栏:首页、AI智能体、学习中心、校友社群 +- Tab导航:平台概览、有维教育、AI工具、有维校友、会员体系 +- 内容模块 + - 平台概览:统计卡片与平台使命介绍 + - 有维教育:课程体系与学习路径 + - AI工具:智能体矩阵与核心特性 + - 有维校友:权益介绍、近期活动、校友心声 + - 会员体系:三种会员方案与权益对比 + +```mermaid +graph TB +N["导航栏"] --> T["Tab导航"] +T --> O["平台概览"] +T --> E["有维教育"] +T --> AT["AI工具"] +T --> AL["有维校友"] +T --> M["会员体系"] +``` + +图表来源 +- [index.html](file://index.html) + +章节来源 +- [index.html](file://index.html) + +### AI智能体页面 +- 搜索与筛选:支持按类型筛选智能体 +- 智能体卡片:展示名称、标签、功能特性与“开始对话”按钮 +- 点击卡片:打开 AI 对话弹窗,初始化欢迎消息 + +```mermaid +sequenceDiagram +participant U as "用户" +participant P as "AI页面" +participant W as "对话弹窗" +U->>P : 点击智能体卡片 +P->>W : 打开弹窗并设置头像/标题 +W-->>U : 显示欢迎消息 +U->>W : 输入问题并发送 +W-->>U : 模拟AI回复 +``` + +图表来源 +- [index.html](file://index.html) + +章节来源 +- [index.html](file://index.html) + +### AI对话弹窗 +- 头部:显示智能体头像与状态 +- 消息区:用户消息与AI回复分左右显示 +- 快捷问答:预设常见问题,一键发送 +- 输入与发送:支持回车发送,自动滚动到底部 + +```mermaid +flowchart TD +Open["打开弹窗"] --> Init["初始化欢迎消息"] +Init --> Input["用户输入问题"] +Input --> Send{"发送消息"} +Send --> |用户| AddUser["添加用户消息"] +AddUser --> Wait["等待AI回复"] +Wait --> AddBot["添加AI回复"] +AddBot --> Scroll["滚动到底部"] +Send --> |快捷问答| Quick["填充并发送"] +Quick --> AddUser +``` + +图表来源 +- [index.html](file://index.html) + +章节来源 +- [index.html](file://index.html) + +## 依赖关系分析 +- 无外部依赖:所有样式与脚本均内嵌于 index.html +- 浏览器兼容性:使用现代 CSS 与 ES5 JavaScript,适配主流浏览器 +- 文件耦合:页面切换与交互逻辑集中在同一文件,便于维护与部署 + +```mermaid +graph TB +F["index.html"] --> S["内联样式"] +F --> J["内联脚本"] +F --> P1["登录页面"] +F --> P2["仪表盘页面"] +F --> P3["AI页面"] +F --> P4["对话弹窗"] +``` + +图表来源 +- [index.html](file://index.html) + +章节来源 +- [index.html](file://index.html) + +## 性能注意事项 +- 单页应用:页面切换无刷新,交互流畅 +- 资源内嵌:无需额外资源加载,启动速度快 +- 响应式设计:针对移动端与平板进行了适配 + +## 故障排除指南 +- 无法打开页面 + - 确认已将 index.html 放置于可被浏览器访问的目录 + - 使用现代浏览器打开,避免使用过旧版本IE +- 登录失败 + - 任意非空账号密码均可登录;请检查输入是否为空 +- 页面空白或样式异常 + - 清理浏览器缓存后重试 + - 更换浏览器尝试 +- 对话无响应 + - 确认已正确打开对话弹窗 + - 检查浏览器控制台是否有错误(如跨域限制) + +章节来源 +- [index.html](file://index.html) + +## 结论 +“有维商学”项目以极简方式实现了完整的前端体验,新用户可在5分钟内完成本地运行并体验核心功能。建议在现代浏览器中直接打开 index.html 即可开始使用。 + +## 附录 + +### 环境要求 +- 现代浏览器即可运行(Chrome、Edge、Firefox、Safari 等) + +### 本地部署步骤 +1. 将仓库根目录下的 index.html 文件保存至本地任意位置 +2. 双击或右键选择“在浏览器中打开”以启动应用 +3. 在登录页面输入任意非空账号与密码,点击登录 +4. 成功进入仪表盘后,可自由切换导航与Tab体验各模块 + +### 基本使用方法 +- 注册/登录:在登录页面输入任意非空账号与密码,点击登录 +- 浏览仪表盘:使用顶部导航与Tab切换查看平台概览、教育、AI工具、校友与会员体系 +- 使用AI工具:在“AI智能体”页面选择相应智能体卡片,打开对话弹窗进行交流 +- 访问教育资源:在“有维教育”Tab中查看课程体系与学习路径 +- 校友与活动:在“有维校友”Tab中查看权益、活动与校友心声 +- 会员体系:在“会员体系”Tab中对比不同会员方案与权益 + +### 截图与操作步骤 +- 登录页面 + - 步骤:打开 index.html → 输入任意账号/密码 → 点击登录 → 进入仪表盘 +- 仪表盘概览 + - 步骤:在仪表盘中点击“平台概览”Tab → 查看统计卡片与使命介绍 +- AI智能体对话 + - 步骤:点击“AI智能体” → 选择智能体卡片 → 打开对话弹窗 → 输入问题 → 查看AI回复 +- 教育资源 + - 步骤:点击“学习中心” → 在“有维教育”Tab中查看课程与学习路径 +- 校友社群 + - 步骤:点击“校友社群” → 查看权益、活动与校友心声 +- 会员体系 + - 步骤:点击“会员体系” → 对比基础版/专业版/企业版权益 \ No newline at end of file diff --git a/有维项目/.qoder/repowiki/zh/content/扩展与集成/API集成方案.md b/有维项目/.qoder/repowiki/zh/content/扩展与集成/API集成方案.md new file mode 100644 index 0000000..2acb064 --- /dev/null +++ b/有维项目/.qoder/repowiki/zh/content/扩展与集成/API集成方案.md @@ -0,0 +1,327 @@ +# API集成方案 + + +**本文档引用的文件** +- [index.html](file://index.html) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构总览](#架构总览) +5. [详细组件分析](#详细组件分析) +6. [依赖关系分析](#依赖关系分析) +7. [性能考量](#性能考量) +8. [故障排查指南](#故障排查指南) +9. [结论](#结论) +10. [附录](#附录) + +## 简介 +本文件面向“有维项目”的API集成与前端交互,基于仓库中提供的单页应用入口文件,梳理用户认证、数据存储、第三方服务集成(微信登录、短信、支付)相关的RESTful API规范、认证与安全策略、调用示例、错误处理、性能优化、版本管理与迁移、限流与缓存、监控告警等。由于当前仓库仅包含前端页面与脚本,本文档在未直接分析具体后端实现的前提下,提供可落地的API集成蓝图与最佳实践,便于前后端协作与后续扩展。 + +## 项目结构 +- 仓库根目录包含一个HTML入口文件,内含完整的前端页面结构、样式与脚本,涵盖登录、仪表盘、AI智能体等页面与交互逻辑。 +- 该HTML文件承担了用户认证、页面切换、用户菜单、AI对话等前端功能,但未包含任何后端API调用逻辑。 + +```mermaid +graph TB +A["index.html
前端入口"] --> B["登录页面
表单与社交登录"] +A --> C["仪表盘页面
导航与Tab"] +A --> D["AI智能体页面
对话与筛选"] +A --> E["聊天弹窗
消息收发"] +A --> F["用户菜单
账户设置与退出"] +``` + +图表来源 +- [index.html](file://index.html) + +章节来源 +- [index.html](file://index.html) + +## 核心组件 +- 登录与认证:包含用户名/密码登录、记住我、忘记密码、社交登录(微信、手机验证码)等入口。 +- 仪表盘:包含平台概览、有维教育、AI工具、有维校友、会员体系等Tab页面。 +- AI智能体:提供多种AI助手卡片,支持快速问答与对话。 +- 用户菜单:用户头像、通知、账户设置、退出登录。 +- 聊天对话:模态框内的消息发送、快捷问答、自动滚动。 + +章节来源 +- [index.html](file://index.html) + +## 架构总览 +前端采用单页应用(SPA)模式,页面通过JavaScript控制切换与状态更新;用户认证与业务数据通过后端API提供。下图展示了从前端到后端的关键交互路径。 + +```mermaid +graph TB +subgraph "前端" +U["用户界面
index.html"] --> L["登录流程"] +U --> D["仪表盘与Tab"] +U --> A["AI智能体与对话"] +U --> M["用户菜单"] +end +subgraph "后端API" +AUTH["认证服务
登录/注册/会话"] +DATA["数据服务
用户信息/课程/对话历史"] +THIRD["第三方服务
微信/短信/支付"] +end +L --> AUTH +D --> DATA +A --> DATA +M --> AUTH +AUTH --> THIRD +DATA --> THIRD +``` + +图表来源 +- [index.html](file://index.html) + +## 详细组件分析 + +### 用户认证API +- 登录接口 + - 方法与URL:POST /api/v1/auth/login + - 请求参数: + - username: 字符串,支持手机号或邮箱 + - password: 字符串 + - rememberMe: 布尔值(可选) + - 成功响应:返回令牌与用户信息 + - 失败响应:返回错误码与错误信息 +- 注册接口 + - 方法与URL:POST /api/v1/auth/register + - 请求参数: + - username: 字符串 + - email: 字符串 + - password: 字符串 + - 成功响应:返回用户ID与状态 + - 失败响应:返回错误码与错误信息 +- 忘记密码接口 + - 方法与URL:POST /api/v1/auth/forgot-password + - 请求参数: + - email: 字符串 + - 成功响应:返回操作结果 + - 失败响应:返回错误码与错误信息 +- 社交登录接口 + - 微信登录 + - 方法与URL:POST /api/v1/auth/wechat + - 请求参数: + - code: 字符串,授权码 + - 成功响应:返回令牌与用户信息 + - 失败响应:返回错误码与错误信息 + - 手机验证码登录 + - 方法与URL:POST /api/v1/auth/sms-login + - 请求参数: + - phone: 字符串 + - smsCode: 字符串 + - 成功响应:返回令牌与用户信息 + - 失败响应:返回错误码与错误信息 +- 会话管理 + - 刷新令牌 + - 方法与URL:POST /api/v1/auth/refresh + - 请求参数: + - refreshToken: 字符串 + - 成功响应:返回新令牌 + - 失败响应:返回错误码与错误信息 + - 退出登录 + - 方法与URL:POST /api/v1/auth/logout + - 请求参数:无 + - 成功响应:返回操作结果 + - 失败响应:返回错误码与错误信息 + +章节来源 +- [index.html](file://index.html) + +### 数据存储API +- 用户信息获取 + - 方法与URL:GET /api/v1/users/profile + - 认证:Bearer Token + - 成功响应:返回用户基本信息 + - 失败响应:返回错误码与错误信息 +- 课程数据同步 + - 获取课程列表 + - 方法与URL:GET /api/v1/courses + - 查询参数: + - page: 整数(可选) + - limit: 整数(可选) + - 成功响应:返回分页课程列表 + - 失败响应:返回错误码与错误信息 + - 获取课程详情 + - 方法与URL:GET /api/v1/courses/{id} + - 成功响应:返回课程详情 + - 失败响应:返回错误码与错误信息 +- AI对话历史存储 + - 保存对话 + - 方法与URL:POST /api/v1/ai/conversations + - 请求参数: + - agentId: 字符串 + - messages: 数组(用户与AI消息) + - 成功响应:返回对话ID + - 失败响应:返回错误码与错误信息 + - 获取对话历史 + - 方法与URL:GET /api/v1/ai/conversations + - 查询参数: + - agentId: 字符串(可选) + - limit: 整数(可选) + - 成功响应:返回历史记录列表 + - 失败响应:返回错误码与错误信息 + +章节来源 +- [index.html](file://index.html) + +### 第三方服务集成API +- 微信登录API + - 授权回调 + - 方法与URL:GET /api/v1/oauth/wechat/callback + - 查询参数: + - code: 字符串 + - 成功响应:返回令牌与用户信息 + - 失败响应:返回错误码与错误信息 +- 短信服务接口 + - 发送验证码 + - 方法与URL:POST /api/v1/sms/send + - 请求参数: + - phone: 字符串 + - templateId: 字符串(模板ID) + - 成功响应:返回发送结果 + - 失败响应:返回错误码与错误信息 +- 支付网关集成 + - 创建支付订单 + - 方法与URL:POST /api/v1/payments/orders + - 请求参数: + - amount: 整数(分) + - productId: 字符串 + - paymentMethod: 字符串(如 wechat 或 alipay) + - 成功响应:返回支付链接或二维码 + - 失败响应:返回错误码与错误信息 + - 支付状态查询 + - 方法与URL:GET /api/v1/payments/orders/{orderId} + - 成功响应:返回订单状态 + - 失败响应:返回错误码与错误信息 + +章节来源 +- [index.html](file://index.html) + +### API认证与安全 +- 认证方法 + - JWT令牌:所有受保护接口需携带 Authorization: Bearer + - OAuth2.0:社交登录采用授权码模式,回调后换取令牌 +- 安全措施 + - HTTPS:所有API必须通过HTTPS传输 + - 数据加密:敏感字段(如密码)需服务端加密存储 + - 防重放攻击:引入随机nonce与时间戳校验 + - 防暴力破解:登录失败次数限制与临时封禁 + - CORS:严格配置允许域与方法 + - CSRF:对状态变更请求启用CSRF令牌校验 + +章节来源 +- [index.html](file://index.html) + +### 错误处理策略 +- 错误码规范 + - 通用错误:400(参数错误)、401(未授权)、403(权限不足)、404(资源不存在)、429(请求过频)、500(服务器内部错误) + - 自定义错误:业务错误返回业务码与中文描述 +- 前端处理 + - 统一拦截器:捕获HTTP错误并提示用户 + - 重试机制:对瞬时错误(如502/503)进行指数退避重试 + - 降级策略:网络异常时使用本地缓存数据 + +章节来源 +- [index.html](file://index.html) + +### API调用示例(示意) +- 登录 + - POST /api/v1/auth/login + - 请求体:{"username":"user","password":"pass","rememberMe":true} + - 成功响应:{"token":"...","user":{"id":"...","name":"..."}} +- 获取用户信息 + - GET /api/v1/users/profile + - 请求头:Authorization: Bearer + - 成功响应:{"id":"...","name":"...","email":"..."} +- 发送短信验证码 + - POST /api/v1/sms/send + - 请求体:{"phone":"13800000000","templateId":"SMS_XXXXXX"} + - 成功响应:{"success":true,"message":"发送成功"} + +章节来源 +- [index.html](file://index.html) + +## 依赖关系分析 +- 前端依赖 + - HTML/CSS/JS:单页应用结构,无外部框架依赖 + - 交互逻辑:通过原生JavaScript实现页面切换、用户菜单、聊天对话 +- 后端依赖 + - 认证服务:JWT/OAuth2.0 + - 数据服务:用户、课程、对话历史 + - 第三方服务:微信、短信、支付 + +```mermaid +graph LR +FE["前端(index.html)"] --> AUTH["认证服务"] +FE --> DATA["数据服务"] +FE --> THIRD["第三方服务"] +``` + +图表来源 +- [index.html](file://index.html) + +章节来源 +- [index.html](file://index.html) + +## 性能考量 +- 前端优化 + - 懒加载:按需加载AI卡片与对话内容 + - 缓存策略:本地存储用户信息与最近对话,减少重复请求 + - 防抖节流:输入框与筛选操作使用防抖 +- 后端优化 + - 分页与索引:课程列表与对话历史分页查询 + - CDN:静态资源走CDN加速 + - 异步处理:短信与支付异步回调,避免阻塞主流程 + +章节来源 +- [index.html](file://index.html) + +## 故障排查指南 +- 登录失败 + - 检查用户名/密码是否正确 + - 确认网络与HTTPS可用 + - 查看浏览器控制台是否有跨域错误 +- 社交登录异常 + - 确认微信授权回调地址配置正确 + - 检查授权码是否过期 +- 短信发送失败 + - 检查手机号格式与模板ID + - 查看短信服务商返回状态 +- 支付异常 + - 检查订单状态与回调通知 + - 确认支付金额与支付方式匹配 + +章节来源 +- [index.html](file://index.html) + +## 结论 +本方案基于现有前端页面,给出了完整的API集成蓝图,涵盖认证、数据存储与第三方服务。建议尽快完善后端服务与数据库设计,确保API的高可用、高性能与安全性。后续可根据业务发展逐步引入版本管理、灰度发布与监控告警体系。 + +## 附录 + +### API版本管理与迁移 +- 版本策略 + - 使用语义化版本号:/api/v1/... + - 保持向后兼容:新增字段以默认值存在 +- 迁移指南 + - 提供迁移脚本与兼容层 + - 旧版本在到期前提供过渡期 + +### 限流与缓存 +- 限流 + - 登录接口:每IP每分钟限制10次 + - 短信接口:每IP每小时限制50条 +- 缓存 + - 课程列表:Redis缓存,TTL 5分钟 + - 用户信息:本地存储,带失效时间 + +### 监控告警 +- 指标 + - 请求量、错误率、响应时间、缓存命中率 +- 告警 + - 错误率超过阈值触发告警 + - 响应时间异常波动告警 \ No newline at end of file diff --git a/有维项目/.qoder/repowiki/zh/content/扩展与集成/扩展与集成.md b/有维项目/.qoder/repowiki/zh/content/扩展与集成/扩展与集成.md new file mode 100644 index 0000000..1aa4536 --- /dev/null +++ b/有维项目/.qoder/repowiki/zh/content/扩展与集成/扩展与集成.md @@ -0,0 +1,269 @@ +# 扩展与集成 + + +**本文引用的文件** +- [index.html](file://index.html) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构总览](#架构总览) +5. [详细组件分析](#详细组件分析) +6. [依赖关系分析](#依赖关系分析) +7. [性能考量](#性能考量) +8. [故障排查指南](#故障排查指南) +9. [结论](#结论) +10. [附录](#附录) + +## 简介 +本指南面向高级开发者,围绕“有维商学”平台的前端单页应用,系统阐述扩展与集成的开发方法。该平台采用纯前端HTML/CSS/JavaScript实现,包含登录认证、仪表盘、AI智能体门户与对话交互等模块。本文将从插件开发机制、API集成方案、数据持久化策略、系统集成点、扩展开发最佳实践、安全与性能优化等方面,提供从简单功能扩展到完整系统集成的完整技术指导。 + +## 项目结构 +当前仓库仅包含一个入口页面文件,整体结构如下: +- 单页面应用(SPA):所有页面逻辑集中在单一HTML文件中,通过页面切换函数控制显示隐藏。 +- 页面组织:登录页、仪表盘页、AI智能体页三类页面,通过导航栏在页面间切换。 +- 功能模块:用户认证、Tab导航、AI智能体卡片展示、聊天对话弹窗等。 + +```mermaid +graph TB +A["index.html
入口页面"] --> B["登录页(login-page)"] +A --> C["仪表盘页(dashboard-page)"] +A --> D["AI智能体页(ai-page)"] +C --> E["Tab导航(overview/education/ai-tools/alumni/membership)"] +C --> F["统计卡片(stats-grid)"] +C --> G["内容卡片(content-card)"] +D --> H["AI卡片(ai-card)"] +D --> I["聊天对话(chat-modal)"] +``` + +图表来源 +- [index.html](file://index.html) + +章节来源 +- [index.html](file://index.html) + +## 核心组件 +- 页面切换控制器:负责在多个页面之间切换显示,使用类名控制页面激活状态。 +- 登录表单处理器:接收用户名与密码,校验非空后跳转至仪表盘。 +- Tab导航控制器:在仪表盘内的多个Tab之间切换显示。 +- AI智能体卡片交互:点击卡片打开对应聊天窗口,设置头像与背景色。 +- 聊天对话系统:支持用户输入、快捷问题、自动滚动、键盘事件与模态框背景点击关闭。 + +章节来源 +- [index.html](file://index.html) + +## 架构总览 +该应用采用前端单页架构,无后端依赖,所有业务逻辑运行于浏览器端。页面与功能通过DOM操作与事件绑定实现,具备良好的可扩展性:可在现有页面结构上新增页面、模块与交互行为。 + +```mermaid +graph TB +subgraph "前端层" +UI["页面元素(DOM)"] +JS["脚本逻辑(JS)"] +end +subgraph "扩展点" +EP1["页面扩展(新增页面)"] +EP2["模块扩展(新增功能模块)"] +EP3["API集成(用户认证/数据存储/第三方服务)"] +EP4["数据持久化(本地存储/后端API)"] +EP5["系统集成(微信登录/短信服务/数据库连接)"] +end +UI --> JS +JS --> EP1 +JS --> EP2 +JS --> EP3 +JS --> EP4 +JS --> EP5 +``` + +图表来源 +- [index.html](file://index.html) + +## 详细组件分析 + +### 页面切换组件 +- 功能职责:根据传入的页面ID,隐藏其他页面并激活目标页面。 +- 扩展要点:新增页面时,只需在HTML中添加新页面容器并调用切换函数即可接入。 + +```mermaid +sequenceDiagram +participant U as "用户" +participant N as "导航按钮" +participant S as "showPage()" +participant P as "页面容器(.page)" +U->>N : 点击导航 +N->>S : 传入目标页面ID +S->>P : 隐藏所有页面 +S->>P : 显示目标页面 +``` + +图表来源 +- [index.html](file://index.html) + +章节来源 +- [index.html](file://index.html) + +### 登录认证组件 +- 功能职责:表单提交事件拦截,校验输入非空后切换到仪表盘页面。 +- 安全建议:当前版本未做任何后端校验,生产环境需替换为安全的认证API。 + +```mermaid +flowchart TD +Start(["登录入口"]) --> Form["收集用户名/密码"] +Form --> Validate{"输入是否为空?"} +Validate --> |否| Alert["提示输入完整"] +Validate --> |是| Switch["切换到仪表盘页面"] +Alert --> End(["结束"]) +Switch --> End +``` + +图表来源 +- [index.html](file://index.html) + +章节来源 +- [index.html](file://index.html) + +### Tab导航组件 +- 功能职责:在仪表盘内切换不同内容区域,激活对应按钮与内容块。 +- 扩展要点:新增Tab时,只需添加按钮与内容块,并在切换函数中处理激活状态。 + +```mermaid +sequenceDiagram +participant U as "用户" +participant BTN as "Tab按钮(.tab-btn)" +participant S as "showTab()" +participant CT as "内容块(.tab-content)" +U->>BTN : 点击Tab +BTN->>S : 传入目标Tab ID +S->>BTN : 移除其他按钮激活态 +S->>CT : 隐藏其他内容块 +S->>CT : 显示目标内容块 +``` + +图表来源 +- [index.html](file://index.html) + +章节来源 +- [index.html](file://index.html) + +### AI智能体卡片组件 +- 功能职责:展示多个AI智能体卡片,点击卡片打开聊天窗口并设置头像与背景色。 +- 扩展要点:新增智能体时,只需添加卡片元素并调用打开聊天函数。 + +```mermaid +sequenceDiagram +participant U as "用户" +participant CARD as "AI卡片(.ai-card)" +participant OC as "openChat()" +participant MODAL as "聊天弹窗(.chat-modal)" +U->>CARD : 点击卡片 +CARD->>OC : 传入名称/图标/背景色 +OC->>MODAL : 设置标题/头像/背景 +OC->>MODAL : 显示弹窗 +``` + +图表来源 +- [index.html](file://index.html) + +章节来源 +- [index.html](file://index.html) + +### 聊天对话组件 +- 功能职责:支持用户输入消息、快捷问题、自动滚动、键盘事件与模态框背景点击关闭。 +- 扩展要点:可增加消息历史、发送状态反馈、AI响应模拟替换为真实API调用。 + +```mermaid +sequenceDiagram +participant U as "用户" +participant INPUT as "输入框(#chatInput)" +participant SEND as "sendMessage()" +participant MSG as "消息列表(#chatMessages)" +participant BOT as "AI响应(模拟)" +U->>INPUT : 输入消息 +U->>SEND : 触发发送 +SEND->>MSG : 添加用户消息 +SEND->>BOT : 模拟等待1秒 +BOT->>MSG : 添加AI回复 +MSG->>MSG : 自动滚动到底部 +``` + +图表来源 +- [index.html](file://index.html) + +章节来源 +- [index.html](file://index.html) + +## 依赖关系分析 +- 组件耦合:页面切换、Tab切换、聊天弹窗等逻辑相互独立,通过函数调用解耦。 +- 外部依赖:当前版本未引入外部库,所有功能基于原生DOM与事件。 +- 可能的循环依赖:未发现循环依赖,各函数职责清晰。 + +```mermaid +graph LR +P["页面切换(showPage)"] --> L["登录处理(handleLogin)"] +P --> T["Tab切换(showTab)"] +T --> A["AI卡片(openChat)"] +A --> C["聊天对话(sendMessage/addMessage)"] +``` + +图表来源 +- [index.html](file://index.html) + +章节来源 +- [index.html](file://index.html) + +## 性能考量 +- DOM操作优化:批量更新UI时避免频繁重排重绘,可采用文档片段或虚拟DOM策略(建议在后续重构中引入)。 +- 事件绑定:统一使用事件委托减少绑定数量,提高性能。 +- 图片与资源:当前页面未包含图片资源,若后续引入,建议使用懒加载与CDN加速。 +- 缓存策略:利用浏览器缓存与HTTP缓存头,减少重复请求。 +- 代码分割:将大函数拆分为小函数,按需加载,降低首屏负担。 + +## 故障排查指南 +- 页面无法切换:检查页面ID是否正确,确认CSS类名与切换函数一致。 +- 登录失败:确认表单字段ID与切换函数中的ID一致,确保输入非空判断生效。 +- Tab不显示:检查按钮与内容块的ID是否匹配,确认激活状态切换逻辑。 +- 聊天窗口不显示:确认模态框ID与函数调用一致,检查样式类名。 +- 快捷消息无效:确认按钮事件绑定与发送函数调用一致。 +- 回车发送失效:检查键盘事件监听与默认行为阻止逻辑。 + +章节来源 +- [index.html](file://index.html) + +## 结论 +本指南基于现有前端单页应用,提供了扩展与集成的系统化方法。对于“有维商学”平台,建议在保持现有架构优势的基础上,逐步引入API集成、数据持久化与系统集成,同时完善安全与性能策略,以支撑更复杂的业务场景。 + +## 附录 + +### 插件开发机制与扩展点 +- 新增页面扩展:在HTML中添加新页面容器,编写切换函数并在导航中注册。 +- 新增功能模块:在现有页面内添加模块容器,编写交互逻辑并通过事件绑定接入。 +- 插件模板(概念性):定义插件接口规范,约定生命周期钩子与配置参数,便于动态加载与卸载。 + +### API集成方案 +- 用户认证API:替换当前登录处理函数为调用认证接口,返回令牌后保存至安全存储。 +- 数据存储API:封装数据访问层,统一处理增删改查与错误处理。 +- 第三方服务集成:通过SDK或HTTP客户端接入微信登录、短信服务等,注意跨域与权限配置。 + +### 数据持久化策略 +- 本地存储扩展:使用IndexedDB或LocalStorage存储离线数据,注意容量限制与序列化。 +- 后端API对接:设计RESTful接口,遵循幂等性与一致性原则,实现数据同步与冲突解决。 + +### 系统集成点 +- 微信登录:接入微信OAuth2.0授权流程,处理回调与用户信息获取。 +- 短信服务:集成短信网关API,实现验证码发送与校验。 +- 数据库连接:抽象数据库访问层,支持事务与连接池管理。 + +### 扩展开发最佳实践 +- 设计模式:采用观察者模式处理事件,策略模式封装算法,工厂模式创建对象。 +- 安全考虑:输入校验、XSS防护、CSRF防护、HTTPS传输、敏感信息加密。 +- 性能优化:懒加载、缓存策略、异步加载、资源压缩与合并。 +- 可测试性:单元测试、集成测试、端到端测试,确保质量与稳定性。 + +### 集成示例代码(路径指引) +- 页面切换示例:[index.html](file://index.html) +- 登录处理示例:[index.html](file://index.html) +- Tab切换示例:[index.html](file://index.html) +- AI卡片与聊天示例:[index.html](file://index.html) \ No newline at end of file diff --git a/有维项目/.qoder/repowiki/zh/content/扩展与集成/扩展开发最佳实践.md b/有维项目/.qoder/repowiki/zh/content/扩展与集成/扩展开发最佳实践.md new file mode 100644 index 0000000..7f291cd --- /dev/null +++ b/有维项目/.qoder/repowiki/zh/content/扩展与集成/扩展开发最佳实践.md @@ -0,0 +1,493 @@ +# 扩展开发最佳实践 + + +**本文档引用的文件** +- [index.html](file://index.html) + + +## 目录 +1. [项目概述](#项目概述) +2. [架构扩展原则](#架构扩展原则) +3. [设计模式应用](#设计模式应用) +4. [代码组织规范](#代码组织规范) +5. [性能优化最佳实践](#性能优化最佳实践) +6. [安全性最佳实践](#安全性最佳实践) +7. [可维护性考虑](#可维护性考虑) +8. [可扩展性设计](#可扩展性设计) +9. [调试技巧与问题排查](#调试技巧与问题排查) +10. [团队协作规范](#团队协作规范) +11. [总结](#总结) + +## 项目概述 + +有维项目是一个基于单页应用架构的创业者赋能平台,采用HTML5 + CSS3 + JavaScript技术栈实现。项目具有以下特点: + +- **模块化设计**:采用CSS变量和组件化样式设计 +- **响应式布局**:支持多设备访问 +- **交互式界面**:包含登录认证、用户管理、AI对话等功能 +- **渐进式增强**:基础功能完善,便于后续扩展 + +## 架构扩展原则 + +### 模块化设计 + +项目采用了清晰的模块化架构,每个功能区域都有独立的CSS类名空间: + +```mermaid +graph TB +subgraph "页面模块" +LoginPage["登录页面模块"] +DashboardPage["仪表盘页面模块"] +AIPage["AI智能体页面模块"] +end +subgraph "功能模块" +UserMenu["用户菜单模块"] +ChatModule["聊天对话模块"] +FilterModule["筛选过滤模块"] +end +subgraph "样式模块" +ComponentStyles["组件样式模块"] +ResponsiveLayout["响应式布局模块"] +AnimationEffects["动画效果模块"] +end +LoginPage --> ComponentStyles +DashboardPage --> ComponentStyles +AIPage --> ComponentStyles +UserMenu --> ComponentStyles +ChatModule --> ComponentStyles +FilterModule --> ComponentStyles +``` + +**章节来源** +- [index.html:167-821](file://index.html#L167-L821) +- [index.html:927-1600](file://index.html#L927-L1600) +- [index.html:1625-2409](file://index.html#L1625-L2409) + +### 松耦合原则 + +项目通过以下方式实现松耦合: + +1. **CSS类名隔离**:每个组件使用独立的类名前缀 +2. **事件委托机制**:统一的事件处理器管理多个组件 +3. **配置化设计**:通过CSS变量实现主题配置 + +### 单一职责分离 + +每个JavaScript函数都专注于特定的功能职责: + +- 页面切换功能:`showPage()` +- 用户菜单管理:`toggleUserMenu()`, `closeAllMenus()` +- 聊天功能:`openChat()`, `sendMessage()`, `addMessage()` + +**章节来源** +- [index.html:2448-2732](file://index.html#L2448-L2732) + +## 设计模式应用 + +### 观察者模式 + +项目实现了简单的观察者模式,用于页面状态管理和组件间通信: + +```mermaid +sequenceDiagram +participant User as 用户 +participant Page as 页面组件 +participant Menu as 菜单组件 +participant Chat as 聊天组件 +User->>Page : 点击导航 +Page->>Page : showPage() +Page->>Menu : 关闭所有菜单 +Page->>Chat : 关闭聊天窗口 +Page-->>User : 切换页面 +User->>Menu : 点击用户头像 +Menu->>Menu : toggleUserMenu() +Menu->>Page : 关闭其他菜单 +Menu-->>User : 显示用户菜单 +User->>Chat : 点击AI卡片 +Chat->>Chat : openChat() +Chat-->>User : 显示聊天界面 +``` + +**图表来源** +- [index.html:2452-2531](file://index.html#L2452-L2531) +- [index.html:2645-2666](file://index.html#L2645-L2666) + +### 工厂模式 + +项目中体现了工厂模式的应用,用于创建相似的UI组件: + +```mermaid +flowchart TD +Start([创建AI卡片]) --> CheckType{"检查卡片类型"} +CheckType --> |客服| CreateCustomerService["创建客服卡片"] +CheckType --> |效率| CreateEfficiency["创建效率工具卡片"] +CheckType --> |分析| CreateAnalysis["创建分析工具卡片"] +CheckType --> |其他| CreateDefault["创建默认卡片"] +CreateCustomerService --> SetIcon["设置客服图标"] +CreateEfficiency --> SetIcon +CreateAnalysis --> SetIcon +CreateDefault --> SetIcon +SetIcon --> SetColor["设置背景颜色"] +SetColor --> SetContent["设置卡片内容"] +SetContent --> AddButton["添加操作按钮"] +AddButton --> End([返回卡片]) +``` + +**图表来源** +- [index.html:1857-1960](file://index.html#L1857-L1960) +- [index.html:2305-2407](file://index.html#L2305-L2407) + +### 策略模式 + +项目实现了策略模式来处理不同的筛选策略: + +```mermaid +classDiagram +class FilterStrategy { +<> ++applyFilter(data) Array ++getFilterName() String +} +class AllFilter { ++data : Array ++applyFilter(data) Array ++getFilterName() String +} +class IndustryFilter { ++industry : String ++applyFilter(data) Array ++getFilterName() String +} +class CategoryFilter { ++category : String ++applyFilter(data) Array ++getFilterName() String +} +FilterStrategy <|.. AllFilter +FilterStrategy <|.. IndustryFilter +FilterStrategy <|.. CategoryFilter +``` + +**图表来源** +- [index.html:2564-2583](file://index.html#L2564-L2583) + +**章节来源** +- [index.html:2564-2643](file://index.html#L2564-L2643) + +## 代码组织规范 + +### 文件命名约定 + +项目采用语义化命名约定: +- 页面容器:`page-*`(如 `login-page`, `dashboard-page`) +- 功能模块:`*-module` 或 `*-section`(如 `user-menu`, `chat-modal`) +- 组件状态:`*-active`(如 `user-menu.active`) + +### 目录结构设计 + +虽然当前项目只有一个HTML文件,但建议采用以下目录结构: + +``` +src/ +├── assets/ +│ ├── css/ +│ ├── js/ +│ └── images/ +├── components/ +│ ├── ui/ +│ ├── pages/ +│ └── utils/ +├── styles/ +│ ├── base/ +│ ├── components/ +│ └── themes/ +└── views/ + ├── auth/ + ├── dashboard/ + ├── ai/ + └── alumni/ +``` + +### 模块导入导出规范 + +建议采用ES6模块化规范: + +```javascript +// 导入模块 +import { showPage, toggleUserMenu } from './modules/pageManager.js'; +import { createChatModal } from './components/chatModal.js'; + +// 导出模块 +export { handleLogin, handleLogout }; +export default class UserManager { + // 类定义 +} +``` + +**章节来源** +- [index.html:1-1546](file://index.html#L1-L1546) + +## 性能优化最佳实践 + +### 懒加载实现 + +建议实现以下懒加载策略: + +1. **按需加载JavaScript模块** +2. **图片资源延迟加载** +3. **非关键CSS异步加载** + +### 内存管理 + +项目中需要注意的内存管理点: + +```mermaid +flowchart TD +Start([页面切换]) --> RemoveListeners["移除事件监听器"] +RemoveListeners --> ClearCache["清理缓存数据"] +ClearCache --> CloseModals["关闭模态框"] +CloseModals --> ResetState["重置组件状态"] +ResetState --> GC["等待垃圾回收"] +GC --> End([完成]) +``` + +**图表来源** +- [index.html:2510-2515](file://index.html#L2510-L2515) +- [index.html:2663-2666](file://index.html#L2663-L2666) + +### 渲染优化 + +1. **CSS动画优化**:使用transform和opacity属性 +2. **事件节流**:对resize和scroll事件进行节流处理 +3. **虚拟滚动**:对于大量列表数据使用虚拟滚动 + +**章节来源** +- [index.html:51-64](file://index.html#L51-L64) +- [index.html:1200-1210](file://index.html#L1200-L1210) + +## 安全性最佳实践 + +### 输入验证 + +项目中现有的输入验证机制: + +```mermaid +flowchart TD +Input[用户输入] --> Validate{验证输入} +Validate --> |有效| Process[处理请求] +Validate --> |无效| ShowError[显示错误信息] +ShowError --> Input +Process --> Sanitize[清理特殊字符] +Sanitize --> Output[输出结果] +``` + +**图表来源** +- [index.html:2462-2481](file://index.html#L2462-L2481) + +### XSS防护 + +建议实施的XSS防护措施: +1. **内容安全策略(CSP)**:设置严格的CSP头 +2. **输入转义**:对用户输入进行HTML转义 +3. **输出编码**:动态内容输出时进行编码 + +### CSRF防护 + +项目中缺少CSRF防护,建议添加: +1. **CSRF令牌**:在表单中添加隐藏的CSRF令牌字段 +2. **SameSite Cookie**:设置Cookie的SameSite属性 +3. **双重提交Cookie**:结合Cookie和表单令牌 + +### 权限控制 + +建议实现的权限控制机制: +1. **角色基础访问控制(RBAC)**:基于用户角色的权限管理 +2. **细粒度权限**:针对具体功能的权限控制 +3. **会话管理**:安全的用户会话生命周期管理 + +**章节来源** +- [index.html:2462-2481](file://index.html#L2462-L2481) +- [index.html:2524-2531](file://index.html#L2524-L2531) + +## 可维护性考虑 + +### 代码注释规范 + +建议采用以下注释规范: + +```javascript +/** + * 处理用户登录逻辑 + * @param {Event} event - 表单提交事件 + * @returns {Promise} - 登录处理结果 + * @throws {Error} - 登录失败时抛出错误 + */ +function handleLogin(event) { + // 验证用户输入 + const username = document.getElementById('loginUsername').value.trim(); + const password = document.getElementById('loginPassword').value.trim(); + + // 处理登录逻辑 + // ... +} +``` + +### 文档编写标准 + +建议建立以下文档标准: +1. **API文档**:使用Swagger或类似工具生成 +2. **架构文档**:描述系统整体架构和设计决策 +3. **部署文档**:包含环境配置和部署流程 +4. **用户手册**:面向最终用户的操作指南 + +### 测试覆盖率要求 + +建议达到以下测试覆盖率: +- **单元测试**:≥80% +- **集成测试**:≥60% +- **端到端测试**:≥40% + +**章节来源** +- [index.html:2448-2732](file://index.html#L2448-L2732) + +## 可扩展性设计 + +### 接口抽象 + +建议实现以下接口抽象: + +```mermaid +classDiagram +class PageInterface { +<> ++show() void ++hide() void ++destroy() void +} +class LoginPage { ++show() void ++hide() void ++destroy() void ++handleLogin() void +} +class DashboardPage { ++show() void ++hide() void ++destroy() void ++initTabs() void +} +class AIPage { ++show() void ++hide() void ++destroy() void ++initFilters() void +} +PageInterface <|.. LoginPage +PageInterface <|.. DashboardPage +PageInterface <|.. AIPage +``` + +**图表来源** +- [index.html:2452-2531](file://index.html#L2452-L2531) + +### 配置化支持 + +建议实现配置化机制: +1. **主题配置**:支持多主题切换 +2. **功能开关**:动态启用/禁用功能 +3. **环境配置**:不同环境的配置管理 + +### 插件化架构 + +建议采用插件化架构: +1. **插件接口**:定义标准化的插件接口 +2. **插件注册**:支持动态插件注册和卸载 +3. **插件通信**:插件间的通信机制 + +**章节来源** +- [index.html:14-31](file://index.html#L14-L31) +- [index.html:2564-2583](file://index.html#L2564-L2583) + +## 调试技巧与问题排查 + +### 调试技巧 + +1. **浏览器开发者工具**:使用Elements面板检查DOM结构 +2. **Console调试**:利用console.log输出调试信息 +3. **Network面板**:监控网络请求和响应 +4. **Performance面板**:分析性能瓶颈 + +### 问题排查方法 + +```mermaid +flowchart TD +Issue[问题出现] --> Reproduce[重现问题] +Reproduce --> Isolate[隔离问题] +Isolate --> Debug[调试分析] +Debug --> Fix[修复问题] +Fix --> Test[测试验证] +Test --> Document[文档记录] +Isolate --> |组件问题| ComponentDebug[组件调试] +Isolate --> |样式问题| StyleDebug[样式调试] +Isolate --> |脚本问题| ScriptDebug[脚本调试] +ComponentDebug --> Test +StyleDebug --> Test +ScriptDebug --> Test +``` + +### 性能分析工具使用 + +1. **Chrome DevTools**:性能分析和内存检测 +2. **Lighthouse**:SEO和性能审计 +3. **WebPageTest**:跨地区性能测试 +4. **Bundle Analyzer**:打包体积分析 + +**章节来源** +- [index.html:2689-2732](file://index.html#L2689-L2732) + +## 团队协作规范 + +### 代码审查标准 + +1. **代码质量**:遵循编码规范和最佳实践 +2. **功能完整性**:确保功能按预期工作 +3. **性能影响**:评估对系统性能的影响 +4. **安全性检查**:验证安全漏洞的修复 + +### 持续集成流程 + +建议实施以下CI流程: + +```mermaid +sequenceDiagram +participant Dev as 开发者 +participant Git as Git仓库 +participant CI as CI服务器 +participant Deploy as 部署环境 +Dev->>Git : 提交代码 +Git->>CI : 触发构建 +CI->>CI : 运行测试 +CI->>CI : 代码扫描 +CI->>CI : 构建打包 +CI->>Deploy : 部署到测试环境 +Deploy-->>Dev : 部署结果通知 +``` + +### 版本管理策略 + +1. **分支策略**:采用Git Flow或GitHub Flow +2. **版本号管理**:遵循SemVer语义化版本 +3. **发布流程**:自动化发布和回滚机制 + +## 总结 + +有维项目展现了良好的前端架构基础,具备扩展开发的良好条件。通过实施本文档提出的最佳实践,可以进一步提升项目的可维护性、可扩展性和安全性。 + +关键改进方向包括: +- 实施模块化和组件化架构 +- 加强安全防护措施 +- 建立完善的测试和文档体系 +- 采用现代化的开发工具链 +- 实施持续集成和部署流程 + +这些改进将使有维项目能够更好地支持未来的功能扩展和业务发展需求。 \ No newline at end of file diff --git a/有维项目/.qoder/repowiki/zh/content/扩展与集成/插件开发指南.md b/有维项目/.qoder/repowiki/zh/content/扩展与集成/插件开发指南.md new file mode 100644 index 0000000..e3c39ae --- /dev/null +++ b/有维项目/.qoder/repowiki/zh/content/扩展与集成/插件开发指南.md @@ -0,0 +1,1469 @@ +# 插件开发指南 + + +**本文档引用的文件** +- [index.html](file://index.html) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构概览](#架构概览) +5. [详细组件分析](#详细组件分析) +6. [插件开发模板](#插件开发模板) +7. [插件注册机制](#插件注册机制) +8. [生命周期管理](#生命周期管理) +9. [事件通信方式](#事件通信方式) +10. [插件配置参数](#插件配置参数) +11. [接口规范](#接口规范) +12. [数据格式要求](#数据格式要求) +13. [实际插件开发示例](#实际插件开发示例) +14. [插件集成最佳实践](#插件集成最佳实践) +15. [性能考虑](#性能考虑) +16. [故障排除指南](#故障排除指南) +17. [结论](#结论) + +## 简介 + +有维商学是一个基于"有维教育+AI工具+有维校友"三位一体商业模式的OPC创业者赋能平台。本指南旨在为开发者提供完整的插件开发框架,重点说明如何扩展AI智能体系统、功能模块扩展以及组件化开发模式。 + +该平台采用现代化的前端架构,包含登录页面、仪表盘页面、AI智能体页面等多个功能模块,为插件开发提供了丰富的扩展点和集成接口。 + +## 项目结构 + +有维项目采用单一HTML文件架构,集成了完整的前端应用逻辑。项目结构清晰,主要包含以下核心部分: + +```mermaid +graph TB +subgraph "项目架构" +A[index.html - 主入口文件] +B[样式系统] +C[页面组件] +D[交互逻辑] +E[AI智能体系统] +end +A --> B +A --> C +A --> D +A --> E +subgraph "样式系统" +B1[全局样式] +B2[组件样式] +B3[响应式设计] +end +subgraph "页面组件" +C1[登录页面] +C2[仪表盘页面] +C3[AI智能体页面] +C4[功能模块] +end +subgraph "交互逻辑" +D1[页面切换] +D2[用户管理] +D3[聊天系统] +D4[表单处理] +end +subgraph "AI智能体系统" +E1[智能体卡片] +E2[聊天对话] +E3[功能分类] +E4[快速问答] +end +``` + +**图表来源** +- [index.html:1-2537](file://index.html#L1-L2537) + +**章节来源** +- [index.html:1-2537](file://index.html#L1-L2537) + +## 核心组件 + +### 页面管理系统 + +平台采用基于CSS类的页面切换机制,通过`.page`类控制页面显示状态: + +```mermaid +stateDiagram-v2 +[*] --> LoginPage +[*] --> DashboardPage +[*] --> AIPage +LoginPage --> DashboardPage : 登录成功 +DashboardPage --> AIPage : 切换到AI智能体 +AIPage --> DashboardPage : 返回首页 +state LoginPage { +[*] --> LoginContent +LoginContent --> LoadingAnimation : 提交表单 +LoadingAnimation --> DashboardPage : 登录完成 +} +state DashboardPage { +[*] --> Navigation +Navigation --> TabContent : 切换标签 +TabContent --> AIPage : 导航到AI智能体 +} +``` + +**图表来源** +- [index.html:2336-2364](file://index.html#L2336-L2364) + +### 用户管理系统 + +用户管理系统包含登录验证、用户信息管理和下拉菜单功能: + +```mermaid +sequenceDiagram +participant U as 用户 +participant L as 登录页面 +participant V as 验证系统 +participant D as 仪表盘页面 +participant M as 用户菜单 +U->>L : 输入用户名和密码 +L->>V : 验证凭据 +V->>V : 检查用户名和密码 +V-->>L : 验证结果 +L->>D : 显示仪表盘页面 +D->>M : 初始化用户菜单 +U->>M : 点击用户头像 +M-->>U : 显示菜单选项 +``` + +**图表来源** +- [index.html:2345-2377](file://index.html#L2345-L2377) + +**章节来源** +- [index.html:1461-1528](file://index.html#L1461-L1528) +- [index.html:1531-2135](file://index.html#L1531-L2135) +- [index.html:2336-2398](file://index.html#L2336-L2398) + +## 架构概览 + +有维项目的整体架构采用模块化设计,主要分为以下几个层次: + +```mermaid +graph TB +subgraph "表现层" +A[HTML结构] +B[CSS样式] +C[JavaScript逻辑] +end +subgraph "业务层" +D[页面管理] +E[用户管理] +F[AI智能体系统] +G[功能模块] +end +subgraph "数据层" +H[本地存储] +I[会话状态] +J[用户数据] +end +A --> D +B --> D +C --> D +D --> E +D --> F +D --> G +E --> H +F --> I +G --> J +subgraph "插件扩展点" +K[AI智能体模板] +L[页面组件模板] +M[功能模块模板] +N[样式扩展模板] +end +F --> K +D --> L +G --> M +B --> N +``` + +**图表来源** +- [index.html:1-2537](file://index.html#L1-L2537) + +### 样式架构 + +平台采用CSS变量系统和网格布局,确保样式的统一性和可维护性: + +```mermaid +classDiagram +class StyleSystem { ++CSSVariables ++GridLayout ++ResponsiveDesign ++ComponentStyles ++AnimationSystem +} +class CSSVariables { ++--primary-color ++--secondary-color ++--accent-color ++--bg-color ++--card-bg ++--text-primary ++--shadow-sm ++--shadow-md ++--shadow-lg +} +class GridLayout { ++StatsGrid ++ContentGrid ++MembershipGrid ++CourseGrid ++AIGrid +} +class ComponentStyles { ++PageStyles ++CardStyles ++ButtonStyles ++FormStyles ++ModalStyles +} +StyleSystem --> CSSVariables +StyleSystem --> GridLayout +StyleSystem --> ComponentStyles +``` + +**图表来源** +- [index.html:7-31](file://index.html#L7-L31) +- [index.html:587-821](file://index.html#L587-L821) + +**章节来源** +- [index.html:7-1451](file://index.html#L7-L1451) + +## 详细组件分析 + +### AI智能体系统 + +AI智能体系统是平台的核心功能模块,提供了6种不同类型的智能体助手: + +```mermaid +classDiagram +class AIAssistant { ++String name ++String icon ++String category ++Array features ++String description ++openChat() void ++sendMessage() void ++receiveResponse() void +} +class AISMPlatform { ++String name "AISM平台智能客服" ++String icon "🎯" ++String category "客户服务" ++Array features ["即时响应","多轮对话","问题分流"] ++String description "7×24小时在线服务,解答平台使用问题" +} +class MeetingAssistant { ++String name "会议纪要助手" ++String icon "📝" ++String category "效率工具" ++Array features ["语音转文字","重点提取","任务分配"] ++String description "自动记录会议内容,智能生成结构化纪要" +} +class DeepseekQA { ++String name "Deepseek问答助手" ++String icon "🧠" ++String category "知识问答" ++Array features ["深度理解","精准回答","知识丰富"] ++String description "基于深度学习的智能问答系统" +} +class AdministrativeAssistant { ++String name "行政助手" ++String icon "📋" ++String category "日常办公" ++Array features ["日程管理","文档处理","智能提醒"] ++String description "处理日常行政事务" +} +class StrategicAnalyst { ++String name "战略目标分析师" ++String icon "📈" ++String category "战略咨询" ++Array features ["目标分解","SWOT分析","竞品研究"] ++String description "帮助制定和分解战略目标" +} +class BusinessPlanner { ++String name "商业计划书生成器" ++String icon "📄" ++String category "创业工具" ++Array features ["模板丰富","数据分析","一键导出"] ++String description "快速生成专业商业计划书" +} +AIAssistant <|-- AISMPlatform +AIAssistant <|-- MeetingAssistant +AIAssistant <|-- DeepseekQA +AIAssistant <|-- AdministrativeAssistant +AIAssistant <|-- StrategicAnalyst +AIAssistant <|-- BusinessPlanner +``` + +**图表来源** +- [index.html:1762-1864](file://index.html#L1762-L1864) +- [index.html:2188-2290](file://index.html#L2188-L2290) + +### 聊天对话系统 + +聊天对话系统提供了完整的AI交互体验: + +```mermaid +sequenceDiagram +participant U as 用户 +participant C as 聊天卡片 +participant M as 聊天模态框 +participant A as AI助手 +participant Q as 快捷问答 +U->>C : 点击开始对话 +C->>M : 打开聊天窗口 +M->>A : 初始化对话 +A-->>M : 显示欢迎消息 +U->>Q : 选择快捷问题 +Q->>M : 自动填充输入框 +U->>M : 按Enter发送 +M->>A : 处理用户消息 +A-->>M : 返回AI响应 +M-->>U : 显示回复 +U->>M : 输入自定义消息 +U->>M : 点击发送按钮 +M->>A : 处理用户消息 +A-->>M : 返回AI响应 +M-->>U : 显示回复 +``` + +**图表来源** +- [index.html:2447-2497](file://index.html#L2447-L2497) + +**章节来源** +- [index.html:927-1265](file://index.html#L927-L1265) +- [index.html:2294-2329](file://index.html#L2294-L2329) +- [index.html:2447-2533](file://index.html#L2447-L2533) + +## 插件开发模板 + +### HTML结构模板 + +为插件开发提供标准化的HTML结构模板: + +```mermaid +flowchart TD +Start([开始插件开发]) --> Template["选择模板类型"] +Template --> CardTemplate["卡片式组件模板"] +Template --> PageTemplate["页面组件模板"] +Template --> ModuleTemplate["功能模块模板"] +CardTemplate --> CardStructure["卡片结构"] +CardStructure --> CardHeader["卡片头部"] +CardHeader --> CardIcon["图标区域"] +CardHeader --> CardInfo["信息区域"] +CardInfo --> CardTitle["标题"] +CardInfo --> CardTag["标签"] +CardStructure --> CardBody["卡片主体"] +CardBody --> CardDescription["描述文本"] +CardBody --> CardFeatures["功能列表"] +CardStructure --> CardFooter["卡片底部"] +CardFooter --> CardButton["操作按钮"] +PageTemplate --> PageStructure["页面结构"] +PageStructure --> PageHeader["页面头部"] +PageStructure --> PageContent["页面内容"] +PageStructure --> PageFooter["页面底部"] +ModuleTemplate --> ModuleStructure["模块结构"] +ModuleStructure --> ModuleGrid["网格布局"] +ModuleGrid --> ModuleItems["模块项"] +CardTemplate --> StyleTemplate["样式模板"] +PageTemplate --> StyleTemplate +ModuleTemplate --> StyleTemplate +StyleTemplate --> CSSVariables["CSS变量"] +StyleTemplate --> ResponsiveDesign["响应式设计"] +StyleTemplate --> AnimationEffects["动画效果"] +StyleTemplate --> JavaScriptTemplate["JavaScript模板"] +JavaScriptTemplate --> EventHandlers["事件处理器"] +JavaScriptTemplate --> LifecycleMethods["生命周期方法"] +JavaScriptTemplate --> Communication["通信机制"] +JavaScriptTemplate --> End([完成开发]) +End --> Test["测试插件"] +Test --> Deploy["部署插件"] +Deploy --> Complete([开发完成]) +``` + +**图表来源** +- [index.html:1-2537](file://index.html#L1-L2537) + +### CSS样式规范 + +插件样式开发遵循统一的设计系统: + +```mermaid +classDiagram +class DesignSystem { ++ColorPalette ++Typography ++Spacing ++Shadows ++Animations +} +class ColorPalette { ++PrimaryColors ++SecondaryColors ++AccentColors ++BackgroundColors ++TextColors +} +class Typography { ++FontFamily ++FontSizes ++FontWeights ++LineHeights ++LetterSpacings +} +class Spacing { ++BaseSpacing ++GridGaps ++PaddingValues ++MarginValues +} +class Shadows { ++ShadowSmall ++ShadowMedium ++ShadowLarge ++ShadowExtraLarge +} +class Animations { ++FadeIn ++SlideIn ++ScaleIn ++Spin +} +DesignSystem --> ColorPalette +DesignSystem --> Typography +DesignSystem --> Spacing +DesignSystem --> Shadows +DesignSystem --> Animations +``` + +**图表来源** +- [index.html:7-31](file://index.html#L7-L31) + +### JavaScript逻辑实现 + +插件JavaScript逻辑遵循模块化设计原则: + +```mermaid +flowchart TD +PluginStart([插件初始化]) --> ConfigSetup["配置参数设置"] +ConfigSetup --> DOMReady["DOM就绪检查"] +DOMReady --> EventBinding["事件绑定"] +EventBinding --> LifecycleInit["生命周期初始化"] +LifecycleInit --> ReadyState["就绪状态"] +ReadyState --> UserInteraction["用户交互处理"] +UserInteraction --> FormValidation["表单验证"] +FormValidation --> DataProcessing["数据处理"] +DataProcessing --> APIIntegration["API集成"] +APIIntegration --> ResponseHandling["响应处理"] +ResponseHandling --> UIUpdate["UI更新"] +UIUpdate --> UserInteraction +ReadyState --> PeriodicTasks["周期性任务"] +PeriodicTasks --> TimerManagement["定时器管理"] +TimerManagement --> MemoryCleanup["内存清理"] +MemoryCleanup --> PeriodicTasks +ReadyState --> ErrorHandling["错误处理"] +ErrorHandling --> Logging["日志记录"] +Logging --> Recovery["恢复机制"] +Recovery --> ErrorHandling +ReadyState --> Teardown["插件销毁"] +Teardown --> EventUnbinding["事件解绑"] +EventUnbinding --> ResourceCleanup["资源清理"] +ResourceCleanup --> Complete([插件卸载完成]) +``` + +**图表来源** +- [index.html:2331-2533](file://index.html#L2331-L2533) + +**章节来源** +- [index.html:1-2537](file://index.html#L1-L2537) + +## 插件注册机制 + +### 页面注册系统 + +平台提供灵活的页面注册机制,支持动态添加新页面: + +```mermaid +sequenceDiagram +participant Dev as 开发者 +participant Registry as 注册系统 +participant PageManager as 页面管理器 +participant UI as 用户界面 +Dev->>Registry : registerPage(config) +Registry->>Registry : 验证配置参数 +Registry->>Registry : 生成页面ID +Registry->>Registry : 创建DOM元素 +Registry->>PageManager : 注册页面路由 +PageManager->>UI : 更新导航菜单 +UI-->>Dev : 页面注册成功 +Dev->>Registry : unregisterPage(pageId) +Registry->>PageManager : 移除页面路由 +PageManager->>UI : 更新导航菜单 +UI-->>Dev : 页面注销成功 +``` + +**图表来源** +- [index.html:2336-2342](file://index.html#L2336-L2342) + +### 组件注册系统 + +组件注册系统支持插件化组件开发: + +```mermaid +classDiagram +class ComponentRegistry { ++Map~String,Component~ components ++register(component) void ++unregister(id) void ++get(id) Component ++getAll() Component[] ++exists(id) boolean +} +class Component { ++String id ++String name ++Object config ++HTMLElement element ++init() void ++destroy() void ++render() HTMLElement ++update(data) void +} +class PluginInterface { ++String pluginId ++String name ++String version ++Object metadata ++init() Promise~void~ ++destroy() Promise~void~ ++getConfig() Object ++setConfig(config) void +} +ComponentRegistry --> Component +Component --> PluginInterface +``` + +**图表来源** +- [index.html:2331-2533](file://index.html#L2331-L2533) + +**章节来源** +- [index.html:2336-2398](file://index.html#L2336-L2398) + +## 生命周期管理 + +### 插件生命周期 + +插件生命周期管理确保插件在不同阶段的正确行为: + +```mermaid +stateDiagram-v2 +[*] --> Initialized +Initialized --> Ready : init() +Ready --> Active : activate() +Active --> Inactive : deactivate() +Inactive --> Active : activate() +Active --> Destroyed : destroy() +Destroyed --> [*] +state Initialized { +[*] --> Configured +Configured --> DOMCreated : createDOM() +DOMCreated --> EventBound : bindEvents() +EventBound --> [*] +} +state Ready { +[*] --> ServicesReady +ServicesReady --> DataLoaded : loadData() +DataLoaded --> UIReady : renderUI() +UIReady --> [*] +} +state Active { +[*] --> EventHandling +EventHandling --> DataSync : syncData() +DataSync --> EventHandling +} +state Inactive { +[*] --> EventUnbound +EventUnbound --> ServicesPaused : pauseServices() +ServicesPaused --> [*] +} +state Destroyed { +[*] --> ResourcesCleaned +ResourcesCleaned --> EventUnbound : unbindEvents() +EventUnbound --> DOMRemoved : removeDOM() +DOMRemoved --> [*] +} +``` + +**图表来源** +- [index.html:2331-2533](file://index.html#L2331-L2533) + +### 生命周期钩子 + +插件可以实现特定的生命周期钩子函数: + +```mermaid +flowchart TD +InitHook["init() 钩子"] --> ConfigValidation["配置验证"] +ConfigValidation --> ServiceInitialization["服务初始化"] +ServiceInitialization --> DOMCreation["DOM元素创建"] +DOMCreation --> EventBinding["事件绑定"] +EventBinding --> ReadyHook["ready() 钩子"] +ReadyHook --> ActiveHook["active() 钩子"] +ActiveHook --> DataSync["数据同步"] +DataSync --> UIUpdate["UI更新"] +UIUpdate --> ActiveHook +DeactivateHook["deactivate() 钩子"] --> ServicePause["服务暂停"] +ServicePause --> EventUnbinding["事件解绑"] +EventUnbinding --> InactiveHook["inactive() 钩子"] +DestroyHook["destroy() 钩子"] --> ResourceCleanup["资源清理"] +ResourceCleanup --> EventUnbinding +EventUnbinding --> DOMRemoval["DOM元素移除"] +DOMRemoval --> Finalization["最终化"] +``` + +**图表来源** +- [index.html:2331-2533](file://index.html#L2331-L2533) + +**章节来源** +- [index.html:2331-2533](file://index.html#L2331-L2533) + +## 事件通信方式 + +### 事件系统架构 + +平台采用事件驱动的通信机制: + +```mermaid +classDiagram +class EventBus { ++Map~String,Array~ listeners ++on(event, callback) void ++off(event, callback) void ++emit(event, data) void ++once(event, callback) void +} +class EventListener { ++String eventId ++Function callback ++Object context ++Boolean onceOnly +} +class EventDispatcher { ++dispatch(event, data) void ++broadcast(event, data) void ++subscribe(listener) void ++unsubscribe(listener) void +} +class PluginEvent { ++String type ++Object payload ++String source ++Date timestamp ++Boolean bubbles ++Boolean cancelable +} +EventBus --> EventListener +EventBus --> EventDispatcher +EventDispatcher --> PluginEvent +``` + +**图表来源** +- [index.html:2331-2533](file://index.html#L2331-L2533) + +### 事件类型定义 + +平台支持多种事件类型: + +```mermaid +flowchart TD +EventSystem[事件系统] --> PageEvents[页面事件] +EventSystem --> UserEvents[用户事件] +EventSystem --> AIEvents[AI事件] +EventSystem --> PluginEvents[插件事件] +PageEvents --> PageShow["页面显示"] +PageEvents --> PageHide["页面隐藏"] +PageEvents --> PageSwitch["页面切换"] +UserEvents --> UserLogin["用户登录"] +UserEvents --> UserLogout["用户登出"] +UserEvents --> UserDataUpdate["用户数据更新"] +AIEvents --> AIChatOpen["AI聊天打开"] +AIEvents --> AIChatClose["AI聊天关闭"] +AIEvents --> AIMessageSend["AI消息发送"] +AIEvents --> AIMessageReceive["AI消息接收"] +PluginEvents --> PluginLoad["插件加载"] +PluginEvents --> PluginUnload["插件卸载"] +PluginEvents --> PluginConfigChange["插件配置变更"] +``` + +**图表来源** +- [index.html:2331-2533](file://index.html#L2331-L2533) + +**章节来源** +- [index.html:2331-2533](file://index.html#L2331-L2533) + +## 插件配置参数 + +### 配置参数规范 + +插件配置参数遵循统一的规范: + +```mermaid +classDiagram +class PluginConfig { ++String id ++String name ++String version ++String description ++Object author ++Object license ++Object dependencies ++Object settings ++Object metadata +} +class AuthorInfo { ++String name ++String email ++String website ++String organization +} +class LicenseInfo { ++String type ++String url ++String text +} +class DependencyInfo { ++String pluginId ++String versionRange ++Boolean required +} +class SettingsSchema { ++String type ++String title ++String description ++Object default ++Object enum ++Object properties ++String[] required +} +PluginConfig --> AuthorInfo +PluginConfig --> LicenseInfo +PluginConfig --> DependencyInfo +PluginConfig --> SettingsSchema +``` + +**图表来源** +- [index.html:2331-2533](file://index.html#L2331-L2533) + +### 配置参数示例 + +以下是插件配置参数的标准格式: + +| 参数名 | 类型 | 必需 | 默认值 | 描述 | +|--------|------|------|--------|------| +| id | String | 是 | - | 插件唯一标识符 | +| name | String | 是 | - | 插件显示名称 | +| version | String | 是 | - | 插件版本号 | +| description | String | 否 | "" | 插件功能描述 | +| author | Object | 否 | null | 作者信息对象 | +| license | Object | 否 | null | 许可证信息对象 | +| dependencies | Array | 否 | [] | 依赖插件列表 | +| settings | Object | 否 | {} | 插件配置参数 | +| metadata | Object | 否 | {} | 元数据信息 | + +**章节来源** +- [index.html:2331-2533](file://index.html#L2331-L2533) + +## 接口规范 + +### 插件接口定义 + +插件必须实现的标准接口: + +```mermaid +classDiagram +class IPlugin { +<> ++String pluginId ++String name ++String version ++init() Promise~void~ ++destroy() Promise~void~ ++getConfig() Object ++setConfig(config) void ++getMetadata() Object +} +class IPagePlugin { +<> ++IPlugin ++String pageId ++String route ++Object pageConfig ++render() HTMLElement ++activate() void ++deactivate() void +} +class IComponentPlugin { +<> ++IPlugin ++String componentType ++Object componentConfig ++render() HTMLElement ++update(data) void ++destroy() void +} +class IAIAssistantPlugin { +<> ++IPlugin ++String assistantId ++String assistantName ++String assistantIcon ++String[] features ++String description ++openChat() void ++sendMessage(message) void ++receiveResponse(response) void +} +IPagePlugin --> IPlugin +IComponentPlugin --> IPlugin +IAIAssistantPlugin --> IPlugin +``` + +**图表来源** +- [index.html:2331-2533](file://index.html#L2331-L2533) + +### 方法调用规范 + +插件方法调用遵循严格的规范: + +```mermaid +sequenceDiagram +participant App as 应用程序 +participant Plugin as 插件实例 +participant Config as 配置系统 +participant Events as 事件系统 +App->>Plugin : new Plugin(config) +Plugin->>Config : getConfig() +Config-->>Plugin : 返回配置 +Plugin->>Plugin : validateConfig() +Plugin->>Plugin : init() +Plugin->>Events : emit('plugin : initialized') +Events-->>App : 通知插件已初始化 +App->>Plugin : activate() +Plugin->>Plugin : activateComponents() +Plugin->>Events : emit('plugin : activated') +Events-->>App : 通知插件已激活 +App->>Plugin : deactivate() +Plugin->>Plugin : deactivateComponents() +Plugin->>Events : emit('plugin : deactivated') +Events-->>App : 通知插件已停用 +App->>Plugin : destroy() +Plugin->>Plugin : cleanupResources() +Plugin->>Events : emit('plugin : destroyed') +Events-->>App : 通知插件已销毁 +``` + +**图表来源** +- [index.html:2331-2533](file://index.html#L2331-L2533) + +**章节来源** +- [index.html:2331-2533](file://index.html#L2331-L2533) + +## 数据格式要求 + +### 数据模型定义 + +插件数据遵循统一的数据模型: + +```mermaid +erDiagram +PLUGIN_CONFIG { +string id PK +string name +string version +string description +object author +object license +array dependencies +object settings +object metadata +} +PAGE_COMPONENT { +string id PK +string pluginId FK +string type +object config +string html +object styles +object scripts +boolean active +datetime createdAt +datetime updatedAt +} +AI_ASSISTANT { +string id PK +string pluginId FK +string name +string icon +string category +array features +string description +object capabilities +boolean enabled +datetime createdAt +datetime updatedAt +} +USER_INTERACTION { +string id PK +string pluginId FK +string userId +string actionType +object eventData +string sessionId +datetime timestamp +} +PLUGIN_CONFIG ||--o{ PAGE_COMPONENT : contains +PLUGIN_CONFIG ||--o{ AI_ASSISTANT : contains +PLUGIN_CONFIG ||--o{ USER_INTERACTION : generates +``` + +**图表来源** +- [index.html:2331-2533](file://index.html#L2331-L2533) + +### 数据格式示例 + +以下是插件数据的标准格式示例: + +**插件配置数据格式:** +```json +{ + "id": "plugin-id", + "name": "插件名称", + "version": "1.0.0", + "description": "插件功能描述", + "author": { + "name": "作者姓名", + "email": "author@example.com", + "website": "https://example.com" + }, + "license": { + "type": "MIT", + "url": "https://opensource.org/licenses/MIT" + }, + "dependencies": [ + { + "pluginId": "dependency-plugin-id", + "versionRange": "^1.0.0", + "required": true + } + ], + "settings": { + "theme": "dark", + "language": "zh-CN", + "notifications": true + }, + "metadata": { + "category": "utility", + "tags": ["useful", "helpful"], + "icon": "🌟" + } +} +``` + +**页面组件数据格式:** +```json +{ + "id": "page-component-id", + "pluginId": "plugin-id", + "type": "card", + "config": { + "title": "组件标题", + "description": "组件描述", + "icon": "⭐", + "actions": ["view", "edit", "delete"] + }, + "html": "
组件内容
", + "styles": ".custom-component { color: blue; }", + "scripts": "console.log('组件已加载');", + "active": true, + "createdAt": "2024-01-01T00:00:00Z", + "updatedAt": "2024-01-01T00:00:00Z" +} +``` + +**章节来源** +- [index.html:2331-2533](file://index.html#L2331-L2533) + +## 实际插件开发示例 + +### 教育课程模块插件 + +教育课程模块插件实现了完整的课程管理系统: + +```mermaid +classDiagram +class EducationPlugin { ++String pluginId "edu-course-plugin" ++String name "教育课程模块" ++String version "1.0.0" ++Object courseData ++Object userData ++init() Promise~void~ ++loadCourses() Promise~Array~ ++enrollCourse(courseId) Promise~Object~ ++getEnrolledCourses() Promise~Array~ ++updateProgress(courseId, progress) Promise~Object~ +} +class CourseModel { ++String id ++String title ++String description ++String instructor ++Number duration ++String category ++Number price ++String thumbnail ++Lesson[] lessons ++Date startDate ++Date endDate +} +class LessonModel { ++String id ++String courseId ++String title ++String content ++String contentType ++Number duration ++Boolean completed ++Date completionDate +} +class EnrollmentModel { ++String id ++String userId ++String courseId ++String enrollmentDate ++Number progress ++String status ++Date lastAccessed +} +EducationPlugin --> CourseModel +EducationPlugin --> LessonModel +EducationPlugin --> EnrollmentModel +``` + +**图表来源** +- [index.html:1648-1754](file://index.html#L1648-L1754) + +### 校友社群功能插件 + +校友社群功能插件提供了社交网络功能: + +```mermaid +classDiagram +class AlumniPlugin { ++String pluginId "alumni-community-plugin" ++String name "校友社群功能" ++String version "1.0.0" ++Object alumniData ++Object activityData ++Object connectionData ++init() Promise~void~ ++searchAlumni(filters) Promise~Array~ ++connectAlumni(userId) Promise~Object~ ++createActivity(activity) Promise~Object~ ++joinActivity(activityId) Promise~Object~ ++getRecommendedActivities() Promise~Array~ +} +class AlumniMember { ++String id ++String name ++String avatar ++String company ++String position ++String industry ++String location ++String[] skills ++Connection[] connections ++Date joinDate ++Boolean verified +} +class ActivityModel { ++String id ++String title ++String description ++String type ++String location ++Date startTime ++Date endTime ++Number maxParticipants ++String[] participants ++String organizer ++Boolean virtual ++String meetingLink +} +class ConnectionModel { ++String id ++String userId ++String connectedUserId ++String connectionType ++Date connectedDate ++String mutualConnections ++Boolean confirmed +} +AlumniPlugin --> AlumniMember +AlumniPlugin --> ActivityModel +AlumniPlugin --> ConnectionModel +``` + +**图表来源** +- [index.html:1894-2028](file://index.html#L1894-L2028) + +### 会员订阅系统插件 + +会员订阅系统插件实现了完整的会员管理功能: + +```mermaid +classDiagram +class MembershipPlugin { ++String pluginId "membership-system-plugin" ++String name "会员订阅系统" ++String version "1.0.0" ++Object membershipPlans ++Object userSubscriptions ++Object billingData ++init() Promise~void~ ++getAvailablePlans() Promise~Array~ ++subscribeToPlan(planId, paymentMethod) Promise~Object~ ++cancelSubscription(subscriptionId) Promise~Object~ ++upgradePlan(currentPlanId, newPlanId) Promise~Object~ ++checkSubscriptionStatus(userId) Promise~Object~ +} +class MembershipPlan { ++String id ++String name ++String description ++Number price ++String currency ++String billingCycle ++Object features ++Boolean popular ++Number discountRate +} +class SubscriptionModel { ++String id ++String userId ++String planId ++String status ++Date startDate ++Date endDate ++Date renewalDate ++Number billingAmount ++String billingCurrency ++String paymentMethod ++Boolean autoRenew ++Object usageLimits +} +class UsageLimitModel { ++String limitType ++Number maxAllowed ++Number currentUsage ++Number remaining ++String period ++Date resetDate +} +MembershipPlugin --> MembershipPlan +MembershipPlugin --> SubscriptionModel +MembershipPlugin --> UsageLimitModel +``` + +**图表来源** +- [index.html:2030-2133](file://index.html#L2030-L2133) + +**章节来源** +- [index.html:1648-1754](file://index.html#L1648-L1754) +- [index.html:1894-2028](file://index.html#L1894-L2028) +- [index.html:2030-2133](file://index.html#L2030-L2133) + +## 插件集成最佳实践 + +### 设计原则 + +插件开发遵循以下设计原则: + +```mermaid +flowchart TD +DesignPrinciples[设计原则] --> Modularity[模块化] +DesignPrinciples --> Reusability[可复用性] +DesignPrinciples --> Scalability[可扩展性] +DesignPrinciples --> Compatibility[兼容性] +DesignPrinciples --> Performance[性能] +DesignPrinciples --> Security[安全性] +Modularity --> CleanCode["代码整洁"] +Modularity --> WellDefinedAPI["接口清晰"] +Modularity --> LooseCoupling["松耦合"] +Reusability --> GenericDesign["通用设计"] +Reusability --> ConfigurationDriven["配置驱动"] +Reusability --> TemplatePattern["模板模式"] +Scalability --> HorizontalScaling["水平扩展"] +Scalability --> VerticalScaling["垂直扩展"] +Scalability --> LoadBalancing["负载均衡"] +Compatibility --> BackwardCompatibility["向后兼容"] +Compatibility --> CrossBrowser["跨浏览器"] +Compatibility --> CrossPlatform["跨平台"] +Performance --> OptimizedRendering["渲染优化"] +Performance --> EfficientDataHandling["数据处理优化"] +Performance --> MemoryManagement["内存管理"] +Security --> InputValidation["输入验证"] +Security --> AccessControl["访问控制"] +Security --> DataEncryption["数据加密"] +Security --> ErrorHandling["错误处理"] +Security --> Logging["日志记录"] +Security --> Monitoring["监控"] +``` + +### 集成策略 + +插件与现有系统的集成策略: + +```mermaid +graph TB +subgraph "集成架构" +A[插件系统] +B[核心系统] +C[事件系统] +D[配置系统] +E[生命周期管理] +end +subgraph "集成点" +F[页面集成] +G[组件集成] +H[AI集成] +I[数据集成] +end +A --> F +A --> G +A --> H +A --> I +F --> B +G --> B +H --> B +I --> B +B --> C +B --> D +B --> E +C --> F +D --> G +E --> H +F --> I +``` + +**图表来源** +- [index.html:2331-2533](file://index.html#L2331-L2533) + +### 最佳实践清单 + +插件开发的最佳实践清单: + +1. **遵循设计原则** + - 使用模块化设计 + - 保持松耦合 + - 提供清晰的接口 + +2. **性能优化** + - 避免阻塞主线程 + - 使用懒加载 + - 优化渲染性能 + +3. **错误处理** + - 实现完善的错误处理 + - 提供用户友好的错误信息 + - 记录详细的日志 + +4. **安全考虑** + - 验证用户输入 + - 实施访问控制 + - 加密敏感数据 + +5. **兼容性保证** + - 支持多种浏览器 + - 兼容不同设备 + - 向后兼容旧版本 + +**章节来源** +- [index.html:2331-2533](file://index.html#L2331-L2533) + +## 性能考虑 + +### 性能优化策略 + +插件性能优化的关键策略: + +```mermaid +flowchart TD +PerformanceOptimization[性能优化] --> Rendering[渲染优化] +PerformanceOptimization --> Memory[内存优化] +PerformanceOptimization --> Network[网络优化] +PerformanceOptimization --> Storage[存储优化] +Rendering --> VirtualDOM["虚拟DOM"] +Rendering --> LazyLoading["懒加载"] +Rendering --> ComponentCaching["组件缓存"] +Rendering --> AnimationOptimization["动画优化"] +Memory --> GarbageCollection["垃圾回收"] +Memory --> MemoryLeakPrevention["内存泄漏预防"] +Memory --> ObjectPooling["对象池"] +Memory --> MemoryProfiling["内存分析"] +Network --> RequestOptimization["请求优化"] +Network --> CachingStrategy["缓存策略"] +Network --> BatchRequests["批量请求"] +Network --> Compression["数据压缩"] +Storage --> LocalStorage["LocalStorage"] +Storage --> SessionStorage["SessionStorage"] +Storage --> IndexedDB["IndexedDB"] +Storage --> CacheManagement["缓存管理"] +``` + +### 性能监控 + +插件性能监控机制: + +```mermaid +classDiagram +class PerformanceMonitor { ++Object metrics ++PerformanceEntry[] entries ++startMonitoring() void ++stopMonitoring() void ++collectMetrics() Object ++reportMetrics() void +} +class MetricCollector { ++collectTimingMetrics() Object ++collectMemoryMetrics() Object ++collectNetworkMetrics() Object ++collectRenderingMetrics() Object +} +class PerformanceReport { ++String pluginId ++Object metrics ++Date timestamp ++String environment ++PerformanceEntry[] entries +} +PerformanceMonitor --> MetricCollector +PerformanceMonitor --> PerformanceReport +``` + +**图表来源** +- [index.html:2331-2533](file://index.html#L2331-L2533) + +## 故障排除指南 + +### 常见问题诊断 + +插件开发中的常见问题及解决方法: + +```mermaid +flowchart TD +ProblemDiagnosis[问题诊断] --> Initialization[初始化问题] +ProblemDiagnosis --> Configuration[配置问题] +ProblemDiagnosis --> Integration[Integration问题] +ProblemDiagnosis --> Performance[性能问题] +ProblemDiagnosis --> Security[安全问题] +Initialization --> PluginLoadFail["插件加载失败"] +Initialization --> ConfigValidationError["配置验证失败"] +Initialization --> DependencyMissing["依赖缺失"] +Initialization --> VersionConflict["版本冲突"] +Configuration --> InvalidConfig["配置无效"] +Configuration --> MissingRequiredField["缺少必需字段"] +Configuration --> TypeMismatch["类型不匹配"] +Configuration --> ValueOutOfRange["数值超出范围"] +Integration --> EventNotReceived["事件未接收"] +Integration --> MethodNotImplemented["方法未实现"] +Integration --> InterfaceNotFollowed["接口未遵循"] +Integration --> LifecycleIssue["生命周期问题"] +Performance --> SlowResponse["响应缓慢"] +Performance --> MemoryLeak["内存泄漏"] +Performance --> HighCPUUsage["CPU占用过高"] +Performance --> NetworkTimeout["网络超时"] +Security --> XSSAttack["XSS攻击"] +Security --> CSRFAttack["CSRF攻击"] +Security --> DataBreach["数据泄露"] +Security --> PrivilegeEscalation["权限提升"] +``` + +### 调试工具 + +插件调试和测试工具: + +```mermaid +classDiagram +class DebugTools { ++ConsoleLogger logger ++PerformanceProfiler profiler ++MemoryAnalyzer analyzer ++NetworkInspector inspector ++EventDebugger debugger +} +class ConsoleLogger { ++log(message) void ++warn(message) void ++error(message) void ++info(message) void ++debug(message) void +} +class PerformanceProfiler { ++startTimer(label) void ++stopTimer(label) void ++measureOperation(operation) void ++getProfile() Object +} +class MemoryAnalyzer { ++trackObject(obj) void ++releaseObject(obj) void ++findLeaks() Object[] ++getMemoryUsage() Number +} +class NetworkInspector { ++interceptRequest(request) void ++interceptResponse(response) void ++mockResponse(mock) void ++getNetworkLog() Object[] +} +class EventDebugger { ++listenToEvent(event) void ++simulateEvent(event) void ++traceEventFlow() void ++validateEvent(event) boolean +} +DebugTools --> ConsoleLogger +DebugTools --> PerformanceProfiler +DebugTools --> MemoryAnalyzer +DebugTools --> NetworkInspector +DebugTools --> EventDebugger +``` + +**图表来源** +- [index.html:2331-2533](file://index.html#L2331-L2533) + +**章节来源** +- [index.html:2331-2533](file://index.html#L2331-L2533) + +## 结论 + +有维项目的插件开发框架为开发者提供了完整的扩展能力。通过遵循本文档提供的开发模板、接口规范和最佳实践,开发者可以创建高质量的插件来扩展平台功能。 + +关键要点总结: + +1. **模块化设计**:插件应采用模块化设计,遵循单一职责原则 +2. **接口规范**:严格遵循插件接口规范,确保兼容性 +3. **性能优化**:重视性能优化,避免影响用户体验 +4. **错误处理**:实现完善的错误处理机制 +5. **安全考虑**:确保插件的安全性,防止各种攻击 +6. **测试验证**:进行全面的测试和验证 +7. **文档编写**:提供完整的插件文档 + +通过这些指导原则和实践,开发者可以创建出既符合平台要求又具有良好用户体验的插件系统。 \ No newline at end of file diff --git a/有维项目/.qoder/repowiki/zh/content/扩展与集成/数据持久化策略.md b/有维项目/.qoder/repowiki/zh/content/扩展与集成/数据持久化策略.md new file mode 100644 index 0000000..7fafe25 --- /dev/null +++ b/有维项目/.qoder/repowiki/zh/content/扩展与集成/数据持久化策略.md @@ -0,0 +1,366 @@ +# 数据持久化策略 + + +**本文档引用的文件** +- [index.html](file://index.html) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构总览](#架构总览) +5. [详细组件分析](#详细组件分析) +6. [依赖关系分析](#依赖关系分析) +7. [性能考量](#性能考量) +8. [故障排查指南](#故障排查指南) +9. [结论](#结论) +10. [附录](#附录) + +## 简介 +本项目为“有维商学”前端单页应用,当前未实现任何客户端数据持久化(如 localStorage/sessionStorage、IndexedDB、Web SQL 等),所有用户状态与界面交互均为内存态,刷新即丢失。本文档围绕现有代码现状,提出数据持久化策略与扩展方案,涵盖数据模型设计、同步机制、备份恢复、清理规则、隐私保护、迁移升级、性能优化与安全考虑,并提供可视化图示辅助理解。 + +## 项目结构 +- 单文件 HTML 应用,包含完整的页面结构、样式与内联 JavaScript。 +- 页面包含登录页、仪表盘、AI智能体页等,通过内联脚本实现页面切换与交互。 +- 无外部依赖,所有逻辑集中在 index.html 中。 + +```mermaid +graph TB +A["index.html
主页面与内联脚本"] --> B["登录页
表单与提交逻辑"] +A --> C["仪表盘页
导航与Tab切换"] +A --> D["AI智能体页
卡片与筛选"] +A --> E["聊天弹窗
消息发送与显示"] +``` + +图表来源 +- [index.html](file://index.html) + +章节来源 +- [index.html](file://index.html) + +## 核心组件 +- 用户状态管理:当前登录用户名在内存中维护,页面切换与用户头像显示依赖该变量。 +- 页面路由:通过内联函数切换页面与 Tab,无历史记录持久化。 +- 交互组件:用户菜单、行业筛选、聊天对话等均为内存态,未与持久化绑定。 + +章节来源 +- [index.html](file://index.html) + +## 架构总览 +当前架构为纯前端单页应用,无后端接口调用与数据持久化层。若要引入数据持久化,建议采用如下分层: +- 表现层:index.html 的页面与交互逻辑 +- 业务层:用户、课程、AI对话、会员状态等数据模型与业务规则 +- 持久化层:localStorage/sessionStorage(短期)、IndexedDB(长期)、Web SQL(兼容) +- 同步层:与后端 API 的数据同步与一致性保障 +- 安全层:加密、访问控制、审计日志 + +```mermaid +graph TB +subgraph "表现层" +UI["index.html
页面与交互"] +end +subgraph "业务层" +UM["用户模型"] +CM["课程模型"] +AIM["AI对话模型"] +MEM["会员状态模型"] +end +subgraph "持久化层" +LS["localStorage"] +SS["sessionStorage"] +IDB["IndexedDB"] +WSQL["Web SQL"] +end +subgraph "同步层" +API["后端API"] +end +subgraph "安全层" +ENC["加密"] +ACL["访问控制"] +AUDIT["审计日志"] +end +UI --> UM +UI --> CM +UI --> AIM +UI --> MEM +UM --> LS +CM --> LS +AIM --> LS +MEM --> LS +LS --> IDB +SS --> IDB +IDB --> API +WSQL --> API +API --> ENC +API --> ACL +API --> AUDIT +``` + +图表来源 +- [index.html](file://index.html) + +## 详细组件分析 + +### 用户数据模型与持久化 +- 当前实现:登录用户名保存在内存变量中,刷新即丢失;用户头像与显示名称通过更新 DOM 实现。 +- 建议模型字段(示例): + - 用户标识、昵称、头像、登录时间、最近活跃时间、设备指纹、会员等级、权限集合 +- 持久化策略: + - 短期:sessionStorage(会话级,浏览器关闭即清空) + - 长期:localStorage(跨会话保留,需注意隐私与容量) + - 安全:对敏感字段进行加密存储,定期轮换密钥 + +```mermaid +classDiagram +class UserModel { ++string userId ++string displayName ++string avatar ++datetime lastLogin ++datetime lastActive ++string deviceFingerprint ++string membershipLevel ++array permissions ++saveToStorage() ++loadFromStorage() ++clearStorage() +} +``` + +图表来源 +- [index.html](file://index.html) + +章节来源 +- [index.html](file://index.html) + +### 课程数据模型与持久化 +- 当前实现:课程列表为静态展示,无用户学习进度与收藏状态。 +- 建议模型字段(示例): + - 课程ID、标题、描述、时长、学习状态、完成时间、评分、笔记 +- 持久化策略: + - 使用 IndexedDB 存储结构化课程数据,支持复杂查询与索引 + - localStorage 仅用于轻量元数据(如最近浏览) + +```mermaid +classDiagram +class CourseModel { ++string courseId ++string title ++string description ++number duration ++string status ++datetime completedAt ++number rating ++string notes ++saveToDB() ++loadFromDB() ++syncWithServer() +} +``` + +图表来源 +- [index.html](file://index.html) + +章节来源 +- [index.html](file://index.html) + +### AI对话记录模型与持久化 +- 当前实现:聊天弹窗为内存态,消息在页面内渲染,无持久化。 +- 建议模型字段(示例): + - 对话ID、AI角色、消息数组(含时间戳、类型、内容)、会话标签、创建/更新时间 +- 持久化策略: + - IndexedDB 分区存储(按角色/日期),支持批量写入与增量同步 + - sessionStorage 用于临时草稿 + +```mermaid +classDiagram +class ChatRecordModel { ++string chatId ++string aiRole ++array messages ++string tag ++datetime createdAt ++datetime updatedAt ++saveToDB() ++loadFromDB() ++exportHistory() +} +``` + +图表来源 +- [index.html](file://index.html) + +章节来源 +- [index.html](file://index.html) + +### 会员状态模型与持久化 +- 当前实现:会员体系为静态展示,无用户会员状态与有效期持久化。 +- 建议模型字段(示例): + - 会员ID、类型、到期时间、续费记录、权益清单、订阅状态 +- 持久化策略: + - localStorage/sessionStorage 保存当前会话状态 + - IndexedDB 存储历史订阅与权益变更 + +```mermaid +classDiagram +class MembershipModel { ++string membershipId ++string level ++datetime expireAt ++array renewalRecords ++array privileges ++string subscriptionStatus ++saveToStorage() ++loadFromStorage() ++checkRenewalDue() +} +``` + +图表来源 +- [index.html](file://index.html) + +章节来源 +- [index.html](file://index.html) + +### 数据同步机制与一致性 +- 离线优先:本地 IndexedDB 作为主存储,sessionStorage 作为缓存层 +- 在线同步:通过后端 API 接口进行双向同步,冲突解决采用时间戳与版本号 +- 一致性策略: + - 写入本地后立即标记为“待同步” + - 后台任务周期性上传,失败重试指数退避 + - 下发变更时进行本地合并与冲突消解 + +```mermaid +sequenceDiagram +participant UI as "界面" +participant Local as "本地存储(IndexedDB)" +participant Sync as "同步队列" +participant API as "后端API" +UI->>Local : 写入数据(标记待同步) +Local-->>Sync : 入队 +Sync->>API : 上传变更 +API-->>Sync : 返回结果 +Sync->>Local : 标记已同步/更新状态 +API-->>UI : 下发最新数据(推送/拉取) +``` + +图表来源 +- [index.html](file://index.html) + +章节来源 +- [index.html](file://index.html) + +### 数据备份与恢复策略 +- 备份:定期导出用户数据(JSON/CSV),支持选择性导出(用户、课程、对话、会员) +- 恢复:导入时进行格式校验与冲突检测,支持增量恢复 +- 清理:过期数据(如历史对话、过期会员)自动归档或删除 + +```mermaid +flowchart TD +Start(["开始"]) --> Export["导出数据"] +Export --> Validate{"校验格式"} +Validate --> |通过| Save["保存到本地/云端"] +Validate --> |失败| Fix["修复格式错误"] +Fix --> Export +Save --> Restore["导入数据"] +Restore --> Merge["合并/冲突检测"] +Merge --> Apply["应用到本地存储"] +Apply --> End(["结束"]) +``` + +图表来源 +- [index.html](file://index.html) + +章节来源 +- [index.html](file://index.html) + +### 数据清理规则与隐私保护 +- 清理规则: + - 会话结束后清理 sessionStorage + - 30天未登录的用户数据进行匿名化处理 + - 过期会员数据定期归档 +- 隐私保护: + - 敏感字段(如手机号、支付信息)加密存储 + - 本地不保留明文敏感数据 + - 提供数据删除与匿名化选项 + +章节来源 +- [index.html](file://index.html) + +### 数据迁移与版本升级 +- 版本管理:在本地存储中记录 schema 版本号 +- 迁移流程: + - 启动时检查版本,执行迁移脚本 + - 支持回滚与增量迁移 + - 迁移完成后更新版本号 + +章节来源 +- [index.html](file://index.html) + +### 性能优化建议 +- 批量操作:将多次小写入合并为批量写入,减少索引重建 +- 索引优化:为常用查询字段建立复合索引(如用户ID+时间) +- 内存管理:及时释放大对象引用,避免内存泄漏 +- 缓存策略:合理使用 sessionStorage 与 localStorage,避免超限 + +章节来源 +- [index.html](file://index.html) + +### 数据安全考虑 +- 加密:对敏感字段进行对称加密,密钥与数据分离存储 +- 访问控制:基于用户权限与角色的最小授权原则 +- 审计日志:记录关键数据变更与访问行为,便于追踪 + +章节来源 +- [index.html](file://index.html) + +## 依赖关系分析 +- 当前依赖:无外部依赖,所有逻辑内联于 index.html +- 扩展依赖:引入 IndexedDB/Web SQL 后,需考虑浏览器兼容性与降级策略 + +```mermaid +graph LR +IDX["IndexedDB API"] --> PERSIST["持久化层"] +Sess["sessionStorage API"] --> PERSIST +Local["localStorage API"] --> PERSIST +PERSIST --> SYNC["同步层"] +SYNC --> API["后端API"] +``` + +图表来源 +- [index.html](file://index.html) + +章节来源 +- [index.html](file://index.html) + +## 性能考量 +- 读写性能:优先使用 IndexedDB,localStorage 仅用于轻量数据 +- 网络性能:离线优先,后台异步同步,避免阻塞主线程 +- 内存占用:控制单次加载数据量,使用分页与懒加载 + +[本节为通用指导,无需特定文件来源] + +## 故障排查指南 +- 常见问题: + - 浏览器禁用 localStorage/sessionStorage 导致状态丢失 + - IndexedDB 不可用或存储空间不足 + - 同步失败导致数据不一致 +- 排查步骤: + - 检查浏览器开发者工具的 Application/Storage 面板 + - 查看同步队列与错误日志 + - 验证后端 API 响应与鉴权状态 + +章节来源 +- [index.html](file://index.html) + +## 结论 +当前项目为纯前端单页应用,尚未实现数据持久化。建议尽快引入 IndexedDB 作为主要存储,结合 localStorage/sessionStorage 与后端 API,构建完整的数据持久化与同步体系。同时完善备份恢复、清理规则、隐私保护与安全策略,确保用户体验与数据安全。 + +[本节为总结,无需特定文件来源] + +## 附录 +- 参考实现位置: + - 用户状态与页面切换:[index.html](file://index.html) + - 聊天对话与消息渲染:[index.html](file://index.html) + - 行业筛选与卡片展示:[index.html](file://index.html) \ No newline at end of file diff --git a/有维项目/.qoder/repowiki/zh/content/扩展与集成/系统集成点.md b/有维项目/.qoder/repowiki/zh/content/扩展与集成/系统集成点.md new file mode 100644 index 0000000..e5627f8 --- /dev/null +++ b/有维项目/.qoder/repowiki/zh/content/扩展与集成/系统集成点.md @@ -0,0 +1,300 @@ +# 系统集成点 + + +**本文引用的文件列表** +- [index.html](file://index.html) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构总览](#架构总览) +5. [详细组件分析](#详细组件分析) +6. [依赖关系分析](#依赖关系分析) +7. [性能考量](#性能考量) +8. [故障排查指南](#故障排查指南) +9. [结论](#结论) +10. [附录](#附录) + +## 简介 +本文件面向“有维项目”的系统集成与运维视角,聚焦于第三方服务集成(微信登录SDK、短信服务API、支付系统对接)、数据库连接方案(MySQL/MongoDB配置与连接池管理)、基础设施集成(CDN加速、静态资源托管、缓存系统部署)、微服务架构下的服务发现与负载均衡、监控与运维集成(日志、性能、错误追踪、健康检查、容量规划)、集成测试与灰度发布策略、安全与合规要求。由于当前仓库仅包含前端单页应用(index.html),本文在不改变事实的前提下,对上述主题给出通用性、可落地的实施建议与最佳实践,便于后续扩展至后端与基础设施层。 + +## 项目结构 +当前仓库为前端单页应用,主要文件为 index.html,包含完整的HTML结构、样式与脚本,用于实现登录、仪表盘、AI智能体门户等功能页面与交互逻辑。 + +```mermaid +graph TB +A["index.html
前端单页应用"] --> B["页面与导航
登录/仪表盘/AI门户"] +A --> C["样式与主题
CSS变量与响应式布局"] +A --> D["交互逻辑
JavaScript函数与事件处理"] +``` + +图表来源 +- [index.html:1-2735](file://index.html#L1-L2735) + +章节来源 +- [index.html:1-2735](file://index.html#L1-L2735) + +## 核心组件 +- 登录与认证 + - 登录表单与提交处理,模拟登录流程,切换页面与用户信息展示。 +- 仪表盘 + - 多Tab导航(平台概览、有维教育、AI工具、有维校友、会员体系),统计卡片、内容卡片、课程与学习路径展示。 +- AI智能体门户 + - 智能体卡片、行业场景筛选、快捷问答、聊天对话弹窗。 +- 用户菜单与退出登录 + - 下拉菜单、用户头像与显示名更新、退出登录回到登录页。 + +章节来源 +- [index.html:1556-1623](file://index.html#L1556-L1623) +- [index.html:1626-2230](file://index.html#L1626-L2230) +- [index.html:2233-2409](file://index.html#L2233-L2409) +- [index.html:2411-2446](file://index.html#L2411-L2446) +- [index.html:2448-2732](file://index.html#L2448-L2732) + +## 架构总览 +前端单页应用采用浏览器端渲染与本地状态管理,页面间通过JavaScript控制切换;AI对话采用模态框承载,消息通过本地DOM追加与滚动定位。整体无后端依赖,后续可扩展为前后端分离架构,引入API网关、微服务与中间件。 + +```mermaid +graph TB +subgraph "客户端" +U["用户界面
index.html"] --> P1["登录页"] +U --> P2["仪表盘页"] +U --> P3["AI智能体页"] +P1 --> J1["登录逻辑
handleLogin()"] +P2 --> J2["Tab切换
showTab()"] +P3 --> J3["行业筛选
filterByIndustry()"] +P3 --> J4["聊天对话
openChat()/sendMessage()"] +end +``` + +图表来源 +- [index.html:1556-1623](file://index.html#L1556-L1623) +- [index.html:1626-2230](file://index.html#L1626-L2230) +- [index.html:2233-2409](file://index.html#L2233-L2409) +- [index.html:2448-2732](file://index.html#L2448-L2732) + +## 详细组件分析 + +### 登录与认证组件 +- 功能要点 + - 表单校验:用户名与密码非空判断。 + - 加载遮罩:登录中显示加载动画。 + - 登录成功:更新用户头像与显示名,切换到仪表盘页。 + - 退出登录:清空表单,回到登录页。 +- 数据流 + - 输入 -> 防抖/校验 -> 加载动画 -> 成功回调 -> 状态更新 -> 页面切换。 + +```mermaid +sequenceDiagram +participant U as "用户" +participant L as "登录页" +participant JS as "handleLogin()" +participant S as "状态/页面切换" +U->>L : 提交登录表单 +L->>JS : 触发handleLogin(event) +JS->>JS : 校验用户名/密码 +JS->>L : 显示加载遮罩 +JS->>JS : 模拟登录延迟 +JS->>S : 更新用户信息 +JS->>S : 切换到仪表盘页 +JS-->>U : 登录完成 +``` + +图表来源 +- [index.html:2462-2481](file://index.html#L2462-L2481) +- [index.html:2484-2494](file://index.html#L2484-L2494) +- [index.html:2453-2459](file://index.html#L2453-L2459) + +章节来源 +- [index.html:2448-2531](file://index.html#L2448-L2531) + +### 仪表盘组件 +- 功能要点 + - Tab导航:平台概览、有维教育、AI工具、有维校友、会员体系。 + - 统计卡片:平台定位、AI驱动、会员制、服务OPC数量。 + - 内容卡片:教育、AI工具、校友社群的核心能力与权益。 + - 会员体系:基础版/专业版/企业版权益对比与订阅入口。 +- 数据流 + - 用户点击Tab -> showTab() -> 激活对应内容区 -> DOM切换。 + +```mermaid +flowchart TD +Start(["进入仪表盘"]) --> ClickTab["点击Tab按钮"] +ClickTab --> UpdateActive["更新激活状态"] +UpdateActive --> ShowContent["显示对应Tab内容"] +ShowContent --> End(["完成"]) +``` + +图表来源 +- [index.html:2534-2562](file://index.html#L2534-L2562) + +章节来源 +- [index.html:1626-2230](file://index.html#L1626-L2230) + +### AI智能体门户组件 +- 功能要点 + - 智能体卡片:客户服务、效率工具、知识问答、日常办公、战略咨询、创业工具等。 + - 行业场景筛选:人资、法务合规、营销市场、行政管理、教育场景、康养、工业领域等。 + - 快捷问答与聊天:模态框承载,支持快捷消息与键盘发送。 +- 数据流 + - 选择智能体 -> openChat() -> 初始化消息 -> 用户输入 -> sendMessage() -> 本地响应。 + +```mermaid +sequenceDiagram +participant U as "用户" +participant A as "AI智能体页" +participant M as "聊天模态框" +participant JS as "openChat/sendMessage" +U->>A : 点击智能体卡片 +A->>JS : openChat(name, icon, bgColor) +JS->>M : 设置标题/头像/背景色 +JS->>M : 渲染初始消息 +U->>M : 输入问题/点击发送 +M->>JS : sendMessage() +JS->>JS : 添加用户消息 +JS->>JS : 模拟AI响应 +JS-->>M : 追加AI回复 +``` + +图表来源 +- [index.html:2645-2666](file://index.html#L2645-L2666) +- [index.html:2668-2724](file://index.html#L2668-L2724) + +章节来源 +- [index.html:2233-2409](file://index.html#L2233-L2409) +- [index.html:2411-2446](file://index.html#L2411-L2446) +- [index.html:2645-2732](file://index.html#L2645-L2732) + +### 用户菜单与退出登录 +- 功能要点 + - 用户头像点击 -> 切换下拉菜单 -> 点击菜单项 -> 执行动作(会员中心、账户设置、退出登录)。 + - 退出登录 -> 清空表单 -> 回到登录页。 +- 数据流 + - toggleUserMenu() 控制菜单显隐;handleLogout() 清理状态并切换页面。 + +```mermaid +flowchart TD +A["点击用户头像"] --> B{"菜单是否已激活"} +B --> |否| C["显示菜单"] +B --> |是| D["隐藏菜单"] +C --> E["点击菜单项"] +D --> E +E --> F{"动作类型"} +F --> |退出登录| G["清理状态并跳转登录页"] +F --> |其他| H["执行对应操作"] +``` + +图表来源 +- [index.html:2496-2531](file://index.html#L2496-L2531) + +章节来源 +- [index.html:2483-2531](file://index.html#L2483-L2531) + +## 依赖关系分析 +- 前端内部依赖 + - HTML结构与样式定义在 index.html 中集中管理,JavaScript函数直接操作DOM以实现页面切换、菜单控制与聊天交互。 +- 后续扩展建议 + - 引入后端API:登录、课程、AI对话、会员权益等接口。 + - 引入第三方SDK:微信登录、短信服务、支付系统。 + - 引入中间件:鉴权、限流、日志、监控、缓存、CDN等。 + +```mermaid +graph TB +FE["前端(index.html)"] --> API["后端API"] +FE --> SDK1["微信登录SDK"] +FE --> SDK2["短信服务API"] +FE --> SDK3["支付系统"] +API --> DB["数据库(MySQL/MongoDB)"] +API --> Cache["缓存系统"] +API --> CDN["CDN加速/静态资源"] +``` + +图表来源 +- [index.html:1-2735](file://index.html#L1-L2735) + +章节来源 +- [index.html:1-2735](file://index.html#L1-L2735) + +## 性能考量 +- 前端性能 + - 使用CSS变量与媒体查询实现响应式布局,减少重复样式。 + - JavaScript事件委托与按需DOM更新,避免全量重绘。 +- 后端与基础设施性能 + - 连接池管理:合理设置最大连接数、空闲超时、连接生命周期。 + - 缓存策略:热点数据缓存、CDN分发、静态资源版本化与长缓存。 + - 负载均衡:多实例部署、健康检查、故障转移。 + - 监控指标:请求延迟、吞吐量、错误率、资源利用率。 + +## 故障排查指南 +- 登录问题 + - 检查表单输入与校验逻辑;确认加载遮罩显示与页面切换。 +- 聊天功能异常 + - 检查模态框开关逻辑、消息追加与滚动定位。 +- 用户菜单不显示 + - 检查 toggleUserMenu() 与点击外部关闭逻辑。 +- 性能问题 + - 分析DOM更新频率、事件绑定数量;考虑虚拟滚动与懒加载。 + +章节来源 +- [index.html:2448-2732](file://index.html#L2448-L2732) + +## 结论 +当前仓库为前端单页应用,具备清晰的页面结构与交互逻辑。为满足系统集成与运维需求,建议后续引入后端服务、第三方SDK与基础设施中间件,并配套完善监控、日志、缓存、CDN与安全策略,形成可扩展、可观测、可维护的完整系统。 + +## 附录 + +### 第三方服务集成指南(通用) +- 微信登录SDK集成 + - 在登录页增加“微信登录”按钮,调用SDK发起授权;回调后携带授权码换取用户信息;前端保存令牌并切换页面。 +- 短信服务API接入 + - 在注册/找回密码流程中调用短信API发送验证码;校验通过后继续业务流程。 +- 支付系统对接 + - 选择支付通道(如微信支付/支付宝),前端发起下单请求,后端返回支付参数,前端唤起支付页面;支付完成后回调通知。 + +### 数据库连接方案(通用) +- MySQL + - 连接池参数:最大连接数、最小空闲连接、连接超时、查询超时;启用连接复用与心跳检测。 +- MongoDB + - 连接字符串含副本集/分片配置;连接池大小与读写偏好;索引优化与聚合查询。 +- 连接池管理 + - 动态扩缩容、健康检查、慢查询告警、连接泄漏检测。 + +### 基础设施集成(通用) +- CDN加速与静态资源托管 + - 将CSS/JS/图片上传至CDN;开启Gzip/Brotli压缩;配置缓存策略与回源规则。 +- 缓存系统部署 + - Redis/Memcached:键空间设计、过期策略、持久化、主从复制与哨兵/集群。 + +### 微服务架构集成(通用) +- 服务发现与负载均衡 + - 使用注册中心(如Consul/Nacos/Eureka)与网关(如Spring Cloud Gateway/Nginx)实现动态路由与健康检查。 +- 故障转移机制 + - 超时与熔断(Hystrix/Turbine);降级策略与快速失败;重试与幂等设计。 + +### 监控与运维集成(通用) +- 日志收集 + - 结构化日志格式;统一采集(Fluentd/Logstash)与存储(ES/S3);日志检索与告警。 +- 性能监控 + - APM(如SkyWalking/Pinpoint)埋点;关键链路追踪;SLA与阈值告警。 +- 错误追踪 + - 异常上报与聚合;根因分析;修复闭环。 +- 健康检查与容量规划 + - 探针与自愈;弹性伸缩;容量评估与压测。 + +### 集成测试与灰度发布(通用) +- 集成测试 + - 前后端联调、第三方SDK联调、数据库一致性测试;自动化回归。 +- 灰度发布策略 + - 金丝雀发布、蓝绿部署、AB实验;流量切分与回滚。 +- 回滚机制 + - 版本号管理、二进制回滚、配置回滚、数据库迁移回滚。 + +### 安全与合规(通用) +- 防火墙与DDoS防护 + - WAF/IPS、DDoS清洗、访问白名单、速率限制。 +- 数据脱敏与加密 + - 敏感字段脱敏、传输加密(TLS)、存储加密;密钥管理(KMS)。 +- 合规要求 + - 数据本地化、跨境传输审批、用户权利(访问/删除/更正)、审计日志。 \ No newline at end of file diff --git a/有维项目/.qoder/repowiki/zh/content/样式系统详解/CSS变量系统.md b/有维项目/.qoder/repowiki/zh/content/样式系统详解/CSS变量系统.md new file mode 100644 index 0000000..501653c --- /dev/null +++ b/有维项目/.qoder/repowiki/zh/content/样式系统详解/CSS变量系统.md @@ -0,0 +1,349 @@ +# CSS变量系统 + + +**本文档引用的文件** +- [index.html](file://index.html) + + +## 目录 +1. [简介](#简介) +2. [项目结构](#项目结构) +3. [核心组件](#核心组件) +4. [架构总览](#架构总览) +5. [详细组件分析](#详细组件分析) +6. [依赖关系分析](#依赖关系分析) +7. [性能考虑](#性能考虑) +8. [故障排除指南](#故障排除指南) +9. [结论](#结论) +10. [附录](#附录) + +## 简介 +本文件系统性梳理有维项目的CSS变量体系,聚焦于:root中定义的主色调与辅助色彩变量、背景与文本颜色变量、边框与阴影变量、渐变色变量的设计理念与使用场景,并结合实际样式代码说明变量在不同组件中的引用方式、变量继承机制以及主题定制方法。同时提供变量命名规范、颜色搭配原则、阴影层级规范与响应式断点变量的最佳实践,帮助开发者高效、一致地进行样式开发与主题定制。 + +## 项目结构 +本项目采用单页HTML结构,所有样式内联在HTML文件的` + + + +
+ + +
+
+

👋 欢迎回来,用户

+

今天是学习的好日子,继续加油!

+
+ + +
+ + + + + +
+ + +
+
+
+
🎯
+
OPC赋能
+
平台定位
+
+
+
🤖
+
AI驱动
+
核心价值
+
+
+
👑
+
会员制
+
服务模式
+
+
+
🚀
+
2000+
+
服务OPC
+
+
+ +
+

🏛️ 平台使命

+

有维商学致力于成为OPC创业者最信赖的成长伙伴,通过教育赋能、工具加持、社群连接,助力每一位OPC实现商业梦想。

+ +
+
+
📚
+

有维教育

+

系统化的商业课程体系

+
    +
  • 商业模式设计
  • +
  • 产品开发方法论
  • +
  • 市场营销策略
  • +
  • 运营管理体系
  • +
+
+
+
🤖
+

AI工具

+

智能体赋能创业全流程

+
    +
  • AISM智能客服
  • +
  • 商业计划书生成
  • +
  • 市场调研分析
  • +
  • 财务模型计算
  • +
+
+
+
👥
+

有维校友

+

互助共赢的创业者社群

+
    +
  • 校友网络连接
  • +
  • 资源精准对接
  • +
  • 线上线下活动
  • +
  • 导师一对一辅导
  • +
+
+
+
+
+ + +
+
+

📚 有维教育 · 知行合一

+

从认知升级到实战落地,为OPC创业者提供系统化的商业教育体系

+ +

核心课程体系

+
+
+
📊
+

商业模式设计

+

掌握商业画布、价值主张设计,构建可持续的商业模式

+
+ ⏱️ 32课时 + 👥 1.2k学员 +
+
+
+
💡
+

产品开发方法论

+

学习精益创业、MVP验证,快速打造市场认可的产品

+
+ ⏱️ 28课时 + 👥 980学员 +
+
+
+
📣
+

市场营销策略

+

数字营销、内容运营、增长黑客,全渠道获客方法论

+
+ ⏱️ 36课时 + 👥 1.5k学员 +
+
+
+
⚙️
+

运营管理体系

+

团队搭建、流程优化、数据驱动,提升运营效率

+
+ ⏱️ 24课时 + 👥 860学员 +
+
+
+ +

学习路径

+
+
+
🌱
+

认知启蒙

+

建立商业思维

+
+
+
🔧
+

能力构建

+

掌握核心技能

+
+
+
🎯
+

实战落地

+

项目实践验证

+
+
+
🚀
+

持续进化

+

迭代优化成长

+
+
+
+ +
+

✨ 教育特色

+
+
+
🎬
+

视频课程

+

高质量录播课程,随时随地学习

+
    +
  • 专业讲师授课
  • +
  • 案例实战解析
  • +
  • 可反复回看
  • +
+
+
+
🛠️
+

实战项目

+

真实商业场景,边学边练

+
    +
  • 模拟创业项目
  • +
  • 导师点评指导
  • +
  • 作品集展示
  • +
+
+
+
💬
+

答疑社群

+

专属学习群,问题即时解答

+
    +
  • 学员互助讨论
  • +
  • 助教在线答疑
  • +
  • 学习打卡激励
  • +
+
+
+
+
+ + +
+
+

🤖 AI工具 · OPC的数字员工

+

智能体矩阵赋能创业全流程,让每位OPC都拥有专属的AI助手团队

+ +
+
+
+
🎯
+
+

AISM平台智能客服

+ 客户服务 +
+
+

7×24小时在线服务,解答平台使用问题,提供智能化客户支持

+
+ 即时响应 + 多轮对话 + 问题分流 +
+ +
+ +
+
+
📝
+
+

会议纪要助手

+ 效率工具 +
+
+

自动记录会议内容,智能生成结构化纪要,提取行动项和决议

+
+ 语音转文字 + 重点提取 + 任务分配 +
+ +
+ +
+
+
🧠
+
+

Deepseek问答助手

+ 知识问答 +
+
+

基于深度学习的智能问答系统,为您解答各类商业和技术问题

+
+ 深度理解 + 精准回答 + 知识丰富 +
+ +
+ +
+
+
📋
+
+

行政助手

+ 日常办公 +
+
+

处理日常行政事务,日程安排、文档整理、提醒通知等

+
+ 日程管理 + 文档处理 + 智能提醒 +
+ +
+ +
+
+
📈
+
+

战略目标分析师

+ 战略咨询 +
+
+

帮助制定和分解战略目标,SWOT分析,竞品研究,市场洞察

+
+ 目标分解 + SWOT分析 + 竞品研究 +
+ +
+ +
+
+
📄
+
+

商业计划书生成器

+ 创业工具 +
+
+

快速生成专业商业计划书,包含市场分析、财务预测等完整内容

+
+ 模板丰富 + 数据分析 + 一键导出 +
+ +
+
+
+ +
+

🔒 AI工具核心特性

+
+
+
🔐
+

数据安全

+

企业级加密,隐私保护

+
+
+
+

即时响应

+

毫秒级响应,高效处理

+
+
+
🔄
+

持续优化

+

模型迭代,越用越智能

+
+
+
🎨
+

专属定制

+

个性化配置,贴合需求

+
+
+
+
+ + +
+
+

👥 有维校友 · 互助共赢的创业者社群

+

连接2000+优质OPC创业者,共享资源、互助成长、共创价值

+ +
+
+
🌐
+

校友网络

+

2000+精准人脉,拓展商业机会

+
    +
  • 行业分类精准
  • +
  • 地域覆盖广泛
  • +
  • 资源互补对接
  • +
+
+
+
🤝
+

资源对接

+

供需匹配,合作共赢

+
    +
  • 项目合作
  • +
  • 渠道对接
  • +
  • 投融资机会
  • +
+
+
+
🎉
+

专属活动

+

100+月度活动,学习社交两不误

+
    +
  • 行业沙龙
  • +
  • 创业大赛
  • +
  • 年度峰会
  • +
+
+
+
+

互助问答

+

经验分享,问题互助

+
    +
  • 实战经验分享
  • +
  • 难题集体攻克
  • +
  • 案例复盘学习
  • +
+
+
+
👨‍🏫
+

导师辅导

+

资深导师一对一指导

+
    +
  • 行业专家
  • +
  • 成功创业者
  • +
  • 投资人导师
  • +
+
+
+
🏅
+

校友认证

+

专属身份标识,信任背书

+
    +
  • 官方认证标识
  • +
  • 信用体系
  • +
  • 优先权益
  • +
+
+
+
+ +
+

📅 近期活动

+
+
+
+
22
+
3月
+
+
+

OPC增长黑客实战分享会

+

📍 线上直播 · 19:00-21:00

+
+ 线上 +
+
+
+
28
+
3月
+
+
+

深圳校友企业参访

+

📍 深圳南山区 · 14:00-17:00

+
+ 线下 +
+
+
+
05
+
4月
+
+
+

2026春季创业大赛

+

📍 上海 · 全天

+
+ 大型活动 +
+
+
+ +
+

💬 校友心声

+
+
+

"加入有维校友后,不仅学到了系统的商业知识,更重要的是认识了很多志同道合的创业伙伴,我的第一个大客户就是校友介绍的!"

+
+
+
+
李明华
+

智慧零售OPC · 深圳

+
+
+
+
+

"有维的AI工具帮我节省了大量时间,会议纪要助手和商业计划书生成器是我每天都在用的工具,效率提升了至少50%!"

+
+
+
+
王丽娟
+

企业服务OPC · 北京

+
+
+
+
+
+
+ + +
+
+

👑 会员体系

+

选择适合您的会员方案,开启创业成长之旅

+ +
+
+

基础版

+
免费
+

适合初步了解平台的新用户

+
    +
  • 基础课程试看
  • +
  • AI智能体体验(每日3次)
  • +
  • 校友社群浏览
  • +
  • 平台基础功能
  • +
+ +
+ + + +
+

企业版

+
¥2999/年
+

适合规模化发展的OPC团队

+
    +
  • 包含专业版全部权益
  • +
  • 团队账号(最多5人)
  • +
  • 线下活动优先参与
  • +
  • 一对一导师辅导
  • +
  • 专属客户经理
  • +
  • 定制化培训方案
  • +
+ +
+
+
+ +
+

📊 会员权益对比

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
权益项目基础版专业版企业版
课程学习试看✓ 无限✓ 无限
AI智能体3次/日✓ 无限✓ 无限
校友社群浏览✓ 全功能✓ 全功能
导师辅导-2次/月✓ 一对一
团队账号--✓ 5人
专属客户经理--
+
+
+
+
+ + +
+ + +
+
+
+

🤖 AI智能体门户

+

选择您需要的AI助手,开启智能化工作体验

+
+ +
+ + +
+ + + + + + + + +
+ +
+ + + + + +
+
+
+ +
+
+
+
🎯
+
+

AISM平台智能客服

+ 客户服务 +
+
+

7×24小时在线服务,解答平台使用问题,提供智能化客户支持,快速响应您的需求

+
+ 即时响应 + 多轮对话 + 问题分流 +
+ +
+ +
+
+
📝
+
+

会议纪要助手

+ 效率工具 +
+
+

自动记录会议内容,智能生成结构化纪要,提取关键决议和行动项,提升会议效率

+
+ 语音转文字 + 重点提取 + 任务分配 +
+ +
+ +
+
+
🧠
+
+

Deepseek问答助手

+ 知识问答 +
+
+

基于深度学习的智能问答系统,为您解答各类商业、技术、管理等专业问题

+
+ 深度理解 + 精准回答 + 知识丰富 +
+ +
+ +
+
+
📋
+
+

行政助手

+ 日常办公 +
+
+

处理日常行政事务,包括日程安排、文档整理、提醒通知、差旅预订等

+
+ 日程管理 + 文档处理 + 智能提醒 +
+ +
+ +
+
+
📈
+
+

战略目标分析师

+ 战略咨询 +
+
+

帮助制定和分解战略目标,进行SWOT分析、竞品研究、市场趋势洞察

+
+ 目标分解 + SWOT分析 + 竞品研究 +
+ +
+ +
+
+
📄
+
+

商业计划书生成器

+ 创业工具 +
+
+

快速生成专业商业计划书,包含执行摘要、市场分析、财务预测等完整模块

+
+ 模板丰富 + 数据分析 + 一键导出 +
+ +
+
+
+
+ + +
+
+
+
+
🎯
+
+

AISM平台智能客服

+

在线 · 平均响应 < 1秒

+
+
+ +
+ +
+
+
🎯
+
+ 您好!我是您的AI助手,很高兴为您服务。请问有什么可以帮助您的吗? +
+
+
+ +
+ + + + +
+ +
+ + +
+
+
+ + + + diff --git a/有维项目/login.html b/有维项目/login.html new file mode 100644 index 0000000..bc63151 --- /dev/null +++ b/有维项目/login.html @@ -0,0 +1,480 @@ + + + + + + 登录 - 有维商学 + + + + + + + + + + + + diff --git a/有维项目/logo.jpg b/有维项目/logo.jpg new file mode 100644 index 0000000..721d702 Binary files /dev/null and b/有维项目/logo.jpg differ diff --git a/有维项目/logo.png b/有维项目/logo.png new file mode 100644 index 0000000..028e96c Binary files /dev/null and b/有维项目/logo.png differ diff --git a/有维项目/test b/有维项目/test new file mode 100644 index 0000000..e69de29 diff --git a/有维项目/youwei-vue/.editorconfig b/有维项目/youwei-vue/.editorconfig new file mode 100644 index 0000000..3b510aa --- /dev/null +++ b/有维项目/youwei-vue/.editorconfig @@ -0,0 +1,8 @@ +[*.{js,jsx,mjs,cjs,ts,tsx,mts,cts,vue,css,scss,sass,less,styl}] +charset = utf-8 +indent_size = 2 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true +end_of_line = lf +max_line_length = 100 diff --git a/有维项目/youwei-vue/.gitattributes b/有维项目/youwei-vue/.gitattributes new file mode 100644 index 0000000..6313b56 --- /dev/null +++ b/有维项目/youwei-vue/.gitattributes @@ -0,0 +1 @@ +* text=auto eol=lf diff --git a/有维项目/youwei-vue/.gitignore b/有维项目/youwei-vue/.gitignore new file mode 100644 index 0000000..cd68f14 --- /dev/null +++ b/有维项目/youwei-vue/.gitignore @@ -0,0 +1,39 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +.DS_Store +dist +dist-ssr +coverage +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +*.tsbuildinfo + +.eslintcache + +# Cypress +/cypress/videos/ +/cypress/screenshots/ + +# Vitest +__screenshots__/ + +# Vite +*.timestamp-*-*.mjs diff --git a/有维项目/youwei-vue/.oxlintrc.json b/有维项目/youwei-vue/.oxlintrc.json new file mode 100644 index 0000000..d5648b9 --- /dev/null +++ b/有维项目/youwei-vue/.oxlintrc.json @@ -0,0 +1,10 @@ +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "plugins": ["eslint", "typescript", "unicorn", "oxc", "vue"], + "env": { + "browser": true + }, + "categories": { + "correctness": "error" + } +} diff --git a/有维项目/youwei-vue/.vscode/extensions.json b/有维项目/youwei-vue/.vscode/extensions.json new file mode 100644 index 0000000..55ad03c --- /dev/null +++ b/有维项目/youwei-vue/.vscode/extensions.json @@ -0,0 +1,8 @@ +{ + "recommendations": [ + "Vue.volar", + "dbaeumer.vscode-eslint", + "EditorConfig.EditorConfig", + "oxc.oxc-vscode" + ] +} diff --git a/有维项目/youwei-vue/README.md b/有维项目/youwei-vue/README.md new file mode 100644 index 0000000..8b63243 --- /dev/null +++ b/有维项目/youwei-vue/README.md @@ -0,0 +1,318 @@ +# Youwei Vue - Installation and Deployment Guide + +## Overview + +Youwei Vue is a modern web application built with Vue 3, TypeScript, and Vite. This document provides comprehensive instructions for installing, configuring, and deploying the application. + +--- + +## Table of Contents + +1. [Prerequisites](#prerequisites) +2. [Environment Setup](#environment-setup) +3. [Installation](#installation) +4. [Development](#development) +5. [Building for Production](#building-for-production) +6. [Deployment](#deployment) +7. [Troubleshooting](#troubleshooting) + +--- + +## Prerequisites + +Before you begin, ensure your system meets the following requirements: + +### System Requirements + +| Component | Minimum Version | +|-----------|-----------------| +| Node.js | ^20.19.0 or >=22.12.0 | +| npm | 10.x or higher | +| Git | 2.x or higher | + +### Supported Operating Systems + +- Windows 10/11 +- macOS 10.15+ +- Linux (Ubuntu 20.04+, CentOS 8+, Debian 10+) + +### Recommended IDE + +- [VS Code](https://code.visualstudio.com/) with [Vue - Official](https://marketplace.visualstudio.com/items?itemName=Vue.volar) extension +- Disable Vetur extension if previously installed + +--- + +## Environment Setup + +### 1. Install Node.js + +Download and install Node.js from the official website: + +```bash +# Using nvm (recommended) +nvm install 20 +nvm use 20 + +# Or download directly from +# https://nodejs.org/ +``` + +Verify installation: + +```bash +node --version # Should show v20.19.0 or higher +npm --version # Should show 10.x or higher +``` + +### 2. Install Git + +```bash +# Windows: Download from https://git-scm.com/download/win +# macOS: brew install git +# Linux: sudo apt-get install git +``` + +--- + +## Installation + +### 1. Clone the Repository + +```bash +git clone +cd youwei-vue +``` + +### 2. Install Dependencies + +```bash +npm install +``` + +This command installs all required dependencies including: +- Vue 3.5.29 +- Vue Router 5.0.3 +- Pinia 3.0.4 +- TypeScript 5.9.3 +- Vite 7.3.1 +- ESLint & Oxlint for code quality + +--- + +## Development + +### Start Development Server + +```bash +npm run dev +``` + +The development server will start at `http://localhost:5173` by default. + +### Available Scripts + +| Command | Description | +|---------|-------------| +| `npm run dev` | Start development server with hot reload | +| `npm run build` | Type-check and build for production | +| `npm run build-only` | Build without type checking | +| `npm run type-check` | Run TypeScript type checking | +| `npm run preview` | Preview production build locally | +| `npm run lint` | Run all linters (ESLint + Oxlint) | +| `npm run lint:eslint` | Run ESLint with auto-fix | +| `npm run lint:oxlint` | Run Oxlint with auto-fix | + +### Development Features + +- **Hot Module Replacement (HMR)**: Changes are reflected instantly +- **Vue DevTools**: Integrated via `vite-plugin-vue-devtools` +- **Path Aliases**: Use `@/` to reference `src/` directory +- **TypeScript Support**: Full type checking with `vue-tsc` + +--- + +## Building for Production + +### Production Build + +```bash +npm run build +``` + +This command: +1. Runs TypeScript type checking +2. Compiles and minifies the application +3. Outputs to `dist/` directory + +### Preview Production Build + +```bash +npm run preview +``` + +This serves the production build locally for testing before deployment. + +### Build Output Structure + +``` +dist/ +├── assets/ +│ ├── index-xxx.js +│ ├── index-xxx.css +│ └── ... +├── favicon.ico +├── index.html +└── logo.png +``` + +--- + +## Deployment + +### Static Hosting + +The `dist/` folder contains static files that can be deployed to any static hosting service. + +#### Option 1: Nginx + +```nginx +server { + listen 80; + server_name your-domain.com; + root /var/www/youwei-vue/dist; + index index.html; + + location / { + try_files $uri $uri/ /index.html; + } + + location /assets { + expires 1y; + add_header Cache-Control "public, immutable"; + } +} +``` + +#### Option 2: Apache + +```apache + + RewriteEngine On + RewriteBase / + RewriteRule ^index\.html$ - [L] + RewriteCond %{REQUEST_FILENAME} !-f + RewriteCond %{REQUEST_FILENAME} !-d + RewriteRule . /index.html [L] + +``` + +#### Option 3: Cloud Platforms + +- **Vercel**: Connect Git repository for automatic deployments +- **Netlify**: Drag and drop `dist/` folder or connect Git +- **AWS S3 + CloudFront**: Upload `dist/` contents to S3 bucket +- **GitHub Pages**: Use GitHub Actions for CI/CD + +### Docker Deployment + +Create a `Dockerfile`: + +```dockerfile +# Build stage +FROM node:20-alpine AS builder +WORKDIR /app +COPY package*.json ./ +RUN npm ci +COPY . . +RUN npm run build + +# Production stage +FROM nginx:alpine +COPY --from=builder /app/dist /usr/share/nginx/html +COPY nginx.conf /etc/nginx/conf.d/default.conf +EXPOSE 80 +CMD ["nginx", "-g", "daemon off;"] +``` + +Build and run: + +```bash +docker build -t youwei-vue . +docker run -p 80:80 youwei-vue +``` + +--- + +## Troubleshooting + +### Common Issues + +#### 1. Node Version Mismatch + +**Error**: `engines.node` incompatible + +**Solution**: +```bash +nvm install 20 +nvm use 20 +``` + +#### 2. Port Already in Use + +**Error**: `Port 5173 is already in use` + +**Solution**: +```bash +# Kill process on port 5173 +npx kill-port 5173 + +# Or use a different port +npm run dev -- --port 3000 +``` + +#### 3. TypeScript Errors + +**Error**: Type checking fails + +**Solution**: +```bash +# Run type check separately +npm run type-check + +# Check for missing types +npm install --save-dev @types/node +``` + +#### 4. Build Failures + +**Solution**: +```bash +# Clean and reinstall +rm -rf node_modules package-lock.json +npm install +npm run build +``` + +### Browser Compatibility + +- Chrome/Edge 88+ +- Firefox 78+ +- Safari 14+ + +For older browsers, consider adding polyfills to your Vite configuration. + +--- + +## Additional Resources + +- [Vue 3 Documentation](https://vuejs.org/) +- [Vite Documentation](https://vitejs.dev/) +- [TypeScript Documentation](https://www.typescriptlang.org/) +- [Pinia Documentation](https://pinia.vuejs.org/) + +--- + +## Support + +For issues and feature requests, please use the project's issue tracker. diff --git a/有维项目/youwei-vue/env.d.ts b/有维项目/youwei-vue/env.d.ts new file mode 100644 index 0000000..323c78a --- /dev/null +++ b/有维项目/youwei-vue/env.d.ts @@ -0,0 +1,7 @@ +/// + +declare module '*.vue' { + import type { DefineComponent } from 'vue' + const component: DefineComponent<{}, {}, any> + export default component +} diff --git a/有维项目/youwei-vue/eslint.config.ts b/有维项目/youwei-vue/eslint.config.ts new file mode 100644 index 0000000..0713270 --- /dev/null +++ b/有维项目/youwei-vue/eslint.config.ts @@ -0,0 +1,23 @@ +import { globalIgnores } from 'eslint/config' +import { defineConfigWithVueTs, vueTsConfigs } from '@vue/eslint-config-typescript' +import pluginVue from 'eslint-plugin-vue' +import pluginOxlint from 'eslint-plugin-oxlint' + +// To allow more languages other than `ts` in `.vue` files, uncomment the following lines: +// import { configureVueProject } from '@vue/eslint-config-typescript' +// configureVueProject({ scriptLangs: ['ts', 'tsx'] }) +// More info at https://github.com/vuejs/eslint-config-typescript/#advanced-setup + +export default defineConfigWithVueTs( + { + name: 'app/files-to-lint', + files: ['**/*.{vue,ts,mts,tsx}'], + }, + + globalIgnores(['**/dist/**', '**/dist-ssr/**', '**/coverage/**']), + + ...pluginVue.configs['flat/essential'], + vueTsConfigs.recommended, + + ...pluginOxlint.buildFromOxlintConfigFile('.oxlintrc.json'), +) diff --git a/有维项目/youwei-vue/index.html b/有维项目/youwei-vue/index.html new file mode 100644 index 0000000..6535975 --- /dev/null +++ b/有维项目/youwei-vue/index.html @@ -0,0 +1,33 @@ + + + + + + + 有维商学 - OPC创业者赋能平台 + + + +
+ + + diff --git a/有维项目/youwei-vue/package-lock.json b/有维项目/youwei-vue/package-lock.json new file mode 100644 index 0000000..69ba3f6 --- /dev/null +++ b/有维项目/youwei-vue/package-lock.json @@ -0,0 +1,5244 @@ +{ + "name": "youwei-vue", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "youwei-vue", + "version": "0.0.0", + "dependencies": { + "pinia": "^3.0.4", + "vue": "^3.5.29", + "vue-router": "^5.0.3" + }, + "devDependencies": { + "@tsconfig/node24": "^24.0.4", + "@types/node": "^24.11.0", + "@vitejs/plugin-vue": "^6.0.4", + "@vue/eslint-config-typescript": "^14.7.0", + "@vue/tsconfig": "^0.8.1", + "eslint": "^10.0.2", + "eslint-plugin-oxlint": "~1.50.0", + "eslint-plugin-vue": "~10.8.0", + "jiti": "^2.6.1", + "npm-run-all2": "^8.0.4", + "oxlint": "~1.50.0", + "typescript": "~5.9.3", + "vite": "^7.3.1", + "vite-plugin-vue-devtools": "^8.0.6", + "vue-tsc": "^3.2.5" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz", + "integrity": "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmmirror.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", + "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", + "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.2", + "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.2", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.29.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.29.0.tgz", + "integrity": "sha512-CVBVv3VY/XRMxRYq5dwr2DS7/MvqPm23cOCjbwNnVrfOqcWlnefua1uUs0sjdKOGjvPUG633o07uWzJq4oI6dA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/plugin-syntax-decorators": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.28.6.tgz", + "integrity": "sha512-71EYI0ONURHJBL4rSFXnITXqXrrY8q4P0q006DPfN+Rk+ASM+++IBXem/ruokgBZR8YNEWZ8R6B+rCb8VcUTqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", + "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz", + "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz", + "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.6.tgz", + "integrity": "sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.6", + "@babel/helper-plugin-utils": "^7.28.6", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.27.4.tgz", + "integrity": "sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.27.4.tgz", + "integrity": "sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.27.4.tgz", + "integrity": "sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.27.4.tgz", + "integrity": "sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.27.4.tgz", + "integrity": "sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.27.4.tgz", + "integrity": "sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.4.tgz", + "integrity": "sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.27.4.tgz", + "integrity": "sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.27.4.tgz", + "integrity": "sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.27.4.tgz", + "integrity": "sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.27.4.tgz", + "integrity": "sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.27.4.tgz", + "integrity": "sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.27.4.tgz", + "integrity": "sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.27.4.tgz", + "integrity": "sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.27.4.tgz", + "integrity": "sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.27.4.tgz", + "integrity": "sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.27.4.tgz", + "integrity": "sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.4.tgz", + "integrity": "sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.27.4.tgz", + "integrity": "sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.4.tgz", + "integrity": "sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.27.4.tgz", + "integrity": "sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.4.tgz", + "integrity": "sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.27.4.tgz", + "integrity": "sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.27.4.tgz", + "integrity": "sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.27.4.tgz", + "integrity": "sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.27.4.tgz", + "integrity": "sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmmirror.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmmirror.com/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.23.3", + "resolved": "https://registry.npmmirror.com/@eslint/config-array/-/config-array-0.23.3.tgz", + "integrity": "sha512-j+eEWmB6YYLwcNOdlwQ6L2OsptI/LO6lNBuLIqe5R7RetD658HLoF+Mn7LzYmAWWNNzdC6cqP+L6r8ujeYXWLw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^3.0.3", + "debug": "^4.3.1", + "minimatch": "^10.2.4" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.5.3", + "resolved": "https://registry.npmmirror.com/@eslint/config-helpers/-/config-helpers-0.5.3.tgz", + "integrity": "sha512-lzGN0onllOZCGroKJmRwY6QcEHxbjBw1gwB8SgRSqK8YbbtEXMvKynsXc3553ckIEBxsbMBU7oOZXKIPGZNeZw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.1.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/core": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/@eslint/core/-/core-1.1.1.tgz", + "integrity": "sha512-QUPblTtE51/7/Zhfv8BDwO0qkkzQL7P/aWWbqcf4xWLEYn1oKjdO0gglQBB4GAsu7u6wjijbCmzsUTy6mnk6oQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/object-schema": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/@eslint/object-schema/-/object-schema-3.0.3.tgz", + "integrity": "sha512-iM869Pugn9Nsxbh/YHRqYiqd23AmIbxJOcpUMOuWCVNdoQJ5ZtwL6h3t0bcZzJUlC3Dq9jCFCESBZnX0GTv7iQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/@eslint/plugin-kit/-/plugin-kit-0.6.1.tgz", + "integrity": "sha512-iH1B076HoAshH1mLpHMgwdGeTs0CYwL0SPMkGuSebZrwBp16v415e9NZXg2jtrqPVQjf6IANe2Vtlr5KswtcZQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.1.1", + "levn": "^0.4.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmmirror.com/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmmirror.com/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmmirror.com/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@oxlint/binding-android-arm-eabi": { + "version": "1.50.0", + "resolved": "https://registry.npmmirror.com/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.50.0.tgz", + "integrity": "sha512-G7MRGk/6NCe+L8ntonRdZP7IkBfEpiZ/he3buLK6JkLgMHgJShXZ+BeOwADmspXez7U7F7L1Anf4xLSkLHiGTg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-android-arm64": { + "version": "1.50.0", + "resolved": "https://registry.npmmirror.com/@oxlint/binding-android-arm64/-/binding-android-arm64-1.50.0.tgz", + "integrity": "sha512-GeSuMoJWCVpovJi/e3xDSNgjeR8WEZ6MCXL6EtPiCIM2NTzv7LbflARINTXTJy2oFBYyvdf/l2PwHzYo6EdXvg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-darwin-arm64": { + "version": "1.50.0", + "resolved": "https://registry.npmmirror.com/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.50.0.tgz", + "integrity": "sha512-w3SY5YtxGnxCHPJ8Twl3KmS9oja1gERYk3AMoZ7Hv8P43ZtB6HVfs02TxvarxfL214Tm3uzvc2vn+DhtUNeKnw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-darwin-x64": { + "version": "1.50.0", + "resolved": "https://registry.npmmirror.com/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.50.0.tgz", + "integrity": "sha512-hNfogDqy7tvmllXKBSlHo6k5x7dhTUVOHbMSE15CCAcXzmqf5883aPvBYPOq9AE7DpDUQUZ1kVE22YbiGW+tuw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-freebsd-x64": { + "version": "1.50.0", + "resolved": "https://registry.npmmirror.com/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.50.0.tgz", + "integrity": "sha512-ykZevOWEyu0nsxolA911ucxpEv0ahw8jfEeGWOwwb/VPoE4xoexuTOAiPNlWZNJqANlJl7yp8OyzCtXTUAxotw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm-gnueabihf": { + "version": "1.50.0", + "resolved": "https://registry.npmmirror.com/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.50.0.tgz", + "integrity": "sha512-hif3iDk7vo5GGJ4OLCCZAf2vjnU9FztGw4L0MbQL0M2iY9LKFtDMMiQAHmkF0PQGQMVbTYtPdXCLKVgdkiqWXQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm-musleabihf": { + "version": "1.50.0", + "resolved": "https://registry.npmmirror.com/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.50.0.tgz", + "integrity": "sha512-dVp9iSssiGAnTNey2Ruf6xUaQhdnvcFOJyRWd/mu5o2jVbFK15E5fbWGeFRfmuobu5QXuROtFga44+7DOS3PLg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm64-gnu": { + "version": "1.50.0", + "resolved": "https://registry.npmmirror.com/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.50.0.tgz", + "integrity": "sha512-1cT7yz2HA910CKA9NkH1ZJo50vTtmND2fkoW1oyiSb0j6WvNtJ0Wx2zoySfXWc/c+7HFoqRK5AbEoL41LOn9oA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-arm64-musl": { + "version": "1.50.0", + "resolved": "https://registry.npmmirror.com/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.50.0.tgz", + "integrity": "sha512-++B3k/HEPFVlj89cOz8kWfQccMZB/aWL9AhsW7jPIkG++63Mpwb2cE9XOEsd0PATbIan78k2Gky+09uWM1d/gQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-ppc64-gnu": { + "version": "1.50.0", + "resolved": "https://registry.npmmirror.com/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.50.0.tgz", + "integrity": "sha512-Z9b/KpFMkx66w3gVBqjIC1AJBTZAGoI9+U+K5L4QM0CB/G0JSNC1es9b3Y0Vcrlvtdn8A+IQTkYjd/Q0uCSaZw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-riscv64-gnu": { + "version": "1.50.0", + "resolved": "https://registry.npmmirror.com/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.50.0.tgz", + "integrity": "sha512-jvmuIw8wRSohsQlFNIST5uUwkEtEJmOQYr33bf/K2FrFPXHhM4KqGekI3ShYJemFS/gARVacQFgBzzJKCAyJjg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-riscv64-musl": { + "version": "1.50.0", + "resolved": "https://registry.npmmirror.com/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.50.0.tgz", + "integrity": "sha512-x+UrN47oYNh90nmAAyql8eQaaRpHbDPu5guasDg10+OpszUQ3/1+1J6zFMmV4xfIEgTcUXG/oI5fxJhF4eWCNA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-s390x-gnu": { + "version": "1.50.0", + "resolved": "https://registry.npmmirror.com/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.50.0.tgz", + "integrity": "sha512-i/JLi2ljLUIVfekMj4ISmdt+Hn11wzYUdRRrkVUYsCWw7zAy5xV7X9iA+KMyM156LTFympa7s3oKBjuCLoTAUQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-x64-gnu": { + "version": "1.50.0", + "resolved": "https://registry.npmmirror.com/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.50.0.tgz", + "integrity": "sha512-/C7brhn6c6UUPccgSPCcpLQXcp+xKIW/3sji/5VZ8/OItL3tQ2U7KalHz887UxxSQeEOmd1kY6lrpuwFnmNqOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-linux-x64-musl": { + "version": "1.50.0", + "resolved": "https://registry.npmmirror.com/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.50.0.tgz", + "integrity": "sha512-oDR1f+bGOYU8LfgtEW8XtotWGB63ghtcxk5Jm6IDTCk++rTA/IRMsjOid2iMd+1bW+nP9Mdsmcdc7VbPD3+iyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-openharmony-arm64": { + "version": "1.50.0", + "resolved": "https://registry.npmmirror.com/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.50.0.tgz", + "integrity": "sha512-4CmRGPp5UpvXyu4jjP9Tey/SrXDQLRvZXm4pb4vdZBxAzbFZkCyh0KyRy4txld/kZKTJlW4TO8N1JKrNEk+mWw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-win32-arm64-msvc": { + "version": "1.50.0", + "resolved": "https://registry.npmmirror.com/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.50.0.tgz", + "integrity": "sha512-Fq0M6vsGcFsSfeuWAACDhd5KJrO85ckbEfe1EGuBj+KPyJz7KeWte2fSFrFGmNKNXyhEMyx4tbgxiWRujBM2KQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-win32-ia32-msvc": { + "version": "1.50.0", + "resolved": "https://registry.npmmirror.com/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.50.0.tgz", + "integrity": "sha512-qTdWR9KwY/vxJGhHVIZG2eBOhidOQvOwzDxnX+jhW/zIVacal1nAhR8GLkiywW8BIFDkQKXo/zOfT+/DY+ns/w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@oxlint/binding-win32-x64-msvc": { + "version": "1.50.0", + "resolved": "https://registry.npmmirror.com/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.50.0.tgz", + "integrity": "sha512-682t7npLC4G2Ca+iNlI9fhAKTcFPYYXJjwoa88H4q+u5HHHlsnL/gHULapX3iqp+A8FIJbgdylL5KMYo2LaluQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmmirror.com/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.2", + "resolved": "https://registry.npmmirror.com/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.2.tgz", + "integrity": "sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.59.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", + "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", + "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", + "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", + "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", + "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", + "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", + "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", + "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", + "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", + "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", + "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", + "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", + "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", + "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", + "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", + "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", + "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", + "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", + "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", + "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", + "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", + "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", + "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", + "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@tsconfig/node24": { + "version": "24.0.4", + "resolved": "https://registry.npmmirror.com/@tsconfig/node24/-/node24-24.0.4.tgz", + "integrity": "sha512-2A933l5P5oCbv6qSxHs7ckKwobs8BDAe9SJ/Xr2Hy+nDlwmLE1GhFh/g/vXGRZWgxBg9nX/5piDtHR9Dkw/XuA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.12.0", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-24.12.0.tgz", + "integrity": "sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.57.1", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.57.1.tgz", + "integrity": "sha512-Gn3aqnvNl4NGc6x3/Bqk1AOn0thyTU9bqDRhiRnUWezgvr2OnhYCWCgC8zXXRVqBsIL1pSDt7T9nJUe0oM0kDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.57.1", + "@typescript-eslint/type-utils": "8.57.1", + "@typescript-eslint/utils": "8.57.1", + "@typescript-eslint/visitor-keys": "8.57.1", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.57.1", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmmirror.com/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.57.1", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-8.57.1.tgz", + "integrity": "sha512-k4eNDan0EIMTT/dUKc/g+rsJ6wcHYhNPdY19VoX/EOtaAG8DLtKCykhrUnuHPYvinn5jhAPgD2Qw9hXBwrahsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.57.1", + "@typescript-eslint/types": "8.57.1", + "@typescript-eslint/typescript-estree": "8.57.1", + "@typescript-eslint/visitor-keys": "8.57.1", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.57.1", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/project-service/-/project-service-8.57.1.tgz", + "integrity": "sha512-vx1F37BRO1OftsYlmG9xay1TqnjNVlqALymwWVuYTdo18XuKxtBpCj1QlzNIEHlvlB27osvXFWptYiEWsVdYsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.57.1", + "@typescript-eslint/types": "^8.57.1", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.57.1", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-8.57.1.tgz", + "integrity": "sha512-hs/QcpCwlwT2L5S+3fT6gp0PabyGk4Q0Rv2doJXA0435/OpnSR3VRgvrp8Xdoc3UAYSg9cyUjTeFXZEPg/3OKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.57.1", + "@typescript-eslint/visitor-keys": "8.57.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.57.1", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.57.1.tgz", + "integrity": "sha512-0lgOZB8cl19fHO4eI46YUx2EceQqhgkPSuCGLlGi79L2jwYY1cxeYc1Nae8Aw1xjgW3PKVDLlr3YJ6Bxx8HkWg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.57.1", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-8.57.1.tgz", + "integrity": "sha512-+Bwwm0ScukFdyoJsh2u6pp4S9ktegF98pYUU0hkphOOqdMB+1sNQhIz8y5E9+4pOioZijrkfNO/HUJVAFFfPKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.57.1", + "@typescript-eslint/typescript-estree": "8.57.1", + "@typescript-eslint/utils": "8.57.1", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.57.1", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/types/-/types-8.57.1.tgz", + "integrity": "sha512-S29BOBPJSFUiblEl6RzPPjJt6w25A6XsBqRVDt53tA/tlL8q7ceQNZHTjPeONt/3S7KRI4quk+yP9jK2WjBiPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.57.1", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.57.1.tgz", + "integrity": "sha512-ybe2hS9G6pXpqGtPli9Gx9quNV0TWLOmh58ADlmZe9DguLq0tiAKVjirSbtM1szG6+QH6rVXyU6GTLQbWnMY+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.57.1", + "@typescript-eslint/tsconfig-utils": "8.57.1", + "@typescript-eslint/types": "8.57.1", + "@typescript-eslint/visitor-keys": "8.57.1", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.57.1", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-8.57.1.tgz", + "integrity": "sha512-XUNSJ/lEVFttPMMoDVA2r2bwrl8/oPx8cURtczkSEswY5T3AeLmCy+EKWQNdL4u0MmAHOjcWrqJp2cdvgjn8dQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.57.1", + "@typescript-eslint/types": "8.57.1", + "@typescript-eslint/typescript-estree": "8.57.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.57.1", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.57.1.tgz", + "integrity": "sha512-YWnmJkXbofiz9KbnbbwuA2rpGkFPLbAIetcCNO6mJ8gdhdZ/v7WDXsoGFAJuM6ikUFKTlSQnjWnVO4ux+UzS6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.57.1", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@vitejs/plugin-vue": { + "version": "6.0.5", + "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-6.0.5.tgz", + "integrity": "sha512-bL3AxKuQySfk1iGcBsQnoRVexTPJq0Z/ixFVM8OhVJAP6ZXXXLtM7NFKWhLl30Kg7uTBqIaPXbh+nuQCuBDedg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "1.0.0-rc.2" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.28", + "resolved": "https://registry.npmmirror.com/@volar/language-core/-/language-core-2.4.28.tgz", + "integrity": "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.28" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.28", + "resolved": "https://registry.npmmirror.com/@volar/source-map/-/source-map-2.4.28.tgz", + "integrity": "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@volar/typescript": { + "version": "2.4.28", + "resolved": "https://registry.npmmirror.com/@volar/typescript/-/typescript-2.4.28.tgz", + "integrity": "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.28", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vue-macros/common": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/@vue-macros/common/-/common-3.1.2.tgz", + "integrity": "sha512-h9t4ArDdniO9ekYHAD95t9AZcAbb19lEGK+26iAjUODOIJKmObDNBSe4+6ELQAA3vtYiFPPBtHh7+cQCKi3Dng==", + "license": "MIT", + "dependencies": { + "@vue/compiler-sfc": "^3.5.22", + "ast-kit": "^2.1.2", + "local-pkg": "^1.1.2", + "magic-string-ast": "^1.0.2", + "unplugin-utils": "^0.3.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/vue-macros" + }, + "peerDependencies": { + "vue": "^2.7.0 || ^3.2.25" + }, + "peerDependenciesMeta": { + "vue": { + "optional": true + } + } + }, + "node_modules/@vue/babel-helper-vue-transform-on": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.5.0.tgz", + "integrity": "sha512-0dAYkerNhhHutHZ34JtTl2czVQHUNWv6xEbkdF5W+Yrv5pCWsqjeORdOgbtW2I9gWlt+wBmVn+ttqN9ZxR5tzA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/babel-plugin-jsx": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.5.0.tgz", + "integrity": "sha512-mneBhw1oOqCd2247O0Yw/mRwC9jIGACAJUlawkmMBiNmL4dGA2eMzuNZVNqOUfYTa6vqmND4CtOPzmEEEqLKFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.0", + "@babel/types": "^7.28.2", + "@vue/babel-helper-vue-transform-on": "1.5.0", + "@vue/babel-plugin-resolve-type": "1.5.0", + "@vue/shared": "^3.5.18" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + } + } + }, + "node_modules/@vue/babel-plugin-resolve-type": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.5.0.tgz", + "integrity": "sha512-Wm/60o+53JwJODm4Knz47dxJnLDJ9FnKnGZJbUUf8nQRAtt6P+undLUAVU3Ha33LxOJe6IPoifRQ6F/0RrU31w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/parser": "^7.28.0", + "@vue/compiler-sfc": "^3.5.18" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.30", + "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.30.tgz", + "integrity": "sha512-s3DfdZkcu/qExZ+td75015ljzHc6vE+30cFMGRPROYjqkroYI5NV2X1yAMX9UeyBNWB9MxCfPcsjpLS11nzkkw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@vue/shared": "3.5.30", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.30", + "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.30.tgz", + "integrity": "sha512-eCFYESUEVYHhiMuK4SQTldO3RYxyMR/UQL4KdGD1Yrkfdx4m/HYuZ9jSfPdA+nWJY34VWndiYdW/wZXyiPEB9g==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.30", + "@vue/shared": "3.5.30" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.30", + "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.30.tgz", + "integrity": "sha512-LqmFPDn89dtU9vI3wHJnwaV6GfTRD87AjWpTWpyrdVOObVtjIuSeZr181z5C4PmVx/V3j2p+0f7edFKGRMpQ5A==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@vue/compiler-core": "3.5.30", + "@vue/compiler-dom": "3.5.30", + "@vue/compiler-ssr": "3.5.30", + "@vue/shared": "3.5.30", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.8", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.30", + "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.30.tgz", + "integrity": "sha512-NsYK6OMTnx109PSL2IAyf62JP6EUdk4Dmj6AkWcJGBvN0dQoMYtVekAmdqgTtWQgEJo+Okstbf/1p7qZr5H+bA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.30", + "@vue/shared": "3.5.30" + } + }, + "node_modules/@vue/devtools-api": { + "version": "7.7.9", + "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-7.7.9.tgz", + "integrity": "sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g==", + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^7.7.9" + } + }, + "node_modules/@vue/devtools-core": { + "version": "8.1.0", + "resolved": "https://registry.npmmirror.com/@vue/devtools-core/-/devtools-core-8.1.0.tgz", + "integrity": "sha512-LvD1VgDpoHmYL00IgKRLKktF6SsPAb0yaV8wB8q2jRwsAWvqhS8+vsMLEGKNs7uoKyymXhT92dhxgf/wir6YGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^8.1.0", + "@vue/devtools-shared": "^8.1.0" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/@vue/devtools-core/node_modules/@vue/devtools-kit": { + "version": "8.1.0", + "resolved": "https://registry.npmmirror.com/@vue/devtools-kit/-/devtools-kit-8.1.0.tgz", + "integrity": "sha512-/NZlS4WtGIB54DA/z10gzk+n/V7zaqSzYZOVlg2CfdnpIKdB61bd7JDIMxf/zrtX41zod8E2/bbEBoW/d7x70Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^8.1.0", + "birpc": "^2.6.1", + "hookable": "^5.5.3", + "perfect-debounce": "^2.0.0" + } + }, + "node_modules/@vue/devtools-core/node_modules/@vue/devtools-shared": { + "version": "8.1.0", + "resolved": "https://registry.npmmirror.com/@vue/devtools-shared/-/devtools-shared-8.1.0.tgz", + "integrity": "sha512-h8uCb4Qs8UT8VdTT5yjY6tOJ//qH7EpxToixR0xqejR55t5OdISIg7AJ7eBkhBs8iu1qG5gY3QQNN1DF1EelAA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/devtools-core/node_modules/perfect-debounce": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/perfect-debounce/-/perfect-debounce-2.1.0.tgz", + "integrity": "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/devtools-kit": { + "version": "7.7.9", + "resolved": "https://registry.npmmirror.com/@vue/devtools-kit/-/devtools-kit-7.7.9.tgz", + "integrity": "sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA==", + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^7.7.9", + "birpc": "^2.3.0", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.2" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.7.9", + "resolved": "https://registry.npmmirror.com/@vue/devtools-shared/-/devtools-shared-7.7.9.tgz", + "integrity": "sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA==", + "license": "MIT", + "dependencies": { + "rfdc": "^1.4.1" + } + }, + "node_modules/@vue/eslint-config-typescript": { + "version": "14.7.0", + "resolved": "https://registry.npmmirror.com/@vue/eslint-config-typescript/-/eslint-config-typescript-14.7.0.tgz", + "integrity": "sha512-iegbMINVc+seZ/QxtzWiOBozctrHiF2WvGedruu2EbLujg9VuU0FQiNcN2z1ycuaoKKpF4m2qzB5HDEMKbxtIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^8.56.0", + "fast-glob": "^3.3.3", + "typescript-eslint": "^8.56.0", + "vue-eslint-parser": "^10.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": "^9.10.0 || ^10.0.0", + "eslint-plugin-vue": "^9.28.0 || ^10.0.0", + "typescript": ">=4.8.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/language-core": { + "version": "3.2.6", + "resolved": "https://registry.npmmirror.com/@vue/language-core/-/language-core-3.2.6.tgz", + "integrity": "sha512-xYYYX3/aVup576tP/23sEUpgiEnujrENaoNRbaozC1/MA9I6EGFQRJb4xrt/MmUCAGlxTKL2RmT8JLTPqagCkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.28", + "@vue/compiler-dom": "^3.5.0", + "@vue/shared": "^3.5.0", + "alien-signals": "^3.0.0", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1", + "picomatch": "^4.0.2" + } + }, + "node_modules/@vue/language-core/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.30", + "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.30.tgz", + "integrity": "sha512-179YNgKATuwj9gB+66snskRDOitDiuOZqkYia7mHKJaidOMo/WJxHKF8DuGc4V4XbYTJANlfEKb0yxTQotnx4Q==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.30" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.30", + "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.30.tgz", + "integrity": "sha512-e0Z+8PQsUTdwV8TtEsLzUM7SzC7lQwYKePydb7K2ZnmS6jjND+WJXkmmfh/swYzRyfP1EY3fpdesyYoymCzYfg==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.30", + "@vue/shared": "3.5.30" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.30", + "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.30.tgz", + "integrity": "sha512-2UIGakjU4WSQ0T4iwDEW0W7vQj6n7AFn7taqZ9Cvm0Q/RA2FFOziLESrDL4GmtI1wV3jXg5nMoJSYO66egDUBw==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.30", + "@vue/runtime-core": "3.5.30", + "@vue/shared": "3.5.30", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.30", + "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.30.tgz", + "integrity": "sha512-v+R34icapydRwbZRD0sXwtHqrQJv38JuMB4JxbOxd8NEpGLny7cncMp53W9UH/zo4j8eDHjQ1dEJXwzFQknjtQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.30", + "@vue/shared": "3.5.30" + }, + "peerDependencies": { + "vue": "3.5.30" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.30", + "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.30.tgz", + "integrity": "sha512-YXgQ7JjaO18NeK2K9VTbDHaFy62WrObMa6XERNfNOkAhD1F1oDSf3ZJ7K6GqabZ0BvSDHajp8qfS5Sa2I9n8uQ==", + "license": "MIT" + }, + "node_modules/@vue/tsconfig": { + "version": "0.8.1", + "resolved": "https://registry.npmmirror.com/@vue/tsconfig/-/tsconfig-0.8.1.tgz", + "integrity": "sha512-aK7feIWPXFSUhsCP9PFqPyFOcz4ENkb8hZ2pneL6m2UjCkccvaOhC/5KCKluuBufvp2KzkbdA2W2pk20vLzu3g==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "typescript": "5.x", + "vue": "^3.4.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "vue": { + "optional": true + } + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.14.0", + "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/alien-signals": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/alien-signals/-/alien-signals-3.1.2.tgz", + "integrity": "sha512-d9dYqZTS90WLiU0I5c6DHj/HcKkF8ZyGN3G5x8wSbslulz70KOxaqCT0hQCo9KOyhVqzqGojvNdJXoTumZOtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansis": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/ansis/-/ansis-4.2.0.tgz", + "integrity": "sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + } + }, + "node_modules/ast-kit": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/ast-kit/-/ast-kit-2.2.0.tgz", + "integrity": "sha512-m1Q/RaVOnTp9JxPX+F+Zn7IcLYMzM8kZofDImfsKZd8MbR+ikdOzTeztStWqfrqIxZnYWryyI9ePm3NGjnZgGw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "pathe": "^2.0.3" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/ast-walker-scope": { + "version": "0.8.3", + "resolved": "https://registry.npmmirror.com/ast-walker-scope/-/ast-walker-scope-0.8.3.tgz", + "integrity": "sha512-cbdCP0PGOBq0ASG+sjnKIoYkWMKhhz+F/h9pRexUdX2Hd38+WOlBkRKlqkGOSm0YQpcFMQBJeK4WspUAkwsEdg==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.4", + "ast-kit": "^2.1.3" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.8", + "resolved": "https://registry.npmmirror.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.8.tgz", + "integrity": "sha512-PCLz/LXGBsNTErbtB6i5u4eLpHeMfi93aUv5duMmj6caNu6IphS4q6UevDnL36sZQv9lrP11dbPKGMaXPwMKfQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/birpc": { + "version": "2.9.0", + "resolved": "https://registry.npmmirror.com/birpc/-/birpc-2.9.0.tgz", + "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "5.0.4", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.1", + "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.28.1.tgz", + "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001780", + "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001780.tgz", + "integrity": "sha512-llngX0E7nQci5BPJDqoZSbuZ5Bcs9F5db7EtgfwBerX9XGtkkiO4NwfDDIRzHTTwcYC8vC7bmeUEPGrKlR/TkQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "license": "MIT", + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/confbox": { + "version": "0.2.4", + "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.2.4.tgz", + "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/copy-anything": { + "version": "4.0.5", + "resolved": "https://registry.npmmirror.com/copy-anything/-/copy-anything-4.0.5.tgz", + "integrity": "sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==", + "license": "MIT", + "dependencies": { + "is-what": "^5.2.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/default-browser": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/default-browser/-/default-browser-5.5.0.tgz", + "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.321", + "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.321.tgz", + "integrity": "sha512-L2C7Q279W2D/J4PLZLk7sebOILDSWos7bMsMNN06rK482umHUrh/3lM8G7IlHFOYip2oAg5nha1rCMxr/rs6ZQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-stack-parser-es": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/error-stack-parser-es/-/error-stack-parser-es-1.0.5.tgz", + "integrity": "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/esbuild": { + "version": "0.27.4", + "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.27.4.tgz", + "integrity": "sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.4", + "@esbuild/android-arm": "0.27.4", + "@esbuild/android-arm64": "0.27.4", + "@esbuild/android-x64": "0.27.4", + "@esbuild/darwin-arm64": "0.27.4", + "@esbuild/darwin-x64": "0.27.4", + "@esbuild/freebsd-arm64": "0.27.4", + "@esbuild/freebsd-x64": "0.27.4", + "@esbuild/linux-arm": "0.27.4", + "@esbuild/linux-arm64": "0.27.4", + "@esbuild/linux-ia32": "0.27.4", + "@esbuild/linux-loong64": "0.27.4", + "@esbuild/linux-mips64el": "0.27.4", + "@esbuild/linux-ppc64": "0.27.4", + "@esbuild/linux-riscv64": "0.27.4", + "@esbuild/linux-s390x": "0.27.4", + "@esbuild/linux-x64": "0.27.4", + "@esbuild/netbsd-arm64": "0.27.4", + "@esbuild/netbsd-x64": "0.27.4", + "@esbuild/openbsd-arm64": "0.27.4", + "@esbuild/openbsd-x64": "0.27.4", + "@esbuild/openharmony-arm64": "0.27.4", + "@esbuild/sunos-x64": "0.27.4", + "@esbuild/win32-arm64": "0.27.4", + "@esbuild/win32-ia32": "0.27.4", + "@esbuild/win32-x64": "0.27.4" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "10.0.3", + "resolved": "https://registry.npmmirror.com/eslint/-/eslint-10.0.3.tgz", + "integrity": "sha512-COV33RzXZkqhG9P2rZCFl9ZmJ7WL+gQSCRzE7RhkbclbQPtLAWReL7ysA0Sh4c8Im2U9ynybdR56PV0XcKvqaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.3", + "@eslint/config-helpers": "^0.5.2", + "@eslint/core": "^1.1.1", + "@eslint/plugin-kit": "^0.6.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.1.1", + "esquery": "^1.7.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "minimatch": "^10.2.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-oxlint": { + "version": "1.50.0", + "resolved": "https://registry.npmmirror.com/eslint-plugin-oxlint/-/eslint-plugin-oxlint-1.50.0.tgz", + "integrity": "sha512-QAxeFeUHuekmLkuRLdzHH8Z0JvC7482OaQ3jlUMdEd0gcS6m+MYHei3Favoew9DdvTQT7yHxrm7BL0iXoenb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "jsonc-parser": "^3.3.1" + } + }, + "node_modules/eslint-plugin-vue": { + "version": "10.8.0", + "resolved": "https://registry.npmmirror.com/eslint-plugin-vue/-/eslint-plugin-vue-10.8.0.tgz", + "integrity": "sha512-f1J/tcbnrpgC8suPN5AtdJ5MQjuXbSU9pGRSSYAuF3SHoiYCOdEX6O22pLaRyLHXvDcOe+O5ENgc1owQ587agA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.1.1", + "postcss-selector-parser": "^7.1.0", + "semver": "^7.6.3", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "@stylistic/eslint-plugin": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0", + "@typescript-eslint/parser": "^7.0.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "vue-eslint-parser": "^10.0.0" + }, + "peerDependenciesMeta": { + "@stylistic/eslint-plugin": { + "optional": true + }, + "@typescript-eslint/parser": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "9.1.2", + "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "11.2.0", + "resolved": "https://registry.npmmirror.com/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.16.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^5.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmmirror.com/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/exsolve": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/exsolve/-/exsolve-1.0.8.tgz", + "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmmirror.com/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmmirror.com/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "license": "MIT" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-what": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/is-what/-/is-what-5.5.0.tgz", + "integrity": "sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/is-wsl": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/is-wsl/-/is-wsl-3.1.1.tgz", + "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmmirror.com/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-4.0.0.tgz", + "integrity": "sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmmirror.com/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/local-pkg": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-1.1.2.tgz", + "integrity": "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==", + "license": "MIT", + "dependencies": { + "mlly": "^1.7.4", + "pkg-types": "^2.3.0", + "quansync": "^0.2.11" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magic-string-ast": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/magic-string-ast/-/magic-string-ast-1.0.2.tgz", + "integrity": "sha512-8ngQgLhcT0t3YBdn9CGkZqCYlvwW9pm7aWJwd7AxseVWf1RU8ZHCQvG1mt3N5vvUme+pXTcHB8G/7fE666U8Vw==", + "license": "MIT", + "dependencies": { + "magic-string": "^0.30.17" + }, + "engines": { + "node": ">=20.18.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmmirror.com/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "license": "MIT" + }, + "node_modules/mlly": { + "version": "1.8.1", + "resolved": "https://registry.npmmirror.com/mlly/-/mlly-1.8.1.tgz", + "integrity": "sha512-SnL6sNutTwRWWR/vcmCYHSADjiEesp5TGQQ0pXyLhW5IoeibRlF/CbSLailbB3CNqJUk9cVJ9dUDnbD7GrcHBQ==", + "license": "MIT", + "dependencies": { + "acorn": "^8.16.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.3" + } + }, + "node_modules/mlly/node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmmirror.com/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "license": "MIT" + }, + "node_modules/mlly/node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.36", + "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.36.tgz", + "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/npm-normalize-package-bin": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/npm-normalize-package-bin/-/npm-normalize-package-bin-4.0.0.tgz", + "integrity": "sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-run-all2": { + "version": "8.0.4", + "resolved": "https://registry.npmmirror.com/npm-run-all2/-/npm-run-all2-8.0.4.tgz", + "integrity": "sha512-wdbB5My48XKp2ZfJUlhnLVihzeuA1hgBnqB2J9ahV77wLS+/YAJAlN8I+X3DIFIPZ3m5L7nplmlbhNiFDmXRDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "cross-spawn": "^7.0.6", + "memorystream": "^0.3.1", + "picomatch": "^4.0.2", + "pidtree": "^0.6.0", + "read-package-json-fast": "^4.0.0", + "shell-quote": "^1.7.3", + "which": "^5.0.0" + }, + "bin": { + "npm-run-all": "bin/npm-run-all/index.js", + "npm-run-all2": "bin/npm-run-all/index.js", + "run-p": "bin/run-p/index.js", + "run-s": "bin/run-s/index.js" + }, + "engines": { + "node": "^20.5.0 || >=22.0.0", + "npm": ">= 10" + } + }, + "node_modules/npm-run-all2/node_modules/isexe": { + "version": "3.1.5", + "resolved": "https://registry.npmmirror.com/isexe/-/isexe-3.1.5.tgz", + "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/npm-run-all2/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/npm-run-all2/node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/ohash": { + "version": "2.0.11", + "resolved": "https://registry.npmmirror.com/ohash/-/ohash-2.0.11.tgz", + "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/open": { + "version": "10.2.0", + "resolved": "https://registry.npmmirror.com/open/-/open-10.2.0.tgz", + "integrity": "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "wsl-utils": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/oxlint": { + "version": "1.50.0", + "resolved": "https://registry.npmmirror.com/oxlint/-/oxlint-1.50.0.tgz", + "integrity": "sha512-iSJ4IZEICBma8cZX7kxIIz9PzsYLF2FaLAYN6RKu7VwRVKdu7RIgpP99bTZaGl//Yao7fsaGZLSEo5xBrI5ReQ==", + "dev": true, + "license": "MIT", + "bin": { + "oxlint": "bin/oxlint" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/Boshen" + }, + "optionalDependencies": { + "@oxlint/binding-android-arm-eabi": "1.50.0", + "@oxlint/binding-android-arm64": "1.50.0", + "@oxlint/binding-darwin-arm64": "1.50.0", + "@oxlint/binding-darwin-x64": "1.50.0", + "@oxlint/binding-freebsd-x64": "1.50.0", + "@oxlint/binding-linux-arm-gnueabihf": "1.50.0", + "@oxlint/binding-linux-arm-musleabihf": "1.50.0", + "@oxlint/binding-linux-arm64-gnu": "1.50.0", + "@oxlint/binding-linux-arm64-musl": "1.50.0", + "@oxlint/binding-linux-ppc64-gnu": "1.50.0", + "@oxlint/binding-linux-riscv64-gnu": "1.50.0", + "@oxlint/binding-linux-riscv64-musl": "1.50.0", + "@oxlint/binding-linux-s390x-gnu": "1.50.0", + "@oxlint/binding-linux-x64-gnu": "1.50.0", + "@oxlint/binding-linux-x64-musl": "1.50.0", + "@oxlint/binding-openharmony-arm64": "1.50.0", + "@oxlint/binding-win32-arm64-msvc": "1.50.0", + "@oxlint/binding-win32-ia32-msvc": "1.50.0", + "@oxlint/binding-win32-x64-msvc": "1.50.0" + }, + "peerDependencies": { + "oxlint-tsgolint": ">=0.14.1" + }, + "peerDependenciesMeta": { + "oxlint-tsgolint": { + "optional": true + } + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "license": "MIT" + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmmirror.com/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "dev": true, + "license": "MIT", + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pinia": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/pinia/-/pinia-3.0.4.tgz", + "integrity": "sha512-l7pqLUFTI/+ESXn6k3nu30ZIzW5E2WZF/LaHJEpoq6ElcLD+wduZoB2kBN19du6K/4FDpPMazY2wJr+IndBtQw==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^7.7.7" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "typescript": ">=4.5.0", + "vue": "^3.5.11" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/pkg-types": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-2.3.0.tgz", + "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", + "license": "MIT", + "dependencies": { + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" + } + }, + "node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/quansync": { + "version": "0.2.11", + "resolved": "https://registry.npmmirror.com/quansync/-/quansync-0.2.11.tgz", + "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/read-package-json-fast": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/read-package-json-fast/-/read-package-json-fast-4.0.0.tgz", + "integrity": "sha512-qpt8EwugBWDw2cgE2W+/3oxC+KTez2uSVR8JU9Q36TXPAGCaozfQUs59v4j4GFpWTaw0i6hAZSvOmu1J0uOEUg==", + "dev": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^4.0.0", + "npm-normalize-package-bin": "^4.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "license": "MIT" + }, + "node_modules/rollup": { + "version": "4.59.0", + "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.59.0.tgz", + "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.59.0", + "@rollup/rollup-android-arm64": "4.59.0", + "@rollup/rollup-darwin-arm64": "4.59.0", + "@rollup/rollup-darwin-x64": "4.59.0", + "@rollup/rollup-freebsd-arm64": "4.59.0", + "@rollup/rollup-freebsd-x64": "4.59.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", + "@rollup/rollup-linux-arm-musleabihf": "4.59.0", + "@rollup/rollup-linux-arm64-gnu": "4.59.0", + "@rollup/rollup-linux-arm64-musl": "4.59.0", + "@rollup/rollup-linux-loong64-gnu": "4.59.0", + "@rollup/rollup-linux-loong64-musl": "4.59.0", + "@rollup/rollup-linux-ppc64-gnu": "4.59.0", + "@rollup/rollup-linux-ppc64-musl": "4.59.0", + "@rollup/rollup-linux-riscv64-gnu": "4.59.0", + "@rollup/rollup-linux-riscv64-musl": "4.59.0", + "@rollup/rollup-linux-s390x-gnu": "4.59.0", + "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@rollup/rollup-linux-x64-musl": "4.59.0", + "@rollup/rollup-openbsd-x64": "4.59.0", + "@rollup/rollup-openharmony-arm64": "4.59.0", + "@rollup/rollup-win32-arm64-msvc": "4.59.0", + "@rollup/rollup-win32-ia32-msvc": "4.59.0", + "@rollup/rollup-win32-x64-gnu": "4.59.0", + "@rollup/rollup-win32-x64-msvc": "4.59.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-applescript": { + "version": "7.1.0", + "resolved": "https://registry.npmmirror.com/run-applescript/-/run-applescript-7.1.0.tgz", + "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/scule": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/scule/-/scule-1.3.0.tgz", + "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmmirror.com/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sirv": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/sirv/-/sirv-3.0.2.tgz", + "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmmirror.com/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/superjson": { + "version": "2.2.6", + "resolved": "https://registry.npmmirror.com/superjson/-/superjson-2.2.6.tgz", + "integrity": "sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==", + "license": "MIT", + "dependencies": { + "copy-anything": "^4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmmirror.com/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ts-api-utils": { + "version": "2.4.0", + "resolved": "https://registry.npmmirror.com/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmmirror.com/typescript-eslint/-/typescript-eslint-8.57.1.tgz", + "integrity": "sha512-fLvZWf+cAGw3tqMCYzGIU6yR8K+Y9NT2z23RwOjlNFF2HwSB3KhdEFI5lSBv8tNmFkkBShSjsCjzx1vahZfISA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.57.1", + "@typescript-eslint/parser": "8.57.1", + "@typescript-eslint/typescript-estree": "8.57.1", + "@typescript-eslint/utils": "8.57.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/ufo": { + "version": "1.6.3", + "resolved": "https://registry.npmmirror.com/ufo/-/ufo-1.6.3.tgz", + "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" + }, + "node_modules/unplugin": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/unplugin/-/unplugin-3.0.0.tgz", + "integrity": "sha512-0Mqk3AT2TZCXWKdcoaufeXNukv2mTrEZExeXlHIOZXdqYoHHr4n51pymnwV8x2BOVxwXbK2HLlI7usrqMpycdg==", + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "picomatch": "^4.0.3", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/unplugin-utils": { + "version": "0.3.1", + "resolved": "https://registry.npmmirror.com/unplugin-utils/-/unplugin-utils-0.3.1.tgz", + "integrity": "sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==", + "license": "MIT", + "dependencies": { + "pathe": "^2.0.3", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/unplugin-utils/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/unplugin/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "7.3.1", + "resolved": "https://registry.npmmirror.com/vite/-/vite-7.3.1.tgz", + "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-dev-rpc": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/vite-dev-rpc/-/vite-dev-rpc-1.1.0.tgz", + "integrity": "sha512-pKXZlgoXGoE8sEKiKJSng4hI1sQ4wi5YT24FCrwrLt6opmkjlqPPVmiPWWJn8M8byMxRGzp1CrFuqQs4M/Z39A==", + "dev": true, + "license": "MIT", + "dependencies": { + "birpc": "^2.4.0", + "vite-hot-client": "^2.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.1 || ^7.0.0-0" + } + }, + "node_modules/vite-hot-client": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/vite-hot-client/-/vite-hot-client-2.1.0.tgz", + "integrity": "sha512-7SpgZmU7R+dDnSmvXE1mfDtnHLHQSisdySVR7lO8ceAXvM0otZeuQQ6C8LrS5d/aYyP/QZ0hI0L+dIPrm4YlFQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0" + } + }, + "node_modules/vite-plugin-inspect": { + "version": "11.3.3", + "resolved": "https://registry.npmmirror.com/vite-plugin-inspect/-/vite-plugin-inspect-11.3.3.tgz", + "integrity": "sha512-u2eV5La99oHoYPHE6UvbwgEqKKOQGz86wMg40CCosP6q8BkB6e5xPneZfYagK4ojPJSj5anHCrnvC20DpwVdRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansis": "^4.1.0", + "debug": "^4.4.1", + "error-stack-parser-es": "^1.0.5", + "ohash": "^2.0.11", + "open": "^10.2.0", + "perfect-debounce": "^2.0.0", + "sirv": "^3.0.1", + "unplugin-utils": "^0.3.0", + "vite-dev-rpc": "^1.1.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + } + } + }, + "node_modules/vite-plugin-inspect/node_modules/perfect-debounce": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/perfect-debounce/-/perfect-debounce-2.1.0.tgz", + "integrity": "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite-plugin-vue-devtools": { + "version": "8.1.0", + "resolved": "https://registry.npmmirror.com/vite-plugin-vue-devtools/-/vite-plugin-vue-devtools-8.1.0.tgz", + "integrity": "sha512-4AvNRePfni3+PqOunACmAImC6SJVpUv6f7/g4oakyre9hYdEMrvDYlNmTZQsJPzVLMcGzn1FvSEqJ/n4HQ9cDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-core": "^8.1.0", + "@vue/devtools-kit": "^8.1.0", + "@vue/devtools-shared": "^8.1.0", + "sirv": "^3.0.2", + "vite-plugin-inspect": "^11.3.3", + "vite-plugin-vue-inspector": "^5.3.2" + }, + "engines": { + "node": ">=v14.21.3" + }, + "peerDependencies": { + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/vite-plugin-vue-devtools/node_modules/@vue/devtools-kit": { + "version": "8.1.0", + "resolved": "https://registry.npmmirror.com/@vue/devtools-kit/-/devtools-kit-8.1.0.tgz", + "integrity": "sha512-/NZlS4WtGIB54DA/z10gzk+n/V7zaqSzYZOVlg2CfdnpIKdB61bd7JDIMxf/zrtX41zod8E2/bbEBoW/d7x70Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^8.1.0", + "birpc": "^2.6.1", + "hookable": "^5.5.3", + "perfect-debounce": "^2.0.0" + } + }, + "node_modules/vite-plugin-vue-devtools/node_modules/@vue/devtools-shared": { + "version": "8.1.0", + "resolved": "https://registry.npmmirror.com/@vue/devtools-shared/-/devtools-shared-8.1.0.tgz", + "integrity": "sha512-h8uCb4Qs8UT8VdTT5yjY6tOJ//qH7EpxToixR0xqejR55t5OdISIg7AJ7eBkhBs8iu1qG5gY3QQNN1DF1EelAA==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite-plugin-vue-devtools/node_modules/perfect-debounce": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/perfect-debounce/-/perfect-debounce-2.1.0.tgz", + "integrity": "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite-plugin-vue-inspector": { + "version": "5.4.0", + "resolved": "https://registry.npmmirror.com/vite-plugin-vue-inspector/-/vite-plugin-vue-inspector-5.4.0.tgz", + "integrity": "sha512-Iq/024CydcE46FZqWPU4t4lw4uYOdLnFSO1RNxJVt2qY9zxIjmnkBqhHnYaReWM82kmNnaXs7OkfgRrV2GEjyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.23.0", + "@babel/plugin-proposal-decorators": "^7.23.0", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-transform-typescript": "^7.22.15", + "@vue/babel-plugin-jsx": "^1.1.5", + "@vue/compiler-dom": "^3.3.4", + "kolorist": "^1.8.0", + "magic-string": "^0.30.4" + }, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/vite/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmmirror.com/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vscode-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue": { + "version": "3.5.30", + "resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.30.tgz", + "integrity": "sha512-hTHLc6VNZyzzEH/l7PFGjpcTvUgiaPK5mdLkbjrTeWSRcEfxFrv56g/XckIYlE9ckuobsdwqd5mk2g1sBkMewg==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.30", + "@vue/compiler-sfc": "3.5.30", + "@vue/runtime-dom": "3.5.30", + "@vue/server-renderer": "3.5.30", + "@vue/shared": "3.5.30" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-eslint-parser": { + "version": "10.4.0", + "resolved": "https://registry.npmmirror.com/vue-eslint-parser/-/vue-eslint-parser-10.4.0.tgz", + "integrity": "sha512-Vxi9pJdbN3ZnVGLODVtZ7y4Y2kzAAE2Cm0CZ3ZDRvydVYxZ6VrnBhLikBsRS+dpwj4Jv4UCv21PTEwF5rQ9WXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "eslint-scope": "^8.2.0 || ^9.0.0", + "eslint-visitor-keys": "^4.2.0 || ^5.0.0", + "espree": "^10.3.0 || ^11.0.0", + "esquery": "^1.6.0", + "semver": "^7.6.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0" + } + }, + "node_modules/vue-eslint-parser/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/vue-router": { + "version": "5.0.3", + "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-5.0.3.tgz", + "integrity": "sha512-nG1c7aAFac7NYj8Hluo68WyWfc41xkEjaR0ViLHCa3oDvTQ/nIuLJlXJX1NUPw/DXzx/8+OKMng045HHQKQKWw==", + "license": "MIT", + "dependencies": { + "@babel/generator": "^7.28.6", + "@vue-macros/common": "^3.1.1", + "@vue/devtools-api": "^8.0.6", + "ast-walker-scope": "^0.8.3", + "chokidar": "^5.0.0", + "json5": "^2.2.3", + "local-pkg": "^1.1.2", + "magic-string": "^0.30.21", + "mlly": "^1.8.0", + "muggle-string": "^0.4.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "scule": "^1.3.0", + "tinyglobby": "^0.2.15", + "unplugin": "^3.0.0", + "unplugin-utils": "^0.3.1", + "yaml": "^2.8.2" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "@pinia/colada": ">=0.21.2", + "@vue/compiler-sfc": "^3.5.17", + "pinia": "^3.0.4", + "vue": "^3.5.0" + }, + "peerDependenciesMeta": { + "@pinia/colada": { + "optional": true + }, + "@vue/compiler-sfc": { + "optional": true + }, + "pinia": { + "optional": true + } + } + }, + "node_modules/vue-router/node_modules/@vue/devtools-api": { + "version": "8.1.0", + "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-8.1.0.tgz", + "integrity": "sha512-O44X57jjkLKbLEc4OgL/6fEPOOanRJU8kYpCE8qfKlV96RQZcdzrcLI5mxMuVRUeXhHKIHGhCpHacyCk0HyO4w==", + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^8.1.0" + } + }, + "node_modules/vue-router/node_modules/@vue/devtools-kit": { + "version": "8.1.0", + "resolved": "https://registry.npmmirror.com/@vue/devtools-kit/-/devtools-kit-8.1.0.tgz", + "integrity": "sha512-/NZlS4WtGIB54DA/z10gzk+n/V7zaqSzYZOVlg2CfdnpIKdB61bd7JDIMxf/zrtX41zod8E2/bbEBoW/d7x70Q==", + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^8.1.0", + "birpc": "^2.6.1", + "hookable": "^5.5.3", + "perfect-debounce": "^2.0.0" + } + }, + "node_modules/vue-router/node_modules/@vue/devtools-shared": { + "version": "8.1.0", + "resolved": "https://registry.npmmirror.com/@vue/devtools-shared/-/devtools-shared-8.1.0.tgz", + "integrity": "sha512-h8uCb4Qs8UT8VdTT5yjY6tOJ//qH7EpxToixR0xqejR55t5OdISIg7AJ7eBkhBs8iu1qG5gY3QQNN1DF1EelAA==", + "license": "MIT" + }, + "node_modules/vue-router/node_modules/perfect-debounce": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/perfect-debounce/-/perfect-debounce-2.1.0.tgz", + "integrity": "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==", + "license": "MIT" + }, + "node_modules/vue-router/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vue-tsc": { + "version": "3.2.6", + "resolved": "https://registry.npmmirror.com/vue-tsc/-/vue-tsc-3.2.6.tgz", + "integrity": "sha512-gYW/kWI0XrwGzd0PKc7tVB/qpdeAkIZLNZb10/InizkQjHjnT8weZ/vBarZoj4kHKbUTZT/bAVgoOr8x4NsQ/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/typescript": "2.4.28", + "@vue/language-core": "3.2.6" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": ">=5.0.0" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "resolved": "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", + "license": "MIT" + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wsl-utils": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/wsl-utils/-/wsl-utils-0.1.0.tgz", + "integrity": "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.8.2", + "resolved": "https://registry.npmmirror.com/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/有维项目/youwei-vue/package.json b/有维项目/youwei-vue/package.json new file mode 100644 index 0000000..4c4b4a8 --- /dev/null +++ b/有维项目/youwei-vue/package.json @@ -0,0 +1,41 @@ +{ + "name": "youwei-vue", + "version": "0.0.0", + "private": true, + "type": "module", + "scripts": { + "dev": "vite", + "build": "run-p type-check \"build-only {@}\" --", + "preview": "vite preview", + "build-only": "vite build", + "type-check": "vue-tsc --build", + "lint": "run-s lint:*", + "lint:oxlint": "oxlint . --fix", + "lint:eslint": "eslint . --fix --cache" + }, + "dependencies": { + "pinia": "^3.0.4", + "vue": "^3.5.29", + "vue-router": "^5.0.3" + }, + "devDependencies": { + "@tsconfig/node24": "^24.0.4", + "@types/node": "^24.11.0", + "@vitejs/plugin-vue": "^6.0.4", + "@vue/eslint-config-typescript": "^14.7.0", + "@vue/tsconfig": "^0.8.1", + "eslint": "^10.0.2", + "eslint-plugin-oxlint": "~1.50.0", + "eslint-plugin-vue": "~10.8.0", + "jiti": "^2.6.1", + "npm-run-all2": "^8.0.4", + "oxlint": "~1.50.0", + "typescript": "~5.9.3", + "vite": "^7.3.1", + "vite-plugin-vue-devtools": "^8.0.6", + "vue-tsc": "^3.2.5" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } +} diff --git a/有维项目/youwei-vue/public/favicon.ico b/有维项目/youwei-vue/public/favicon.ico new file mode 100644 index 0000000..df36fcf Binary files /dev/null and b/有维项目/youwei-vue/public/favicon.ico differ diff --git a/有维项目/youwei-vue/public/logo.png b/有维项目/youwei-vue/public/logo.png new file mode 100644 index 0000000..028e96c Binary files /dev/null and b/有维项目/youwei-vue/public/logo.png differ diff --git a/有维项目/youwei-vue/src/App.vue b/有维项目/youwei-vue/src/App.vue new file mode 100644 index 0000000..2e6c8ff --- /dev/null +++ b/有维项目/youwei-vue/src/App.vue @@ -0,0 +1,37 @@ + + + + + diff --git a/有维项目/youwei-vue/src/assets/base.css b/有维项目/youwei-vue/src/assets/base.css new file mode 100644 index 0000000..8816868 --- /dev/null +++ b/有维项目/youwei-vue/src/assets/base.css @@ -0,0 +1,86 @@ +/* color palette from */ +:root { + --vt-c-white: #ffffff; + --vt-c-white-soft: #f8f8f8; + --vt-c-white-mute: #f2f2f2; + + --vt-c-black: #181818; + --vt-c-black-soft: #222222; + --vt-c-black-mute: #282828; + + --vt-c-indigo: #2c3e50; + + --vt-c-divider-light-1: rgba(60, 60, 60, 0.29); + --vt-c-divider-light-2: rgba(60, 60, 60, 0.12); + --vt-c-divider-dark-1: rgba(84, 84, 84, 0.65); + --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48); + + --vt-c-text-light-1: var(--vt-c-indigo); + --vt-c-text-light-2: rgba(60, 60, 60, 0.66); + --vt-c-text-dark-1: var(--vt-c-white); + --vt-c-text-dark-2: rgba(235, 235, 235, 0.64); +} + +/* semantic color variables for this project */ +:root { + --color-background: var(--vt-c-white); + --color-background-soft: var(--vt-c-white-soft); + --color-background-mute: var(--vt-c-white-mute); + + --color-border: var(--vt-c-divider-light-2); + --color-border-hover: var(--vt-c-divider-light-1); + + --color-heading: var(--vt-c-text-light-1); + --color-text: var(--vt-c-text-light-1); + + --section-gap: 160px; +} + +@media (prefers-color-scheme: dark) { + :root { + --color-background: var(--vt-c-black); + --color-background-soft: var(--vt-c-black-soft); + --color-background-mute: var(--vt-c-black-mute); + + --color-border: var(--vt-c-divider-dark-2); + --color-border-hover: var(--vt-c-divider-dark-1); + + --color-heading: var(--vt-c-text-dark-1); + --color-text: var(--vt-c-text-dark-2); + } +} + +*, +*::before, +*::after { + box-sizing: border-box; + margin: 0; + font-weight: normal; +} + +body { + min-height: 100vh; + color: var(--color-text); + background: var(--color-background); + transition: + color 0.5s, + background-color 0.5s; + line-height: 1.6; + font-family: + Inter, + -apple-system, + BlinkMacSystemFont, + 'Segoe UI', + Roboto, + Oxygen, + Ubuntu, + Cantarell, + 'Fira Sans', + 'Droid Sans', + 'Helvetica Neue', + sans-serif; + font-size: 15px; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} diff --git a/有维项目/youwei-vue/src/assets/logo.svg b/有维项目/youwei-vue/src/assets/logo.svg new file mode 100644 index 0000000..7565660 --- /dev/null +++ b/有维项目/youwei-vue/src/assets/logo.svg @@ -0,0 +1 @@ + diff --git a/有维项目/youwei-vue/src/assets/main.css b/有维项目/youwei-vue/src/assets/main.css new file mode 100644 index 0000000..36fb845 --- /dev/null +++ b/有维项目/youwei-vue/src/assets/main.css @@ -0,0 +1,35 @@ +@import './base.css'; + +#app { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + font-weight: normal; +} + +a, +.green { + text-decoration: none; + color: hsla(160, 100%, 37%, 1); + transition: 0.4s; + padding: 3px; +} + +@media (hover: hover) { + a:hover { + background-color: hsla(160, 100%, 37%, 0.2); + } +} + +@media (min-width: 1024px) { + body { + display: flex; + place-items: center; + } + + #app { + display: grid; + grid-template-columns: 1fr 1fr; + padding: 0 2rem; + } +} diff --git a/有维项目/youwei-vue/src/components/HelloWorld.vue b/有维项目/youwei-vue/src/components/HelloWorld.vue new file mode 100644 index 0000000..d174cf8 --- /dev/null +++ b/有维项目/youwei-vue/src/components/HelloWorld.vue @@ -0,0 +1,41 @@ + + + + + diff --git a/有维项目/youwei-vue/src/components/TheWelcome.vue b/有维项目/youwei-vue/src/components/TheWelcome.vue new file mode 100644 index 0000000..8b731d9 --- /dev/null +++ b/有维项目/youwei-vue/src/components/TheWelcome.vue @@ -0,0 +1,95 @@ + + + diff --git a/有维项目/youwei-vue/src/components/WelcomeItem.vue b/有维项目/youwei-vue/src/components/WelcomeItem.vue new file mode 100644 index 0000000..6d7086a --- /dev/null +++ b/有维项目/youwei-vue/src/components/WelcomeItem.vue @@ -0,0 +1,87 @@ + + + diff --git a/有维项目/youwei-vue/src/components/icons/IconCommunity.vue b/有维项目/youwei-vue/src/components/icons/IconCommunity.vue new file mode 100644 index 0000000..2dc8b05 --- /dev/null +++ b/有维项目/youwei-vue/src/components/icons/IconCommunity.vue @@ -0,0 +1,7 @@ + diff --git a/有维项目/youwei-vue/src/components/icons/IconDocumentation.vue b/有维项目/youwei-vue/src/components/icons/IconDocumentation.vue new file mode 100644 index 0000000..6d4791c --- /dev/null +++ b/有维项目/youwei-vue/src/components/icons/IconDocumentation.vue @@ -0,0 +1,7 @@ + diff --git a/有维项目/youwei-vue/src/components/icons/IconEcosystem.vue b/有维项目/youwei-vue/src/components/icons/IconEcosystem.vue new file mode 100644 index 0000000..c3a4f07 --- /dev/null +++ b/有维项目/youwei-vue/src/components/icons/IconEcosystem.vue @@ -0,0 +1,7 @@ + diff --git a/有维项目/youwei-vue/src/components/icons/IconSupport.vue b/有维项目/youwei-vue/src/components/icons/IconSupport.vue new file mode 100644 index 0000000..7452834 --- /dev/null +++ b/有维项目/youwei-vue/src/components/icons/IconSupport.vue @@ -0,0 +1,7 @@ + diff --git a/有维项目/youwei-vue/src/components/icons/IconTooling.vue b/有维项目/youwei-vue/src/components/icons/IconTooling.vue new file mode 100644 index 0000000..660598d --- /dev/null +++ b/有维项目/youwei-vue/src/components/icons/IconTooling.vue @@ -0,0 +1,19 @@ + + diff --git a/有维项目/youwei-vue/src/main.ts b/有维项目/youwei-vue/src/main.ts new file mode 100644 index 0000000..3dd4307 --- /dev/null +++ b/有维项目/youwei-vue/src/main.ts @@ -0,0 +1,15 @@ +import './assets/main.css' + +import { createApp } from 'vue' +import { createPinia } from 'pinia' + +import App from './App.vue' +import router from './router' + +const app = createApp(App) +const pinia = createPinia() + +app.use(pinia) +app.use(router) + +app.mount('#app') diff --git a/有维项目/youwei-vue/src/router/index.ts b/有维项目/youwei-vue/src/router/index.ts new file mode 100644 index 0000000..771c02f --- /dev/null +++ b/有维项目/youwei-vue/src/router/index.ts @@ -0,0 +1,51 @@ +import { createRouter, createWebHistory } from 'vue-router' +import { useUserStore } from '@/stores/user' +import DashboardView from '../views/DashboardView.vue' +import AiView from '../views/AiView.vue' +import LoginView from '../views/LoginView.vue' + +const router = createRouter({ + history: createWebHistory(import.meta.env.BASE_URL), + routes: [ + { + path: '/', + name: 'dashboard', + component: DashboardView, + meta: { requiresAuth: true } + }, + { + path: '/ai', + name: 'ai', + component: AiView, + meta: { requiresAuth: true } + }, + { + path: '/login', + name: 'login', + component: LoginView, + meta: { guest: true } + } + ], +}) + +// 路由守卫 +router.beforeEach((to, from, next) => { + const userStore = useUserStore() + const isLoggedIn = userStore.checkLoginStatus() + + // 需要登录的页面 + if (to.meta.requiresAuth && !isLoggedIn) { + next('/login') + return + } + + // 游客页面(如登录页),已登录用户自动跳转 + if (to.meta.guest && isLoggedIn) { + next('/') + return + } + + next() +}) + +export default router diff --git a/有维项目/youwei-vue/src/stores/counter.ts b/有维项目/youwei-vue/src/stores/counter.ts new file mode 100644 index 0000000..b6757ba --- /dev/null +++ b/有维项目/youwei-vue/src/stores/counter.ts @@ -0,0 +1,12 @@ +import { ref, computed } from 'vue' +import { defineStore } from 'pinia' + +export const useCounterStore = defineStore('counter', () => { + const count = ref(0) + const doubleCount = computed(() => count.value * 2) + function increment() { + count.value++ + } + + return { count, doubleCount, increment } +}) diff --git a/有维项目/youwei-vue/src/stores/user.ts b/有维项目/youwei-vue/src/stores/user.ts new file mode 100644 index 0000000..f32d059 --- /dev/null +++ b/有维项目/youwei-vue/src/stores/user.ts @@ -0,0 +1,48 @@ +import { ref, computed } from 'vue' +import { defineStore } from 'pinia' + +export const useUserStore = defineStore('user', () => { + // State + const currentUser = ref('') + const isLoggedIn = computed(() => !!currentUser.value) + + // Getters + const userInitial = computed(() => { + return currentUser.value.charAt(0).toUpperCase() + }) + + // Actions + function login(username: string, rememberMe: boolean = false) { + currentUser.value = username + // 保存登录状态 + if (rememberMe) { + localStorage.setItem('currentUser', username) + } else { + sessionStorage.setItem('currentUser', username) + } + } + + function logout() { + currentUser.value = '' + localStorage.removeItem('currentUser') + sessionStorage.removeItem('currentUser') + } + + function checkLoginStatus(): boolean { + const savedUser = localStorage.getItem('currentUser') || sessionStorage.getItem('currentUser') + if (savedUser) { + currentUser.value = savedUser + return true + } + return false + } + + return { + currentUser, + isLoggedIn, + userInitial, + login, + logout, + checkLoginStatus + } +}) diff --git a/有维项目/youwei-vue/src/views/AboutView.vue b/有维项目/youwei-vue/src/views/AboutView.vue new file mode 100644 index 0000000..756ad2a --- /dev/null +++ b/有维项目/youwei-vue/src/views/AboutView.vue @@ -0,0 +1,15 @@ + + + diff --git a/有维项目/youwei-vue/src/views/AiView.vue b/有维项目/youwei-vue/src/views/AiView.vue new file mode 100644 index 0000000..d2d0b1b --- /dev/null +++ b/有维项目/youwei-vue/src/views/AiView.vue @@ -0,0 +1,1068 @@ + + + + + diff --git a/有维项目/youwei-vue/src/views/DashboardView.vue b/有维项目/youwei-vue/src/views/DashboardView.vue new file mode 100644 index 0000000..74e4d48 --- /dev/null +++ b/有维项目/youwei-vue/src/views/DashboardView.vue @@ -0,0 +1,1318 @@ + + + + + diff --git a/有维项目/youwei-vue/src/views/HomeView.vue b/有维项目/youwei-vue/src/views/HomeView.vue new file mode 100644 index 0000000..d5c0217 --- /dev/null +++ b/有维项目/youwei-vue/src/views/HomeView.vue @@ -0,0 +1,9 @@ + + + diff --git a/有维项目/youwei-vue/src/views/LoginView.vue b/有维项目/youwei-vue/src/views/LoginView.vue new file mode 100644 index 0000000..b12aad2 --- /dev/null +++ b/有维项目/youwei-vue/src/views/LoginView.vue @@ -0,0 +1,471 @@ + + + + + diff --git a/有维项目/youwei-vue/tsconfig.app.json b/有维项目/youwei-vue/tsconfig.app.json new file mode 100644 index 0000000..c0f2d86 --- /dev/null +++ b/有维项目/youwei-vue/tsconfig.app.json @@ -0,0 +1,18 @@ +{ + "extends": "@vue/tsconfig/tsconfig.dom.json", + "include": ["env.d.ts", "src/**/*", "src/**/*.vue"], + "exclude": ["src/**/__tests__/*"], + "compilerOptions": { + // Extra safety for array and object lookups, but may have false positives. + "noUncheckedIndexedAccess": true, + + // Path mapping for cleaner imports. + "paths": { + "@/*": ["./src/*"] + }, + + // `vue-tsc --build` produces a .tsbuildinfo file for incremental type-checking. + // Specified here to keep it out of the root directory. + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo" + } +} diff --git a/有维项目/youwei-vue/tsconfig.json b/有维项目/youwei-vue/tsconfig.json new file mode 100644 index 0000000..66b5e57 --- /dev/null +++ b/有维项目/youwei-vue/tsconfig.json @@ -0,0 +1,11 @@ +{ + "files": [], + "references": [ + { + "path": "./tsconfig.node.json" + }, + { + "path": "./tsconfig.app.json" + } + ] +} diff --git a/有维项目/youwei-vue/tsconfig.node.json b/有维项目/youwei-vue/tsconfig.node.json new file mode 100644 index 0000000..5988839 --- /dev/null +++ b/有维项目/youwei-vue/tsconfig.node.json @@ -0,0 +1,28 @@ +// TSConfig for modules that run in Node.js environment via either transpilation or type-stripping. +{ + "extends": "@tsconfig/node24/tsconfig.json", + "include": [ + "vite.config.*", + "vitest.config.*", + "cypress.config.*", + "nightwatch.conf.*", + "playwright.config.*", + "eslint.config.*" + ], + "compilerOptions": { + // Most tools use transpilation instead of Node.js's native type-stripping. + // Bundler mode provides a smoother developer experience. + "module": "preserve", + "moduleResolution": "bundler", + + // Include Node.js types and avoid accidentally including other `@types/*` packages. + "types": ["node"], + + // Disable emitting output during `vue-tsc --build`, which is used for type-checking only. + "noEmit": true, + + // `vue-tsc --build` produces a .tsbuildinfo file for incremental type-checking. + // Specified here to keep it out of the root directory. + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo" + } +} diff --git a/有维项目/youwei-vue/vite.config.ts b/有维项目/youwei-vue/vite.config.ts new file mode 100644 index 0000000..4217010 --- /dev/null +++ b/有维项目/youwei-vue/vite.config.ts @@ -0,0 +1,18 @@ +import { fileURLToPath, URL } from 'node:url' + +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import vueDevTools from 'vite-plugin-vue-devtools' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [ + vue(), + vueDevTools(), + ], + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)) + }, + }, +}) diff --git a/有维项目/【外发版】有维OPC商学院商业计划书 v3.0 260211(1).pdf b/有维项目/【外发版】有维OPC商学院商业计划书 v3.0 260211(1).pdf new file mode 100644 index 0000000..b5d8801 Binary files /dev/null and b/有维项目/【外发版】有维OPC商学院商业计划书 v3.0 260211(1).pdf differ diff --git a/有维项目/去除右下角商标.png b/有维项目/去除右下角商标.png new file mode 100644 index 0000000..028e96c Binary files /dev/null and b/有维项目/去除右下角商标.png differ diff --git a/有维项目/有维图标.jpg b/有维项目/有维图标.jpg new file mode 100644 index 0000000..721d702 Binary files /dev/null and b/有维项目/有维图标.jpg differ