Compare commits

36 Commits

Author SHA1 Message Date
Redon
3f4cb5c900 feat: 响应式支持移动端 (#49)
* feat: 响应式兼容 h5

* feat: 补充空状态

* feat: thinking

* chore: @vueuse/core 导致的类型检查错误

* chore: version 2.4.0
2023-02-17 10:57:06 +08:00
ChenZhaoYu
405aeaa2a5 chore: version 2.3.3 2023-02-16 21:03:12 +08:00
ChenZhaoYu
fd28468778 chore: build_docker repositories 2023-02-16 20:30:49 +08:00
Stephen Ni
4128d319ed docs: polish docker run (#44)
* docs: polish docker run

* Update README.md

---------

Co-authored-by: Redon <790348264@qq.com>
2023-02-16 20:29:46 +08:00
Jerry Wang
4a06b3943c 优化 docker 构建的镜像文件大小,添加自动化构建 (#42)
* perf: optimize docker image

* perf: shrink image size

* fix: build docker image

* fix: docker image namespace

* docs: add docker compose example

* docs: fix docker compose example

* docs: fix again :)

* docs: and again.....
2023-02-16 20:25:29 +08:00
ChenZhaoYu
77cdcb7798 chore: 添加贡献列表 2023-02-16 14:17:03 +08:00
ChenZhaoYu
ee542a01f7 chore: eslint 依赖报错 2023-02-16 14:03:40 +08:00
ChenZhaoYu
30372c2e70 chore: update README 2023-02-16 13:42:19 +08:00
Void
6646695849 Add Dockerfile (#33)
* add Dockerfile

* update Readme.md

* Fixed : Docker log file

* Update vite.config.ts
2023-02-16 13:39:07 +08:00
ChenZhaoYu
e9db25a970 chore: version 2.3.2 2023-02-16 12:31:08 +08:00
ChenZhaoYu
63f4d7d77c chore: update deps 2023-02-16 12:29:47 +08:00
ChenZhaoYu
20255ddce4 chore: gitignore file 2023-02-16 12:00:03 +08:00
wang ha ha
bbd8ff773b 添加 docker 镜像打包部署脚本 (#27)
* 删除env

* 修改生产依赖安装缺失。

* 添加docker镜像构建

* no message

* 修改超时时间。

* 修复镜像构建错误。

* 修改环境变量获取baseapi

* 修改前端链接获取位置。

* 删除默认env

* 添加会 .env 文件,但是注释掉。

* 使用默认 api。

* 添加前端调试和部署路由兼容。

* 删除key

* Update .env

* Delete build_docker.yml

暂时不做 `git hooks` 处理

* Delete .gitignore

* Delete Dockerfile

工作路径好像有点错误,先不合并

* Delete build.sh

工作路径好像有点错误,先不合并

---------

Co-authored-by: 王金海(haha.wang) <wanghaha@huolala.cn>
Co-authored-by: haha.wang <haha.wang@huolala.cn>
Co-authored-by: Redon <790348264@qq.com>
2023-02-16 11:58:29 +08:00
Redon
c8518b7789 chore: 删除未使用代码 (#37) 2023-02-16 11:38:18 +08:00
ChenZhaoYu
bf015d35f7 chore: 添加 node>=14 说明 2023-02-16 11:15:00 +08:00
ChenZhaoYu
eab39b7f88 chore: update doc 2023-02-16 08:24:42 +08:00
ChenZhaoYu
981c036542 fix: type error 2023-02-16 08:23:31 +08:00
Redon
91f51b6338 pull (#34) (#35)
* fix: 修复部分多会话逻辑

* chore: version 2.3.1
2023-02-15 22:44:32 +08:00
ChenZhaoYu
26de5359ef chore: version 2.3.1 2023-02-15 22:34:44 +08:00
ChenZhaoYu
0423b87530 fix: 修复部分多会话逻辑 2023-02-15 22:31:55 +08:00
ChenZhaoYu
58464b2cee chore: 推送错误,应该在 dev 分支上 2023-02-15 16:55:21 +08:00
ChenZhaoYu
e23e1df3ce chore: 变量名错误 2023-02-15 16:47:32 +08:00
ChenZhaoYu
2c3bc77eb2 chore: 添加贡献值栏 2023-02-15 16:45:34 +08:00
ChenZhaoYu
52b43868eb chore: # CONTRIBUTING 2023-02-15 16:18:20 +08:00
ChenZhaoYu
7930ec5dab feat: 添加 ts 类型 2023-02-15 16:07:42 +08:00
ChenZhaoYu
7835740159 chore: version 2.3.0 2023-02-15 15:53:53 +08:00
ChenZhaoYu
c8745f2e21 feat: 调整超时时间 2023-02-15 15:05:57 +08:00
ChenZhaoYu
0b8b58f85c fix: 取消提示判断字段错误 2023-02-15 15:01:33 +08:00
ChenZhaoYu
c09a4f6c75 feat: 阻止移动端缩放 2023-02-15 14:43:23 +08:00
ChenZhaoYu
d9761ed0e5 fix: 修复提交按钮因为合并导致失效 #31 2023-02-15 14:25:25 +08:00
ChenZhaoYu
cb8e2cf814 fix: 侧边栏因为宽度变化导致的闪烁 2023-02-15 14:21:46 +08:00
ChenZhaoYu
f73aa5f9e1 perf: 优化部份内容 2023-02-15 14:10:43 +08:00
Yut
c617205a8c feat: #响应式 (#22)
* feat: #响应式

* fix: #兼容node 16

* feat: #接口代理

* fix: #延长超时时长到30秒

* fix: #for node 16

* fix: #node 16

* Update settings.json

* Update package.json

* Update index.vue

* Update Layout.vue

---------

Co-authored-by: Redon <790348264@qq.com>
2023-02-15 14:01:42 +08:00
ChenZhaoYu
79eeb51537 perf: 优化 pr 代码 2023-02-15 13:26:02 +08:00
Dwsy
b2977d8c44 add code highlighting 2023-02-15 13:04:31 +08:00
Dwsy
8dab963628 add code highlighting 2023-02-15 13:04:31 +08:00
45 changed files with 1038 additions and 497 deletions

6
.dockerignore Normal file
View File

@@ -0,0 +1,6 @@
node_modules
Dockerfile
.git
.husky
.github
.vscode

4
.env
View File

@@ -1,2 +1,4 @@
# Glob API URL # Glob API URL
VITE_GLOB_API_URL='http://localhost:3002' VITE_GLOB_API_URL=/api
VITE_APP_API_BASE_URL=http://localhost:3002/

37
.github/workflows/build_docker.yml vendored Normal file
View File

@@ -0,0 +1,37 @@
name: build_docker
on:
push:
branches: [main]
jobs:
build_docker:
name: Build docker
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Docker meta
id: meta
uses: docker/metadata-action@v4
with:
images: chenzhaoyu94/chatgpt-web
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Login to DockerHub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push
id: docker_build
uses: docker/build-push-action@v4
with:
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
platforms: linux/amd64,linux/arm64

View File

@@ -23,7 +23,9 @@
"axios", "axios",
"bumpp", "bumpp",
"chatgpt", "chatgpt",
"chenzhaoyu",
"commitlint", "commitlint",
"dockerhub",
"esno", "esno",
"GPTAPI", "GPTAPI",
"iconify", "iconify",
@@ -37,6 +39,7 @@
"Typecheck", "Typecheck",
"unplugin", "unplugin",
"VITE", "VITE",
"vueuse" "vueuse",
"Zhao"
] ]
} }

View File

@@ -1,3 +1,55 @@
## v2.4.0
`2023-02-17`
### Feature
- 响应式支持移动端
### Enhancement
- 修改部份描述错误
## v2.3.3
`2023-02-16`
### Feature
- 添加 `README` 部份说明和贡献列表
- 添加 `docker` 镜像
- 添加 `GitHub Action` 自动化构建
### BugFix
- 回退依赖更新导致的 [Eslint 报错](https://github.com/eslint/eslint/issues/16896)
## v2.3.2
`2023-02-16`
### Enhancement
- 更新依赖至最新
- 优化部份内容
## v2.3.1
`2023-02-15`
### BugFix
- 修复多会话状态下一些意想不到的问题
## v2.3.0
`2023-02-15`
### Feature
- 代码类型信息高亮显示
- 支持 `node ^16` 版本
- 移动端响应式初步支持
- `vite``proxy` 代理
### Enhancement
- 调整超时处理范围
### BugFix
- 修复取消请求错误提示会添加到信息中
- 修复部份情况下提交请求不可用
- 修复侧边栏宽度变化闪烁的问题
## v2.2.0 ## v2.2.0
`2023-02-14` `2023-02-14`

View File

@@ -1,4 +1,22 @@
# 指南 # 贡献指南
感谢你的宝贵时间。你的贡献将使这个项目变得更好!在提交贡献之前,请务必花点时间阅读下面的入门指南。
## 语义化版本
该项目遵循语义化版本。我们对重要的漏洞修复发布修订号,对新特性或不重要的变更发布次版本号,对重大且不兼容的变更发布主版本号。
每个重大更改都将记录在 `changelog` 中。
## 提交 Pull Request
1. Fork [此仓库](https://github.com/Chanzhaoyu/chatgpt-web),从 `main` 创建分支。新功能实现请发 pull request 到 `feature` 分支。其他更改发到 `main` 分支。
2. 使用 `npm install pnpm -g` 安装 `pnpm` 工具。
3. `vscode` 安装了 `Eslint` 插件,其它编辑器如 `webStorm` 打开了 `eslint` 功能。
4. 根目录下执行 `pnpm bootstrap`
5. `/service/` 目录下执行 `pnpm install`
6. 对代码库进行更改。如果适用的话,请确保进行了相应的测试。
7. 请在根目录下执行 `pnpm lint:fix` 进行代码格式检查。
8. 请在根目录下执行 `pnpm type-check` 进行类型检查。
9. 提交 git commit, 请同时遵守 [Commit 规范](#commit-指南)
10. 提交 `pull request` 如果有对应的 `issue`,请进行[关联](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue#linking-a-pull-request-to-an-issue-using-a-keyword)。
## Commit 指南 ## Commit 指南
@@ -24,3 +42,8 @@ Commit messages 请遵循[conventional-changelog 标准](https://www.conventiona
- perf: 性能优化 - perf: 性能优化
- test: 单元测试 - test: 单元测试
- chore: 其他不修改 src 或测试文件的提交 - chore: 其他不修改 src 或测试文件的提交
## License
[MIT](./license)

20
Dockerfile Normal file
View File

@@ -0,0 +1,20 @@
# build front-end
FROM node:lts-alpine AS builder
COPY ./ /app
WORKDIR /app
RUN npm install pnpm -g && pnpm install && pnpm run build
# service
FROM node:lts-alpine
COPY /service /app
COPY --from=builder /app/dist /app/public
WORKDIR /app
RUN npm install pnpm -g && pnpm install
EXPOSE 3002
CMD ["pnpm", "run", "start"]

View File

@@ -2,28 +2,30 @@
使用 express 和 vue3 搭建的 ChartGPT 演示网页 使用 express 和 vue3 搭建的 ChartGPT 演示网页
![cover](./docs/cover-2.png) ![PC](./docs/c1.png)
![Mobile](./docs/c2.png)
> 提示:目前 `OpenAI` 开放的模型最高只有 `GPT-3`,和现在网页所使用的 `GPT-3.5` 或 `GPT-4` 有很大差距,需要等官方开放最新的模型接口。 > 提示:目前 `OpenAI` 开放的模型最高只有 `GPT-3`,和现在网页所使用的 `GPT-3.5` 或 `GPT-4` 有很大差距,需要等官方开放最新的模型接口。
## 待实现路线 ## 待实现路线
[x] 多会话储存和上下文逻辑 [] 多会话储存和上下文逻辑
[x] 对代码等消息类型的格式化美化处理 [] 对代码等消息类型的格式化美化处理
[x] 用户模块(注册、登录、个人中心) [] 用户模块(注册、登录、个人中心)
[x] 界面多语言 [] 界面多语言
[x] 界面主题 [] 界面主题
[x] More... [] More...
## 前置要求 ## 前置要求
### Node ### Node
`node` 版本需要 >= 18,使用 [nvm](https://github.com/nvm-sh/nvm) 可管理本地多个 `node` 版本 `node` 需要 `^16 || ^18` 版本(或者 `node >= 14` 需要安装 [fetch polyfill](https://github.com/developit/unfetch#usage-as-a-polyfill),使用 [nvm](https://github.com/nvm-sh/nvm) 可管理本地多个 `node` 版本
```shell ```shell
node -v node -v
@@ -36,7 +38,7 @@ npm install pnpm -g
``` ```
### OpenAI API Key ### OpenAI API Key
获取 [OpenAI API key](https://platform.openai.com/overview) 并填写到本地环境变量 注册并获取 [OpenAI API key](https://platform.openai.com/overview) 并填写到本地环境变量
``` ```
# service/.env 文件 # service/.env 文件
@@ -97,9 +99,37 @@ pnpm prod
PS: 不进行打包,直接在服务器上运行 `pnpm start` 也可 PS: 不进行打包,直接在服务器上运行 `pnpm start` 也可
## Docker build & run
[参考信息](https://github.com/Chanzhaoyu/chatgpt-web/pull/42)
```bash
docker build -t chatgpt-web .
```
## Docker compose
[Hub 地址](https://hub.docker.com/repository/docker/chenzhaoyu94/chatgpt-web/general)
```yml
version: '3'
services:
app:
image: chenzhaoyu94/chatgpt-web:main
ports:
- 3002:3002
environment:
OPENAI_API_KEY: xxxxxx
```
### 网页 ### 网页
根目录下运行以下命令,然后将 `dist` 文件夹复制到你的托管服务器上 根目录下运行以下命令,然后将 `dist` 文件夹复制到你的托管服务器上
[参考信息](https://cn.vitejs.dev/guide/static-deploy.html#building-the-app)
```shell ```shell
pnpm build pnpm build
``` ```
@@ -117,5 +147,15 @@ Q: 文件保存时全部爆红?
A: `vscode` 请安装项目推荐插件,或手动安装 `Eslint` 插件。 A: `vscode` 请安装项目推荐插件,或手动安装 `Eslint` 插件。
## 参与贡献
贡献之前请先阅读 [贡献指南](./CONTRIBUTING.md)
感谢所有做过贡献的人!
<a href="https://github.com/Chanzhaoyu/chatgpt-web/graphs/contributors">
<img src="https://contrib.rocks/image?repo=Chanzhaoyu/chatgpt-web" />
</a>
## License ## License
MIT © [ChenZhaoYu](./license) MIT © [ChenZhaoYu](./license)

BIN
docs/c1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 188 KiB

BIN
docs/c2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

View File

@@ -1,71 +1,76 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="zh-cmn-Hans"> <html lang="zh-cmn-Hans">
<head>
<meta charset="UTF-8">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ChatGPT Web</title>
</head>
<body>
<div id="app">
<style>
.loading-wrap {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
}
.balls { <head>
width: 4em; <meta charset="UTF-8">
display: flex; <link rel="icon" type="image/svg+xml" href="/favicon.svg">
flex-flow: row nowrap; <meta name="viewport"
align-items: center; content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, viewport-fit=cover" />
justify-content: space-between; <title>ChatGPT Web</title>
} </head>
.balls div { <body>
width: 0.8em; <div id="app">
height: 0.8em; <style>
border-radius: 50%; .loading-wrap {
background-color: #4b9e5f; display: flex;
} justify-content: center;
align-items: center;
height: 100vh;
}
.balls div:nth-of-type(1) { .balls {
transform: translateX(-100%); width: 4em;
animation: left-swing 0.5s ease-in alternate infinite; display: flex;
} flex-flow: row nowrap;
align-items: center;
justify-content: space-between;
}
.balls div:nth-of-type(3) { .balls div {
transform: translateX(-95%); width: 0.8em;
animation: right-swing 0.5s ease-out alternate infinite; height: 0.8em;
} border-radius: 50%;
background-color: #4b9e5f;
}
@keyframes left-swing { .balls div:nth-of-type(1) {
50%, transform: translateX(-100%);
100% { animation: left-swing 0.5s ease-in alternate infinite;
transform: translateX(95%); }
}
}
@keyframes right-swing { .balls div:nth-of-type(3) {
50% { transform: translateX(-95%);
transform: translateX(-95%); animation: right-swing 0.5s ease-out alternate infinite;
} }
100% { @keyframes left-swing {
transform: translateX(100%);
} 50%,
} 100% {
</style> transform: translateX(95%);
<div class="loading-wrap"> }
<div class="balls"> }
<div></div>
<div></div> @keyframes right-swing {
<div></div> 50% {
</div> transform: translateX(-95%);
</div> }
100% {
transform: translateX(100%);
}
}
</style>
<div class="loading-wrap">
<div class="balls">
<div></div>
<div></div>
<div></div>
</div>
</div> </div>
<script type="module" src="/src/main.ts"></script> </div>
</body> <script type="module" src="/src/main.ts"></script>
</body>
</html> </html>

View File

@@ -1,6 +1,6 @@
{ {
"name": "chatgpt-web", "name": "chatgpt-web",
"version": "2.2.0", "version": "2.4.0",
"private": false, "private": false,
"description": "ChatGPT Web", "description": "ChatGPT Web",
"author": "ChenZhaoYu <chenzhaoyu1994@gmail.com>", "author": "ChenZhaoYu <chenzhaoyu1994@gmail.com>",
@@ -16,12 +16,15 @@
"preview": "vite preview", "preview": "vite preview",
"build-only": "vite build", "build-only": "vite build",
"type-check": "vue-tsc --noEmit", "type-check": "vue-tsc --noEmit",
"lint": "eslint .",
"lint:fix": "eslint . --fix", "lint:fix": "eslint . --fix",
"bootstrap": "pnpm install && pnpm run common:prepare", "bootstrap": "pnpm install && pnpm run common:prepare",
"common:cleanup": "rimraf node_modules && rimraf pnpm-lock.yaml", "common:cleanup": "rimraf node_modules && rimraf pnpm-lock.yaml",
"common:prepare": "husky install" "common:prepare": "husky install"
}, },
"dependencies": { "dependencies": {
"@vueuse/core": "^9.12.0",
"highlight.js": "^11.7.0",
"naive-ui": "^2.34.3", "naive-ui": "^2.34.3",
"pinia": "^2.0.30", "pinia": "^2.0.30",
"vue": "^3.2.47", "vue": "^3.2.47",
@@ -34,20 +37,22 @@
"@iconify/vue": "^4.1.0", "@iconify/vue": "^4.1.0",
"@types/crypto-js": "^4.1.1", "@types/crypto-js": "^4.1.1",
"@types/node": "^18.13.0", "@types/node": "^18.13.0",
"@types/web-bluetooth": "^0.0.16",
"@vitejs/plugin-vue": "^4.0.0", "@vitejs/plugin-vue": "^4.0.0",
"autoprefixer": "^10.4.13", "autoprefixer": "^10.4.13",
"axios": "^1.3.2", "axios": "^1.3.3",
"crypto-js": "^4.1.1", "crypto-js": "^4.1.1",
"eslint": "^8.34.0", "eslint": "^8.34.0",
"husky": "^8.0.3", "husky": "^8.0.3",
"lint-staged": "^13.1.1", "less": "^4.1.3",
"lint-staged": "^13.1.2",
"npm-run-all": "^4.1.5", "npm-run-all": "^4.1.5",
"postcss": "^8.4.21", "postcss": "^8.4.21",
"rimraf": "^4.1.2", "rimraf": "^4.1.2",
"tailwindcss": "^3.2.6", "tailwindcss": "^3.2.6",
"typescript": "~4.9.5", "typescript": "~4.9.5",
"vite": "^4.1.1", "vite": "^4.1.1",
"vue-tsc": "^1.0.24" "vue-tsc": "^1.1.0"
}, },
"lint-staged": { "lint-staged": {
"*.{ts,tsx,vue}": [ "*.{ts,tsx,vue}": [

358
pnpm-lock.yaml generated
View File

@@ -7,13 +7,17 @@ specifiers:
'@iconify/vue': ^4.1.0 '@iconify/vue': ^4.1.0
'@types/crypto-js': ^4.1.1 '@types/crypto-js': ^4.1.1
'@types/node': ^18.13.0 '@types/node': ^18.13.0
'@types/web-bluetooth': ^0.0.16
'@vitejs/plugin-vue': ^4.0.0 '@vitejs/plugin-vue': ^4.0.0
'@vueuse/core': ^9.12.0
autoprefixer: ^10.4.13 autoprefixer: ^10.4.13
axios: ^1.3.2 axios: ^1.3.3
crypto-js: ^4.1.1 crypto-js: ^4.1.1
eslint: ^8.34.0 eslint: ^8.34.0
highlight.js: ^11.7.0
husky: ^8.0.3 husky: ^8.0.3
lint-staged: ^13.1.1 less: ^4.1.3
lint-staged: ^13.1.2
naive-ui: ^2.34.3 naive-ui: ^2.34.3
npm-run-all: ^4.1.5 npm-run-all: ^4.1.5
pinia: ^2.0.30 pinia: ^2.0.30
@@ -24,9 +28,11 @@ specifiers:
vite: ^4.1.1 vite: ^4.1.1
vue: ^3.2.47 vue: ^3.2.47
vue-router: ^4.1.6 vue-router: ^4.1.6
vue-tsc: ^1.0.24 vue-tsc: ^1.1.0
dependencies: dependencies:
'@vueuse/core': 9.12.0_vue@3.2.47
highlight.js: 11.7.0
naive-ui: 2.34.3_vue@3.2.47 naive-ui: 2.34.3_vue@3.2.47
pinia: 2.0.30_hmuptsblhheur2tugfgucj7gc4 pinia: 2.0.30_hmuptsblhheur2tugfgucj7gc4
vue: 3.2.47 vue: 3.2.47
@@ -39,24 +45,26 @@ devDependencies:
'@iconify/vue': 4.1.0_vue@3.2.47 '@iconify/vue': 4.1.0_vue@3.2.47
'@types/crypto-js': 4.1.1 '@types/crypto-js': 4.1.1
'@types/node': 18.13.0 '@types/node': 18.13.0
'@types/web-bluetooth': 0.0.16
'@vitejs/plugin-vue': 4.0.0_vite@4.1.1+vue@3.2.47 '@vitejs/plugin-vue': 4.0.0_vite@4.1.1+vue@3.2.47
autoprefixer: 10.4.13_postcss@8.4.21 autoprefixer: 10.4.13_postcss@8.4.21
axios: 1.3.2 axios: 1.3.3
crypto-js: 4.1.1 crypto-js: 4.1.1
eslint: 8.34.0 eslint: 8.34.0
husky: 8.0.3 husky: 8.0.3
lint-staged: 13.1.1 less: 4.1.3
lint-staged: 13.1.2
npm-run-all: 4.1.5 npm-run-all: 4.1.5
postcss: 8.4.21 postcss: 8.4.21
rimraf: 4.1.2 rimraf: 4.1.2
tailwindcss: 3.2.6_postcss@8.4.21 tailwindcss: 3.2.6_postcss@8.4.21
typescript: 4.9.5 typescript: 4.9.5
vite: 4.1.1_@types+node@18.13.0 vite: 4.1.1_edl3ajnhen4c5iqs57t4gqrzly
vue-tsc: 1.0.24_typescript@4.9.5 vue-tsc: 1.1.0_typescript@4.9.5
packages: packages:
/@antfu/eslint-config-basic/0.35.2_6ike4423xm2xnh233ikrbff5m4: /@antfu/eslint-config-basic/0.35.2_khyrr7my4aaa3ssgqabkfgcc24:
resolution: {integrity: sha512-2k7Ovkd8U/q0sgfjuT9KzAUV0q187yGxP7JzD2D4YifuJwL5Bh3JC49KpCv9PXMTeRUMJX2y/kOtGYPetocOug==} resolution: {integrity: sha512-2k7Ovkd8U/q0sgfjuT9KzAUV0q187yGxP7JzD2D4YifuJwL5Bh3JC49KpCv9PXMTeRUMJX2y/kOtGYPetocOug==}
peerDependencies: peerDependencies:
eslint: '>=7.4.0' eslint: '>=7.4.0'
@@ -65,14 +73,14 @@ packages:
eslint-plugin-antfu: 0.35.2_7kw3g6rralp5ps6mg3uyzz6azm eslint-plugin-antfu: 0.35.2_7kw3g6rralp5ps6mg3uyzz6azm
eslint-plugin-eslint-comments: 3.2.0_eslint@8.34.0 eslint-plugin-eslint-comments: 3.2.0_eslint@8.34.0
eslint-plugin-html: 7.1.0 eslint-plugin-html: 7.1.0
eslint-plugin-import: 2.27.5_62tsymtiqxebhmxuag4hg3gx2m eslint-plugin-import: 2.27.5_mcvs2y73sfmcxqzpjj5lr7a2m4
eslint-plugin-jsonc: 2.6.0_eslint@8.34.0 eslint-plugin-jsonc: 2.6.0_eslint@8.34.0
eslint-plugin-markdown: 3.0.0_eslint@8.34.0 eslint-plugin-markdown: 3.0.0_eslint@8.34.0
eslint-plugin-n: 15.6.1_eslint@8.34.0 eslint-plugin-n: 15.6.1_eslint@8.34.0
eslint-plugin-no-only-tests: 3.1.0 eslint-plugin-no-only-tests: 3.1.0
eslint-plugin-promise: 6.1.1_eslint@8.34.0 eslint-plugin-promise: 6.1.1_eslint@8.34.0
eslint-plugin-unicorn: 45.0.2_eslint@8.34.0 eslint-plugin-unicorn: 45.0.2_eslint@8.34.0
eslint-plugin-unused-imports: 2.0.0_b5d7vn5fvb66hlq4xz6bd5gdxm eslint-plugin-unused-imports: 2.0.0_vqeavzxdzk2atb75l6fx3anzpi
eslint-plugin-yml: 1.5.0_eslint@8.34.0 eslint-plugin-yml: 1.5.0_eslint@8.34.0
jsonc-eslint-parser: 2.1.0 jsonc-eslint-parser: 2.1.0
yaml-eslint-parser: 1.1.0 yaml-eslint-parser: 1.1.0
@@ -91,11 +99,11 @@ packages:
eslint: '>=7.4.0' eslint: '>=7.4.0'
typescript: '>=3.9' typescript: '>=3.9'
dependencies: dependencies:
'@antfu/eslint-config-basic': 0.35.2_6ike4423xm2xnh233ikrbff5m4 '@antfu/eslint-config-basic': 0.35.2_khyrr7my4aaa3ssgqabkfgcc24
'@typescript-eslint/eslint-plugin': 5.51.0_z4swst3wuuqk4hlme4ajzslgh4 '@typescript-eslint/eslint-plugin': 5.52.0_6cfvjsbua5ptj65675bqcn6oza
'@typescript-eslint/parser': 5.51.0_7kw3g6rralp5ps6mg3uyzz6azm '@typescript-eslint/parser': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm
eslint: 8.34.0 eslint: 8.34.0
eslint-plugin-jest: 27.2.1_wz3lx5pragqwrk3vwpswr7bnzu eslint-plugin-jest: 27.2.1_7hfwvekd5cgjoxqyvesymwuacm
typescript: 4.9.5 typescript: 4.9.5
transitivePeerDependencies: transitivePeerDependencies:
- eslint-import-resolver-typescript - eslint-import-resolver-typescript
@@ -104,12 +112,12 @@ packages:
- supports-color - supports-color
dev: true dev: true
/@antfu/eslint-config-vue/0.35.2_6ike4423xm2xnh233ikrbff5m4: /@antfu/eslint-config-vue/0.35.2_khyrr7my4aaa3ssgqabkfgcc24:
resolution: {integrity: sha512-98k9D+n0bgr/9OqedAEOsflIWbXz4D92pejXqkUAtnRnB2Nq5dWrrFMJ59oJwTDKnEslpwANlgIXM11qdiTF0Q==} resolution: {integrity: sha512-98k9D+n0bgr/9OqedAEOsflIWbXz4D92pejXqkUAtnRnB2Nq5dWrrFMJ59oJwTDKnEslpwANlgIXM11qdiTF0Q==}
peerDependencies: peerDependencies:
eslint: '>=7.4.0' eslint: '>=7.4.0'
dependencies: dependencies:
'@antfu/eslint-config-basic': 0.35.2_6ike4423xm2xnh233ikrbff5m4 '@antfu/eslint-config-basic': 0.35.2_khyrr7my4aaa3ssgqabkfgcc24
'@antfu/eslint-config-ts': 0.35.2_7kw3g6rralp5ps6mg3uyzz6azm '@antfu/eslint-config-ts': 0.35.2_7kw3g6rralp5ps6mg3uyzz6azm
eslint: 8.34.0 eslint: 8.34.0
eslint-plugin-vue: 9.9.0_eslint@8.34.0 eslint-plugin-vue: 9.9.0_eslint@8.34.0
@@ -129,13 +137,13 @@ packages:
peerDependencies: peerDependencies:
eslint: '>=7.4.0' eslint: '>=7.4.0'
dependencies: dependencies:
'@antfu/eslint-config-vue': 0.35.2_6ike4423xm2xnh233ikrbff5m4 '@antfu/eslint-config-vue': 0.35.2_khyrr7my4aaa3ssgqabkfgcc24
'@typescript-eslint/eslint-plugin': 5.51.0_z4swst3wuuqk4hlme4ajzslgh4 '@typescript-eslint/eslint-plugin': 5.52.0_6cfvjsbua5ptj65675bqcn6oza
'@typescript-eslint/parser': 5.51.0_7kw3g6rralp5ps6mg3uyzz6azm '@typescript-eslint/parser': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm
eslint: 8.34.0 eslint: 8.34.0
eslint-plugin-eslint-comments: 3.2.0_eslint@8.34.0 eslint-plugin-eslint-comments: 3.2.0_eslint@8.34.0
eslint-plugin-html: 7.1.0 eslint-plugin-html: 7.1.0
eslint-plugin-import: 2.27.5_62tsymtiqxebhmxuag4hg3gx2m eslint-plugin-import: 2.27.5_mcvs2y73sfmcxqzpjj5lr7a2m4
eslint-plugin-jsonc: 2.6.0_eslint@8.34.0 eslint-plugin-jsonc: 2.6.0_eslint@8.34.0
eslint-plugin-n: 15.6.1_eslint@8.34.0 eslint-plugin-n: 15.6.1_eslint@8.34.0
eslint-plugin-promise: 6.1.1_eslint@8.34.0 eslint-plugin-promise: 6.1.1_eslint@8.34.0
@@ -753,8 +761,11 @@ packages:
resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==}
dev: true dev: true
/@typescript-eslint/eslint-plugin/5.51.0_z4swst3wuuqk4hlme4ajzslgh4: /@types/web-bluetooth/0.0.16:
resolution: {integrity: sha512-wcAwhEWm1RgNd7dxD/o+nnLW8oH+6RK1OGnmbmkj/GGoDPV1WWMVP0FXYQBivKHdwM1pwii3bt//RC62EriIUQ==} resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==}
/@typescript-eslint/eslint-plugin/5.52.0_6cfvjsbua5ptj65675bqcn6oza:
resolution: {integrity: sha512-lHazYdvYVsBokwCdKOppvYJKaJ4S41CgKBcPvyd0xjZNbvQdhn/pnJlGtQksQ/NhInzdaeaSarlBjDXHuclEbg==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies: peerDependencies:
'@typescript-eslint/parser': ^5.0.0 '@typescript-eslint/parser': ^5.0.0
@@ -764,10 +775,10 @@ packages:
typescript: typescript:
optional: true optional: true
dependencies: dependencies:
'@typescript-eslint/parser': 5.51.0_7kw3g6rralp5ps6mg3uyzz6azm '@typescript-eslint/parser': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm
'@typescript-eslint/scope-manager': 5.51.0 '@typescript-eslint/scope-manager': 5.52.0
'@typescript-eslint/type-utils': 5.51.0_7kw3g6rralp5ps6mg3uyzz6azm '@typescript-eslint/type-utils': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm
'@typescript-eslint/utils': 5.51.0_7kw3g6rralp5ps6mg3uyzz6azm '@typescript-eslint/utils': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm
debug: 4.3.4 debug: 4.3.4
eslint: 8.34.0 eslint: 8.34.0
grapheme-splitter: 1.0.4 grapheme-splitter: 1.0.4
@@ -781,8 +792,8 @@ packages:
- supports-color - supports-color
dev: true dev: true
/@typescript-eslint/parser/5.51.0_7kw3g6rralp5ps6mg3uyzz6azm: /@typescript-eslint/parser/5.52.0_7kw3g6rralp5ps6mg3uyzz6azm:
resolution: {integrity: sha512-fEV0R9gGmfpDeRzJXn+fGQKcl0inIeYobmmUWijZh9zA7bxJ8clPhV9up2ZQzATxAiFAECqPQyMDB4o4B81AaA==} resolution: {integrity: sha512-e2KiLQOZRo4Y0D/b+3y08i3jsekoSkOYStROYmPUnGMEoA0h+k2qOH5H6tcjIc68WDvGwH+PaOrP1XRzLJ6QlA==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies: peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
@@ -791,9 +802,9 @@ packages:
typescript: typescript:
optional: true optional: true
dependencies: dependencies:
'@typescript-eslint/scope-manager': 5.51.0 '@typescript-eslint/scope-manager': 5.52.0
'@typescript-eslint/types': 5.51.0 '@typescript-eslint/types': 5.52.0
'@typescript-eslint/typescript-estree': 5.51.0_typescript@4.9.5 '@typescript-eslint/typescript-estree': 5.52.0_typescript@4.9.5
debug: 4.3.4 debug: 4.3.4
eslint: 8.34.0 eslint: 8.34.0
typescript: 4.9.5 typescript: 4.9.5
@@ -801,16 +812,16 @@ packages:
- supports-color - supports-color
dev: true dev: true
/@typescript-eslint/scope-manager/5.51.0: /@typescript-eslint/scope-manager/5.52.0:
resolution: {integrity: sha512-gNpxRdlx5qw3yaHA0SFuTjW4rxeYhpHxt491PEcKF8Z6zpq0kMhe0Tolxt0qjlojS+/wArSDlj/LtE69xUJphQ==} resolution: {integrity: sha512-AR7sxxfBKiNV0FWBSARxM8DmNxrwgnYMPwmpkC1Pl1n+eT8/I2NAUPuwDy/FmDcC6F8pBfmOcaxcxRHspgOBMw==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dependencies: dependencies:
'@typescript-eslint/types': 5.51.0 '@typescript-eslint/types': 5.52.0
'@typescript-eslint/visitor-keys': 5.51.0 '@typescript-eslint/visitor-keys': 5.52.0
dev: true dev: true
/@typescript-eslint/type-utils/5.51.0_7kw3g6rralp5ps6mg3uyzz6azm: /@typescript-eslint/type-utils/5.52.0_7kw3g6rralp5ps6mg3uyzz6azm:
resolution: {integrity: sha512-QHC5KKyfV8sNSyHqfNa0UbTbJ6caB8uhcx2hYcWVvJAZYJRBo5HyyZfzMdRx8nvS+GyMg56fugMzzWnojREuQQ==} resolution: {integrity: sha512-tEKuUHfDOv852QGlpPtB3lHOoig5pyFQN/cUiZtpw99D93nEBjexRLre5sQZlkMoHry/lZr8qDAt2oAHLKA6Jw==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies: peerDependencies:
eslint: '*' eslint: '*'
@@ -819,8 +830,8 @@ packages:
typescript: typescript:
optional: true optional: true
dependencies: dependencies:
'@typescript-eslint/typescript-estree': 5.51.0_typescript@4.9.5 '@typescript-eslint/typescript-estree': 5.52.0_typescript@4.9.5
'@typescript-eslint/utils': 5.51.0_7kw3g6rralp5ps6mg3uyzz6azm '@typescript-eslint/utils': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm
debug: 4.3.4 debug: 4.3.4
eslint: 8.34.0 eslint: 8.34.0
tsutils: 3.21.0_typescript@4.9.5 tsutils: 3.21.0_typescript@4.9.5
@@ -829,13 +840,13 @@ packages:
- supports-color - supports-color
dev: true dev: true
/@typescript-eslint/types/5.51.0: /@typescript-eslint/types/5.52.0:
resolution: {integrity: sha512-SqOn0ANn/v6hFn0kjvLwiDi4AzR++CBZz0NV5AnusT2/3y32jdc0G4woXPWHCumWtUXZKPAS27/9vziSsC9jnw==} resolution: {integrity: sha512-oV7XU4CHYfBhk78fS7tkum+/Dpgsfi91IIDy7fjCyq2k6KB63M6gMC0YIvy+iABzmXThCRI6xpCEyVObBdWSDQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dev: true dev: true
/@typescript-eslint/typescript-estree/5.51.0_typescript@4.9.5: /@typescript-eslint/typescript-estree/5.52.0_typescript@4.9.5:
resolution: {integrity: sha512-TSkNupHvNRkoH9FMA3w7TazVFcBPveAAmb7Sz+kArY6sLT86PA5Vx80cKlYmd8m3Ha2SwofM1KwraF24lM9FvA==} resolution: {integrity: sha512-WeWnjanyEwt6+fVrSR0MYgEpUAuROxuAH516WPjUblIrClzYJj0kBbjdnbQXLpgAN8qbEuGywiQsXUVDiAoEuQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies: peerDependencies:
typescript: '*' typescript: '*'
@@ -843,8 +854,8 @@ packages:
typescript: typescript:
optional: true optional: true
dependencies: dependencies:
'@typescript-eslint/types': 5.51.0 '@typescript-eslint/types': 5.52.0
'@typescript-eslint/visitor-keys': 5.51.0 '@typescript-eslint/visitor-keys': 5.52.0
debug: 4.3.4 debug: 4.3.4
globby: 11.1.0 globby: 11.1.0
is-glob: 4.0.3 is-glob: 4.0.3
@@ -855,17 +866,17 @@ packages:
- supports-color - supports-color
dev: true dev: true
/@typescript-eslint/utils/5.51.0_7kw3g6rralp5ps6mg3uyzz6azm: /@typescript-eslint/utils/5.52.0_7kw3g6rralp5ps6mg3uyzz6azm:
resolution: {integrity: sha512-76qs+5KWcaatmwtwsDJvBk4H76RJQBFe+Gext0EfJdC3Vd2kpY2Pf//OHHzHp84Ciw0/rYoGTDnIAr3uWhhJYw==} resolution: {integrity: sha512-As3lChhrbwWQLNk2HC8Ree96hldKIqk98EYvypd3It8Q1f8d5zWyIoaZEp2va5667M4ZyE7X8UUR+azXrFl+NA==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies: peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
dependencies: dependencies:
'@types/json-schema': 7.0.11 '@types/json-schema': 7.0.11
'@types/semver': 7.3.13 '@types/semver': 7.3.13
'@typescript-eslint/scope-manager': 5.51.0 '@typescript-eslint/scope-manager': 5.52.0
'@typescript-eslint/types': 5.51.0 '@typescript-eslint/types': 5.52.0
'@typescript-eslint/typescript-estree': 5.51.0_typescript@4.9.5 '@typescript-eslint/typescript-estree': 5.52.0_typescript@4.9.5
eslint: 8.34.0 eslint: 8.34.0
eslint-scope: 5.1.1 eslint-scope: 5.1.1
eslint-utils: 3.0.0_eslint@8.34.0 eslint-utils: 3.0.0_eslint@8.34.0
@@ -875,11 +886,11 @@ packages:
- typescript - typescript
dev: true dev: true
/@typescript-eslint/visitor-keys/5.51.0: /@typescript-eslint/visitor-keys/5.52.0:
resolution: {integrity: sha512-Oh2+eTdjHjOFjKA27sxESlA87YPSOJafGCR0md5oeMdh1ZcCfAGCIOL216uTBAkAIptvLIfKQhl7lHxMJet4GQ==} resolution: {integrity: sha512-qMwpw6SU5VHCPr99y274xhbm+PRViK/NATY6qzt+Et7+mThGuFSl/ompj2/hrBlRP/kq+BFdgagnOSgw9TB0eA==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dependencies: dependencies:
'@typescript-eslint/types': 5.51.0 '@typescript-eslint/types': 5.52.0
eslint-visitor-keys: 3.3.0 eslint-visitor-keys: 3.3.0
dev: true dev: true
@@ -890,47 +901,47 @@ packages:
vite: ^4.0.0 vite: ^4.0.0
vue: ^3.2.25 vue: ^3.2.25
dependencies: dependencies:
vite: 4.1.1_@types+node@18.13.0 vite: 4.1.1_edl3ajnhen4c5iqs57t4gqrzly
vue: 3.2.47 vue: 3.2.47
dev: true dev: true
/@volar/language-core/1.0.24: /@volar/language-core/1.2.0-alpha.11:
resolution: {integrity: sha512-vTN+alJiWwK0Pax6POqrmevbtFW2dXhjwWiW/MW4f48eDYPLdyURWcr8TixO7EN/nHsUBj2udT7igFKPtjyAKg==} resolution: {integrity: sha512-OfbPmmFa4LUA8kJCg77V9ud4NASjJ3VKJ79QCQSfHa5SwXeZ5w7lvQe2yILFBjZ3JDB5EfFnHZUSct6ziK3x5Q==}
dependencies: dependencies:
'@volar/source-map': 1.0.24 '@volar/source-map': 1.2.0-alpha.11
muggle-string: 0.1.0
dev: true dev: true
/@volar/source-map/1.0.24: /@volar/source-map/1.2.0-alpha.11:
resolution: {integrity: sha512-Qsv/tkplx18pgBr8lKAbM1vcDqgkGKQzbChg6NW+v0CZc3G7FLmK+WrqEPzKlN7Cwdc6XVL559Nod8WKAfKr4A==} resolution: {integrity: sha512-GCRqcq2bn8Gf9N/qbdl8GgfGbmYuuSIB8arhl+gRZfCIWvT5NhIRVlG5GX0lkgpp02lA8ZYWZ0GLGOkwz7+DMQ==}
dependencies: dependencies:
muggle-string: 0.1.0 muggle-string: 0.2.2
dev: true dev: true
/@volar/typescript/1.0.24: /@volar/typescript/1.2.0-alpha.11:
resolution: {integrity: sha512-f8hCSk+PfKR1/RQHxZ79V1NpDImHoivqoizK+mstphm25tn/YJ/JnKNjZHB+o21fuW0yKlI26NV3jkVb2Cc/7A==} resolution: {integrity: sha512-tJ20326E/Xi1lvvuWX57boVJtzhStNF3HjBu4orjl9PqCXUbhqWwP+jRYzyb+nLbHqGPmEBvHKYjAO3GsJ/YXg==}
dependencies: dependencies:
'@volar/language-core': 1.0.24 '@volar/language-core': 1.2.0-alpha.11
dev: true dev: true
/@volar/vue-language-core/1.0.24: /@volar/vue-language-core/1.1.0:
resolution: {integrity: sha512-2NTJzSgrwKu6uYwPqLiTMuAzi7fAY3yFy5PJ255bGJc82If0Xr+cW8pC80vpjG0D/aVLmlwAdO4+Ya2BI8GdDg==} resolution: {integrity: sha512-1zTAyeGiyNKYE9s+i3dUpmuvY/Cz1U7LjIh9d5FX3p0NWpaBrzYvSh0gQY+nRaz67or7Y9qYSUCaHLKOmeolzg==}
dependencies: dependencies:
'@volar/language-core': 1.0.24 '@volar/language-core': 1.2.0-alpha.11
'@volar/source-map': 1.0.24 '@volar/source-map': 1.2.0-alpha.11
'@vue/compiler-dom': 3.2.47 '@vue/compiler-dom': 3.2.47
'@vue/compiler-sfc': 3.2.47 '@vue/compiler-sfc': 3.2.47
'@vue/reactivity': 3.2.47 '@vue/reactivity': 3.2.47
'@vue/shared': 3.2.47 '@vue/shared': 3.2.47
minimatch: 5.1.6 minimatch: 6.2.0
muggle-string: 0.2.2
vue-template-compiler: 2.7.14 vue-template-compiler: 2.7.14
dev: true dev: true
/@volar/vue-typescript/1.0.24: /@volar/vue-typescript/1.1.0:
resolution: {integrity: sha512-9a25oHDvGaNC0okRS47uqJI6FxY4hUQZUsxeOUFHcqVxZEv8s17LPuP/pMMXyz7jPygrZubB/qXqHY5jEu/akA==} resolution: {integrity: sha512-smtfaePuNpVzXEypJayORtl8muvBdtV1FDWjces1WLYbbtcnmfWtdACW9xY0dkVk0LoE/LZTEmLBCQrRJ6hS1w==}
dependencies: dependencies:
'@volar/typescript': 1.0.24 '@volar/typescript': 1.2.0-alpha.11
'@volar/vue-language-core': 1.0.24 '@volar/vue-language-core': 1.1.0
dev: true dev: true
/@vue/compiler-core/3.2.47: /@vue/compiler-core/3.2.47:
@@ -1010,6 +1021,31 @@ packages:
/@vue/shared/3.2.47: /@vue/shared/3.2.47:
resolution: {integrity: sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==} resolution: {integrity: sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==}
/@vueuse/core/9.12.0_vue@3.2.47:
resolution: {integrity: sha512-h/Di8Bvf6xRcvS/PvUVheiMYYz3U0tH3X25YxONSaAUBa841ayMwxkuzx/DGUMCW/wHWzD8tRy2zYmOC36r4sg==}
dependencies:
'@types/web-bluetooth': 0.0.16
'@vueuse/metadata': 9.12.0
'@vueuse/shared': 9.12.0_vue@3.2.47
vue-demi: 0.13.11_vue@3.2.47
transitivePeerDependencies:
- '@vue/composition-api'
- vue
dev: false
/@vueuse/metadata/9.12.0:
resolution: {integrity: sha512-9oJ9MM9lFLlmvxXUqsR1wLt1uF7EVbP5iYaHJYqk+G2PbMjY6EXvZeTjbdO89HgoF5cI6z49o2zT/jD9SVoNpQ==}
dev: false
/@vueuse/shared/9.12.0_vue@3.2.47:
resolution: {integrity: sha512-TWuJLACQ0BVithVTRbex4Wf1a1VaRuSpVeyEd4vMUWl54PzlE0ciFUshKCXnlLuD0lxIaLK4Ypj3NXYzZh4+SQ==}
dependencies:
vue-demi: 0.13.11_vue@3.2.47
transitivePeerDependencies:
- '@vue/composition-api'
- vue
dev: false
/JSONStream/1.3.5: /JSONStream/1.3.5:
resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==}
hasBin: true hasBin: true
@@ -1204,7 +1240,7 @@ packages:
postcss: ^8.1.0 postcss: ^8.1.0
dependencies: dependencies:
browserslist: 4.21.5 browserslist: 4.21.5
caniuse-lite: 1.0.30001451 caniuse-lite: 1.0.30001452
fraction.js: 4.2.0 fraction.js: 4.2.0
normalize-range: 0.1.2 normalize-range: 0.1.2
picocolors: 1.0.0 picocolors: 1.0.0
@@ -1217,8 +1253,8 @@ packages:
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
dev: true dev: true
/axios/1.3.2: /axios/1.3.3:
resolution: {integrity: sha512-1M3O703bYqYuPhbHeya5bnhpYVsDDRyQSabNja04mZtboLNSuZ4YrltestrLXfHgmzua4TpUqRiVKbiQuo2epw==} resolution: {integrity: sha512-eYq77dYIFS77AQlhzEL937yUBSepBfPIe8FcgEDN35vMNZKMrs81pgnyrQpwfy4NF4b4XWX1Zgx7yX+25w8QJA==}
dependencies: dependencies:
follow-redirects: 1.15.2 follow-redirects: 1.15.2
form-data: 4.0.0 form-data: 4.0.0
@@ -1265,8 +1301,8 @@ packages:
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
hasBin: true hasBin: true
dependencies: dependencies:
caniuse-lite: 1.0.30001451 caniuse-lite: 1.0.30001452
electron-to-chromium: 1.4.295 electron-to-chromium: 1.4.296
node-releases: 2.0.10 node-releases: 2.0.10
update-browserslist-db: 1.0.10_browserslist@4.21.5 update-browserslist-db: 1.0.10_browserslist@4.21.5
dev: true dev: true
@@ -1313,8 +1349,8 @@ packages:
engines: {node: '>=6'} engines: {node: '>=6'}
dev: true dev: true
/caniuse-lite/1.0.30001451: /caniuse-lite/1.0.30001452:
resolution: {integrity: sha512-XY7UbUpGRatZzoRft//5xOa69/1iGJRBlrieH6QYrkKLIFn3m7OVEJ81dSrKoy2BnKsdbX5cLrOispZNYo9v2w==} resolution: {integrity: sha512-Lkp0vFjMkBB3GTpLR8zk4NwW5EdRdnitwYJHDOOKIU85x4ckYCPQ+9WlVvSVClHxVReefkUMtWZH2l9KGlD51w==}
dev: true dev: true
/chalk/2.4.2: /chalk/2.4.2:
@@ -1488,6 +1524,12 @@ packages:
through2: 4.0.2 through2: 4.0.2
dev: true dev: true
/copy-anything/2.0.6:
resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==}
dependencies:
is-what: 3.14.1
dev: true
/cosmiconfig-typescript-loader/4.3.0_p7cp6dsfhdrlk7mvuxd3wodbsu: /cosmiconfig-typescript-loader/4.3.0_p7cp6dsfhdrlk7mvuxd3wodbsu:
resolution: {integrity: sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q==} resolution: {integrity: sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q==}
engines: {node: '>=12', npm: '>=6'} engines: {node: '>=12', npm: '>=6'}
@@ -1722,8 +1764,8 @@ packages:
resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
dev: true dev: true
/electron-to-chromium/1.4.295: /electron-to-chromium/1.4.296:
resolution: {integrity: sha512-lEO94zqf1bDA3aepxwnWoHUjA8sZ+2owgcSZjYQy0+uOSEclJX0VieZC+r+wLpSxUHRd6gG32znTWmr+5iGzFw==} resolution: {integrity: sha512-i/6Q+Y9bluDa2a0NbMvdtG5TuS/1Fr3TKK8L+7UUL9QjRS5iFJzCC3r70xjyOnLiYG8qGV4/mMpe6HuAbdJW4w==}
dev: true dev: true
/emoji-regex/8.0.0: /emoji-regex/8.0.0:
@@ -1739,6 +1781,15 @@ packages:
engines: {node: '>=0.12'} engines: {node: '>=0.12'}
dev: true dev: true
/errno/0.1.8:
resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==}
hasBin: true
requiresBuild: true
dependencies:
prr: 1.0.1
dev: true
optional: true
/error-ex/1.3.2: /error-ex/1.3.2:
resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
dependencies: dependencies:
@@ -1863,7 +1914,7 @@ packages:
- supports-color - supports-color
dev: true dev: true
/eslint-module-utils/2.7.4_ithmlgmaospkvl4p7n7pyp3rgq: /eslint-module-utils/2.7.4_npjqex3ey3rgd34fjcuucz7la4:
resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==}
engines: {node: '>=4'} engines: {node: '>=4'}
peerDependencies: peerDependencies:
@@ -1884,7 +1935,7 @@ packages:
eslint-import-resolver-webpack: eslint-import-resolver-webpack:
optional: true optional: true
dependencies: dependencies:
'@typescript-eslint/parser': 5.51.0_7kw3g6rralp5ps6mg3uyzz6azm '@typescript-eslint/parser': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm
debug: 3.2.7 debug: 3.2.7
eslint: 8.34.0 eslint: 8.34.0
eslint-import-resolver-node: 0.3.7 eslint-import-resolver-node: 0.3.7
@@ -1895,7 +1946,7 @@ packages:
/eslint-plugin-antfu/0.35.2_7kw3g6rralp5ps6mg3uyzz6azm: /eslint-plugin-antfu/0.35.2_7kw3g6rralp5ps6mg3uyzz6azm:
resolution: {integrity: sha512-Q6FOcOakafU49PDRlq7jkrWmlTJ4u3AW7aGX+FqeQNaMgjXq0RzPGvS0Vyp7q/XDRLLoe0BjbGkamTeZXg8waw==} resolution: {integrity: sha512-Q6FOcOakafU49PDRlq7jkrWmlTJ4u3AW7aGX+FqeQNaMgjXq0RzPGvS0Vyp7q/XDRLLoe0BjbGkamTeZXg8waw==}
dependencies: dependencies:
'@typescript-eslint/utils': 5.51.0_7kw3g6rralp5ps6mg3uyzz6azm '@typescript-eslint/utils': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm
transitivePeerDependencies: transitivePeerDependencies:
- eslint - eslint
- supports-color - supports-color
@@ -1930,7 +1981,7 @@ packages:
htmlparser2: 8.0.1 htmlparser2: 8.0.1
dev: true dev: true
/eslint-plugin-import/2.27.5_62tsymtiqxebhmxuag4hg3gx2m: /eslint-plugin-import/2.27.5_mcvs2y73sfmcxqzpjj5lr7a2m4:
resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==}
engines: {node: '>=4'} engines: {node: '>=4'}
peerDependencies: peerDependencies:
@@ -1940,7 +1991,7 @@ packages:
'@typescript-eslint/parser': '@typescript-eslint/parser':
optional: true optional: true
dependencies: dependencies:
'@typescript-eslint/parser': 5.51.0_7kw3g6rralp5ps6mg3uyzz6azm '@typescript-eslint/parser': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm
array-includes: 3.1.6 array-includes: 3.1.6
array.prototype.flat: 1.3.1 array.prototype.flat: 1.3.1
array.prototype.flatmap: 1.3.1 array.prototype.flatmap: 1.3.1
@@ -1948,7 +1999,7 @@ packages:
doctrine: 2.1.0 doctrine: 2.1.0
eslint: 8.34.0 eslint: 8.34.0
eslint-import-resolver-node: 0.3.7 eslint-import-resolver-node: 0.3.7
eslint-module-utils: 2.7.4_ithmlgmaospkvl4p7n7pyp3rgq eslint-module-utils: 2.7.4_npjqex3ey3rgd34fjcuucz7la4
has: 1.0.3 has: 1.0.3
is-core-module: 2.11.0 is-core-module: 2.11.0
is-glob: 4.0.3 is-glob: 4.0.3
@@ -1963,7 +2014,7 @@ packages:
- supports-color - supports-color
dev: true dev: true
/eslint-plugin-jest/27.2.1_wz3lx5pragqwrk3vwpswr7bnzu: /eslint-plugin-jest/27.2.1_7hfwvekd5cgjoxqyvesymwuacm:
resolution: {integrity: sha512-l067Uxx7ZT8cO9NJuf+eJHvt6bqJyz2Z29wykyEdz/OtmcELQl2MQGQLX8J94O1cSJWAwUSEvCjwjA7KEK3Hmg==} resolution: {integrity: sha512-l067Uxx7ZT8cO9NJuf+eJHvt6bqJyz2Z29wykyEdz/OtmcELQl2MQGQLX8J94O1cSJWAwUSEvCjwjA7KEK3Hmg==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
peerDependencies: peerDependencies:
@@ -1976,8 +2027,8 @@ packages:
jest: jest:
optional: true optional: true
dependencies: dependencies:
'@typescript-eslint/eslint-plugin': 5.51.0_z4swst3wuuqk4hlme4ajzslgh4 '@typescript-eslint/eslint-plugin': 5.52.0_6cfvjsbua5ptj65675bqcn6oza
'@typescript-eslint/utils': 5.51.0_7kw3g6rralp5ps6mg3uyzz6azm '@typescript-eslint/utils': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm
eslint: 8.34.0 eslint: 8.34.0
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -2064,7 +2115,7 @@ packages:
strip-indent: 3.0.0 strip-indent: 3.0.0
dev: true dev: true
/eslint-plugin-unused-imports/2.0.0_b5d7vn5fvb66hlq4xz6bd5gdxm: /eslint-plugin-unused-imports/2.0.0_vqeavzxdzk2atb75l6fx3anzpi:
resolution: {integrity: sha512-3APeS/tQlTrFa167ThtP0Zm0vctjr4M44HMpeg1P4bK6wItarumq0Ma82xorMKdFsWpphQBlRPzw/pxiVELX1A==} resolution: {integrity: sha512-3APeS/tQlTrFa167ThtP0Zm0vctjr4M44HMpeg1P4bK6wItarumq0Ma82xorMKdFsWpphQBlRPzw/pxiVELX1A==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies: peerDependencies:
@@ -2074,7 +2125,7 @@ packages:
'@typescript-eslint/eslint-plugin': '@typescript-eslint/eslint-plugin':
optional: true optional: true
dependencies: dependencies:
'@typescript-eslint/eslint-plugin': 5.51.0_z4swst3wuuqk4hlme4ajzslgh4 '@typescript-eslint/eslint-plugin': 5.52.0_6cfvjsbua5ptj65675bqcn6oza
eslint: 8.34.0 eslint: 8.34.0
eslint-rule-composer: 0.3.0 eslint-rule-composer: 0.3.0
dev: true dev: true
@@ -2632,11 +2683,27 @@ packages:
hasBin: true hasBin: true
dev: true dev: true
/iconv-lite/0.6.3:
resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
engines: {node: '>=0.10.0'}
dependencies:
safer-buffer: 2.1.2
dev: true
optional: true
/ignore/5.2.4: /ignore/5.2.4:
resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==}
engines: {node: '>= 4'} engines: {node: '>= 4'}
dev: true dev: true
/image-size/0.5.5:
resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==}
engines: {node: '>=0.10.0'}
hasBin: true
requiresBuild: true
dev: true
optional: true
/import-fresh/3.3.0: /import-fresh/3.3.0:
resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
engines: {node: '>=6'} engines: {node: '>=6'}
@@ -2872,6 +2939,10 @@ packages:
call-bind: 1.0.2 call-bind: 1.0.2
dev: true dev: true
/is-what/3.14.1:
resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==}
dev: true
/isexe/2.0.0: /isexe/2.0.0:
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
dev: true dev: true
@@ -2957,6 +3028,26 @@ packages:
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
dev: true dev: true
/less/4.1.3:
resolution: {integrity: sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==}
engines: {node: '>=6'}
hasBin: true
dependencies:
copy-anything: 2.0.6
parse-node-version: 1.0.1
tslib: 2.5.0
optionalDependencies:
errno: 0.1.8
graceful-fs: 4.2.10
image-size: 0.5.5
make-dir: 2.1.0
mime: 1.6.0
needle: 3.2.0
source-map: 0.6.1
transitivePeerDependencies:
- supports-color
dev: true
/levn/0.4.1: /levn/0.4.1:
resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
engines: {node: '>= 0.8.0'} engines: {node: '>= 0.8.0'}
@@ -2974,8 +3065,8 @@ packages:
resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
dev: true dev: true
/lint-staged/13.1.1: /lint-staged/13.1.2:
resolution: {integrity: sha512-LLJLO0Kdbcv2a+CvSF4p1M7jBZOajKSMpBUvyR8+bXccsqPER0/NxTFQSpNHjqwV9kM3tkHczYerTB5wI+bksQ==} resolution: {integrity: sha512-K9b4FPbWkpnupvK3WXZLbgu9pchUJ6N7TtVZjbaPsoizkqFUDkUReUL25xdrCljJs7uLUF3tZ7nVPeo/6lp+6w==}
engines: {node: ^14.13.1 || >=16.0.0} engines: {node: ^14.13.1 || >=16.0.0}
hasBin: true hasBin: true
dependencies: dependencies:
@@ -3114,6 +3205,16 @@ packages:
dependencies: dependencies:
sourcemap-codec: 1.4.8 sourcemap-codec: 1.4.8
/make-dir/2.1.0:
resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==}
engines: {node: '>=6'}
requiresBuild: true
dependencies:
pify: 4.0.1
semver: 5.7.1
dev: true
optional: true
/make-error/1.3.6: /make-error/1.3.6:
resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==}
dev: true dev: true
@@ -3204,6 +3305,14 @@ packages:
mime-db: 1.52.0 mime-db: 1.52.0
dev: true dev: true
/mime/1.6.0:
resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
engines: {node: '>=4'}
hasBin: true
requiresBuild: true
dev: true
optional: true
/mimic-fn/2.1.0: /mimic-fn/2.1.0:
resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
engines: {node: '>=6'} engines: {node: '>=6'}
@@ -3225,8 +3334,8 @@ packages:
brace-expansion: 1.1.11 brace-expansion: 1.1.11
dev: true dev: true
/minimatch/5.1.6: /minimatch/6.2.0:
resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} resolution: {integrity: sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg==}
engines: {node: '>=10'} engines: {node: '>=10'}
dependencies: dependencies:
brace-expansion: 2.0.1 brace-expansion: 2.0.1
@@ -3253,8 +3362,8 @@ packages:
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
dev: true dev: true
/muggle-string/0.1.0: /muggle-string/0.2.2:
resolution: {integrity: sha512-Tr1knR3d2mKvvWthlk7202rywKbiOm4rVFLsfAaSIhJ6dt9o47W4S+JMtWhd/PW9Wrdew2/S2fSvhz3E2gkfEg==} resolution: {integrity: sha512-YVE1mIJ4VpUMqZObFndk9CJu6DBJR/GB13p3tXuNbwD4XExaI5EOuRl6BHeIDxIqXZVxSfAC+y6U1Z/IxCfKUg==}
dev: true dev: true
/naive-ui/2.34.3_vue@3.2.47: /naive-ui/2.34.3_vue@3.2.47:
@@ -3296,6 +3405,20 @@ packages:
resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
dev: true dev: true
/needle/3.2.0:
resolution: {integrity: sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==}
engines: {node: '>= 4.4.x'}
hasBin: true
requiresBuild: true
dependencies:
debug: 3.2.7
iconv-lite: 0.6.3
sax: 1.2.4
transitivePeerDependencies:
- supports-color
dev: true
optional: true
/nice-try/1.0.5: /nice-try/1.0.5:
resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==}
dev: true dev: true
@@ -3510,6 +3633,11 @@ packages:
lines-and-columns: 1.2.4 lines-and-columns: 1.2.4
dev: true dev: true
/parse-node-version/1.0.1:
resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==}
engines: {node: '>= 0.10'}
dev: true
/path-exists/4.0.0: /path-exists/4.0.0:
resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
engines: {node: '>=8'} engines: {node: '>=8'}
@@ -3581,6 +3709,12 @@ packages:
engines: {node: '>=4'} engines: {node: '>=4'}
dev: true dev: true
/pify/4.0.1:
resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==}
engines: {node: '>=6'}
dev: true
optional: true
/pinia/2.0.30_hmuptsblhheur2tugfgucj7gc4: /pinia/2.0.30_hmuptsblhheur2tugfgucj7gc4:
resolution: {integrity: sha512-q6DUmxWwe/mQgg+55QQjykpKC+aGeGdaJV3niminl19V08dE+LRTvSEuqi6/NLSGCKHI49KGL6tMNEOssFiMyA==} resolution: {integrity: sha512-q6DUmxWwe/mQgg+55QQjykpKC+aGeGdaJV3niminl19V08dE+LRTvSEuqi6/NLSGCKHI49KGL6tMNEOssFiMyA==}
peerDependencies: peerDependencies:
@@ -3682,6 +3816,11 @@ packages:
resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
dev: true dev: true
/prr/1.0.1:
resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==}
dev: true
optional: true
/punycode/2.3.0: /punycode/2.3.0:
resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==}
engines: {node: '>=6'} engines: {node: '>=6'}
@@ -3894,6 +4033,16 @@ packages:
regexp-tree: 0.1.24 regexp-tree: 0.1.24
dev: true dev: true
/safer-buffer/2.1.2:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
dev: true
optional: true
/sax/1.2.4:
resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==}
dev: true
optional: true
/seemly/0.3.6: /seemly/0.3.6:
resolution: {integrity: sha512-lEV5VB8BUKTo/AfktXJcy+JeXns26ylbMkIUco8CYREsQijuz4mrXres2Q+vMLdwkuLxJdIPQ8IlCIxLYm71Yw==} resolution: {integrity: sha512-lEV5VB8BUKTo/AfktXJcy+JeXns26ylbMkIUco8CYREsQijuz4mrXres2Q+vMLdwkuLxJdIPQ8IlCIxLYm71Yw==}
dev: false dev: false
@@ -4378,7 +4527,7 @@ packages:
vue: 3.2.47 vue: 3.2.47
dev: false dev: false
/vite/4.1.1_@types+node@18.13.0: /vite/4.1.1_edl3ajnhen4c5iqs57t4gqrzly:
resolution: {integrity: sha512-LM9WWea8vsxhr782r9ntg+bhSFS06FJgCvvB0+8hf8UWtvaiDagKYWXndjfX6kGl74keHJUcpzrQliDXZlF5yg==} resolution: {integrity: sha512-LM9WWea8vsxhr782r9ntg+bhSFS06FJgCvvB0+8hf8UWtvaiDagKYWXndjfX6kGl74keHJUcpzrQliDXZlF5yg==}
engines: {node: ^14.18.0 || >=16.0.0} engines: {node: ^14.18.0 || >=16.0.0}
hasBin: true hasBin: true
@@ -4405,6 +4554,7 @@ packages:
dependencies: dependencies:
'@types/node': 18.13.0 '@types/node': 18.13.0
esbuild: 0.16.17 esbuild: 0.16.17
less: 4.1.3
postcss: 8.4.21 postcss: 8.4.21
resolve: 1.22.1 resolve: 1.22.1
rollup: 3.15.0 rollup: 3.15.0
@@ -4470,14 +4620,14 @@ packages:
he: 1.2.0 he: 1.2.0
dev: true dev: true
/vue-tsc/1.0.24_typescript@4.9.5: /vue-tsc/1.1.0_typescript@4.9.5:
resolution: {integrity: sha512-mmU1s5SAqE1nByQAiQnao9oU4vX+mSdsgI8H57SfKH6UVzq/jP9+Dbi2GaV+0b4Cn361d2ln8m6xeU60ApiEXg==} resolution: {integrity: sha512-+JqTcuScA6OfyaVH3ezeCh2i2wRgzUScZ6EdTZ3AW69Nb+rmRyOAxmAjL6MPam8YCdwmmdfAUhmN/BNGVp5vQg==}
hasBin: true hasBin: true
peerDependencies: peerDependencies:
typescript: '*' typescript: '*'
dependencies: dependencies:
'@volar/vue-language-core': 1.0.24 '@volar/vue-language-core': 1.1.0
'@volar/vue-typescript': 1.0.24 '@volar/vue-typescript': 1.1.0
typescript: 4.9.5 typescript: 4.9.5
dev: true dev: true

View File

@@ -1,3 +1,2 @@
# OpenAI API Key - https://platform.openai.com/overview # OpenAI API Key - https://platform.openai.com/overview
# e.g: This key is invalid OPENAI_API_KEY=
OPENAI_API_KEY='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'

View File

@@ -11,7 +11,7 @@
"express" "express"
], ],
"engines": { "engines": {
"node": ">=18.0.0" "node": "^16 || ^18"
}, },
"scripts": { "scripts": {
"start": "esno ./src/index.ts", "start": "esno ./src/index.ts",
@@ -19,19 +19,21 @@
"build": "pnpm clean && tsup", "build": "pnpm clean && tsup",
"clean": "rimraf build", "clean": "rimraf build",
"lint": "eslint .", "lint": "eslint .",
"lint:fix": "eslint . --fix" "lint:fix": "eslint . --fix",
"common:cleanup": "rimraf node_modules && rimraf pnpm-lock.yaml"
}, },
"dependencies": { "dependencies": {
"chatgpt": "^4.3.2", "chatgpt": "^4.3.2",
"express": "^4.18.2" "dotenv": "^16.0.3",
"esno": "^0.16.3",
"express": "^4.18.2",
"isomorphic-fetch": "^3.0.0"
}, },
"devDependencies": { "devDependencies": {
"@antfu/eslint-config": "^0.35.2", "@antfu/eslint-config": "^0.35.2",
"@types/express": "^4.17.17", "@types/express": "^4.17.17",
"@types/node": "^18.13.0", "@types/node": "^18.13.0",
"dotenv": "^16.0.3",
"eslint": "^8.34.0", "eslint": "^8.34.0",
"esno": "^0.16.3",
"rimraf": "^4.1.2", "rimraf": "^4.1.2",
"tsup": "^6.6.2", "tsup": "^6.6.2",
"typescript": "^4.9.5" "typescript": "^4.9.5"

364
service/pnpm-lock.yaml generated
View File

@@ -9,28 +9,30 @@ specifiers:
eslint: ^8.34.0 eslint: ^8.34.0
esno: ^0.16.3 esno: ^0.16.3
express: ^4.18.2 express: ^4.18.2
isomorphic-fetch: ^3.0.0
rimraf: ^4.1.2 rimraf: ^4.1.2
tsup: ^6.6.2 tsup: ^6.6.2
typescript: ^4.9.5 typescript: ^4.9.5
dependencies: dependencies:
chatgpt: 4.3.2 chatgpt: 4.4.0
dotenv: 16.0.3
esno: 0.16.3
express: 4.18.2 express: 4.18.2
isomorphic-fetch: 3.0.0
devDependencies: devDependencies:
'@antfu/eslint-config': 0.35.2_7kw3g6rralp5ps6mg3uyzz6azm '@antfu/eslint-config': 0.35.2_7kw3g6rralp5ps6mg3uyzz6azm
'@types/express': 4.17.17 '@types/express': 4.17.17
'@types/node': 18.13.0 '@types/node': 18.13.0
dotenv: 16.0.3
eslint: 8.34.0 eslint: 8.34.0
esno: 0.16.3
rimraf: 4.1.2 rimraf: 4.1.2
tsup: 6.6.2_typescript@4.9.5 tsup: 6.6.3_typescript@4.9.5
typescript: 4.9.5 typescript: 4.9.5
packages: packages:
/@antfu/eslint-config-basic/0.35.2_6ike4423xm2xnh233ikrbff5m4: /@antfu/eslint-config-basic/0.35.2_khyrr7my4aaa3ssgqabkfgcc24:
resolution: {integrity: sha512-2k7Ovkd8U/q0sgfjuT9KzAUV0q187yGxP7JzD2D4YifuJwL5Bh3JC49KpCv9PXMTeRUMJX2y/kOtGYPetocOug==} resolution: {integrity: sha512-2k7Ovkd8U/q0sgfjuT9KzAUV0q187yGxP7JzD2D4YifuJwL5Bh3JC49KpCv9PXMTeRUMJX2y/kOtGYPetocOug==}
peerDependencies: peerDependencies:
eslint: '>=7.4.0' eslint: '>=7.4.0'
@@ -39,14 +41,14 @@ packages:
eslint-plugin-antfu: 0.35.2_7kw3g6rralp5ps6mg3uyzz6azm eslint-plugin-antfu: 0.35.2_7kw3g6rralp5ps6mg3uyzz6azm
eslint-plugin-eslint-comments: 3.2.0_eslint@8.34.0 eslint-plugin-eslint-comments: 3.2.0_eslint@8.34.0
eslint-plugin-html: 7.1.0 eslint-plugin-html: 7.1.0
eslint-plugin-import: 2.27.5_62tsymtiqxebhmxuag4hg3gx2m eslint-plugin-import: 2.27.5_mcvs2y73sfmcxqzpjj5lr7a2m4
eslint-plugin-jsonc: 2.6.0_eslint@8.34.0 eslint-plugin-jsonc: 2.6.0_eslint@8.34.0
eslint-plugin-markdown: 3.0.0_eslint@8.34.0 eslint-plugin-markdown: 3.0.0_eslint@8.34.0
eslint-plugin-n: 15.6.1_eslint@8.34.0 eslint-plugin-n: 15.6.1_eslint@8.34.0
eslint-plugin-no-only-tests: 3.1.0 eslint-plugin-no-only-tests: 3.1.0
eslint-plugin-promise: 6.1.1_eslint@8.34.0 eslint-plugin-promise: 6.1.1_eslint@8.34.0
eslint-plugin-unicorn: 45.0.2_eslint@8.34.0 eslint-plugin-unicorn: 45.0.2_eslint@8.34.0
eslint-plugin-unused-imports: 2.0.0_b5d7vn5fvb66hlq4xz6bd5gdxm eslint-plugin-unused-imports: 2.0.0_vqeavzxdzk2atb75l6fx3anzpi
eslint-plugin-yml: 1.5.0_eslint@8.34.0 eslint-plugin-yml: 1.5.0_eslint@8.34.0
jsonc-eslint-parser: 2.1.0 jsonc-eslint-parser: 2.1.0
yaml-eslint-parser: 1.1.0 yaml-eslint-parser: 1.1.0
@@ -65,11 +67,11 @@ packages:
eslint: '>=7.4.0' eslint: '>=7.4.0'
typescript: '>=3.9' typescript: '>=3.9'
dependencies: dependencies:
'@antfu/eslint-config-basic': 0.35.2_6ike4423xm2xnh233ikrbff5m4 '@antfu/eslint-config-basic': 0.35.2_khyrr7my4aaa3ssgqabkfgcc24
'@typescript-eslint/eslint-plugin': 5.51.0_z4swst3wuuqk4hlme4ajzslgh4 '@typescript-eslint/eslint-plugin': 5.52.0_6cfvjsbua5ptj65675bqcn6oza
'@typescript-eslint/parser': 5.51.0_7kw3g6rralp5ps6mg3uyzz6azm '@typescript-eslint/parser': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm
eslint: 8.34.0 eslint: 8.34.0
eslint-plugin-jest: 27.2.1_wz3lx5pragqwrk3vwpswr7bnzu eslint-plugin-jest: 27.2.1_7hfwvekd5cgjoxqyvesymwuacm
typescript: 4.9.5 typescript: 4.9.5
transitivePeerDependencies: transitivePeerDependencies:
- eslint-import-resolver-typescript - eslint-import-resolver-typescript
@@ -78,12 +80,12 @@ packages:
- supports-color - supports-color
dev: true dev: true
/@antfu/eslint-config-vue/0.35.2_6ike4423xm2xnh233ikrbff5m4: /@antfu/eslint-config-vue/0.35.2_khyrr7my4aaa3ssgqabkfgcc24:
resolution: {integrity: sha512-98k9D+n0bgr/9OqedAEOsflIWbXz4D92pejXqkUAtnRnB2Nq5dWrrFMJ59oJwTDKnEslpwANlgIXM11qdiTF0Q==} resolution: {integrity: sha512-98k9D+n0bgr/9OqedAEOsflIWbXz4D92pejXqkUAtnRnB2Nq5dWrrFMJ59oJwTDKnEslpwANlgIXM11qdiTF0Q==}
peerDependencies: peerDependencies:
eslint: '>=7.4.0' eslint: '>=7.4.0'
dependencies: dependencies:
'@antfu/eslint-config-basic': 0.35.2_6ike4423xm2xnh233ikrbff5m4 '@antfu/eslint-config-basic': 0.35.2_khyrr7my4aaa3ssgqabkfgcc24
'@antfu/eslint-config-ts': 0.35.2_7kw3g6rralp5ps6mg3uyzz6azm '@antfu/eslint-config-ts': 0.35.2_7kw3g6rralp5ps6mg3uyzz6azm
eslint: 8.34.0 eslint: 8.34.0
eslint-plugin-vue: 9.9.0_eslint@8.34.0 eslint-plugin-vue: 9.9.0_eslint@8.34.0
@@ -103,13 +105,13 @@ packages:
peerDependencies: peerDependencies:
eslint: '>=7.4.0' eslint: '>=7.4.0'
dependencies: dependencies:
'@antfu/eslint-config-vue': 0.35.2_6ike4423xm2xnh233ikrbff5m4 '@antfu/eslint-config-vue': 0.35.2_khyrr7my4aaa3ssgqabkfgcc24
'@typescript-eslint/eslint-plugin': 5.51.0_z4swst3wuuqk4hlme4ajzslgh4 '@typescript-eslint/eslint-plugin': 5.52.0_6cfvjsbua5ptj65675bqcn6oza
'@typescript-eslint/parser': 5.51.0_7kw3g6rralp5ps6mg3uyzz6azm '@typescript-eslint/parser': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm
eslint: 8.34.0 eslint: 8.34.0
eslint-plugin-eslint-comments: 3.2.0_eslint@8.34.0 eslint-plugin-eslint-comments: 3.2.0_eslint@8.34.0
eslint-plugin-html: 7.1.0 eslint-plugin-html: 7.1.0
eslint-plugin-import: 2.27.5_62tsymtiqxebhmxuag4hg3gx2m eslint-plugin-import: 2.27.5_mcvs2y73sfmcxqzpjj5lr7a2m4
eslint-plugin-jsonc: 2.6.0_eslint@8.34.0 eslint-plugin-jsonc: 2.6.0_eslint@8.34.0
eslint-plugin-n: 15.6.1_eslint@8.34.0 eslint-plugin-n: 15.6.1_eslint@8.34.0
eslint-plugin-promise: 6.1.1_eslint@8.34.0 eslint-plugin-promise: 6.1.1_eslint@8.34.0
@@ -152,218 +154,196 @@ packages:
dependencies: dependencies:
'@esbuild-kit/core-utils': 3.1.0 '@esbuild-kit/core-utils': 3.1.0
get-tsconfig: 4.4.0 get-tsconfig: 4.4.0
dev: true dev: false
/@esbuild-kit/core-utils/3.1.0: /@esbuild-kit/core-utils/3.1.0:
resolution: {integrity: sha512-Uuk8RpCg/7fdHSceR1M6XbSZFSuMrxcePFuGgyvsBn+u339dk5OeL4jv2EojwTN2st/unJGsVm4qHWjWNmJ/tw==} resolution: {integrity: sha512-Uuk8RpCg/7fdHSceR1M6XbSZFSuMrxcePFuGgyvsBn+u339dk5OeL4jv2EojwTN2st/unJGsVm4qHWjWNmJ/tw==}
dependencies: dependencies:
esbuild: 0.17.7 esbuild: 0.17.8
source-map-support: 0.5.21 source-map-support: 0.5.21
dev: true dev: false
/@esbuild-kit/esm-loader/2.5.5: /@esbuild-kit/esm-loader/2.5.5:
resolution: {integrity: sha512-Qwfvj/qoPbClxCRNuac1Du01r9gvNOT+pMYtJDapfB1eoGN1YlJ1BixLyL9WVENRx5RXgNLdfYdx/CuswlGhMw==} resolution: {integrity: sha512-Qwfvj/qoPbClxCRNuac1Du01r9gvNOT+pMYtJDapfB1eoGN1YlJ1BixLyL9WVENRx5RXgNLdfYdx/CuswlGhMw==}
dependencies: dependencies:
'@esbuild-kit/core-utils': 3.1.0 '@esbuild-kit/core-utils': 3.1.0
get-tsconfig: 4.4.0 get-tsconfig: 4.4.0
dev: true dev: false
/@esbuild/android-arm/0.17.7: /@esbuild/android-arm/0.17.8:
resolution: {integrity: sha512-Np6Lg8VUiuzHP5XvHU7zfSVPN4ILdiOhxA1GQ1uvCK2T2l3nI8igQV0c9FJx4hTkq8WGqhGEvn5UuRH8jMkExg==} resolution: {integrity: sha512-0/rb91GYKhrtbeglJXOhAv9RuYimgI8h623TplY2X+vA4EXnk3Zj1fXZreJ0J3OJJu1bwmb0W7g+2cT/d8/l/w==}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [arm] cpu: [arm]
os: [android] os: [android]
requiresBuild: true requiresBuild: true
dev: true
optional: true optional: true
/@esbuild/android-arm64/0.17.7: /@esbuild/android-arm64/0.17.8:
resolution: {integrity: sha512-fOUBZvcbtbQJIj2K/LMKcjULGfXLV9R4qjXFsi3UuqFhIRJHz0Fp6kFjsMFI6vLuPrfC5G9Dmh+3RZOrSKY2Lg==} resolution: {integrity: sha512-oa/N5j6v1svZQs7EIRPqR8f+Bf8g6HBDjD/xHC02radE/NjKHK7oQmtmLxPs1iVwYyvE+Kolo6lbpfEQ9xnhxQ==}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [arm64] cpu: [arm64]
os: [android] os: [android]
requiresBuild: true requiresBuild: true
dev: true
optional: true optional: true
/@esbuild/android-x64/0.17.7: /@esbuild/android-x64/0.17.8:
resolution: {integrity: sha512-6YILpPvop1rPAvaO/n2iWQL45RyTVTR/1SK7P6Xi2fyu+hpEeX22fE2U2oJd1sfpovUJOWTRdugjddX6QCup3A==} resolution: {integrity: sha512-bTliMLqD7pTOoPg4zZkXqCDuzIUguEWLpeqkNfC41ODBHwoUgZ2w5JBeYimv4oP6TDVocoYmEhZrCLQTrH89bg==}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [x64] cpu: [x64]
os: [android] os: [android]
requiresBuild: true requiresBuild: true
dev: true
optional: true optional: true
/@esbuild/darwin-arm64/0.17.7: /@esbuild/darwin-arm64/0.17.8:
resolution: {integrity: sha512-7i0gfFsDt1BBiurZz5oZIpzfxqy5QkJmhXdtrf2Hma/gI9vL2AqxHhRBoI1NeWc9IhN1qOzWZrslhiXZweMSFg==} resolution: {integrity: sha512-ghAbV3ia2zybEefXRRm7+lx8J/rnupZT0gp9CaGy/3iolEXkJ6LYRq4IpQVI9zR97ID80KJVoUlo3LSeA/sMAg==}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [arm64] cpu: [arm64]
os: [darwin] os: [darwin]
requiresBuild: true requiresBuild: true
dev: true
optional: true optional: true
/@esbuild/darwin-x64/0.17.7: /@esbuild/darwin-x64/0.17.8:
resolution: {integrity: sha512-hRvIu3vuVIcv4SJXEKOHVsNssM5tLE2xWdb9ZyJqsgYp+onRa5El3VJ4+WjTbkf/A2FD5wuMIbO2FCTV39LE0w==} resolution: {integrity: sha512-n5WOpyvZ9TIdv2V1K3/iIkkJeKmUpKaCTdun9buhGRWfH//osmUjlv4Z5mmWdPWind/VGcVxTHtLfLCOohsOXw==}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [x64] cpu: [x64]
os: [darwin] os: [darwin]
requiresBuild: true requiresBuild: true
dev: true
optional: true optional: true
/@esbuild/freebsd-arm64/0.17.7: /@esbuild/freebsd-arm64/0.17.8:
resolution: {integrity: sha512-2NJjeQ9kiabJkVXLM3sHkySqkL1KY8BeyLams3ITyiLW10IwDL0msU5Lq1cULCn9zNxt1Seh1I6QrqyHUvOtQw==} resolution: {integrity: sha512-a/SATTaOhPIPFWvHZDoZYgxaZRVHn0/LX1fHLGfZ6C13JqFUZ3K6SMD6/HCtwOQ8HnsNaEeokdiDSFLuizqv5A==}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [arm64] cpu: [arm64]
os: [freebsd] os: [freebsd]
requiresBuild: true requiresBuild: true
dev: true
optional: true optional: true
/@esbuild/freebsd-x64/0.17.7: /@esbuild/freebsd-x64/0.17.8:
resolution: {integrity: sha512-8kSxlbjuLYMoIgvRxPybirHJeW45dflyIgHVs+jzMYJf87QOay1ZUTzKjNL3vqHQjmkSn8p6KDfHVrztn7Rprw==} resolution: {integrity: sha512-xpFJb08dfXr5+rZc4E+ooZmayBW6R3q59daCpKZ/cDU96/kvDM+vkYzNeTJCGd8rtO6fHWMq5Rcv/1cY6p6/0Q==}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [x64] cpu: [x64]
os: [freebsd] os: [freebsd]
requiresBuild: true requiresBuild: true
dev: true
optional: true optional: true
/@esbuild/linux-arm/0.17.7: /@esbuild/linux-arm/0.17.8:
resolution: {integrity: sha512-07RsAAzznWqdfJC+h3L2UVWwnUHepsFw5GmzySnUspHHb7glJ1+47rvlcH0SeUtoVOs8hF4/THgZbtJRyALaJA==} resolution: {integrity: sha512-6Ij8gfuGszcEwZpi5jQIJCVIACLS8Tz2chnEBfYjlmMzVsfqBP1iGmHQPp7JSnZg5xxK9tjCc+pJ2WtAmPRFVA==}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [arm] cpu: [arm]
os: [linux] os: [linux]
requiresBuild: true requiresBuild: true
dev: true
optional: true optional: true
/@esbuild/linux-arm64/0.17.7: /@esbuild/linux-arm64/0.17.8:
resolution: {integrity: sha512-43Bbhq3Ia/mGFTCRA4NlY8VRH3dLQltJ4cqzhSfq+cdvdm9nKJXVh4NUkJvdZgEZIkf/ufeMmJ0/22v9btXTcw==} resolution: {integrity: sha512-v3iwDQuDljLTxpsqQDl3fl/yihjPAyOguxuloON9kFHYwopeJEf1BkDXODzYyXEI19gisEsQlG1bM65YqKSIww==}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
requiresBuild: true requiresBuild: true
dev: true
optional: true optional: true
/@esbuild/linux-ia32/0.17.7: /@esbuild/linux-ia32/0.17.8:
resolution: {integrity: sha512-ViYkfcfnbwOoTS7xE4DvYFv7QOlW8kPBuccc4erJ0jx2mXDPR7e0lYOH9JelotS9qe8uJ0s2i3UjUvjunEp53A==} resolution: {integrity: sha512-8svILYKhE5XetuFk/B6raFYIyIqydQi+GngEXJgdPdI7OMKUbSd7uzR02wSY4kb53xBrClLkhH4Xs8P61Q2BaA==}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [ia32] cpu: [ia32]
os: [linux] os: [linux]
requiresBuild: true requiresBuild: true
dev: true
optional: true optional: true
/@esbuild/linux-loong64/0.17.7: /@esbuild/linux-loong64/0.17.8:
resolution: {integrity: sha512-H1g+AwwcqYQ/Hl/sMcopRcNLY/fysIb/ksDfCa3/kOaHQNhBrLeDYw+88VAFV5U6oJL9GqnmUj72m9Nv3th3hA==} resolution: {integrity: sha512-B6FyMeRJeV0NpyEOYlm5qtQfxbdlgmiGdD+QsipzKfFky0K5HW5Td6dyK3L3ypu1eY4kOmo7wW0o94SBqlqBSA==}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [loong64] cpu: [loong64]
os: [linux] os: [linux]
requiresBuild: true requiresBuild: true
dev: true
optional: true optional: true
/@esbuild/linux-mips64el/0.17.7: /@esbuild/linux-mips64el/0.17.8:
resolution: {integrity: sha512-MDLGrVbTGYtmldlbcxfeDPdhxttUmWoX3ovk9u6jc8iM+ueBAFlaXKuUMCoyP/zfOJb+KElB61eSdBPSvNcCEg==} resolution: {integrity: sha512-CCb67RKahNobjm/eeEqeD/oJfJlrWyw29fgiyB6vcgyq97YAf3gCOuP6qMShYSPXgnlZe/i4a8WFHBw6N8bYAA==}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [mips64el] cpu: [mips64el]
os: [linux] os: [linux]
requiresBuild: true requiresBuild: true
dev: true
optional: true optional: true
/@esbuild/linux-ppc64/0.17.7: /@esbuild/linux-ppc64/0.17.8:
resolution: {integrity: sha512-UWtLhRPKzI+v2bKk4j9rBpGyXbLAXLCOeqt1tLVAt1mfagHpFjUzzIHCpPiUfY3x1xY5e45/+BWzGpqqvSglNw==} resolution: {integrity: sha512-bytLJOi55y55+mGSdgwZ5qBm0K9WOCh0rx+vavVPx+gqLLhxtSFU0XbeYy/dsAAD6xECGEv4IQeFILaSS2auXw==}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [ppc64] cpu: [ppc64]
os: [linux] os: [linux]
requiresBuild: true requiresBuild: true
dev: true
optional: true optional: true
/@esbuild/linux-riscv64/0.17.7: /@esbuild/linux-riscv64/0.17.8:
resolution: {integrity: sha512-3C/RTKqZauUwBYtIQAv7ELTJd+H2dNKPyzwE2ZTbz2RNrNhNHRoeKnG5C++eM6nSZWUCLyyaWfq1v1YRwBS/+A==} resolution: {integrity: sha512-2YpRyQJmKVBEHSBLa8kBAtbhucaclb6ex4wchfY0Tj3Kg39kpjeJ9vhRU7x4mUpq8ISLXRXH1L0dBYjAeqzZAw==}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [riscv64] cpu: [riscv64]
os: [linux] os: [linux]
requiresBuild: true requiresBuild: true
dev: true
optional: true optional: true
/@esbuild/linux-s390x/0.17.7: /@esbuild/linux-s390x/0.17.8:
resolution: {integrity: sha512-x7cuRSCm998KFZqGEtSo8rI5hXLxWji4znZkBhg2FPF8A8lxLLCsSXe2P5utf0RBQflb3K97dkEH/BJwTqrbDw==} resolution: {integrity: sha512-QgbNY/V3IFXvNf11SS6exkpVcX0LJcob+0RWCgV9OiDAmVElnxciHIisoSix9uzYzScPmS6dJFbZULdSAEkQVw==}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [s390x] cpu: [s390x]
os: [linux] os: [linux]
requiresBuild: true requiresBuild: true
dev: true
optional: true optional: true
/@esbuild/linux-x64/0.17.7: /@esbuild/linux-x64/0.17.8:
resolution: {integrity: sha512-1Z2BtWgM0Wc92WWiZR5kZ5eC+IetI++X+nf9NMbUvVymt74fnQqwgM5btlTW7P5uCHfq03u5MWHjIZa4o+TnXQ==} resolution: {integrity: sha512-mM/9S0SbAFDBc4OPoyP6SEOo5324LpUxdpeIUUSrSTOfhHU9hEfqRngmKgqILqwx/0DVJBzeNW7HmLEWp9vcOA==}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
requiresBuild: true requiresBuild: true
dev: true
optional: true optional: true
/@esbuild/netbsd-x64/0.17.7: /@esbuild/netbsd-x64/0.17.8:
resolution: {integrity: sha512-//VShPN4hgbmkDjYNCZermIhj8ORqoPNmAnwSPqPtBB0xOpHrXMlJhsqLNsgoBm0zi/5tmy//WyL6g81Uq2c6Q==} resolution: {integrity: sha512-eKUYcWaWTaYr9zbj8GertdVtlt1DTS1gNBWov+iQfWuWyuu59YN6gSEJvFzC5ESJ4kMcKR0uqWThKUn5o8We6Q==}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [x64] cpu: [x64]
os: [netbsd] os: [netbsd]
requiresBuild: true requiresBuild: true
dev: true
optional: true optional: true
/@esbuild/openbsd-x64/0.17.7: /@esbuild/openbsd-x64/0.17.8:
resolution: {integrity: sha512-IQ8BliXHiOsbQEOHzc7mVLIw2UYPpbOXJQ9cK1nClNYQjZthvfiA6rWZMz4BZpVzHZJ+/H2H23cZwRJ1NPYOGg==} resolution: {integrity: sha512-Vc9J4dXOboDyMXKD0eCeW0SIeEzr8K9oTHJU+Ci1mZc5njPfhKAqkRt3B/fUNU7dP+mRyralPu8QUkiaQn7iIg==}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [x64] cpu: [x64]
os: [openbsd] os: [openbsd]
requiresBuild: true requiresBuild: true
dev: true
optional: true optional: true
/@esbuild/sunos-x64/0.17.7: /@esbuild/sunos-x64/0.17.8:
resolution: {integrity: sha512-phO5HvU3SyURmcW6dfQXX4UEkFREUwaoiTgi1xH+CAFKPGsrcG6oDp1U70yQf5lxRKujoSCEIoBr0uFykJzN2g==} resolution: {integrity: sha512-0xvOTNuPXI7ft1LYUgiaXtpCEjp90RuBBYovdd2lqAFxje4sEucurg30M1WIm03+3jxByd3mfo+VUmPtRSVuOw==}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [x64] cpu: [x64]
os: [sunos] os: [sunos]
requiresBuild: true requiresBuild: true
dev: true
optional: true optional: true
/@esbuild/win32-arm64/0.17.7: /@esbuild/win32-arm64/0.17.8:
resolution: {integrity: sha512-G/cRKlYrwp1B0uvzEdnFPJ3A6zSWjnsRrWivsEW0IEHZk+czv0Bmiwa51RncruHLjQ4fGsvlYPmCmwzmutPzHA==} resolution: {integrity: sha512-G0JQwUI5WdEFEnYNKzklxtBheCPkuDdu1YrtRrjuQv30WsYbkkoixKxLLv8qhJmNI+ATEWquZe/N0d0rpr55Mg==}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [arm64] cpu: [arm64]
os: [win32] os: [win32]
requiresBuild: true requiresBuild: true
dev: true
optional: true optional: true
/@esbuild/win32-ia32/0.17.7: /@esbuild/win32-ia32/0.17.8:
resolution: {integrity: sha512-/yMNVlMew07NrOflJdRAZcMdUoYTOCPbCHx0eHtg55l87wXeuhvYOPBQy5HLX31Ku+W2XsBD5HnjUjEUsTXJug==} resolution: {integrity: sha512-Fqy63515xl20OHGFykjJsMnoIWS+38fqfg88ClvPXyDbLtgXal2DTlhb1TfTX34qWi3u4I7Cq563QcHpqgLx8w==}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [ia32] cpu: [ia32]
os: [win32] os: [win32]
requiresBuild: true requiresBuild: true
dev: true
optional: true optional: true
/@esbuild/win32-x64/0.17.7: /@esbuild/win32-x64/0.17.8:
resolution: {integrity: sha512-K9/YybM6WZO71x73Iyab6mwieHtHjm9hrPR/a9FBPZmFO3w+fJaM2uu2rt3JYf/rZR24MFwTliI8VSoKKOtYtg==} resolution: {integrity: sha512-1iuezdyDNngPnz8rLRDO2C/ZZ/emJLb72OsZeqQ6gL6Avko/XCXZw+NuxBSNhBAP13Hie418V7VMt9et1FMvpg==}
engines: {node: '>=12'} engines: {node: '>=12'}
cpu: [x64] cpu: [x64]
os: [win32] os: [win32]
requiresBuild: true requiresBuild: true
dev: true
optional: true optional: true
/@eslint-community/eslint-utils/4.1.2_eslint@8.34.0: /@eslint-community/eslint-utils/4.1.2_eslint@8.34.0:
@@ -513,8 +493,8 @@ packages:
resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==}
dev: true dev: true
/@typescript-eslint/eslint-plugin/5.51.0_z4swst3wuuqk4hlme4ajzslgh4: /@typescript-eslint/eslint-plugin/5.52.0_6cfvjsbua5ptj65675bqcn6oza:
resolution: {integrity: sha512-wcAwhEWm1RgNd7dxD/o+nnLW8oH+6RK1OGnmbmkj/GGoDPV1WWMVP0FXYQBivKHdwM1pwii3bt//RC62EriIUQ==} resolution: {integrity: sha512-lHazYdvYVsBokwCdKOppvYJKaJ4S41CgKBcPvyd0xjZNbvQdhn/pnJlGtQksQ/NhInzdaeaSarlBjDXHuclEbg==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies: peerDependencies:
'@typescript-eslint/parser': ^5.0.0 '@typescript-eslint/parser': ^5.0.0
@@ -524,10 +504,10 @@ packages:
typescript: typescript:
optional: true optional: true
dependencies: dependencies:
'@typescript-eslint/parser': 5.51.0_7kw3g6rralp5ps6mg3uyzz6azm '@typescript-eslint/parser': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm
'@typescript-eslint/scope-manager': 5.51.0 '@typescript-eslint/scope-manager': 5.52.0
'@typescript-eslint/type-utils': 5.51.0_7kw3g6rralp5ps6mg3uyzz6azm '@typescript-eslint/type-utils': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm
'@typescript-eslint/utils': 5.51.0_7kw3g6rralp5ps6mg3uyzz6azm '@typescript-eslint/utils': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm
debug: 4.3.4 debug: 4.3.4
eslint: 8.34.0 eslint: 8.34.0
grapheme-splitter: 1.0.4 grapheme-splitter: 1.0.4
@@ -541,8 +521,8 @@ packages:
- supports-color - supports-color
dev: true dev: true
/@typescript-eslint/parser/5.51.0_7kw3g6rralp5ps6mg3uyzz6azm: /@typescript-eslint/parser/5.52.0_7kw3g6rralp5ps6mg3uyzz6azm:
resolution: {integrity: sha512-fEV0R9gGmfpDeRzJXn+fGQKcl0inIeYobmmUWijZh9zA7bxJ8clPhV9up2ZQzATxAiFAECqPQyMDB4o4B81AaA==} resolution: {integrity: sha512-e2KiLQOZRo4Y0D/b+3y08i3jsekoSkOYStROYmPUnGMEoA0h+k2qOH5H6tcjIc68WDvGwH+PaOrP1XRzLJ6QlA==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies: peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
@@ -551,9 +531,9 @@ packages:
typescript: typescript:
optional: true optional: true
dependencies: dependencies:
'@typescript-eslint/scope-manager': 5.51.0 '@typescript-eslint/scope-manager': 5.52.0
'@typescript-eslint/types': 5.51.0 '@typescript-eslint/types': 5.52.0
'@typescript-eslint/typescript-estree': 5.51.0_typescript@4.9.5 '@typescript-eslint/typescript-estree': 5.52.0_typescript@4.9.5
debug: 4.3.4 debug: 4.3.4
eslint: 8.34.0 eslint: 8.34.0
typescript: 4.9.5 typescript: 4.9.5
@@ -561,16 +541,16 @@ packages:
- supports-color - supports-color
dev: true dev: true
/@typescript-eslint/scope-manager/5.51.0: /@typescript-eslint/scope-manager/5.52.0:
resolution: {integrity: sha512-gNpxRdlx5qw3yaHA0SFuTjW4rxeYhpHxt491PEcKF8Z6zpq0kMhe0Tolxt0qjlojS+/wArSDlj/LtE69xUJphQ==} resolution: {integrity: sha512-AR7sxxfBKiNV0FWBSARxM8DmNxrwgnYMPwmpkC1Pl1n+eT8/I2NAUPuwDy/FmDcC6F8pBfmOcaxcxRHspgOBMw==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dependencies: dependencies:
'@typescript-eslint/types': 5.51.0 '@typescript-eslint/types': 5.52.0
'@typescript-eslint/visitor-keys': 5.51.0 '@typescript-eslint/visitor-keys': 5.52.0
dev: true dev: true
/@typescript-eslint/type-utils/5.51.0_7kw3g6rralp5ps6mg3uyzz6azm: /@typescript-eslint/type-utils/5.52.0_7kw3g6rralp5ps6mg3uyzz6azm:
resolution: {integrity: sha512-QHC5KKyfV8sNSyHqfNa0UbTbJ6caB8uhcx2hYcWVvJAZYJRBo5HyyZfzMdRx8nvS+GyMg56fugMzzWnojREuQQ==} resolution: {integrity: sha512-tEKuUHfDOv852QGlpPtB3lHOoig5pyFQN/cUiZtpw99D93nEBjexRLre5sQZlkMoHry/lZr8qDAt2oAHLKA6Jw==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies: peerDependencies:
eslint: '*' eslint: '*'
@@ -579,8 +559,8 @@ packages:
typescript: typescript:
optional: true optional: true
dependencies: dependencies:
'@typescript-eslint/typescript-estree': 5.51.0_typescript@4.9.5 '@typescript-eslint/typescript-estree': 5.52.0_typescript@4.9.5
'@typescript-eslint/utils': 5.51.0_7kw3g6rralp5ps6mg3uyzz6azm '@typescript-eslint/utils': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm
debug: 4.3.4 debug: 4.3.4
eslint: 8.34.0 eslint: 8.34.0
tsutils: 3.21.0_typescript@4.9.5 tsutils: 3.21.0_typescript@4.9.5
@@ -589,13 +569,13 @@ packages:
- supports-color - supports-color
dev: true dev: true
/@typescript-eslint/types/5.51.0: /@typescript-eslint/types/5.52.0:
resolution: {integrity: sha512-SqOn0ANn/v6hFn0kjvLwiDi4AzR++CBZz0NV5AnusT2/3y32jdc0G4woXPWHCumWtUXZKPAS27/9vziSsC9jnw==} resolution: {integrity: sha512-oV7XU4CHYfBhk78fS7tkum+/Dpgsfi91IIDy7fjCyq2k6KB63M6gMC0YIvy+iABzmXThCRI6xpCEyVObBdWSDQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dev: true dev: true
/@typescript-eslint/typescript-estree/5.51.0_typescript@4.9.5: /@typescript-eslint/typescript-estree/5.52.0_typescript@4.9.5:
resolution: {integrity: sha512-TSkNupHvNRkoH9FMA3w7TazVFcBPveAAmb7Sz+kArY6sLT86PA5Vx80cKlYmd8m3Ha2SwofM1KwraF24lM9FvA==} resolution: {integrity: sha512-WeWnjanyEwt6+fVrSR0MYgEpUAuROxuAH516WPjUblIrClzYJj0kBbjdnbQXLpgAN8qbEuGywiQsXUVDiAoEuQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies: peerDependencies:
typescript: '*' typescript: '*'
@@ -603,8 +583,8 @@ packages:
typescript: typescript:
optional: true optional: true
dependencies: dependencies:
'@typescript-eslint/types': 5.51.0 '@typescript-eslint/types': 5.52.0
'@typescript-eslint/visitor-keys': 5.51.0 '@typescript-eslint/visitor-keys': 5.52.0
debug: 4.3.4 debug: 4.3.4
globby: 11.1.0 globby: 11.1.0
is-glob: 4.0.3 is-glob: 4.0.3
@@ -615,17 +595,17 @@ packages:
- supports-color - supports-color
dev: true dev: true
/@typescript-eslint/utils/5.51.0_7kw3g6rralp5ps6mg3uyzz6azm: /@typescript-eslint/utils/5.52.0_7kw3g6rralp5ps6mg3uyzz6azm:
resolution: {integrity: sha512-76qs+5KWcaatmwtwsDJvBk4H76RJQBFe+Gext0EfJdC3Vd2kpY2Pf//OHHzHp84Ciw0/rYoGTDnIAr3uWhhJYw==} resolution: {integrity: sha512-As3lChhrbwWQLNk2HC8Ree96hldKIqk98EYvypd3It8Q1f8d5zWyIoaZEp2va5667M4ZyE7X8UUR+azXrFl+NA==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies: peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
dependencies: dependencies:
'@types/json-schema': 7.0.11 '@types/json-schema': 7.0.11
'@types/semver': 7.3.13 '@types/semver': 7.3.13
'@typescript-eslint/scope-manager': 5.51.0 '@typescript-eslint/scope-manager': 5.52.0
'@typescript-eslint/types': 5.51.0 '@typescript-eslint/types': 5.52.0
'@typescript-eslint/typescript-estree': 5.51.0_typescript@4.9.5 '@typescript-eslint/typescript-estree': 5.52.0_typescript@4.9.5
eslint: 8.34.0 eslint: 8.34.0
eslint-scope: 5.1.1 eslint-scope: 5.1.1
eslint-utils: 3.0.0_eslint@8.34.0 eslint-utils: 3.0.0_eslint@8.34.0
@@ -635,11 +615,11 @@ packages:
- typescript - typescript
dev: true dev: true
/@typescript-eslint/visitor-keys/5.51.0: /@typescript-eslint/visitor-keys/5.52.0:
resolution: {integrity: sha512-Oh2+eTdjHjOFjKA27sxESlA87YPSOJafGCR0md5oeMdh1ZcCfAGCIOL216uTBAkAIptvLIfKQhl7lHxMJet4GQ==} resolution: {integrity: sha512-qMwpw6SU5VHCPr99y274xhbm+PRViK/NATY6qzt+Et7+mThGuFSl/ompj2/hrBlRP/kq+BFdgagnOSgw9TB0eA==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dependencies: dependencies:
'@typescript-eslint/types': 5.51.0 '@typescript-eslint/types': 5.52.0
eslint-visitor-keys: 3.3.0 eslint-visitor-keys: 3.3.0
dev: true dev: true
@@ -803,7 +783,7 @@ packages:
/buffer-from/1.1.2: /buffer-from/1.1.2:
resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
dev: true dev: false
/builtin-modules/3.3.0: /builtin-modules/3.3.0:
resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==}
@@ -816,13 +796,13 @@ packages:
semver: 7.3.8 semver: 7.3.8
dev: true dev: true
/bundle-require/4.0.1_esbuild@0.17.7: /bundle-require/4.0.1_esbuild@0.17.8:
resolution: {integrity: sha512-9NQkRHlNdNpDBGmLpngF3EFDcwodhMUuLz9PaWYciVcQF9SE4LFjM2DB/xV1Li5JiuDMv7ZUWuC3rGbqR0MAXQ==} resolution: {integrity: sha512-9NQkRHlNdNpDBGmLpngF3EFDcwodhMUuLz9PaWYciVcQF9SE4LFjM2DB/xV1Li5JiuDMv7ZUWuC3rGbqR0MAXQ==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
peerDependencies: peerDependencies:
esbuild: '>=0.17' esbuild: '>=0.17'
dependencies: dependencies:
esbuild: 0.17.7 esbuild: 0.17.8
load-tsconfig: 0.2.3 load-tsconfig: 0.2.3
dev: true dev: true
@@ -876,8 +856,8 @@ packages:
resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==}
dev: true dev: true
/chatgpt/4.3.2: /chatgpt/4.4.0:
resolution: {integrity: sha512-5+Kh0mdP/pDJTL3kA6C6Dp43EO8T8sILPJbbQwOu3J4dK+n/tYpSXsmG6VZkmitAVOffeTonXTGDJwslc66orw==} resolution: {integrity: sha512-rS1F423hR5marIB7hvZ4KyczK9oFloWY+AR4WKIt+HLyiRgOOWv6V4olu1HvaoOayc5+A/N2WwX0SzuU1rI9Rg==}
engines: {node: '>=18'} engines: {node: '>=18'}
dependencies: dependencies:
eventsource-parser: 0.0.5 eventsource-parser: 0.0.5
@@ -1088,7 +1068,7 @@ packages:
/dotenv/16.0.3: /dotenv/16.0.3:
resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==}
engines: {node: '>=12'} engines: {node: '>=12'}
dev: true dev: false
/ee-first/1.1.1: /ee-first/1.1.1:
resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
@@ -1173,35 +1153,34 @@ packages:
is-symbol: 1.0.4 is-symbol: 1.0.4
dev: true dev: true
/esbuild/0.17.7: /esbuild/0.17.8:
resolution: {integrity: sha512-+5hHlrK108fT6C6/40juy0w4DYKtyZ5NjfBlTccBdsFutR7WBxpIY633JzZJewdsCy8xWA/u2z0MSniIJwufYg==} resolution: {integrity: sha512-g24ybC3fWhZddZK6R3uD2iF/RIPnRpwJAqLov6ouX3hMbY4+tKolP0VMF3zuIYCaXun+yHwS5IPQ91N2BT191g==}
engines: {node: '>=12'} engines: {node: '>=12'}
hasBin: true hasBin: true
requiresBuild: true requiresBuild: true
optionalDependencies: optionalDependencies:
'@esbuild/android-arm': 0.17.7 '@esbuild/android-arm': 0.17.8
'@esbuild/android-arm64': 0.17.7 '@esbuild/android-arm64': 0.17.8
'@esbuild/android-x64': 0.17.7 '@esbuild/android-x64': 0.17.8
'@esbuild/darwin-arm64': 0.17.7 '@esbuild/darwin-arm64': 0.17.8
'@esbuild/darwin-x64': 0.17.7 '@esbuild/darwin-x64': 0.17.8
'@esbuild/freebsd-arm64': 0.17.7 '@esbuild/freebsd-arm64': 0.17.8
'@esbuild/freebsd-x64': 0.17.7 '@esbuild/freebsd-x64': 0.17.8
'@esbuild/linux-arm': 0.17.7 '@esbuild/linux-arm': 0.17.8
'@esbuild/linux-arm64': 0.17.7 '@esbuild/linux-arm64': 0.17.8
'@esbuild/linux-ia32': 0.17.7 '@esbuild/linux-ia32': 0.17.8
'@esbuild/linux-loong64': 0.17.7 '@esbuild/linux-loong64': 0.17.8
'@esbuild/linux-mips64el': 0.17.7 '@esbuild/linux-mips64el': 0.17.8
'@esbuild/linux-ppc64': 0.17.7 '@esbuild/linux-ppc64': 0.17.8
'@esbuild/linux-riscv64': 0.17.7 '@esbuild/linux-riscv64': 0.17.8
'@esbuild/linux-s390x': 0.17.7 '@esbuild/linux-s390x': 0.17.8
'@esbuild/linux-x64': 0.17.7 '@esbuild/linux-x64': 0.17.8
'@esbuild/netbsd-x64': 0.17.7 '@esbuild/netbsd-x64': 0.17.8
'@esbuild/openbsd-x64': 0.17.7 '@esbuild/openbsd-x64': 0.17.8
'@esbuild/sunos-x64': 0.17.7 '@esbuild/sunos-x64': 0.17.8
'@esbuild/win32-arm64': 0.17.7 '@esbuild/win32-arm64': 0.17.8
'@esbuild/win32-ia32': 0.17.7 '@esbuild/win32-ia32': 0.17.8
'@esbuild/win32-x64': 0.17.7 '@esbuild/win32-x64': 0.17.8
dev: true
/escape-html/1.0.3: /escape-html/1.0.3:
resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
@@ -1227,7 +1206,7 @@ packages:
- supports-color - supports-color
dev: true dev: true
/eslint-module-utils/2.7.4_ithmlgmaospkvl4p7n7pyp3rgq: /eslint-module-utils/2.7.4_npjqex3ey3rgd34fjcuucz7la4:
resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==}
engines: {node: '>=4'} engines: {node: '>=4'}
peerDependencies: peerDependencies:
@@ -1248,7 +1227,7 @@ packages:
eslint-import-resolver-webpack: eslint-import-resolver-webpack:
optional: true optional: true
dependencies: dependencies:
'@typescript-eslint/parser': 5.51.0_7kw3g6rralp5ps6mg3uyzz6azm '@typescript-eslint/parser': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm
debug: 3.2.7 debug: 3.2.7
eslint: 8.34.0 eslint: 8.34.0
eslint-import-resolver-node: 0.3.7 eslint-import-resolver-node: 0.3.7
@@ -1259,7 +1238,7 @@ packages:
/eslint-plugin-antfu/0.35.2_7kw3g6rralp5ps6mg3uyzz6azm: /eslint-plugin-antfu/0.35.2_7kw3g6rralp5ps6mg3uyzz6azm:
resolution: {integrity: sha512-Q6FOcOakafU49PDRlq7jkrWmlTJ4u3AW7aGX+FqeQNaMgjXq0RzPGvS0Vyp7q/XDRLLoe0BjbGkamTeZXg8waw==} resolution: {integrity: sha512-Q6FOcOakafU49PDRlq7jkrWmlTJ4u3AW7aGX+FqeQNaMgjXq0RzPGvS0Vyp7q/XDRLLoe0BjbGkamTeZXg8waw==}
dependencies: dependencies:
'@typescript-eslint/utils': 5.51.0_7kw3g6rralp5ps6mg3uyzz6azm '@typescript-eslint/utils': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm
transitivePeerDependencies: transitivePeerDependencies:
- eslint - eslint
- supports-color - supports-color
@@ -1294,7 +1273,7 @@ packages:
htmlparser2: 8.0.1 htmlparser2: 8.0.1
dev: true dev: true
/eslint-plugin-import/2.27.5_62tsymtiqxebhmxuag4hg3gx2m: /eslint-plugin-import/2.27.5_mcvs2y73sfmcxqzpjj5lr7a2m4:
resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==}
engines: {node: '>=4'} engines: {node: '>=4'}
peerDependencies: peerDependencies:
@@ -1304,7 +1283,7 @@ packages:
'@typescript-eslint/parser': '@typescript-eslint/parser':
optional: true optional: true
dependencies: dependencies:
'@typescript-eslint/parser': 5.51.0_7kw3g6rralp5ps6mg3uyzz6azm '@typescript-eslint/parser': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm
array-includes: 3.1.6 array-includes: 3.1.6
array.prototype.flat: 1.3.1 array.prototype.flat: 1.3.1
array.prototype.flatmap: 1.3.1 array.prototype.flatmap: 1.3.1
@@ -1312,7 +1291,7 @@ packages:
doctrine: 2.1.0 doctrine: 2.1.0
eslint: 8.34.0 eslint: 8.34.0
eslint-import-resolver-node: 0.3.7 eslint-import-resolver-node: 0.3.7
eslint-module-utils: 2.7.4_ithmlgmaospkvl4p7n7pyp3rgq eslint-module-utils: 2.7.4_npjqex3ey3rgd34fjcuucz7la4
has: 1.0.3 has: 1.0.3
is-core-module: 2.11.0 is-core-module: 2.11.0
is-glob: 4.0.3 is-glob: 4.0.3
@@ -1327,7 +1306,7 @@ packages:
- supports-color - supports-color
dev: true dev: true
/eslint-plugin-jest/27.2.1_wz3lx5pragqwrk3vwpswr7bnzu: /eslint-plugin-jest/27.2.1_7hfwvekd5cgjoxqyvesymwuacm:
resolution: {integrity: sha512-l067Uxx7ZT8cO9NJuf+eJHvt6bqJyz2Z29wykyEdz/OtmcELQl2MQGQLX8J94O1cSJWAwUSEvCjwjA7KEK3Hmg==} resolution: {integrity: sha512-l067Uxx7ZT8cO9NJuf+eJHvt6bqJyz2Z29wykyEdz/OtmcELQl2MQGQLX8J94O1cSJWAwUSEvCjwjA7KEK3Hmg==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
peerDependencies: peerDependencies:
@@ -1340,8 +1319,8 @@ packages:
jest: jest:
optional: true optional: true
dependencies: dependencies:
'@typescript-eslint/eslint-plugin': 5.51.0_z4swst3wuuqk4hlme4ajzslgh4 '@typescript-eslint/eslint-plugin': 5.52.0_6cfvjsbua5ptj65675bqcn6oza
'@typescript-eslint/utils': 5.51.0_7kw3g6rralp5ps6mg3uyzz6azm '@typescript-eslint/utils': 5.52.0_7kw3g6rralp5ps6mg3uyzz6azm
eslint: 8.34.0 eslint: 8.34.0
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@@ -1428,7 +1407,7 @@ packages:
strip-indent: 3.0.0 strip-indent: 3.0.0
dev: true dev: true
/eslint-plugin-unused-imports/2.0.0_b5d7vn5fvb66hlq4xz6bd5gdxm: /eslint-plugin-unused-imports/2.0.0_vqeavzxdzk2atb75l6fx3anzpi:
resolution: {integrity: sha512-3APeS/tQlTrFa167ThtP0Zm0vctjr4M44HMpeg1P4bK6wItarumq0Ma82xorMKdFsWpphQBlRPzw/pxiVELX1A==} resolution: {integrity: sha512-3APeS/tQlTrFa167ThtP0Zm0vctjr4M44HMpeg1P4bK6wItarumq0Ma82xorMKdFsWpphQBlRPzw/pxiVELX1A==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies: peerDependencies:
@@ -1438,7 +1417,7 @@ packages:
'@typescript-eslint/eslint-plugin': '@typescript-eslint/eslint-plugin':
optional: true optional: true
dependencies: dependencies:
'@typescript-eslint/eslint-plugin': 5.51.0_z4swst3wuuqk4hlme4ajzslgh4 '@typescript-eslint/eslint-plugin': 5.52.0_6cfvjsbua5ptj65675bqcn6oza
eslint: 8.34.0 eslint: 8.34.0
eslint-rule-composer: 0.3.0 eslint-rule-composer: 0.3.0
dev: true dev: true
@@ -1582,7 +1561,7 @@ packages:
hasBin: true hasBin: true
dependencies: dependencies:
tsx: 3.12.3 tsx: 3.12.3
dev: true dev: false
/espree/9.4.1: /espree/9.4.1:
resolution: {integrity: sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==} resolution: {integrity: sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==}
@@ -1797,7 +1776,6 @@ packages:
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
os: [darwin] os: [darwin]
requiresBuild: true requiresBuild: true
dev: true
optional: true optional: true
/function-bind/1.1.1: /function-bind/1.1.1:
@@ -1839,7 +1817,7 @@ packages:
/get-tsconfig/4.4.0: /get-tsconfig/4.4.0:
resolution: {integrity: sha512-0Gdjo/9+FzsYhXCEFueo2aY1z1tpXrxWZzP7k8ul9qt1U5o8rYJwTJYmaeHdrVosYIVYkOy2iwCJ9FdpocJhPQ==} resolution: {integrity: sha512-0Gdjo/9+FzsYhXCEFueo2aY1z1tpXrxWZzP7k8ul9qt1U5o8rYJwTJYmaeHdrVosYIVYkOy2iwCJ9FdpocJhPQ==}
dev: true dev: false
/glob-parent/5.1.2: /glob-parent/5.1.2:
resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
@@ -2207,6 +2185,15 @@ packages:
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
dev: true dev: true
/isomorphic-fetch/3.0.0:
resolution: {integrity: sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==}
dependencies:
node-fetch: 2.6.9
whatwg-fetch: 3.6.2
transitivePeerDependencies:
- encoding
dev: false
/joycon/3.1.1: /joycon/3.1.1:
resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==}
engines: {node: '>=10'} engines: {node: '>=10'}
@@ -2463,6 +2450,18 @@ packages:
engines: {node: '>= 0.6'} engines: {node: '>= 0.6'}
dev: false dev: false
/node-fetch/2.6.9:
resolution: {integrity: sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==}
engines: {node: 4.x || >=6.0.0}
peerDependencies:
encoding: ^0.1.0
peerDependenciesMeta:
encoding:
optional: true
dependencies:
whatwg-url: 5.0.0
dev: false
/normalize-package-data/2.5.0: /normalize-package-data/2.5.0:
resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==}
dependencies: dependencies:
@@ -2954,12 +2953,12 @@ packages:
dependencies: dependencies:
buffer-from: 1.1.2 buffer-from: 1.1.2
source-map: 0.6.1 source-map: 0.6.1
dev: true dev: false
/source-map/0.6.1: /source-map/0.6.1:
resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
dev: true dev: false
/source-map/0.8.0-beta.0: /source-map/0.8.0-beta.0:
resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==}
@@ -3101,6 +3100,10 @@ packages:
engines: {node: '>=0.6'} engines: {node: '>=0.6'}
dev: false dev: false
/tr46/0.0.3:
resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
dev: false
/tr46/1.0.1: /tr46/1.0.1:
resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==}
dependencies: dependencies:
@@ -3129,9 +3132,9 @@ packages:
resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
dev: true dev: true
/tsup/6.6.2_typescript@4.9.5: /tsup/6.6.3_typescript@4.9.5:
resolution: {integrity: sha512-+yQ6SI4rVtp1+YpcYOePumJLEVQ896CDNRt9dJ2L/DeMnLf1+FTOCVw5eioLBH0xLdHgogO9NQ6vPNF5MfkSJw==} resolution: {integrity: sha512-OLx/jFllYlVeZQ7sCHBuRVEQBBa1tFbouoc/gbYakyipjVQdWy/iQOvmExUA/ewap9iQ7tbJf9pW0PgcEFfJcQ==}
engines: {node: '>=14'} engines: {node: '>=14.18'}
hasBin: true hasBin: true
peerDependencies: peerDependencies:
'@swc/core': ^1 '@swc/core': ^1
@@ -3145,11 +3148,11 @@ packages:
typescript: typescript:
optional: true optional: true
dependencies: dependencies:
bundle-require: 4.0.1_esbuild@0.17.7 bundle-require: 4.0.1_esbuild@0.17.8
cac: 6.7.14 cac: 6.7.14
chokidar: 3.5.3 chokidar: 3.5.3
debug: 4.3.4 debug: 4.3.4
esbuild: 0.17.7 esbuild: 0.17.8
execa: 5.1.1 execa: 5.1.1
globby: 11.1.0 globby: 11.1.0
joycon: 3.1.1 joycon: 3.1.1
@@ -3184,7 +3187,7 @@ packages:
'@esbuild-kit/esm-loader': 2.5.5 '@esbuild-kit/esm-loader': 2.5.5
optionalDependencies: optionalDependencies:
fsevents: 2.3.2 fsevents: 2.3.2
dev: true dev: false
/type-check/0.4.0: /type-check/0.4.0:
resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
@@ -3300,10 +3303,25 @@ packages:
- supports-color - supports-color
dev: true dev: true
/webidl-conversions/3.0.1:
resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
dev: false
/webidl-conversions/4.0.2: /webidl-conversions/4.0.2:
resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==}
dev: true dev: true
/whatwg-fetch/3.6.2:
resolution: {integrity: sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==}
dev: false
/whatwg-url/5.0.0:
resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
dependencies:
tr46: 0.0.3
webidl-conversions: 3.0.1
dev: false
/whatwg-url/7.1.0: /whatwg-url/7.1.0:
resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==}
dependencies: dependencies:

View File

@@ -1,6 +1,6 @@
import * as dotenv from 'dotenv' import * as dotenv from 'dotenv'
import type { SendMessageOptions } from 'chatgpt' import 'isomorphic-fetch'
import { ChatGPTAPI } from 'chatgpt' import type { ChatGPTAPI, SendMessageOptions } from 'chatgpt'
import { sendResponse } from './utils' import { sendResponse } from './utils'
export interface ChatContext { export interface ChatContext {
@@ -15,10 +15,14 @@ const apiKey = process.env.OPENAI_API_KEY
if (apiKey === undefined) if (apiKey === undefined)
throw new Error('OPENAI_API_KEY is not defined') throw new Error('OPENAI_API_KEY is not defined')
/** let api: ChatGPTAPI
* More Info: https://github.com/transitive-bullshit/chatgpt-api
*/ // To use ESM in CommonJS, you can use a dynamic import
const api = new ChatGPTAPI({ apiKey, debug: false }) (async () => {
// More Info: https://github.com/transitive-bullshit/chatgpt-api
const { ChatGPTAPI } = await import('chatgpt')
api = new ChatGPTAPI({ apiKey: process.env.OPENAI_API_KEY })
})()
async function chatReply( async function chatReply(
message: string, message: string,
@@ -28,7 +32,7 @@ async function chatReply(
return sendResponse({ type: 'Fail', message: 'Message is empty' }) return sendResponse({ type: 'Fail', message: 'Message is empty' })
try { try {
let options: SendMessageOptions = {} let options: SendMessageOptions = { timeoutMs: 30 * 1000 }
if (lastContext) if (lastContext)
options = { ...lastContext } options = { ...lastContext }

View File

@@ -3,7 +3,9 @@ import type { ChatContext } from './chatgpt'
import { chatReply } from './chatgpt' import { chatReply } from './chatgpt'
const app = express() const app = express()
const router = express.Router()
app.use(express.static('public'))
app.use(express.json()) app.use(express.json())
app.all('*', (_, res, next) => { app.all('*', (_, res, next) => {
@@ -13,7 +15,7 @@ app.all('*', (_, res, next) => {
next() next()
}) })
app.post('/chat', async (req, res) => { router.post('/chat', async (req, res) => {
try { try {
const { prompt, options = {} } = req.body as { prompt: string; options?: ChatContext } const { prompt, options = {} } = req.body as { prompt: string; options?: ChatContext }
const response = await chatReply(prompt, options) const response = await chatReply(prompt, options)
@@ -24,4 +26,7 @@ app.post('/chat', async (req, res) => {
} }
}) })
app.use('', router)
app.use('/api', router)
app.listen(3002, () => globalThis.console.log('Server is running on port 3002')) app.listen(3002, () => globalThis.console.log('Server is running on port 3002'))

View File

@@ -1,8 +1,6 @@
import type { GenericAbortSignal } from 'axios' import type { GenericAbortSignal } from 'axios'
import { post } from '@/utils/request' import { post } from '@/utils/request'
export const controller = new AbortController()
export function fetchChatAPI<T = any>( export function fetchChatAPI<T = any>(
prompt: string, prompt: string,
options?: { conversationId?: string; parentMessageId?: string }, options?: { conversationId?: string; parentMessageId?: string },

View File

@@ -9,8 +9,14 @@ defineProps<Props>()
<template> <template>
<div class="p-2 mt-2 rounded-md" :class="[reversal ? 'bg-[#d2f9d1]' : 'bg-[#f4f6f8]']"> <div class="p-2 mt-2 rounded-md" :class="[reversal ? 'bg-[#d2f9d1]' : 'bg-[#f4f6f8]']">
<span class="leading-relaxed whitespace-pre-wrap" :class="[{ 'text-red-500': error }]"> <span v-highlight class="leading-relaxed whitespace-pre-wrap">
<slot /> <slot />
</span> </span>
</div> </div>
</template> </template>
<style>
.hljs {
background-color: #fff0 !important;
}
</style>

View File

@@ -6,7 +6,6 @@ export function useChat() {
function addChat( function addChat(
message: string, message: string,
args?: { reversal?: boolean; error?: boolean; options?: Chat.ChatOptions }, args?: { reversal?: boolean; error?: boolean; options?: Chat.ChatOptions },
uuid?: number | null,
) { ) {
historyStore.addChat( historyStore.addChat(
{ {
@@ -16,7 +15,6 @@ export function useChat() {
error: args?.error ?? false, error: args?.error ?? false,
options: args?.options ?? undefined, options: args?.options ?? undefined,
}, },
uuid,
) )
} }

View File

@@ -1,5 +1,6 @@
<script setup lang='ts'> <script setup lang='ts'>
import { computed, nextTick, onMounted, ref, watch } from 'vue' import { computed, nextTick, onBeforeUnmount, onMounted, ref, watch } from 'vue'
import type { MessageReactive } from 'naive-ui'
import { NButton, NInput, useMessage } from 'naive-ui' import { NButton, NInput, useMessage } from 'naive-ui'
import { Message } from './components' import { Message } from './components'
import { Layout } from './layout' import { Layout } from './layout'
@@ -7,7 +8,6 @@ import { useChat } from './hooks/useChat'
import { fetchChatAPI } from '@/api' import { fetchChatAPI } from '@/api'
import { HoverButton, SvgIcon } from '@/components/common' import { HoverButton, SvgIcon } from '@/components/common'
import { useHistoryStore } from '@/store' import { useHistoryStore } from '@/store'
import { isNumber } from '@/utils/is'
let controller = new AbortController() let controller = new AbortController()
@@ -15,14 +15,17 @@ const ms = useMessage()
const historyStore = useHistoryStore() const historyStore = useHistoryStore()
let messageReactive: MessageReactive | null = null
const scrollRef = ref<HTMLDivElement>() const scrollRef = ref<HTMLDivElement>()
const { addChat, clearChat: handleClear } = useChat() const { addChat, clearChat } = useChat()
const prompt = ref('') const prompt = ref('')
const loading = ref(false) const loading = ref(false)
const currentActive = computed(() => historyStore.active) const currentActive = computed(() => historyStore.active)
const heartbeat = computed(() => historyStore.heartbeat)
const list = computed<Chat.Chat[]>(() => historyStore.getCurrentChat) const list = computed<Chat.Chat[]>(() => historyStore.getCurrentChat)
const chatList = computed<Chat.Chat[]>(() => list.value.filter(item => (!item.reversal && !item.error))) const chatList = computed<Chat.Chat[]>(() => list.value.filter(item => (!item.reversal && !item.error)))
@@ -31,6 +34,8 @@ async function handleSubmit() {
if (loading.value) if (loading.value)
return return
controller = new AbortController()
const message = prompt.value.trim() const message = prompt.value.trim()
if (!message || !message.length) { if (!message || !message.length) {
@@ -49,15 +54,17 @@ async function handleSubmit() {
try { try {
loading.value = true loading.value = true
createMessage()
const { data } = await fetchChatAPI(message, options, controller.signal) const { data } = await fetchChatAPI(message, options, controller.signal)
addMessage(data?.text ?? '', { options: { conversationId: data.conversationId, parentMessageId: data.id } }) addMessage(data?.text ?? '', { options: { conversationId: data.conversationId, parentMessageId: data.id } })
} }
catch (error: any) { catch (error: any) {
if (error.message !== 'cancelled') if (error.message !== 'canceled')
addMessage(`Error: ${error.message ?? 'Request failed, please try again later.'}`, { error: true }) addMessage(`${error.message ?? 'Request failed, please try again later.'}`, { error: true })
} }
finally { finally {
loading.value = false loading.value = false
removeMessage()
} }
} }
@@ -69,9 +76,8 @@ function handleEnter(event: KeyboardEvent) {
function addMessage( function addMessage(
message: string, message: string,
args?: { reversal?: boolean; error?: boolean; options?: Chat.ChatOptions }, args?: { reversal?: boolean; error?: boolean; options?: Chat.ChatOptions },
uuid?: number | null,
) { ) {
addChat(message, args, uuid) addChat(message, args)
scrollToBottom() scrollToBottom()
} }
@@ -79,21 +85,53 @@ function scrollToBottom() {
nextTick(() => scrollRef.value && (scrollRef.value.scrollTop = scrollRef.value.scrollHeight)) nextTick(() => scrollRef.value && (scrollRef.value.scrollTop = scrollRef.value.scrollHeight))
} }
function handleClear() {
handleCancel()
clearChat()
}
function handleCancel() { function handleCancel() {
// 取消之后一定要重新赋值,否则会报错
controller.abort() controller.abort()
controller = new AbortController() controller = new AbortController()
loading.value = false loading.value = false
removeMessage()
}
function createMessage() {
if (!messageReactive) {
messageReactive = ms.loading('Thinking...', {
duration: 0,
})
}
}
function removeMessage() {
if (messageReactive) {
messageReactive.destroy()
messageReactive = null
}
} }
onMounted(() => { onMounted(() => {
scrollToBottom() scrollToBottom()
}) })
onBeforeUnmount(() => {
handleCancel()
})
watch(
heartbeat,
() => {
handleCancel()
scrollToBottom()
},
)
watch( watch(
currentActive, currentActive,
(active) => { (_, oldActive) => {
if (isNumber(active)) { if (oldActive !== null) {
handleCancel() handleCancel()
scrollToBottom() scrollToBottom()
} }
@@ -106,12 +144,20 @@ watch(
<div class="flex flex-col h-full"> <div class="flex flex-col h-full">
<main class="flex-1 overflow-hidden"> <main class="flex-1 overflow-hidden">
<div ref="scrollRef" class="h-full p-4 overflow-hidden overflow-y-auto"> <div ref="scrollRef" class="h-full p-4 overflow-hidden overflow-y-auto">
<div> <template v-if="!list.length">
<Message <div class="flex items-center justify-center mt-4 text-center text-neutral-300">
v-for="(item, index) of list" :key="index" :date-time="item.dateTime" :message="item.message" <SvgIcon icon="ri:bubble-chart-fill" class="mr-2 text-3xl" />
:reversal="item.reversal" :error="item.error" <span>Aha~</span>
/> </div>
</div> </template>
<template v-else>
<div>
<Message
v-for="(item, index) of list" :key="index" :date-time="item.dateTime" :message="item.message"
:reversal="item.reversal" :error="item.error"
/>
</div>
</template>
</div> </div>
</main> </main>
<footer class="p-4"> <footer class="p-4">
@@ -122,7 +168,7 @@ watch(
</span> </span>
</HoverButton> </HoverButton>
<NInput v-model:value="prompt" placeholder="Type a message..." @keypress="handleEnter" /> <NInput v-model:value="prompt" placeholder="Type a message..." @keypress="handleEnter" />
<NButton type="primary" :loading="loading" @click="handleCancel"> <NButton type="primary" :disabled="loading" @click="handleSubmit">
<template #icon> <template #icon>
<SvgIcon icon="ri:send-plane-fill" /> <SvgIcon icon="ri:send-plane-fill" />
</template> </template>

View File

@@ -1,19 +1,42 @@
<script setup lang='ts'> <script setup lang='ts'>
import { computed } from 'vue'
import { NLayout, NLayoutContent } from 'naive-ui' import { NLayout, NLayoutContent } from 'naive-ui'
import Sider from './sider/index.vue' import Sider from './sider/index.vue'
import Header from './header/index.vue'
import { useBasicLayout } from '@/hooks/useBasicLayout'
import { useAppStore } from '@/store'
const appStore = useAppStore()
const { isMobile } = useBasicLayout()
const collapsed = computed(() => appStore.siderCollapsed)
const getMobileClass = computed(() => {
if (isMobile.value)
return ['rounded-none', 'shadow-none']
return ['border', 'rounded-md', 'shadow-md']
})
const getContainerClass = computed(() => {
return [
'h-full',
{ 'pt-14': isMobile.value },
{ 'pl-[260px]': !isMobile.value && !collapsed.value },
]
})
</script> </script>
<template> <template>
<div class="h-full overflow-hidden border rounded-md shadow-md min-w-[640px]"> <div class="h-screen p-4" :class="[{ 'p-0': isMobile }]">
<NLayout class="h-full" has-sider> <div class="h-full overflow-hidden" :class="getMobileClass">
<Sider /> <NLayout class="z-40 transition" :class="getContainerClass" has-sider>
<NLayoutContent class="h-full"> <Sider />
<slot /> <Header v-if="isMobile" />
</NLayoutContent> <NLayoutContent class="h-full">
</NLayout> <slot />
</NLayoutContent>
</NLayout>
</div>
</div> </div>
</template> </template>
<style>
</style>

View File

@@ -0,0 +1,36 @@
<script lang="ts" setup>
import { computed } from 'vue'
import { SvgIcon } from '@/components/common'
import { useAppStore, useHistoryStore } from '@/store'
const appStore = useAppStore()
const historyStore = useHistoryStore()
const collapsed = computed(() => appStore.siderCollapsed)
function handleAdd() {
historyStore.addHistory({
title: 'New Chat',
isEdit: false,
data: [],
})
}
function handleUpdateCollapsed() {
appStore.setSiderCollapsed(!collapsed.value)
}
</script>
<template>
<header class="fixed top-0 left-0 right-0 z-50 border-b bg-white/80 backdrop-blur">
<div class="relative flex items-center justify-between px-4 h-14">
<button class="flex items-center justify-center w-11 h-11" @click="handleUpdateCollapsed">
<SvgIcon v-if="collapsed" class="text-2xl" icon="ri:align-justify" />
<SvgIcon v-else class="text-2xl" icon="ri:align-right" />
</button>
<button class="flex items-center justify-center w-11 h-11" @click="handleAdd">
<SvgIcon class="text-2xl" icon="ri:add-fill" />
</button>
</div>
</header>
</template>

View File

@@ -1,14 +0,0 @@
<script setup lang='ts'>
import { HoverButton, SvgIcon, UserAvatar } from '@/components/common'
</script>
<template>
<footer class="flex items-center justify-between min-w-0 p-4 overflow-hidden border-t h-[70px]">
<UserAvatar class="flex-1" />
<HoverButton tooltip="Setting">
<span class="text-xl text-[#4f555e]">
<SvgIcon icon="ri:settings-4-line" />
</span>
</HoverButton>
</footer>
</template>

View File

@@ -12,56 +12,68 @@ function handleSelect(index: number) {
historyStore.chooseHistory(index) historyStore.chooseHistory(index)
} }
function handleEdit(index: number, isEdit: boolean) { function handleEdit(index: number, isEdit: boolean, event?: MouseEvent) {
historyStore.editHistory(index, isEdit) historyStore.editHistory(index, isEdit)
event?.stopPropagation()
} }
function handleRemove(index: number) { function handleRemove(index: number, event?: MouseEvent) {
historyStore.removeHistory(index) historyStore.removeHistory(index)
event?.stopPropagation()
} }
function handleEnter(index: number, isEdit: boolean, event: KeyboardEvent) { function handleEnter(index: number, isEdit: boolean, event: KeyboardEvent) {
if (event.key === 'Enter') if (event.key === 'Enter') {
handleEdit(index, isEdit) handleEdit(index, isEdit)
event.stopPropagation()
}
} }
</script> </script>
<template> <template>
<NScrollbar class="px-4"> <NScrollbar class="px-4">
<div class="flex flex-col gap-2 text-sm"> <div class="flex flex-col gap-2 text-sm">
<div v-for="(item, index) of dataSources" :key="index"> <template v-if="!dataSources.length">
<a <div class="flex flex-col items-center mt-4 text-center text-neutral-300">
class="relative flex items-center gap-3 px-3 py-3 break-all border rounded-md cursor-pointer pr-14 hover:bg-neutral-100 group" <SvgIcon icon="ri:inbox-line" class="mb-2 text-3xl" />
:class="historyStore.active === index && ['border-[#4b9e5f]', 'bg-neutral-100', 'text-[#4b9e5f]']" <span>No history</span>
@click="handleSelect(index)" </div>
> </template>
<span> <template v-else>
<SvgIcon icon="ri:message-3-line" /> <div v-for="(item, index) of dataSources" :key="index">
</span> <a
<div class="relative flex-1 overflow-hidden break-all text-ellipsis whitespace-nowrap"> class="relative flex items-center gap-3 px-3 py-3 break-all border rounded-md cursor-pointer hover:bg-neutral-100 group"
<NInput :class="historyStore.active === index && ['border-[#4b9e5f]', 'bg-neutral-100', 'text-[#4b9e5f]', 'pr-14']"
v-if="item.isEdit" v-model:value="item.title" size="tiny" @click="handleSelect(index)"
@keypress="handleEnter(index, false, $event)" >
/> <span>
<span v-else>{{ item.title }}</span> <SvgIcon icon="ri:message-3-line" />
</div> </span>
<div class="absolute z-10 flex visible right-1"> <div class="relative flex-1 overflow-hidden break-all text-ellipsis whitespace-nowrap">
<template v-if="item.isEdit"> <NInput
<button class="p-1" @click="handleEdit(index, false)"> v-if="item.isEdit" v-model:value="item.title" size="tiny"
<SvgIcon icon="ri:save-line" /> @keypress="handleEnter(index, false, $event)"
</button> />
</template> <span v-else>{{ item.title }}</span>
<template v-else> </div>
<button class="p-1"> <div v-if="historyStore.active === index" class="absolute z-10 flex visible right-1">
<SvgIcon icon="ri:edit-line" @click="handleEdit(index, true)" /> <template v-if="item.isEdit">
</button> <button class="p-1" @click="handleEdit(index, false, $event)">
<button class="p-1" @click="handleRemove(index)"> <SvgIcon icon="ri:save-line" />
<SvgIcon icon="ri:delete-bin-line" /> </button>
</button> </template>
</template> <template v-else>
</div> <button class="p-1">
</a> <SvgIcon icon="ri:edit-line" @click="handleEdit(index, true, $event)" />
</div> </button>
<button class="p-1" @click="handleRemove(index, $event)">
<SvgIcon icon="ri:delete-bin-line" />
</button>
</template>
</div>
</a>
</div>
</template>
</div> </div>
</NScrollbar> </NScrollbar>
</template> </template>

View File

@@ -1,14 +1,16 @@
<script setup lang='ts'> <script setup lang='ts'>
import { ref } from 'vue' import { computed, watch } from 'vue'
import { NButton, NLayoutSider } from 'naive-ui' import { NButton, NLayoutSider } from 'naive-ui'
import List from './List.vue' import List from './List.vue'
import Footer from './Footer.vue' import { HoverButton, SvgIcon, UserAvatar } from '@/components/common'
import { useAppStore, useHistoryStore } from '@/store' import { useAppStore, useHistoryStore } from '@/store'
import { useBasicLayout } from '@/hooks/useBasicLayout'
const appStore = useAppStore() const appStore = useAppStore()
const historyStore = useHistoryStore() const historyStore = useHistoryStore()
const { isMobile } = useBasicLayout()
const collapsed = ref(appStore.siderCollapsed ?? false) const collapsed = computed(() => appStore.siderCollapsed)
function handleAdd() { function handleAdd() {
historyStore.addHistory({ historyStore.addHistory({
@@ -18,10 +20,17 @@ function handleAdd() {
}) })
} }
function handleCollapsed() { function handleUpdateCollapsed() {
collapsed.value = !collapsed.value appStore.setSiderCollapsed(!collapsed.value)
appStore.setSiderCollapsed(collapsed.value)
} }
watch(
isMobile,
(val) => {
appStore.setSiderCollapsed(val)
},
{ flush: 'post' },
)
</script> </script>
<template> <template>
@@ -29,12 +38,13 @@ function handleCollapsed() {
:collapsed="collapsed" :collapsed="collapsed"
:collapsed-width="0" :collapsed-width="0"
:width="260" :width="260"
collapse-mode="width" :show-trigger="isMobile ? false : 'arrow-circle'"
show-trigger="arrow-circle" collapse-mode="transform"
position="absolute"
bordered bordered
@update:collapsed="handleCollapsed" @update-collapsed="handleUpdateCollapsed"
> >
<div class="flex flex-col h-full"> <div class="flex flex-col h-full" :class="[{ 'pt-14': isMobile }]">
<main class="flex-1 min-h-0 overflow-hidden"> <main class="flex-1 min-h-0 overflow-hidden">
<div class="p-4"> <div class="p-4">
<NButton dashed block @click="handleAdd"> <NButton dashed block @click="handleAdd">
@@ -43,7 +53,14 @@ function handleCollapsed() {
</div> </div>
<List /> <List />
</main> </main>
<Footer /> <footer class="flex items-center justify-between min-w-0 p-4 overflow-hidden border-t h-[70px]">
<UserAvatar />
<HoverButton tooltip="Setting">
<span class="text-xl text-[#4f555e]">
<SvgIcon icon="ri:settings-4-line" />
</span>
</HoverButton>
</footer>
</div> </div>
</NLayoutSider> </NLayoutSider>
</template> </template>

View File

@@ -17,7 +17,3 @@ import { GithubSite } from '@/components/custom'
</div> </div>
</div> </div>
</template> </template>
<style>
</style>

View File

@@ -0,0 +1,15 @@
import type { App, Directive } from 'vue'
import hljs from 'highlight.js'
const regexp = /^(?:\s{4}|\t).+/gm
export default function setupHighlightDirective(app: App) {
const highLightDirective: Directive<HTMLElement> = {
mounted(el: HTMLElement) {
if (el.textContent?.indexOf(' = ') !== -1 || el.textContent.match(regexp))
hljs.highlightBlock(el)
},
}
app.directive('highlight', highLightDirective)
}

6
src/directives/index.ts Normal file
View File

@@ -0,0 +1,6 @@
import type { App } from 'vue'
import setupHighlightDirective from './highlight'
export function setupDirectives(app: App) {
setupHighlightDirective(app)
}

View File

@@ -0,0 +1,8 @@
import { breakpointsTailwind, useBreakpoints } from '@vueuse/core'
export function useBasicLayout() {
const breakpoints = useBreakpoints(breakpointsTailwind)
const isMobile = breakpoints.smaller('sm')
return { isMobile }
}

View File

@@ -1,5 +1,6 @@
import { createApp } from 'vue' import { createApp } from 'vue'
import App from './App.vue' import App from './App.vue'
import { setupDirectives } from './directives'
import { setupAssets } from '@/plugins' import { setupAssets } from '@/plugins'
import { setupStore } from '@/store' import { setupStore } from '@/store'
import { setupRouter } from '@/router' import { setupRouter } from '@/router'
@@ -10,6 +11,8 @@ async function bootstrap() {
setupStore(app) setupStore(app)
setupDirectives(app)
await setupRouter(app) await setupRouter(app)
app.mount('#app') app.mount('#app')

View File

@@ -1,3 +1,4 @@
import 'highlight.js/styles/xcode.css'
import '@/styles/global.css' import '@/styles/global.css'
/** Tailwind's Preflight Style Override */ /** Tailwind's Preflight Style Override */

View File

@@ -1,6 +1,6 @@
import type { App } from 'vue' import type { App } from 'vue'
import type { RouteRecordRaw } from 'vue-router' import type { RouteRecordRaw } from 'vue-router'
import { createRouter, createWebHashHistory } from 'vue-router' import { createRouter, createWebHistory } from 'vue-router'
const routes: RouteRecordRaw[] = [ const routes: RouteRecordRaw[] = [
{ {
@@ -11,7 +11,7 @@ const routes: RouteRecordRaw[] = [
] ]
export const router = createRouter({ export const router = createRouter({
history: createWebHashHistory(), history: createWebHistory(),
routes, routes,
scrollBehavior: () => ({ left: 0, top: 0 }), scrollBehavior: () => ({ left: 0, top: 0 }),
}) })

View File

@@ -9,8 +9,5 @@ export const useAppStore = defineStore('app-store', {
this.siderCollapsed = collapsed this.siderCollapsed = collapsed
setLocalSetting(this.$state) setLocalSetting(this.$state)
}, },
toggleSiderCollapse() {
this.setSiderCollapsed(!this.siderCollapsed)
},
}, },
}) })

View File

@@ -5,10 +5,11 @@ const LOCAL_NAME = 'historyChat'
export interface HistoryState { export interface HistoryState {
historyChat: Chat.HistoryChat[] historyChat: Chat.HistoryChat[]
active: number | null active: number | null
heartbeat: boolean
} }
export function defaultSetting() { export function defaultSetting() {
return { historyChat: [], active: null } return { historyChat: [], active: null, heartbeat: false }
} }
export function getLocalHistory() { export function getLocalHistory() {

View File

@@ -1,6 +1,7 @@
import { defineStore } from 'pinia' import { defineStore } from 'pinia'
import type { HistoryState } from './helper' import type { HistoryState } from './helper'
import { getLocalHistory, setLocalHistory } from './helper' import { getLocalHistory, setLocalHistory } from './helper'
export const useHistoryStore = defineStore('history-store', { export const useHistoryStore = defineStore('history-store', {
state: (): HistoryState => getLocalHistory(), state: (): HistoryState => getLocalHistory(),
getters: { getters: {
@@ -18,16 +19,16 @@ export const useHistoryStore = defineStore('history-store', {
}, },
}, },
actions: { actions: {
addChat(data: Chat.Chat, uuid: number | null = null) { addChat(data: Chat.Chat) {
if (this.active === null) { if (this.active === null) {
this.historyChat.push({ title: data.message, isEdit: false, data: [data] }) this.historyChat.push({ title: data.message, isEdit: false, data: [data] })
this.active = this.historyChat.length - 1 this.active = this.historyChat.length - 1
} }
else { else {
const active = uuid !== null ? uuid : this.active if (this.historyChat[this.active].title === 'New Chat')
if (this.historyChat[active].title === 'New Chat') this.historyChat[this.active].title = data.message
this.historyChat[active].title = data.message
this.historyChat[active].data.push(data) this.historyChat[this.active].data.push(data)
} }
setLocalHistory(this.$state) setLocalHistory(this.$state)
}, },
@@ -52,14 +53,19 @@ export const useHistoryStore = defineStore('history-store', {
removeHistory(index: number) { removeHistory(index: number) {
this.historyChat.splice(index, 1) this.historyChat.splice(index, 1)
if (this.active === index) { if (this.active === index) {
if (this.historyChat.length === 0) if (this.historyChat.length === 0)
this.active = null this.active = null
else if (this.active === this.historyChat.length) else if (this.active === this.historyChat.length)
this.active-- this.active = this.historyChat.length - 1
else
this.active = 0
} }
if (this.historyChat.length === 0)
this.active = null
this.toggleHeartbeat()
setLocalHistory(this.$state) setLocalHistory(this.$state)
}, },
@@ -69,5 +75,9 @@ export const useHistoryStore = defineStore('history-store', {
this.active = index this.active = index
setLocalHistory(this.$state) setLocalHistory(this.$state)
}, },
toggleHeartbeat() {
this.heartbeat = !this.heartbeat
},
}, },
}) })

View File

@@ -1,6 +1,6 @@
/// <reference types="vite/client" /> /// <reference types="vite/client" />
interface ImportMetaEnv { interface ImportMetaEnv {
/** api url */
readonly VITE_GLOB_API_URL: string; readonly VITE_GLOB_API_URL: string;
readonly VITE_APP_API_BASE_URL: string;
} }

View File

@@ -14,7 +14,7 @@ export function isNull<T extends null>(value: T | unknown): value is null {
return Object.prototype.toString.call(value) === '[object Null]' return Object.prototype.toString.call(value) === '[object Null]'
} }
export function isUndefine<T extends undefined>(value: T | unknown): value is undefined { export function isUndefined<T extends undefined>(value: T | unknown): value is undefined {
return Object.prototype.toString.call(value) === '[object Undefined]' return Object.prototype.toString.call(value) === '[object Undefined]'
} }

View File

@@ -2,7 +2,7 @@ import axios, { type AxiosResponse } from 'axios'
const service = axios.create({ const service = axios.create({
baseURL: import.meta.env.VITE_GLOB_API_URL, baseURL: import.meta.env.VITE_GLOB_API_URL,
timeout: 10 * 1000, timeout: 30 * 1000,
}) })
service.interceptors.request.use( service.interceptors.request.use(

View File

@@ -11,10 +11,6 @@ export interface HttpOption {
afterRequest?: () => void afterRequest?: () => void
} }
export interface ExtraOption {
notification?: boolean
}
export interface Response<T = any> { export interface Response<T = any> {
data: T data: T
message: string | null message: string | null

View File

@@ -3,11 +3,5 @@ import { Chat } from '@/components/business'
</script> </script>
<template> <template>
<div class="h-full p-4 overflow-hidden"> <Chat />
<Chat />
</div>
</template> </template>
<style>
</style>

11
start.sh Normal file
View File

@@ -0,0 +1,11 @@
cd ./service
nohup pnpm start > service.log &
echo "Start service complete!"
cd ..
echo "" > front.log
nohup pnpm dev > front.log &
echo "Start front complete!"
tail -f front.log

View File

@@ -16,7 +16,8 @@
"paths": { "paths": {
"@/*": ["./src/*"] "@/*": ["./src/*"]
}, },
"types": ["vite/client", "node", "naive-ui/volar"] // @vueuse/core 不能通过 vue-tsc 检查,所以这里需要忽略,以后将移除
"types": ["vite/client", "node", "naive-ui/volar", "web-bluetooth"]
}, },
"exclude": ["node_modules", "dist", "service"] "exclude": ["node_modules", "dist", "service"]
} }

View File

@@ -1,8 +1,10 @@
import path from 'path' import path from 'path'
import { defineConfig } from 'vite' import { defineConfig, loadEnv } from 'vite'
import vue from '@vitejs/plugin-vue' import vue from '@vitejs/plugin-vue'
export default defineConfig(() => { export default defineConfig((env) => {
const viteEnv = loadEnv(env.mode, process.cwd()) as unknown as ImportMetaEnv
return { return {
resolve: { resolve: {
alias: { alias: {
@@ -14,6 +16,13 @@ export default defineConfig(() => {
port: 1002, port: 1002,
host: '0.0.0.0', host: '0.0.0.0',
open: false, open: false,
proxy: {
'/api': {
target: viteEnv.VITE_APP_API_BASE_URL,
changeOrigin: true, // 允许跨域
rewrite: path => path.replace('/api/', '/'),
},
},
}, },
build: { build: {
reportCompressedSize: false, reportCompressedSize: false,