diff --git a/.github/workflows/deploy_docs.yml b/.github/workflows/deploy_docs.yml new file mode 100644 index 0000000..528c79d --- /dev/null +++ b/.github/workflows/deploy_docs.yml @@ -0,0 +1,66 @@ +name: Deploy Docs to GitHub Pages + +on: + # 在推送到 main 分支时触发 + push: + branches: + - main + # 允许手动触发 + workflow_dispatch: + +# 设置 GITHUB_TOKEN 的权限,允许部署到 GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# 只允许一个并发部署 +concurrency: + group: pages + cancel-in-progress: false + +jobs: + # 构建任务 + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 # 如果未启用 lastUpdated,则不需要 + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: npm + cache-dependency-path: docs/package-lock.json + + - name: Setup Pages + uses: actions/configure-pages@v4 + + - name: Install dependencies + run: npm ci + working-directory: docs + + - name: Build with VitePress + run: npm run docs:build + working-directory: docs + + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: docs/.vitepress/dist + + # 部署任务 + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + needs: build + runs-on: ubuntu-latest + name: Deploy + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 0000000..3945675 --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,4 @@ +node_modules +.vitepress/dist +.vitepress/cache +.DS_Store diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts new file mode 100644 index 0000000..881d97f --- /dev/null +++ b/docs/.vitepress/config.mts @@ -0,0 +1,104 @@ +import { defineConfig } from 'vitepress' + +export default defineConfig({ + title: "Message Nest", + description: "灵活而强大的消息推送整合平台", + lang: 'zh-CN', + + // 如果部署到 GitHub Pages 的子路径,需要设置 base + // 例如:https://engigu.github.io/Message-Push-Nest/ + // base: '/Message-Push-Nest/', + + // 如果使用自定义域名或部署到根路径,注释掉 base 或设置为 '/' + base: '/Message-Push-Nest/', + + themeConfig: { + logo: '/logo.svg', + + nav: [ + { text: '首页', link: '/' }, + { text: '指南', link: '/guide/introduction' }, + { text: '部署', link: '/deployment/overview' }, + { text: 'API', link: '/api/usage' }, + { text: '演示站点', link: 'https://message-nest-demo-site.qwapi.eu.org/' } + ], + + sidebar: { + '/guide/': [ + { + text: '开始', + items: [ + { text: '介绍', link: '/guide/introduction' }, + { text: '特色功能', link: '/guide/features' }, + { text: '更新日志', link: '/guide/changelog' } + ] + }, + { + text: '配置', + items: [ + { text: '配置说明', link: '/guide/configuration' }, + { text: 'EmbedHtml说明', link: '/guide/embed-html' } + ] + }, + // { + // text: '文档部署', + // items: [ + // { text: '部署到 GitHub Pages', link: '/guide/deploy-to-github-pages' } + // ] + // } + ], + '/deployment/': [ + { + text: '部署方式', + items: [ + { text: '部署概览', link: '/deployment/overview' }, + { text: '直接运行', link: '/deployment/direct-run' }, + { text: '开发调试', link: '/deployment/development' }, + { text: 'Docker部署', link: '/deployment/docker' }, + { text: 'Docker Compose', link: '/deployment/docker-compose' } + ] + } + ], + '/api/': [ + { + text: 'API文档', + items: [ + { text: '使用说明', link: '/api/usage' }, + { text: '调用示例', link: '/api/examples' } + ] + } + ] + }, + + socialLinks: [ + { icon: 'github', link: 'https://github.com/engigu/Message-Push-Nest' } + ], + + footer: { + message: 'Released under the MIT License.', + copyright: 'Copyright © 2024-present Message Nest' + }, + + search: { + provider: 'local' + }, + + outline: { + level: [2, 3], + label: '目录' + }, + + docFooter: { + prev: '上一页', + next: '下一页' + }, + + lastUpdated: { + text: '最后更新于', + formatOptions: { + dateStyle: 'short', + timeStyle: 'short' + } + } + } +}) diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..6e00520 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,49 @@ +# Message Nest 文档站点 + +这是 Message Nest 项目的 VitePress 文档站点。 + +## 本地开发 + +```bash +# 安装依赖 +npm install + +# 启动开发服务器 +npm run docs:dev + +# 构建文档 +npm run docs:build + +# 预览构建结果 +npm run docs:preview +``` + +## 文档结构 + +``` +docs/ +├── .vitepress/ # VitePress 配置 +│ └── config.mts # 站点配置文件 +├── guide/ # 指南 +│ ├── introduction.md # 介绍 +│ ├── features.md # 特色功能 +│ ├── changelog.md # 更新日志 +│ ├── configuration.md # 配置说明 +│ └── embed-html.md # EmbedHtml说明 +├── deployment/ # 部署 +│ ├── overview.md # 部署概览 +│ ├── direct-run.md # 直接运行 +│ ├── development.md # 开发调试 +│ ├── docker.md # Docker部署 +│ └── docker-compose.md # Docker Compose +├── api/ # API文档 +│ ├── usage.md # 使用说明 +│ └── examples.md # 调用示例 +├── public/ # 静态资源 +│ └── logo.svg # Logo +└── index.md # 首页 +``` + +## 访问地址 + +开发服务器启动后,默认访问地址为:`http://localhost:5173` diff --git a/docs/SETUP.md b/docs/SETUP.md new file mode 100644 index 0000000..97273cb --- /dev/null +++ b/docs/SETUP.md @@ -0,0 +1,133 @@ +# VitePress 文档站点设置完成 + +## 已完成的工作 + +✅ 创建了完整的 VitePress 文档站点结构 +✅ 根据 README.md 拆分内容到多个文档页面 +✅ 配置了导航和侧边栏 +✅ 安装了所有必要的依赖 +✅ 创建了美观的首页 + +## 文档结构 + +``` +docs/ +├── .vitepress/ +│ └── config.mts # VitePress 配置文件 +├── guide/ # 指南部分 +│ ├── introduction.md # 项目介绍 +│ ├── features.md # 特色功能 +│ ├── changelog.md # 更新日志 +│ ├── configuration.md # 完整配置说明 +│ └── embed-html.md # EmbedHtml 配置详解 +├── deployment/ # 部署部分 +│ ├── overview.md # 部署概览 +│ ├── direct-run.md # 直接运行 Release +│ ├── development.md # 开发调试模式 +│ ├── docker.md # Docker 部署 +│ └── docker-compose.md # Docker Compose 部署 +├── api/ # API 文档 +│ ├── usage.md # API 使用说明 +│ └── examples.md # 多语言调用示例 +├── public/ +│ └── logo.svg # 站点 Logo +├── index.md # 首页 +├── package.json # 项目配置 +└── README.md # 文档说明 + +``` + +## 快速开始 + +### 启动开发服务器 + +```bash +cd docs +npm run docs:dev +``` + +访问:http://localhost:5173 + +### 构建生产版本 + +```bash +cd docs +npm run docs:build +``` + +构建产物在 `docs/.vitepress/dist` 目录 + +### 预览构建结果 + +```bash +cd docs +npm run docs:preview +``` + +## 文档内容 + +### 指南部分 +- **介绍** - 项目背景、演示站点、效果图 +- **特色功能** - 核心特性、支持的推送方式、其他功能 +- **更新日志** - 完整的功能更新历史 +- **配置说明** - 详细的配置文件说明和示例 +- **EmbedHtml说明** - 单应用模式和前后端分离模式的详细说明 + +### 部署部分 +- **部署概览** - 各种部署方式对比和快速选择指南 +- **直接运行** - 使用 Release 可执行文件部署 +- **开发调试** - 本地开发环境搭建 +- **Docker部署** - 两种 Docker 部署方式(配置文件和环境变量) +- **Docker Compose** - 完整的编排部署方案 + +### API 文档 +- **使用说明** - API 接口说明、参数、响应格式 +- **调用示例** - 提供 CURL、Python、Go、Java、Node.js、PHP、C#、Ruby 等多种语言的示例 + +## 主要特性 + +1. **美观的首页** - 使用 VitePress 的 home layout,展示项目特色 +2. **清晰的导航** - 顶部导航和侧边栏导航 +3. **搜索功能** - 内置本地搜索 +4. **响应式设计** - 支持移动端访问 +5. **中文优化** - 所有界面文字都已本地化 +6. **代码高亮** - 支持多种编程语言的代码高亮 +7. **自动目录** - 每个页面自动生成目录 + +## 下一步建议 + +1. 可以在 `docs/public/` 目录添加更多图片和资源 +2. 可以在配置文件中自定义主题颜色 +3. 可以添加更多的文档页面 +4. 可以配置 GitHub Pages 或其他静态站点托管服务进行部署 + +## 部署到生产环境 + +### GitHub Pages + +1. 在 `.vitepress/config.mts` 中设置 `base`: +```ts +export default defineConfig({ + base: '/Message-Push-Nest/', + // ... +}) +``` + +2. 构建并部署: +```bash +npm run docs:build +# 将 .vitepress/dist 目录部署到 GitHub Pages +``` + +### Vercel / Netlify + +直接连接 GitHub 仓库,设置: +- Build Command: `npm run docs:build` +- Output Directory: `docs/.vitepress/dist` + +## 注意事项 + +- 文档内容已根据 README.md 进行了合理拆分 +- 保留了所有原始信息和代码示例 +- 添加了更好的组织结构和导航 +- 使用了 VitePress 的特性(如提示框、代码块等) diff --git a/docs/api/examples.md b/docs/api/examples.md new file mode 100644 index 0000000..870cf87 --- /dev/null +++ b/docs/api/examples.md @@ -0,0 +1,305 @@ +# 调用示例 + +本页面提供各种编程语言的API调用示例。 + +## CURL + +```bash +curl -X POST --location 'http://127.0.0.1:8000/api/v1/message/send' \ + --header 'Content-Type: application/json' \ + --data '{ + "token": "a3541c2f0d3e1b4a5c6d7e8f9a0b1c2d3e", + "title": "message title", + "text": "Hello World!" + }' +``` + +## Python + +```python +import requests + +headers = { + 'Content-Type': 'application/json', +} + +json_data = { + "token": "a3541c2f0d3e1b4a5c6d7e8f9a0b1c2d3e", + "title": "message title", + "text": "Hello World!" +} + +response = requests.post( + 'http://127.0.0.1:8000/api/v1/message/send', + headers=headers, + json=json_data +) + +print("response:", response.json()) +``` + +### 使用 requests 库 + +首先安装依赖: + +```bash +pip install requests +``` + +## Go + +```go +package main + +import ( + "fmt" + "io" + "log" + "net/http" + "strings" +) + +func main() { + client := &http.Client{} + var data = strings.NewReader(`{ + "token": "a3541c2f0d3e1b4a5c6d7e8f9a0b1c2d3e", + "title": "message title", + "text": "Hello World!" +}`) + req, err := http.NewRequest("POST", "http://127.0.0.1:8000/api/v1/message/send", data) + if err != nil { + log.Fatal(err) + } + req.Header.Set("Content-Type", "application/json") + resp, err := client.Do(req) + if err != nil { + log.Fatal(err) + } + defer resp.Body.Close() + bodyText, err := io.ReadAll(resp.Body) + if err != nil { + log.Fatal(err) + } + fmt.Printf("%s\n", bodyText) +} +``` + +## Java + +```java +import java.io.IOException; +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpRequest.BodyPublishers; +import java.net.http.HttpResponse; + +public class MessageNestExample { + public static void main(String[] args) throws IOException, InterruptedException { + HttpClient client = HttpClient.newBuilder() + .followRedirects(HttpClient.Redirect.NORMAL) + .build(); + + String jsonData = """ + { + "token": "a3541c2f0d3e1b4a5c6d7e8f9a0b1c2d3e", + "title": "message title", + "text": "Hello World!" + } + """; + + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create("http://127.0.0.1:8000/api/v1/message/send")) + .POST(BodyPublishers.ofString(jsonData)) + .setHeader("Content-Type", "application/json") + .build(); + + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + + System.out.println(response.body()); + } +} +``` + +## Node.js + +### 使用 request 库 + +```javascript +var request = require('request'); + +var headers = { + 'Content-Type': 'application/json' +}; + +var dataString = JSON.stringify({ + "token": "a3541c2f0d3e1b4a5c6d7e8f9a0b1c2d3e", + "title": "message title", + "text": "Hello World!" +}); + +var options = { + url: 'http://127.0.0.1:8000/api/v1/message/send', + method: 'POST', + headers: headers, + body: dataString +}; + +function callback(error, response, body) { + if (!error && response.statusCode == 200) { + console.log(body); + } +} + +request(options, callback); +``` + +### 使用 axios 库 + +```javascript +const axios = require('axios'); + +const data = { + token: "a3541c2f0d3e1b4a5c6d7e8f9a0b1c2d3e", + title: "message title", + text: "Hello World!" +}; + +axios.post('http://127.0.0.1:8000/api/v1/message/send', data, { + headers: { + 'Content-Type': 'application/json' + } +}) +.then(response => { + console.log('response:', response.data); +}) +.catch(error => { + console.error('error:', error); +}); +``` + +### 使用 fetch (Node.js 18+) + +```javascript +const data = { + token: "a3541c2f0d3e1b4a5c6d7e8f9a0b1c2d3e", + title: "message title", + text: "Hello World!" +}; + +fetch('http://127.0.0.1:8000/api/v1/message/send', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(data) +}) +.then(response => response.json()) +.then(data => { + console.log('response:', data); +}) +.catch(error => { + console.error('error:', error); +}); +``` + +## PHP + +```php + "a3541c2f0d3e1b4a5c6d7e8f9a0b1c2d3e", + "title" => "message title", + "text" => "Hello World!" +); + +curl_setopt($ch, CURLOPT_URL, 'http://127.0.0.1:8000/api/v1/message/send'); +curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); +curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); +curl_setopt($ch, CURLOPT_HTTPHEADER, [ + 'Content-Type: application/json', +]); +curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); +curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); + +$response = curl_exec($ch); + +if (curl_errno($ch)) { + echo 'Error:' . curl_error($ch); +} else { + echo $response; +} + +curl_close($ch); +?> +``` + +## C# + +```csharp +using System; +using System.Net.Http; +using System.Text; +using System.Text.Json; +using System.Threading.Tasks; + +class Program +{ + static async Task Main(string[] args) + { + using var client = new HttpClient(); + + var data = new + { + token = "a3541c2f0d3e1b4a5c6d7e8f9a0b1c2d3e", + title = "message title", + text = "Hello World!" + }; + + var json = JsonSerializer.Serialize(data); + var content = new StringContent(json, Encoding.UTF8, "application/json"); + + var response = await client.PostAsync( + "http://127.0.0.1:8000/api/v1/message/send", + content + ); + + var responseString = await response.Content.ReadAsStringAsync(); + Console.WriteLine(responseString); + } +} +``` + +## Ruby + +```ruby +require 'net/http' +require 'json' +require 'uri' + +uri = URI('http://127.0.0.1:8000/api/v1/message/send') +http = Net::HTTP.new(uri.host, uri.port) + +request = Net::HTTP::Post.new(uri.path, { + 'Content-Type' => 'application/json' +}) + +request.body = { + token: 'a3541c2f0d3e1b4a5c6d7e8f9a0b1c2d3e', + title: 'message title', + text: 'Hello World!' +}.to_json + +response = http.request(request) +puts response.body +``` + +## 注意事项 + +::: tip 提示 +- 将示例中的 `http://127.0.0.1:8000` 替换为你的实际服务地址 +- 将 `a3541c2f0d3e1b4a5c6d7e8f9a0b1c2d3e` 替换为你在管理后台创建的实际 Token +- 建议在生产环境中使用 HTTPS +::: diff --git a/docs/api/usage.md b/docs/api/usage.md new file mode 100644 index 0000000..f46e66e --- /dev/null +++ b/docs/api/usage.md @@ -0,0 +1,106 @@ +# API 使用说明 + +Message Nest 提供统一的消息推送API接口。 + +## 接口地址 + +``` +POST /api/v1/message/send +``` + +## 请求参数 + +| 参数 | 类型 | 必填 | 说明 | +|------|------|------|------| +| token | string | 是 | 推送令牌,在管理后台查看 | +| title | string | 是 | 消息标题 | +| text | string | 是 | 消息内容 | + +## 请求示例 + +```json +{ + "token": "a3541c2f0d3e1b4a5c6d7e8f9a0b1c2d3e", + "title": "message title", + "text": "Hello World!" +} +``` + +## 响应格式 + +### 成功响应 + +```json +{ + "code": 200, + "msg": "success", + "data": { + "status": "sent" + } +} +``` + +### 失败响应 + +```json +{ + "code": 400, + "msg": "error message", + "data": null +} +``` + +## 获取 Token + +1. 登录 Message Nest 管理后台 +2. 进入"发送任务"页面 +3. 创建新的发送任务 +4. 配置推送渠道(邮件、钉钉、企业微信等) +5. 保存后获得推送令牌(Token) + +## 支持的推送渠道 + +- **邮件** - SMTP邮件发送 +- **钉钉** - 钉钉机器人 +- **企业微信** - 企业微信应用消息 +- **微信公众号** - 微信测试公众号模板消息 +- **自定义Webhook** - 自定义HTTP请求 +- **自托管消息** - 站内消息 + +## 使用流程 + +1. **创建推送渠道** + - 在管理后台配置各种推送渠道 + - 填写相应的配置信息(如邮箱、Webhook地址等) + +2. **创建发送任务** + - 选择要使用的推送渠道 + - 可以选择多个渠道同时推送 + - 获得唯一的推送令牌(Token) + +3. **调用API发送消息** + - 使用获得的 Token + - 发送标题和内容 + - 消息会自动推送到配置的所有渠道 + +## 注意事项 + +::: warning 重要 +- Token 是唯一的,请妥善保管 +- 消息内容支持纯文本和Markdown格式(取决于推送渠道) +- 建议使用异步方式调用API,避免阻塞主流程 +::: + +## 错误码说明 + +| 错误码 | 说明 | +|--------|------| +| 200 | 成功 | +| 400 | 请求参数错误 | +| 401 | 未授权 | +| 404 | Token不存在 | +| 500 | 服务器内部错误 | + +## 下一步 + +查看各语言的 [调用示例](/api/examples)。 diff --git a/docs/deploy.sh b/docs/deploy.sh new file mode 100644 index 0000000..e69de29 diff --git a/docs/deployment/development.md b/docs/deployment/development.md new file mode 100644 index 0000000..78ad2f7 --- /dev/null +++ b/docs/deployment/development.md @@ -0,0 +1,151 @@ +# 开发调试 + +本文档介绍如何在开发环境中运行 Message Nest。 + +## 前置要求 + +- Go 1.18+ +- Node.js 16+ +- MySQL 5.7+ 或 SQLite + +## 部署步骤 + +### 1. 克隆项目 + +```bash +git clone https://github.com/engigu/Message-Push-Nest.git +cd Message-Push-Nest +``` + +### 2. 配置文件 + +重命名 `conf/app.example.ini` 为 `conf/app.ini`,关键配置如下: + +```ini +[app] +JwtSecret = message-nest +LogLevel = INFO + +[server] +; RunMode务必设置成debug,会自动添加跨域 +RunMode = debug +HttpPort = 8000 +ReadTimeout = 60 +WriteTimeout = 60 +; 取消EmbedHtml的注释(启用前后端分离),然后到web目录下面,npm run dev启动前端页面 +EmbedHtml = disable + +[database] +; 开启SQL打印 +SqlDebug = enable + +; Type = sqlite +Type = mysql +User = root +Password = Aa123456 +Host = vm.server +Port = 3308 +Name = yourDbName +TablePrefix = message_ +``` + +::: warning 重要配置 +- `RunMode` 必须设置为 `debug`,会自动添加跨域 +- `EmbedHtml` 必须取消注释,启用前后端分离 +- `SqlDebug` 建议启用,方便调试 +::: + +### 3. 启动后端服务 + +```bash +go mod tidy +go run main.go +``` + +服务启动后会运行在8000端口。 + +### 4. 启动前端服务 + +```bash +cd web +npm i +npm run dev +``` + +页面启动后会提示访问URL,一般是 `http://127.0.0.1:5173`。 + +### 5. 访问应用 + +访问 `http://127.0.0.1:5173`,进行调试开发。 + +接口会自动转发到go服务 `http://localhost:8000`。 + +## 开发说明 + +### 目录结构 + +``` +Message-Push-Nest/ +├── conf/ # 配置文件 +├── middleware/ # 中间件 +├── migrate/ # 数据库迁移 +├── models/ # 数据模型 +├── pkg/ # 工具包 +├── routers/ # 路由 +├── service/ # 业务逻辑 +├── web/ # 前端项目 +│ ├── src/ # 源代码 +│ ├── public/ # 静态资源 +│ └── dist/ # 构建输出 +└── main.go # 入口文件 +``` + +### 前端技术栈 + +- Vue 3 +- TypeScript +- Vite +- TailwindCSS +- shadcn-vue + +### 后端技术栈 + +- Go +- Gin +- GORM +- Logrus + +## 构建生产版本 + +### 构建前端 + +```bash +cd web +npm run build +``` + +构建产物会输出到 `web/dist` 目录。 + +### 构建后端 + +```bash +CGO_ENABLED=0 go build -o Message-Nest +``` + +## 常见问题 + +### 前端无法连接后端 + +检查 `web/vite.config.ts` 中的代理配置是否正确。 + +### 热更新不生效 + +1. 检查文件是否保存 +2. 重启前端开发服务器 +3. 清除浏览器缓存 + +### 数据库连接失败 + +1. 检查数据库服务是否启动 +2. 检查配置文件中的连接信息 +3. 检查数据库用户权限 diff --git a/docs/deployment/direct-run.md b/docs/deployment/direct-run.md new file mode 100644 index 0000000..7f745ea --- /dev/null +++ b/docs/deployment/direct-run.md @@ -0,0 +1,112 @@ +# 直接运行 + +使用最新的Release打包的可执行文件部署,无需部署前端页面。 + +::: tip 推荐指数 +🍀🍀🍀🍀 适合没有Docker环境的生产部署 +::: + +## 部署步骤 + +### 1. 下载Release + +访问 [GitHub Releases](https://github.com/engigu/Message-Push-Nest/releases) 下载最新的系统版本对应的release,然后解压。 + +### 2. 创建数据库 + +新建一个MySQL数据库(或使用SQLite)。 + +### 3. 配置文件 + +重命名 `conf/app.example.ini` 为 `conf/app.ini`,然后修改配置: + +```ini +[app] +JwtSecret = message-nest +LogLevel = INFO + +[server] +RunMode = release +HttpPort = 8000 +ReadTimeout = 60 +WriteTimeout = 60 +; 注释EmbedHtml,启用单应用模式 +; EmbedHtml = disable + +[database] +; 关闭SQL打印 +; SqlDebug = enable + +; Type = sqlite +Type = mysql +User = root +Password = Aa123456 +Host = vm.server +Port = 3308 +Name = yourDbName +TablePrefix = message_ +``` + +::: warning 重要 +将配置中 `EmbedHtml = disable` 进行注释,以单应用方式运行。 +::: + +### 4. 启动项目 + +直接运行可执行文件,项目会自动创建表和账号。 + +```bash +# Windows +./Message-Nest.exe + +# Linux/Mac +./Message-Nest +``` + +### 5. 查看日志 + +INFO日志级别启动会出现如下日志: + +```log +[2024-01-13 13:40:09.075] INFO [migrate.go:70 Setup] [Init Data]: Migrate table: message_auth +[2024-01-13 13:40:11.778] INFO [migrate.go:70 Setup] [Init Data]: Migrate table: message_send_tasks +[2024-01-13 13:40:16.518] INFO [migrate.go:70 Setup] [Init Data]: Migrate table: message_send_ways +[2024-01-13 13:40:23.300] INFO [migrate.go:70 Setup] [Init Data]: Migrate table: message_send_tasks_logs +[2024-01-13 13:40:28.715] INFO [migrate.go:70 Setup] [Init Data]: Migrate table: message_send_tasks_ins +[2024-01-13 13:40:39.538] INFO [migrate.go:70 Setup] [Init Data]: Migrate table: message_settings +[2024-01-13 13:40:46.299] INFO [migrate.go:74 Setup] [Init Data]: Init Account data... +[2024-01-13 13:40:46.751] INFO [migrate.go:77 Setup] [Init Data]: All table data init done. +``` + +### 6. 访问服务 + +访问 `http://localhost:8000` + +- 默认账号:`admin` +- 默认密码:`123456` + +## 使用SQLite + +如果不想安装MySQL,可以使用SQLite: + +```ini +[database] +Type = sqlite +TablePrefix = message_ +``` + +SQLite数据库文件会自动创建在 `conf/database.db`。 + +## 常见问题 + +### 启动失败 + +1. 检查端口8000是否被占用 +2. 检查数据库连接配置是否正确 +3. 查看日志输出的错误信息 + +### 无法访问页面 + +1. 确认服务已正常启动 +2. 检查防火墙设置 +3. 确认 `EmbedHtml` 配置已注释 diff --git a/docs/deployment/docker-compose.md b/docs/deployment/docker-compose.md new file mode 100644 index 0000000..1086bcc --- /dev/null +++ b/docs/deployment/docker-compose.md @@ -0,0 +1,240 @@ +# Docker Compose 部署 + +使用 Docker Compose 编排部署 Message Nest。 + +::: tip 推荐指数 +🍀🍀🍀🍀🍀 适合生产环境,便于管理 +::: + +## 方式一:挂载配置文件 + +### 1. 准备配置文件 + +创建 `conf/app.ini`,内容参考 [Docker部署](/deployment/docker#_1-准备配置文件)。 + +### 2. 创建 docker-compose.yml + +```yaml +version: "3.7" +services: + + message-nest: + image: engigu/message-nest:latest + # 或使用 GHCR 镜像 + # image: ghcr.io/engigu/message-nest:latest + container_name: message-nest + restart: always + volumes: + - ./conf:/app/conf + ports: + - "8000:8000" +``` + +### 3. 文件目录结构 + +``` +. +├── conf +│ └── app.ini +└── docker-compose.yml +``` + +### 4. 启动服务 + +```bash +# 测试运行 +docker-compose up + +# 正式运行(后台) +docker-compose up -d +``` + +## 方式二:环境变量(推荐) + +### 使用 MySQL + +创建 `docker-compose.yml`: + +```yaml +version: "3.7" +services: + + message-nest: + image: engigu/message-nest:latest + # 或使用 GHCR 镜像 + # image: ghcr.io/engigu/message-nest:latest + container_name: message-nest + restart: always + ports: + - "8000:8000" + environment: + - MYSQL_HOST=192.168.64.133 + - MYSQL_PORT=3308 + - MYSQL_USER=root + - MYSQL_PASSWORD=Aa123456 + - MYSQL_DB=test_11 + - MYSQL_TABLE_PREFIX=message_ +``` + +### 使用 SQLite + +创建 `docker-compose.yml`: + +```yaml +version: "3.7" +services: + + message-nest: + image: engigu/message-nest:latest + # 或使用 GHCR 镜像 + # image: ghcr.io/engigu/message-nest:latest + container_name: message-nest + restart: always + ports: + - "8000:8000" + volumes: + - ./data/database.db:/app/conf/database.db +``` + +### 启动服务 + +```bash +# 正式运行 +docker-compose up -d +``` + +## 完整示例:MySQL + Message Nest + +如果你还没有MySQL,可以使用以下配置同时部署MySQL和Message Nest: + +```yaml +version: "3.7" +services: + + mysql: + image: mysql:8.0 + container_name: message-nest-mysql + restart: always + environment: + - MYSQL_ROOT_PASSWORD=Aa123456 + - MYSQL_DATABASE=message_nest + volumes: + - mysql-data:/var/lib/mysql + ports: + - "3306:3306" + + message-nest: + image: engigu/message-nest:latest + container_name: message-nest + restart: always + depends_on: + - mysql + ports: + - "8000:8000" + environment: + - MYSQL_HOST=mysql + - MYSQL_PORT=3306 + - MYSQL_USER=root + - MYSQL_PASSWORD=Aa123456 + - MYSQL_DB=message_nest + - MYSQL_TABLE_PREFIX=message_ + +volumes: + mysql-data: +``` + +## 常用命令 + +### 启动服务 + +```bash +# 前台启动(查看日志) +docker-compose up + +# 后台启动 +docker-compose up -d +``` + +### 查看日志 + +```bash +# 查看所有服务日志 +docker-compose logs + +# 查看特定服务日志 +docker-compose logs message-nest + +# 实时查看日志 +docker-compose logs -f message-nest +``` + +### 停止服务 + +```bash +# 停止服务 +docker-compose stop + +# 停止并删除容器 +docker-compose down + +# 停止并删除容器和数据卷 +docker-compose down -v +``` + +### 重启服务 + +```bash +# 重启所有服务 +docker-compose restart + +# 重启特定服务 +docker-compose restart message-nest +``` + +### 更新镜像 + +```bash +# 拉取最新镜像 +docker-compose pull + +# 重新创建容器 +docker-compose up -d +``` + +## 访问服务 + +启动后访问 `http://localhost:8000` + +- 默认账号:`admin` +- 默认密码:`123456` + +## 常见问题 + +### 服务无法启动 + +1. 检查端口是否被占用 +2. 检查配置是否正确 +3. 查看日志:`docker-compose logs` + +### MySQL连接失败 + +1. 确保MySQL服务已启动 +2. 检查 `MYSQL_HOST` 是否正确(使用服务名) +3. 等待MySQL完全启动(约10-30秒) + +### 数据持久化 + +使用volumes确保数据持久化: +```yaml +volumes: + - ./data:/app/conf # 配置文件 + - mysql-data:/var/lib/mysql # MySQL数据 +``` + +### 修改配置后重启 + +```bash +# 修改配置文件或环境变量后 +docker-compose down +docker-compose up -d +``` diff --git a/docs/deployment/docker.md b/docs/deployment/docker.md new file mode 100644 index 0000000..490eb79 --- /dev/null +++ b/docs/deployment/docker.md @@ -0,0 +1,201 @@ +# Docker 部署 + +使用 Docker 部署 Message Nest,支持多种配置方式。 + +::: tip 推荐指数 +🍀🍀🍀🍀🍀 最推荐的部署方式 +::: + +## 镜像源 + +Message Nest 提供两个镜像源: + +- **Docker Hub**: `engigu/message-nest:latest` +- **GitHub Container Registry**: `ghcr.io/engigu/message-nest:latest` + +## 方式一:挂载配置文件 + +### 1. 准备配置文件 + +新建 `conf/app.ini` 文件: + +```ini +[app] +JwtSecret = message-nest +LogLevel = INFO + +[server] +RunMode = release +; docker模式下端口配置文件中只能为8000 +HttpPort = 8000 +ReadTimeout = 60 +WriteTimeout = 60 +; 注释EmbedHtml,启用单应用模式 +; EmbedHtml = disable + +[database] +; 关闭SQL打印 +; SqlDebug = enable + +; Type = sqlite +Type = mysql +User = root +Password = Aa123456 +Host = vm.server +Port = 3308 +Name = yourDbName +TablePrefix = message_ +``` + +::: warning 端口限制 +Docker模式下,配置文件中的端口只能为8000,通过 `-p` 参数映射到宿主机端口。 +::: + +### 2. 拉取镜像 + +```bash +# 从 Docker Hub 拉取 +docker pull engigu/message-nest:latest + +# 或从 GitHub Container Registry (GHCR) 拉取 +docker pull ghcr.io/engigu/message-nest:latest +``` + +### 3. 启动容器 + +```bash +# 测试运行(Docker Hub 镜像) +docker run --rm -ti \ + -p 8000:8000 \ + -v /your/path/conf:/app/conf \ + engigu/message-nest:latest + +# 测试运行(GHCR 镜像) +docker run --rm -ti \ + -p 8000:8000 \ + -v /your/path/conf:/app/conf \ + ghcr.io/engigu/message-nest:latest + +# 正式运行(Docker Hub 镜像) +docker run -d \ + -p 8000:8000 \ + -v /your/path/conf:/app/conf \ + engigu/message-nest:latest + +# 正式运行(GHCR 镜像) +docker run -d \ + -p 8000:8000 \ + -v /your/path/conf:/app/conf \ + ghcr.io/engigu/message-nest:latest +``` + +## 方式二:环境变量(推荐) + +::: tip 推荐 +这是最简单的部署方式,无需准备配置文件。 +::: + +### 环境变量说明 + +| 变量 | 说明 | +|------|------| +| JWT_SECRET | jwt秘钥,可选,默认为message-nest | +| LOG_LEVEL | 日志等级,可选,默认为INFO,DEBUG/INFO/ERROR | +| RUN_MODE | 运行模式,可选,默认release,为debug将自动添加跨域 | +| DB_TYPE | 数据库类型,sqlite/mysql。默认为sqlite,存储路径为conf/database.db | +| MYSQL_HOST | mysql-host,DB_TYPE=mysql必填 | +| MYSQL_PORT | mysql端口,DB_TYPE=mysql必填 | +| MYSQL_USER | mysql用户名,DB_TYPE=mysql必填 | +| MYSQL_PASSWORD | mysql数据库密码,DB_TYPE=mysql必填 | +| MYSQL_DB | mysql数据库名字,DB_TYPE=mysql必填 | +| MYSQL_TABLE_PREFIX | mysql数据表前缀,DB_TYPE=mysql必填 | +| SSL | 是否开启SSL | +| SQL_DEBUG | 是否打印SQL,可选,默认关,设置enable为开启 | + +### 使用 MySQL + +```bash +# 正式运行(mysql) +docker run -d \ + -p 8000:8000 \ + -e MYSQL_HOST=192.168.64.133 \ + -e MYSQL_PORT=3308 \ + -e MYSQL_USER=root \ + -e MYSQL_PASSWORD=Aa123456 \ + -e MYSQL_DB=test_11 \ + -e MYSQL_TABLE_PREFIX=message_ \ + --name message-nest \ + engigu/message-nest:latest + +# 或使用 GHCR 镜像(mysql) +docker run -d \ + -p 8000:8000 \ + -e MYSQL_HOST=192.168.64.133 \ + -e MYSQL_PORT=3308 \ + -e MYSQL_USER=root \ + -e MYSQL_PASSWORD=Aa123456 \ + -e MYSQL_DB=test_11 \ + -e MYSQL_TABLE_PREFIX=message_ \ + --name message-nest \ + ghcr.io/engigu/message-nest:latest +``` + +### 使用 SQLite + +```bash +# 正式运行(sqlite) +docker run -d \ + -p 8000:8000 \ + -v /your/path/database.db:/app/conf/database.db \ + --name message-nest \ + engigu/message-nest:latest + +# 或使用 GHCR 镜像(sqlite) +docker run -d \ + -p 8000:8000 \ + -v /your/path/database.db:/app/conf/database.db \ + --name message-nest \ + ghcr.io/engigu/message-nest:latest +``` + +## 访问服务 + +启动后访问 `http://localhost:8000` + +- 默认账号:`admin` +- 默认密码:`123456` + +## 常见问题 + +### 容器无法启动 + +1. 检查端口是否被占用 +2. 检查数据库连接配置 +3. 查看容器日志:`docker logs message-nest` + +### 数据持久化 + +使用SQLite时,记得挂载数据库文件: +```bash +-v /your/path/database.db:/app/conf/database.db +``` + +### 查看日志 + +```bash +# 查看实时日志 +docker logs -f message-nest + +# 查看最近100行日志 +docker logs --tail 100 message-nest +``` + +### 停止和删除容器 + +```bash +# 停止容器 +docker stop message-nest + +# 删除容器 +docker rm message-nest +``` diff --git a/docs/deployment/overview.md b/docs/deployment/overview.md new file mode 100644 index 0000000..75598e9 --- /dev/null +++ b/docs/deployment/overview.md @@ -0,0 +1,53 @@ +# 部署概览 + +Message Nest 提供多种部署方式,您可以根据自己的需求选择合适的部署方案。 + +## 部署方式对比 + +| 部署方式 | 难度 | 推荐指数 | 适用场景 | +|---------|------|---------|---------| +| Docker环境变量 | ⭐ | ⭐⭐⭐⭐⭐ | 生产环境,快速部署 | +| Docker Compose | ⭐ | ⭐⭐⭐⭐⭐ | 生产环境,编排部署 | +| 直接运行Release | ⭐⭐ | ⭐⭐⭐⭐ | 生产环境,无Docker环境 | +| 开发调试 | ⭐⭐⭐ | ⭐⭐⭐ | 开发环境 | + +## 快速选择 + +### 我想快速体验 +推荐使用 **Docker环境变量部署**,一条命令即可启动。 + +### 我要用于生产环境 +推荐使用 **Docker Compose部署**,便于管理和维护。 + +### 我没有Docker环境 +推荐使用 **直接运行Release**,下载可执行文件即可。 + +### 我要进行开发 +推荐使用 **开发调试模式**,支持热更新。 + +## 默认账号 + +所有部署方式启动后,默认账号信息: +- 用户名:`admin` +- 密码:`123456` + +::: warning 安全提示 +首次登录后请立即修改默认密码! +::: + +## 数据库选择 + +Message Nest 支持多种数据库: + +- **SQLite** - 轻量级,无需额外配置,适合小规模使用 +- **MySQL 5.x / 8.x** - 成熟稳定,适合中大规模使用 +- **TiDB** - 分布式数据库,适合大规模使用 + +## 下一步 + +选择适合您的部署方式: + +- [直接运行](/deployment/direct-run) +- [开发调试](/deployment/development) +- [Docker部署](/deployment/docker) +- [Docker Compose](/deployment/docker-compose) diff --git a/docs/guide/changelog.md b/docs/guide/changelog.md new file mode 100644 index 0000000..3f22cd9 --- /dev/null +++ b/docs/guide/changelog.md @@ -0,0 +1,64 @@ +# 更新日志 + +## 2025 + +### 2025.10.12 +- 增加cookies过期天数设置 + +### 2025.09.30 +- 支持页面的明暗主题切换设置 +- 增加登录日志 + +### 2025.09.14 +- 支持系统信息展示更多的运行信息 + +### 2025.08.10 +- **重大升级,重构web页面,样式更加美观友好** +- UI组件使用shadcn-vue,基于tailwindcss +- 现在支持大中小屏自适应 + +### 2025.04.28 +- 支持tidb作为存储 +- 支持数据库ssl配置 +- docker运行指定环境变量SSL=true +- ini配置文件运行指定数据库连接参数Ssl=true + +### 2025.01.01 +- 支持自托管消息,现在可以将站点作为消息的接受,登录站点查看消息 + +## 2024 + +### 2024.04.29 +- 支持 SQLite 部署 +- 支持MySQL 5.x / 8.x + +### 2024.04.11 +- 支持自定义的定时消息发送 + +### 2024.03.05 +- 支持微信测试公众号模板消息发送 + +### 2024.01.28 +- 支持 Docker 部署,从环境变量启动服务 + +### 2024.01.24 +- 支持数据统计展示 + +### 2024.01.20 +- 添加日志查看自动刷新 + +### 2024.01.07 +- 支持站点信息自定义 + +### 2024.01.03 +- 支持企业微信 +- 单应用打包,直接运行,无需部署前端页面 +- 支持邮件发送 +- 用户密码设置 +- 支持用户定时任务清理,更新定时时间 +- 查看定时清理日志 +- 单应用的 HTML 浏览器自动缓存 +- Gin 的日志使用 Logrus +- 支持异步发送 +- 支持钉钉 +- 支持自定义的 Webhook 消息发送 diff --git a/docs/guide/configuration.md b/docs/guide/configuration.md new file mode 100644 index 0000000..c7c248c --- /dev/null +++ b/docs/guide/configuration.md @@ -0,0 +1,170 @@ +# 配置说明 + +## 完整配置文件 + +```ini +[app] +JwtSecret = message-nest +; 暂时无用 +RuntimeRootPath = runtime/ +LogLevel = INFO + +[server] +; debug or release +; debug模式下会自动添加跨域headers +RunMode = release +HttpPort = 8000 +ReadTimeout = 60 +WriteTimeout = 60 +; use embed html static file +; 是否使用embed打包的静态资源 +; 如果运行release打包后的应用,请注释这个设置。 +; 如果取消这个注释,只会单独运行api服务,前端页面需要到web目录手动npm run dev, 运行前端服务 +; EmbedHtml = disable + +[database] +; 配置使用什么数据库,支持:mysql、sqlite、tidb +Type = mysql +User = root +Password = password +Host = 123.1.1.1 +Name = db_name +Port = 3306 +; -- 其他配置 +; 表前缀 +TablePrefix = message_ +; -- 是否打开sql打印 +; SqlDebug = enable +; 数据库连接是否开启ssl, value: [false | true] +Ssl = true +``` + +## 配置项说明 + +### [app] 应用配置 + +| 配置项 | 说明 | 默认值 | +|--------|------|--------| +| JwtSecret | JWT密钥,用于token生成 | message-nest | +| RuntimeRootPath | 运行时根路径(暂时无用) | runtime/ | +| LogLevel | 日志级别:DEBUG/INFO/ERROR | INFO | + +### [server] 服务器配置 + +| 配置项 | 说明 | 默认值 | +|--------|------|--------| +| RunMode | 运行模式:debug/release,debug模式会自动添加跨域 | release | +| HttpPort | HTTP服务端口 | 8000 | +| ReadTimeout | 读取超时时间(秒) | 60 | +| WriteTimeout | 写入超时时间(秒) | 60 | +| EmbedHtml | 是否使用embed打包的静态资源,注释则启用单应用模式 | - | + +### [database] 数据库配置 + +| 配置项 | 说明 | 默认值 | +|--------|------|--------| +| Type | 数据库类型:mysql/sqlite/tidb | mysql | +| User | 数据库用户名 | - | +| Password | 数据库密码 | - | +| Host | 数据库主机地址 | - | +| Port | 数据库端口 | 3306 | +| Name | 数据库名称 | - | +| TablePrefix | 数据表前缀 | message_ | +| SqlDebug | 是否打印SQL,设置enable开启 | - | +| Ssl | 数据库连接是否开启SSL | false | + +## Docker 环境变量 + +使用Docker部署时,可以通过环境变量进行配置: + +| 变量 | 说明 | +|------|------| +| JWT_SECRET | jwt秘钥,可选,默认为message-nest | +| LOG_LEVEL | 日志等级,可选,默认为INFO,DEBUG/INFO/ERROR | +| RUN_MODE | 运行模式,可选,默认release,为debug将自动添加跨域 | +| DB_TYPE | 数据库类型,sqlite/mysql。默认为sqlite,存储路径为conf/database.db | +| MYSQL_HOST | mysql-host,DB_TYPE=mysql必填 | +| MYSQL_PORT | mysql端口,DB_TYPE=mysql必填 | +| MYSQL_USER | mysql用户名,DB_TYPE=mysql必填 | +| MYSQL_PASSWORD | mysql数据库密码,DB_TYPE=mysql必填 | +| MYSQL_DB | mysql数据库名字,DB_TYPE=mysql必填 | +| MYSQL_TABLE_PREFIX | mysql数据表前缀,DB_TYPE=mysql必填 | +| SSL | 是否开启SSL | +| SQL_DEBUG | 是否打印SQL,可选,默认关,设置enable为开启 | + +## 配置示例 + +### 单应用模式(推荐) + +```ini +[app] +JwtSecret = message-nest +LogLevel = INFO + +[server] +RunMode = release +HttpPort = 8000 +ReadTimeout = 60 +WriteTimeout = 60 +; 注释EmbedHtml,启用单应用模式 +; EmbedHtml = disable + +[database] +; 关闭SQL打印 +; SqlDebug = enable + +Type = mysql +User = root +Password = Aa123456 +Host = vm.server +Port = 3308 +Name = yourDbName +TablePrefix = message_ +``` + +### 开发调试模式 + +```ini +[app] +JwtSecret = message-nest +LogLevel = INFO + +[server] +; RunMode务必设置成debug,会自动添加跨域 +RunMode = debug +HttpPort = 8000 +ReadTimeout = 60 +WriteTimeout = 60 +; 取消EmbedHtml的注释(启用前后端分离),然后到web目录下面,npm run dev启动前端页面 +EmbedHtml = disable + +[database] +; 开启SQL打印 +SqlDebug = enable + +Type = mysql +User = root +Password = Aa123456 +Host = vm.server +Port = 3308 +Name = yourDbName +TablePrefix = message_ +``` + +### SQLite 配置 + +```ini +[app] +JwtSecret = message-nest +LogLevel = INFO + +[server] +RunMode = release +HttpPort = 8000 +ReadTimeout = 60 +WriteTimeout = 60 + +[database] +Type = sqlite +TablePrefix = message_ +``` diff --git a/docs/guide/embed-html.md b/docs/guide/embed-html.md new file mode 100644 index 0000000..b3adcaf --- /dev/null +++ b/docs/guide/embed-html.md @@ -0,0 +1,98 @@ +# EmbedHtml 配置说明 + +## 什么是 EmbedHtml? + +这个配置可以理解为单应用模式(或者前后端分离)的开关。 + +## 配置方式 + +### 方式一:单应用模式(推荐) + +**注释 EmbedHtml 配置** + +```ini +[server] +RunMode = release +HttpPort = 8000 +ReadTimeout = 60 +WriteTimeout = 60 +; 注释EmbedHtml,启用单应用模式 +; EmbedHtml = disable +``` + +**说明:** +- 启动go服务,会把web/dist目录下文件作为前端静态资源 +- 如果目录下没有静态资源文件,需要到web目录下,执行 `npm run build` 构建生成 +- 只需要运行一个服务即可访问完整功能 +- 适合生产环境部署 + +**适用场景:** +- 使用 Release 打包的可执行文件 +- Docker 部署 +- 生产环境 + +### 方式二:前后端分离模式 + +**启用 EmbedHtml 配置** + +```ini +[server] +RunMode = debug +HttpPort = 8000 +ReadTimeout = 60 +WriteTimeout = 60 +; 取消注释,启用前后端分离 +EmbedHtml = disable +``` + +**说明:** +- go服务启动时只会有API服务 +- 需要到web目录下,执行 `npm run dev` 启动前端项目 +- 访问前端项目提示的端口服务,一般是 `http://127.0.0.1:5173` +- 或者使用 `npm run build`,用Nginx部署前端 + +**适用场景:** +- 开发调试 +- 需要修改前端代码 +- 前后端独立部署 + +## 两种方式对比 + +| 特性 | 单应用模式 | 前后端分离模式 | +|------|-----------|--------------| +| 部署复杂度 | 简单,只需一个服务 | 复杂,需要两个服务 | +| 开发调试 | 不便,需要重新构建 | 方便,支持热更新 | +| 资源占用 | 较少 | 较多 | +| 适用环境 | 生产环境 | 开发环境 | +| 推荐指数 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | + +## 推荐方案 + +综合考虑下来,推荐直接使用以下方式: + +1. **Release 打包执行文件** - 已内置页面静态资源,开箱即用 +2. **Docker 环境变量部署** - 配置简单,一键启动 + +这两种方式都是单应用模式,只需运行一个服务即可。 + +## 常见问题 + +### Q: 为什么访问页面显示404? + +A: 检查以下几点: +1. 如果是单应用模式,确保 `EmbedHtml` 已注释 +2. 确保 `web/dist` 目录下有静态资源文件 +3. 如果没有,执行 `cd web && npm run build` 构建 + +### Q: 开发时如何快速调试? + +A: +1. 设置 `RunMode = debug` +2. 启用 `EmbedHtml = disable` +3. 启动后端:`go run main.go` +4. 启动前端:`cd web && npm run dev` +5. 访问前端提示的URL(通常是 http://127.0.0.1:5173) + +### Q: Docker 部署需要配置 EmbedHtml 吗? + +A: 不需要。Docker 镜像已经内置了前端静态资源,默认就是单应用模式。 diff --git a/docs/guide/features.md b/docs/guide/features.md new file mode 100644 index 0000000..046629d --- /dev/null +++ b/docs/guide/features.md @@ -0,0 +1,77 @@ +# 特色功能 + +## 核心特性 + +### 🔄 整合性 + +提供了多种消息推送方式,包括邮件、钉钉、企业微信等,方便你集中管理和定制通知。 + +### 🎨 自定义性 + +可以根据需求定制消息推送策略,满足不同场景的个性化需求。 + +### 🛠 开放性 + +易于扩展和集成新的消息通知服务,以适应未来的变化。 + +## 支持的推送方式 + +- **邮件发送** - 支持标准SMTP邮件发送 +- **钉钉** - 支持钉钉机器人消息推送 +- **企业微信** - 支持企业微信应用消息推送 +- **微信测试公众号** - 支持微信测试公众号模板消息发送 +- **自定义 Webhook** - 支持自定义的Webhook消息发送 +- **自托管消息** - 可以将站点作为消息的接收方,登录站点查看消息 + +## 其他功能 + +### 定时任务 + +支持自定义的定时消息发送,可以设置定时推送任务。 + +### 数据统计 + +支持数据统计展示,可以查看消息发送情况和历史记录。 + +### 异步发送 + +支持异步消息发送,提高系统性能和响应速度。 + +### 日志管理 + +- 支持日志查看自动刷新 +- 支持查看定时清理日志 +- 支持登录日志记录 + +### 用户管理 + +- 支持用户密码设置 +- 支持用户定时任务清理 +- 支持更新定时时间 + +### 系统信息 + +- 支持系统信息展示 +- 支持站点信息自定义 +- 支持明暗主题切换设置 +- 支持Cookies过期天数设置 + +### 数据库支持 + +- **SQLite** - 轻量级部署,无需额外数据库服务 +- **MySQL 5.x / 8.x** - 支持主流MySQL版本 +- **TiDB** - 支持分布式数据库TiDB +- 支持数据库SSL配置 + +### 部署方式 + +- **单应用打包** - 直接运行,无需部署前端页面 +- **Docker 部署** - 支持从环境变量启动服务 +- **Docker Compose** - 支持编排部署 +- **前后端分离** - 支持独立部署前后端 + +### 界面特性 + +- **现代化UI** - 使用shadcn-vue组件,基于TailwindCSS +- **响应式设计** - 支持大中小屏自适应 +- **单应用的HTML浏览器自动缓存** - 提高访问速度 diff --git a/docs/guide/introduction.md b/docs/guide/introduction.md new file mode 100644 index 0000000..ec0a47a --- /dev/null +++ b/docs/guide/introduction.md @@ -0,0 +1,39 @@ +# 介绍 + +Message Nest(信息巢)是一个灵活而强大的消息推送整合平台,旨在简化并自定义多种消息通知方式。 + +## 什么是 Message Nest? + +Message Nest 是一个拥有各种渠道信息方式的集合站点。如果你有很多消息推送方式,每次都需要调用各种接口去发送消息到各个渠道,或者不同的项目你都需要复制同样的发消息代码,这个项目可以帮你管理各种消息方式,并提供统一的发送API接入。 + +你可以自由组合各种消息渠道,一个API推送到各种渠道,帮你省去接入的繁琐步骤。 + +## 项目来由 + +自己常常写一些脚本需要消息推送,经常需要接入不同的消息发送,很不方便,于是就有了这个项目。 + +## 演示站点 + +访问 [演示站点](https://message-nest-demo-site.qwapi.eu.org/)(演示站点的服务器比较烂,见谅) + +## 效果图 + +![演示效果](https://raw.githubusercontent.com/engigu/resources/refs/heads/images/CPT2508101507-1460x745.gif) + +## 进度 + +项目还在不断更新中,欢迎大家提出各种建议。 + +关于日志,考虑到目前多数服务以收集控制台输出为主,暂时不支持写出日志文件。 + +## 致谢 + +该项目汲取了 [go-gin-example](https://github.com/eddycjy/go-gin-example) 项目的灵感,展示了 Go 和 Gin 在实际应用中的强大和多才多艺。 + +## 贡献 + +欢迎通过提交问题和提出改进建议。 + +## 许可证 + +[MIT License](https://github.com/engigu/Message-Push-Nest/blob/main/LICENSE) diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..f5aa0f7 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,86 @@ +--- +layout: home + +hero: + name: "Message Nest" + text: "消息推送整合平台" + tagline: 灵活而强大的消息推送整合平台,简化并自定义多种消息通知方式 + image: + src: /logo.svg + alt: Message Nest + actions: + - theme: brand + text: 快速开始 + link: /guide/introduction + - theme: alt + text: 部署指南 + link: /deployment/overview + - theme: alt + text: GitHub + link: https://github.com/engigu/Message-Push-Nest + +features: + - icon: 🔄 + title: 整合性 + details: 提供了多种消息推送方式,包括邮件、钉钉、企业微信等,方便你集中管理和定制通知。 + - icon: 🎨 + title: 自定义性 + details: 可以根据需求定制消息推送策略,满足不同场景的个性化需求。 + - icon: 🛠 + title: 开放性 + details: 易于扩展和集成新的消息通知服务,以适应未来的变化。 + - icon: 📧 + title: 多渠道支持 + details: 支持邮件、钉钉、企业微信、微信测试公众号、自定义Webhook等多种推送方式。 + - icon: ⏰ + title: 定时任务 + details: 支持自定义的定时消息发送,满足定时推送需求。 + - icon: 🎯 + title: 自托管消息 + details: 可以将站点作为消息的接收方,登录站点查看消息。 + - icon: 🐳 + title: Docker支持 + details: 支持Docker和Docker Compose部署,快速启动服务。 + - icon: 💾 + title: 多数据库支持 + details: 支持SQLite、MySQL 5.x/8.x、TiDB等多种数据库。 + - icon: 📊 + title: 数据统计 + details: 支持数据统计展示,查看消息发送情况。 +--- + +## 快速开始 + +### Docker 部署(推荐) + +使用环境变量快速启动: + +```bash +docker run -d \ + -p 8000:8000 \ + -e MYSQL_HOST=192.168.64.133 \ + -e MYSQL_PORT=3308 \ + -e MYSQL_USER=root \ + -e MYSQL_PASSWORD=Aa123456 \ + -e MYSQL_DB=test_11 \ + -e MYSQL_TABLE_PREFIX=message_ \ + --name message-nest \ + engigu/message-nest:latest +``` + +### 直接运行 + +1. 下载最新的 [Release](https://github.com/engigu/Message-Push-Nest/releases) +2. 配置 `conf/app.ini` +3. 启动服务,访问 `http://localhost:8000` +4. 默认账号:`admin`,密码:`123456` + +## 项目来由 + +自己常常写一些脚本需要消息推送,经常需要接入不同的消息发送,很不方便,于是就有了这个项目。 + +如果你有很多消息推送方式,每次都需要调用各种接口去发送消息到各个渠道,或者不同的项目你都需要复制同样的发消息代码,这个项目可以帮你管理各种消息方式,并提供统一的发送API接入。你可以自由组合各种消息渠道,一个API推送到各种渠道,帮你省去接入的繁琐步骤。 + +## Star History + +[![Star History Chart](https://api.star-history.com/svg?repos=engigu/Message-Push-Nest&type=Date)](https://star-history.com/#engigu/Message-Push-Nest&Date) diff --git a/docs/package-lock.json b/docs/package-lock.json new file mode 100644 index 0000000..8f31c19 --- /dev/null +++ b/docs/package-lock.json @@ -0,0 +1,2468 @@ +{ + "name": "message-nest-docs", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "message-nest-docs", + "version": "1.0.0", + "devDependencies": { + "vitepress": "^1.0.0" + } + }, + "node_modules/@algolia/abtesting": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.10.0.tgz", + "integrity": "sha512-mQT3jwuTgX8QMoqbIR7mPlWkqQqBPQaPabQzm37xg2txMlaMogK/4hCiiESGdg39MlHZOVHeV+0VJuE7f5UK8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.44.0", + "@algolia/requester-browser-xhr": "5.44.0", + "@algolia/requester-fetch": "5.44.0", + "@algolia/requester-node-http": "5.44.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.17.7.tgz", + "integrity": "sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.17.7", + "@algolia/autocomplete-shared": "1.17.7" + } + }, + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.7.tgz", + "integrity": "sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.17.7" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.7.tgz", + "integrity": "sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.17.7" + }, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.7.tgz", + "integrity": "sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/client-abtesting": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.44.0.tgz", + "integrity": "sha512-KY5CcrWhRTUo/lV7KcyjrZkPOOF9bjgWpMj9z98VA+sXzVpZtkuskBLCKsWYFp2sbwchZFTd3wJM48H0IGgF7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.44.0", + "@algolia/requester-browser-xhr": "5.44.0", + "@algolia/requester-fetch": "5.44.0", + "@algolia/requester-node-http": "5.44.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.44.0.tgz", + "integrity": "sha512-LKOCE8S4ewI9bN3ot9RZoYASPi8b78E918/DVPW3HHjCMUe6i+NjbNG6KotU4RpP6AhRWZjjswbOkWelUO+OoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.44.0", + "@algolia/requester-browser-xhr": "5.44.0", + "@algolia/requester-fetch": "5.44.0", + "@algolia/requester-node-http": "5.44.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-common": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.44.0.tgz", + "integrity": "sha512-1yyJm4OYC2cztbS28XYVWwLXdwpLsMG4LoZLOltVglQ2+hc/i9q9fUDZyjRa2Bqt4DmkIfezagfMrokhyH4uxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-insights": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.44.0.tgz", + "integrity": "sha512-wVQWK6jYYsbEOjIMI+e5voLGPUIbXrvDj392IckXaCPvQ6vCMTXakQqOYCd+znQdL76S+3wHDo77HZWiAYKrtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.44.0", + "@algolia/requester-browser-xhr": "5.44.0", + "@algolia/requester-fetch": "5.44.0", + "@algolia/requester-node-http": "5.44.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.44.0.tgz", + "integrity": "sha512-lkgRjOjOkqmIkebHjHpU9rLJcJNUDMm+eVSW/KJQYLjGqykEZxal+nYJJTBbLceEU2roByP/+27ZmgIwCdf0iA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.44.0", + "@algolia/requester-browser-xhr": "5.44.0", + "@algolia/requester-fetch": "5.44.0", + "@algolia/requester-node-http": "5.44.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-query-suggestions": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.44.0.tgz", + "integrity": "sha512-sYfhgwKu6NDVmZHL1WEKVLsOx/jUXCY4BHKLUOcYa8k4COCs6USGgz6IjFkUf+niwq8NCECMmTC4o/fVQOalsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.44.0", + "@algolia/requester-browser-xhr": "5.44.0", + "@algolia/requester-fetch": "5.44.0", + "@algolia/requester-node-http": "5.44.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-search": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.44.0.tgz", + "integrity": "sha512-/FRKUM1G4xn3vV8+9xH1WJ9XknU8rkBGlefruq9jDhYUAvYozKimhrmC2pRqw/RyHhPivmgZCRuC8jHP8piz4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.44.0", + "@algolia/requester-browser-xhr": "5.44.0", + "@algolia/requester-fetch": "5.44.0", + "@algolia/requester-node-http": "5.44.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/ingestion": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.44.0.tgz", + "integrity": "sha512-5+S5ynwMmpTpCLXGjTDpeIa81J+R4BLH0lAojOhmeGSeGEHQTqacl/4sbPyDTcidvnWhaqtyf8m42ue6lvISAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.44.0", + "@algolia/requester-browser-xhr": "5.44.0", + "@algolia/requester-fetch": "5.44.0", + "@algolia/requester-node-http": "5.44.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/monitoring": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.44.0.tgz", + "integrity": "sha512-xhaTN8pXJjR6zkrecg4Cc9YZaQK2LKm2R+LkbAq+AYGBCWJxtSGlNwftozZzkUyq4AXWoyoc0x2SyBtq5LRtqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.44.0", + "@algolia/requester-browser-xhr": "5.44.0", + "@algolia/requester-fetch": "5.44.0", + "@algolia/requester-node-http": "5.44.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/recommend": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.44.0.tgz", + "integrity": "sha512-GNcite/uOIS7wgRU1MT7SdNIupGSW+vbK9igIzMePvD2Dl8dy0O3urKPKIbTuZQqiVH1Cb84y5cgLvwNrdCj/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.44.0", + "@algolia/requester-browser-xhr": "5.44.0", + "@algolia/requester-fetch": "5.44.0", + "@algolia/requester-node-http": "5.44.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.44.0.tgz", + "integrity": "sha512-YZHBk72Cd7pcuNHzbhNzF/FbbYszlc7JhZlDyQAchnX5S7tcemSS96F39Sy8t4O4WQLpFvUf1MTNedlitWdOsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.44.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-fetch": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.44.0.tgz", + "integrity": "sha512-B9WHl+wQ7uf46t9cq+vVM/ypVbOeuldVDq9OtKsX2ApL2g/htx6ImB9ugDOOJmB5+fE31/XPTuCcYz/j03+idA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.44.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-node-http": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.44.0.tgz", + "integrity": "sha512-MULm0qeAIk4cdzZ/ehJnl1o7uB5NMokg83/3MKhPq0Pk7+I0uELGNbzIfAkvkKKEYcHALemKdArtySF9eKzh/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.44.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@docsearch/css": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.8.2.tgz", + "integrity": "sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@docsearch/js": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.8.2.tgz", + "integrity": "sha512-Q5wY66qHn0SwA7Taa0aDbHiJvaFJLOJyHmooQ7y8hlwwQLQ/5WwCcoX0g7ii04Qi2DJlHsd0XXzJ8Ypw9+9YmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@docsearch/react": "3.8.2", + "preact": "^10.0.0" + } + }, + "node_modules/@docsearch/react": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.8.2.tgz", + "integrity": "sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-core": "1.17.7", + "@algolia/autocomplete-preset-algolia": "1.17.7", + "@docsearch/css": "3.8.2", + "algoliasearch": "^5.14.2" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 19.0.0", + "react": ">= 16.8.0 < 19.0.0", + "react-dom": ">= 16.8.0 < 19.0.0", + "search-insights": ">= 1 < 3" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "search-insights": { + "optional": true + } + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@iconify-json/simple-icons": { + "version": "1.2.59", + "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.59.tgz", + "integrity": "sha512-fYx/InyQsWFW4wVxWka3CGDJ6m/fXoTqWBSl+oA3FBXO5RhPAb6S3Y5bRgCPnrYevErH8VjAL0TZevIqlN2PhQ==", + "dev": true, + "license": "CC0-1.0", + "dependencies": { + "@iconify/types": "*" + } + }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.2.tgz", + "integrity": "sha512-yDPzwsgiFO26RJA4nZo8I+xqzh7sJTZIWQOxn+/XOdPE31lAvLIYCKqjV+lNH/vxE2L2iH3plKxDCRK6i+CwhA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.2.tgz", + "integrity": "sha512-k8FontTxIE7b0/OGKeSN5B6j25EuppBcWM33Z19JoVT7UTXFSo3D9CdU39wGTeb29NO3XxpMNauh09B+Ibw+9g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.2.tgz", + "integrity": "sha512-A6s4gJpomNBtJ2yioj8bflM2oogDwzUiMl2yNJ2v9E7++sHrSrsQ29fOfn5DM/iCzpWcebNYEdXpaK4tr2RhfQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.2.tgz", + "integrity": "sha512-e6XqVmXlHrBlG56obu9gDRPW3O3hLxpwHpLsBJvuI8qqnsrtSZ9ERoWUXtPOkY8c78WghyPHZdmPhHLWNdAGEw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.2.tgz", + "integrity": "sha512-v0E9lJW8VsrwPux5Qe5CwmH/CF/2mQs6xU1MF3nmUxmZUCHazCjLgYvToOk+YuuUqLQBio1qkkREhxhc656ViA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.2.tgz", + "integrity": "sha512-ClAmAPx3ZCHtp6ysl4XEhWU69GUB1D+s7G9YjHGhIGCSrsg00nEGRRZHmINYxkdoJehde8VIsDC5t9C0gb6yqA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.2.tgz", + "integrity": "sha512-EPlb95nUsz6Dd9Qy13fI5kUPXNSljaG9FiJ4YUGU1O/Q77i5DYFW5KR8g1OzTcdZUqQQ1KdDqsTohdFVwCwjqg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.2.tgz", + "integrity": "sha512-BOmnVW+khAUX+YZvNfa0tGTEMVVEerOxN0pDk2E6N6DsEIa2Ctj48FOMfNDdrwinocKaC7YXUZ1pHlKpnkja/Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.2.tgz", + "integrity": "sha512-Xt2byDZ+6OVNuREgBXr4+CZDJtrVso5woFtpKdGPhpTPHcNG7D8YXeQzpNbFRxzTVqJf7kvPMCub/pcGUWgBjA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.2.tgz", + "integrity": "sha512-+LdZSldy/I9N8+klim/Y1HsKbJ3BbInHav5qE9Iy77dtHC/pibw1SR/fXlWyAk0ThnpRKoODwnAuSjqxFRDHUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.2.tgz", + "integrity": "sha512-8ms8sjmyc1jWJS6WdNSA23rEfdjWB30LH8Wqj0Cqvv7qSHnvw6kgMMXRdop6hkmGPlyYBdRPkjJnj3KCUHV/uQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.2.tgz", + "integrity": "sha512-3HRQLUQbpBDMmzoxPJYd3W6vrVHOo2cVW8RUo87Xz0JPJcBLBr5kZ1pGcQAhdZgX9VV7NbGNipah1omKKe23/g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.2.tgz", + "integrity": "sha512-fMjKi+ojnmIvhk34gZP94vjogXNNUKMEYs+EDaB/5TG/wUkoeua7p7VCHnE6T2Tx+iaghAqQX8teQzcvrYpaQA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.2.tgz", + "integrity": "sha512-XuGFGU+VwUUV5kLvoAdi0Wz5Xbh2SrjIxCtZj6Wq8MDp4bflb/+ThZsVxokM7n0pcbkEr2h5/pzqzDYI7cCgLQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.2.tgz", + "integrity": "sha512-w6yjZF0P+NGzWR3AXWX9zc0DNEGdtvykB03uhonSHMRa+oWA6novflo2WaJr6JZakG2ucsyb+rvhrKac6NIy+w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.2.tgz", + "integrity": "sha512-yo8d6tdfdeBArzC7T/PnHd7OypfI9cbuZzPnzLJIyKYFhAQ8SvlkKtKBMbXDxe1h03Rcr7u++nFS7tqXz87Gtw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.2.tgz", + "integrity": "sha512-ah59c1YkCxKExPP8O9PwOvs+XRLKwh/mV+3YdKqQ5AMQ0r4M4ZDuOrpWkUaqO7fzAHdINzV9tEVu8vNw48z0lA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.2.tgz", + "integrity": "sha512-4VEd19Wmhr+Zy7hbUsFZ6YXEiP48hE//KPLCSVNY5RMGX2/7HZ+QkN55a3atM1C/BZCGIgqN+xrVgtdak2S9+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.2.tgz", + "integrity": "sha512-IlbHFYc/pQCgew/d5fslcy1KEaYVCJ44G8pajugd8VoOEI8ODhtb/j8XMhLpwHCMB3yk2J07ctup10gpw2nyMA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.2.tgz", + "integrity": "sha512-lNlPEGgdUfSzdCWU176ku/dQRnA7W+Gp8d+cWv73jYrb8uT7HTVVxq62DUYxjbaByuf1Yk0RIIAbDzp+CnOTFg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.2.tgz", + "integrity": "sha512-S6YojNVrHybQis2lYov1sd+uj7K0Q05NxHcGktuMMdIQ2VixGwAfbJ23NnlvvVV1bdpR2m5MsNBViHJKcA4ADw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.2.tgz", + "integrity": "sha512-k+/Rkcyx//P6fetPoLMb8pBeqJBNGx81uuf7iljX9++yNBVRDQgD04L+SVXmXmh5ZP4/WOp4mWF0kmi06PW2tA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@shikijs/core": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-2.5.0.tgz", + "integrity": "sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/engine-javascript": "2.5.0", + "@shikijs/engine-oniguruma": "2.5.0", + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4", + "hast-util-to-html": "^9.0.4" + } + }, + "node_modules/@shikijs/engine-javascript": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-2.5.0.tgz", + "integrity": "sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "oniguruma-to-es": "^3.1.0" + } + }, + "node_modules/@shikijs/engine-oniguruma": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-2.5.0.tgz", + "integrity": "sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2" + } + }, + "node_modules/@shikijs/langs": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-2.5.0.tgz", + "integrity": "sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0" + } + }, + "node_modules/@shikijs/themes": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-2.5.0.tgz", + "integrity": "sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/types": "2.5.0" + } + }, + "node_modules/@shikijs/transformers": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-2.5.0.tgz", + "integrity": "sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/core": "2.5.0", + "@shikijs/types": "2.5.0" + } + }, + "node_modules/@shikijs/types": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-2.5.0.tgz", + "integrity": "sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/@shikijs/vscode-textmate": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz", + "integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/markdown-it": { + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/linkify-it": "^5", + "@types/mdurl": "^2" + } + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.21", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.21.tgz", + "integrity": "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true, + "license": "ISC" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", + "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.24", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.24.tgz", + "integrity": "sha512-eDl5H57AOpNakGNAkFDH+y7kTqrQpJkZFXhWZQGyx/5Wh7B1uQYvcWkvZi11BDhscPgj8N7XV3oRwiPnx1Vrig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@vue/shared": "3.5.24", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.24", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.24.tgz", + "integrity": "sha512-1QHGAvs53gXkWdd3ZMGYuvQFXHW4ksKWPG8HP8/2BscrbZ0brw183q2oNWjMrSWImYLHxHrx1ItBQr50I/q2zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.24", + "@vue/shared": "3.5.24" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.24", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.24.tgz", + "integrity": "sha512-8EG5YPRgmTB+YxYBM3VXy8zHD9SWHUJLIGPhDovo3Z8VOgvP+O7UP5vl0J4BBPWYD9vxtBabzW1EuEZ+Cqs14g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@vue/compiler-core": "3.5.24", + "@vue/compiler-dom": "3.5.24", + "@vue/compiler-ssr": "3.5.24", + "@vue/shared": "3.5.24", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.6", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.24", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.24.tgz", + "integrity": "sha512-trOvMWNBMQ/odMRHW7Ae1CdfYx+7MuiQu62Jtu36gMLXcaoqKvAyh+P73sYG9ll+6jLB6QPovqoKGGZROzkFFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.24", + "@vue/shared": "3.5.24" + } + }, + "node_modules/@vue/devtools-api": { + "version": "7.7.9", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.9.tgz", + "integrity": "sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^7.7.9" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "7.7.9", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.9.tgz", + "integrity": "sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA==", + "dev": true, + "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.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.9.tgz", + "integrity": "sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "rfdc": "^1.4.1" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.24", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.24.tgz", + "integrity": "sha512-BM8kBhtlkkbnyl4q+HiF5R5BL0ycDPfihowulm02q3WYp2vxgPcJuZO866qa/0u3idbMntKEtVNuAUp5bw4teg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.24" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.24", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.24.tgz", + "integrity": "sha512-RYP/byyKDgNIqfX/gNb2PB55dJmM97jc9wyF3jK7QUInYKypK2exmZMNwnjueWwGceEkP6NChd3D2ZVEp9undQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.24", + "@vue/shared": "3.5.24" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.24", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.24.tgz", + "integrity": "sha512-Z8ANhr/i0XIluonHVjbUkjvn+CyrxbXRIxR7wn7+X7xlcb7dJsfITZbkVOeJZdP8VZwfrWRsWdShH6pngMxRjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.24", + "@vue/runtime-core": "3.5.24", + "@vue/shared": "3.5.24", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.24", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.24.tgz", + "integrity": "sha512-Yh2j2Y4G/0/4z/xJ1Bad4mxaAk++C2v4kaa8oSYTMJBJ00/ndPuxCnWeot0/7/qafQFLh5pr6xeV6SdMcE/G1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.24", + "@vue/shared": "3.5.24" + }, + "peerDependencies": { + "vue": "3.5.24" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.24", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.24.tgz", + "integrity": "sha512-9cwHL2EsJBdi8NY22pngYYWzkTDhld6fAD6jlaeloNGciNSJL6bLpbxVgXl96X00Jtc6YWQv96YA/0sxex/k1A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vueuse/core": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-12.8.2.tgz", + "integrity": "sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.21", + "@vueuse/metadata": "12.8.2", + "@vueuse/shared": "12.8.2", + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/integrations": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-12.8.2.tgz", + "integrity": "sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vueuse/core": "12.8.2", + "@vueuse/shared": "12.8.2", + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "async-validator": "^4", + "axios": "^1", + "change-case": "^5", + "drauu": "^0.4", + "focus-trap": "^7", + "fuse.js": "^7", + "idb-keyval": "^6", + "jwt-decode": "^4", + "nprogress": "^0.2", + "qrcode": "^1.5", + "sortablejs": "^1", + "universal-cookie": "^7" + }, + "peerDependenciesMeta": { + "async-validator": { + "optional": true + }, + "axios": { + "optional": true + }, + "change-case": { + "optional": true + }, + "drauu": { + "optional": true + }, + "focus-trap": { + "optional": true + }, + "fuse.js": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "jwt-decode": { + "optional": true + }, + "nprogress": { + "optional": true + }, + "qrcode": { + "optional": true + }, + "sortablejs": { + "optional": true + }, + "universal-cookie": { + "optional": true + } + } + }, + "node_modules/@vueuse/metadata": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-12.8.2.tgz", + "integrity": "sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "12.8.2", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-12.8.2.tgz", + "integrity": "sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/algoliasearch": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.44.0.tgz", + "integrity": "sha512-f8IpsbdQjzTjr/4mJ/jv5UplrtyMnnciGax6/B0OnLCs2/GJTK13O4Y7Ff1AvJVAaztanH+m5nzPoUq6EAy+aA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/abtesting": "1.10.0", + "@algolia/client-abtesting": "5.44.0", + "@algolia/client-analytics": "5.44.0", + "@algolia/client-common": "5.44.0", + "@algolia/client-insights": "5.44.0", + "@algolia/client-personalization": "5.44.0", + "@algolia/client-query-suggestions": "5.44.0", + "@algolia/client-search": "5.44.0", + "@algolia/ingestion": "1.44.0", + "@algolia/monitoring": "1.44.0", + "@algolia/recommend": "5.44.0", + "@algolia/requester-browser-xhr": "5.44.0", + "@algolia/requester-fetch": "5.44.0", + "@algolia/requester-node-http": "5.44.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/birpc": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.8.0.tgz", + "integrity": "sha512-Bz2a4qD/5GRhiHSwj30c/8kC8QGj12nNDwz3D4ErQ4Xhy35dsSDvF+RA/tWpjyU0pdGtSDiEk6B5fBGE1qNVhw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/copy-anything": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-4.0.5.tgz", + "integrity": "sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-what": "^5.2.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/emoji-regex-xs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz", + "integrity": "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==", + "dev": true, + "license": "MIT" + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/focus-trap": { + "version": "7.6.6", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.6.6.tgz", + "integrity": "sha512-v/Z8bvMCajtx4mEXmOo7QEsIzlIOqRXTIwgUfsFOF9gEsespdbD0AkPIka1bSXZ8Y8oZ+2IVDQZePkTfEHZl7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "tabbable": "^6.3.0" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/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/hast-util-to-html": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-9.0.5.tgz", + "integrity": "sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-whitespace": "^3.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-what": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-5.5.0.tgz", + "integrity": "sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/minisearch": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.2.0.tgz", + "integrity": "sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==", + "dev": true, + "license": "MIT" + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "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/oniguruma-to-es": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-3.1.1.tgz", + "integrity": "sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex-xs": "^1.0.0", + "regex": "^6.0.1", + "regex-recursion": "^6.0.2" + } + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/preact": { + "version": "10.27.2", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.27.2.tgz", + "integrity": "sha512-5SYSgFKSyhCbk6SrXyMpqjb5+MQBgfvEKE/OC+PujcY34sOpqtr+0AZQtPYx5IA6VxynQ7rUPCtKzyovpj9Bpg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/regex/-/regex-6.0.1.tgz", + "integrity": "sha512-uorlqlzAKjKQZ5P+kTJr3eeJGSVroLKoHmquUj4zHWuR+hEyNqlXsSKlYYF5F4NI6nl7tWCs0apKJ0lmfsXAPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-recursion": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-6.0.2.tgz", + "integrity": "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "regex-utilities": "^2.3.0" + } + }, + "node_modules/regex-utilities": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==", + "dev": true, + "license": "MIT" + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/rollup": { + "version": "4.53.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.2.tgz", + "integrity": "sha512-MHngMYwGJVi6Fmnk6ISmnk7JAHRNF0UkuucA0CUW3N3a4KnONPEZz+vUanQP/ZC/iY1Qkf3bwPWzyY84wEks1g==", + "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.53.2", + "@rollup/rollup-android-arm64": "4.53.2", + "@rollup/rollup-darwin-arm64": "4.53.2", + "@rollup/rollup-darwin-x64": "4.53.2", + "@rollup/rollup-freebsd-arm64": "4.53.2", + "@rollup/rollup-freebsd-x64": "4.53.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.53.2", + "@rollup/rollup-linux-arm-musleabihf": "4.53.2", + "@rollup/rollup-linux-arm64-gnu": "4.53.2", + "@rollup/rollup-linux-arm64-musl": "4.53.2", + "@rollup/rollup-linux-loong64-gnu": "4.53.2", + "@rollup/rollup-linux-ppc64-gnu": "4.53.2", + "@rollup/rollup-linux-riscv64-gnu": "4.53.2", + "@rollup/rollup-linux-riscv64-musl": "4.53.2", + "@rollup/rollup-linux-s390x-gnu": "4.53.2", + "@rollup/rollup-linux-x64-gnu": "4.53.2", + "@rollup/rollup-linux-x64-musl": "4.53.2", + "@rollup/rollup-openharmony-arm64": "4.53.2", + "@rollup/rollup-win32-arm64-msvc": "4.53.2", + "@rollup/rollup-win32-ia32-msvc": "4.53.2", + "@rollup/rollup-win32-x64-gnu": "4.53.2", + "@rollup/rollup-win32-x64-msvc": "4.53.2", + "fsevents": "~2.3.2" + } + }, + "node_modules/search-insights": { + "version": "2.17.3", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", + "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/shiki": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-2.5.0.tgz", + "integrity": "sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shikijs/core": "2.5.0", + "@shikijs/engine-javascript": "2.5.0", + "@shikijs/engine-oniguruma": "2.5.0", + "@shikijs/langs": "2.5.0", + "@shikijs/themes": "2.5.0", + "@shikijs/types": "2.5.0", + "@shikijs/vscode-textmate": "^10.0.2", + "@types/hast": "^3.0.4" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "dev": true, + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/superjson": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.5.tgz", + "integrity": "sha512-zWPTX96LVsA/eVYnqOM2+ofcdPqdS1dAF1LN4TS2/MWuUpfitd9ctTa87wt4xrYnZnkLtS69xpBdSxVBP5Rm6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "copy-anything": "^4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tabbable": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.3.0.tgz", + "integrity": "sha512-EIHvdY5bPLuWForiR/AN2Bxngzpuwn1is4asboytXtpTgsArc+WmSJKVLlhdh71u7jFcryDqB2A8lQvj78MkyQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vitepress": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.6.4.tgz", + "integrity": "sha512-+2ym1/+0VVrbhNyRoFFesVvBvHAVMZMK0rw60E3X/5349M1GuVdKeazuksqopEdvkKwKGs21Q729jX81/bkBJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@docsearch/css": "3.8.2", + "@docsearch/js": "3.8.2", + "@iconify-json/simple-icons": "^1.2.21", + "@shikijs/core": "^2.1.0", + "@shikijs/transformers": "^2.1.0", + "@shikijs/types": "^2.1.0", + "@types/markdown-it": "^14.1.2", + "@vitejs/plugin-vue": "^5.2.1", + "@vue/devtools-api": "^7.7.0", + "@vue/shared": "^3.5.13", + "@vueuse/core": "^12.4.0", + "@vueuse/integrations": "^12.4.0", + "focus-trap": "^7.6.4", + "mark.js": "8.11.1", + "minisearch": "^7.1.1", + "shiki": "^2.1.0", + "vite": "^5.4.14", + "vue": "^3.5.13" + }, + "bin": { + "vitepress": "bin/vitepress.js" + }, + "peerDependencies": { + "markdown-it-mathjax3": "^4", + "postcss": "^8" + }, + "peerDependenciesMeta": { + "markdown-it-mathjax3": { + "optional": true + }, + "postcss": { + "optional": true + } + } + }, + "node_modules/vue": { + "version": "3.5.24", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.24.tgz", + "integrity": "sha512-uTHDOpVQTMjcGgrqFPSb8iO2m1DUvo+WbGqoXQz8Y1CeBYQ0FXf2z1gLRaBtHjlRz7zZUBHxjVB5VTLzYkvftg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.24", + "@vue/compiler-sfc": "3.5.24", + "@vue/runtime-dom": "3.5.24", + "@vue/server-renderer": "3.5.24", + "@vue/shared": "3.5.24" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/docs/package.json b/docs/package.json new file mode 100644 index 0000000..474f3a3 --- /dev/null +++ b/docs/package.json @@ -0,0 +1,13 @@ +{ + "name": "message-nest-docs", + "version": "1.0.0", + "description": "Message Nest Documentation", + "scripts": { + "docs:dev": "vitepress dev", + "docs:build": "vitepress build", + "docs:preview": "vitepress preview" + }, + "devDependencies": { + "vitepress": "^1.0.0" + } +} diff --git a/docs/public/logo.svg b/docs/public/logo.svg new file mode 100644 index 0000000..d40af89 --- /dev/null +++ b/docs/public/logo.svg @@ -0,0 +1,8 @@ + + + + + + + +