diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index b4e7b47..51ce441 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -1,7 +1,7 @@ name: Deploy on: - workflow_dispatch: {} + workflow_dispatch: { } push: branches: - main @@ -9,30 +9,40 @@ on: jobs: deploy: runs-on: ubuntu-latest + permissions: pages: write id-token: write + environment: name: github-pages url: ${{ steps.deployment.outputs.page_url }} + steps: - uses: actions/checkout@v3 with: fetch-depth: 0 + - uses: pnpm/action-setup@v2 with: version: 8 + - uses: actions/setup-node@v3 with: node-version: 18 cache: pnpm + - run: pnpm install + - name: Build run: pnpm run build + - uses: actions/configure-pages@v2 + - uses: actions/upload-pages-artifact@v1 with: path: content/.vitepress/dist + - name: Deploy id: deployment uses: actions/deploy-pages@v1 diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000..a55e7a1 --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..03c75c5 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,33 @@ + + + + \ No newline at end of file diff --git a/.idea/watcherTasks.xml b/.idea/watcherTasks.xml new file mode 100644 index 0000000..fb0d65a --- /dev/null +++ b/.idea/watcherTasks.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/README.md b/README.md index 086dd93..9037a05 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ # BsBlog v4 + > Powered by VitePress + Vuetify **Still WIP...** diff --git a/content/.vitepress/config.ts b/content/.vitepress/config.ts index de670bc..c148ecb 100644 --- a/content/.vitepress/config.ts +++ b/content/.vitepress/config.ts @@ -1,11 +1,11 @@ import { defineConfigWithTheme } from 'vitepress' import vuetify from 'vite-plugin-vuetify' -import { BsBlogThemeConfig } from '../../theme' +import { BsBlogThemeConfig } from '../../theme/types/config' import { createContainer } from './utils' export default defineConfigWithTheme({ title: 'BsBlog', - description: 'BsBlog v4 - Built with VitePress', + description: 'BsBlog v4 - Powered by VitePress', markdown: { theme: 'one-dark-pro', @@ -36,7 +36,7 @@ export default defineConfigWithTheme({ author: 'bsdayo', bio: '♪sakana——\\(>○<\\)♪', avatar: 'https://avatars.githubusercontent.com/u/41754841', - postPerPage: 8, + defaultPostCover: 'https://cdn.vuetifyjs.com/images/parallax/material.jpg', navLinks: [ { href: '/', @@ -80,11 +80,6 @@ export default defineConfigWithTheme({ icon: 'si:bilibili', desc: 'BiliBili', }, - // { - // href: 'mailto:bs@sorabs.cc', - // icon: 'si:microsoftoutlook', - // desc: 'Mail', - // }, ], giscus: { host: 'https://giscus.app', diff --git a/content/.vitepress/utils.ts b/content/.vitepress/utils.ts index 8ab3f9b..5c35b39 100644 --- a/content/.vitepress/utils.ts +++ b/content/.vitepress/utils.ts @@ -2,6 +2,7 @@ import container from 'markdown-it-container' // https://github.com/vuejs/vitepress/blob/main/src/node/markdown/plugins/containers.ts type ContainerArgs = [typeof container, string, { render: Function }] + export function createContainer( klass: string, defaultTitle: string, @@ -11,7 +12,7 @@ export function createContainer( container, klass, { - render(tokens, idx) { + render(tokens: any, idx: any) { const token = tokens[idx] const info = token.info.trim().slice(klass.length).trim() if (token.nesting === 1) { diff --git a/content/index.md b/content/index.md index ae8dbb1..ce5e2fb 100644 --- a/content/index.md +++ b/content/index.md @@ -1,6 +1,7 @@ --- -home: true -title: 首页 -image: https://w.wallhaven.cc/full/zy/wallhaven-zygeko.jpg +type: home +#title: BsBlog +description: 欢迎! +# cover: https://w.wallhaven.cc/full/zy/wallhaven-zygeko.jpg --- diff --git a/content/pages/about/index.md b/content/pages/about/index.md index 22c1483..540563a 100644 --- a/content/pages/about/index.md +++ b/content/pages/about/index.md @@ -5,7 +5,7 @@ comment: true ## Ciallo~(∠・ω< )⌒☆ -- 苦逼高三生 +- ~~苦逼高三生~~ 毕业了! - 经常(天天)熬夜 - 又菜又爱玩的音游fw - ~~lolicon~~ @@ -14,9 +14,10 @@ comment: true 第四版 Blog 终于还是来了... -这一次是基于 [VitePress](https://vitepress.dev/) 的纯前端 SSG 博客,自己用 Vuetify 搭了一个 Material Design 风格的界面,目前感觉是挺满意的。界面参考了 Hexo 的 [Butterfly](https://butterfly.js.org/) 主题,也算是以前一直很喜欢的设计 +这一次是基于 [VitePress](https://vitepress.dev/) 的纯前端 SSG 博客,自己用 Vuetify 搭了一个 Material Design +风格的界面,目前感觉是挺满意的。 -VitePress 的好处还是很多的,比如直接在 Markdown 中使用 Vue 组件: +VitePress 的好处还是很多的,比如直接在 Markdown 中使用 Vue 组件库: 这是一个 v-btn 组件 @@ -31,7 +32,7 @@ VitePress 的好处还是很多的,比如直接在 Markdown 中使用 Vue 组 和一些内置的 [Markdown 扩展](https://vitepress.dev/guide/markdown)(这里我自己加了样式): ::: tip 一些自定义的文本块 -♪sakana——\\(>○<\\)♪   :fish: ← Emoji 支持 +♪sakana——\\(>○<\\)♪   `:fish:` → :fish: Emoji 支持 ::: 最后还是希望自己能坚持写下去(跑 diff --git a/content/pages/links/LinkCard.vue b/content/pages/links/LinkCard.vue index 74ea45e..1f120d1 100644 --- a/content/pages/links/LinkCard.vue +++ b/content/pages/links/LinkCard.vue @@ -2,13 +2,13 @@
- +
{{ $props.title }} {{ $props.desc }} - +
diff --git a/content/pages/links/index.md b/content/pages/links/index.md index 2b8a399..444d5bd 100644 --- a/content/pages/links/index.md +++ b/content/pages/links/index.md @@ -60,21 +60,23 @@ links: --- ::: tip 欢迎交换友链! + - 名称:BsBlog -- 链接:[https://sorabs.cc/](https://sorabs.cc/) +- 链接:[https://blog.bsdayo.moe/](https://blog.bsdayo.moe/) - 头像:[https://avatars.githubusercontent.com/u/41754841?v=4](https://avatars.githubusercontent.com/u/41754841?v=4) - 简介: bs在摸鱼还是睡觉呢zzz ~~(和我熟的话其实写什么都行 xxx)~~ ::: -交换友链可以[在 GitHub 上修改本页面](https://github.com/bsdayo/bsblog/edit/main/content/pages/links/index.md),并提交 Pull Request;或者直接在下面评论,记得带上类似上面的的格式哦~ +交换友链可以[在 GitHub 上修改本页面](https://github.com/bsdayo/bsblog/edit/main/content/pages/links/index.md),并提交 +Pull Request;或者直接在下面评论,记得带上类似上面的的格式哦~ 拜拜各位大佬们~ 排序不分先后,最近加的会放在列表顶部 qwq - + diff --git a/content/posts/deploy-aspnetcore-on-aliyun-fc/index.md b/content/posts/deploy-aspnetcore-on-aliyun-fc/index.md index 65a9d4b..87af56c 100644 --- a/content/posts/deploy-aspnetcore-on-aliyun-fc/index.md +++ b/content/posts/deploy-aspnetcore-on-aliyun-fc/index.md @@ -2,18 +2,27 @@ title: 超低成本使用阿里云函数计算部署 ASP.NET Core 应用 create: 2023-05-07T20:40:31+08:00 cover: /covers/deploy-aspnetcore-on-aliyun-fc.webp +description: | + Serverless 是前几年提出的一种新的云服务架构,迅速得到了业界的广泛关注和使用。 + 对于用户来说,直接能够体验到的就是各大云计算厂商的云函数产品,例如阿里云函数计算,腾讯云云函数,Azure Functions,AWS Lambda 等等。 + 对于一个不需要持续进行后台任务的接口服务(例如 REST API 等),Serverless 相比传统的云服务器部署拥有许多得天独厚的优势。 --- ## 简单介绍 Serverless -Serverless 是前几年提出的一种新的云服务架构,迅速得到了业界的广泛关注和使用。对于用户来说,直接能够体验到的就是各大云计算厂商的云函数产品,例如阿里云函数计算,腾讯云云函数,Azure Functions,AWS Lambda 等等。 +Serverless 是前几年提出的一种新的云服务架构,迅速得到了业界的广泛关注和使用。对于用户来说,直接能够体验到的就是各大云计算厂商的云函数产品,例如阿里云函数计算,腾讯云云函数,Azure +Functions,AWS Lambda 等等。 -对于一个不需要持续进行后台任务的接口服务(例如 REST API,gRPC 等),Serverless 相比传统的云服务器部署,拥有许多得天独厚的优势: +对于一个不需要持续进行后台任务的接口服务(例如 REST API,gRPC 等),Serverless 相比传统的云服务器部署拥有许多得天独厚的优势: -- 运维成本低:传统的云服务器需要使用者对运维有一定的了解,并且在服务器选型/购买、环境配置、资源分配等方面都需要亲力亲为。Serverless 则不同,所有实例的创建销毁都由云服务提供方自动管理,使用者只需要指定资源需求,上传可执行文件/代码,就能直接把服务跑起来。(所谓 "Serverless",就是让用户感知不到配置服务器的步骤) -- 使用成本低:传统的云服务器是按时间收费,比如几个月、一年一次付清,其间如果没有在跑服务,或者使用频率比较低,那时间就白白浪费了。而 Serverless 服务是按需计费的,只有在接受请求的时候会按调用次数计费,没有请求的时候服务实例会被释放,不会产生费用。 +- 运维成本低:传统的云服务器需要使用者对运维有一定的了解,并且在服务器选型/购买、环境配置、资源分配等方面都需要亲力亲为。Serverless + 则不同,所有实例的创建销毁都由云服务提供方自动管理,使用者只需要指定资源需求,上传可执行文件/代码,就能直接把服务跑起来。(所谓 " + Serverless",就是让用户感知不到配置服务器的步骤) +- 使用成本低:传统的云服务器是按时间收费,比如几个月、一年一次付清,其间如果没有在跑服务,或者使用频率比较低,那时间就白白浪费了。而 + Serverless 服务是按需计费的,只有在接受请求的时候会按调用次数计费,没有请求的时候服务实例会被释放,不会产生费用。 - 利于解耦:Serverless 比微服务还要更进一步,可以把服务拆成更细的粒度,从而在更新时只需要进行小范围的迭代,而不用整个应用都重新部署一遍。 -- 弹性扩容:不比云服务器需要在一开始考虑好配置问题,Serverless 服务的资源可以看成是无限的 —— 由于是根据调用动态创建实例,就可以随时随地根据业务规模去动态调整配置需求。 +- 弹性扩容:不比云服务器需要在一开始考虑好配置问题,Serverless 服务的资源可以看成是无限的 —— + 由于是根据调用动态创建实例,就可以随时随地根据业务规模去动态调整配置需求。 以阿里云为例,我们看一下一个云函数的使用成本: @@ -89,13 +98,16 @@ TestAliyunFC -> C:\Users\bsdayo\Code\TestAliyunFC\TestAliyunFC\bin\Release\net8. ## 准备 ASP.NET Core 运行时 -阿里云官方提供的 .NET 环境少得可怜,只有 .NET Core 2.1,.NET Core 3.1 和 .NET 6 三个版本,难以满足我们的需求。好在阿里云提供了 Custom Runtime 和“层”功能,我们可以上传自己的运行时,从而支持各种各样的自定义环境。 +阿里云官方提供的 .NET 环境少得可怜,只有 .NET Core 2.1,.NET Core 3.1 和 .NET 6 三个版本,难以满足我们的需求。好在阿里云提供了 +Custom Runtime 和“层”功能,我们可以上传自己的运行时,从而支持各种各样的自定义环境。 -前往 [.NET 下载页](https://dotnet.microsoft.com/zh-cn/download/dotnet),选择自己想要的 .NET 版本。下文将用 .NET 8 Preview 3 举例。 +前往 [.NET 下载页](https://dotnet.microsoft.com/zh-cn/download/dotnet),选择自己想要的 .NET 版本。下文将用 .NET 8 Preview +3 举例。 ![.NET 下载页](./dotnet-runtime-download.webp) -由于我们是需要运行应用,所以下载”ASP.NET Core 运行时“就可以了。系统选择 Linux,在二进制文件一栏找到 x64 架构下载。下载下来是一个 `.tar.gz` 压缩包,我们可以使用 7-Zip 等软件将其解压,也放在一旁备用。 +由于我们是需要运行应用,所以下载”ASP.NET Core 运行时“就可以了。系统选择 Linux,在二进制文件一栏找到 x64 +架构下载。下载下来是一个 `.tar.gz` 压缩包,我们可以使用 7-Zip 等软件将其解压,也放在一旁备用。 ## 创建层 @@ -132,7 +144,8 @@ TestAliyunFC -> C:\Users\bsdayo\Code\TestAliyunFC\TestAliyunFC\bin\Release\net8. ::: ::: note 关于路径 -自定义层在挂载的时候会自动把所有文件解压到 `/opt` 目录下,因此需要注意路径问题。向上面选择直接包含 `dotnet` 文件的文件夹,挂在后 `dotnet` 文件的路径就是 `/opt/dotnet`。 +自定义层在挂载的时候会自动把所有文件解压到 `/opt` 目录下,因此需要注意路径问题。向上面选择直接包含 `dotnet` +文件的文件夹,挂在后 `dotnet` 文件的路径就是 `/opt/dotnet`。 ::: 完成后如下,点创建就行。 @@ -158,29 +171,32 @@ TestAliyunFC -> C:\Users\bsdayo\Code\TestAliyunFC\TestAliyunFC\bin\Release\net8. /opt/dotnet TestAliyunFC.dll ``` - ::: note 关于路径 - 上传的代码同样需要注意路径问题,上传的文件夹或 zip 包**内**的代码会存放在 `/code` 目录下,函数启动时的初始目录也是 `/code`。 - ::: + ::: note 关于路径 + 上传的代码同样需要注意路径问题,上传的文件夹或 zip 包**内**的代码会存放在 `/code` + 目录下,函数启动时的初始目录也是 `/code`。 + ::: - ::: warning 坑:应用监听地址 - 跑在云函数上的应用**必须监听 `0.0.0.0` 地址**,且**应用和函数的监听端口需要保持一致**。为了达成这个要求,我们需要给 ASP.NET Core 显式设置一下,否则会导致请求超时。 - - 有两种方法,选择其一即可,这里举例将端口设置为 1145。 + ::: warning 坑:应用监听地址 + 跑在云函数上的应用**必须监听 `0.0.0.0` 地址**,且**应用和函数的监听端口需要保持一致**。为了达成这个要求,我们需要给 + ASP.NET Core 显式设置一下,否则会导致请求超时。 + + 有两种方法,选择其一即可,这里举例将端口设置为 1145。 - 在启动命令后面加上 `--urls http://0.0.0.0:1145` - 在 `Program.cs` 中加上以下代码,并重新发布上传: ```csharp builder.WebHost.UseUrls("http://0.0.0.0:1145"); ``` - - 然后将”监听端口“项也设置为 1145。 - ::: + + 然后将”监听端口“项也设置为 1145。 + ::: - 高级配置中可以选择实例规格,按需求选就好,后续可以更改。 - 剩下的环境变量等可以自行配置。 创建完成后会自动打开函数详情页,里面有一个基于 VSCode 的在线编辑器,不过我们只有一堆 dll,只能看着发呆没啥用。 -如果对目录结构还是不太清楚,可以开一个内置的终端自己探索一下。需要注意的是层只有在运行的时候才会挂载进来,所以即便稍后添加了自定义层,`/opt` 目录底下也是找不到我们的运行时的。 +如果对目录结构还是不太清楚,可以开一个内置的终端自己探索一下。需要注意的是层只有在运行的时候才会挂载进来,所以即便稍后添加了自定义层,`/opt` +目录底下也是找不到我们的运行时的。 在编辑器上方找到”编辑层“,点进去 diff --git a/content/posts/manually-compile-aseprite/index.md b/content/posts/manually-compile-aseprite/index.md index b7fda00..8ec78d5 100644 --- a/content/posts/manually-compile-aseprite/index.md +++ b/content/posts/manually-compile-aseprite/index.md @@ -2,7 +2,6 @@ title: 手动编译像素画软件 Aseprite create: 2022-02-09T19:00:12+08:00 -categories: tech tags: - pixel-arts @@ -13,11 +12,15 @@ cover: /covers/manually-compile-aseprite.jpg 本文章已过时。对于最新的编译方式,请参照[官方文档](https://github.com/aseprite/aseprite/blob/main/INSTALL.md)。 ::: -最近学 2D 游戏开发,想自己画点像素画,就去找了找有什么好用的像素画软件。首先就想到了大名鼎鼎的 Aseprite,去 Steam 上搜了下,70RMB。 +最近学 2D 游戏开发,想自己画点像素画,就去找了找有什么好用的像素画软件。首先就想到了大名鼎鼎的 Aseprite,去 Steam +上搜了下,70RMB。 -对于穷学生党来说 70 也不少了()何况我年初收了一台米板 2,目前处于囊中羞涩的状态。搜索一番发现 Aseprite 居然是在 GitHub 上开源的,官方 repo 里也提供了编译说明,遂自行编译之。 +对于穷学生党来说 70 也不少了()何况我年初收了一台米板 2,目前处于囊中羞涩的状态。搜索一番发现 Aseprite 居然是在 GitHub +上开源的,官方 repo 里也提供了编译说明,遂自行编译之。 -本文仅涉及 Windows 平台下的编译,若是 macOS 或是 Linux 平台可自行查看[官方编译说明](https://github.com/aseprite/aseprite/blob/main/INSTALL.md)(方法大同小异,甚至更简单,因为不用装 VS) +本文仅涉及 Windows 平台下的编译,若是 macOS 或是 Linux +平台可自行查看[官方编译说明](https://github.com/aseprite/aseprite/blob/main/INSTALL.md)(方法大同小异,甚至更简单,因为不用装 +VS) 平台:Windows 10 @@ -31,7 +34,8 @@ Windows 下的编译需要用到 Visual Studio Community (微软的 IDE)的 ![下载社区版](vs-downloads.jpg) -下载完成打开安装程序,选择 “使用 C++ 的桌面开发”,并在右侧**至少**勾选 “MSVC C++ x64/x86 生成工具” 和 “Windows 10 SDK”,然后点击安装。 +下载完成打开安装程序,选择 “使用 C++ 的桌面开发”,并在右侧**至少**勾选 “MSVC C++ x64/x86 生成工具” 和 “Windows 10 +SDK”,然后点击安装。 ![注意右侧选项](vs-install.jpg) @@ -61,7 +65,8 @@ Aseprite 编译不支持 MinGW,所以对于 MinGW 用户,需要将环境变 ### 下载 Skia-m96 -前往 [Skia Releases](https://github.com/aseprite/skia/releases) 根据系统位数下载 `Skia-Windows-Release.zip`,我的系统是 64 位的所以下载 x64 版本。 +前往 [Skia Releases](https://github.com/aseprite/skia/releases) 根据系统位数下载 `Skia-Windows-Release.zip`,我的系统是 +64 位的所以下载 x64 版本。 注意下载的是 **m96** 版本,不要下错了。 ![下载 skia](skia-downloads.jpg) @@ -72,7 +77,8 @@ Aseprite 编译不支持 MinGW,所以对于 MinGW 用户,需要将环境变 ### 下载 Aseprite 源码 -前往 [Aseprite Releases](https://github.com/aseprite/aseprite/releases) 下载 `Aseprite--Source.zip` 并解压,会使用 git 的也可以直接克隆仓库 `https://github.com/aseprite/aseprite.git` +前往 [Aseprite Releases](https://github.com/aseprite/aseprite/releases) 下载 `Aseprite--Source.zip` 并解压,会使用 +git 的也可以直接克隆仓库 `https://github.com/aseprite/aseprite.git` ![下载 Aseprite--Source.zip](aseprite-source-downloads.jpg) @@ -82,7 +88,9 @@ Aseprite 编译不支持 MinGW,所以对于 MinGW 用户,需要将环境变 ![打开 VS Prompt](open-vs-prompt.jpg) -初始化完成后输入 `cd ` 切换到源码目录下,如果在另一个分区则需要先用 `<盘符>:` 切换。如默认打开了 `D:\Microsoft Visual Studio\2022\Community`,而我的源码在 `C:\Users\b1acksoil\Downloads\Aseprite-Source` 里: +初始化完成后输入 `cd ` 切换到源码目录下,如果在另一个分区则需要先用 `<盘符>:` +切换。如默认打开了 `D:\Microsoft Visual Studio\2022\Community` +,而我的源码在 `C:\Users\b1acksoil\Downloads\Aseprite-Source` 里: ``` C: @@ -103,13 +111,17 @@ cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo -DLAF_BACKEND=skia -DSKIA_DIR=" 桌面快捷方式。 +完成后可以在 Aseprite 源码下的 build 文件夹内找到 bin 文件夹,可以重命名并移动到其他地方,里面的 `aseprite.exe` 就是编译好的 +Aseprite 主程序了。此时可以右键 `aseprite.exe`,并 发送到 > 桌面快捷方式。 ### 汉化(可选) -Aseprite 默认不含中文,但可以使用社区自制的中文汉化包。可以前往 [README](https://github.com/J-11/Aseprite-Simplified-Chinese/blob/master/README.md) 查看并下载。 +Aseprite +默认不含中文,但可以使用社区自制的中文汉化包。可以前往 [README](https://github.com/J-11/Aseprite-Simplified-Chinese/blob/master/README.md) +查看并下载。 ### 更新 diff --git a/content/posts/memories-of-yukichan-arcaea-module/index.md b/content/posts/memories-of-yukichan-arcaea-module/index.md index 091c0e8..e683968 100644 --- a/content/posts/memories-of-yukichan-arcaea-module/index.md +++ b/content/posts/memories-of-yukichan-arcaea-module/index.md @@ -1,24 +1,34 @@ --- title: 一路走来,感谢有你 —— 暮雪酱 Arcaea 模块的前世今生 create: 2023-04-27T22:48:38+08:00 +category: 分享 cover: /covers/memories-of-yukichan-arcaea-module.jpg +description: 随着 lowiro 对 ArcaeaUnlimitedAPI 的彻底封禁,暮雪酱 Arcaea 查分模块的生命也走到了尽头。在这里,我们一起回顾一下暮雪酱 Arcaea 模块的发展史... --- -随着 lowiro 对 ArcaeaUnlimitedAPI 的彻底封禁,暮雪酱 Arcaea 查分模块的生命也走到了尽头。在这里,我们一起回顾一下暮雪酱 Arcaea 模块的发展史... +随着 lowiro 对 ArcaeaUnlimitedAPI 的彻底封禁,暮雪酱 Arcaea 查分模块的生命也走到了尽头。在这里,我们一起回顾一下暮雪酱 +Arcaea 模块的发展史... ## 2021 年 8 月 -当时还是个引诱萌新,机缘巧合之下认识了 Arcaea 这个**创**新立体节奏音游,很快就喜欢上了。一次不知道从哪听来 ptt 这个东西,就跑去 wiki 查,了解到推分的机制,也知道了 B30 的存在。正好当时加的引诱群里有 Andrea 系 Bot 里的 Dantage,顺手就用了起来,天天打完就查分( +当时还是个引诱萌新,机缘巧合之下认识了 Arcaea 这个**创**新立体节奏音游,很快就喜欢上了。一次不知道从哪听来 ptt 这个东西,就跑去 +wiki 查,了解到推分的机制,也知道了 B30 的存在。正好当时加的引诱群里有 Andrea 系 Bot 里的 Dantage,顺手就用了起来,天天打完就查分( 不得不说查分确实是好东西,很长一段时间都成了我推分的动力,看着 ptt 不断攀升,心情也是比较愉悦的 ## 2022 年 1 月 -作为一名头铁的开发者,当然是选择自己造轮子了()当时并不清楚这些查分 Bot 的数据都从哪里来,就自己去 GitHub 上翻。翻了半天找到一个叫 [BotArcAPI](https://github.com/Arcaea-Infinity/BotArcAPIs-Memories) 的项目,似乎就是我要找的,但是被我发现的时候已经 Archive 了...不信邪地又翻了翻,在 badge 里找到了一个 QQ 群号,加进去发现是一个音游码农群(~~现在已经是白丝贫乳群了~~)。潜了半天水,后来找到一个看起来像关键人物的群友,就去打探了下情报。接着便了解到 BotArcAPI 的续作 ArcaeaUnlimitedAPI 这个项目,并成功要到了 API 的访问权限。 +作为一名头铁的开发者,当然是选择自己造轮子了()当时并不清楚这些查分 Bot 的数据都从哪里来,就自己去 GitHub +上翻。翻了半天找到一个叫 [BotArcAPI](https://github.com/Arcaea-Infinity/BotArcAPIs-Memories) 的项目,似乎就是我要找的,但是被我发现的时候已经 +Archive 了...不信邪地又翻了翻,在 badge 里找到了一个 QQ 群号,加进去发现是一个音游码农群(~~现在已经是白丝贫乳群了~~ +)。潜了半天水,后来找到一个看起来像关键人物的群友,就去打探了下情报。接着便了解到 BotArcAPI 的续作 ArcaeaUnlimitedAPI +这个项目,并成功要到了 API 的访问权限。 这时候也被拉进了 [Arcaea-Infinity](https://github.com/Arcaea-Infinity)(~~无限玻璃渣子~~)组织,有一种找到家的感觉.jpg -拿到了数据之后,我就开始着手开发第一代 Bot 了,也就是暮雪酱的前身 lancelot,老用户应该还记得。当时由于前一年都在写 Vue,对 Node.js 和 TypeScript 很熟悉,就直接选为 Bot 的开发语言了。框架选用了 [koishi.js](https://github.com/koishijs/koishi),高度封装开箱即用,也就没有花什么时间在聊天平台的对接上。印象里总共花了四天的时间来完成整套功能,由于很多技术从前没有使用过,大部分时间就花在了查各种文档上。 +拿到了数据之后,我就开始着手开发第一代 Bot 了,也就是暮雪酱的前身 lancelot,老用户应该还记得。当时由于前一年都在写 Vue,对 +Node.js 和 TypeScript 很熟悉,就直接选为 Bot 的开发语言了。框架选用了 [koishi.js](https://github.com/koishijs/koishi) +,高度封装开箱即用,也就没有花什么时间在聊天平台的对接上。印象里总共花了四天的时间来完成整套功能,由于很多技术从前没有使用过,大部分时间就花在了查各种文档上。 核心的功能,像是 B30、最近成绩、单曲最高分的图查,以及曲目信息和别名的查询,在当时已经完成了。写完之后自己试用了一段时间,也比较满意。 @@ -32,11 +42,14 @@ lancelot 这个名字,实际上来源于我的手机 Redmi 9 的机型代号 ` ## 2022 年 2 月 -当时也是比较浮躁,想着把 Bot 公开,就撰写了[一篇哔哩哔哩专栏](https://www.bilibili.com/read/cv15225236/),介绍我的 lancelot。截至当前,专栏已经有上万的浏览量,200+ 的点赞和收藏,也是很感谢大家的支持和厚爱。直到现在都忘不掉那段时间——守在群里等加群申请,期待他们试用之后的评价。结果就是,玩家们的热情有点超出了我当时的想象,加群的人真的可以用络绎不绝来描述了x +当时也是比较浮躁,想着把 Bot 公开,就撰写了[一篇哔哩哔哩专栏](https://www.bilibili.com/read/cv15225236/),介绍我的 +lancelot。截至当前,专栏已经有上万的浏览量,200+ +的点赞和收藏,也是很感谢大家的支持和厚爱。直到现在都忘不掉那段时间——守在群里等加群申请,期待他们试用之后的评价。结果就是,玩家们的热情有点超出了我当时的想象,加群的人真的可以用络绎不绝来描述了x 同时也认识了许多老朋友,从开始一直陪着走到了现在,感谢你们~ -二月份添加了很多新功能,比如 `/a random`,`/a recommend`。月底的时候,成功申请到了 616 官方的 ArcaeaLimitedAPI,因此加入了 `/a b30 --official` 功能。 +二月份添加了很多新功能,比如 `/a random`,`/a recommend`。月底的时候,成功申请到了 616 官方的 +ArcaeaLimitedAPI,因此加入了 `/a b30 --official` 功能。 @@ -56,7 +69,8 @@ arc 方面也加入了用于根据分数计算单曲 ptt 的 `/a ptt`,和找 同时写了一些更新曲目数据库的小工具,简化更新流程。 -这个月由于高频触发冻结,探索发现 QQ 频道连冻结机制都没有,就把 lancelot 适配到了 QQ 频道。还尝试过把 lancelot 适配到 Telegram,以便不时之需,但是后来由于没给梯子续费等种种原因就不了了之了x +这个月由于高频触发冻结,探索发现 QQ 频道连冻结机制都没有,就把 lancelot 适配到了 QQ 频道。还尝试过把 lancelot 适配到 +Telegram,以便不时之需,但是后来由于没给梯子续费等种种原因就不了了之了x 频道没有人数限制,截至现在已经有 3000 多人了。最早的时候每天都要处理几十个加频道申请,很久之后才归于正常( @@ -68,13 +82,20 @@ arc 方面也加入了用于根据分数计算单曲 ptt 的 `/a ptt`,和找 ## 2022 年 5 - 7 月 -这段时间算是我开发生涯中的一道巨大的分水岭。受群友影响,我开始尝试学习 .NET 和 C#,并逐渐意识到它带来的巨大生产力提升,现在看来也很幸运。当时有一种什么感觉呢,用过了 C# 之后,再也不想回到用 TS 写项目的时代了(前端除外) +这段时间算是我开发生涯中的一道巨大的分水岭。受群友影响,我开始尝试学习 .NET 和 +C#,并逐渐意识到它带来的巨大生产力提升,现在看来也很幸运。当时有一种什么感觉呢,用过了 C# 之后,再也不想回到用 TS +写项目的时代了(前端除外) -同期见到了另外几个群友的 Arcaea Bot 也是用 C# 开发的,秉持着不知道哪里来的“折腾就是生命的原则”,我彻底转向 .NET/C#,开始了 lancelot 的重写工作。 +同期见到了另外几个群友的 Arcaea Bot 也是用 C# 开发的,秉持着不知道哪里来的“折腾就是生命的原则”,我彻底转向 .NET/C#,开始了 +lancelot 的重写工作。 -重写过程中,有两个 Bot 项目对我的帮助、启发十分巨大,分别是 [AimuBot](https://github.com/InariAimu/AimuBot) 和 RinBot(现已更名为 [SuzuBot](https://github.com/ProjektSuzu/SuzuBot))。当时 .NET 这边并没有好用的指令框架,除了底层用于和 QQ 通信的部分 [Konata.Core](https://github.com/KonataDev/Konata.Core) 外,所有轮子都得自己造。在深度参考了他们的项目结构、思路后,我完成了新 Bot 的最初版本,以一位非常重要的人的名字为灵感,起名为——暮雪酱。 +重写过程中,有两个 Bot 项目对我的帮助、启发十分巨大,分别是 [AimuBot](https://github.com/InariAimu/AimuBot) 和 +RinBot(现已更名为 [SuzuBot](https://github.com/ProjektSuzu/SuzuBot))。当时 .NET 这边并没有好用的指令框架,除了底层用于和 +QQ 通信的部分 [Konata.Core](https://github.com/KonataDev/Konata.Core) 外,所有轮子都得自己造。在深度参考了他们的项目结构、思路后,我完成了新 +Bot 的最初版本,以一位非常重要的人的名字为灵感,起名为——暮雪酱。 -这个时期的暮雪酱远远不够成熟,所以当时把她作为一个可选项,与 lancelot 同步使用。为了区分开来,暮雪酱的指令前缀采用了 `#`,而不是 lancelot 的 `/`。 +这个时期的暮雪酱远远不够成熟,所以当时把她作为一个可选项,与 lancelot 同步使用。为了区分开来,暮雪酱的指令前缀采用了 `#`,而不是 +lancelot 的 `/`。 暮雪酱最早以复刻一个 lancelot 的子集为目标,因此大部分的指令操作、图查都和 lancelot 保持一致,仅有单曲查询的图查经过了重新设计,也就是大家最后看到的样子。 @@ -82,7 +103,8 @@ arc 方面也加入了用于根据分数计算单曲 ptt 的 `/a ptt`,和找 ## 2022 年 8 月 -这个时候 lancelot 已经没有处于积极开发中了,转为维护阶段。而暮雪酱迎来了第一个独占的功能——猜曲绘(`/a guess`)。同时,暮雪酱也支持了官方 ArcaeaLimitedAPI。到了这个阶段,lancelot 的大部分功能都已经被暮雪酱重新实现,暮雪酱也成为了群内主要使用的 Bot。 +这个时候 lancelot 已经没有处于积极开发中了,转为维护阶段。而暮雪酱迎来了第一个独占的功能——猜曲绘(`/a guess`)。同时,暮雪酱也支持了官方 +ArcaeaLimitedAPI。到了这个阶段,lancelot 的大部分功能都已经被暮雪酱重新实现,暮雪酱也成为了群内主要使用的 Bot。 ## 2022 年 9 - 10 月 @@ -92,28 +114,39 @@ arc 方面也加入了用于根据分数计算单曲 ptt 的 `/a ptt`,和找 办法当然是有的,那就是自己用 C# 重新造一个 koishi 出来!( -我还真就这么干了,开启了一个叫 [Flandre](https://github.com/FlandreDevs/Flandre/) 的新项目,旨在成为一个 .NET 下的跨平台、兼具易用与实用的 Bot 开发框架。经过一个月的努力,成功地把它造了出来,并开源在 GitHub 上。 +我还真就这么干了,开启了一个叫 [Flandre](https://github.com/FlandreDevs/Flandre/) 的新项目,旨在成为一个 .NET +下的跨平台、兼具易用与实用的 Bot 开发框架。经过一个月的努力,成功地把它造了出来,并开源在 GitHub 上。 -十月份发生了一件很糟心的事情:在一次给 lancelot 修复 bug 的时候,我更新了一下 koishi 的版本。不更新还好,这一更新就把 Bot 给整炸了——koishi 在小版本里加了不向后兼容的修改,导致 lancelot 出现了很多奇奇怪怪的问题。而我这时候已经脱离 Node 技术栈有一段时间了,一下又找不到 koishi 那边到底做了什么改动,实在有点力不从心。无可奈何之下,只能发布公告,宣布 lancelot 正式停止服务。QQ 群这边有暮雪还好说,频道没了 lancelot 就没 Bot 用了。没办法,只能咬咬牙爆肝 Flandre,把暮雪酱迁移到新框架上,这样就达成了跨平台的目的,群和频道共用同一套服务了。 +十月份发生了一件很糟心的事情:在一次给 lancelot 修复 bug 的时候,我更新了一下 koishi 的版本。不更新还好,这一更新就把 Bot +给整炸了——koishi 在小版本里加了不向后兼容的修改,导致 lancelot 出现了很多奇奇怪怪的问题。而我这时候已经脱离 Node +技术栈有一段时间了,一下又找不到 koishi 那边到底做了什么改动,实在有点力不从心。无可奈何之下,只能发布公告,宣布 lancelot +正式停止服务。QQ 群这边有暮雪还好说,频道没了 lancelot 就没 Bot 用了。没办法,只能咬咬牙爆肝 +Flandre,把暮雪酱迁移到新框架上,这样就达成了跨平台的目的,群和频道共用同一套服务了。 好在同是 C#,不用经过跨语言的重写,花了几天的时间就把基本功能迁移完毕了。同时加了设置偏好的新功能(`/a preference`)。 ## 2022 年 11 月 -暮雪 v2 已经正式在 QQ 频道发布了,情况也逐渐趋于稳定。这时候引入了潜力值曲线查询功能 `/a user`,受到很多人的喜爱。数据爬取自 [esterTion 的网页查分器](http://redive.estertion.win/arcaea/probe/)。 +暮雪 v2 已经正式在 QQ 频道发布了,情况也逐渐趋于稳定。这时候引入了潜力值曲线查询功能 `/a user` +,受到很多人的喜爱。数据爬取自 [esterTion 的网页查分器](http://redive.estertion.win/arcaea/probe/)。 ## 2022 年 12 月 已经到年末了。为了征集改进暮雪的建议,也为了了解用户的满意程度,我撰写了一份年度调查问卷,发放给大家。问卷结果里大部分都是支持与鼓励,当时看了真的非常、非常感动。 -暮雪 v2 支持了官方 API。单曲图查的背景不再是单调的同一张,而是会根据曲绘发生变化。添加了 [Arcanya](https://github.com/Arcaea-Infinity/Arcanya) 版本的 AI 猫猫曲绘,供用户自行选择切换。 - +暮雪 v2 支持了官方 +API。单曲图查的背景不再是单调的同一张,而是会根据曲绘发生变化。添加了 [Arcanya](https://github.com/Arcaea-Infinity/Arcanya) +版本的 AI 猫猫曲绘,供用户自行选择切换。 ## 2023 年 1 月 -新的一年了!这个时候已经观察到用户人数仍在不断增长,便将目光放长远了一些,开始计划开放自行部署暮雪酱。但是暮雪酱 v2 仍是“单机版”,数据都保存在本地,第三方部署的话无法获取到已有用户的绑定数据,需要重新积累,无疑是一个很大的麻烦。想来想去,就有了暮雪酱 v3 的计划:独立出来一个中心服务器,承担数据获取、保存的任务;客户端负责处理由服务端下放的数据、图查生成等。这样一来,客户端单独部署就方便了很多。 +新的一年了!这个时候已经观察到用户人数仍在不断增长,便将目光放长远了一些,开始计划开放自行部署暮雪酱。但是暮雪酱 v2 +仍是“单机版”,数据都保存在本地,第三方部署的话无法获取到已有用户的绑定数据,需要重新积累,无疑是一个很大的麻烦。想来想去,就有了暮雪酱 +v3 的计划:独立出来一个中心服务器,承担数据获取、保存的任务;客户端负责处理由服务端下放的数据、图查生成等。这样一来,客户端单独部署就方便了很多。 -有想法就开始行动了,半个月的时间大概过了一下 ASP.NET Core,月底就正式宣布了暮雪 v3 大更新。同时把暮雪[开源出来](https://github.com/bsdayo/YukiChan),也开通了哔哩哔哩官号 [@暮雪酱_Official](https://space.bilibili.com/13662066)。 +有想法就开始行动了,半个月的时间大概过了一下 ASP.NET Core,月底就正式宣布了暮雪 v3 +大更新。同时把暮雪[开源出来](https://github.com/bsdayo/YukiChan) +,也开通了哔哩哔哩官号 [@暮雪酱_Official](https://space.bilibili.com/13662066)。 暮雪 v3 架构图: ![暮雪 v3 架构图](yukichan-v3-architecture.jpg) @@ -126,7 +159,8 @@ lowiro 官宣了新功能 Arcaea Online,是一项官方提供的查分服务 ## 2023 年 4 月 -lowiro 正式推出了 Arcaea Online **订阅**,售价 200 源点 / 月。同时关闭了 ArcaeaLimitedAPI,并对 ArcaeaUnlimitedAPI 实行技术封锁,大量封禁后者的查分用账号。同时在注册环节上加了人机验证,让 AUA 的批量注册功能也瘫痪掉了。 +lowiro 正式推出了 Arcaea Online **订阅**,售价 200 源点 / 月。同时关闭了 ArcaeaLimitedAPI,并对 ArcaeaUnlimitedAPI +实行技术封锁,大量封禁后者的查分用账号。同时在注册环节上加了人机验证,让 AUA 的批量注册功能也瘫痪掉了。 种种操作导致 ArcaeaUnlimitedAPI 无法坚持下去,宣布无限期停止服务。这也意味着原本基于 AUA 的 Bot 查分功能全部被迫停止服务,且基本没有再恢复的可能。 @@ -140,7 +174,8 @@ lowiro 正式推出了 Arcaea Online **订阅**,售价 200 源点 / 月。同 一年多了,收获了很多很多知识,也认识了很多真心的好朋友。开发 Bot,和群友们水群,和 616 各种对线,回想起一路上的经历都很快乐。 -虽说是 Arcaea 模块的前世今生,可暮雪原本就是为 Arcaea 查分而设计的 Bot,失去了查分功能,存在的意义也不大了,也许就全线停止服务了吧。暮雪也已经在 GitHub 上全面开源。 +虽说是 Arcaea 模块的前世今生,可暮雪原本就是为 Arcaea 查分而设计的 Bot,失去了查分功能,存在的意义也不大了,也许就全线停止服务了吧。暮雪也已经在 +GitHub 上全面开源。 [暮雪酱主仓库](https://github.com/bsdayo/YukiChan) [暮雪酱服务端仓库](https://github.com/bsdayo/YukiChan.Server) 这一切值得吗?我认为是值得的。只要我们的服务能为用户带来帮助,产生了价值,那它就是值得的。 @@ -152,19 +187,19 @@ lowiro 正式推出了 Arcaea Online **订阅**,售价 200 源点 / 月。同 ## 致谢 - **[Arcaea-Infinity](https://github.com/Arcaea-Infinity)** - Arcaea 开源界的中坚力量。梦开始的地方,也是一个真正能找到志同道合之人的地方。 + Arcaea 开源界的中坚力量。梦开始的地方,也是一个真正能找到志同道合之人的地方。 - **[Awbugl](https://github.com/Awbugl)** - Andrea、ArcaeaUnlimitedAPI 项目维护方。最早支持、引导我的 Bot 开发的人之一。 + Andrea、ArcaeaUnlimitedAPI 项目维护方。最早支持、引导我的 Bot 开发的人之一。 - **[TheSnowfield](https://github.com/TheSnowfield)** - 在我学习 .NET 的早期,以及在框架设计方面提供了大量的项目参考与指点。 + 在我学习 .NET 的早期,以及在框架设计方面提供了大量的项目参考与指点。 - **[AkulaKirov](https://github.com/AkulaKirov)** - Bot 项目参考,暮雪酱的设计思路来源。学习 .NET 的过程中给予了许多帮助。 + Bot 项目参考,暮雪酱的设计思路来源。学习 .NET 的过程中给予了许多帮助。 - **[InariAimu](https://github.com/InariAimu)** - Bot 项目参考,暮雪酱的设计思路来源。Arcanya 曲绘提供方。 + Bot 项目参考,暮雪酱的设计思路来源。Arcanya 曲绘提供方。 - ... diff --git a/content/posts/raspberrypi-4b-arch/index.md b/content/posts/raspberrypi-4b-arch/index.md index 8d40ff0..0a359aa 100644 --- a/content/posts/raspberrypi-4b-arch/index.md +++ b/content/posts/raspberrypi-4b-arch/index.md @@ -2,7 +2,6 @@ title: 在树莓派 4B 上安装 Arch Linux ARM create: 2022-10-02T10:51:14+08:00 -categories: tech tags: - raspberrypi - archlinux @@ -11,13 +10,15 @@ tags: ## 前言 -自从在虚拟机、[WSL2](../wsl2-arch/) 上相继安装过 Arch Linux 之后,我将目光投向了家里仅剩的一个还运行着 Ubuntu 的 Linux 设备 —— 树莓派 4B。 +自从在虚拟机、[WSL2](../wsl2-arch/index.md) 上相继安装过 Arch Linux 之后,我将目光投向了家里仅剩的一个还运行着 Ubuntu 的 Linux +设备 —— 树莓派 4B。 话不多说,直接开搞( ## 准备 -首先由于启动方式的不同,Arch Linux ARM for Raspberry Pi 并不能使用我们一般用的 RPi Imager 烧录。要安装 Arch,首先得准备一台已经装好了的 Linux 设备。可以使用虚拟机,这里我直接用树莓派的备用系统(一张烧好了官方系统的 SD 卡,作为后备还原系统)安装。 +首先由于启动方式的不同,Arch Linux ARM for Raspberry Pi 并不能使用我们一般用的 RPi Imager 烧录。要安装 Arch,首先得准备一台已经装好了的 +Linux 设备。可以使用虚拟机,这里我直接用树莓派的备用系统(一张烧好了官方系统的 SD 卡,作为后备还原系统)安装。 随便 pick 一张适合做系统的 SD 卡插入电脑,开始我们的安装。 @@ -59,7 +60,8 @@ $ sync ``` ::: note 下载太慢... -如果下载太慢,也可以使用国内源下载,将 url 换为 [https://mirrors.tuna.tsinghua.edu.cn/archlinuxarm/os/ArchLinuxARM-rpi-aarch64-latest.tar.gz](https://mirrors.tuna.tsinghua.edu.cn/archlinuxarm/os/ArchLinuxARM-rpi-aarch64-latest.tar.gz) +如果下载太慢,也可以使用国内源下载,将 url +换为 [https://mirrors.tuna.tsinghua.edu.cn/archlinuxarm/os/ArchLinuxARM-rpi-aarch64-latest.tar.gz](https://mirrors.tuna.tsinghua.edu.cn/archlinuxarm/os/ArchLinuxARM-rpi-aarch64-latest.tar.gz) ::: 将启动文件复制到 `boot` 目录下: @@ -80,7 +82,8 @@ $ sed -i 's/mmcblk0/mmcblk1/g' root/etc/fstab $ umount boot root ``` -接下来把 SD 卡插入树莓派,连上网线,在路由器查看树莓派的 IP 地址,然后使用 SSH 链接。默认用户名称和密码都为 `alarm`。登录上后切换到 `root` 用户(默认密码为 `root`),编辑 `/etc/pacman.d/mirrorlist` 换源: +接下来把 SD 卡插入树莓派,连上网线,在路由器查看树莓派的 IP 地址,然后使用 SSH 链接。默认用户名称和密码都为 `alarm` +。登录上后切换到 `root` 用户(默认密码为 `root`),编辑 `/etc/pacman.d/mirrorlist` 换源: ``` $ su root diff --git a/content/posts/raspberrypi-ftp-server/index.md b/content/posts/raspberrypi-ftp-server/index.md index 24809da..7c8db2a 100644 --- a/content/posts/raspberrypi-ftp-server/index.md +++ b/content/posts/raspberrypi-ftp-server/index.md @@ -2,7 +2,6 @@ title: 树莓派搭建 FTP 服务器实现局域网文件共享 create: 2022-09-14T20:34:14+08:00 -categories: tech tags: - raspberrypi @@ -11,7 +10,10 @@ cover: /covers/raspberrypi-ftp-server.jpg ## 起因 -经常需要在电脑和手机之间互传文件,想了不少办法,最早是使用 QQ 等聊天工具进行文件传输,效率十分低下;后来找到了 [SnapDrop](https://snapdrop.net/) 这款工具,可以以类似面对面快传的方式在局域网内传输文件,提高了些许效率,但还是感觉到些许别扭。于是开始找寻一种更为优雅的文件传输方式,想到手里有一个半吃灰的树莓派,就开始着手搭建自己的 FTP 文件服务器。 +经常需要在电脑和手机之间互传文件,想了不少办法,最早是使用 QQ +等聊天工具进行文件传输,效率十分低下;后来找到了 [SnapDrop](https://snapdrop.net/) +这款工具,可以以类似面对面快传的方式在局域网内传输文件,提高了些许效率,但还是感觉到些许别扭。于是开始找寻一种更为优雅的文件传输方式,想到手里有一个半吃灰的树莓派,就开始着手搭建自己的 +FTP 文件服务器。 ::: quote "什么是 FTP" 文件传输协议(File Transfer Protocol,缩写 **FTP**)是一个用于在计算机网络上在客户端和服务器之间进行文件传输的应用层协议。 @@ -44,7 +46,9 @@ $ sudo passwd ftp FTP 服务开启后的文件存储位置就是 `frp` 用户的家目录,位于 `/srv/ftp` ::: -密码更改完成后,选用喜欢的编辑器打开 FTP 服务器配置文件 `/etc/vsftpd.conf`,按照需求取消注释(去掉行首的 `#` 号)或修改相应选项(如果找不到被注释的选项在哪里也可以直接在文件末尾添加,格式为 `选项=值`)。这里列出几个常用的,`YES/NO` 分别对应是/否: +密码更改完成后,选用喜欢的编辑器打开 FTP 服务器配置文件 `/etc/vsftpd.conf`,按照需求取消注释(去掉行首的 `#` +号)或修改相应选项(如果找不到被注释的选项在哪里也可以直接在文件末尾添加,格式为 `选项=值`)。这里列出几个常用的,`YES/NO` +分别对应是/否: **通用** @@ -61,7 +65,8 @@ FTP 服务开启后的文件存储位置就是 `frp` 用户的家目录,位于 **[Chroot](https://zh.wikipedia.org/wiki/Chroot) 相关** **`chroot_local_user`**:是否将连接 FTP 的本地用户的根目录限制为其家目录(`/home/`) -**`chroot_list_enable`**:启用 chroot 白名单,只有在其中的用户**才会**被 chroot(如果把 `chroot_local_user` 设置为 `YES` 将变为黑名单,只有在其中的用户**不会**被 chroot) +**`chroot_list_enable`**:启用 chroot 白名单,只有在其中的用户**才会**被 chroot(如果把 `chroot_local_user` 设置为 `YES` +将变为黑名单,只有在其中的用户**不会**被 chroot) **`chroot_list_file`**:chroot 黑/白名单的文件路径,文件中填写用户名,一行一个 注:如果只设置 `chroot_local_user` 为 `YES` 而不设置黑/白名单,会对所有连接 FTP 的本地用户进行 chroot。 @@ -103,16 +108,24 @@ ftp> ::: ## 体验 -搭建完成后,我分别使用移动端的 MT 管理器、和 Windows 自带的网络位置进行了测试。在 MT 管理器下连接后操作十分流畅,上传/下载的速度也很快。而 Windows 自带的网络位置则十分难用,打开文件只打开了一个空的 Edge,复制文件十分缓慢,新建文件夹需要延迟很久,删除文件也经常删不掉。~~fkms~~ -但尽管如此,通过 FTP 传输文件仍然带来了一种全新的体验:手机上将文件移进”文件夹“,转眼就能在电脑上移出来使用,做到了几近原生、无缝的传输体验。相信如果解决了 Windows 端的工具问题,效率会大大提升。 +搭建完成后,我分别使用移动端的 MT 管理器、和 Windows 自带的网络位置进行了测试。在 MT 管理器下连接后操作十分流畅,上传/下载的速度也很快。而 +Windows 自带的网络位置则十分难用,打开文件只打开了一个空的 Edge,复制文件十分缓慢,新建文件夹需要延迟很久,删除文件也经常删不掉。 +~~fkms~~ + +但尽管如此,通过 FTP 传输文件仍然带来了一种全新的体验:手机上将文件移进”文件夹“,转眼就能在电脑上移出来使用,做到了几近原生、无缝的传输体验。相信如果解决了 +Windows 端的工具问题,效率会大大提升。 ## 问题解决 + ### 无法登录进 FTP Shell + ::: quote Ubuntu 官网的说明 -To allow users with a shell of /usr/sbin/nologin access to FTP, but have no shell access, edit /etc/shells adding the nologin shell. +To allow users with a shell of /usr/sbin/nologin access to FTP, but have no shell access, edit /etc/shells adding the +nologin shell. -This is necessary because, by default vsftpd uses PAM for authentication, and the /etc/pam.d/vsftpd configuration file contains: +This is necessary because, by default vsftpd uses PAM for authentication, and the /etc/pam.d/vsftpd configuration file +contains: ``` auth required pam_shells.so @@ -126,13 +139,16 @@ The shells PAM module restricts access to shells listed in the /etc/shells file. 解决办法:编辑 `/etc/shells`,在文件末尾添加一行 `/usr/sbin/nologin` ### 550 create directory operation failed + 如果设置了 `write_enable` 后仍不能创建文件夹,需要确保根目录具有可执行权限。执行以下命令: + ```bash $ chmod 777 -R /srv/ftp ``` ### vsftpd: refusing to run with writable root inside chroot -如果设置了 chroot 后无法新建文件夹/上传文件,并提示以上信息,是因为 `2.3.5` 版本后 `vsftpd` 加强了安全检查,用户的主目录不能再有写权限,如果检查到就会报错。可以在配置文件中添加 `allow_writeable_chroot=YES` 来解决。 +如果设置了 chroot 后无法新建文件夹/上传文件,并提示以上信息,是因为 `2.3.5` 版本后 `vsftpd` +加强了安全检查,用户的主目录不能再有写权限,如果检查到就会报错。可以在配置文件中添加 `allow_writeable_chroot=YES` 来解决。 参考自[这里](https://blog.csdn.net/bluishglc/article/details/42399439) diff --git a/content/posts/sign-git-commit-with-gpg/index.md b/content/posts/sign-git-commit-with-gpg/index.md index c612159..64039df 100644 --- a/content/posts/sign-git-commit-with-gpg/index.md +++ b/content/posts/sign-git-commit-with-gpg/index.md @@ -2,7 +2,6 @@ title: 使用 GPG 签名你的 Git Commit create: 2022-10-01T15:52:24+08:00 -categories: tech tags: - git - github @@ -13,15 +12,22 @@ cover: /covers/sign-git-commit-with-gpg.jpg ## 前言 -在 GitHub 上浏览许多大仓库时,常常能见到在 commit 信息旁边有一个绿色的标识,里面写着 Verified。这种一看就令人安心的标志,自己也想搞一个()上网查了查资料,发现只要对提交到 GitHub 的 commit 使用 GPG 进行签名即可,步骤也不麻烦,遂进行一个记录。 +在 GitHub 上浏览许多大仓库时,常常能见到在 commit 信息旁边有一个绿色的标识,里面写着 +Verified。这种一看就令人安心的标志,自己也想搞一个()上网查了查资料,发现只要对提交到 GitHub 的 commit 使用 GPG +进行签名即可,步骤也不麻烦,遂进行一个记录。 ## 什么是 GPG ::: quote 摘自 [GPG 官网](https://gnupg.org/) -GnuPG is a complete and free implementation of the OpenPGP standard as defined by RFC4880 (also known as PGP). GnuPG allows you to encrypt and sign your data and communications; it features a versatile key management system, along with access modules for all kinds of public key directories. GnuPG, also known as GPG, is a command line tool with features for easy integration with other applications. A wealth of frontend applications and libraries are available. GnuPG also provides support for S/MIME and Secure Shell (ssh). +GnuPG is a complete and free implementation of the OpenPGP standard as defined by RFC4880 (also known as PGP). GnuPG +allows you to encrypt and sign your data and communications; it features a versatile key management system, along with +access modules for all kinds of public key directories. GnuPG, also known as GPG, is a command line tool with features +for easy integration with other applications. A wealth of frontend applications and libraries are available. GnuPG also +provides support for S/MIME and Secure Shell (ssh). ::: -简单来说,GPG (GNU Privacy Guard) 是由 GNU 组织提供的一款加密工具,并且是目前世界上最好用的加密工具之一。GPG 的用途十分广泛,而我们今天只是用它进行 git commit 的签名认证。 +简单来说,GPG (GNU Privacy Guard) 是由 GNU 组织提供的一款加密工具,并且是目前世界上最好用的加密工具之一。GPG +的用途十分广泛,而我们今天只是用它进行 git commit 的签名认证。 ## 生成 GPG Key @@ -92,7 +98,8 @@ $ git commit -m -S "test gpg key" 这里提交时的 `-S` 选项,表示我们使用 GPG 签名这次提交。 -不同于以往直接提交成功,git 弹出一个窗口要求你输入密码,也就是我们设置的密钥密码。正确输入后便会完成提交,也就完成了我们第一次由 GPG 验证过的 commit。 +不同于以往直接提交成功,git 弹出一个窗口要求你输入密码,也就是我们设置的密钥密码。正确输入后便会完成提交,也就完成了我们第一次由 +GPG 验证过的 commit。 ![输入密码](enter-passphrase.png) @@ -120,17 +127,20 @@ $ git commit -m -S "test gpg key" ![往下翻到这里](add-gpg-key-on-github.png) -点击 New GPG key,输入想要的名称,然后把上面获取的公钥完整地(包括 `-----BEGIN PGP PUBLIC KEY BLOCK-----` 和 `-----END PGP PUBLIC KEY BLOCK-----`)复制到下面的文本框内,然后点击 Add GPG key 按钮完成。 +点击 New GPG key,输入想要的名称,然后把上面获取的公钥完整地(包括 `-----BEGIN PGP PUBLIC KEY BLOCK-----` +和 `-----END PGP PUBLIC KEY BLOCK-----`)复制到下面的文本框内,然后点击 Add GPG key 按钮完成。 ![输入页面](edit-gpg-key.png) -这时我们就成功地让 GitHub “认识” 了我们的密钥了。本地执行一个提交并 push 到 GitHub 上,你会看到提交信息旁边有一个闪亮的 Verified 标识。 +这时我们就成功地让 GitHub “认识” 了我们的密钥了。本地执行一个提交并 push 到 GitHub 上,你会看到提交信息旁边有一个闪亮的 +Verified 标识。 ![Verified!](github-verified.png) ## 附加:信任 GitHub 的 GPG 公钥 -虽然我们本地的 commit 已经是签名过的了,但不在本地的,例如直接在 GitHub 网页端执行的提交,则是由 GitHub 代为签名,这导致我们无法验证这些签名的真实性。 +虽然我们本地的 commit 已经是签名过的了,但不在本地的,例如直接在 GitHub 网页端执行的提交,则是由 GitHub +代为签名,这导致我们无法验证这些签名的真实性。 信任 GitHub 的公钥即可解决这个问题: diff --git a/content/posts/skiasharp-type-initializer-exception/index.md b/content/posts/skiasharp-type-initializer-exception/index.md index e08cc65..8eaf2d9 100644 --- a/content/posts/skiasharp-type-initializer-exception/index.md +++ b/content/posts/skiasharp-type-initializer-exception/index.md @@ -2,7 +2,6 @@ title: SkiaSharp 的 Type Initializer Exception 解决记录 create: 2022-10-02T14:46:48+08:00 -categories: tech tags: - skiasharp - csharp @@ -16,7 +15,9 @@ TypeInitializationException: The type initializer for 'SkiaSharp.SKImageInfo' th ... ``` -查询一番后,大多都是说是 SkiaSharp 的版本问题,升级就好,但是我已经在使用最新版本了)最后在[这里](https://github.com/mono/SkiaSharp/issues/964#issuecomment-541399218)找到了解决方案。 +查询一番后,大多都是说是 SkiaSharp +的版本问题,升级就好,但是我已经在使用最新版本了)最后在[这里](https://github.com/mono/SkiaSharp/issues/964#issuecomment-541399218) +找到了解决方案。 **报错的原因是:系统缺少了 `libfontconfig`,导致字体相关操作无法完成。** diff --git a/content/posts/smapi-install/index.md b/content/posts/smapi-install/index.md index ca0f9a8..2ca3f11 100644 --- a/content/posts/smapi-install/index.md +++ b/content/posts/smapi-install/index.md @@ -1,19 +1,20 @@ --- title: 星露谷模组加载器 —— SMAPI 的安装 create: 2022-09-13T19:34:50+08:00 - -categories: tech --- 一直听说[星露谷](https://store.steampowered.com/app/413150/Stardew_Valley/?l=schinese)对于 Mod 的支持十分完善,这次打算自己尝试一番。 ::: warning 目标平台 -本文仅针对 Windows 平台,其他平台方法大同小异,可以直接参照[官方 Wiki](https://zh.stardewvalleywiki.com/%E6%A8%A1%E7%BB%84:%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/%E5%85%A5%E9%97%A8)。 +本文仅针对 Windows +平台,其他平台方法大同小异,可以直接参照[官方 Wiki](https://zh.stardewvalleywiki.com/%E6%A8%A1%E7%BB%84:%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97/%E5%85%A5%E9%97%A8)。 ::: -首先到 [SMAPI 官网](https://smapi.io/)下载最新的安装包,可以选择从 NexusMods (N 网) 下载,也可以直接下载 (Direct download)。截至本文,SMAPI 的最新版本为 `3.16.2`。 +首先到 [SMAPI 官网](https://smapi.io/)下载最新的安装包,可以选择从 NexusMods (N 网) 下载,也可以直接下载 (Direct download) +。截至本文,SMAPI 的最新版本为 `3.16.2`。 -把下载下来的 `SMAPI-<版本>-installer.zip` 解压到任意位置,打开里面的 `install on Windows.bat`,安装脚本会自动检测游戏的安装位置。如果没有找到会提示以下信息: +把下载下来的 `SMAPI-<版本>-installer.zip` 解压到任意位置,打开里面的 `install on Windows.bat` +,安装脚本会自动检测游戏的安装位置。如果没有找到会提示以下信息: ``` Oops, couldn't find the game automatically. @@ -21,7 +22,8 @@ Oops, couldn't find the game automatically. Type the file path to the game directory (the one containing 'Stardew Valley.dll'), then press enter. ``` -出现这种情况,首先找到星露谷的安装目录,若为 Steam 安装可以直接右键库里的星露谷,选择管理 - 浏览本地文件,然后复制打开的文件夹路径(例如我的是 `D:\Steam\steamapps\common\Stardew Valley`),再粘贴进终端内并回车。 +出现这种情况,首先找到星露谷的安装目录,若为 Steam 安装可以直接右键库里的星露谷,选择管理 - +浏览本地文件,然后复制打开的文件夹路径(例如我的是 `D:\Steam\steamapps\common\Stardew Valley`),再粘贴进终端内并回车。 ``` What do you want to do? @@ -31,6 +33,7 @@ What do you want to do? Type 1 or 2, then press enter. ``` + 输入 1 并回车继续安装。日后如果想要卸载 SMAPI,可以再次运行此脚本并选择 2 卸载。 如果出现以下信息,则为安装成功: @@ -48,6 +51,7 @@ If you don't use Steam, launch StardewModdingAPI.exe in your game folder to play 在配置Steam启动项之前,需要确保您的游戏路径里没有中文,否则将设置失败。 ::: -首先复制终端窗口中给出的启动指令(如上文,为 `"D:\Steam\steamapps\common\Stardew Valley\StardewModdingAPI.exe" %command%`),Steam 中右键星露谷打开属性,在“通用”选项卡中把复制的指令粘贴进“启动选项”一栏,保存即可。 +首先复制终端窗口中给出的启动指令(如上文,为 `"D:\Steam\steamapps\common\Stardew Valley\StardewModdingAPI.exe" %command%` +),Steam 中右键星露谷打开属性,在“通用”选项卡中把复制的指令粘贴进“启动选项”一栏,保存即可。 至此已经完成了 SMAPI 的安装,至于添加 Mod 下次再讲 ~~(咕咕咕((~~ diff --git a/content/posts/testground/index.md b/content/posts/testground/index.md index ada477a..efa2a3e 100644 --- a/content/posts/testground/index.md +++ b/content/posts/testground/index.md @@ -104,4 +104,5 @@ for (var i = 0; i < 100; i++) Console.WriteLine($"Now is {i}"); } ``` + ::: \ No newline at end of file diff --git a/content/posts/ubuntu-desktop-mac-style/index.md b/content/posts/ubuntu-desktop-mac-style/index.md index 6a5e7e3..31a1f36 100644 --- a/content/posts/ubuntu-desktop-mac-style/index.md +++ b/content/posts/ubuntu-desktop-mac-style/index.md @@ -2,7 +2,6 @@ title: Mac 风格 Ubuntu Desktop 美化教程 create: 2021-07-27T23:25:10+08:00 -categories: tech tags: - ubuntu - linux @@ -44,11 +43,13 @@ $ sudo apt update $ sudo apt install gnome-tweaks chrome-gnome-shell -y ``` -随后打开 [https://extensions.gnome.org/](https://extensions.gnome.org/) ,点击 `Click here to install browser extension` 安装浏览器插件 +随后打开 [https://extensions.gnome.org/](https://extensions.gnome.org/) ,点击 `Click here to install browser extension` +安装浏览器插件 ![安装浏览器插件](install-browser-extension.png) -随后搜索 [User Themes](https://extensions.gnome.org/extension/19/user-themes/) 插件安装,点击页面右上角的开关,把`OFF`改成`ON`就可以了,如果弹出确认窗口就点确认 +随后搜索 [User Themes](https://extensions.gnome.org/extension/19/user-themes/) 插件安装,点击页面右上角的开关,把`OFF` +改成`ON`就可以了,如果弹出确认窗口就点确认 ![安装插件](user-theme-extension.png) @@ -56,7 +57,8 @@ $ sudo apt install gnome-tweaks chrome-gnome-shell -y Ubuntu Desktop 自带的 Dock 栏并不是很好用,可定制性也不强,这里使用 `Dash to Dock` 插件增强。 -向上面安装 `User Theme` 插件一样,在 [https://extensions.gnome.org/](https://extensions.gnome.org/) 中搜索 [Dash to Dock](https://extensions.gnome.org/extension/307/dash-to-dock/) 并安装。 +向上面安装 `User Theme` 插件一样,在 [https://extensions.gnome.org/](https://extensions.gnome.org/) +中搜索 [Dash to Dock](https://extensions.gnome.org/extension/307/dash-to-dock/) 并安装。 然后去 Gnome Tweaks 里启用: @@ -243,7 +245,8 @@ $ ./install.sh ### 应用主题 -有时主题不会自动应用至系统,这时需要手动打开一开始安装的美化管理工具。应用列表里找到 `优化` 应用或者终端输入 `gnome-tweaks` +有时主题不会自动应用至系统,这时需要手动打开一开始安装的美化管理工具。应用列表里找到 `优化` +应用或者终端输入 `gnome-tweaks` ![Gnome Tweaks 工具](gnome-tweaks.png) diff --git a/content/posts/use-vuetify-in-vitepress/index.md b/content/posts/use-vuetify-in-vitepress/index.md index ee412b2..5bf1eaa 100644 --- a/content/posts/use-vuetify-in-vitepress/index.md +++ b/content/posts/use-vuetify-in-vitepress/index.md @@ -14,7 +14,8 @@ $ pnpm add -D vitepress ``` ::: note 关于包管理器 -这里我使用了 pnpm 作为项目的包管理器。你可以根据自己的习惯替换成 npm 或 yarn,具体可参见[官方文档](https://vitepress.dev/guide/getting-started)。 +这里我使用了 pnpm 作为项目的包管理器。你可以根据自己的习惯替换成 npm 或 +yarn,具体可参见[官方文档](https://vitepress.dev/guide/getting-started)。 ::: 使用 [Setup Wizard](https://vitepress.dev/guide/getting-started#setup-wizard) 初始化项目: @@ -77,7 +78,8 @@ export default { } ``` -其中 `enhanceApp` 函数就是我们的目标,参数解构出来的 `app`、`router` 分别就是 VitePress 使用的 Vue、Vue Router 实例,我们可以在上面加入自己的修改。 +其中 `enhanceApp` 函数就是我们的目标,参数解构出来的 `app`、`router` 分别就是 VitePress 使用的 Vue、Vue Router +实例,我们可以在上面加入自己的修改。 ## 将 Vuetify 安装到项目中 @@ -87,7 +89,8 @@ export default { $ pnpm add -D vuetify @mdi/font ``` -在 `.vitepress/theme/index.ts` 旁边新建一个 `vuetify.ts`,用于存放 Vuetify 相关的配置。这里我直接从 Vuetify 脚手架里扒出来一个默认的配置文件,如下所示: +在 `.vitepress/theme/index.ts` 旁边新建一个 `vuetify.ts`,用于存放 Vuetify 相关的配置。这里我直接从 Vuetify +脚手架里扒出来一个默认的配置文件,如下所示: ```typescript import { createVuetify } from 'vuetify' @@ -189,7 +192,8 @@ TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".css" for C:\Use ¿ -参考[这个 Issue](https://github.com/vuetifyjs/vuetify/issues/15700),这是由于在 SSR 构建中,需要针对 Vuetify 进行特殊配置,才能使其正常工作。 +参考[这个 Issue](https://github.com/vuetifyjs/vuetify/issues/15700),这是由于在 SSR 构建中,需要针对 Vuetify +进行特殊配置,才能使其正常工作。 打开 `.vitepress/config.ts`,在底下加入这一项: @@ -222,7 +226,8 @@ Hydration completed but contains mismatches. 这个问题其实是指,客户端渲染出来的 HTML 结构和服务器发送的不匹配,通常在一些不能使用 SSR 渲染的动态组件上发生。 -没加 Vuetify 啥事没有,加了就出问题,那肯定就出在 Vuetify 上。[查阅文档](https://vuetifyjs.com/en/getting-started/installation/#ssr)可以发现,在 SSR 构建中,需要给 Vuetify 配置这样一句: +没加 Vuetify 啥事没有,加了就出问题,那肯定就出在 Vuetify +上。[查阅文档](https://vuetifyjs.com/en/getting-started/installation/#ssr)可以发现,在 SSR 构建中,需要给 Vuetify 配置这样一句: ```typescript export default createVuetify({ diff --git a/content/posts/vscode-leetcode-with-csharp/index.md b/content/posts/vscode-leetcode-with-csharp/index.md index 6cfefc7..b7fc6c8 100644 --- a/content/posts/vscode-leetcode-with-csharp/index.md +++ b/content/posts/vscode-leetcode-with-csharp/index.md @@ -2,7 +2,6 @@ title: 使用 VSCode 打造 LeetCode 的 C# 刷题环境 create: 2022-11-20T20:51:55+08:00 -categories: tech tags: - vscode - leetcode @@ -13,23 +12,32 @@ cover: /covers/vscode-leetcode-with-csharp.jpg 最近终于接触了大名鼎鼎的 LeetCode 刷题平台,开始苦痛之路(x -LeetCode 自带的网页编辑器体验并不好,代码补全、高亮等都不是很舒服,于是打算使用本地开发。尝试在 Rider 中找到了 IntelliJ 平台通用的 LeetCode 插件,但是对于 C# 支持并不是很好,有些水土不服,而且 Rider 也不很适合单个文件开发。最后我找到了 VSCode 的一款 LeetCode 刷题扩展,基本符合了我的需求。 +LeetCode 自带的网页编辑器体验并不好,代码补全、高亮等都不是很舒服,于是打算使用本地开发。尝试在 Rider 中找到了 IntelliJ +平台通用的 LeetCode 插件,但是对于 C# 支持并不是很好,有些水土不服,而且 Rider 也不很适合单个文件开发。最后我找到了 VSCode +的一款 LeetCode 刷题扩展,基本符合了我的需求。 这篇文章将简单记录一下结合 .NET / C# 使用的过程。 ## 准备工作 + 1. 首先安装 [Visual Studio Code](https://code.visualstudio.com/download)。 2. 打开 VSCode,在左侧的扩展市场找到以下扩展并安装: - - [**C#** _by Microsoft_](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csharp):基于 OmniSharp 提供对 C# 的语言支持,包括自动补全、语法高亮等。 - - [**LeetCode** _by 力扣 LeetCode_](https://marketplace.visualstudio.com/items?itemName=LeetCode.vscode-leetcode):LeetCode 官方提供的刷题扩展,拥有题库查看、测试、提交等功能。[扩展的中文文档](https://github.com/LeetCode-OpenSource/vscode-leetcode/blob/master/docs/README_zh-CN.md) +- [**C#** _by Microsoft_](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csharp):基于 OmniSharp 提供对 + C# 的语言支持,包括自动补全、语法高亮等。 +- [**LeetCode** _by 力扣 LeetCode_](https://marketplace.visualstudio.com/items?itemName=LeetCode.vscode-leetcode) + :LeetCode + 官方提供的刷题扩展,拥有题库查看、测试、提交等功能。[扩展的中文文档](https://github.com/LeetCode-OpenSource/vscode-leetcode/blob/master/docs/README_zh-CN.md) ## 配置 LeetCode 扩展和 .NET + 新建一个文件夹并在 VSCode 中打开,这将作为我们 LeetCode 的工作区。 -在左侧找到 LeetCode 图标打开侧边栏,首先点击上方的小地球标志切换为国内的站点(leetcode.cn),然后点击 Sign in to LeetCode,输入账号密码登录。加载好后侧边栏会显示账号目前可用的题库。 +在左侧找到 LeetCode 图标打开侧边栏,首先点击上方的小地球标志切换为国内的站点(leetcode.cn),然后点击 Sign in to +LeetCode,输入账号密码登录。加载好后侧边栏会显示账号目前可用的题库。 -随便打开一道,点击页面右下角的 Code Now 按钮,提示选择使用的语言,这里选择 csharp (C#),扩展会自动创建一个名为 `ID.题目名称.cs` 的文件,例如下面这样: +随便打开一道,点击页面右下角的 Code Now 按钮,提示选择使用的语言,这里选择 csharp (C#) +,扩展会自动创建一个名为 `ID.题目名称.cs` 的文件,例如下面这样: ```csharp /* @@ -47,11 +55,15 @@ public class Solution { // @lc code=end ``` -这个文件中,最上方的一块注释包含了题目的ID、标题,和用于 LeetCode 扩展识别的题目元数据。然后是两行特殊的注释,`// @lc code=start` 和 `// @lc code=end`。这两行中间的所有内容都会作为提交或测试题目时的提交内容,就像是网页编辑器中一样。而这两行之外的内容都不会提交,因此可以写一些本地测试用代码。 +这个文件中,最上方的一块注释包含了题目的ID、标题,和用于 LeetCode +扩展识别的题目元数据。然后是两行特殊的注释,`// @lc code=start` 和 `// @lc code=end` +。这两行中间的所有内容都会作为提交或测试题目时的提交内容,就像是网页编辑器中一样。而这两行之外的内容都不会提交,因此可以写一些本地测试用代码。 -我们发现自动生成的文件直接放在根目录下,而且没有文件夹分隔。这样会显得很杂乱——尤其是需要为一道题编写多个题解的时候。LeetCode 扩展提供了一系列组件帮助我们自定义文件的生成路径。 +我们发现自动生成的文件直接放在根目录下,而且没有文件夹分隔。这样会显得很杂乱——尤其是需要为一道题编写多个题解的时候。LeetCode +扩展提供了一系列组件帮助我们自定义文件的生成路径。 -打开设置页面,搜索 leetcode 并找到 **Leetcode: Workspace Folder** 设置项,将值更改为 LeetCode 工作区的目录。这一项指定了 LeetCode 文件生成的相对目录。 +打开设置页面,搜索 leetcode 并找到 **Leetcode: Workspace Folder** 设置项,将值更改为 LeetCode 工作区的目录。这一项指定了 +LeetCode 文件生成的相对目录。 然后找到 **LeetCode: File Path** 项,点击进入 settings.json 中编辑。VSCode 会自动生成一些默认配置,我们对照修改即可: @@ -64,7 +76,10 @@ public class Solution { } ``` -修改 `folder` 和 `filename` 的值,其中 `folder` 的值将作为文件目录名的模板(相对于工作区根目录),`filename` 的值将作为生成文件名的模板。可以使用 `${xxx}` 作为预定义的插值,可以查看[官方文档](https://github.com/LeetCode-OpenSource/vscode-leetcode/wiki/%E8%87%AA%E5%AE%9A%E4%B9%89%E9%A2%98%E7%9B%AE%E6%96%87%E4%BB%B6%E7%9A%84%E7%9B%B8%E5%AF%B9%E6%96%87%E4%BB%B6%E5%A4%B9%E8%B7%AF%E5%BE%84%E5%92%8C%E6%96%87%E4%BB%B6%E5%90%8D)了解可使用的插值。 +修改 `folder` 和 `filename` 的值,其中 `folder` 的值将作为文件目录名的模板(相对于工作区根目录),`filename` +的值将作为生成文件名的模板。可以使用 `${xxx}` +作为预定义的插值,可以查看[官方文档](https://github.com/LeetCode-OpenSource/vscode-leetcode/wiki/%E8%87%AA%E5%AE%9A%E4%B9%89%E9%A2%98%E7%9B%AE%E6%96%87%E4%BB%B6%E7%9A%84%E7%9B%B8%E5%AF%B9%E6%96%87%E4%BB%B6%E5%A4%B9%E8%B7%AF%E5%BE%84%E5%92%8C%E6%96%87%E4%BB%B6%E5%90%8D) +了解可使用的插值。 我根据个人习惯修改成了如下形式: @@ -80,18 +95,22 @@ public class Solution { 这样生成的文件路径会形如 `src/1-两数之和/Solution-.cs`。 ::: note 关于命名 -这里我在 `Solution` 后加了一个横杠,方便有多个题解的同时存在。只需重命名并在 `-` 后面加上序号即可,例如 `Solution-1.cs` `Solution-2.cs`。 +这里我在 `Solution` 后加了一个横杠,方便有多个题解的同时存在。只需重命名并在 `-` +后面加上序号即可,例如 `Solution-1.cs` `Solution-2.cs`。 ::: 文件生成好了,但我们还不能正式开始编写代码。不信试试,你会发现除了少数几个关键字外根本没有代码提示... -其实解决办法很简单,我们只需要在项目里创建一个 `csproj` 文件,将工作区内的 cs 文件表示成一个项目就可以了(一个 `.csproj` 就可以,不用带上解决方案 `.sln` 文件)。 +其实解决办法很简单,我们只需要在项目里创建一个 `csproj` 文件,将工作区内的 cs 文件表示成一个项目就可以了(一个 `.csproj` +就可以,不用带上解决方案 `.sln` 文件)。 ::: note csproj 文件的存放位置 -这里我将 `LeetCode.csproj` 放在了 `src` 目录下。由于 `csproj` 文件的位置会影响到 `bin`、`obj` 文件夹的位置,所以你的位置如果不一样,记得同步更改后文的 `launch.json`。 +这里我将 `LeetCode.csproj` 放在了 `src` 目录下。由于 `csproj` 文件的位置会影响到 `bin`、`obj` +文件夹的位置,所以你的位置如果不一样,记得同步更改后文的 `launch.json`。 ::: 以下是基本的内容: + ```xml @@ -104,24 +123,31 @@ public class Solution { ``` -目前观察下来 LeetCode 在执行 C# 代码时是会带上 `ImplictUsings` 的,所以这里我们也带上,减少麻烦。同时根据官网说明,LeetCode 使用的是 .NET 6,因此我们指定 `TargetFramework` 为 `net6.0`。 +目前观察下来 LeetCode 在执行 C# 代码时是会带上 `ImplictUsings` 的,所以这里我们也带上,减少麻烦。同时根据官网说明,LeetCode +使用的是 .NET 6,因此我们指定 `TargetFramework` 为 `net6.0`。 创建完项目文件后重启 VSCode,让 OmniSharp 服务重新加载一下。此时再编写代码就会有代码提示了。 ::: tip 报了几十个莫名其妙的错误? -如果遇到诸如无法识别 `System` 命名空间等奇葩问题,可以删除生成的 `bin` 和 `obj` 文件夹,然后重新手动执行 `dotnet restore`。 +如果遇到诸如无法识别 `System` 命名空间等奇葩问题,可以删除生成的 `bin` 和 `obj` 文件夹,然后重新手动执行 `dotnet restore`。 ::: ## 调试配置 -有时我们通不过测试,但又不知道哪里出现了问题,这时我们就可以对程序 debug。得益于 VSCode 高度自定义化的调试配置,即使是 LeetCode 题解这样奇怪的项目结构也是可以调试的。 -由于每个文件都是一个题解,常规的 .NET 调试方法并不适用,而所有题解共用一个入口点就过于麻烦了。这里采用的方法是将题解分隔至不同的命名空间,并在调试编译时指定 `StartupObject` 来指定启动的 `Main` 方法,从而执行单个题解的调试。 +有时我们通不过测试,但又不知道哪里出现了问题,这时我们就可以对程序 debug。得益于 VSCode 高度自定义化的调试配置,即使是 +LeetCode 题解这样奇怪的项目结构也是可以调试的。 -首先我们在刚刚生成的 cs 文件顶端添加一行 `namespace LeetCode.P1.S1;`。这是我个人的命名方法,代表 1 号题目 (**P**roblem) 的第 1 个题解 (**S**olution)。你也可以修改成自己的样式,注意同时需要在后文的 `tasks.json` 中同步更改。 +由于每个文件都是一个题解,常规的 .NET +调试方法并不适用,而所有题解共用一个入口点就过于麻烦了。这里采用的方法是将题解分隔至不同的命名空间,并在调试编译时指定 `StartupObject` +来指定启动的 `Main` 方法,从而执行单个题解的调试。 + +首先我们在刚刚生成的 cs 文件顶端添加一行 `namespace LeetCode.P1.S1;`。这是我个人的命名方法,代表 1 号题目 (**P**roblem) 的第 +1 个题解 (**S**olution)。你也可以修改成自己的样式,注意同时需要在后文的 `tasks.json` 中同步更改。 在工作区根目录新建 `.vscode` 文件夹,并在其中新建以下文件和内容: `.vscode/tasks.json` + ```json { "version": "2.0.0", @@ -157,7 +183,10 @@ public class Solution { } ``` -在 `dotnet build` 的选项中,我们指定了 `-p:StartupObject=LeetCode.P${input:problem}.S${input:solution}.Program`。这采用了 VSCode 的配置语法,执行该 task 时,VSCode 会展示两个输入框,一个是题目ID,一个是题解ID。例如用户输入 123、1 后会拼接成 `-p:StartupObject=LeetCode.P123.S1.Program`。选项意味着将程序的入口点设置为 `LeetCode.P123.S1.Program` 中的 `Main` 方法。 +在 `dotnet build` 的选项中,我们指定了 `-p:StartupObject=LeetCode.P${input:problem}.S${input:solution}.Program`。这采用了 +VSCode 的配置语法,执行该 task 时,VSCode 会展示两个输入框,一个是题目ID,一个是题解ID。例如用户输入 123、1 +后会拼接成 `-p:StartupObject=LeetCode.P123.S1.Program`。选项意味着将程序的入口点设置为 `LeetCode.P123.S1.Program` +中的 `Main` 方法。 底下的 `inputs` 块是对上面两个输入框数据的描述。 @@ -183,7 +212,8 @@ public class Solution { 这个文件由 VSCode 自动生成的修改而来,只动了 `program` 项,将其指定为编译后的 DLL 文件路径。 -在题解文件中,`// @lc code=end` 行下方(这样就不会把测试代码提交至 LeetCode)添加一个 `Program` 类,并添加一个 `Main` 静态方法,在其中实例化 `Solution` 类并调用题目方法。整个文件如下(以题目 9.回文数 举例): +在题解文件中,`// @lc code=end` 行下方(这样就不会把测试代码提交至 LeetCode)添加一个 `Program` 类,并添加一个 `Main` +静态方法,在其中实例化 `Solution` 类并调用题目方法。整个文件如下(以题目 9.回文数 举例): ```csharp /* @@ -227,6 +257,7 @@ public static class Program 按 F5 开启调试,提示输入题目 ID ( 9 ) 和题解序号 ( 1 ),随后成功启动调试。 ## 一些小技巧 + 对于测试,每次手动输入 `namespace` 和 `Program` 之类的东西还是有点麻烦。我们可以编写一些 code snippets 来达到自动补全的效果。 新建 `.vscode/csharp.code-snippets` 文件,输入以下内容: diff --git a/content/posts/wsl2-arch/index.md b/content/posts/wsl2-arch/index.md index 2af299e..bb6f5af 100644 --- a/content/posts/wsl2-arch/index.md +++ b/content/posts/wsl2-arch/index.md @@ -2,7 +2,6 @@ title: 使用 WSL2 部署 Arch Linux 环境 create: 2022-10-01T09:38:08+08:00 -categories: tech tags: - wsl - archlinux @@ -13,7 +12,8 @@ cover: /covers/wsl2-arch.jpg 最近入了 Arch Linux 的坑,手上没有空闲的机子可以装着玩,虚拟机又有点膈应的感觉,就找了找资料在 WSL2 上装了体验一下。 -关于 WSL1 和 WSL2 的区别,不在本文的讨论范围内,可以前往[微软的官方说明](https://learn.microsoft.com/zh-cn/windows/wsl/compare-versions)查看。 +关于 WSL1 和 WSL2 +的区别,不在本文的讨论范围内,可以前往[微软的官方说明](https://learn.microsoft.com/zh-cn/windows/wsl/compare-versions)查看。 本文中,以 `>` 开头的命令为 Powershell 命令,`#` 开头为 Arch 中的 `root` 用户命令,`$` 开头为 Arch 中的普通用户命令。 @@ -25,13 +25,16 @@ cover: /covers/wsl2-arch.jpg 首先前往 [**这里**](https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi) 下载 WSL 的内核更新包,不然没法安装。 安装后将 WSL 的默认版本设置为 WSL2: + ```powershell > wsl --set-default-version 2 ``` ## 安装 Arch -前往 [项目仓库 (yuk7/ArchWSL)](https://github.com/yuk7/ArchWSL) 的 [Releases](https://github.com/yuk7/ArchWSL/releases) 页面下载最新的 `Arch.zip`,并解压到具有写权限的空文件夹里。留意 `Arch.exe` 的名称,`.exe` 前的部分会作为稍后在 WSL 内注册的发行版名称,例如改名成 `ArchLinux.exe`,稍后的实例就叫 `ArchLinux`。 +前往 [项目仓库 (yuk7/ArchWSL)](https://github.com/yuk7/ArchWSL) 的 [Releases](https://github.com/yuk7/ArchWSL/releases) +页面下载最新的 `Arch.zip`,并解压到具有写权限的空文件夹里。留意 `Arch.exe` 的名称,`.exe` 前的部分会作为稍后在 WSL +内注册的发行版名称,例如改名成 `ArchLinux.exe`,稍后的实例就叫 `ArchLinux`。 ::: note 多个 Arch 共存 由于这里的 Arch 是通过文件安装,只要将 `exe` 文件复制并改名即可。注意改名后的文件不要和已有的实例名称重复。 @@ -53,7 +56,9 @@ cover: /covers/wsl2-arch.jpg # passwd bs ``` -为了使新用户可以使用 `sudo` 权限,编辑 `/etc/sudoers` 文件,找到 `root ALL=(ALL:ALL) ALL`,在其下添加一行 `bs ALL=(ALL:ALL) ALL` (`bs` 同样换成刚刚的用户名);并找到 `#%wheel ALL=(ALL:ALL) ALL`,将其取消注释(去掉最前面的 `#`) +为了使新用户可以使用 `sudo` 权限,编辑 `/etc/sudoers` 文件,找到 `root ALL=(ALL:ALL) ALL` +,在其下添加一行 `bs ALL=(ALL:ALL) ALL` (`bs` 同样换成刚刚的用户名);并找到 `#%wheel ALL=(ALL:ALL) ALL` +,将其取消注释(去掉最前面的 `#`) ::: note 找不到编辑器 如果没有自己常用的编辑器(如 vim),可以先跳到下面的 Pacman 配置小节,然后自行安装。 @@ -78,9 +83,11 @@ bs ALL=(ALL:ALL) ALL 打开 Arch.exe 进入命令行。 -由于众所周知的原因,国内访问 Arch 的软件源十分缓慢,这里将源换为[清华大学开源镜像站的源](https://mirrors.tuna.tsinghua.edu.cn/help/archlinux/)。 +由于众所周知的原因,国内访问 Arch +的软件源十分缓慢,这里将源换为[清华大学开源镜像站的源](https://mirrors.tuna.tsinghua.edu.cn/help/archlinux/)。 -编辑 `/etc/pacman.d/mirrorlist`,往下翻找到 China 一栏,将 `https://mirrors.tuna.tsinghua.edu.cn` 行取消注释。也可以多取消几个注释作为后备。如果懒得找也可以直接在文件开头添加: +编辑 `/etc/pacman.d/mirrorlist`,往下翻找到 China 一栏,将 `https://mirrors.tuna.tsinghua.edu.cn` +行取消注释。也可以多取消几个注释作为后备。如果懒得找也可以直接在文件开头添加: ``` Server = https://mirrors.tuna.tsinghua.edu.cn/archlinux/$repo/os/$arch diff --git a/package.json b/package.json index b8bb9b5..b3832c6 100644 --- a/package.json +++ b/package.json @@ -1,4 +1,5 @@ { + "type": "module", "scripts": { "dev": "vitepress dev content --host", "build": "vitepress build content", @@ -6,18 +7,18 @@ "new": "node tools/new-post.js" }, "devDependencies": { - "@giscus/vue": "^2.2.8", + "@giscus/vue": "^2.3.0", "@mdi/font": "^7.2.96", - "@types/markdown-it-container": "^2.0.5", - "@types/node": "^18.16.0", + "@types/markdown-it-container": "^2.0.6", + "@types/node": "^18.17.5", "@types/webfontloader": "^1.6.35", "markdown-it-container": "^3.0.0", - "sass": "^1.62.0", - "simple-icons-font": "^8.11.0", + "sass": "^1.65.1", + "simple-icons-font": "^8.15.0", "vite-plugin-vuetify": "^1.0.2", - "vitepress": "1.0.0-alpha.74", - "vue": "^3.2.47", - "vuetify": "^3.1.15", + "vitepress": "1.0.0-rc.4", + "vue": "^3.3.4", + "vuetify": "^3.3.12", "webfontloader": "^1.6.28" } } \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index daec719..cf0e9a5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,17 +6,17 @@ settings: devDependencies: '@giscus/vue': - specifier: ^2.2.8 - version: 2.2.8(vue@3.2.47) + specifier: ^2.3.0 + version: 2.3.0(vue@3.3.4) '@mdi/font': specifier: ^7.2.96 version: 7.2.96 '@types/markdown-it-container': - specifier: ^2.0.5 - version: 2.0.5 + specifier: ^2.0.6 + version: 2.0.6 '@types/node': - specifier: ^18.16.0 - version: 18.16.0 + specifier: ^18.17.5 + version: 18.17.5 '@types/webfontloader': specifier: ^1.6.35 version: 1.6.35 @@ -24,185 +24,209 @@ devDependencies: specifier: ^3.0.0 version: 3.0.0 sass: - specifier: ^1.62.0 - version: 1.62.0 + specifier: ^1.65.1 + version: 1.65.1 simple-icons-font: - specifier: ^8.11.0 - version: 8.11.0 + specifier: ^8.15.0 + version: 8.15.0 vite-plugin-vuetify: specifier: ^1.0.2 - version: 1.0.2(vite@4.3.1)(vue@3.2.47)(vuetify@3.1.15) + version: 1.0.2(vite@4.4.9)(vue@3.3.4)(vuetify@3.3.12) vitepress: - specifier: 1.0.0-alpha.74 - version: 1.0.0-alpha.74(@algolia/client-search@4.17.0)(@types/node@18.16.0)(sass@1.62.0) + specifier: 1.0.0-rc.4 + version: 1.0.0-rc.4(@algolia/client-search@4.19.1)(@types/node@18.17.5)(sass@1.65.1)(search-insights@2.7.0) vue: - specifier: ^3.2.47 - version: 3.2.47 + specifier: ^3.3.4 + version: 3.3.4 vuetify: - specifier: ^3.1.15 - version: 3.1.15(vite-plugin-vuetify@1.0.2)(vue@3.2.47) + specifier: ^3.3.12 + version: 3.3.12(vite-plugin-vuetify@1.0.2)(vue@3.3.4) webfontloader: specifier: ^1.6.28 version: 1.6.28 packages: - /@algolia/autocomplete-core@1.7.4: - resolution: {integrity: sha512-daoLpQ3ps/VTMRZDEBfU8ixXd+amZcNJ4QSP3IERGyzqnL5Ch8uSRFt/4G8pUvW9c3o6GA4vtVv4I4lmnkdXyg==} + /@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.19.1)(algoliasearch@4.19.1)(search-insights@2.7.0): + resolution: {integrity: sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==} dependencies: - '@algolia/autocomplete-shared': 1.7.4 + '@algolia/autocomplete-plugin-algolia-insights': 1.9.3(@algolia/client-search@4.19.1)(algoliasearch@4.19.1)(search-insights@2.7.0) + '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.19.1)(algoliasearch@4.19.1) + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + - search-insights + dev: true + + /@algolia/autocomplete-plugin-algolia-insights@1.9.3(@algolia/client-search@4.19.1)(algoliasearch@4.19.1)(search-insights@2.7.0): + resolution: {integrity: sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==} + peerDependencies: + search-insights: '>= 1 < 3' + dependencies: + '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.19.1)(algoliasearch@4.19.1) + search-insights: 2.7.0 + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch dev: true - /@algolia/autocomplete-preset-algolia@1.7.4(@algolia/client-search@4.17.0)(algoliasearch@4.17.0): - resolution: {integrity: sha512-s37hrvLEIfcmKY8VU9LsAXgm2yfmkdHT3DnA3SgHaY93yjZ2qL57wzb5QweVkYuEBZkT2PIREvRoLXC2sxTbpQ==} + /@algolia/autocomplete-preset-algolia@1.9.3(@algolia/client-search@4.19.1)(algoliasearch@4.19.1): + resolution: {integrity: sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==} peerDependencies: '@algolia/client-search': '>= 4.9.1 < 6' algoliasearch: '>= 4.9.1 < 6' dependencies: - '@algolia/autocomplete-shared': 1.7.4 - '@algolia/client-search': 4.17.0 - algoliasearch: 4.17.0 + '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.19.1)(algoliasearch@4.19.1) + '@algolia/client-search': 4.19.1 + algoliasearch: 4.19.1 dev: true - /@algolia/autocomplete-shared@1.7.4: - resolution: {integrity: sha512-2VGCk7I9tA9Ge73Km99+Qg87w0wzW4tgUruvWAn/gfey1ZXgmxZtyIRBebk35R1O8TbK77wujVtCnpsGpRy1kg==} + /@algolia/autocomplete-shared@1.9.3(@algolia/client-search@4.19.1)(algoliasearch@4.19.1): + resolution: {integrity: sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==} + peerDependencies: + '@algolia/client-search': '>= 4.9.1 < 6' + algoliasearch: '>= 4.9.1 < 6' + dependencies: + '@algolia/client-search': 4.19.1 + algoliasearch: 4.19.1 dev: true - /@algolia/cache-browser-local-storage@4.17.0: - resolution: {integrity: sha512-myRSRZDIMYB8uCkO+lb40YKiYHi0fjpWRtJpR/dgkaiBlSD0plRyB6lLOh1XIfmMcSeBOqDE7y9m8xZMrXYfyQ==} + /@algolia/cache-browser-local-storage@4.19.1: + resolution: {integrity: sha512-FYAZWcGsFTTaSAwj9Std8UML3Bu8dyWDncM7Ls8g+58UOe4XYdlgzXWbrIgjaguP63pCCbMoExKr61B+ztK3tw==} dependencies: - '@algolia/cache-common': 4.17.0 + '@algolia/cache-common': 4.19.1 dev: true - /@algolia/cache-common@4.17.0: - resolution: {integrity: sha512-g8mXzkrcUBIPZaulAuqE7xyHhLAYAcF2xSch7d9dABheybaU3U91LjBX6eJTEB7XVhEsgK4Smi27vWtAJRhIKQ==} + /@algolia/cache-common@4.19.1: + resolution: {integrity: sha512-XGghi3l0qA38HiqdoUY+wvGyBsGvKZ6U3vTiMBT4hArhP3fOGLXpIINgMiiGjTe4FVlTa5a/7Zf2bwlIHfRqqg==} dev: true - /@algolia/cache-in-memory@4.17.0: - resolution: {integrity: sha512-PT32ciC/xI8z919d0oknWVu3kMfTlhQn3MKxDln3pkn+yA7F7xrxSALysxquv+MhFfNAcrtQ/oVvQVBAQSHtdw==} + /@algolia/cache-in-memory@4.19.1: + resolution: {integrity: sha512-+PDWL+XALGvIginigzu8oU6eWw+o76Z8zHbBovWYcrtWOEtinbl7a7UTt3x3lthv+wNuFr/YD1Gf+B+A9V8n5w==} dependencies: - '@algolia/cache-common': 4.17.0 + '@algolia/cache-common': 4.19.1 dev: true - /@algolia/client-account@4.17.0: - resolution: {integrity: sha512-sSEHx9GA6m7wrlsSMNBGfyzlIfDT2fkz2u7jqfCCd6JEEwmxt8emGmxAU/0qBfbhRSuGvzojoLJlr83BSZAKjA==} + /@algolia/client-account@4.19.1: + resolution: {integrity: sha512-Oy0ritA2k7AMxQ2JwNpfaEcgXEDgeyKu0V7E7xt/ZJRdXfEpZcwp9TOg4TJHC7Ia62gIeT2Y/ynzsxccPw92GA==} dependencies: - '@algolia/client-common': 4.17.0 - '@algolia/client-search': 4.17.0 - '@algolia/transporter': 4.17.0 + '@algolia/client-common': 4.19.1 + '@algolia/client-search': 4.19.1 + '@algolia/transporter': 4.19.1 dev: true - /@algolia/client-analytics@4.17.0: - resolution: {integrity: sha512-84ooP8QA3mQ958hQ9wozk7hFUbAO+81CX1CjAuerxBqjKIInh1fOhXKTaku05O/GHBvcfExpPLIQuSuLYziBXQ==} + /@algolia/client-analytics@4.19.1: + resolution: {integrity: sha512-5QCq2zmgdZLIQhHqwl55ZvKVpLM3DNWjFI4T+bHr3rGu23ew2bLO4YtyxaZeChmDb85jUdPDouDlCumGfk6wOg==} dependencies: - '@algolia/client-common': 4.17.0 - '@algolia/client-search': 4.17.0 - '@algolia/requester-common': 4.17.0 - '@algolia/transporter': 4.17.0 + '@algolia/client-common': 4.19.1 + '@algolia/client-search': 4.19.1 + '@algolia/requester-common': 4.19.1 + '@algolia/transporter': 4.19.1 dev: true - /@algolia/client-common@4.17.0: - resolution: {integrity: sha512-jHMks0ZFicf8nRDn6ma8DNNsdwGgP/NKiAAL9z6rS7CymJ7L0+QqTJl3rYxRW7TmBhsUH40wqzmrG6aMIN/DrQ==} + /@algolia/client-common@4.19.1: + resolution: {integrity: sha512-3kAIVqTcPrjfS389KQvKzliC559x+BDRxtWamVJt8IVp7LGnjq+aVAXg4Xogkur1MUrScTZ59/AaUd5EdpyXgA==} dependencies: - '@algolia/requester-common': 4.17.0 - '@algolia/transporter': 4.17.0 + '@algolia/requester-common': 4.19.1 + '@algolia/transporter': 4.19.1 dev: true - /@algolia/client-personalization@4.17.0: - resolution: {integrity: sha512-RMzN4dZLIta1YuwT7QC9o+OeGz2cU6eTOlGNE/6RcUBLOU3l9tkCOdln5dPE2jp8GZXPl2yk54b2nSs1+pAjqw==} + /@algolia/client-personalization@4.19.1: + resolution: {integrity: sha512-8CWz4/H5FA+krm9HMw2HUQenizC/DxUtsI5oYC0Jxxyce1vsr8cb1aEiSJArQT6IzMynrERif1RVWLac1m36xw==} dependencies: - '@algolia/client-common': 4.17.0 - '@algolia/requester-common': 4.17.0 - '@algolia/transporter': 4.17.0 + '@algolia/client-common': 4.19.1 + '@algolia/requester-common': 4.19.1 + '@algolia/transporter': 4.19.1 dev: true - /@algolia/client-search@4.17.0: - resolution: {integrity: sha512-x4P2wKrrRIXszT8gb7eWsMHNNHAJs0wE7/uqbufm4tZenAp+hwU/hq5KVsY50v+PfwM0LcDwwn/1DroujsTFoA==} + /@algolia/client-search@4.19.1: + resolution: {integrity: sha512-mBecfMFS4N+yK/p0ZbK53vrZbL6OtWMk8YmnOv1i0LXx4pelY8TFhqKoTit3NPVPwoSNN0vdSN9dTu1xr1XOVw==} dependencies: - '@algolia/client-common': 4.17.0 - '@algolia/requester-common': 4.17.0 - '@algolia/transporter': 4.17.0 + '@algolia/client-common': 4.19.1 + '@algolia/requester-common': 4.19.1 + '@algolia/transporter': 4.19.1 dev: true - /@algolia/logger-common@4.17.0: - resolution: {integrity: sha512-DGuoZqpTmIKJFDeyAJ7M8E/LOenIjWiOsg1XJ1OqAU/eofp49JfqXxbfgctlVZVmDABIyOz8LqEoJ6ZP4DTyvw==} + /@algolia/logger-common@4.19.1: + resolution: {integrity: sha512-i6pLPZW/+/YXKis8gpmSiNk1lOmYCmRI6+x6d2Qk1OdfvX051nRVdalRbEcVTpSQX6FQAoyeaui0cUfLYW5Elw==} dev: true - /@algolia/logger-console@4.17.0: - resolution: {integrity: sha512-zMPvugQV/gbXUvWBCzihw6m7oxIKp48w37QBIUu/XqQQfxhjoOE9xyfJr1KldUt5FrYOKZJVsJaEjTsu+bIgQg==} + /@algolia/logger-console@4.19.1: + resolution: {integrity: sha512-jj72k9GKb9W0c7TyC3cuZtTr0CngLBLmc8trzZlXdfvQiigpUdvTi1KoWIb2ZMcRBG7Tl8hSb81zEY3zI2RlXg==} dependencies: - '@algolia/logger-common': 4.17.0 + '@algolia/logger-common': 4.19.1 dev: true - /@algolia/requester-browser-xhr@4.17.0: - resolution: {integrity: sha512-aSOX/smauyTkP21Pf52pJ1O2LmNFJ5iHRIzEeTh0mwBeADO4GdG94cAWDILFA9rNblq/nK3EDh3+UyHHjplZ1A==} + /@algolia/requester-browser-xhr@4.19.1: + resolution: {integrity: sha512-09K/+t7lptsweRTueHnSnmPqIxbHMowejAkn9XIcJMLdseS3zl8ObnS5GWea86mu3vy4+8H+ZBKkUN82Zsq/zg==} dependencies: - '@algolia/requester-common': 4.17.0 + '@algolia/requester-common': 4.19.1 dev: true - /@algolia/requester-common@4.17.0: - resolution: {integrity: sha512-XJjmWFEUlHu0ijvcHBoixuXfEoiRUdyzQM6YwTuB8usJNIgShua8ouFlRWF8iCeag0vZZiUm4S2WCVBPkdxFgg==} + /@algolia/requester-common@4.19.1: + resolution: {integrity: sha512-BisRkcWVxrDzF1YPhAckmi2CFYK+jdMT60q10d7z3PX+w6fPPukxHRnZwooiTUrzFe50UBmLItGizWHP5bDzVQ==} dev: true - /@algolia/requester-node-http@4.17.0: - resolution: {integrity: sha512-bpb/wDA1aC6WxxM8v7TsFspB7yBN3nqCGs2H1OADolQR/hiAIjAxusbuMxVbRFOdaUvAIqioIIkWvZdpYNIn8w==} + /@algolia/requester-node-http@4.19.1: + resolution: {integrity: sha512-6DK52DHviBHTG2BK/Vv2GIlEw7i+vxm7ypZW0Z7vybGCNDeWzADx+/TmxjkES2h15+FZOqVf/Ja677gePsVItA==} dependencies: - '@algolia/requester-common': 4.17.0 + '@algolia/requester-common': 4.19.1 dev: true - /@algolia/transporter@4.17.0: - resolution: {integrity: sha512-6xL6H6fe+Fi0AEP3ziSgC+G04RK37iRb4uUUqVAH9WPYFI8g+LYFq6iv5HS8Cbuc5TTut+Bwj6G+dh/asdb9uA==} + /@algolia/transporter@4.19.1: + resolution: {integrity: sha512-nkpvPWbpuzxo1flEYqNIbGz7xhfhGOKGAZS7tzC+TELgEmi7z99qRyTfNSUlW7LZmB3ACdnqAo+9A9KFBENviQ==} dependencies: - '@algolia/cache-common': 4.17.0 - '@algolia/logger-common': 4.17.0 - '@algolia/requester-common': 4.17.0 + '@algolia/cache-common': 4.19.1 + '@algolia/logger-common': 4.19.1 + '@algolia/requester-common': 4.19.1 dev: true - /@babel/helper-string-parser@7.19.4: - resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} + /@babel/helper-string-parser@7.22.5: + resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-validator-identifier@7.19.1: - resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + /@babel/helper-validator-identifier@7.22.5: + resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} engines: {node: '>=6.9.0'} dev: true - /@babel/parser@7.21.4: - resolution: {integrity: sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==} + /@babel/parser@7.22.10: + resolution: {integrity: sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.21.4 + '@babel/types': 7.22.10 dev: true - /@babel/types@7.21.4: - resolution: {integrity: sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==} + /@babel/types@7.22.10: + resolution: {integrity: sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-string-parser': 7.19.4 - '@babel/helper-validator-identifier': 7.19.1 + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.5 to-fast-properties: 2.0.0 dev: true - /@docsearch/css@3.3.3: - resolution: {integrity: sha512-6SCwI7P8ao+se1TUsdZ7B4XzL+gqeQZnBc+2EONZlcVa0dVrk0NjETxozFKgMv0eEGH8QzP1fkN+A1rH61l4eg==} + /@docsearch/css@3.5.1: + resolution: {integrity: sha512-2Pu9HDg/uP/IT10rbQ+4OrTQuxIWdKVUEdcw9/w7kZJv9NeHS6skJx1xuRiFyoGKwAzcHXnLp7csE99sj+O1YA==} dev: true - /@docsearch/js@3.3.3(@algolia/client-search@4.17.0): - resolution: {integrity: sha512-2xAv2GFuHzzmG0SSZgf8wHX0qZX8n9Y1ZirKUk5Wrdc+vH9CL837x2hZIUdwcPZI9caBA+/CzxsS68O4waYjUQ==} + /@docsearch/js@3.5.1(@algolia/client-search@4.19.1)(search-insights@2.7.0): + resolution: {integrity: sha512-EXi8de5njxgP6TV3N9ytnGRLG9zmBNTEZjR4VzwPcpPLbZxxTLG2gaFyJyKiFVQxHW/DPlMrDJA3qoRRGEkgZw==} dependencies: - '@docsearch/react': 3.3.3(@algolia/client-search@4.17.0) - preact: 10.13.2 + '@docsearch/react': 3.5.1(@algolia/client-search@4.19.1)(search-insights@2.7.0) + preact: 10.16.0 transitivePeerDependencies: - '@algolia/client-search' - '@types/react' - react - react-dom + - search-insights dev: true - /@docsearch/react@3.3.3(@algolia/client-search@4.17.0): - resolution: {integrity: sha512-pLa0cxnl+G0FuIDuYlW+EBK6Rw2jwLw9B1RHIeS4N4s2VhsfJ/wzeCi3CWcs5yVfxLd5ZK50t//TMA5e79YT7Q==} + /@docsearch/react@3.5.1(@algolia/client-search@4.19.1)(search-insights@2.7.0): + resolution: {integrity: sha512-t5mEODdLzZq4PTFAm/dvqcvZFdPDMdfPE5rJS5SC8OUq9mPzxEy6b+9THIqNM9P0ocCb4UC5jqBrxKclnuIbzQ==} peerDependencies: '@types/react': '>= 16.8.0 < 19.0.0' react: '>= 16.8.0 < 19.0.0' @@ -215,16 +239,17 @@ packages: react-dom: optional: true dependencies: - '@algolia/autocomplete-core': 1.7.4 - '@algolia/autocomplete-preset-algolia': 1.7.4(@algolia/client-search@4.17.0)(algoliasearch@4.17.0) - '@docsearch/css': 3.3.3 - algoliasearch: 4.17.0 + '@algolia/autocomplete-core': 1.9.3(@algolia/client-search@4.19.1)(algoliasearch@4.19.1)(search-insights@2.7.0) + '@algolia/autocomplete-preset-algolia': 1.9.3(@algolia/client-search@4.19.1)(algoliasearch@4.19.1) + '@docsearch/css': 3.5.1 + algoliasearch: 4.19.1 transitivePeerDependencies: - '@algolia/client-search' + - search-insights dev: true - /@esbuild/android-arm64@0.17.18: - resolution: {integrity: sha512-/iq0aK0eeHgSC3z55ucMAHO05OIqmQehiGay8eP5l/5l+iEr4EIbh4/MI8xD9qRFjqzgkc0JkX0LculNC9mXBw==} + /@esbuild/android-arm64@0.18.20: + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} engines: {node: '>=12'} cpu: [arm64] os: [android] @@ -232,8 +257,8 @@ packages: dev: true optional: true - /@esbuild/android-arm@0.17.18: - resolution: {integrity: sha512-EmwL+vUBZJ7mhFCs5lA4ZimpUH3WMAoqvOIYhVQwdIgSpHC8ImHdsRyhHAVxpDYUSm0lWvd63z0XH1IlImS2Qw==} + /@esbuild/android-arm@0.18.20: + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} engines: {node: '>=12'} cpu: [arm] os: [android] @@ -241,8 +266,8 @@ packages: dev: true optional: true - /@esbuild/android-x64@0.17.18: - resolution: {integrity: sha512-x+0efYNBF3NPW2Xc5bFOSFW7tTXdAcpfEg2nXmxegm4mJuVeS+i109m/7HMiOQ6M12aVGGFlqJX3RhNdYM2lWg==} + /@esbuild/android-x64@0.18.20: + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} engines: {node: '>=12'} cpu: [x64] os: [android] @@ -250,8 +275,8 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64@0.17.18: - resolution: {integrity: sha512-6tY+djEAdF48M1ONWnQb1C+6LiXrKjmqjzPNPWXhu/GzOHTHX2nh8Mo2ZAmBFg0kIodHhciEgUBtcYCAIjGbjQ==} + /@esbuild/darwin-arm64@0.18.20: + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] @@ -259,8 +284,8 @@ packages: dev: true optional: true - /@esbuild/darwin-x64@0.17.18: - resolution: {integrity: sha512-Qq84ykvLvya3dO49wVC9FFCNUfSrQJLbxhoQk/TE1r6MjHo3sFF2tlJCwMjhkBVq3/ahUisj7+EpRSz0/+8+9A==} + /@esbuild/darwin-x64@0.18.20: + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} engines: {node: '>=12'} cpu: [x64] os: [darwin] @@ -268,8 +293,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64@0.17.18: - resolution: {integrity: sha512-fw/ZfxfAzuHfaQeMDhbzxp9mc+mHn1Y94VDHFHjGvt2Uxl10mT4CDavHm+/L9KG441t1QdABqkVYwakMUeyLRA==} + /@esbuild/freebsd-arm64@0.18.20: + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] @@ -277,8 +302,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64@0.17.18: - resolution: {integrity: sha512-FQFbRtTaEi8ZBi/A6kxOC0V0E9B/97vPdYjY9NdawyLd4Qk5VD5g2pbWN2VR1c0xhzcJm74HWpObPszWC+qTew==} + /@esbuild/freebsd-x64@0.18.20: + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] @@ -286,8 +311,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm64@0.17.18: - resolution: {integrity: sha512-R7pZvQZFOY2sxUG8P6A21eq6q+eBv7JPQYIybHVf1XkQYC+lT7nDBdC7wWKTrbvMXKRaGudp/dzZCwL/863mZQ==} + /@esbuild/linux-arm64@0.18.20: + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} engines: {node: '>=12'} cpu: [arm64] os: [linux] @@ -295,8 +320,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm@0.17.18: - resolution: {integrity: sha512-jW+UCM40LzHcouIaqv3e/oRs0JM76JfhHjCavPxMUti7VAPh8CaGSlS7cmyrdpzSk7A+8f0hiedHqr/LMnfijg==} + /@esbuild/linux-arm@0.18.20: + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} engines: {node: '>=12'} cpu: [arm] os: [linux] @@ -304,8 +329,8 @@ packages: dev: true optional: true - /@esbuild/linux-ia32@0.17.18: - resolution: {integrity: sha512-ygIMc3I7wxgXIxk6j3V00VlABIjq260i967Cp9BNAk5pOOpIXmd1RFQJQX9Io7KRsthDrQYrtcx7QCof4o3ZoQ==} + /@esbuild/linux-ia32@0.18.20: + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -313,8 +338,8 @@ packages: dev: true optional: true - /@esbuild/linux-loong64@0.17.18: - resolution: {integrity: sha512-bvPG+MyFs5ZlwYclCG1D744oHk1Pv7j8psF5TfYx7otCVmcJsEXgFEhQkbhNW8otDHL1a2KDINW20cfCgnzgMQ==} + /@esbuild/linux-loong64@0.18.20: + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] @@ -322,8 +347,8 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el@0.17.18: - resolution: {integrity: sha512-oVqckATOAGuiUOa6wr8TXaVPSa+6IwVJrGidmNZS1cZVx0HqkTMkqFGD2HIx9H1RvOwFeWYdaYbdY6B89KUMxA==} + /@esbuild/linux-mips64el@0.18.20: + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] @@ -331,8 +356,8 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64@0.17.18: - resolution: {integrity: sha512-3dLlQO+b/LnQNxgH4l9rqa2/IwRJVN9u/bK63FhOPB4xqiRqlQAU0qDU3JJuf0BmaH0yytTBdoSBHrb2jqc5qQ==} + /@esbuild/linux-ppc64@0.18.20: + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] @@ -340,8 +365,8 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64@0.17.18: - resolution: {integrity: sha512-/x7leOyDPjZV3TcsdfrSI107zItVnsX1q2nho7hbbQoKnmoeUWjs+08rKKt4AUXju7+3aRZSsKrJtaRmsdL1xA==} + /@esbuild/linux-riscv64@0.18.20: + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] @@ -349,8 +374,8 @@ packages: dev: true optional: true - /@esbuild/linux-s390x@0.17.18: - resolution: {integrity: sha512-cX0I8Q9xQkL/6F5zWdYmVf5JSQt+ZfZD2bJudZrWD+4mnUvoZ3TDDXtDX2mUaq6upMFv9FlfIh4Gfun0tbGzuw==} + /@esbuild/linux-s390x@0.18.20: + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -358,8 +383,8 @@ packages: dev: true optional: true - /@esbuild/linux-x64@0.17.18: - resolution: {integrity: sha512-66RmRsPlYy4jFl0vG80GcNRdirx4nVWAzJmXkevgphP1qf4dsLQCpSKGM3DUQCojwU1hnepI63gNZdrr02wHUA==} + /@esbuild/linux-x64@0.18.20: + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -367,8 +392,8 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64@0.17.18: - resolution: {integrity: sha512-95IRY7mI2yrkLlTLb1gpDxdC5WLC5mZDi+kA9dmM5XAGxCME0F8i4bYH4jZreaJ6lIZ0B8hTrweqG1fUyW7jbg==} + /@esbuild/netbsd-x64@0.18.20: + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -376,8 +401,8 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64@0.17.18: - resolution: {integrity: sha512-WevVOgcng+8hSZ4Q3BKL3n1xTv5H6Nb53cBrtzzEjDbbnOmucEVcZeGCsCOi9bAOcDYEeBZbD2SJNBxlfP3qiA==} + /@esbuild/openbsd-x64@0.18.20: + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -385,8 +410,8 @@ packages: dev: true optional: true - /@esbuild/sunos-x64@0.17.18: - resolution: {integrity: sha512-Rzf4QfQagnwhQXVBS3BYUlxmEbcV7MY+BH5vfDZekU5eYpcffHSyjU8T0xucKVuOcdCsMo+Ur5wmgQJH2GfNrg==} + /@esbuild/sunos-x64@0.18.20: + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -394,8 +419,8 @@ packages: dev: true optional: true - /@esbuild/win32-arm64@0.17.18: - resolution: {integrity: sha512-Kb3Ko/KKaWhjeAm2YoT/cNZaHaD1Yk/pa3FTsmqo9uFh1D1Rfco7BBLIPdDOozrObj2sahslFuAQGvWbgWldAg==} + /@esbuild/win32-arm64@0.18.20: + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -403,8 +428,8 @@ packages: dev: true optional: true - /@esbuild/win32-ia32@0.17.18: - resolution: {integrity: sha512-0/xUMIdkVHwkvxfbd5+lfG7mHOf2FRrxNbPiKWg9C4fFrB8H0guClmaM3BFiRUYrznVoyxTIyC/Ou2B7QQSwmw==} + /@esbuild/win32-ia32@0.18.20: + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -412,8 +437,8 @@ packages: dev: true optional: true - /@esbuild/win32-x64@0.17.18: - resolution: {integrity: sha512-qU25Ma1I3NqTSHJUOKi9sAH1/Mzuvlke0ioMJRthLXKm7JiSKVwFghlGbDLOO2sARECGhja4xYfRAZNPAkooYg==} + /@esbuild/win32-x64@0.18.20: + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -421,21 +446,25 @@ packages: dev: true optional: true - /@giscus/vue@2.2.8(vue@3.2.47): - resolution: {integrity: sha512-M74wmKItl4kNM7w5eJRGn9aTj7m6w5jhXfjjZQX4d/6tTMmJpNEUyWH/771OH6DfLFuA/RZ4qfmV3gdXhee1QA==} + /@giscus/vue@2.3.0(vue@3.3.4): + resolution: {integrity: sha512-ZZ1ZRqRwoHEfYpepSozU4HKjvCQ/4PjVt6P391/c0F4ly1i57OUup2h6Pd+l7dUnh9j7fbqUp6CfFk5+99S3Jw==} peerDependencies: vue: '>=3.2.0' dependencies: - giscus: 1.2.8 - vue: 3.2.47 + giscus: 1.3.0 + vue: 3.3.4 + dev: true + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} dev: true /@lit-labs/ssr-dom-shim@1.1.1: resolution: {integrity: sha512-kXOeFbfCm4fFf2A3WwVEeQj55tMZa8c8/f9AKHMobQMkzNUfUj+antR3fRPaZJawsa1aZiP/Da3ndpZrwEe4rQ==} dev: true - /@lit/reactive-element@1.6.1: - resolution: {integrity: sha512-va15kYZr7KZNNPZdxONGQzpUr+4sxVu7V/VG7a8mRfPPXUyhEYj5RzXCQmGrlP3tAh0L3HHm5AjBMFYRqlM9SA==} + /@lit/reactive-element@1.6.3: + resolution: {integrity: sha512-QuTgnG52Poic7uM1AN5yJ09QMe0O28e10XzSvWDz02TJiiKee4stsiownEIadWm8nYzyDAyT+gKzUoZmiWQtsQ==} dependencies: '@lit-labs/ssr-dom-shim': 1.1.1 dev: true @@ -448,14 +477,14 @@ packages: resolution: {integrity: sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA==} dev: true - /@types/markdown-it-container@2.0.5: - resolution: {integrity: sha512-8v5jIC5gcCUv+JcD0DExwNBkoKC0kLB4acensF0NoNlTIcXmQxF3RDjzAdIW82sXSoR+n772ePguxIWlq2ELvA==} + /@types/markdown-it-container@2.0.6: + resolution: {integrity: sha512-euUVSCx2+tGV8BlI7yA7AXmNsLzYCoUbg/O2jJ0wzV/0oxKbmd5RJZI2map8cuEKgmjNy13ndFWRZZO+6rl0GA==} dependencies: - '@types/markdown-it': 12.2.3 + '@types/markdown-it': 13.0.0 dev: true - /@types/markdown-it@12.2.3: - resolution: {integrity: sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==} + /@types/markdown-it@13.0.0: + resolution: {integrity: sha512-mPTaUl5glYfzdJFeCsvhXQwZKdyszNAZcMm5ZTP5SfpTu+vIbog7J3z8Fa4x/Fzv5TB4R6OA/pHBYIYmkYOWGQ==} dependencies: '@types/linkify-it': 3.0.2 '@types/mdurl': 1.0.2 @@ -465,121 +494,121 @@ packages: resolution: {integrity: sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==} dev: true - /@types/node@18.16.0: - resolution: {integrity: sha512-BsAaKhB+7X+H4GnSjGhJG9Qi8Tw+inU9nJDwmD5CgOmBLEI6ArdhikpLX7DjbjDRDTbqZzU2LSQNZg8WGPiSZQ==} + /@types/node@18.17.5: + resolution: {integrity: sha512-xNbS75FxH6P4UXTPUJp/zNPq6/xsfdJKussCWNOnz4aULWIRwMgP1LgaB5RiBnMX1DPCYenuqGZfnIAx5mbFLA==} dev: true /@types/trusted-types@2.0.3: resolution: {integrity: sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==} dev: true - /@types/web-bluetooth@0.0.16: - resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==} + /@types/web-bluetooth@0.0.17: + resolution: {integrity: sha512-4p9vcSmxAayx72yn70joFoL44c9MO/0+iVEBIQXe3v2h2SiAsEIo/G5v6ObFWvNKRFjbrVadNf9LqEEZeQPzdA==} dev: true /@types/webfontloader@1.6.35: resolution: {integrity: sha512-IJlrsiDWq6KghQ7tPlL5tcwSUyOxLDceT+AFUY7Ylj0Fcv3/h3QkANqQxZ0B5mEpEKxhTw76vDmvrruSMV9n9Q==} dev: true - /@vitejs/plugin-vue@4.1.0(vite@4.3.1)(vue@3.2.47): - resolution: {integrity: sha512-++9JOAFdcXI3lyer9UKUV4rfoQ3T1RN8yDqoCLar86s0xQct5yblxAE+yWgRnU5/0FOlVCpTZpYSBV/bGWrSrQ==} + /@vitejs/plugin-vue@4.2.3(vite@4.4.9)(vue@3.3.4): + resolution: {integrity: sha512-R6JDUfiZbJA9cMiguQ7jxALsgiprjBeHL5ikpXfJCH62pPHtI+JdJ5xWj6Ev73yXSlYl86+blXn1kZHQ7uElxw==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: vite: ^4.0.0 vue: ^3.2.25 dependencies: - vite: 4.3.1(@types/node@18.16.0)(sass@1.62.0) - vue: 3.2.47 + vite: 4.4.9(@types/node@18.17.5)(sass@1.65.1) + vue: 3.3.4 dev: true - /@vue/compiler-core@3.2.47: - resolution: {integrity: sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==} + /@vue/compiler-core@3.3.4: + resolution: {integrity: sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==} dependencies: - '@babel/parser': 7.21.4 - '@vue/shared': 3.2.47 + '@babel/parser': 7.22.10 + '@vue/shared': 3.3.4 estree-walker: 2.0.2 - source-map: 0.6.1 + source-map-js: 1.0.2 dev: true - /@vue/compiler-dom@3.2.47: - resolution: {integrity: sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==} + /@vue/compiler-dom@3.3.4: + resolution: {integrity: sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==} dependencies: - '@vue/compiler-core': 3.2.47 - '@vue/shared': 3.2.47 + '@vue/compiler-core': 3.3.4 + '@vue/shared': 3.3.4 dev: true - /@vue/compiler-sfc@3.2.47: - resolution: {integrity: sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==} + /@vue/compiler-sfc@3.3.4: + resolution: {integrity: sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==} dependencies: - '@babel/parser': 7.21.4 - '@vue/compiler-core': 3.2.47 - '@vue/compiler-dom': 3.2.47 - '@vue/compiler-ssr': 3.2.47 - '@vue/reactivity-transform': 3.2.47 - '@vue/shared': 3.2.47 + '@babel/parser': 7.22.10 + '@vue/compiler-core': 3.3.4 + '@vue/compiler-dom': 3.3.4 + '@vue/compiler-ssr': 3.3.4 + '@vue/reactivity-transform': 3.3.4 + '@vue/shared': 3.3.4 estree-walker: 2.0.2 - magic-string: 0.25.9 - postcss: 8.4.23 - source-map: 0.6.1 + magic-string: 0.30.2 + postcss: 8.4.27 + source-map-js: 1.0.2 dev: true - /@vue/compiler-ssr@3.2.47: - resolution: {integrity: sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==} + /@vue/compiler-ssr@3.3.4: + resolution: {integrity: sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==} dependencies: - '@vue/compiler-dom': 3.2.47 - '@vue/shared': 3.2.47 + '@vue/compiler-dom': 3.3.4 + '@vue/shared': 3.3.4 dev: true /@vue/devtools-api@6.5.0: resolution: {integrity: sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==} dev: true - /@vue/reactivity-transform@3.2.47: - resolution: {integrity: sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==} + /@vue/reactivity-transform@3.3.4: + resolution: {integrity: sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==} dependencies: - '@babel/parser': 7.21.4 - '@vue/compiler-core': 3.2.47 - '@vue/shared': 3.2.47 + '@babel/parser': 7.22.10 + '@vue/compiler-core': 3.3.4 + '@vue/shared': 3.3.4 estree-walker: 2.0.2 - magic-string: 0.25.9 + magic-string: 0.30.2 dev: true - /@vue/reactivity@3.2.47: - resolution: {integrity: sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==} + /@vue/reactivity@3.3.4: + resolution: {integrity: sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==} dependencies: - '@vue/shared': 3.2.47 + '@vue/shared': 3.3.4 dev: true - /@vue/runtime-core@3.2.47: - resolution: {integrity: sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==} + /@vue/runtime-core@3.3.4: + resolution: {integrity: sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==} dependencies: - '@vue/reactivity': 3.2.47 - '@vue/shared': 3.2.47 + '@vue/reactivity': 3.3.4 + '@vue/shared': 3.3.4 dev: true - /@vue/runtime-dom@3.2.47: - resolution: {integrity: sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==} + /@vue/runtime-dom@3.3.4: + resolution: {integrity: sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==} dependencies: - '@vue/runtime-core': 3.2.47 - '@vue/shared': 3.2.47 - csstype: 2.6.21 + '@vue/runtime-core': 3.3.4 + '@vue/shared': 3.3.4 + csstype: 3.1.2 dev: true - /@vue/server-renderer@3.2.47(vue@3.2.47): - resolution: {integrity: sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==} + /@vue/server-renderer@3.3.4(vue@3.3.4): + resolution: {integrity: sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==} peerDependencies: - vue: 3.2.47 + vue: 3.3.4 dependencies: - '@vue/compiler-ssr': 3.2.47 - '@vue/shared': 3.2.47 - vue: 3.2.47 + '@vue/compiler-ssr': 3.3.4 + '@vue/shared': 3.3.4 + vue: 3.3.4 dev: true - /@vue/shared@3.2.47: - resolution: {integrity: sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==} + /@vue/shared@3.3.4: + resolution: {integrity: sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==} dev: true - /@vuetify/loader-shared@1.7.1(vue@3.2.47)(vuetify@3.1.15): + /@vuetify/loader-shared@1.7.1(vue@3.3.4)(vuetify@3.3.12): resolution: {integrity: sha512-kLUvuAed6RCvkeeTNJzuy14pqnkur8lTuner7v7pNE/kVhPR97TuyXwBSBMR1cJeiLiOfu6SF5XlCYbXByEx1g==} peerDependencies: vue: ^3.0.0 @@ -587,56 +616,106 @@ packages: dependencies: find-cache-dir: 3.3.2 upath: 2.0.1 - vue: 3.2.47 - vuetify: 3.1.15(vite-plugin-vuetify@1.0.2)(vue@3.2.47) + vue: 3.3.4 + vuetify: 3.3.12(vite-plugin-vuetify@1.0.2)(vue@3.3.4) dev: true - /@vueuse/core@10.1.0(vue@3.2.47): - resolution: {integrity: sha512-3Znoa5m5RO+z4/C9w6DRaKTR3wCVJvD5rav8HTDGsr+7rOZRHtcgFJ8NcCs0ZvIpmev2kExTa311ns5j2RbzDQ==} + /@vueuse/core@10.3.0(vue@3.3.4): + resolution: {integrity: sha512-BEM5yxcFKb5btFjTSAFjTu5jmwoW66fyV9uJIP4wUXXU8aR5Hl44gndaaXp7dC5HSObmgbnR2RN+Un1p68Mf5Q==} dependencies: - '@types/web-bluetooth': 0.0.16 - '@vueuse/metadata': 10.1.0 - '@vueuse/shared': 10.1.0(vue@3.2.47) - vue-demi: 0.14.0(vue@3.2.47) + '@types/web-bluetooth': 0.0.17 + '@vueuse/metadata': 10.3.0 + '@vueuse/shared': 10.3.0(vue@3.3.4) + vue-demi: 0.14.5(vue@3.3.4) transitivePeerDependencies: - '@vue/composition-api' - vue dev: true - /@vueuse/metadata@10.1.0: - resolution: {integrity: sha512-cM28HjDEw5FIrPE9rgSPFZvQ0ZYnOLAOr8hl1XM6tFl80U3WAR5ROdnAqiYybniwP5gt9MKKAJAqd/ab2aHkqg==} + /@vueuse/integrations@10.3.0(focus-trap@7.5.2)(vue@3.3.4): + resolution: {integrity: sha512-Jgiv7oFyIgC6BxmDtiyG/fxyGysIds00YaY7sefwbhCZ2/tjEx1W/1WcsISSJPNI30in28+HC2J4uuU8184ekg==} + peerDependencies: + async-validator: '*' + axios: '*' + change-case: '*' + drauu: '*' + focus-trap: '*' + fuse.js: '*' + idb-keyval: '*' + jwt-decode: '*' + nprogress: '*' + qrcode: '*' + sortablejs: '*' + universal-cookie: '*' + peerDependenciesMeta: + async-validator: + optional: true + axios: + optional: true + change-case: + optional: true + drauu: + optional: true + focus-trap: + optional: true + fuse.js: + optional: true + idb-keyval: + optional: true + jwt-decode: + optional: true + nprogress: + optional: true + qrcode: + optional: true + sortablejs: + optional: true + universal-cookie: + optional: true + dependencies: + '@vueuse/core': 10.3.0(vue@3.3.4) + '@vueuse/shared': 10.3.0(vue@3.3.4) + focus-trap: 7.5.2 + vue-demi: 0.14.5(vue@3.3.4) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + dev: true + + /@vueuse/metadata@10.3.0: + resolution: {integrity: sha512-Ema3YhNOa4swDsV0V7CEY5JXvK19JI/o1szFO1iWxdFg3vhdFtCtSTP26PCvbUpnUtNHBY2wx5y3WDXND5Pvnw==} dev: true - /@vueuse/shared@10.1.0(vue@3.2.47): - resolution: {integrity: sha512-2X52ogu12i9DkKOQ01yeb/BKg9UO87RNnpm5sXkQvyORlbq8ONS5l39MYkjkeVWWjdT0teJru7a2S41dmHmqjQ==} + /@vueuse/shared@10.3.0(vue@3.3.4): + resolution: {integrity: sha512-kGqCTEuFPMK4+fNWy6dUOiYmxGcUbtznMwBZLC1PubidF4VZY05B+Oht7Jh7/6x4VOWGpvu3R37WHi81cKpiqg==} dependencies: - vue-demi: 0.14.0(vue@3.2.47) + vue-demi: 0.14.5(vue@3.3.4) transitivePeerDependencies: - '@vue/composition-api' - vue dev: true - /algoliasearch@4.17.0: - resolution: {integrity: sha512-JMRh2Mw6sEnVMiz6+APsi7lx9a2jiDFF+WUtANaUVCv6uSU9UOLdo5h9K3pdP6frRRybaM2fX8b1u0nqICS9aA==} + /algoliasearch@4.19.1: + resolution: {integrity: sha512-IJF5b93b2MgAzcE/tuzW0yOPnuUyRgGAtaPv5UUywXM8kzqfdwZTO4sPJBzoGz1eOy6H9uEchsJsBFTELZSu+g==} dependencies: - '@algolia/cache-browser-local-storage': 4.17.0 - '@algolia/cache-common': 4.17.0 - '@algolia/cache-in-memory': 4.17.0 - '@algolia/client-account': 4.17.0 - '@algolia/client-analytics': 4.17.0 - '@algolia/client-common': 4.17.0 - '@algolia/client-personalization': 4.17.0 - '@algolia/client-search': 4.17.0 - '@algolia/logger-common': 4.17.0 - '@algolia/logger-console': 4.17.0 - '@algolia/requester-browser-xhr': 4.17.0 - '@algolia/requester-common': 4.17.0 - '@algolia/requester-node-http': 4.17.0 - '@algolia/transporter': 4.17.0 + '@algolia/cache-browser-local-storage': 4.19.1 + '@algolia/cache-common': 4.19.1 + '@algolia/cache-in-memory': 4.19.1 + '@algolia/client-account': 4.19.1 + '@algolia/client-analytics': 4.19.1 + '@algolia/client-common': 4.19.1 + '@algolia/client-personalization': 4.19.1 + '@algolia/client-search': 4.19.1 + '@algolia/logger-common': 4.19.1 + '@algolia/logger-console': 4.19.1 + '@algolia/requester-browser-xhr': 4.19.1 + '@algolia/requester-common': 4.19.1 + '@algolia/requester-node-http': 4.19.1 + '@algolia/transporter': 4.19.1 dev: true - /ansi-sequence-parser@1.1.0: - resolution: {integrity: sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==} + /ansi-sequence-parser@1.1.1: + resolution: {integrity: sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==} dev: true /anymatch@3.1.3: @@ -682,8 +761,8 @@ packages: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} dev: true - /csstype@2.6.21: - resolution: {integrity: sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==} + /csstype@3.1.2: + resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} dev: true /debug@4.3.4: @@ -698,34 +777,34 @@ packages: ms: 2.1.2 dev: true - /esbuild@0.17.18: - resolution: {integrity: sha512-z1lix43jBs6UKjcZVKOw2xx69ffE2aG0PygLL5qJ9OS/gy0Ewd1gW/PUQIOIQGXBHWNywSc0floSKoMFF8aK2w==} + /esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - '@esbuild/android-arm': 0.17.18 - '@esbuild/android-arm64': 0.17.18 - '@esbuild/android-x64': 0.17.18 - '@esbuild/darwin-arm64': 0.17.18 - '@esbuild/darwin-x64': 0.17.18 - '@esbuild/freebsd-arm64': 0.17.18 - '@esbuild/freebsd-x64': 0.17.18 - '@esbuild/linux-arm': 0.17.18 - '@esbuild/linux-arm64': 0.17.18 - '@esbuild/linux-ia32': 0.17.18 - '@esbuild/linux-loong64': 0.17.18 - '@esbuild/linux-mips64el': 0.17.18 - '@esbuild/linux-ppc64': 0.17.18 - '@esbuild/linux-riscv64': 0.17.18 - '@esbuild/linux-s390x': 0.17.18 - '@esbuild/linux-x64': 0.17.18 - '@esbuild/netbsd-x64': 0.17.18 - '@esbuild/openbsd-x64': 0.17.18 - '@esbuild/sunos-x64': 0.17.18 - '@esbuild/win32-arm64': 0.17.18 - '@esbuild/win32-ia32': 0.17.18 - '@esbuild/win32-x64': 0.17.18 + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 dev: true /estree-walker@2.0.2: @@ -756,6 +835,12 @@ packages: path-exists: 4.0.0 dev: true + /focus-trap@7.5.2: + resolution: {integrity: sha512-p6vGNNWLDGwJCiEjkSK6oERj/hEyI9ITsSwIUICBoKLlWiTWXJRfQibCwcoi50rTZdbi87qDtUlMCmQwsGSgPw==} + dependencies: + tabbable: 6.2.0 + dev: true + /fsevents@2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -764,10 +849,10 @@ packages: dev: true optional: true - /giscus@1.2.8: - resolution: {integrity: sha512-pufrgQYt1W+4ztiWp/PilLPN8NdyKvpbQ8jNqbAa1g84t6qqyevXHfkOYCi4x4d+y191vJAUc6seL1Dq74yUeA==} + /giscus@1.3.0: + resolution: {integrity: sha512-A3tVLgSmpnh2sX9uGjo9MbzmTTEJirSyFUPRvkipvy37y9rhxUYDoh9kO37QVrP7Sc7QuJ+gihB6apkO0yDyTw==} dependencies: - lit: 2.7.3 + lit: 2.8.0 dev: true /glob-parent@5.1.2: @@ -777,8 +862,8 @@ packages: is-glob: 4.0.3 dev: true - /immutable@4.3.0: - resolution: {integrity: sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==} + /immutable@4.3.2: + resolution: {integrity: sha512-oGXzbEDem9OOpDWZu88jGiYCvIsLHMvGw+8OXlpsvTFvIQplQbjg1B1cvKg8f7Hoch6+NGjpPsH1Fr+Mc2D1aA==} dev: true /is-binary-path@2.1.0: @@ -809,26 +894,26 @@ packages: resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} dev: true - /lit-element@3.3.2: - resolution: {integrity: sha512-xXAeVWKGr4/njq0rGC9dethMnYCq5hpKYrgQZYTzawt9YQhMiXfD+T1RgrdY3NamOxwq2aXlb0vOI6e29CKgVQ==} + /lit-element@3.3.3: + resolution: {integrity: sha512-XbeRxmTHubXENkV4h8RIPyr8lXc+Ff28rkcQzw3G6up2xg5E8Zu1IgOWIwBLEQsu3cOVFqdYwiVi0hv0SlpqUA==} dependencies: '@lit-labs/ssr-dom-shim': 1.1.1 - '@lit/reactive-element': 1.6.1 - lit-html: 2.7.3 + '@lit/reactive-element': 1.6.3 + lit-html: 2.8.0 dev: true - /lit-html@2.7.3: - resolution: {integrity: sha512-9DyLzcn/kbRGowz2vFmSANFbRZTxYUgYYFqzie89w6GLpPUiBCDHfcdeRUV/k3Q2ueYxNjfv46yPCtKAEAPOVw==} + /lit-html@2.8.0: + resolution: {integrity: sha512-o9t+MQM3P4y7M7yNzqAyjp7z+mQGa4NS4CxiyLqFPyFWyc4O+nodLrkrxSaCTrla6M5YOLaT3RpbbqjszB5g3Q==} dependencies: '@types/trusted-types': 2.0.3 dev: true - /lit@2.7.3: - resolution: {integrity: sha512-0a+u+vVbmgSfPu+fyvqjMPBX0Kwbyj9QOv9MbQFZhWGlV2cyk3lEwgfUQgYN+i/lx++1Z3wZknSIp3QCKxHLyg==} + /lit@2.8.0: + resolution: {integrity: sha512-4Sc3OFX9QHOJaHbmTMk28SYgVxLN3ePDjg7hofEft2zWlehFL3LiAuapWc4U/kYwMYJSh2hTCPZ6/LIC7ii0MA==} dependencies: - '@lit/reactive-element': 1.6.1 - lit-element: 3.3.2 - lit-html: 2.7.3 + '@lit/reactive-element': 1.6.3 + lit-element: 3.3.3 + lit-html: 2.8.0 dev: true /locate-path@5.0.0: @@ -838,17 +923,18 @@ packages: p-locate: 4.1.0 dev: true - /magic-string@0.25.9: - resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} + /magic-string@0.30.2: + resolution: {integrity: sha512-lNZdu7pewtq/ZvWUp9Wpf/x7WzMTsR26TWV03BRZrXFsv+BI6dy8RAiKgm1uM/kyR0rCfUcqvOlXKG66KhIGug==} + engines: {node: '>=12'} dependencies: - sourcemap-codec: 1.4.8 + '@jridgewell/sourcemap-codec': 1.4.15 dev: true /make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} dependencies: - semver: 6.3.0 + semver: 6.3.1 dev: true /mark.js@8.11.1: @@ -859,8 +945,8 @@ packages: resolution: {integrity: sha512-y6oKTq4BB9OQuY/KLfk/O3ysFhB3IMYoIWhGJEidXt1NQFocFK2sA2t0NYZAMyMShAGL6x5OPIbrmXPIqaN9rw==} dev: true - /minisearch@6.0.1: - resolution: {integrity: sha512-Ly1w0nHKnlhAAh6/BF/+9NgzXfoJxaJ8nhopFhQ3NcvFJrFIL+iCg9gw9e9UMBD+XIsp/RyznJ/o5UIe5Kw+kg==} + /minisearch@6.1.0: + resolution: {integrity: sha512-PNxA/X8pWk+TiqPbsoIYH0GQ5Di7m6326/lwU/S4mlo4wGQddIcf/V//1f9TB0V4j59b57b+HZxt8h3iMROGvg==} dev: true /ms@2.1.2: @@ -918,8 +1004,8 @@ packages: find-up: 4.1.0 dev: true - /postcss@8.4.23: - resolution: {integrity: sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==} + /postcss@8.4.27: + resolution: {integrity: sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==} engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.6 @@ -927,8 +1013,8 @@ packages: source-map-js: 1.0.2 dev: true - /preact@10.13.2: - resolution: {integrity: sha512-q44QFLhOhty2Bd0Y46fnYW0gD/cbVM9dUVtNTDKPcdXSMA7jfY+Jpd6rk3GB0lcQss0z5s/6CmVP0Z/hV+g6pw==} + /preact@10.16.0: + resolution: {integrity: sha512-XTSj3dJ4roKIC93pald6rWuB2qQJO9gO2iLLyTe87MrjQN+HklueLsmskbywEWqCHlclgz3/M4YLL2iBr9UmMA==} dev: true /readdirp@3.6.0: @@ -938,40 +1024,45 @@ packages: picomatch: 2.3.1 dev: true - /rollup@3.20.7: - resolution: {integrity: sha512-P7E2zezKSLhWnTz46XxjSmInrbOCiul1yf+kJccMxT56vxjHwCbDfoLbiqFgu+WQoo9ij2PkraYaBstgB2prBA==} + /rollup@3.28.0: + resolution: {integrity: sha512-d7zhvo1OUY2SXSM6pfNjgD5+d0Nz87CUp4mt8l/GgVP3oBsPwzNvSzyu1me6BSG9JIgWNTVcafIXBIyM8yQ3yw==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true optionalDependencies: fsevents: 2.3.2 dev: true - /sass@1.62.0: - resolution: {integrity: sha512-Q4USplo4pLYgCi+XlipZCWUQz5pkg/ruSSgJ0WRDSb/+3z9tXUOkQ7QPYn4XrhZKYAK4HlpaQecRwKLJX6+DBg==} + /sass@1.65.1: + resolution: {integrity: sha512-9DINwtHmA41SEd36eVPQ9BJKpn7eKDQmUHmpI0y5Zv2Rcorrh0zS+cFrt050hdNbmmCNKTW3hV5mWfuegNRsEA==} engines: {node: '>=14.0.0'} hasBin: true dependencies: chokidar: 3.5.3 - immutable: 4.3.0 + immutable: 4.3.2 source-map-js: 1.0.2 dev: true - /semver@6.3.0: - resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + /search-insights@2.7.0: + resolution: {integrity: sha512-GLbVaGgzYEKMvuJbHRhLi1qoBFnjXZGZ6l4LxOYPCp4lI2jDRB3jPU9/XNhMwv6kvnA9slTreq6pvK+b3o3aqg==} + engines: {node: '>=8.16.0'} + dev: true + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true dev: true - /shiki@0.14.1: - resolution: {integrity: sha512-+Jz4nBkCBe0mEDqo1eKRcCdjRtrCjozmcbTUjbPTX7OOJfEbTZzlUWlZtGe3Gb5oV1/jnojhG//YZc3rs9zSEw==} + /shiki@0.14.3: + resolution: {integrity: sha512-U3S/a+b0KS+UkTyMjoNojvTgrBHjgp7L6ovhFVZsXmBGnVdQ4K4U9oK0z63w538S91ATngv1vXigHCSWOwnr+g==} dependencies: - ansi-sequence-parser: 1.1.0 + ansi-sequence-parser: 1.1.1 jsonc-parser: 3.2.0 vscode-oniguruma: 1.7.0 vscode-textmate: 8.0.0 dev: true - /simple-icons-font@8.11.0: - resolution: {integrity: sha512-U0Ei4ozWAWCcCz5LdAzS+oMs5FgrlaKxCT+cJU/iE41WA7yx65F5uegaK8MucnorYgxVyYq6U4ryHFvxcQvbsg==} + /simple-icons-font@8.15.0: + resolution: {integrity: sha512-yo0V/+BYVSVbDpuzMw/yMPs3akUyeH2nUD3G4Ni83hstUDagpVfDpp62sRQH8WfPF9YozfsRM3+Nykbmb2yZHQ==} dev: true /source-map-js@1.0.2: @@ -979,14 +1070,8 @@ packages: engines: {node: '>=0.10.0'} dev: true - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - dev: true - - /sourcemap-codec@1.4.8: - resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} - deprecated: Please use @jridgewell/sourcemap-codec instead + /tabbable@6.2.0: + resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} dev: true /to-fast-properties@2.0.0: @@ -1006,30 +1091,31 @@ packages: engines: {node: '>=4'} dev: true - /vite-plugin-vuetify@1.0.2(vite@4.3.1)(vue@3.2.47)(vuetify@3.1.15): + /vite-plugin-vuetify@1.0.2(vite@4.4.9)(vue@3.3.4)(vuetify@3.3.12): resolution: {integrity: sha512-MubIcKD33O8wtgQXlbEXE7ccTEpHZ8nPpe77y9Wy3my2MWw/PgehP9VqTp92BLqr0R1dSL970Lynvisx3UxBFw==} engines: {node: '>=12'} peerDependencies: vite: ^2.7.0 || ^3.0.0 || ^4.0.0 vuetify: ^3.0.0-beta.4 dependencies: - '@vuetify/loader-shared': 1.7.1(vue@3.2.47)(vuetify@3.1.15) + '@vuetify/loader-shared': 1.7.1(vue@3.3.4)(vuetify@3.3.12) debug: 4.3.4 upath: 2.0.1 - vite: 4.3.1(@types/node@18.16.0)(sass@1.62.0) - vuetify: 3.1.15(vite-plugin-vuetify@1.0.2)(vue@3.2.47) + vite: 4.4.9(@types/node@18.17.5)(sass@1.65.1) + vuetify: 3.3.12(vite-plugin-vuetify@1.0.2)(vue@3.3.4) transitivePeerDependencies: - supports-color - vue dev: true - /vite@4.3.1(@types/node@18.16.0)(sass@1.62.0): - resolution: {integrity: sha512-EPmfPLAI79Z/RofuMvkIS0Yr091T2ReUoXQqc5ppBX/sjFRhHKiPPF/R46cTdoci/XgeQpB23diiJxq5w30vdg==} + /vite@4.4.9(@types/node@18.17.5)(sass@1.65.1): + resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true peerDependencies: '@types/node': '>= 14' less: '*' + lightningcss: ^1.21.0 sass: '*' stylus: '*' sugarss: '*' @@ -1039,6 +1125,8 @@ packages: optional: true less: optional: true + lightningcss: + optional: true sass: optional: true stylus: @@ -1048,42 +1136,57 @@ packages: terser: optional: true dependencies: - '@types/node': 18.16.0 - esbuild: 0.17.18 - postcss: 8.4.23 - rollup: 3.20.7 - sass: 1.62.0 + '@types/node': 18.17.5 + esbuild: 0.18.20 + postcss: 8.4.27 + rollup: 3.28.0 + sass: 1.65.1 optionalDependencies: fsevents: 2.3.2 dev: true - /vitepress@1.0.0-alpha.74(@algolia/client-search@4.17.0)(@types/node@18.16.0)(sass@1.62.0): - resolution: {integrity: sha512-n5UHqsLJKaJ3V6BSiofS5ZVhtxzarNIn3/kyOzUp/vePmVbQyX/pZ6/MhZgNr0g5t4E55j7XM3AHf/Fo0hnrpw==} + /vitepress@1.0.0-rc.4(@algolia/client-search@4.19.1)(@types/node@18.17.5)(sass@1.65.1)(search-insights@2.7.0): + resolution: {integrity: sha512-JCQ89Bm6ECUTnyzyas3JENo00UDJeK8q1SUQyJYou+4Yz5BKEc/F3O21cu++DnUT2zXc0kvQ2Aj4BZCc/nioXQ==} hasBin: true dependencies: - '@docsearch/css': 3.3.3 - '@docsearch/js': 3.3.3(@algolia/client-search@4.17.0) - '@vitejs/plugin-vue': 4.1.0(vite@4.3.1)(vue@3.2.47) + '@docsearch/css': 3.5.1 + '@docsearch/js': 3.5.1(@algolia/client-search@4.19.1)(search-insights@2.7.0) + '@vitejs/plugin-vue': 4.2.3(vite@4.4.9)(vue@3.3.4) '@vue/devtools-api': 6.5.0 - '@vueuse/core': 10.1.0(vue@3.2.47) + '@vueuse/core': 10.3.0(vue@3.3.4) + '@vueuse/integrations': 10.3.0(focus-trap@7.5.2)(vue@3.3.4) body-scroll-lock: 4.0.0-beta.0 + focus-trap: 7.5.2 mark.js: 8.11.1 - minisearch: 6.0.1 - shiki: 0.14.1 - vite: 4.3.1(@types/node@18.16.0)(sass@1.62.0) - vue: 3.2.47 + minisearch: 6.1.0 + shiki: 0.14.3 + vite: 4.4.9(@types/node@18.17.5)(sass@1.65.1) + vue: 3.3.4 transitivePeerDependencies: - '@algolia/client-search' - '@types/node' - '@types/react' - '@vue/composition-api' + - async-validator + - axios + - change-case + - drauu + - fuse.js + - idb-keyval + - jwt-decode - less + - lightningcss + - nprogress + - qrcode - react - react-dom - sass + - search-insights + - sortablejs - stylus - sugarss - terser + - universal-cookie dev: true /vscode-oniguruma@1.7.0: @@ -1094,8 +1197,8 @@ packages: resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} dev: true - /vue-demi@0.14.0(vue@3.2.47): - resolution: {integrity: sha512-gt58r2ogsNQeVoQ3EhoUAvUsH9xviydl0dWJj7dabBC/2L4uBId7ujtCwDRD0JhkGsV1i0CtfLAeyYKBht9oWg==} + /vue-demi@0.14.5(vue@3.3.4): + resolution: {integrity: sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==} engines: {node: '>=12'} hasBin: true requiresBuild: true @@ -1106,28 +1209,31 @@ packages: '@vue/composition-api': optional: true dependencies: - vue: 3.2.47 + vue: 3.3.4 dev: true - /vue@3.2.47: - resolution: {integrity: sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==} + /vue@3.3.4: + resolution: {integrity: sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==} dependencies: - '@vue/compiler-dom': 3.2.47 - '@vue/compiler-sfc': 3.2.47 - '@vue/runtime-dom': 3.2.47 - '@vue/server-renderer': 3.2.47(vue@3.2.47) - '@vue/shared': 3.2.47 + '@vue/compiler-dom': 3.3.4 + '@vue/compiler-sfc': 3.3.4 + '@vue/runtime-dom': 3.3.4 + '@vue/server-renderer': 3.3.4(vue@3.3.4) + '@vue/shared': 3.3.4 dev: true - /vuetify@3.1.15(vite-plugin-vuetify@1.0.2)(vue@3.2.47): - resolution: {integrity: sha512-uxB4UCrP+hFyJaoSsVObAGBRD73qq5ga7HULepzGoMeUWap2H99mcqmMdN/a/Yp4ODK3gT8EcUeph3EgEcsArQ==} + /vuetify@3.3.12(vite-plugin-vuetify@1.0.2)(vue@3.3.4): + resolution: {integrity: sha512-mH3CF+ALM1sC0Zm91IPq5b+bummrHH/Ek9jwYrQ0+fOAoJWd9nUcOIHODTPY+PODJDbJTwF6b3wVTDwqzUgTgQ==} engines: {node: ^12.20 || >=14.13} peerDependencies: + typescript: '>=4.7' vite-plugin-vuetify: ^1.0.0-alpha.12 vue: ^3.2.0 vue-i18n: ^9.0.0 webpack-plugin-vuetify: ^2.0.0-alpha.11 peerDependenciesMeta: + typescript: + optional: true vite-plugin-vuetify: optional: true vue-i18n: @@ -1135,8 +1241,8 @@ packages: webpack-plugin-vuetify: optional: true dependencies: - vite-plugin-vuetify: 1.0.2(vite@4.3.1)(vue@3.2.47)(vuetify@3.1.15) - vue: 3.2.47 + vite-plugin-vuetify: 1.0.2(vite@4.4.9)(vue@3.3.4)(vuetify@3.3.12) + vue: 3.3.4 dev: true /webfontloader@1.6.28: diff --git a/theme/Layout.vue b/theme/Layout.vue index e71cbc8..5421da5 100644 --- a/theme/Layout.vue +++ b/theme/Layout.vue @@ -1,60 +1,23 @@ - - + + diff --git a/theme/components/MainFrame.vue b/theme/components/MainFrame.vue new file mode 100644 index 0000000..6aeb614 --- /dev/null +++ b/theme/components/MainFrame.vue @@ -0,0 +1,33 @@ + + + + + \ No newline at end of file diff --git a/theme/components/NavBar.vue b/theme/components/NavBar.vue deleted file mode 100644 index 2bc696b..0000000 --- a/theme/components/NavBar.vue +++ /dev/null @@ -1,110 +0,0 @@ - - - - - diff --git a/theme/components/PageContainer.vue b/theme/components/PageContainer.vue deleted file mode 100644 index 4b097b2..0000000 --- a/theme/components/PageContainer.vue +++ /dev/null @@ -1,25 +0,0 @@ - - - diff --git a/theme/components/PostList.vue b/theme/components/PostList.vue deleted file mode 100644 index fac1781..0000000 --- a/theme/components/PostList.vue +++ /dev/null @@ -1,45 +0,0 @@ - - - - - diff --git a/theme/components/cards/ContentCard.vue b/theme/components/cards/ContentCard.vue new file mode 100644 index 0000000..54bad0b --- /dev/null +++ b/theme/components/cards/ContentCard.vue @@ -0,0 +1,56 @@ + + + + + \ No newline at end of file diff --git a/theme/components/cards/GiscusCard.vue b/theme/components/cards/GiscusCard.vue new file mode 100644 index 0000000..ed2dcc5 --- /dev/null +++ b/theme/components/cards/GiscusCard.vue @@ -0,0 +1,13 @@ + + + \ No newline at end of file diff --git a/theme/components/cards/GiscusCommentCard.vue b/theme/components/cards/GiscusCommentCard.vue deleted file mode 100644 index 7b9321f..0000000 --- a/theme/components/cards/GiscusCommentCard.vue +++ /dev/null @@ -1,16 +0,0 @@ - - - diff --git a/theme/components/cards/MarkdownContentCard.vue b/theme/components/cards/MarkdownContentCard.vue deleted file mode 100644 index 79dd4c0..0000000 --- a/theme/components/cards/MarkdownContentCard.vue +++ /dev/null @@ -1,8 +0,0 @@ - diff --git a/theme/components/cards/PostCard.vue b/theme/components/cards/PostCard.vue new file mode 100644 index 0000000..b6df982 --- /dev/null +++ b/theme/components/cards/PostCard.vue @@ -0,0 +1,55 @@ + + + + + \ No newline at end of file diff --git a/theme/components/cards/PostListItemCardDesktop.vue b/theme/components/cards/PostListItemCardDesktop.vue deleted file mode 100644 index ace5243..0000000 --- a/theme/components/cards/PostListItemCardDesktop.vue +++ /dev/null @@ -1,42 +0,0 @@ - - - - - diff --git a/theme/components/cards/PostListItemCardInfo.vue b/theme/components/cards/PostListItemCardInfo.vue deleted file mode 100644 index f55e999..0000000 --- a/theme/components/cards/PostListItemCardInfo.vue +++ /dev/null @@ -1,23 +0,0 @@ - - - - - diff --git a/theme/components/cards/PostListItemCardMobile.vue b/theme/components/cards/PostListItemCardMobile.vue deleted file mode 100644 index 7b4887a..0000000 --- a/theme/components/cards/PostListItemCardMobile.vue +++ /dev/null @@ -1,22 +0,0 @@ - - - diff --git a/theme/components/cards/ProfileCard.vue b/theme/components/cards/ProfileCard.vue deleted file mode 100644 index 7905e53..0000000 --- a/theme/components/cards/ProfileCard.vue +++ /dev/null @@ -1,35 +0,0 @@ - - - - - diff --git a/theme/components/cards/TagsCard.vue b/theme/components/cards/TagsCard.vue new file mode 100644 index 0000000..77c28c8 --- /dev/null +++ b/theme/components/cards/TagsCard.vue @@ -0,0 +1,15 @@ + + + \ No newline at end of file diff --git a/theme/components/headers/HomeHeader.vue b/theme/components/headers/HomeHeader.vue deleted file mode 100644 index dcc24a7..0000000 --- a/theme/components/headers/HomeHeader.vue +++ /dev/null @@ -1,55 +0,0 @@ - - - - - diff --git a/theme/components/headers/PageHeader.vue b/theme/components/headers/PageHeader.vue deleted file mode 100644 index 1f24858..0000000 --- a/theme/components/headers/PageHeader.vue +++ /dev/null @@ -1,58 +0,0 @@ - - - - - diff --git a/theme/components/pages/ContentPage.vue b/theme/components/pages/ContentPage.vue new file mode 100644 index 0000000..2bf6423 --- /dev/null +++ b/theme/components/pages/ContentPage.vue @@ -0,0 +1,23 @@ + + + + + \ No newline at end of file diff --git a/theme/components/pages/HomePage.vue b/theme/components/pages/HomePage.vue new file mode 100644 index 0000000..d34eaee --- /dev/null +++ b/theme/components/pages/HomePage.vue @@ -0,0 +1,14 @@ + + + + + \ No newline at end of file diff --git a/theme/index.ts b/theme/index.ts index 7f13ee0..d925d8c 100644 --- a/theme/index.ts +++ b/theme/index.ts @@ -1,34 +1,11 @@ import { Theme } from 'vitepress' import Layout from './Layout.vue' import vuetify from './vuetify' -import type { GiscusProps } from '@giscus/vue' import './styles/global.scss' import './styles/markdown.scss' import './styles/containers.scss' -export interface BsBlogThemeConfig { - author: string - bio: string - avatar: string - postPerPage?: number - navLinks?: NavLink[] - socialLinks?: SocialLink[] - giscus: GiscusProps -} - -export interface NavLink { - href: string - title: string - icon: string -} - -export interface SocialLink { - href: string - icon: string - desc: string -} - const theme: Theme = { Layout, diff --git a/theme/posts.data.ts b/theme/posts.data.ts new file mode 100644 index 0000000..1fe0b65 --- /dev/null +++ b/theme/posts.data.ts @@ -0,0 +1,15 @@ +import { createContentLoader } from 'vitepress' +import { getPostFromContentData } from "./utils" +import { Post } from "./types/common"; + +const loader = createContentLoader('posts/**/index.md') +export default { + ...loader, + async load() { + const data = await loader.load() + return data.map(getPostFromContentData); + } +} + +declare const data: Post[] +export { data } diff --git a/theme/scripts/posts.data.ts b/theme/scripts/posts.data.ts deleted file mode 100644 index 18cf5a7..0000000 --- a/theme/scripts/posts.data.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { ContentData, createContentLoader } from 'vitepress' - -export default createContentLoader('posts/**/index.md') - -declare const data: ContentData[] -export { data } diff --git a/theme/scripts/ribbon.ts b/theme/scripts/ribbon.ts deleted file mode 100644 index 22eca96..0000000 --- a/theme/scripts/ribbon.ts +++ /dev/null @@ -1,71 +0,0 @@ -/** - * This code is modified from https://github.com/hustcc/ribbon.js/blob/master/src/ribbon.js - */ - -interface Point { - x: number - y: number -} - -export default function initRibbonUnder(selector: string) { - const canvas = document.createElement('canvas') - const ctx = canvas.getContext('2d')! - const pixelRatio = window.devicePixelRatio || 1 - const width = window.innerWidth - const height = window.innerHeight - - const alpha = 0.6 - const size = 90 - - let q: Point[] = [] - let t - let r = 0 - - canvas.width = width * pixelRatio - canvas.height = height * pixelRatio - ctx.globalAlpha = alpha - ctx.scale(pixelRatio, pixelRatio) - canvas.style.cssText = `opacity: ${alpha}; position: fixed; top: 0; left: 0; z-index: -999; width: 100%; height: 100%; pointer-events: none;` - - // create canvas - document.querySelector(selector)!.appendChild(canvas) - - function redraw() { - ctx.clearRect(0, 0, width, height) - q = [ - { x: 0, y: height * 0.7 + size }, - { x: 0, y: height * 0.7 - size }, - ] - while (q[1].x < width + size) draw(q[0], q[1]) - } - - function draw(a: Point, b: Point) { - ctx.beginPath() - ctx.moveTo(a.x, a.y) - ctx.lineTo(b.x, b.y) - const k = b.x + (Math.random() * 2 - 0.25) * size - const n = line(b.y) - ctx.lineTo(k, n) - ctx.closePath() - r -= (Math.PI * 2) / -50 - ctx.fillStyle = - '#' + - ( - ((Math.cos(r) * 127 + 128) << 16) | - ((Math.cos(r + (Math.PI * 2) / 3) * 127 + 128) << 8) | - (Math.cos(r + ((Math.PI * 2) / 3) * 2) * 127 + 128) - ).toString(16) - ctx.fill() - q[0] = q[1] - q[1] = { x: k, y: n } - } - function line(p: number): number { - t = p + (Math.random() * 2 - 1.1) * size - return t > height || t < 0 ? line(p) : t - } - - document.addEventListener('click', redraw) - document.addEventListener('touchstart', redraw) - - redraw() -} diff --git a/theme/styles/containers.scss b/theme/styles/containers.scss index f4d2488..a856fcd 100644 --- a/theme/styles/containers.scss +++ b/theme/styles/containers.scss @@ -1,4 +1,4 @@ -@import './vars.scss'; +@import './variables.scss'; @import './mixins.scss'; .custom-block { @@ -38,7 +38,7 @@ &::before { font-weight: 500; - font-family: 'Material Design Icons'; + font-family: 'Material Design Icons', monospace; position: absolute; font-size: 1.25rem; left: 0.7rem; diff --git a/theme/styles/global.scss b/theme/styles/global.scss index 5626845..358fe44 100644 --- a/theme/styles/global.scss +++ b/theme/styles/global.scss @@ -1,4 +1,4 @@ -@import './vars.scss'; +@import './variables.scss'; html { &, @@ -22,5 +22,5 @@ html { } .page-header-title { - text-shadow: 0px 2px 6px rgba(0, 0, 0, 0.3); + text-shadow: 0 2px 6px rgba(0, 0, 0, 0.3); } diff --git a/theme/styles/markdown.scss b/theme/styles/markdown.scss index e07277f..a123f5b 100644 --- a/theme/styles/markdown.scss +++ b/theme/styles/markdown.scss @@ -1,9 +1,7 @@ -@import './vars.scss'; -@import './mixins.scss'; +@import './variables'; +@import './mixins'; .markdown { - line-height: 28px; - // Titles h1, h2, @@ -28,6 +26,7 @@ } p { + line-height: 1.6em; font-size: $md-content-font-size; margin: 10px 0; @include normalizeFirstLast(); @@ -55,7 +54,9 @@ position: relative; background-color: rgba($md-blockquote-color, 0.1); border-radius: $md-block-border-radius; + //noinspection CssReplaceWithShorthandSafely padding: $md-block-padding; + //noinspection CssReplaceWithShorthandSafely padding-left: $md-block-padding + 6px; margin: $md-block-margin-y 0; @@ -83,6 +84,7 @@ // Lists ol, ul { + line-height: 1.6em; margin: 0 0 10px 28px; font-size: $md-content-font-size; @@ -97,6 +99,7 @@ font-size: $md-code-font-size; font-family: 'JetBrains Mono', Consolas, monospace !important; } + code { background-color: $md-code-bg-color-light; border-radius: $md-block-border-radius; @@ -188,15 +191,15 @@ display: none; } } -} -html.dark .markdown { - a:not([class]), - a.header-anchor { - color: $md-link-color-dark; - } + &.dark { + a:not([class]), + a.header-anchor { + color: $md-link-color-dark; + } - code { - background-color: $md-code-bg-color-dark; + code { + background-color: $md-code-bg-color-dark; + } } -} +} \ No newline at end of file diff --git a/theme/styles/vars.scss b/theme/styles/variables.scss similarity index 84% rename from theme/styles/vars.scss rename to theme/styles/variables.scss index 8d79952..ef1236f 100644 --- a/theme/styles/vars.scss +++ b/theme/styles/variables.scss @@ -1,4 +1,6 @@ -$main-font: 'Inter', sans-serif; +$main-font: 'Roboto', sans-serif; + +$content-max-width: 1200px; $md-containers: ( note: #4481ff '\F06FF', @@ -28,3 +30,6 @@ $md-code-bg-color-dark: #1a1a1a; $md-block-margin-y: 16px; $md-block-padding: 12px; $md-block-border-radius: 4px; + +// Content +$content-card-title-overlay-color: rgba(0, 0, 0, 0.3); diff --git a/theme/types/common.ts b/theme/types/common.ts new file mode 100644 index 0000000..15766fc --- /dev/null +++ b/theme/types/common.ts @@ -0,0 +1,12 @@ +export interface Post { + frontmatter: Record + id?: string // 若为 undefined,则不在一个 Post 中 + title: string + cover?: string + description?: string + create: number + category?: string + tags: string[] + url: string + comment: boolean +} \ No newline at end of file diff --git a/theme/types/config.ts b/theme/types/config.ts new file mode 100644 index 0000000..8bd4342 --- /dev/null +++ b/theme/types/config.ts @@ -0,0 +1,23 @@ +import { GiscusProps } from "@giscus/vue"; + +export interface BsBlogThemeConfig { + author: string + bio: string + avatar: string + defaultPostCover: string + navLinks?: NavLink[] + socialLinks?: SocialLink[] + giscus: GiscusProps +} + +export interface NavLink { + href: string + title: string + icon: string +} + +export interface SocialLink { + href: string + icon: string + desc: string +} \ No newline at end of file diff --git a/theme/utils.ts b/theme/utils.ts index 6f3f574..4437b97 100644 --- a/theme/utils.ts +++ b/theme/utils.ts @@ -1,5 +1,5 @@ -import { BsBlogThemeConfig } from 'theme' -import { ContentData, useData } from 'vitepress' +import { ContentData } from 'vitepress' +import { Post } from "./types/common" export function formatTime( timestamp: number, @@ -15,28 +15,33 @@ export function formatTime( return withTime ? str + ` ${hour}:${minute}` : str } -export function normalizeRelativePath(path: string) { - return '/' + path.replace('index.md', '') -} - -export function getPostFromFrontmatter(frontmatter: Record) { +export function getPostFromContentData(post: ContentData): Post { return { - title: frontmatter.title ?? 'Untitled Post', - cover: frontmatter.cover, - description: frontmatter.description, - create: frontmatter.create - ? new Date(frontmatter.create).getTime() - : Date.now(), - tags: frontmatter.tags ?? [], - categories: frontmatter.categories ?? [], + frontmatter: post.frontmatter, + id: /(?<=\/posts\/).*(?=\/)/.exec(post.url)![0], + title: post.frontmatter.title ?? 'Untitled Post', + cover: post.frontmatter.cover, + description: post.frontmatter.description, + create: post.frontmatter.create ? new Date(post.frontmatter.create).getTime() : Date.now(), + category: post.frontmatter.category, + tags: post.frontmatter.tags ?? [], + url: post.url.replace('index.html', ''), + comment: !!(post.frontmatter.comment ?? true), } } -export function getPostFromData(post: ContentData) { - return { - ...post, - ...getPostFromFrontmatter(post.frontmatter), - url: post.url.replace('index.html', ''), - id: /(?<=\/posts\/).*(?=\/)/.exec(post.url)![0], - } +const primaryColors = [ + 'red', 'pink', 'purple', + 'deep-purple', 'indigo', 'blue', + 'light-blue', 'cyan', 'teal', + 'green', 'light-green', 'lime', + 'yellow', 'amber', 'orange', + 'deep-orange', 'brown', 'blue-grey', 'grey' +] + +export function getTagColor(tagName: string): string { + let n = 0 + for (let i = 0; i < tagName.length; i++) + n += tagName.charCodeAt(i) + return `${primaryColors[n % primaryColors.length]}-darken-${n % 4 + 1}` } diff --git a/tsconfig.json b/tsconfig.json index 459a636..402be68 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,9 +6,18 @@ "strict": true, "esModuleInterop": true, "noUnusedLocals": true, - "lib": ["ESNext", "DOM"], + "lib": [ + "ESNext", + "DOM" + ], "skipLibCheck": true }, - "include": ["theme", "content", "theme/env.d.ts"], - "exclude": ["node_modules"] + "include": [ + "theme", + "content", + "theme/env.d.ts" + ], + "exclude": [ + "node_modules" + ] }