From 1d7098a0cbfd1c73e730fa51d4b22e1af57e7805 Mon Sep 17 00:00:00 2001 From: Rafi Date: Tue, 11 Apr 2023 22:08:16 +0800 Subject: [PATCH] Use Vuepress to generate a static site for docs. --- .gitignore | 2 + docs/.vuepress/config.ts | 56 ++ docs/.vuepress/configs/index.ts | 2 + docs/.vuepress/configs/navbar/en.ts | 12 + docs/.vuepress/configs/navbar/index.ts | 2 + docs/.vuepress/configs/navbar/zh.ts | 12 + docs/.vuepress/configs/sidebar/en.ts | 17 + docs/.vuepress/configs/sidebar/index.ts | 2 + docs/.vuepress/configs/sidebar/zh.ts | 17 + docs/.vuepress/public/images/bmc_qr.png | Bin 0 -> 65133 bytes docs/README.md | 40 ++ docs/guide/buymeacoffee.md | 7 + docs/guide/configuration.md | 79 +++ docs/guide/development.md | 62 ++ docs/guide/problems.md | 13 + docs/guide/quick-start.md | 112 ++++ docs/zh/README.md | 220 +------ docs/zh/guide/buymeacoffee.md | 7 + docs/zh/guide/configuration.md | 80 +++ docs/zh/guide/development.md | 62 ++ docs/zh/guide/problems.md | 13 + docs/zh/guide/quick-start.md | 112 ++++ package.json | 7 +- yarn.lock | 765 +++++++++++++++++++++++- 24 files changed, 1495 insertions(+), 206 deletions(-) create mode 100644 docs/.vuepress/config.ts create mode 100644 docs/.vuepress/configs/index.ts create mode 100644 docs/.vuepress/configs/navbar/en.ts create mode 100644 docs/.vuepress/configs/navbar/index.ts create mode 100644 docs/.vuepress/configs/navbar/zh.ts create mode 100644 docs/.vuepress/configs/sidebar/en.ts create mode 100644 docs/.vuepress/configs/sidebar/index.ts create mode 100644 docs/.vuepress/configs/sidebar/zh.ts create mode 100644 docs/.vuepress/public/images/bmc_qr.png create mode 100644 docs/README.md create mode 100644 docs/guide/buymeacoffee.md create mode 100644 docs/guide/configuration.md create mode 100644 docs/guide/development.md create mode 100644 docs/guide/problems.md create mode 100644 docs/guide/quick-start.md create mode 100644 docs/zh/guide/buymeacoffee.md create mode 100644 docs/zh/guide/configuration.md create mode 100644 docs/zh/guide/development.md create mode 100644 docs/zh/guide/problems.md create mode 100644 docs/zh/guide/quick-start.md diff --git a/.gitignore b/.gitignore index a12cff6..b5dbd71 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,5 @@ node_modules .env .idea dist +.temp +.cache diff --git a/docs/.vuepress/config.ts b/docs/.vuepress/config.ts new file mode 100644 index 0000000..b879f4f --- /dev/null +++ b/docs/.vuepress/config.ts @@ -0,0 +1,56 @@ +import { defineUserConfig, defaultTheme } from 'vuepress' +import { + navbarEn, + navbarZh, + sidebarEn, + sidebarZh, + } from './configs/index.js' + +export default defineUserConfig({ + title: 'ChatGPT UI', + description: 'A ChatGPT web client', + base: '/chatgpt-ui/', + locales: { + // 键名是该语言所属的子路径 + // 作为特例,默认语言可以使用 '/' 作为其路径。 + '/': { + lang: 'en-US', + description: 'A ChatGPT web client', + }, + '/zh/': { + lang: 'zh-CN', + description: '一个 ChatGPT 的 Web 客户端', + }, + }, + theme: defaultTheme({ + locales: { + '/': { + // navbar + navbar: navbarEn, + // sidebar + sidebar: sidebarEn, + }, + '/zh/': { + // navbar + navbar: navbarZh, + selectLanguageName: '简体中文', + selectLanguageText: '选择语言', + selectLanguageAriaLabel: '选择语言', + // sidebar + sidebar: sidebarZh, + // 404 page + notFound: [ + '这里什么都没有', + '我们怎么到这来了?', + '这是一个 404 页面', + '看起来我们进入了错误的链接', + ], + backToHome: '返回首页', + // a11y + openInNewWindow: '在新窗口打开', + toggleColorMode: '切换颜色模式', + toggleSidebar: '切换侧边栏', + }, + }, + }), +}) \ No newline at end of file diff --git a/docs/.vuepress/configs/index.ts b/docs/.vuepress/configs/index.ts new file mode 100644 index 0000000..54bd390 --- /dev/null +++ b/docs/.vuepress/configs/index.ts @@ -0,0 +1,2 @@ +export * from './navbar/index.js' +export * from './sidebar/index.js' \ No newline at end of file diff --git a/docs/.vuepress/configs/navbar/en.ts b/docs/.vuepress/configs/navbar/en.ts new file mode 100644 index 0000000..c49e361 --- /dev/null +++ b/docs/.vuepress/configs/navbar/en.ts @@ -0,0 +1,12 @@ +import type { NavbarConfig } from '@vuepress/theme-default' + +export const navbarEn: NavbarConfig = [ + { + text: 'Guide', + link: '/', + }, + { + text: 'Changelog', + link: 'https://github.com/WongSaang/chatgpt-ui/releases' + } +] \ No newline at end of file diff --git a/docs/.vuepress/configs/navbar/index.ts b/docs/.vuepress/configs/navbar/index.ts new file mode 100644 index 0000000..a0660de --- /dev/null +++ b/docs/.vuepress/configs/navbar/index.ts @@ -0,0 +1,2 @@ +export * from './en.js' +export * from './zh.js' \ No newline at end of file diff --git a/docs/.vuepress/configs/navbar/zh.ts b/docs/.vuepress/configs/navbar/zh.ts new file mode 100644 index 0000000..251c7f1 --- /dev/null +++ b/docs/.vuepress/configs/navbar/zh.ts @@ -0,0 +1,12 @@ +import type { NavbarConfig } from '@vuepress/theme-default' + +export const navbarZh: NavbarConfig = [ + { + text: '指南', + link: '/zh/', + }, + { + text: '更新日志', + link: 'https://github.com/WongSaang/chatgpt-ui/releases', + } +] \ No newline at end of file diff --git a/docs/.vuepress/configs/sidebar/en.ts b/docs/.vuepress/configs/sidebar/en.ts new file mode 100644 index 0000000..f18310c --- /dev/null +++ b/docs/.vuepress/configs/sidebar/en.ts @@ -0,0 +1,17 @@ +import type { SidebarConfig } from '@vuepress/theme-default' + +export const sidebarEn: SidebarConfig = { + '/': [ + { + text: 'Guide', + children: [ + '/README.md', + '/guide/quick-start.md', + '/guide/configuration.md', + '/guide/problems.md', + '/guide/development.md', + '/guide/buymeacoffee.md', + ], + }, + ] +} \ No newline at end of file diff --git a/docs/.vuepress/configs/sidebar/index.ts b/docs/.vuepress/configs/sidebar/index.ts new file mode 100644 index 0000000..a0660de --- /dev/null +++ b/docs/.vuepress/configs/sidebar/index.ts @@ -0,0 +1,2 @@ +export * from './en.js' +export * from './zh.js' \ No newline at end of file diff --git a/docs/.vuepress/configs/sidebar/zh.ts b/docs/.vuepress/configs/sidebar/zh.ts new file mode 100644 index 0000000..47ab9a1 --- /dev/null +++ b/docs/.vuepress/configs/sidebar/zh.ts @@ -0,0 +1,17 @@ +import type { SidebarConfig } from '@vuepress/theme-default' + +export const sidebarZh: SidebarConfig = { + '/zh/': [ + { + text: '指南', + children: [ + '/zh/README.md', + '/zh/guide/quick-start.md', + '/zh/guide/configuration.md', + '/zh/guide/problems.md', + '/zh/guide/development.md', + '/zh/guide/buymeacoffee.md', + ], + }, + ] +} \ No newline at end of file diff --git a/docs/.vuepress/public/images/bmc_qr.png b/docs/.vuepress/public/images/bmc_qr.png new file mode 100644 index 0000000000000000000000000000000000000000..61b278a25a24b97dc85c958a6ea39b1f5dc138fc GIT binary patch literal 65133 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 La-t(Cm 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 R+P{FmbEcMOD@?A({2%IYzb^m) literal 0 HcmV?d00001 diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..ab8d22c --- /dev/null +++ b/docs/README.md @@ -0,0 +1,40 @@ + +# Introduction + +ChatGPT UI is an unofficial ChatGPT web client. It supports multiple users, multiple languages, and multiple database connections for persistent data storage, such as Mysql, PostgreSQL, and Sqlite. + +This project consists of two parts, the client-side and the server-side: + +- Client-side, based on [Nuxt](https://nuxt.com/), project address: [https://github.com/WongSaang/chatgpt-ui](https://github.com/WongSaang/chatgpt-ui) +- Server-side, based on [Django](https://djangoproject.com/), project address: [https://github.com/WongSaang/chatgpt-ui-server](https://github.com/WongSaang/chatgpt-ui-server) + + +## Features + +### Client-side +- User system, supporting user registration, login, password modification, and more. +- Multi-language user interface, supporting multiple languages. +- Persistent data storage, supporting Mysql, PostgreSQL, and Sqlite databases. +- Asynchronous conversation, supporting multiple conversations simultaneously. +- Management of historical conversations. +- Continuous chat, allowing ChatGPT clients to answer questions based on their historical chat records, resulting in better answers. +- Web search capability, allowing ChatGPT to retrieve the latest information. +- Convenient tools, supporting one-click message and code block copying, as well as message editing. +- Common command management, allowing users to store and edit their own common commands. + +### Server-side +- The server-side has an administrative panel. +- User management. +- Conversation and message management. +- Common configurations. + + +## Original Intention + +Since using ChatGPT, it has become a good helper in work. Unfortunately, as we all know, it cannot be accessed in some places. But fortunately, OpenAI has opened up its API, so I started to write a user interface for myself. + +> Nothing is difficult if you put your heart into it. + +Later, several friends asked me how to use ChatGPT because they didn't have the technical skills. So I started to develop a multi-user system, which can not only be used by myself but also help my family and friends around me. + +After the project was open-sourced, many people raised issues and some even submitted PRs, and the project has developed to its current state. I also learned a lot during this process, as I have always believed that helping others is also helping oneself. \ No newline at end of file diff --git a/docs/guide/buymeacoffee.md b/docs/guide/buymeacoffee.md new file mode 100644 index 0000000..4ef6ab8 --- /dev/null +++ b/docs/guide/buymeacoffee.md @@ -0,0 +1,7 @@ +# Donation + +> If this project is helpful to you, it is also helping me. + +If you want to support me, Buy me a coffee ❤️ [https://www.buymeacoffee.com/WongSaang](https://www.buymeacoffee.com/WongSaang) + +![Buy Me A Coffee](/images/bmc_qr.png) \ No newline at end of file diff --git a/docs/guide/configuration.md b/docs/guide/configuration.md new file mode 100644 index 0000000..e0a4ad1 --- /dev/null +++ b/docs/guide/configuration.md @@ -0,0 +1,79 @@ +# Configuration Reference + +## Database + +By default, the backend uses the built-in Sqlite to store data. If an external database is not connected, the data will be lost after the container is destroyed. + +The `chatgpt-ui-wsgi-server` image provides the environment variable `DB_URL` to configure the connection to an external database. The following table shows the link format of the `DB_URL`. + +| DB | LINK | +|----------------------|--------------------------------------------------| +| PostgreSQL | postgres://USER:PASSWORD@HOST:PORT/DATABASE_NAME | +| MySQL | mysql://USER:PASSWORD@HOST:PORT/DATABASE_NAME | +| SQLite | sqlite:///PATH | + +For example, if I am using PostgreSQL, the configuration is as follows: + +``` +backend-wsgi-server: + image: wongsaang/chatgpt-ui-wsgi-server:latest + environment: + - DB_URL=postgres://postgres:postgrespw@localhost:49153/chatgpt +``` + +## Email verification + +If you open the user registration feature and need to send email activation links to users, you need to configure the following environment variables in the `wsgi-server` service: + +| Parameters | Description | Default | +|----------------------|--------------------------------------------------|-----| +| ACCOUNT_EMAIL_VERIFICATION | E-mail authentication method, optional value: none, optional, mandatory | optional | +| EMAIL_HOST | SMTP server address | smtp.mailgun.org | +| EMAIL_PORT | SMTP server port | 587 | +| EMAIL_HOST_USER | User name | - | +| EMAIL_HOST_PASSWORD | Password | - | +| EMAIL_USE_TLS | Whether to encrypt | True | +| EMAIL_FROM | From email | webmaster@localhost | + +## API Proxy + +If you are unable to request the OpenAI API address due to network restrictions, you can configure a proxy in the `wsgi-server` service. You will need to search for how to set up a proxy server on your own. + +For example: + +``` +backend-wsgi-server: + image: wongsaang/chatgpt-ui-wsgi-server:latest + environment: + - OPENAI_API_PROXY=https://openai.proxy.com/v1 +``` + +## Backend CSRF whitelist + +If you encounter `CSRF verification failed` while accessing the management background, your `APP_DOMAIN` may not be configured correctly. Under the `wsgi-server` service, there is an environment variable `wsgi-server`. Its value should be the address and port of `backend-web-server`, default: `localhost:9000`. + +Suppose I have resolved the domain name `chagpt.com` to the server, and my `backend-web-server` service is bound to port 9000. The correct configuration is as follows: + +``` +backend-wsgi-server: + image: wongsaang/chatgpt-ui-wsgi-server:latest + environment: + - APP_DOMAIN=chagpt.com:9000 +``` + +## Client Configuration + +| Parameter | Description | Default Value | +|-----------------------|---------------------------------------------|----------------------------| +| SERVER_DOMAIN | Server Address | http://backend-web-server | +| NUXT_PUBLIC_APP_NAME | Application Name | ChatGPT UI | +| NUXT_PUBLIC_TYPEWRITER| Enable Typewriter Effect [true/false] | true | +| NUXT_PUBLIC_TYPEWRITER_DELAY | Typewriter Effect Delay in milliseconds | 50 | + +## User Registration Control + +After deployment, there is an `open_registration` setting under `Chat->Settings` in the admin panel to control whether user registration is allowed. The default value is `True` (allowing user registration). If not needed, please change it to `False`. + +## Web Search Function Control + +This feature is disabled by default. You can enable it in the admin panel under `Chat->Settings`. There is a setting called `open_web_search`, set its value to `True`. \ No newline at end of file diff --git a/docs/guide/development.md b/docs/guide/development.md new file mode 100644 index 0000000..7a87b41 --- /dev/null +++ b/docs/guide/development.md @@ -0,0 +1,62 @@ +# Development Guide + +## Front-end + +Required skills: [Vue](https://vuejs.org/), [Nuxt](https://nuxt.com/) + +Project address: [https://github.com/WongSaang/chatgpt-ui](https://github.com/WongSaang/chatgpt-ui) + +### Environment Setup +Install the latest stable version of node.js. If you need to package it as a docker image, you also need to install docker. + +### Install dependencies + +``` +yarn install +``` + +### Start development server + +``` +yarn dev +``` + +### Build + +``` +yarn build +``` + +### Package as a docker image + +``` +docker build -t image-name:latest . +``` + + +## Back-end + +Required skills: [Python](https://www.python.org/), [Django](https://djangoproject.com/) + +Project address: [https://github.com/WongSaang/chatgpt-ui-server](https://github.com/WongSaang/chatgpt-ui-server) + +### Environment Setup +Install Python, pip/pipenv. If you need to package it as a docker image, you also need to install docker. + +### Install dependencies + +``` +pip install -r requirements.txt +``` + +### Start development server + +``` +python manage.py runserver +``` + +### Package as a docker image + +``` +docker build -t image-name:latest . +``` \ No newline at end of file diff --git a/docs/guide/problems.md b/docs/guide/problems.md new file mode 100644 index 0000000..96d171a --- /dev/null +++ b/docs/guide/problems.md @@ -0,0 +1,13 @@ +# Encountering Issues + +## Searching for Issues + +If you encounter any issues while using the project, you can search for related keywords on the project's [Issues](https://github.com/WongSaang/chatgpt-ui/issues) page to see if others have faced similar issues and if there are any solutions available. + +## Submitting an Issue + +If you cannot find a solution, you can communicate with the project maintainers by submitting an issue. [Submit an Issue](https://github.com/WongSaang/chatgpt-ui/issues/new) + +**Note** + +The title should be clear and concise, and the description should provide as much detail as possible about the issue or suggestion. If possible, it is best to provide reproducible steps and screenshots. \ No newline at end of file diff --git a/docs/guide/quick-start.md b/docs/guide/quick-start.md new file mode 100644 index 0000000..20fe6af --- /dev/null +++ b/docs/guide/quick-start.md @@ -0,0 +1,112 @@ +# Quick Start + +This project provides related docker images for deployment on a VPS or your local computer. Please note that if your network is unable to request the OpenAI API address, you need to configure a proxy. If you want to make it available to other users, it's best to have a domain name and resolve it to the server. + +You also need an OpenAI API Key, and there are multiple ways to obtain it online, please search for it yourself. + +## Quick deployment through script + +**Note: This script has only been verified on Ubuntu Server 22.04 LTS.** + +``` +bash <(curl -Ls https://raw.githubusercontent.com/WongSaang/chatgpt-ui/main/deployment.sh) +``` + +## Deployment through Docker Compose + + +### Prepare docker-compose.yml + +The project provides a sample `docker-compose.yml`. If you want to customize the configuration, please refer to the [configuration reference](/en/guide/configuration) section. + +You can download the `docker-compose.yml` template to your local machine or server by clicking on the link below: + +[https://raw.githubusercontent.com/WongSaang/chatgpt-ui/main/docker-compose.yml](https://raw.githubusercontent.com/WongSaang/chatgpt-ui/main/docker-compose.yml) + +You can also manually create the `docker-compose.yml` file and copy the following content into the file: + +``` +version: '3' +services: + client: + platform: linux/x86_64 + image: wongsaang/chatgpt-ui-client:latest + environment: + - SERVER_DOMAIN=http://backend-web-server +# - NUXT_PUBLIC_APP_NAME='ChatGPT UI' # The name of the application +# - NUXT_PUBLIC_TYPEWRITER=true # Whether to enable the typewriter effect, default false +# - NUXT_PUBLIC_TYPEWRITER_DELAY=50 # The delay time of the typewriter effect, default 50ms + depends_on: + - backend-web-server + ports: + - '${CLIENT_PORT:-80}:80' + networks: + - chatgpt_ui_network + restart: always + backend-wsgi-server: + platform: linux/x86_64 + image: wongsaang/chatgpt-ui-wsgi-server:latest + environment: + - APP_DOMAIN=${APP_DOMAIN:-localhost:9000} + - SERVER_WORKERS=3 # The number of worker processes for handling requests. + # - DB_URL=postgres://postgres:postgrespw@localhost:49153/chatgpt # If this parameter is not set, the built-in Sqlite will be used by default. It should be noted that if you do not connect to an external database, the data will be lost after the container is destroyed. + - DJANGO_SUPERUSER_USERNAME=admin # default superuser name + - DJANGO_SUPERUSER_PASSWORD=password # default superuser password + - DJANGO_SUPERUSER_EMAIL=admin@example.com # default superuser email + - ACCOUNT_EMAIL_VERIFICATION=${ACCOUNT_EMAIL_VERIFICATION:-none} # Determines the e-mail verification method during signup – choose one of "none", "optional", or "mandatory". Default is "optional". If you don't need to verify the email, you can set it to "none". + # If you want to use the email verification function, you need to configure the following parameters +# - EMAIL_HOST=SMTP server address +# - EMAIL_PORT=SMTP server port +# - EMAIL_HOST_USER= +# - EMAIL_HOST_PASSWORD= +# - EMAIL_USE_TLS=True +# - EMAIL_FROM=no-reply@example.com #Default sender email address + ports: + - '${WSGI_PORT:-8000}:8000' + networks: + - chatgpt_ui_network + restart: always + backend-web-server: + platform: linux/x86_64 + image: wongsaang/chatgpt-ui-web-server:latest + environment: + - BACKEND_URL=http://backend-wsgi-server:8000 + ports: + - '${SERVER_PORT:-9000}:80' + depends_on: + - backend-wsgi-server + networks: + - chatgpt_ui_network + restart: always + +networks: + chatgpt_ui_network: + driver: bridge +``` + +### Starting the Service + +After modifying the configuration as needed, you can start the service by running the following command: + +``` +docker-compose up --pull always -d +``` + +This command is used to start the services specified in the Docker Compose configuration. The specific meanings of the parameters are as follows: + +- `up`: start the services specified in the Docker Compose configuration. +- `--pull always`: before starting the service each time, the latest version of the image will be pulled from the Docker image repository. This ensures that the image used is always up to date. +- `-d`: run the service in the background. If this parameter is not added, the service will run in the current terminal window until the user manually stops it. + +## After Deployment + +Access the management panel at `http(s)://your.domain:9000/admin` or `http(s)://123.123.123.123:9000/admin` using the default superuser account: + +- username: **admin** +- password: **password** + +Before starting a chat, you need to add an OpenAI API key. In the management panel, in the "Settings" section, there is a record named `openai_api_key`. Set the value to your API key. + +Now you can access the client at `http(s)://your.domain` or `http://123.123.123.123` to start chatting. + +🎉🎉🎉 Have fun! \ No newline at end of file diff --git a/docs/zh/README.md b/docs/zh/README.md index f58b62f..798f350 100644 --- a/docs/zh/README.md +++ b/docs/zh/README.md @@ -1,207 +1,39 @@ -
-

ChatGPT UI

-
+# 介绍 -[English](../../README.md) | [中文](./docs/zh/README.md) +ChatGPT UI 是一个非官方的 ChatGPT Web 客户端。它支持多用户,多语言,多种数据库连接进行数据持久化存储,例如:Mysql、PostgreSQL 和 Sqlite 等。 -用户指南: [https://wongsaang.github.io/chatgpt-ui-docs/zh/](https://wongsaang.github.io/chatgpt-ui-docs/zh/) +本项目项目包括客户端和服务端两部分。 -ChatGPT Web 客户端,支持多用户,支持 Mysql、PostgreSQL 等多种数据库连接进行数据持久化存储,支持多语言。提供 Docker 镜像和快速部署脚本。 - -本项目的服务端:[https://github.com/WongSaang/chatgpt-ui-server](https://github.com/WongSaang/chatgpt-ui-server) - -https://user-images.githubusercontent.com/46235412/227156264-ca17ab17-999b-414f-ab06-3f75b5235bfe.mp4 +- 客户端,基于 [Nuxt](https://nuxt.com/),项目地址:[https://github.com/WongSaang/chatgpt-ui](https://github.com/WongSaang/chatgpt-ui) +- 服务端,基于 [Django](https://djangoproject.com/),项目地址:[https://github.com/WongSaang/chatgpt-ui-server](https://github.com/WongSaang/chatgpt-ui-server) -## 📢 更新 +## 功能与特性 -
-2023-04-06 -客户端改成服务端渲染(SSR)的方式部署,现在可以使用环境变量了,可用环境变量请看下方 docker-compose 配置。提升了首屏加载速度,减少白屏时间。 -
+### 客户端 +- 用户系统,支持用户注册、登录、修改密码等。 +- 用户界面多语言,支持多种语言。 +- 数据持久化,支持 Mysql、PostgreSQL 和 Sqlite 等数据库。 +- 异步对话,支持多个对话同时进行。 +- 历史对话管理。 +- 持续聊天,让 ChatGPT 客户历史聊天记录回答问题,得出更好的答案。 +- 网页搜索能力,让 ChatGPT 获取最新信息。 +- 便捷的工具,支持一键复制消息和代码块,以及重新编辑消息等。 +- 常用指令管理,用户可存储和编辑自己的常用指令。 -
-2023-03-27 -🚀 支持 gpt-4 模型。你可以在前端的“模型参数”中选择模型,gpt-4 模型需要通过 openai 的白名单才能使用。 -
- -
-2023-03-23 -增加网页搜索能力,使得 ChatGPT 生成的回答更与时俱进! -该功能默认处于关闭状态,你可以在管理后台的 `Chat->Settings` 中开启它,在 Settings 中有一个 `open_web_search` 的记录,把它的值设置为 True。 -
- -
-2023-03-15 - -在管理后台增加 `open_registration` 设置项,用于控制是否开放用户注册。你可以登录管理后台,在 `Chat->Setting` 中看到这个设置项,默认是 `True` (允许用户注册),如果不需要,请改成 `False`。 - -
- -
-2023-03-04 - -**使用最新的官方聊天模型** `gpt-3.5-turbo` - -**🎉🎉🎉 提供一个 shell 脚本,用于快速部署到服务器** [使用方法](#one-click-depolyment) - -
- -
- -2023-02-24 -V2 是一个重要的更新,将后端功能分离为一个独立的项目,托管在 [chatgpt-ui-server](https://github.com/WongSaang/chatgpt-ui-server), 该项目使用基于 Python 的 Django 框架。 - -如果您仍然希望使用旧版本,请访问 [v1 branch](https://github.com/WongSaang/chatgpt-ui/tree/v1) (不推荐,不再更新). - -
- -## V2 的功能特性: - -- 😉 前后端分离,后端使用基于 Python 的 Django 框架。 -- 😘 用户身份验证,支持多个用户。 -- 😀 能够将数据存储在外部数据库中,支持 Mysql、PostgreSQL 等数据库(默认为 Sqlite)。 -- 😎 持续对话,让AI根据上下文回答问题。 +### 服务端 +- 服务端拥有一个管理面板 +- 用户管理 +- 对话和消息管理 +- 常用配置 -## 🚀 一行命令部署到服务器
+## 初衷 -注意:此脚本仅在 Ubuntu Server 22.04 LTS 上验证过。 +自从使用 ChatGPT ,它已经成为工作中的好帮手。可惜的是,就像大家知道的,它在有些地方无法访问。但好在 OpenAI 开放了 API,于是我开始为自己写用户界面。 -```bash -bash <(curl -Ls https://raw.githubusercontent.com/WongSaang/chatgpt-ui/main/deployment.sh) -``` +> 世上无难事,只怕有心人。 -> 如果您拥有一个域名,可以使用 DNS 解析将其指向服务器的 IP 地址。当然,直接使用服务器的 IP 地址也是可以的。 -> 在脚本执行期间,会提示您输入域名。如果您没有域名,可以直接输入服务器的 IP 地址。 +后来,有多位朋友询问我怎么样才能使用 ChatGPT,因为他们没有技术能力。于是我又着手于多用户系统的开发,这样除了自己用,还能帮助到身边的亲朋好友。 -### 部署完成之后 - -访问 `http(s)://your.domain:9000/admin` / IP `http(s)://123.123.123.123:9000/admin` 登录管理面板。 - -默认超级用户: `admin` - -默认密码: `password` - -在可以开始聊天之前,您需要添加一个 OpenAI 的 API 密钥。在管理面板的设置模型中,添加一个名称为 openai_api_key 的记录,将值设置为您的 API 密钥。 - -现在可以访问客户端地址 `http(s)://your.domain` / `http://123.123.123.123` 开始聊天。 - -🎉🎉🎉 享受吧! - -## 通过 Docker Compose 快速开始 - -以下是一个 docker-compose.yml 模板,您可以使用它来快速启动服务。 - -```yaml -version: '3' -services: - client: - image: wongsaang/chatgpt-ui-client:latest - environment: - - SERVER_DOMAIN=http://backend-web-server - # - NUXT_PUBLIC_APP_NAME='ChatGPT UI' # APP 名称 - # - NUXT_PUBLIC_TYPEWRITER=true # 是否开启 打字机 效果 - # - NUXT_PUBLIC_TYPEWRITER_DELAY=50 # 打字机效果的延迟时间,单位:毫秒,默认:50 - depends_on: - - backend-web-server - ports: - - '80:80' - networks: - - chatgpt_ui_network - backend-wsgi-server: - image: wongsaang/chatgpt-ui-wsgi-server:latest - environment: - - APP_DOMAIN=${APP_DOMAIN:-localhost:9000} # CSRF 白名单,在这里设置为 chatgpt-ui-web-server 的地址+端口, 默认: localhost:9000 - - SERVER_WORKERS=3 # gunicorn 的工作进程数,默认为 3 - - WORKER_TIMEOUT=180 # 请求超时时间,默认为 180 秒 - #- DB_URL=postgres://postgres:postgrespw@localhost:49153/chatgpt # 连接外部数据库,如果不设置这个参数,则默认使用内置的 Sqlite。需要注意的是,如果不连接外部数据库,数据将在容器销毁后丢失。链接格式请看下面的 DB_URL 格式对照表 - #- OPENAI_API_PROXY=https://openai.proxy.com/v1 # https://api.openai.com/v1 的代理地址 - - DJANGO_SUPERUSER_USERNAME=admin # 默认超级用户 - - DJANGO_SUPERUSER_PASSWORD=password # 默认超级用户的密码 - - DJANGO_SUPERUSER_EMAIL=admin@example.com # 默认超级用户邮箱 - - ACCOUNT_EMAIL_VERIFICATION=none # 邮箱验证方式,可选值: none, optional, mandatory. 默认为 optional。如果你不需要验证用户的邮箱,可以设置为 none。 - # 如果您想使用电子邮件验证功能,需要配置以下参数: - # - EMAIL_HOST=SMTP server address - # - EMAIL_PORT=SMTP server port - # - EMAIL_HOST_USER= - # - EMAIL_HOST_PASSWORD= - # - EMAIL_USE_TLS=True - # - EMAIL_FROM=no-reply@example.com #默认发件邮箱地址 - ports: - - '8000:8000' - networks: - - chatgpt_ui_network - backend-web-server: - image: wongsaang/chatgpt-ui-web-server:latest - environment: - - BACKEND_URL=http://backend-wsgi-server:8000 - ports: - - '9000:80' - depends_on: - - backend-wsgi-server - networks: - - chatgpt_ui_network - -networks: - chatgpt_ui_network: - driver: bridge -``` - -### DB_URL 格式对照表 - -| 数据库 | 链接 | -|----------------------|--------------------------------------------------| -| PostgreSQL | ``postgres://USER:PASSWORD@HOST:PORT/NAME`` | -| MySQL | ``mysql://USER:PASSWORD@HOST:PORT/NAME`` | -| SQLite | ``sqlite:///PATH`` | - -### 设置 API 密钥 - -访问 `http(s)://your.domain:9000/admin` / IP `http(s)://123.123.123.123:9000/admin` 登录管理面板。 - -默认超级用户: `admin` - -默认密码: `password` - -在可以开始聊天之前,您需要添加一个 OpenAI 的 API 密钥。在管理面板的设置模型中,添加一个名称为 openai_api_key 的记录,将值设置为您的 API 密钥。 - -现在可以访问客户端地址 `http(s)://your.domain` / `http://123.123.123.123` 开始聊天。 - - -## 续杯咖啡 - -> 如果对您有帮助,也是在帮助我自己. - -如果你想支持我,给我续杯咖啡吧 ❤️ [https://www.buymeacoffee.com/WongSaang](https://www.buymeacoffee.com/WongSaang) - -

- -

- -## Development - -### Setup - -Make sure to install the dependencies: - -```bash -# yarn -yarn install -``` - -### Development Server - -Start the development server on http://localhost:3000 - -```bash -yarn dev -``` - -### Production - -Build the application for production: - -```bash -yarn build -``` +项目开源后,有很多人提了 issue,也有人提了 PR,项目就发展到如今的样子。我在这个过程中也学到了很多,正如我一直坚信的,帮助他人也是帮助自己。 \ No newline at end of file diff --git a/docs/zh/guide/buymeacoffee.md b/docs/zh/guide/buymeacoffee.md new file mode 100644 index 0000000..0b38500 --- /dev/null +++ b/docs/zh/guide/buymeacoffee.md @@ -0,0 +1,7 @@ +# 续杯咖啡 + +> 如果这个项目对您有帮助,这也是在帮助我自己。 + +如果你想支持我,给我续杯咖啡吧 ❤️ [https://www.buymeacoffee.com/WongSaang](https://www.buymeacoffee.com/WongSaang) + +![Buy Me A Coffee](/images/bmc_qr.png) \ No newline at end of file diff --git a/docs/zh/guide/configuration.md b/docs/zh/guide/configuration.md new file mode 100644 index 0000000..fa547a4 --- /dev/null +++ b/docs/zh/guide/configuration.md @@ -0,0 +1,80 @@ +# 配置参考 + +## 数据库 + +后端默认使用内置的 Sqlite 来存储数据,如果不连接外部数据库,数据将在容器销毁后丢失。 + +`chatgpt-ui-wsgi-server` 镜像提供环境变量 `DB_URL` 来配置与外部数据库的连接,以下是 `DB_URL` 的链接格式对照表。 + +| 数据库 | 链接 | +|----------------------|--------------------------------------------------| +| PostgreSQL | postgres://USER:PASSWORD@HOST:PORT/DATABASE_NAME | +| MySQL | mysql://USER:PASSWORD@HOST:PORT/DATABASE_NAME | +| SQLite | sqlite:///PATH | + +例如我使用 PostgreSQL,则配置如下: + +``` +backend-wsgi-server: + image: wongsaang/chatgpt-ui-wsgi-server:latest + environment: + - DB_URL=postgres://postgres:postgrespw@localhost:49153/chatgpt +``` + +## 邮箱验证 + +如果你开放用户注册功能,并需要向用户发送邮箱激活链接,需要在 `wsgi-server` 服务中配置以下环境变量: + +| 参数 | 说明 | 默认值 | +|----------------------|--------------------------------------------------|-----| +| ACCOUNT_EMAIL_VERIFICATION | 邮箱验证方式,可选值: none, optional, mandatory | optional | +| EMAIL_HOST | SMTP 服务器地址 | smtp.mailgun.org | +| EMAIL_PORT | SMTP 服务器端口号 | 587 | +| EMAIL_HOST_USER | 用户名 | - | +| EMAIL_HOST_PASSWORD | 密码 | - | +| EMAIL_USE_TLS | 是否加密 | True | +| EMAIL_FROM | 发件邮箱 | webmaster@localhost | + +## API 代理 + +如果您的网络无法请求 OpenAI 的 API 地址,您可以在 `wsgi-server` 服务中配置代理,如何搭建代理服务,需要您自行搜索。 + +例如: + +``` +backend-wsgi-server: + image: wongsaang/chatgpt-ui-wsgi-server:latest + environment: + - OPENAI_API_PROXY=https://openai.proxy.com/v1 # 注意,域名后面需要带上 v1 +``` + +## 后端 CSRF 白名单 + +如果你在访问管理后台的时候遇到 `CSRF verification failed`,可能你的 `APP_DOMAIN` 没有配置对。在 `wsgi-server` 服务下有个环境变量 `wsgi-server`。 它的值应该是 `backend-web-server` 的地址+端口, 默认: `localhost:9000`。 + +假如我把 `chagpt.com` 这个域名解析到了服务器,并且我的 `backend-web-server` 服务绑定了 9000 这个端口。正确的配置如下: + +``` +backend-wsgi-server: + image: wongsaang/chatgpt-ui-wsgi-server:latest + environment: + - APP_DOMAIN=chagpt.com:9000 +``` + +## 客户端配置 + +| 参数 | 说明 | 默认值 | +|----------------------|-------------------------------------------|---------------------------| +| SERVER_DOMAIN | 服务端地址 | http://backend-web-server | +| NUXT_PUBLIC_APP_NAME | 应用名称 | ChatGPT UI | +| NUXT_PUBLIC_TYPEWRITER | 是否开启 打字机 效果[true/false]| true | +| NUXT_PUBLIC_TYPEWRITER_DELAY | 打字机效果的延迟时间,单位:毫秒| 50 | + + +## 用户注册控制 + +部署完整后,在管理后台的 `Chat->Setting` 下面有 `open_registration` 设置项,用于控制是否开放用户注册。默认是 `True` (允许用户注册),如果不需要,请改成 `False`。 + +## 网页搜索功能控制 + +该功能默认处于关闭状态,你可以在管理后台的 `Chat->Settings` 中开启它,在 Settings 中有一个 `open_web_search` 的设置项,把它的值设置为 `True`。 \ No newline at end of file diff --git a/docs/zh/guide/development.md b/docs/zh/guide/development.md new file mode 100644 index 0000000..b001af4 --- /dev/null +++ b/docs/zh/guide/development.md @@ -0,0 +1,62 @@ +# 开发指南 + +## 前端 + +所需技能:[Vue](https://vuejs.org/)、[Nuxt](https://nuxt.com/) + +项目地址:[https://github.com/WongSaang/chatgpt-ui](https://github.com/WongSaang/chatgpt-ui) + +### 环境准备 +安装最新稳定版 node.js,如果需要打包成 docker 镜像,还需要安装 docker。 + +### 安装依赖 + +``` +yarn install +``` + +### 启动开发服务 + +``` +yarn dev +``` + +### 构建 + +``` +yarn build +``` + +### 打包成 docker 镜像 + +``` +docker build -t image-name:latest . +``` + + +## 后端 + +所需技能:[Python](https://www.python.org/)、[Django](https://djangoproject.com/) + +项目地址:[https://github.com/WongSaang/chatgpt-ui-server](https://github.com/WongSaang/chatgpt-ui-server) + +### 环境准备 +安装Python、pip/pipenv,如果需要打包成 docker 镜像,还需要安装 docker。 + +### 安装依赖 + +``` +pip install -r requirements.txt +``` + +### 启动开发服务 + +``` +python manage.py runserver +``` + +### 打包成 docker 镜像 + +``` +docker build -t image-name:latest . +``` \ No newline at end of file diff --git a/docs/zh/guide/problems.md b/docs/zh/guide/problems.md new file mode 100644 index 0000000..67a489b --- /dev/null +++ b/docs/zh/guide/problems.md @@ -0,0 +1,13 @@ +# 遇到问题 + +## 搜索问题 + +当你在使用项目时,如果遇到了问题,可以在项目的 [Issues](https://github.com/WongSaang/chatgpt-ui/issues) 页面搜索相关的关键词,看看其他人是否遇到过相同的问题以及解决方案。 + +## 提 issue + +如果没有找到解决方案,可以通过提交 Issue 来与项目维护者交流。[提交Issue](https://github.com/WongSaang/chatgpt-ui/issues/new) + +**注意** + +标题应该简单明了,描述应该尽可能详细地描述问题或者建议。如果可能,最好提供复现步骤和截图。 \ No newline at end of file diff --git a/docs/zh/guide/quick-start.md b/docs/zh/guide/quick-start.md new file mode 100644 index 0000000..bf6d211 --- /dev/null +++ b/docs/zh/guide/quick-start.md @@ -0,0 +1,112 @@ +# 快速开始 + +本项目提供了相关的 docker 镜像,你需要一个 vps 来部署,当然你也可以在本地的电脑上部署。需要注意的是,如果你的网络无法请求 OpenAI 的 API 地址,您需要配置代理。如果你想开放给其他用户使用,最好还需要一个域名,并将域名解析到服务器。 + +您还需要一个 OpenAI 的API Key,网上有获取多种方案,请自行搜索。 + +## 通过脚本快速部署 + +*对于技术知识了解不多的选手,如果你看不懂下面的内容,可以看我之前写的博客文章[《一行命令部署自己的ChatGPT客户端》](https://wongsnotes.com/p/deploying-your-own-chatgpt-client-with-one-line-of-command/)* + +**注意:此脚本目前仅在 Ubuntu Server 22.04 LTS 上验证过。** + + +``` +bash <(curl -Ls https://raw.githubusercontent.com/WongSaang/chatgpt-ui/main/deployment.sh) +``` + +## 通过 Docker Compose 部署 + + +### 准备 docker-compose.yml + +项目中提供了一个 `docker-compose.yml` 示例,如果你想自定义配置,请看 [配置参考](/zh/guide/configuration) 部分。 + +你可以通过下方链接下载 `docker-compose.yml` 模板到本地或服务器: + +[https://raw.githubusercontent.com/WongSaang/chatgpt-ui/main/docker-compose.yml](https://raw.githubusercontent.com/WongSaang/chatgpt-ui/main/docker-compose.yml) + +也可以手动创建 `docker-compose.yml` 文件,然后复制下面的内容到文件中: + +``` +version: '3' +services: + client: + image: wongsaang/chatgpt-ui-client:latest + environment: + - SERVER_DOMAIN=http://backend-web-server + # - NUXT_PUBLIC_APP_NAME='ChatGPT UI' # APP 名称 + # - NUXT_PUBLIC_TYPEWRITER=true # 是否开启 打字机 效果 + # - NUXT_PUBLIC_TYPEWRITER_DELAY=50 # 打字机效果的延迟时间,单位:毫秒,默认:50 + depends_on: + - backend-web-server + ports: + - '80:80' + networks: + - chatgpt_ui_network + backend-wsgi-server: + image: wongsaang/chatgpt-ui-wsgi-server:latest + environment: + - APP_DOMAIN=${APP_DOMAIN:-localhost:9000} # CSRF 白名单,在这里设置为 chatgpt-ui-web-server 的地址+端口, 默认: localhost:9000 + - SERVER_WORKERS=3 # gunicorn 的工作进程数,默认为 3 + #- DB_URL=postgres://postgres:postgrespw@localhost:49153/chatgpt # 连接外部数据库,如果不设置这个参数,则默认使用内置的 Sqlite。需要注意的是,如果不连接外部数据库,数据将在容器销毁后丢失。链接格式请看下面的 DB_URL 格式对照表 + #- OPENAI_API_PROXY=https://openai.proxy.com/v1 # https://api.openai.com/v1 的代理地址 + - DJANGO_SUPERUSER_USERNAME=admin # 默认超级用户 + - DJANGO_SUPERUSER_PASSWORD=password # 默认超级用户的密码 + - DJANGO_SUPERUSER_EMAIL=admin@example.com # 默认超级用户邮箱 + - ACCOUNT_EMAIL_VERIFICATION=none # 邮箱验证方式,可选值: none, optional, mandatory. 默认为 optional。如果你不需要验证用户的邮箱,可以设置为 none。 + # 如果您想使用电子邮件验证功能,需要配置以下参数: + # - EMAIL_HOST=SMTP server address + # - EMAIL_PORT=SMTP server port + # - EMAIL_HOST_USER= + # - EMAIL_HOST_PASSWORD= + # - EMAIL_USE_TLS=True + # - EMAIL_FROM=no-reply@example.com #默认发件邮箱地址 + ports: + - '8000:8000' + networks: + - chatgpt_ui_network + backend-web-server: + image: wongsaang/chatgpt-ui-web-server:latest + environment: + - BACKEND_URL=http://backend-wsgi-server:8000 + ports: + - '9000:80' + depends_on: + - backend-wsgi-server + networks: + - chatgpt_ui_network + +networks: + chatgpt_ui_network: + driver: bridge +``` + +### 启动服务 + +你可以自行修改配置后,运行下面的命令来启动服务。 + +``` +docker-compose up --pull always -d +``` + +这个命令用于启动 Docker Compose 配置中的服务。具体的参数含义如下: + +- `up`:启动 Docker Compose 配置中的服务。 +- `--pull always`:每次启动服务前,都会从 Docker 镜像仓库中拉取最新版本的镜像。这样可以确保使用的镜像始终是最新的。 +- `-d`:在后台运行服务。如果不加这个参数,服务会在当前终端窗口中运行,直到用户手动停止服务。 + + +## 部署完成之后 + +访问 `http(s)://your.domain:9000/admin` 或 IP `http(s)://123.123.123.123:9000/admin` 登录管理面板。 + +默认超级用户: **admin** + +默认密码: **password** + +在可以开始聊天之前,您需要添加一个 OpenAI 的 API 密钥。在管理面板的设置模型中,有一个名称为 `openai_api_key` 的记录,将值设置为您的 API 密钥。 + +现在可以访问客户端地址 `http(s)://your.domain` 或 IP `http://123.123.123.123` 开始聊天。 + +🎉🎉🎉 祝开心! \ No newline at end of file diff --git a/package.json b/package.json index 3e178f2..d8896da 100644 --- a/package.json +++ b/package.json @@ -5,14 +5,17 @@ "dev": "nuxt dev", "generate": "nuxt generate", "preview": "nuxt preview", - "postinstall": "nuxt prepare" + "postinstall": "nuxt prepare", + "docs:dev": "vuepress dev docs", + "docs:build": "vuepress build docs" }, "devDependencies": { "@kevinmarrec/nuxt-pwa": "^0.17.0", "@nuxtjs/color-mode": "^3.2.0", "@nuxtjs/i18n": "^8.0.0-beta.9", "material-design-icons-iconfont": "^6.7.0", - "nuxt": "^3.3.3" + "nuxt": "^3.3.3", + "vuepress": "^2.0.0-beta.61" }, "dependencies": { "@microsoft/fetch-event-source": "^2.0.1", diff --git a/yarn.lock b/yarn.lock index dc13a83..bd5b8a5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -286,111 +286,221 @@ dependencies: mime "^3.0.0" +"@esbuild/android-arm64@0.16.17": + version "0.16.17" + resolved "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz#cf91e86df127aa3d141744edafcba0abdc577d23" + integrity sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg== + "@esbuild/android-arm64@0.17.15": version "0.17.15" resolved "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.17.15.tgz#893ad71f3920ccb919e1757c387756a9bca2ef42" integrity sha512-0kOB6Y7Br3KDVgHeg8PRcvfLkq+AccreK///B4Z6fNZGr/tNHX0z2VywCc7PTeWp+bPvjA5WMvNXltHw5QjAIA== +"@esbuild/android-arm@0.16.17": + version "0.16.17" + resolved "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.16.17.tgz#025b6246d3f68b7bbaa97069144fb5fb70f2fff2" + integrity sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw== + "@esbuild/android-arm@0.17.15": version "0.17.15" resolved "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.17.15.tgz#143e0d4e4c08c786ea410b9a7739779a9a1315d8" integrity sha512-sRSOVlLawAktpMvDyJIkdLI/c/kdRTOqo8t6ImVxg8yT7LQDUYV5Rp2FKeEosLr6ZCja9UjYAzyRSxGteSJPYg== +"@esbuild/android-x64@0.16.17": + version "0.16.17" + resolved "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.16.17.tgz#c820e0fef982f99a85c4b8bfdd582835f04cd96e" + integrity sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ== + "@esbuild/android-x64@0.17.15": version "0.17.15" resolved "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.17.15.tgz#d2d12a7676b2589864281b2274355200916540bc" integrity sha512-MzDqnNajQZ63YkaUWVl9uuhcWyEyh69HGpMIrf+acR4otMkfLJ4sUCxqwbCyPGicE9dVlrysI3lMcDBjGiBBcQ== +"@esbuild/darwin-arm64@0.16.17": + version "0.16.17" + resolved "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz#edef4487af6b21afabba7be5132c26d22379b220" + integrity sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w== + "@esbuild/darwin-arm64@0.17.15": version "0.17.15" resolved "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.17.15.tgz#2e88e79f1d327a2a7d9d06397e5232eb0a473d61" integrity sha512-7siLjBc88Z4+6qkMDxPT2juf2e8SJxmsbNVKFY2ifWCDT72v5YJz9arlvBw5oB4W/e61H1+HDB/jnu8nNg0rLA== +"@esbuild/darwin-x64@0.16.17": + version "0.16.17" + resolved "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz#42829168730071c41ef0d028d8319eea0e2904b4" + integrity sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg== + "@esbuild/darwin-x64@0.17.15": version "0.17.15" resolved "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.17.15.tgz#9384e64c0be91388c57be6d3a5eaf1c32a99c91d" integrity sha512-NbImBas2rXwYI52BOKTW342Tm3LTeVlaOQ4QPZ7XuWNKiO226DisFk/RyPk3T0CKZkKMuU69yOvlapJEmax7cg== +"@esbuild/freebsd-arm64@0.16.17": + version "0.16.17" + resolved "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz#1f4af488bfc7e9ced04207034d398e793b570a27" + integrity sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw== + "@esbuild/freebsd-arm64@0.17.15": version "0.17.15" resolved "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.15.tgz#2ad5a35bc52ebd9ca6b845dbc59ba39647a93c1a" integrity sha512-Xk9xMDjBVG6CfgoqlVczHAdJnCs0/oeFOspFap5NkYAmRCT2qTn1vJWA2f419iMtsHSLm+O8B6SLV/HlY5cYKg== +"@esbuild/freebsd-x64@0.16.17": + version "0.16.17" + resolved "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz#636306f19e9bc981e06aa1d777302dad8fddaf72" + integrity sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug== + "@esbuild/freebsd-x64@0.17.15": version "0.17.15" resolved "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.17.15.tgz#b513a48446f96c75fda5bef470e64d342d4379cd" integrity sha512-3TWAnnEOdclvb2pnfsTWtdwthPfOz7qAfcwDLcfZyGJwm1SRZIMOeB5FODVhnM93mFSPsHB9b/PmxNNbSnd0RQ== +"@esbuild/linux-arm64@0.16.17": + version "0.16.17" + resolved "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz#a003f7ff237c501e095d4f3a09e58fc7b25a4aca" + integrity sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g== + "@esbuild/linux-arm64@0.17.15": version "0.17.15" resolved "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.17.15.tgz#9697b168175bfd41fa9cc4a72dd0d48f24715f31" integrity sha512-T0MVnYw9KT6b83/SqyznTs/3Jg2ODWrZfNccg11XjDehIved2oQfrX/wVuev9N936BpMRaTR9I1J0tdGgUgpJA== +"@esbuild/linux-arm@0.16.17": + version "0.16.17" + resolved "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz#b591e6a59d9c4fe0eeadd4874b157ab78cf5f196" + integrity sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ== + "@esbuild/linux-arm@0.17.15": version "0.17.15" resolved "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.17.15.tgz#5b22062c54f48cd92fab9ffd993732a52db70cd3" integrity sha512-MLTgiXWEMAMr8nmS9Gigx43zPRmEfeBfGCwxFQEMgJ5MC53QKajaclW6XDPjwJvhbebv+RzK05TQjvH3/aM4Xw== +"@esbuild/linux-ia32@0.16.17": + version "0.16.17" + resolved "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz#24333a11027ef46a18f57019450a5188918e2a54" + integrity sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg== + "@esbuild/linux-ia32@0.17.15": version "0.17.15" resolved "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.17.15.tgz#eb28a13f9b60b5189fcc9e98e1024f6b657ba54c" integrity sha512-wp02sHs015T23zsQtU4Cj57WiteiuASHlD7rXjKUyAGYzlOKDAjqK6bk5dMi2QEl/KVOcsjwL36kD+WW7vJt8Q== +"@esbuild/linux-loong64@0.16.17": + version "0.16.17" + resolved "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz#d5ad459d41ed42bbd4d005256b31882ec52227d8" + integrity sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ== + "@esbuild/linux-loong64@0.17.15": version "0.17.15" resolved "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.17.15.tgz#32454bdfe144cf74b77895a8ad21a15cb81cfbe5" integrity sha512-k7FsUJjGGSxwnBmMh8d7IbObWu+sF/qbwc+xKZkBe/lTAF16RqxRCnNHA7QTd3oS2AfGBAnHlXL67shV5bBThQ== +"@esbuild/linux-mips64el@0.16.17": + version "0.16.17" + resolved "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz#4e5967a665c38360b0a8205594377d4dcf9c3726" + integrity sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw== + "@esbuild/linux-mips64el@0.17.15": version "0.17.15" resolved "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.17.15.tgz#af12bde0d775a318fad90eb13a0455229a63987c" integrity sha512-ZLWk6czDdog+Q9kE/Jfbilu24vEe/iW/Sj2d8EVsmiixQ1rM2RKH2n36qfxK4e8tVcaXkvuV3mU5zTZviE+NVQ== +"@esbuild/linux-ppc64@0.16.17": + version "0.16.17" + resolved "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz#206443a02eb568f9fdf0b438fbd47d26e735afc8" + integrity sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g== + "@esbuild/linux-ppc64@0.17.15": version "0.17.15" resolved "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.17.15.tgz#34c5ed145b2dfc493d3e652abac8bd3baa3865a5" integrity sha512-mY6dPkIRAiFHRsGfOYZC8Q9rmr8vOBZBme0/j15zFUKM99d4ILY4WpOC7i/LqoY+RE7KaMaSfvY8CqjJtuO4xg== +"@esbuild/linux-riscv64@0.16.17": + version "0.16.17" + resolved "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz#c351e433d009bf256e798ad048152c8d76da2fc9" + integrity sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw== + "@esbuild/linux-riscv64@0.17.15": version "0.17.15" resolved "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.17.15.tgz#87bd515e837f2eb004b45f9e6a94dc5b93f22b92" integrity sha512-EcyUtxffdDtWjjwIH8sKzpDRLcVtqANooMNASO59y+xmqqRYBBM7xVLQhqF7nksIbm2yHABptoioS9RAbVMWVA== +"@esbuild/linux-s390x@0.16.17": + version "0.16.17" + resolved "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz#661f271e5d59615b84b6801d1c2123ad13d9bd87" + integrity sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w== + "@esbuild/linux-s390x@0.17.15": version "0.17.15" resolved "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.17.15.tgz#20bf7947197f199ddac2ec412029a414ceae3aa3" integrity sha512-BuS6Jx/ezxFuHxgsfvz7T4g4YlVrmCmg7UAwboeyNNg0OzNzKsIZXpr3Sb/ZREDXWgt48RO4UQRDBxJN3B9Rbg== +"@esbuild/linux-x64@0.16.17": + version "0.16.17" + resolved "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz#e4ba18e8b149a89c982351443a377c723762b85f" + integrity sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw== + "@esbuild/linux-x64@0.17.15": version "0.17.15" resolved "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.17.15.tgz#31b93f9c94c195e852c20cd3d1914a68aa619124" integrity sha512-JsdS0EgEViwuKsw5tiJQo9UdQdUJYuB+Mf6HxtJSPN35vez1hlrNb1KajvKWF5Sa35j17+rW1ECEO9iNrIXbNg== +"@esbuild/netbsd-x64@0.16.17": + version "0.16.17" + resolved "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz#7d4f4041e30c5c07dd24ffa295c73f06038ec775" + integrity sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA== + "@esbuild/netbsd-x64@0.17.15": version "0.17.15" resolved "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.17.15.tgz#8da299b3ac6875836ca8cdc1925826498069ac65" integrity sha512-R6fKjtUysYGym6uXf6qyNephVUQAGtf3n2RCsOST/neIwPqRWcnc3ogcielOd6pT+J0RDR1RGcy0ZY7d3uHVLA== +"@esbuild/openbsd-x64@0.16.17": + version "0.16.17" + resolved "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz#970fa7f8470681f3e6b1db0cc421a4af8060ec35" + integrity sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg== + "@esbuild/openbsd-x64@0.17.15": version "0.17.15" resolved "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.17.15.tgz#04a1ec3d4e919714dba68dcf09eeb1228ad0d20c" integrity sha512-mVD4PGc26b8PI60QaPUltYKeSX0wxuy0AltC+WCTFwvKCq2+OgLP4+fFd+hZXzO2xW1HPKcytZBdjqL6FQFa7w== +"@esbuild/sunos-x64@0.16.17": + version "0.16.17" + resolved "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz#abc60e7c4abf8b89fb7a4fe69a1484132238022c" + integrity sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw== + "@esbuild/sunos-x64@0.17.15": version "0.17.15" resolved "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.17.15.tgz#6694ebe4e16e5cd7dab6505ff7c28f9c1c695ce5" integrity sha512-U6tYPovOkw3459t2CBwGcFYfFRjivcJJc1WC8Q3funIwX8x4fP+R6xL/QuTPNGOblbq/EUDxj9GU+dWKX0oWlQ== +"@esbuild/win32-arm64@0.16.17": + version "0.16.17" + resolved "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz#7b0ff9e8c3265537a7a7b1fd9a24e7bd39fcd87a" + integrity sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw== + "@esbuild/win32-arm64@0.17.15": version "0.17.15" resolved "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.17.15.tgz#1f95b2564193c8d1fee8f8129a0609728171d500" integrity sha512-W+Z5F++wgKAleDABemiyXVnzXgvRFs+GVKThSI+mGgleLWluv0D7Diz4oQpgdpNzh4i2nNDzQtWbjJiqutRp6Q== +"@esbuild/win32-ia32@0.16.17": + version "0.16.17" + resolved "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz#e90fe5267d71a7b7567afdc403dfd198c292eb09" + integrity sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig== + "@esbuild/win32-ia32@0.17.15": version "0.17.15" resolved "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.17.15.tgz#c362b88b3df21916ed7bcf75c6d09c6bf3ae354a" integrity sha512-Muz/+uGgheShKGqSVS1KsHtCyEzcdOn/W/Xbh6H91Etm+wiIfwZaBn1W58MeGtfI8WA961YMHFYTthBdQs4t+w== +"@esbuild/win32-x64@0.16.17": + version "0.16.17" + resolved "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz#c5a1a4bfe1b57f0c3e61b29883525c6da3e5c091" + integrity sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q== + "@esbuild/win32-x64@0.17.15": version "0.17.15" resolved "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.17.15.tgz#c2e737f3a201ebff8e2ac2b8e9f246b397ad19b8" @@ -565,6 +675,77 @@ semver "^7.3.5" tar "^6.1.11" +"@mdit-vue/plugin-component@^0.12.0": + version "0.12.0" + resolved "https://registry.npmmirror.com/@mdit-vue/plugin-component/-/plugin-component-0.12.0.tgz#7a52837935e2cbc9b6cf22fd5f9349f6199fc18c" + integrity sha512-LrwV3f0Y6H7b7m/w1Y3bkGuR3HOiBK4QiHHW3HuRMza6MZodDQbj8Baik5/V5GiSg1/ltijS1CymVcycd1EfTw== + dependencies: + "@types/markdown-it" "^12.2.3" + markdown-it "^13.0.1" + +"@mdit-vue/plugin-frontmatter@^0.12.0": + version "0.12.0" + resolved "https://registry.npmmirror.com/@mdit-vue/plugin-frontmatter/-/plugin-frontmatter-0.12.0.tgz#fb344646241bed1bae5f8bd320c7b2f493bd8b67" + integrity sha512-26Y3JktjGgNoCVH7NLqi5RcdAauAqxepTt2qXueRcRHtGpiRQV2/M1FveIhCOTCtHSuG5bBOHUxGaV6vRK3Vbw== + dependencies: + "@mdit-vue/types" "0.12.0" + "@types/markdown-it" "^12.2.3" + gray-matter "^4.0.3" + markdown-it "^13.0.1" + +"@mdit-vue/plugin-headers@^0.12.0": + version "0.12.0" + resolved "https://registry.npmmirror.com/@mdit-vue/plugin-headers/-/plugin-headers-0.12.0.tgz#c16921e071b2766fd04a703d8d42ead00561f44c" + integrity sha512-7qR63J2uc/rXbjHT77WoYBm9imwzx1tVESmRK+Uth6kqFvSWAXAFPcm4PBatGEE8TgzhklPs5BTcQtQhmmsyaw== + dependencies: + "@mdit-vue/shared" "0.12.0" + "@mdit-vue/types" "0.12.0" + "@types/markdown-it" "^12.2.3" + markdown-it "^13.0.1" + +"@mdit-vue/plugin-sfc@^0.12.0": + version "0.12.0" + resolved "https://registry.npmmirror.com/@mdit-vue/plugin-sfc/-/plugin-sfc-0.12.0.tgz#2932c333657ddaf6d76664118b83c93d5dd4f727" + integrity sha512-mH+rHsERzDxGucAQJILspRiD723AIWMmtMhp7lDKdkCIbIhYfupFv/CkSeX+LAx5UY5greWvUTPGYVKn4gw/5Q== + dependencies: + "@mdit-vue/types" "0.12.0" + "@types/markdown-it" "^12.2.3" + markdown-it "^13.0.1" + +"@mdit-vue/plugin-title@^0.12.0": + version "0.12.0" + resolved "https://registry.npmmirror.com/@mdit-vue/plugin-title/-/plugin-title-0.12.0.tgz#e69f33036972a7a67c3321647bdbcb1b9a5b6f4e" + integrity sha512-XrQcior1EmPgsDG88KsoF4LUSQw/RS1Nyfn5xNWGiurO70a2hml4kCe0XzT4sLKUAPG0HNbIY6b92ezNezqWTg== + dependencies: + "@mdit-vue/shared" "0.12.0" + "@mdit-vue/types" "0.12.0" + "@types/markdown-it" "^12.2.3" + markdown-it "^13.0.1" + +"@mdit-vue/plugin-toc@^0.12.0": + version "0.12.0" + resolved "https://registry.npmmirror.com/@mdit-vue/plugin-toc/-/plugin-toc-0.12.0.tgz#bf8c4c4d13dc9ef8dc3c4b8213e3846312cca7f3" + integrity sha512-tT985CqvLp17DFWHrSvmmJbh7qcy0Rl0dBbYN//Fn952a04dbr1mb2LqW0B1oStSAQj2q24HpK4ZPgYOt7Z1Jg== + dependencies: + "@mdit-vue/shared" "0.12.0" + "@mdit-vue/types" "0.12.0" + "@types/markdown-it" "^12.2.3" + markdown-it "^13.0.1" + +"@mdit-vue/shared@0.12.0", "@mdit-vue/shared@^0.12.0": + version "0.12.0" + resolved "https://registry.npmmirror.com/@mdit-vue/shared/-/shared-0.12.0.tgz#e4e7d5ffb362dedb92b161fcbf05e81a3d2ac143" + integrity sha512-E+sGSubhvnp+Gmb2hJXFDxdLwwQD1H52EVbA4yrxxI5q/cwtnPIN2eJU3zlZB9KcvzXYDFFwt/x2mfhK8RZKBg== + dependencies: + "@mdit-vue/types" "0.12.0" + "@types/markdown-it" "^12.2.3" + markdown-it "^13.0.1" + +"@mdit-vue/types@0.12.0", "@mdit-vue/types@^0.12.0": + version "0.12.0" + resolved "https://registry.npmmirror.com/@mdit-vue/types/-/types-0.12.0.tgz#096ff57d3590d076f7d7561dbc9956fb0bb89fe1" + integrity sha512-mrC4y8n88BYvgcgzq9bvTlDgFyi2zuvzmPilRvRc3Uz1iIvq8mDhxJ0rHKFUNzPEScpDvJdIujqiDrulMqiudA== + "@microsoft/fetch-event-source@^2.0.1": version "2.0.1" resolved "https://registry.npmmirror.com/@microsoft/fetch-event-source/-/fetch-event-source-2.0.1.tgz#9ceecc94b49fbaa15666e38ae8587f64acce007d" @@ -843,11 +1024,31 @@ resolved "https://registry.npmmirror.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== +"@types/debug@^4.1.7": + version "4.1.7" + resolved "https://registry.npmmirror.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82" + integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg== + dependencies: + "@types/ms" "*" + "@types/estree@*", "@types/estree@^1.0.0": version "1.0.0" resolved "https://registry.npmmirror.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== +"@types/fs-extra@^11.0.1": + version "11.0.1" + resolved "https://registry.npmmirror.com/@types/fs-extra/-/fs-extra-11.0.1.tgz#f542ec47810532a8a252127e6e105f487e0a6ea5" + integrity sha512-MxObHvNl4A69ofaTRU8DFqvgzzv8s9yRtaPPm5gud9HDNvpB3GPQFvNuTWAI59B9huVGV5jXYJwbCsmBsOGYWA== + dependencies: + "@types/jsonfile" "*" + "@types/node" "*" + +"@types/hash-sum@^1.0.0": + version "1.0.0" + resolved "https://registry.npmmirror.com/@types/hash-sum/-/hash-sum-1.0.0.tgz#838f4e8627887d42b162d05f3d96ca636c2bc504" + integrity sha512-FdLBT93h3kcZ586Aee66HPCVJ6qvxVjBlDWNmxSGSbCZe9hTsjRKdSsl4y1T+3zfujxo9auykQMnFsfyHWD7wg== + "@types/http-proxy@^1.17.10": version "1.17.10" resolved "https://registry.npmmirror.com/@types/http-proxy/-/http-proxy-1.17.10.tgz#e576c8e4a0cc5c6a138819025a88e167ebb38d6c" @@ -855,6 +1056,43 @@ dependencies: "@types/node" "*" +"@types/jsonfile@*": + version "6.1.1" + resolved "https://registry.npmmirror.com/@types/jsonfile/-/jsonfile-6.1.1.tgz#ac84e9aefa74a2425a0fb3012bdea44f58970f1b" + integrity sha512-GSgiRCVeapDN+3pqA35IkQwasaCh/0YFH5dEF6S88iDvEn901DjOeH3/QPY+XYP1DFzDZPvIvfeEgk+7br5png== + dependencies: + "@types/node" "*" + +"@types/linkify-it@*": + version "3.0.2" + resolved "https://registry.npmmirror.com/@types/linkify-it/-/linkify-it-3.0.2.tgz#fd2cd2edbaa7eaac7e7f3c1748b52a19143846c9" + integrity sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA== + +"@types/markdown-it-emoji@^2.0.2": + version "2.0.2" + resolved "https://registry.npmmirror.com/@types/markdown-it-emoji/-/markdown-it-emoji-2.0.2.tgz#f12a97df2758f38b4b38f277b468780459faff14" + integrity sha512-2ln8Wjbcj/0oRi/6VnuMeWEHHuK8uapFttvcLmDIe1GKCsFBLOLBX+D+xhDa9oWOQV0IpvxwrSfKKssAqqroog== + dependencies: + "@types/markdown-it" "*" + +"@types/markdown-it@*", "@types/markdown-it@^12.2.3": + version "12.2.3" + resolved "https://registry.npmmirror.com/@types/markdown-it/-/markdown-it-12.2.3.tgz#0d6f6e5e413f8daaa26522904597be3d6cd93b51" + integrity sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ== + dependencies: + "@types/linkify-it" "*" + "@types/mdurl" "*" + +"@types/mdurl@*": + version "1.0.2" + resolved "https://registry.npmmirror.com/@types/mdurl/-/mdurl-1.0.2.tgz#e2ce9d83a613bacf284c7be7d491945e39e1f8e9" + integrity sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA== + +"@types/ms@*": + version "0.7.31" + resolved "https://registry.npmmirror.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" + integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== + "@types/node@*": version "18.15.11" resolved "https://registry.npmmirror.com/@types/node/-/node-18.15.11.tgz#b3b790f09cb1696cffcec605de025b088fa4225f" @@ -865,6 +1103,11 @@ resolved "https://registry.npmmirror.com/@types/resolve/-/resolve-1.20.2.tgz#97d26e00cd4a0423b4af620abecf3e6f442b7975" integrity sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q== +"@types/web-bluetooth@^0.0.16": + version "0.0.16" + resolved "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz#1d12873a8e49567371f2a75fe3e7f7edca6662d8" + integrity sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ== + "@unhead/dom@1.1.25": version "1.1.25" resolved "https://registry.npmmirror.com/@unhead/dom/-/dom-1.1.25.tgz#08b4809e8dc3a4f7daf4f54db326dffcd96a3c8e" @@ -932,7 +1175,7 @@ "@babel/plugin-transform-typescript" "^7.20.7" "@vue/babel-plugin-jsx" "^1.1.1" -"@vitejs/plugin-vue@^4.1.0": +"@vitejs/plugin-vue@^4.0.0", "@vitejs/plugin-vue@^4.1.0": version "4.1.0" resolved "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-4.1.0.tgz#b6a9d83cd91575f7ee15593f6444397f68751073" integrity sha512-++9JOAFdcXI3lyer9UKUV4rfoQ3T1RN8yDqoCLar86s0xQct5yblxAE+yWgRnU5/0FOlVCpTZpYSBV/bGWrSrQ== @@ -999,7 +1242,7 @@ "@vue/compiler-dom" "3.2.47" "@vue/shared" "3.2.47" -"@vue/devtools-api@^6.2.1", "@vue/devtools-api@^6.4.5": +"@vue/devtools-api@^6.2.1", "@vue/devtools-api@^6.4.5", "@vue/devtools-api@^6.5.0": version "6.5.0" resolved "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.5.0.tgz#98b99425edee70b4c992692628fa1ea2c1e57d07" integrity sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q== @@ -1052,6 +1295,260 @@ resolved "https://registry.npmmirror.com/@vue/shared/-/shared-3.2.47.tgz#e597ef75086c6e896ff5478a6bfc0a7aa4bbd14c" integrity sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ== +"@vuepress/bundler-vite@2.0.0-beta.61": + version "2.0.0-beta.61" + resolved "https://registry.npmmirror.com/@vuepress/bundler-vite/-/bundler-vite-2.0.0-beta.61.tgz#cd14f061733dfd63b917738fa4b72de6dfc166d1" + integrity sha512-J9/DGfsqr9rGJT+0osL9uL+jrrGHeAsWuZoCCbQIDbe0rEO2whvou51PJpwko3R0vvCTWsolh6rXYeb0N0+yFg== + dependencies: + "@vitejs/plugin-vue" "^4.0.0" + "@vuepress/client" "2.0.0-beta.61" + "@vuepress/core" "2.0.0-beta.61" + "@vuepress/shared" "2.0.0-beta.61" + "@vuepress/utils" "2.0.0-beta.61" + autoprefixer "^10.4.13" + connect-history-api-fallback "^2.0.0" + postcss "^8.4.21" + postcss-load-config "^4.0.1" + rollup "^3.17.3" + vite "~4.1.4" + vue "^3.2.47" + vue-router "^4.1.6" + +"@vuepress/cli@2.0.0-beta.61": + version "2.0.0-beta.61" + resolved "https://registry.npmmirror.com/@vuepress/cli/-/cli-2.0.0-beta.61.tgz#279784c755dde3e4868a667cb6ce7311f67bfb57" + integrity sha512-0CWc82c75987mVZwBOGBaCDke74NwlS6L3n1ybWrrqaFeueZSonwdm+qvaNvM/AJC10chqOJtpO/O3P+/YkBHQ== + dependencies: + "@vuepress/core" "2.0.0-beta.61" + "@vuepress/shared" "2.0.0-beta.61" + "@vuepress/utils" "2.0.0-beta.61" + cac "^6.7.14" + chokidar "^3.5.3" + envinfo "^7.8.1" + esbuild "~0.16.17" + +"@vuepress/client@2.0.0-beta.61": + version "2.0.0-beta.61" + resolved "https://registry.npmmirror.com/@vuepress/client/-/client-2.0.0-beta.61.tgz#d36321495924f19d468b71af48ae3a06ab626b93" + integrity sha512-C5QbdQkPsurEsKUkLclVucUAKMzBph9kHMUvfKHJqBaAsiXKYVLa61AICTJeyDkhTYF0faOjmpqmaElfMt1S9w== + dependencies: + "@vue/devtools-api" "^6.5.0" + "@vuepress/shared" "2.0.0-beta.61" + vue "^3.2.47" + vue-router "^4.1.6" + +"@vuepress/core@2.0.0-beta.61": + version "2.0.0-beta.61" + resolved "https://registry.npmmirror.com/@vuepress/core/-/core-2.0.0-beta.61.tgz#602ceb2da0b9c2fd0bc5828115c896f17521ff08" + integrity sha512-jPr60d/uadgBmEQhXCRLNOm2M4Ym65lvZhGf/wyZCo14kpacp2YoO7RR8bzp/NEpWe7ndr/U8O/VDjFYTsz80g== + dependencies: + "@vuepress/client" "2.0.0-beta.61" + "@vuepress/markdown" "2.0.0-beta.61" + "@vuepress/shared" "2.0.0-beta.61" + "@vuepress/utils" "2.0.0-beta.61" + vue "^3.2.47" + +"@vuepress/markdown@2.0.0-beta.61": + version "2.0.0-beta.61" + resolved "https://registry.npmmirror.com/@vuepress/markdown/-/markdown-2.0.0-beta.61.tgz#8ea7f785b25f149ec006236cc1bbe2b59161a862" + integrity sha512-vzj933XxsfE9B+1kdMXncYtYU7TGTLjWP+qeikVsy5imq2BXa/n3OFVGyGkkdOYmu05hkm82+07dOvtGA+iMBQ== + dependencies: + "@mdit-vue/plugin-component" "^0.12.0" + "@mdit-vue/plugin-frontmatter" "^0.12.0" + "@mdit-vue/plugin-headers" "^0.12.0" + "@mdit-vue/plugin-sfc" "^0.12.0" + "@mdit-vue/plugin-title" "^0.12.0" + "@mdit-vue/plugin-toc" "^0.12.0" + "@mdit-vue/shared" "^0.12.0" + "@mdit-vue/types" "^0.12.0" + "@types/markdown-it" "^12.2.3" + "@types/markdown-it-emoji" "^2.0.2" + "@vuepress/shared" "2.0.0-beta.61" + "@vuepress/utils" "2.0.0-beta.61" + markdown-it "^13.0.1" + markdown-it-anchor "^8.6.7" + markdown-it-emoji "^2.0.2" + mdurl "^1.0.1" + +"@vuepress/plugin-active-header-links@2.0.0-beta.61": + version "2.0.0-beta.61" + resolved "https://registry.npmmirror.com/@vuepress/plugin-active-header-links/-/plugin-active-header-links-2.0.0-beta.61.tgz#03282f4d9cca94acaa0bf09659fcb38dbc34474a" + integrity sha512-+bbzb4YqnuTOANvSmJq8hbp60Tl3jLMiaZdkHKxKK9lDODGfTB8uAlH+KvuvxxuLm+Za186r+2PtBwJby773fA== + dependencies: + "@vuepress/client" "2.0.0-beta.61" + "@vuepress/core" "2.0.0-beta.61" + "@vuepress/utils" "2.0.0-beta.61" + ts-debounce "^4.0.0" + vue "^3.2.47" + vue-router "^4.1.6" + +"@vuepress/plugin-back-to-top@2.0.0-beta.61": + version "2.0.0-beta.61" + resolved "https://registry.npmmirror.com/@vuepress/plugin-back-to-top/-/plugin-back-to-top-2.0.0-beta.61.tgz#b5feec33f99971cd3a0bd5bf100ead806c119d2b" + integrity sha512-2KX83rdc00FSs38o8/P2Hp0ifKVtRbO+4kXW5ilzY27v0UMY8H//KxmoE/+PZDS9iyeXF1O/YUm3VtoMN5Y/9g== + dependencies: + "@vuepress/client" "2.0.0-beta.61" + "@vuepress/core" "2.0.0-beta.61" + "@vuepress/utils" "2.0.0-beta.61" + ts-debounce "^4.0.0" + vue "^3.2.47" + +"@vuepress/plugin-container@2.0.0-beta.61": + version "2.0.0-beta.61" + resolved "https://registry.npmmirror.com/@vuepress/plugin-container/-/plugin-container-2.0.0-beta.61.tgz#2e9a12d8918b3d7a7f29c6fb44d549287b89cd93" + integrity sha512-XVIhMpTSv0F8tsmCKFHzFtsJzD2SeiKX60jHaEGCym+shNvr9euECWY7ygEB5Ob6oQUIDZNS1dDb1RcYsksZ8A== + dependencies: + "@types/markdown-it" "^12.2.3" + "@vuepress/core" "2.0.0-beta.61" + "@vuepress/markdown" "2.0.0-beta.61" + "@vuepress/shared" "2.0.0-beta.61" + "@vuepress/utils" "2.0.0-beta.61" + markdown-it "^13.0.1" + markdown-it-container "^3.0.0" + +"@vuepress/plugin-external-link-icon@2.0.0-beta.61": + version "2.0.0-beta.61" + resolved "https://registry.npmmirror.com/@vuepress/plugin-external-link-icon/-/plugin-external-link-icon-2.0.0-beta.61.tgz#63d3f89d8d1869a06904fb123ca41d31a8272298" + integrity sha512-Jyp/QdqIvybfocD2K8otKIeHrKMeOamt74tlstsZxrtveKhWE3Js1/n2MP/bJlGkcHrAb6lQQr/JFhpT5jtHVg== + dependencies: + "@vuepress/client" "2.0.0-beta.61" + "@vuepress/core" "2.0.0-beta.61" + "@vuepress/markdown" "2.0.0-beta.61" + "@vuepress/shared" "2.0.0-beta.61" + "@vuepress/utils" "2.0.0-beta.61" + vue "^3.2.47" + +"@vuepress/plugin-git@2.0.0-beta.61": + version "2.0.0-beta.61" + resolved "https://registry.npmmirror.com/@vuepress/plugin-git/-/plugin-git-2.0.0-beta.61.tgz#4c7827a8f964b55fe594cd5f4f79509e0264bc5d" + integrity sha512-ozoxZ+x57yGiHDs5tXJvbyoZTiYpfb7QQaS5mgxn0+XZqfg7/cZnT7DmJtxVqk+VFmz73WHgN+4pGRjkuTOLqQ== + dependencies: + "@vuepress/core" "2.0.0-beta.61" + "@vuepress/utils" "2.0.0-beta.61" + execa "^7.0.0" + +"@vuepress/plugin-medium-zoom@2.0.0-beta.61": + version "2.0.0-beta.61" + resolved "https://registry.npmmirror.com/@vuepress/plugin-medium-zoom/-/plugin-medium-zoom-2.0.0-beta.61.tgz#14dba3228b9b50ef1b170a8a1c94d858a7d2331f" + integrity sha512-mFY2vHXeqC8dizFVlFO7HIzirb79Z8sudKWPVfZmq0Qmlttyhxlns8GjrsPQl1mnz2NlYUY1ztUasikPwsYjAw== + dependencies: + "@vuepress/client" "2.0.0-beta.61" + "@vuepress/core" "2.0.0-beta.61" + "@vuepress/utils" "2.0.0-beta.61" + medium-zoom "^1.0.8" + vue "^3.2.47" + +"@vuepress/plugin-nprogress@2.0.0-beta.61": + version "2.0.0-beta.61" + resolved "https://registry.npmmirror.com/@vuepress/plugin-nprogress/-/plugin-nprogress-2.0.0-beta.61.tgz#dbbd0e59177ffb3a051beb6103406c00e4f162d9" + integrity sha512-d36NEy8hkZaAuqMZec9VTEjozPkj9Wvimyx+AgJYpYN8JDBrWB58r9Gu9xHf8/PVeEnKayggD2xJYpGKtQ2lrw== + dependencies: + "@vuepress/client" "2.0.0-beta.61" + "@vuepress/core" "2.0.0-beta.61" + "@vuepress/utils" "2.0.0-beta.61" + vue "^3.2.47" + vue-router "^4.1.6" + +"@vuepress/plugin-palette@2.0.0-beta.61": + version "2.0.0-beta.61" + resolved "https://registry.npmmirror.com/@vuepress/plugin-palette/-/plugin-palette-2.0.0-beta.61.tgz#0b907b58a57307d1e8d71b4d8713968ad4dfedb0" + integrity sha512-mQE/2dxwOZfkc7wwkwR6byaeMJYTqQV7WmfQ4YQ3zAOr4nDP8Bx/zZVRyV3NjAcMwuif/CURpAYJo+WkFM+fpQ== + dependencies: + "@vuepress/core" "2.0.0-beta.61" + "@vuepress/utils" "2.0.0-beta.61" + chokidar "^3.5.3" + +"@vuepress/plugin-prismjs@2.0.0-beta.61": + version "2.0.0-beta.61" + resolved "https://registry.npmmirror.com/@vuepress/plugin-prismjs/-/plugin-prismjs-2.0.0-beta.61.tgz#f9ae5b08e1ad56aa87996892b168710618654b83" + integrity sha512-B6TRmttJuPs1OMJXE2Stul7zhMUKCPy2YSXEmVWwlJ90jWti85o5nhTT9/OhxBVn3EZ89b+YroPDbB/g1uUc1w== + dependencies: + "@vuepress/core" "2.0.0-beta.61" + prismjs "^1.29.0" + +"@vuepress/plugin-theme-data@2.0.0-beta.61": + version "2.0.0-beta.61" + resolved "https://registry.npmmirror.com/@vuepress/plugin-theme-data/-/plugin-theme-data-2.0.0-beta.61.tgz#f95a56c8ffb4cca8b559b4cf81ef665fe07523aa" + integrity sha512-drPLGbaXqXnHsuFHn6FolbqdRIxJzla1+10b3cKnsslatRbSPjKWos4Eri3xzgzEIC5TotPwTeT25gDRMpW8Sw== + dependencies: + "@vue/devtools-api" "^6.5.0" + "@vuepress/client" "2.0.0-beta.61" + "@vuepress/core" "2.0.0-beta.61" + "@vuepress/shared" "2.0.0-beta.61" + "@vuepress/utils" "2.0.0-beta.61" + vue "^3.2.47" + +"@vuepress/shared@2.0.0-beta.61": + version "2.0.0-beta.61" + resolved "https://registry.npmmirror.com/@vuepress/shared/-/shared-2.0.0-beta.61.tgz#7342602990ccf3a1a4aefcdbe8315b368ed5602b" + integrity sha512-NhOQ1FDr5lDSu5IinNlNNzrF+jGOZ+bMFUyAlCxlTvK9oY6aRBCNwV8dWme+yoh3/zviKHGu62Xp7J2hKAHNZA== + dependencies: + "@mdit-vue/types" "^0.12.0" + "@vue/shared" "^3.2.47" + +"@vuepress/theme-default@2.0.0-beta.61": + version "2.0.0-beta.61" + resolved "https://registry.npmmirror.com/@vuepress/theme-default/-/theme-default-2.0.0-beta.61.tgz#71fb67713bb9a39be0d28ddd37009c503179282a" + integrity sha512-ajjxaGqrSy5LXf+7sslHV1fbUzggMYjITcXxBYa3gT4zVu1tsytAAcmtYxnQKblL1Eo2Wo7inujl/NUwaWDjDQ== + dependencies: + "@vuepress/client" "2.0.0-beta.61" + "@vuepress/core" "2.0.0-beta.61" + "@vuepress/plugin-active-header-links" "2.0.0-beta.61" + "@vuepress/plugin-back-to-top" "2.0.0-beta.61" + "@vuepress/plugin-container" "2.0.0-beta.61" + "@vuepress/plugin-external-link-icon" "2.0.0-beta.61" + "@vuepress/plugin-git" "2.0.0-beta.61" + "@vuepress/plugin-medium-zoom" "2.0.0-beta.61" + "@vuepress/plugin-nprogress" "2.0.0-beta.61" + "@vuepress/plugin-palette" "2.0.0-beta.61" + "@vuepress/plugin-prismjs" "2.0.0-beta.61" + "@vuepress/plugin-theme-data" "2.0.0-beta.61" + "@vuepress/shared" "2.0.0-beta.61" + "@vuepress/utils" "2.0.0-beta.61" + "@vueuse/core" "^9.13.0" + sass "^1.58.3" + vue "^3.2.47" + vue-router "^4.1.6" + +"@vuepress/utils@2.0.0-beta.61": + version "2.0.0-beta.61" + resolved "https://registry.npmmirror.com/@vuepress/utils/-/utils-2.0.0-beta.61.tgz#a073e1ad22386f1922af3e7ef6220c5286fc5239" + integrity sha512-W7g6xjrdyOW5E1V1ouyTm5d4+kgSd4KcM80D7K0NNScrhLIW6gpOggVVOVyTH3q2K1GQhzPlUcUe04ZNSo0ilQ== + dependencies: + "@types/debug" "^4.1.7" + "@types/fs-extra" "^11.0.1" + "@types/hash-sum" "^1.0.0" + "@vuepress/shared" "2.0.0-beta.61" + debug "^4.3.4" + fs-extra "^11.1.0" + globby "^13.1.3" + hash-sum "^2.0.0" + ora "^6.1.2" + picocolors "^1.0.0" + upath "^2.0.1" + +"@vueuse/core@^9.13.0": + version "9.13.0" + resolved "https://registry.npmmirror.com/@vueuse/core/-/core-9.13.0.tgz#2f69e66d1905c1e4eebc249a01759cf88ea00cf4" + integrity sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw== + dependencies: + "@types/web-bluetooth" "^0.0.16" + "@vueuse/metadata" "9.13.0" + "@vueuse/shared" "9.13.0" + vue-demi "*" + +"@vueuse/metadata@9.13.0": + version "9.13.0" + resolved "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.13.0.tgz#bc25a6cdad1b1a93c36ce30191124da6520539ff" + integrity sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ== + +"@vueuse/shared@9.13.0": + version "9.13.0" + resolved "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.13.0.tgz#089ff4cc4e2e7a4015e57a8f32e4b39d096353b9" + integrity sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw== + dependencies: + vue-demi "*" + abbrev@1: version "1.1.1" resolved "https://registry.npmmirror.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" @@ -1177,6 +1674,13 @@ are-we-there-yet@^2.0.0: delegates "^1.0.0" readable-stream "^3.6.0" +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + argparse@^2.0.1: version "2.0.1" resolved "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" @@ -1192,7 +1696,7 @@ async@^3.2.3: resolved "https://registry.npmmirror.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== -autoprefixer@^10.4.14: +autoprefixer@^10.4.13, autoprefixer@^10.4.14: version "10.4.14" resolved "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-10.4.14.tgz#e28d49902f8e759dd25b153264e862df2705f79d" integrity sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ== @@ -1378,7 +1882,7 @@ chardet@^0.7.0: resolved "https://registry.npmmirror.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== -chokidar@^3.5.1, chokidar@^3.5.3: +"chokidar@>=3.0.0 <4.0.0", chokidar@^3.5.1, chokidar@^3.5.3: version "3.5.3" resolved "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== @@ -1548,6 +2052,11 @@ concat-map@0.0.1: resolved "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== +connect-history-api-fallback@^2.0.0: + version "2.0.0" + resolved "https://registry.npmmirror.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" + integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== + consola@^2.15.3: version "2.15.3" resolved "https://registry.npmmirror.com/consola/-/consola-2.15.3.tgz#2e11f98d6a4be71ff72e0bdf07bd23e12cb61550" @@ -1915,6 +2424,11 @@ entities@~3.0.1: resolved "https://registry.npmmirror.com/entities/-/entities-3.0.1.tgz#2b887ca62585e96db3903482d336c1006c3001d4" integrity sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q== +envinfo@^7.8.1: + version "7.8.1" + resolved "https://registry.npmmirror.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" + integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== + errno@^0.1.3: version "0.1.8" resolved "https://registry.npmmirror.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" @@ -1922,6 +2436,34 @@ errno@^0.1.3: dependencies: prr "~1.0.1" +esbuild@^0.16.14, esbuild@~0.16.17: + version "0.16.17" + resolved "https://registry.npmmirror.com/esbuild/-/esbuild-0.16.17.tgz#fc2c3914c57ee750635fee71b89f615f25065259" + integrity sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg== + optionalDependencies: + "@esbuild/android-arm" "0.16.17" + "@esbuild/android-arm64" "0.16.17" + "@esbuild/android-x64" "0.16.17" + "@esbuild/darwin-arm64" "0.16.17" + "@esbuild/darwin-x64" "0.16.17" + "@esbuild/freebsd-arm64" "0.16.17" + "@esbuild/freebsd-x64" "0.16.17" + "@esbuild/linux-arm" "0.16.17" + "@esbuild/linux-arm64" "0.16.17" + "@esbuild/linux-ia32" "0.16.17" + "@esbuild/linux-loong64" "0.16.17" + "@esbuild/linux-mips64el" "0.16.17" + "@esbuild/linux-ppc64" "0.16.17" + "@esbuild/linux-riscv64" "0.16.17" + "@esbuild/linux-s390x" "0.16.17" + "@esbuild/linux-x64" "0.16.17" + "@esbuild/netbsd-x64" "0.16.17" + "@esbuild/openbsd-x64" "0.16.17" + "@esbuild/sunos-x64" "0.16.17" + "@esbuild/win32-arm64" "0.16.17" + "@esbuild/win32-ia32" "0.16.17" + "@esbuild/win32-x64" "0.16.17" + esbuild@^0.17.12, esbuild@^0.17.15, esbuild@^0.17.5: version "0.17.15" resolved "https://registry.npmmirror.com/esbuild/-/esbuild-0.17.15.tgz#209ebc87cb671ffb79574db93494b10ffaf43cbc" @@ -1991,6 +2533,11 @@ espree@^6.0.0: acorn-jsx "^5.2.0" eslint-visitor-keys "^1.1.0" +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + estree-walker@2.0.2, estree-walker@^2.0.1, estree-walker@^2.0.2: version "2.0.2" resolved "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" @@ -2028,11 +2575,33 @@ execa@^5.1.1: signal-exit "^3.0.3" strip-final-newline "^2.0.0" +execa@^7.0.0: + version "7.1.1" + resolved "https://registry.npmmirror.com/execa/-/execa-7.1.1.tgz#3eb3c83d239488e7b409d48e8813b76bb55c9c43" + integrity sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.1" + human-signals "^4.3.0" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^3.0.7" + strip-final-newline "^3.0.0" + expand-template@^2.0.3: version "2.0.3" resolved "https://registry.npmmirror.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== + dependencies: + is-extendable "^0.1.0" + external-editor@^3.0.3: version "3.1.0" resolved "https://registry.npmmirror.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" @@ -2200,7 +2769,7 @@ get-port-please@^3.0.1: resolved "https://registry.npmmirror.com/get-port-please/-/get-port-please-3.0.1.tgz#a24953a41dc249f76869ac25e81d6623e61ab010" integrity sha512-R5pcVO8Z1+pVDu8Ml3xaJCEkBiiy1VQN9za0YqH8GIi1nIqD4IzQhzY6dDzMRtdS1lyiGlucRzm8IN8wtLIXng== -get-stream@^6.0.0: +get-stream@^6.0.0, get-stream@^6.0.1: version "6.0.1" resolved "https://registry.npmmirror.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== @@ -2294,6 +2863,16 @@ graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, resolved "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== +gray-matter@^4.0.3: + version "4.0.3" + resolved "https://registry.npmmirror.com/gray-matter/-/gray-matter-4.0.3.tgz#e893c064825de73ea1f5f7d88c7a9f7274288798" + integrity sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q== + dependencies: + js-yaml "^3.13.1" + kind-of "^6.0.2" + section-matter "^1.0.0" + strip-bom-string "^1.0.0" + gzip-size@^7.0.0: version "7.0.0" resolved "https://registry.npmmirror.com/gzip-size/-/gzip-size-7.0.0.tgz#9f9644251f15bc78460fccef4055ae5a5562ac60" @@ -2414,6 +2993,11 @@ human-signals@^2.1.0: resolved "https://registry.npmmirror.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== +human-signals@^4.3.0: + version "4.3.1" + resolved "https://registry.npmmirror.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2" + integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ== + iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -2431,6 +3015,11 @@ ignore@^5.2.0, ignore@^5.2.4: resolved "https://registry.npmmirror.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== +immutable@^4.0.0: + version "4.3.0" + resolved "https://registry.npmmirror.com/immutable/-/immutable-4.3.0.tgz#eb1738f14ffb39fd068b1dbe1296117484dd34be" + integrity sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -2531,6 +3120,11 @@ is-docker@^3.0.0: resolved "https://registry.npmmirror.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== +is-extendable@^0.1.0: + version "0.1.1" + resolved "https://registry.npmmirror.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== + is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -2607,6 +3201,11 @@ is-stream@^2.0.0: resolved "https://registry.npmmirror.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== +is-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" + integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== + is-unicode-supported@^1.1.0, is-unicode-supported@^1.2.0: version "1.3.0" resolved "https://registry.npmmirror.com/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz#d824984b616c292a2e198207d4a609983842f714" @@ -2644,6 +3243,14 @@ js-tokens@^4.0.0: resolved "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.npmmirror.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" @@ -2686,6 +3293,11 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.npmmirror.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + klona@^2.0.6: version "2.0.6" resolved "https://registry.npmmirror.com/klona/-/klona-2.0.6.tgz#85bffbf819c03b2f53270412420a4555ef882e22" @@ -2703,7 +3315,7 @@ lazystream@^1.0.0: dependencies: readable-stream "^2.0.5" -lilconfig@^2.1.0: +lilconfig@^2.0.5, lilconfig@^2.1.0: version "2.1.0" resolved "https://registry.npmmirror.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== @@ -2864,6 +3476,21 @@ make-dir@^3.1.0, make-dir@~3.1.0: dependencies: semver "^6.0.0" +markdown-it-anchor@^8.6.7: + version "8.6.7" + resolved "https://registry.npmmirror.com/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz#ee6926daf3ad1ed5e4e3968b1740eef1c6399634" + integrity sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA== + +markdown-it-container@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/markdown-it-container/-/markdown-it-container-3.0.0.tgz#1d19b06040a020f9a827577bb7dbf67aa5de9a5b" + integrity sha512-y6oKTq4BB9OQuY/KLfk/O3ysFhB3IMYoIWhGJEidXt1NQFocFK2sA2t0NYZAMyMShAGL6x5OPIbrmXPIqaN9rw== + +markdown-it-emoji@^2.0.2: + version "2.0.2" + resolved "https://registry.npmmirror.com/markdown-it-emoji/-/markdown-it-emoji-2.0.2.tgz#cd42421c2fda1537d9cc12b9923f5c8aeb9029c8" + integrity sha512-zLftSaNrKuYl0kR5zm4gxXjHaOI3FAOEaloKmRA5hijmJZvSjmxcokOLlzycb/HXlUFWzXqpIEoyEMCE4i9MvQ== + markdown-it@^13.0.1: version "13.0.1" resolved "https://registry.npmmirror.com/markdown-it/-/markdown-it-13.0.1.tgz#c6ecc431cacf1a5da531423fc6a42807814af430" @@ -2895,6 +3522,11 @@ mdurl@^1.0.1: resolved "https://registry.npmmirror.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== +medium-zoom@^1.0.8: + version "1.0.8" + resolved "https://registry.npmmirror.com/medium-zoom/-/medium-zoom-1.0.8.tgz#2bd1fbcf2961fa7b0e318fe284462aa9b8608ed2" + integrity sha512-CjFVuFq/IfrdqesAXfg+hzlDKu6A2n80ZIq0Kl9kWjoHh9j1N9Uvk5X0/MmN0hOfm5F9YBswlClhcwnmtwz7gA== + memory-fs@^0.5.0: version "0.5.0" resolved "https://registry.npmmirror.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" @@ -2941,6 +3573,11 @@ mimic-fn@^2.1.0: resolved "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +mimic-fn@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" + integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== + mimic-response@^3.1.0: version "3.1.0" resolved "https://registry.npmmirror.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" @@ -3193,6 +3830,13 @@ npm-run-path@^4.0.1: dependencies: path-key "^3.0.0" +npm-run-path@^5.1.0: + version "5.1.0" + resolved "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-5.1.0.tgz#bc62f7f3f6952d9894bd08944ba011a6ee7b7e00" + integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q== + dependencies: + path-key "^4.0.0" + npmlog@^5.0.1: version "5.0.1" resolved "https://registry.npmmirror.com/npmlog/-/npmlog-5.0.1.tgz#f06678e80e29419ad67ab964e0fa69959c1eb8b0" @@ -3306,6 +3950,13 @@ onetime@^5.1.0, onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" +onetime@^6.0.0: + version "6.0.0" + resolved "https://registry.npmmirror.com/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" + integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== + dependencies: + mimic-fn "^4.0.0" + open@^8.4.0: version "8.4.2" resolved "https://registry.npmmirror.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" @@ -3372,6 +4023,11 @@ path-key@^3.0.0, path-key@^3.1.0: resolved "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== +path-key@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" + integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== + path-parse@^1.0.7: version "1.0.7" resolved "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" @@ -3478,6 +4134,14 @@ postcss-import@^15.1.0: read-cache "^1.0.0" resolve "^1.1.7" +postcss-load-config@^4.0.1: + version "4.0.1" + resolved "https://registry.npmmirror.com/postcss-load-config/-/postcss-load-config-4.0.1.tgz#152383f481c2758274404e4962743191d73875bd" + integrity sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA== + dependencies: + lilconfig "^2.0.5" + yaml "^2.1.1" + postcss-merge-longhand@^6.0.0: version "6.0.0" resolved "https://registry.npmmirror.com/postcss-merge-longhand/-/postcss-merge-longhand-6.0.0.tgz#6f627b27db939bce316eaa97e22400267e798d69" @@ -3683,6 +4347,11 @@ pretty-bytes@^6.1.0: resolved "https://registry.npmmirror.com/pretty-bytes/-/pretty-bytes-6.1.0.tgz#1d1cc9aae1939012c74180b679da6684616bf804" integrity sha512-Rk753HI8f4uivXi4ZCIYdhmG1V+WKzvRMg/X+M42a6t7D07RcmopXJMDNk6N++7Bl75URRGsb40ruvg7Hcp2wQ== +prismjs@^1.29.0: + version "1.29.0" + resolved "https://registry.npmmirror.com/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12" + integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== + process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" @@ -3856,7 +4525,7 @@ rollup-plugin-visualizer@^5.9.0: source-map "^0.7.4" yargs "^17.5.1" -rollup@^3.18.0, rollup@^3.20.0: +rollup@^3.10.0, rollup@^3.17.3, rollup@^3.18.0, rollup@^3.20.0: version "3.20.2" resolved "https://registry.npmmirror.com/rollup/-/rollup-3.20.2.tgz#f798c600317f216de2e4ad9f4d9ab30a89b690ff" integrity sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg== @@ -3897,11 +4566,28 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +sass@^1.58.3: + version "1.61.0" + resolved "https://registry.npmmirror.com/sass/-/sass-1.61.0.tgz#d1f6761bb833887b8fdab32a24e052c40531d02b" + integrity sha512-PDsN7BrVkNZK2+dj/dpKQAWZavbAQ87IXqVvw2+oEYI+GwlTWkvbQtL7F2cCNbMqJEYKPh1EcjSxsnqIb/kyaQ== + dependencies: + chokidar ">=3.0.0 <4.0.0" + immutable "^4.0.0" + source-map-js ">=0.6.2 <2.0.0" + scule@^1.0.0: version "1.0.0" resolved "https://registry.npmmirror.com/scule/-/scule-1.0.0.tgz#895e6f4ba887e78d8b9b4111e23ae84fef82376d" integrity sha512-4AsO/FrViE/iDNEPaAQlb77tf0csuq27EsVpy6ett584EcRTp6pTDLoGWVxCD77y5iU5FauOvhsI4o1APwPoSQ== +section-matter@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/section-matter/-/section-matter-1.0.0.tgz#e9041953506780ec01d59f292a19c7b850b84167" + integrity sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA== + dependencies: + extend-shallow "^2.0.1" + kind-of "^6.0.0" + semver@^6.0.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.npmmirror.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" @@ -3993,7 +4679,7 @@ shebang-regex@^3.0.0: resolved "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: +signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: version "3.0.7" resolved "https://registry.npmmirror.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== @@ -4029,7 +4715,7 @@ smob@^0.0.6: resolved "https://registry.npmmirror.com/smob/-/smob-0.0.6.tgz#09b268fea916158a2781c152044c6155adbb8aa1" integrity sha512-V21+XeNni+tTyiST1MHsa84AQhT1aFZipzPpOFAVB8DkHzwJyjjAmt9bgwnuZiZWnIbMo2duE29wybxv/7HWUw== -source-map-js@^1.0.1, source-map-js@^1.0.2: +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.1, source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== @@ -4057,6 +4743,11 @@ sourcemap-codec@^1.4.8: resolved "https://registry.npmmirror.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + standard-as-callback@^2.1.0: version "2.1.0" resolved "https://registry.npmmirror.com/standard-as-callback/-/standard-as-callback-2.1.0.tgz#8953fc05359868a77b5b9739a665c5977bb7df45" @@ -4125,11 +4816,21 @@ strip-ansi@^7.0.1: dependencies: ansi-regex "^6.0.1" +strip-bom-string@^1.0.0: + version "1.0.0" + resolved "https://registry.npmmirror.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92" + integrity sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g== + strip-final-newline@^2.0.0: version "2.0.0" resolved "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== +strip-final-newline@^3.0.0: + version "3.0.0" + resolved "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" + integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== + strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" @@ -4283,6 +4984,11 @@ tr46@~0.0.3: resolved "https://registry.npmmirror.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== +ts-debounce@^4.0.0: + version "4.0.0" + resolved "https://registry.npmmirror.com/ts-debounce/-/ts-debounce-4.0.0.tgz#33440ef64fab53793c3d546a8ca6ae539ec15841" + integrity sha512-+1iDGY6NmOGidq7i7xZGA4cm8DAa6fqdYcvO5Z6yBevH++Bdo9Qt/mN0TzHUgcCcKv1gmh9+W5dHqz8pMWbCbg== + tslib@^2.1.0: version "2.5.0" resolved "https://registry.npmmirror.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" @@ -4422,6 +5128,11 @@ untyped@^1.3.2: mri "^1.2.0" scule "^1.0.0" +upath@^2.0.1: + version "2.0.1" + resolved "https://registry.npmmirror.com/upath/-/upath-2.0.1.tgz#50c73dea68d6f6b990f51d279ce6081665d61a8b" + integrity sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w== + update-browserslist-db@^1.0.10: version "1.0.10" resolved "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" @@ -4481,6 +5192,18 @@ vite-plugin-checker@^0.5.6: optionalDependencies: fsevents "~2.3.2" +vite@~4.1.4: + version "4.1.4" + resolved "https://registry.npmmirror.com/vite/-/vite-4.1.4.tgz#170d93bcff97e0ebc09764c053eebe130bfe6ca0" + integrity sha512-3knk/HsbSTKEin43zHu7jTwYWv81f8kgAL99G5NWBcA1LKvtvcVAC4JjBH1arBunO9kQka+1oGbrMKOjk4ZrBg== + dependencies: + esbuild "^0.16.14" + postcss "^8.4.21" + resolve "^1.22.1" + rollup "^3.10.0" + optionalDependencies: + fsevents "~2.3.2" + vscode-jsonrpc@6.0.0: version "6.0.0" resolved "https://registry.npmmirror.com/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz#108bdb09b4400705176b957ceca9e0880e9b6d4e" @@ -4532,7 +5255,7 @@ vue-bundle-renderer@^1.0.3: dependencies: ufo "^1.1.1" -vue-demi@^0.13.11, vue-demi@^0.13.5: +vue-demi@*, vue-demi@^0.13.11, vue-demi@^0.13.5: version "0.13.11" resolved "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.13.11.tgz#7d90369bdae8974d87b1973564ad390182410d99" integrity sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A== @@ -4581,6 +5304,23 @@ vue@^3.2.47: "@vue/server-renderer" "3.2.47" "@vue/shared" "3.2.47" +vuepress-vite@2.0.0-beta.61: + version "2.0.0-beta.61" + resolved "https://registry.npmmirror.com/vuepress-vite/-/vuepress-vite-2.0.0-beta.61.tgz#04058551e6be014e9f2dee14c5d8043b158e032d" + integrity sha512-4mcR8XSY5b36CYkPqF80WvoeGAEjTw6Cr9bMPHrPVSjG4qqyfVpdSdyRtXD+/5aLJB7r/L60J7PI1pKTci1+3w== + dependencies: + "@vuepress/bundler-vite" "2.0.0-beta.61" + "@vuepress/cli" "2.0.0-beta.61" + "@vuepress/core" "2.0.0-beta.61" + "@vuepress/theme-default" "2.0.0-beta.61" + +vuepress@^2.0.0-beta.61: + version "2.0.0-beta.61" + resolved "https://registry.npmmirror.com/vuepress/-/vuepress-2.0.0-beta.61.tgz#f89741a505b71fbe49dba83d8319b1fd0d45116c" + integrity sha512-gpttL0x5ZvI9eTyR/pexBknIAcgrdjAWoiJc7OYd4bIVfwlXAb4GO4A2EwRSX+pIaNOWdcd+sfZA86EMEbrtNg== + dependencies: + vuepress-vite "2.0.0-beta.61" + vuetify@^3.0.6: version "3.1.12" resolved "https://registry.npmmirror.com/vuetify/-/vuetify-3.1.12.tgz#f3b8a61d176cbfd876f7208ece21e4a1e434ec6a" @@ -4694,6 +5434,11 @@ yaml@^1.10.0: resolved "https://registry.npmmirror.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== +yaml@^2.1.1: + version "2.2.1" + resolved "https://registry.npmmirror.com/yaml/-/yaml-2.2.1.tgz#3014bf0482dcd15147aa8e56109ce8632cd60ce4" + integrity sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw== + yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35"