From 5de60d4d6e7fa83ebbdd2127df7e4cbd0bfe269b Mon Sep 17 00:00:00 2001 From: pengzhanbo Date: Wed, 19 Oct 2022 02:30:20 +0800 Subject: [PATCH 01/29] feat(theme): plume-theme next devloping ! add plugin-auto-frontmatter | add plugin-blog-data | devloping new theme --- .gitignore | 2 + .vscode/settings.json | 1 + docs/.vuepress/config.ts | 2 +- docs/1.前端/1.基础/BFC 块级格式化上下文.md | 6 +- docs/1.前端/1.基础/CSS at-rule.md | 6 +- docs/1.前端/1.基础/CSS media媒体查询.md | 4 +- docs/1.前端/1.基础/CSS选择器.md | 6 +- docs/1.前端/1.基础/DOCTYPE 文档类型声明.md | 6 +- docs/1.前端/1.基础/HTML5新特性.md | 6 +- docs/1.前端/1.基础/WebComponent-template.md | 4 +- docs/1.前端/1.基础/WebComponent自定义元素.md | 4 +- docs/1.前端/1.基础/meta 标签说明.md | 6 +- docs/1.前端/1.基础/原型链与继承.md | 4 +- docs/1.前端/1.基础/正则表达式使用手册.md | 4 +- docs/1.前端/1.基础/浏览器端的事件循环.md | 3 +- docs/1.前端/1.基础/详解Promise.md | 2 +- docs/1.前端/10.开发/1px解决方案.md | 4 +- docs/1.前端/10.开发/lerna使用.md | 4 +- docs/1.前端/10.开发/移动端适配方案.md | 6 +- docs/1.前端/2.工具/Jenkinss使用.md | 4 +- docs/1.前端/2.工具/caniuse.md | 4 +- docs/1.前端/2.工具/vsCode插件推荐.md | 4 +- docs/1.前端/3.Vue/Vue组件间通信.md | 4 +- docs/10.面试/面试2.md | 2 +- docs/10.面试/面试题-JS篇.md | 4 +- docs/10.面试/面试题—css篇.md | 4 +- docs/README.md | 3 + docs/notes/README.md | 3 +- docs/notes/vuepress-plugin/caniuse/README.md | 2 +- .../vuepress-plugin/netlify-functions/API.md | 2 +- .../netlify-functions/README.md | 2 +- .../netlify-functions/functions开发指南.md | 2 +- .../vuepress-plugin/netlify-functions/介绍.md | 2 +- .../vuepress-plugin/netlify-functions/使用.md | 2 +- .../vuepress-plugin/netlify-functions/功能.md | 2 +- docs/notes/vuepress-theme-plume/README.md | 2 +- .../vuepress-theme-plume/markdown增强.md | 2 +- docs/notes/vuepress-theme-plume/notes配置.md | 2 +- .../vuepress-theme-plume/主题插件配置.md | 2 +- docs/notes/vuepress-theme-plume/主题配置.md | 2 +- docs/notes/vuepress-theme-plume/基础功能.md | 2 +- docs/notes/vuepress-theme-plume/快速开始.md | 2 +- docs/notes/vuepress-theme-plume/编写文章.md | 2 +- docs/notes/vuepress-theme-plume/页面配置.md | 2 +- .../LICENSE | 0 packages/plugin-auto-frontmatter/README.md | 115 ++++++ packages/plugin-auto-frontmatter/package.json | 48 +++ .../plugin-auto-frontmatter/src/node/env.d.ts | 16 + .../plugin-auto-frontmatter/src/node/index.ts | 8 + .../src/node/plugin.ts | 83 +++++ .../src/node/readFiles.ts | 33 ++ .../src/shared/index.ts | 36 ++ .../tsconfig.build.json | 9 + packages/plugin-blog-data/LICENSE | 21 ++ packages/plugin-blog-data/package.json | 51 +++ .../src/client/blogPostData.d.ts | 7 + .../src/client/composables/index.ts | 1 + .../src/client/composables/useBlogPostData.ts | 20 ++ .../plugin-blog-data/src/client/config.ts | 36 ++ packages/plugin-blog-data/src/client/index.ts | 4 + packages/plugin-blog-data/src/node/env.d.ts | 16 + packages/plugin-blog-data/src/node/index.ts | 6 + packages/plugin-blog-data/src/node/plugin.ts | 63 ++++ .../src/node/prepareBlogData.ts | 79 +++++ packages/plugin-blog-data/src/shared/index.ts | 16 + packages/plugin-blog-data/tsconfig.build.json | 13 + packages/theme/CHANGELOG.md | 229 ------------ packages/theme/package.json | 33 +- .../theme/src/client/components/Archive.vue | 171 --------- .../src/client/components/AsideNavbar.vue | 47 --- .../theme/src/client/components/AutoLink.vue | 105 ------ .../theme/src/client/components/BackToTop.vue | 65 ---- .../theme/src/client/components/BlogInfo.vue | 32 -- .../src/client/components/BloggerInfo.vue | 195 ---------- .../theme/src/client/components/Category.vue | 43 --- .../src/client/components/CategoryGroup.vue | 98 ----- .../src/client/components/DarkModeButton.vue | 76 ---- .../client/components/DropdownTransition.vue | 59 ---- packages/theme/src/client/components/Home.vue | 27 +- .../src/client/components/HomeBigBanner.vue | 166 --------- .../theme/src/client/components/Navbar.vue | 160 --------- .../src/client/components/NavbarBrand.vue | 84 ----- .../src/client/components/NavbarDropdown.vue | 334 ------------------ .../src/client/components/NavbarItems.vue | 79 ----- packages/theme/src/client/components/Page.vue | 110 ------ .../src/client/components/PageFooter.vue | 49 --- .../src/client/components/Pagination.vue | 203 ----------- .../theme/src/client/components/PostItem.vue | 59 ---- .../theme/src/client/components/PostList.vue | 195 ---------- .../theme/src/client/components/PostMeta.vue | 126 ------- .../theme/src/client/components/Sidebar.vue | 94 ----- .../src/client/components/SidebarItems.vue | 157 -------- packages/theme/src/client/components/Tag.vue | 100 ------ packages/theme/src/client/components/Toc.ts | 148 -------- .../client/components/ToggleSidebarButton.vue | 65 ---- .../src/client/components/global/Badge.vue | 57 --- .../src/client/components/icons/IconBase.ts | 39 -- .../theme/src/client/components/icons/icon.ts | 109 ------ .../src/client/components/icons/index.ts | 3 - .../src/client/components/icons/socialIcon.ts | 126 ------- .../theme/src/client/composables/archive.ts | 42 --- .../src/client/composables/asideNavbar.ts | 23 -- .../theme/src/client/composables/blogger.ts | 0 .../theme/src/client/composables/category.ts | 89 ----- .../theme/src/client/composables/darkMode.ts | 56 --- .../theme/src/client/composables/index.ts | 16 - .../theme/src/client/composables/navLink.ts | 16 - .../theme/src/client/composables/navbar.ts | 128 ------- .../theme/src/client/composables/postIndex.ts | 47 --- .../theme/src/client/composables/postList.ts | 45 --- .../theme/src/client/composables/postStat.ts | 31 -- .../composables/resolveRouteWithRedirect.ts | 26 -- .../src/client/composables/scrollPromise.ts | 21 -- .../src/client/composables/sidebarIndex.ts | 49 --- packages/theme/src/client/composables/tag.ts | 25 -- .../theme/src/client/composables/themeData.ts | 15 - packages/theme/src/client/config.ts | 38 +- packages/theme/src/client/index.ts | 1 - packages/theme/src/client/layouts/404.vue | 33 -- packages/theme/src/client/layouts/Layout.vue | 69 +--- .../theme/src/client/layouts/NotFound.vue | 3 + packages/theme/src/client/shim.d.ts | 16 - packages/theme/src/client/styles/_mixins.scss | 38 -- .../theme/src/client/styles/_variables.scss | 11 - packages/theme/src/client/styles/arrow.scss | 37 -- packages/theme/src/client/styles/code.scss | 282 --------------- packages/theme/src/client/styles/icons.scss | 4 - packages/theme/src/client/styles/index.scss | 13 - packages/theme/src/client/styles/layout.scss | 13 - .../theme/src/client/styles/normalize.scss | 187 ---------- packages/theme/src/client/styles/toc.scss | 63 ---- .../theme/src/client/styles/transition.scss | 30 -- .../theme/src/client/styles/vars-dark.scss | 46 --- packages/theme/src/client/styles/vars.scss | 129 ------- packages/theme/src/client/utils/animate.ts | 14 - packages/theme/src/client/utils/check.ts | 3 - packages/theme/src/client/utils/color.ts | 24 -- packages/theme/src/client/utils/dom.ts | 65 ---- packages/theme/src/client/utils/index.ts | 5 - packages/theme/src/client/utils/path.ts | 3 - .../theme/src/client/utils/resolveRepoType.ts | 11 - packages/theme/src/node/alias.ts | 14 - packages/theme/src/node/autoFrontmatter.ts | 36 ++ packages/theme/src/node/createPage/archive.ts | 18 - .../theme/src/node/createPage/category.ts | 18 - packages/theme/src/node/createPage/index.ts | 14 - packages/theme/src/node/createPage/note.ts | 0 packages/theme/src/node/createPage/tag.ts | 18 - .../theme/src/node/defaultLocaleOption.ts | 11 - .../src/node/{define.ts => defineConfig.ts} | 0 packages/theme/src/node/extendsPage.ts | 60 ---- .../theme/src/node/generateFrontmatter.ts | 143 -------- packages/theme/src/node/index.ts | 22 +- packages/theme/src/node/plugins.ts | 146 ++++++++ .../src/node/plugins/activeHeaderLink.ts | 11 - .../theme/src/node/plugins/baiduTongji.ts | 12 - packages/theme/src/node/plugins/caniuse.ts | 12 - packages/theme/src/node/plugins/comment.ts | 9 - packages/theme/src/node/plugins/copyCode.ts | 18 - .../src/node/plugins/externalLinkIcon.ts | 25 -- packages/theme/src/node/plugins/git.ts | 14 - packages/theme/src/node/plugins/index.ts | 46 --- .../theme/src/node/plugins/markdownEnhance.ts | 24 -- packages/theme/src/node/plugins/mediumZoom.ts | 12 - packages/theme/src/node/plugins/nprogress.ts | 8 - packages/theme/src/node/plugins/palette.ts | 6 - packages/theme/src/node/plugins/prismjs.ts | 8 - packages/theme/src/node/plugins/search.ts | 14 - packages/theme/src/node/plugins/seo.ts | 20 -- packages/theme/src/node/plugins/sitemap.ts | 19 - packages/theme/src/node/plugins/themeData.ts | 8 - packages/theme/src/node/prepared/index.ts | 21 -- packages/theme/src/node/prepared/postIndex.ts | 87 ----- .../theme/src/node/prepared/sidebarIndex.ts | 177 ---------- packages/theme/src/node/shims.d.ts | 5 - packages/theme/src/node/theme.ts | 63 ++-- packages/theme/src/node/utils/date.ts | 12 - packages/theme/src/node/utils/index.ts | 3 - packages/theme/src/node/utils/path.ts | 15 - packages/theme/src/node/utils/readFileList.ts | 44 --- .../{frontmatter/post.ts => frontmatter.ts} | 9 +- packages/theme/src/shared/frontmatter/home.ts | 18 - .../theme/src/shared/frontmatter/index.ts | 3 - .../theme/src/shared/frontmatter/normal.ts | 3 - packages/theme/src/shared/index.ts | 6 +- packages/theme/src/shared/layout/index.ts | 3 - packages/theme/src/shared/layout/navbar.ts | 22 -- packages/theme/src/shared/layout/sidebar.ts | 7 - .../src/shared/{options/notes.ts => note.ts} | 0 packages/theme/src/shared/options/index.ts | 19 +- packages/theme/src/shared/options/locale.ts | 9 +- packages/theme/src/shared/options/options.ts | 14 - .../shared/options/{plugin.ts => plugins.ts} | 3 + packages/theme/src/shared/page.ts | 3 - packages/theme/src/shared/post.ts | 22 -- .../index.build.html => templates/build.html} | 14 +- pnpm-lock.yaml | 185 +++++++++- tsconfig.json | 3 + 198 files changed, 1213 insertions(+), 6558 deletions(-) rename packages/{theme => plugin-auto-frontmatter}/LICENSE (100%) create mode 100644 packages/plugin-auto-frontmatter/README.md create mode 100644 packages/plugin-auto-frontmatter/package.json create mode 100644 packages/plugin-auto-frontmatter/src/node/env.d.ts create mode 100644 packages/plugin-auto-frontmatter/src/node/index.ts create mode 100644 packages/plugin-auto-frontmatter/src/node/plugin.ts create mode 100644 packages/plugin-auto-frontmatter/src/node/readFiles.ts create mode 100644 packages/plugin-auto-frontmatter/src/shared/index.ts create mode 100644 packages/plugin-auto-frontmatter/tsconfig.build.json create mode 100644 packages/plugin-blog-data/LICENSE create mode 100644 packages/plugin-blog-data/package.json create mode 100644 packages/plugin-blog-data/src/client/blogPostData.d.ts create mode 100644 packages/plugin-blog-data/src/client/composables/index.ts create mode 100644 packages/plugin-blog-data/src/client/composables/useBlogPostData.ts create mode 100644 packages/plugin-blog-data/src/client/config.ts create mode 100644 packages/plugin-blog-data/src/client/index.ts create mode 100644 packages/plugin-blog-data/src/node/env.d.ts create mode 100644 packages/plugin-blog-data/src/node/index.ts create mode 100644 packages/plugin-blog-data/src/node/plugin.ts create mode 100644 packages/plugin-blog-data/src/node/prepareBlogData.ts create mode 100644 packages/plugin-blog-data/src/shared/index.ts create mode 100644 packages/plugin-blog-data/tsconfig.build.json delete mode 100644 packages/theme/CHANGELOG.md delete mode 100644 packages/theme/src/client/components/Archive.vue delete mode 100644 packages/theme/src/client/components/AsideNavbar.vue delete mode 100644 packages/theme/src/client/components/AutoLink.vue delete mode 100644 packages/theme/src/client/components/BackToTop.vue delete mode 100644 packages/theme/src/client/components/BlogInfo.vue delete mode 100644 packages/theme/src/client/components/BloggerInfo.vue delete mode 100644 packages/theme/src/client/components/Category.vue delete mode 100644 packages/theme/src/client/components/CategoryGroup.vue delete mode 100644 packages/theme/src/client/components/DarkModeButton.vue delete mode 100644 packages/theme/src/client/components/DropdownTransition.vue delete mode 100644 packages/theme/src/client/components/HomeBigBanner.vue delete mode 100644 packages/theme/src/client/components/Navbar.vue delete mode 100644 packages/theme/src/client/components/NavbarBrand.vue delete mode 100644 packages/theme/src/client/components/NavbarDropdown.vue delete mode 100644 packages/theme/src/client/components/NavbarItems.vue delete mode 100644 packages/theme/src/client/components/Page.vue delete mode 100644 packages/theme/src/client/components/PageFooter.vue delete mode 100644 packages/theme/src/client/components/Pagination.vue delete mode 100644 packages/theme/src/client/components/PostItem.vue delete mode 100644 packages/theme/src/client/components/PostList.vue delete mode 100644 packages/theme/src/client/components/PostMeta.vue delete mode 100644 packages/theme/src/client/components/Sidebar.vue delete mode 100644 packages/theme/src/client/components/SidebarItems.vue delete mode 100644 packages/theme/src/client/components/Tag.vue delete mode 100644 packages/theme/src/client/components/Toc.ts delete mode 100644 packages/theme/src/client/components/ToggleSidebarButton.vue delete mode 100644 packages/theme/src/client/components/global/Badge.vue delete mode 100644 packages/theme/src/client/components/icons/IconBase.ts delete mode 100644 packages/theme/src/client/components/icons/icon.ts delete mode 100644 packages/theme/src/client/components/icons/index.ts delete mode 100644 packages/theme/src/client/components/icons/socialIcon.ts delete mode 100644 packages/theme/src/client/composables/archive.ts delete mode 100644 packages/theme/src/client/composables/asideNavbar.ts delete mode 100644 packages/theme/src/client/composables/blogger.ts delete mode 100644 packages/theme/src/client/composables/category.ts delete mode 100644 packages/theme/src/client/composables/darkMode.ts delete mode 100644 packages/theme/src/client/composables/index.ts delete mode 100644 packages/theme/src/client/composables/navLink.ts delete mode 100644 packages/theme/src/client/composables/navbar.ts delete mode 100644 packages/theme/src/client/composables/postIndex.ts delete mode 100644 packages/theme/src/client/composables/postList.ts delete mode 100644 packages/theme/src/client/composables/postStat.ts delete mode 100644 packages/theme/src/client/composables/resolveRouteWithRedirect.ts delete mode 100644 packages/theme/src/client/composables/scrollPromise.ts delete mode 100644 packages/theme/src/client/composables/sidebarIndex.ts delete mode 100644 packages/theme/src/client/composables/tag.ts delete mode 100644 packages/theme/src/client/composables/themeData.ts delete mode 100644 packages/theme/src/client/layouts/404.vue create mode 100644 packages/theme/src/client/layouts/NotFound.vue delete mode 100644 packages/theme/src/client/styles/_mixins.scss delete mode 100644 packages/theme/src/client/styles/_variables.scss delete mode 100644 packages/theme/src/client/styles/arrow.scss delete mode 100644 packages/theme/src/client/styles/code.scss delete mode 100644 packages/theme/src/client/styles/icons.scss delete mode 100644 packages/theme/src/client/styles/index.scss delete mode 100644 packages/theme/src/client/styles/layout.scss delete mode 100644 packages/theme/src/client/styles/normalize.scss delete mode 100644 packages/theme/src/client/styles/toc.scss delete mode 100644 packages/theme/src/client/styles/transition.scss delete mode 100644 packages/theme/src/client/styles/vars-dark.scss delete mode 100644 packages/theme/src/client/styles/vars.scss delete mode 100644 packages/theme/src/client/utils/animate.ts delete mode 100644 packages/theme/src/client/utils/check.ts delete mode 100644 packages/theme/src/client/utils/color.ts delete mode 100644 packages/theme/src/client/utils/dom.ts delete mode 100644 packages/theme/src/client/utils/index.ts delete mode 100644 packages/theme/src/client/utils/path.ts delete mode 100644 packages/theme/src/client/utils/resolveRepoType.ts delete mode 100644 packages/theme/src/node/alias.ts create mode 100644 packages/theme/src/node/autoFrontmatter.ts delete mode 100644 packages/theme/src/node/createPage/archive.ts delete mode 100644 packages/theme/src/node/createPage/category.ts delete mode 100644 packages/theme/src/node/createPage/index.ts delete mode 100644 packages/theme/src/node/createPage/note.ts delete mode 100644 packages/theme/src/node/createPage/tag.ts delete mode 100644 packages/theme/src/node/defaultLocaleOption.ts rename packages/theme/src/node/{define.ts => defineConfig.ts} (100%) delete mode 100644 packages/theme/src/node/extendsPage.ts delete mode 100644 packages/theme/src/node/generateFrontmatter.ts create mode 100644 packages/theme/src/node/plugins.ts delete mode 100644 packages/theme/src/node/plugins/activeHeaderLink.ts delete mode 100644 packages/theme/src/node/plugins/baiduTongji.ts delete mode 100644 packages/theme/src/node/plugins/caniuse.ts delete mode 100644 packages/theme/src/node/plugins/comment.ts delete mode 100644 packages/theme/src/node/plugins/copyCode.ts delete mode 100644 packages/theme/src/node/plugins/externalLinkIcon.ts delete mode 100644 packages/theme/src/node/plugins/git.ts delete mode 100644 packages/theme/src/node/plugins/index.ts delete mode 100644 packages/theme/src/node/plugins/markdownEnhance.ts delete mode 100644 packages/theme/src/node/plugins/mediumZoom.ts delete mode 100644 packages/theme/src/node/plugins/nprogress.ts delete mode 100644 packages/theme/src/node/plugins/palette.ts delete mode 100644 packages/theme/src/node/plugins/prismjs.ts delete mode 100644 packages/theme/src/node/plugins/search.ts delete mode 100644 packages/theme/src/node/plugins/seo.ts delete mode 100644 packages/theme/src/node/plugins/sitemap.ts delete mode 100644 packages/theme/src/node/plugins/themeData.ts delete mode 100644 packages/theme/src/node/prepared/index.ts delete mode 100644 packages/theme/src/node/prepared/postIndex.ts delete mode 100644 packages/theme/src/node/prepared/sidebarIndex.ts delete mode 100644 packages/theme/src/node/shims.d.ts delete mode 100644 packages/theme/src/node/utils/date.ts delete mode 100644 packages/theme/src/node/utils/index.ts delete mode 100644 packages/theme/src/node/utils/path.ts delete mode 100644 packages/theme/src/node/utils/readFileList.ts rename packages/theme/src/shared/{frontmatter/post.ts => frontmatter.ts} (59%) delete mode 100644 packages/theme/src/shared/frontmatter/home.ts delete mode 100644 packages/theme/src/shared/frontmatter/index.ts delete mode 100644 packages/theme/src/shared/frontmatter/normal.ts delete mode 100644 packages/theme/src/shared/layout/index.ts delete mode 100644 packages/theme/src/shared/layout/navbar.ts delete mode 100644 packages/theme/src/shared/layout/sidebar.ts rename packages/theme/src/shared/{options/notes.ts => note.ts} (100%) delete mode 100644 packages/theme/src/shared/options/options.ts rename packages/theme/src/shared/options/{plugin.ts => plugins.ts} (98%) delete mode 100644 packages/theme/src/shared/page.ts delete mode 100644 packages/theme/src/shared/post.ts rename packages/theme/{template/index.build.html => templates/build.html} (53%) diff --git a/.gitignore b/.gitignore index aaf239c5..93fb9036 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,5 @@ dist/ *.log *.tsbuildinfo .mind + +packages/theme-back diff --git a/.vscode/settings.json b/.vscode/settings.json index d5ec9547..3db9580f 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -24,6 +24,7 @@ "composables", "Docsearch", "esbuild", + "frontmatter", "gsap", "iarna", "leancloud", diff --git a/docs/.vuepress/config.ts b/docs/.vuepress/config.ts index 262f6920..fc75ef62 100644 --- a/docs/.vuepress/config.ts +++ b/docs/.vuepress/config.ts @@ -1,5 +1,5 @@ import * as path from 'path' -import { themePlume } from '@vuepress-plume/vuepress-theme-plume' +import themePlume from '@vuepress-plume/vuepress-theme-plume' import { viteBundler } from '@vuepress/bundler-vite' import { webpackBundler } from '@vuepress/bundler-webpack' import { defineUserConfig } from '@vuepress/cli' diff --git a/docs/1.前端/1.基础/BFC 块级格式化上下文.md b/docs/1.前端/1.基础/BFC 块级格式化上下文.md index e30eb547..56313fa1 100644 --- a/docs/1.前端/1.基础/BFC 块级格式化上下文.md +++ b/docs/1.前端/1.基础/BFC 块级格式化上下文.md @@ -1,10 +1,10 @@ --- title: BFC 块级格式化上下文 -createTime: 2018/05/17 12:28:33 +createTime: 2022-03-26T11:46:50.024Z permalink: /article/o5g7ggvf author: pengzhanbo top: false -tags: +tags: - html type: null --- @@ -35,4 +35,4 @@ BFC, Block Formating Context。是 W3C CSS2.1规范中的一个概念。 是页 1. 同一个BFC的外边距会发生折叠(合并), 通过将其放在不同的BFC中规避折叠。 2. BFC可以包含浮动元素,即清除浮动。 -3. BFC可以阻止元素被浮动元素覆盖。 \ No newline at end of file +3. BFC可以阻止元素被浮动元素覆盖。 diff --git a/docs/1.前端/1.基础/CSS at-rule.md b/docs/1.前端/1.基础/CSS at-rule.md index 6d7bbbc0..02c6be7b 100644 --- a/docs/1.前端/1.基础/CSS at-rule.md +++ b/docs/1.前端/1.基础/CSS at-rule.md @@ -1,9 +1,9 @@ --- title: CSS At-Rules -createTime: 2018/10/06 08:16:38 +createTime: 2022-03-26T11:46:50.024Z permalink: /article/btkqop1a author: pengzhanbo -tags: +tags: - css top: false type: null @@ -160,4 +160,4 @@ type: null ## @media -媒体查询,详见 [CSS @media 媒体查询](/post/fe5ruia1/) \ No newline at end of file +媒体查询,详见 [CSS @media 媒体查询](/post/fe5ruia1/) diff --git a/docs/1.前端/1.基础/CSS media媒体查询.md b/docs/1.前端/1.基础/CSS media媒体查询.md index eb4c18fd..55eb4e63 100644 --- a/docs/1.前端/1.基础/CSS media媒体查询.md +++ b/docs/1.前端/1.基础/CSS media媒体查询.md @@ -1,9 +1,9 @@ --- title: CSS 媒体查询 -createTime: 2018/08/18 08:43:02 +createTime: 2022-03-26T11:46:50.024Z permalink: /article/fe5ruia1 author: pengzhanbo -tags: +tags: - css top: false type: null diff --git a/docs/1.前端/1.基础/CSS选择器.md b/docs/1.前端/1.基础/CSS选择器.md index c1ef7350..1eb5d687 100644 --- a/docs/1.前端/1.基础/CSS选择器.md +++ b/docs/1.前端/1.基础/CSS选择器.md @@ -1,9 +1,9 @@ --- title: CSS选择器 -createTime: 2018/09/20 03:29:20 +createTime: 2022-03-26T11:46:50.024Z permalink: /article/8vev8ixl author: pengzhanbo -tags: +tags: - css top: false type: null @@ -644,4 +644,4 @@ type: null } ... -``` \ No newline at end of file +``` diff --git a/docs/1.前端/1.基础/DOCTYPE 文档类型声明.md b/docs/1.前端/1.基础/DOCTYPE 文档类型声明.md index 331d0e65..282a12ea 100644 --- a/docs/1.前端/1.基础/DOCTYPE 文档类型声明.md +++ b/docs/1.前端/1.基础/DOCTYPE 文档类型声明.md @@ -1,9 +1,9 @@ --- title: 文档类型声明 -createTime: 2018/03/14 01:06:52 +createTime: 2022-03-26T11:46:50.025Z permalink: /article/s8udp6vp author: pengzhanbo -tags: +tags: - html top: false type: null @@ -105,4 +105,4 @@ http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> ``` html -``` \ No newline at end of file +``` diff --git a/docs/1.前端/1.基础/HTML5新特性.md b/docs/1.前端/1.基础/HTML5新特性.md index 4f2791af..7d2b1be1 100644 --- a/docs/1.前端/1.基础/HTML5新特性.md +++ b/docs/1.前端/1.基础/HTML5新特性.md @@ -1,9 +1,9 @@ --- title: HTML5新特性 -createTime: 2018/02/17 12:49:58 +createTime: 2022-03-26T11:46:50.025Z permalink: /article/8rv45yuy author: pengzhanbo -tags: +tags: - html top: false type: null @@ -272,4 +272,4 @@ history.replaceState({}, 'bar', 'bar.html') }) ``` -[History API - Web API 接口参考 | MDN](https://developer.mozilla.org/zh-CN/docs/Web/API/History_API) \ No newline at end of file +[History API - Web API 接口参考 | MDN](https://developer.mozilla.org/zh-CN/docs/Web/API/History_API) diff --git a/docs/1.前端/1.基础/WebComponent-template.md b/docs/1.前端/1.基础/WebComponent-template.md index c941a8b2..29fff30f 100644 --- a/docs/1.前端/1.基础/WebComponent-template.md +++ b/docs/1.前端/1.基础/WebComponent-template.md @@ -1,10 +1,10 @@ --- title: WebComponent——template lang: zh-CN -tags: +tags: - html - javascript -createTime: 2018/8/2 11:15:27 +createTime: 2022-03-26T11:46:50.025Z permalink: /article/5fmy4kla author: pengzhanbo top: false diff --git a/docs/1.前端/1.基础/WebComponent自定义元素.md b/docs/1.前端/1.基础/WebComponent自定义元素.md index 2012d504..e122af64 100644 --- a/docs/1.前端/1.基础/WebComponent自定义元素.md +++ b/docs/1.前端/1.基础/WebComponent自定义元素.md @@ -1,9 +1,9 @@ --- title: WebComponent——custom elements -tags: +tags: - html - javascript -createTime: 2018/08/01 11:15:27 +createTime: 2022-03-26T11:46:50.025Z permalink: /article/m63fd7lf author: pengzhanbo top: false diff --git a/docs/1.前端/1.基础/meta 标签说明.md b/docs/1.前端/1.基础/meta 标签说明.md index a918dfea..eb14ea54 100644 --- a/docs/1.前端/1.基础/meta 标签说明.md +++ b/docs/1.前端/1.基础/meta 标签说明.md @@ -1,9 +1,9 @@ --- title: meta 标签说明 -createTime: 2018/03/15 01:21:48 +createTime: 2022-03-26T11:46:50.025Z permalink: /article/bp1nxjs6 author: pengzhanbo -tags: +tags: - html top: false type: null @@ -216,4 +216,4 @@ content="app-id=APP_ID,affiliate-data=AFFILIATE_ID,app-argument=SOME_TEXT"> -``` \ No newline at end of file +``` diff --git a/docs/1.前端/1.基础/原型链与继承.md b/docs/1.前端/1.基础/原型链与继承.md index 250080fa..a89dcaf8 100644 --- a/docs/1.前端/1.基础/原型链与继承.md +++ b/docs/1.前端/1.基础/原型链与继承.md @@ -1,9 +1,9 @@ --- title: 继承与原型链 -createTime: 2018/07/06 09:40:54 +createTime: 2022-03-26T13:40:54.727Z permalink: /article/extends-prototype author: pengzhanbo -tags: +tags: - javascript top: false type: null diff --git a/docs/1.前端/1.基础/正则表达式使用手册.md b/docs/1.前端/1.基础/正则表达式使用手册.md index 05b2e8de..3fb9556b 100644 --- a/docs/1.前端/1.基础/正则表达式使用手册.md +++ b/docs/1.前端/1.基础/正则表达式使用手册.md @@ -1,10 +1,10 @@ --- title: 正则表达式 lang: zh-CN -createTime: 2018/11/26 11:15:27 +createTime: 2022-03-26T11:46:50.025Z permalink: /article/e8qbp0dh author: pengzhanbo -tags: +tags: - javascript top: false type: null diff --git a/docs/1.前端/1.基础/浏览器端的事件循环.md b/docs/1.前端/1.基础/浏览器端的事件循环.md index 40300585..8cc786e5 100644 --- a/docs/1.前端/1.基础/浏览器端的事件循环.md +++ b/docs/1.前端/1.基础/浏览器端的事件循环.md @@ -1,8 +1,9 @@ --- title: Event Loop 浏览器端的事件循环 -createTime: 2021/06/03 01:53:17 +createTime: 2022-03-26T11:46:50.000Z permalink: /article/browser-event-loop author: pengzhanbo top: false type: null --- + diff --git a/docs/1.前端/1.基础/详解Promise.md b/docs/1.前端/1.基础/详解Promise.md index 91aba9b0..cf8b94ed 100644 --- a/docs/1.前端/1.基础/详解Promise.md +++ b/docs/1.前端/1.基础/详解Promise.md @@ -1,6 +1,6 @@ --- title: 详解 Promise -createTime: 2020/11/22 12:58:28 +createTime: 2022-03-26T11:46:50.026Z permalink: /article/q40nq4hv author: pengzhanbo sticky: true diff --git a/docs/1.前端/10.开发/1px解决方案.md b/docs/1.前端/10.开发/1px解决方案.md index 786cf2cc..668648aa 100644 --- a/docs/1.前端/10.开发/1px解决方案.md +++ b/docs/1.前端/10.开发/1px解决方案.md @@ -1,9 +1,9 @@ --- title: 1px解决方案 -createTime: 2019/05/15 10:41:32 +createTime: 2022-03-26T11:46:50.026Z permalink: /article/tz7ncicn author: pengzhanbo -tags: +tags: - html - css - develop diff --git a/docs/1.前端/10.开发/lerna使用.md b/docs/1.前端/10.开发/lerna使用.md index c95ad70b..60c7ec73 100644 --- a/docs/1.前端/10.开发/lerna使用.md +++ b/docs/1.前端/10.开发/lerna使用.md @@ -1,6 +1,6 @@ --- title: lerna使用 -createTime: 2021/11/26 06:28:37 +createTime: 2022-03-26T11:46:50.027Z permalink: /article/i1wc1uld author: pengzhanbo top: false @@ -118,4 +118,4 @@ lerna run build # 相当于在 package1、package2 中执行 npm run build ``` ### lerna clean - 删除所有包的node_modules \ No newline at end of file + 删除所有包的node_modules diff --git a/docs/1.前端/10.开发/移动端适配方案.md b/docs/1.前端/10.开发/移动端适配方案.md index 057db3f8..2e51ef4e 100644 --- a/docs/1.前端/10.开发/移动端适配方案.md +++ b/docs/1.前端/10.开发/移动端适配方案.md @@ -1,9 +1,9 @@ --- title: 移动端适配方案 -createTime: 2020/08/14 01:54:29 +createTime: 2022-03-26T11:46:50.027Z permalink: /article/vhpmovsm author: pengzhanbo -tags: +tags: - develop top: false type: null @@ -108,4 +108,4 @@ css像素是一个抽象单位,主要用在浏览器上,用来精确的度 1. 容器适配 2. 文本适配 3. 大于1px的边框、圆角、阴影 -4. 内边距和外边距 \ No newline at end of file +4. 内边距和外边距 diff --git a/docs/1.前端/2.工具/Jenkinss使用.md b/docs/1.前端/2.工具/Jenkinss使用.md index dad69fdb..477a7864 100644 --- a/docs/1.前端/2.工具/Jenkinss使用.md +++ b/docs/1.前端/2.工具/Jenkinss使用.md @@ -1,10 +1,10 @@ --- title: Jenkins 使用 lang: zh-CN -createTime: 2018/09/16 11:15:27 +createTime: 2022-03-26T11:46:50.027Z permalink: /article/bmtl5ah4 author: pengzhanbo -tags: +tags: - 工具 top: false type: null diff --git a/docs/1.前端/2.工具/caniuse.md b/docs/1.前端/2.工具/caniuse.md index 17a17fad..92f103e5 100644 --- a/docs/1.前端/2.工具/caniuse.md +++ b/docs/1.前端/2.工具/caniuse.md @@ -1,6 +1,6 @@ --- title: caniuse -createTime: 2021/02/07 06:41:12 +createTime: 2022-03-26T11:46:50.027Z permalink: /article/h4z91gyz author: pengzhanbo top: false @@ -10,4 +10,4 @@ type: null ### 工具 将caniuse 的feature 结果,以图片或者iframe的形式,嵌入到站点。 -[https://caniuse.bitsofco.de/](https://caniuse.bitsofco.de/) \ No newline at end of file +[https://caniuse.bitsofco.de/](https://caniuse.bitsofco.de/) diff --git a/docs/1.前端/2.工具/vsCode插件推荐.md b/docs/1.前端/2.工具/vsCode插件推荐.md index 37900877..9dd50a33 100644 --- a/docs/1.前端/2.工具/vsCode插件推荐.md +++ b/docs/1.前端/2.工具/vsCode插件推荐.md @@ -1,10 +1,10 @@ --- title: VSCode 常用插件推荐 lang: zh-CN -createTime: 2018/12/29 11:15:27 +createTime: 2022-03-26T11:46:50.027Z permalink: /article/ofp08jd8 author: pengzhanbo -tags: +tags: - VSCode top: false type: null diff --git a/docs/1.前端/3.Vue/Vue组件间通信.md b/docs/1.前端/3.Vue/Vue组件间通信.md index 9203fdc4..990a45a7 100644 --- a/docs/1.前端/3.Vue/Vue组件间通信.md +++ b/docs/1.前端/3.Vue/Vue组件间通信.md @@ -1,9 +1,9 @@ --- title: Vue组件间通信 lang: zh-CN -tags: +tags: - vue -createTime: 2018/07/20 11:15:27 +createTime: 2022-03-26T11:46:50.028Z permalink: /article/iezlvhvg author: pengzhanbo top: false diff --git a/docs/10.面试/面试2.md b/docs/10.面试/面试2.md index d5f34b0a..9d88785a 100644 --- a/docs/10.面试/面试2.md +++ b/docs/10.面试/面试2.md @@ -1,6 +1,6 @@ --- title: 面试2 -createTime: 2022/04/04 01:48:00 +createTime: 2022-04-03T17:48:00.400Z author: pengzhanbo permalink: /article/exavsmm1 --- diff --git a/docs/10.面试/面试题-JS篇.md b/docs/10.面试/面试题-JS篇.md index a849db66..7f208078 100644 --- a/docs/10.面试/面试题-JS篇.md +++ b/docs/10.面试/面试题-JS篇.md @@ -1,8 +1,8 @@ --- title: 面试题以及个人答案 JS篇 -tags: +tags: - 面试 -createTime: 2018/08/23 11:15:27 +createTime: 2022-03-26T11:46:50.028Z permalink: /article/4ml7z17g author: pengzhanbo top: false diff --git a/docs/10.面试/面试题—css篇.md b/docs/10.面试/面试题—css篇.md index 1a506875..fcbdc997 100644 --- a/docs/10.面试/面试题—css篇.md +++ b/docs/10.面试/面试题—css篇.md @@ -1,8 +1,8 @@ --- title: 面试题以及个人答案 CSS篇 -tags: +tags: - 面试 -createTime: 2018/08/22 11:15:27 +createTime: 2022-03-26T11:46:50.028Z permalink: /article/565o1wn0 author: pengzhanbo top: false diff --git a/docs/README.md b/docs/README.md index 219152e7..45bbc3fd 100644 --- a/docs/README.md +++ b/docs/README.md @@ -2,4 +2,7 @@ home: true banner: /images/big-banner.jpg motto: 世间的美好总是不期而遇,恬静而自然。 +author: pengzhanbo +createTime: '2022/03/26 07:46:50' --- + diff --git a/docs/notes/README.md b/docs/notes/README.md index f8c8781d..111b5538 100644 --- a/docs/notes/README.md +++ b/docs/notes/README.md @@ -1,6 +1,7 @@ --- title: README -createTime: 2022/04/04 11:13:30 +createTime: '2022/04/04 11:13:30' author: pengzhanbo permalink: /note/ --- + diff --git a/docs/notes/vuepress-plugin/caniuse/README.md b/docs/notes/vuepress-plugin/caniuse/README.md index 8efb2716..fa7666ae 100644 --- a/docs/notes/vuepress-plugin/caniuse/README.md +++ b/docs/notes/vuepress-plugin/caniuse/README.md @@ -1,6 +1,6 @@ --- title: plugin-caniuse -createTime: 2022/05/13 01:02:51 +createTime: '2022/05/13 01:02:51' author: pengzhanbo permalink: /note/vuepress-plugin/caniuse/ --- diff --git a/docs/notes/vuepress-plugin/netlify-functions/API.md b/docs/notes/vuepress-plugin/netlify-functions/API.md index 59198b1a..86c3a54d 100644 --- a/docs/notes/vuepress-plugin/netlify-functions/API.md +++ b/docs/notes/vuepress-plugin/netlify-functions/API.md @@ -1,6 +1,6 @@ --- title: API -createTime: 2022/05/13 05:49:14 +createTime: 2022-05-14T10:43:53.200Z author: pengzhanbo permalink: /note/vuepress-plugin/netlify-functions/api/ --- diff --git a/docs/notes/vuepress-plugin/netlify-functions/README.md b/docs/notes/vuepress-plugin/netlify-functions/README.md index ea7df1bb..3f5052d0 100644 --- a/docs/notes/vuepress-plugin/netlify-functions/README.md +++ b/docs/notes/vuepress-plugin/netlify-functions/README.md @@ -1,6 +1,6 @@ --- title: 指南 -createTime: 2022/05/13 01:28:38 +createTime: '2022/05/13 01:28:38' author: pengzhanbo permalink: /note/vuepress-plugin/netlify-functions/ --- diff --git a/docs/notes/vuepress-plugin/netlify-functions/functions开发指南.md b/docs/notes/vuepress-plugin/netlify-functions/functions开发指南.md index 6e8cbde5..87d4a4fa 100644 --- a/docs/notes/vuepress-plugin/netlify-functions/functions开发指南.md +++ b/docs/notes/vuepress-plugin/netlify-functions/functions开发指南.md @@ -1,6 +1,6 @@ --- title: functions开发指南 -createTime: 2022/05/13 05:45:24 +createTime: 2022-05-14T10:43:53.201Z author: pengzhanbo permalink: /note/vuepress-plugin/netlify-functions/develop-functions/ --- diff --git a/docs/notes/vuepress-plugin/netlify-functions/介绍.md b/docs/notes/vuepress-plugin/netlify-functions/介绍.md index 758be541..9de4ad9c 100644 --- a/docs/notes/vuepress-plugin/netlify-functions/介绍.md +++ b/docs/notes/vuepress-plugin/netlify-functions/介绍.md @@ -1,6 +1,6 @@ --- title: 介绍 -createTime: 2022/05/13 05:47:06 +createTime: 2022-05-14T10:43:53.202Z author: pengzhanbo permalink: /note/vuepress-plugin/netlify-functions/intro/ --- diff --git a/docs/notes/vuepress-plugin/netlify-functions/使用.md b/docs/notes/vuepress-plugin/netlify-functions/使用.md index cd193237..158e05d0 100644 --- a/docs/notes/vuepress-plugin/netlify-functions/使用.md +++ b/docs/notes/vuepress-plugin/netlify-functions/使用.md @@ -1,6 +1,6 @@ --- title: 使用 -createTime: 2022/05/13 05:45:01 +createTime: 2022-05-14T10:43:53.203Z author: pengzhanbo permalink: /note/vuepress-plugin/netlify-functions/usage/ --- diff --git a/docs/notes/vuepress-plugin/netlify-functions/功能.md b/docs/notes/vuepress-plugin/netlify-functions/功能.md index 9f6ec622..fbd035cc 100644 --- a/docs/notes/vuepress-plugin/netlify-functions/功能.md +++ b/docs/notes/vuepress-plugin/netlify-functions/功能.md @@ -1,6 +1,6 @@ --- title: 功能 -createTime: 2022/05/13 05:45:11 +createTime: 2022-05-14T10:43:53.204Z author: pengzhanbo permalink: /note/vuepress-plugin/netlify-functions/feature/ --- diff --git a/docs/notes/vuepress-theme-plume/README.md b/docs/notes/vuepress-theme-plume/README.md index e1727a2c..0dfb6a9d 100644 --- a/docs/notes/vuepress-theme-plume/README.md +++ b/docs/notes/vuepress-theme-plume/README.md @@ -1,6 +1,6 @@ --- title: vuepress-theme-plume -createTime: 2022/04/08 08:52:12 +createTime: '2022/04/08 08:52:12' author: pengzhanbo permalink: /note/vuepress-theme-plume/ article: true diff --git a/docs/notes/vuepress-theme-plume/markdown增强.md b/docs/notes/vuepress-theme-plume/markdown增强.md index 789f80dd..e56591d7 100644 --- a/docs/notes/vuepress-theme-plume/markdown增强.md +++ b/docs/notes/vuepress-theme-plume/markdown增强.md @@ -1,6 +1,6 @@ --- title: markdown增强 -createTime: 2022/04/09 06:43:32 +createTime: 2022-05-14T10:43:53.216Z author: pengzhanbo permalink: /note/vuepress-theme-plume/markdown-enhance/ --- diff --git a/docs/notes/vuepress-theme-plume/notes配置.md b/docs/notes/vuepress-theme-plume/notes配置.md index fce08199..f0dd24ff 100644 --- a/docs/notes/vuepress-theme-plume/notes配置.md +++ b/docs/notes/vuepress-theme-plume/notes配置.md @@ -1,6 +1,6 @@ --- title: notes配置 -createTime: 2022/04/09 02:48:41 +createTime: 2022-05-14T10:43:53.218Z author: pengzhanbo permalink: /note/vuepress-theme-plume/notes-config/ --- diff --git a/docs/notes/vuepress-theme-plume/主题插件配置.md b/docs/notes/vuepress-theme-plume/主题插件配置.md index 7eb84cdd..f5b92eca 100644 --- a/docs/notes/vuepress-theme-plume/主题插件配置.md +++ b/docs/notes/vuepress-theme-plume/主题插件配置.md @@ -1,6 +1,6 @@ --- title: 主题插件配置 -createTime: 2022/04/09 02:48:30 +createTime: 2022-05-14T10:43:53.219Z author: pengzhanbo permalink: /note/vuepress-theme-plume/plugins-config/ --- diff --git a/docs/notes/vuepress-theme-plume/主题配置.md b/docs/notes/vuepress-theme-plume/主题配置.md index a685236c..5f1f701a 100644 --- a/docs/notes/vuepress-theme-plume/主题配置.md +++ b/docs/notes/vuepress-theme-plume/主题配置.md @@ -1,6 +1,6 @@ --- title: 主题配置 -createTime: 2022/04/09 12:18:12 +createTime: 2022-05-14T10:43:53.219Z author: pengzhanbo permalink: /note/vuepress-theme-plume/theme-config/ --- diff --git a/docs/notes/vuepress-theme-plume/基础功能.md b/docs/notes/vuepress-theme-plume/基础功能.md index 208c1201..3dc9e537 100644 --- a/docs/notes/vuepress-theme-plume/基础功能.md +++ b/docs/notes/vuepress-theme-plume/基础功能.md @@ -1,6 +1,6 @@ --- title: 基础功能 -createTime: 2022/04/09 06:43:20 +createTime: 2022-05-14T10:43:53.220Z author: pengzhanbo permalink: /note/vuepress-theme-plume/basis-power/ --- diff --git a/docs/notes/vuepress-theme-plume/快速开始.md b/docs/notes/vuepress-theme-plume/快速开始.md index 0ca87d31..f9d08c91 100644 --- a/docs/notes/vuepress-theme-plume/快速开始.md +++ b/docs/notes/vuepress-theme-plume/快速开始.md @@ -1,6 +1,6 @@ --- title: 快速开始 -createTime: 2022/04/08 09:43:20 +createTime: 2022-05-14T10:43:53.221Z author: pengzhanbo permalink: /note/vuepress-theme-plume/quick-start/ --- diff --git a/docs/notes/vuepress-theme-plume/编写文章.md b/docs/notes/vuepress-theme-plume/编写文章.md index c5a1df40..b4e11e0d 100644 --- a/docs/notes/vuepress-theme-plume/编写文章.md +++ b/docs/notes/vuepress-theme-plume/编写文章.md @@ -1,6 +1,6 @@ --- title: 编写文章 -createTime: 2022/04/09 12:13:56 +createTime: 2022-05-14T10:43:53.221Z author: pengzhanbo permalink: /note/vuepress-theme-plume/write-article/ --- diff --git a/docs/notes/vuepress-theme-plume/页面配置.md b/docs/notes/vuepress-theme-plume/页面配置.md index 2ee0c7b8..0cd85e8c 100644 --- a/docs/notes/vuepress-theme-plume/页面配置.md +++ b/docs/notes/vuepress-theme-plume/页面配置.md @@ -1,6 +1,6 @@ --- title: 页面配置 -createTime: 2022/04/09 01:24:17 +createTime: 2022-05-14T10:43:53.222Z author: pengzhanbo permalink: /note/vuepress-theme-plume/page-config/ --- diff --git a/packages/theme/LICENSE b/packages/plugin-auto-frontmatter/LICENSE similarity index 100% rename from packages/theme/LICENSE rename to packages/plugin-auto-frontmatter/LICENSE diff --git a/packages/plugin-auto-frontmatter/README.md b/packages/plugin-auto-frontmatter/README.md new file mode 100644 index 00000000..89b1925c --- /dev/null +++ b/packages/plugin-auto-frontmatter/README.md @@ -0,0 +1,115 @@ +# `@vuepress-plume/vuepress-plugin-auto-frontmatter` + +自动生成 `*.md` 文件的 `frontmatter` 配置。 + +## Install +``` +yarn add @vuepress-plume/vuepress-plugin-auto-frontmatter +``` +## Usage +``` js +// .vuepress/config.js +import { autoFrontmatterPlugin } from '@vuepress-plume/vuepress-plugin-auto-frontmatter' +export default { + //... + plugins: [ + autoFrontmatterPlugin({ + formatter: { + createTime(formatTime, matter, file) { + if (formatTime) return formatTime + return file.createTime + } + } + }) + ] + // ... +} +``` + +## `autoFrontmatterPlugin([options])` + +### options + +`{ glob?: string | string[]; formatter: Formatter }` + +- `glob` + glob 匹配字符串或数组,匹配需要自动生成 `frontmatter` 的 md文件。 + 默认预设为 `['**/*.md', '!.vuepress/', '!node_modules/']`。 + 自定义匹配将被合并到预设配置中 + example: `['blog/**']` + +- `formatter` + 配置`frontmatter`每个字段的生成规则。 + ```ts + interface MarkdownFile { + filepath: string + relativePath: string + content: string + createTime: Date + } + + interface FormatterFn { + (value: T, data: K, file: MarkdownFile): T + } + + type FormatterObject = Record< + string, + FormatterFn + > + + type FormatterArray = { + glob: string + formatter: FormatterObject + }[] + + type Formatter = FormatterObject | FormatterArray + + /** + * formatterObj 对象中的 key 即为 frontmatter 配置中的key + * 其方法返回的值将作为 frontmatter[key] 的值 + * *.md + * --- + * createTime: 2022-03-26T11:46:50.000Z + * --- + */ + const formatterObj: Formatter = { + createTime(formatTime, matter, file) { + if (formatTime) return formatTime + return file.createTime + } + } + + const formatterArr: Formatter = [ + { + // 更精细化的匹配某个 md文件,支持glob 匹配字符串 + glob: '**/{README,index}.md', + // formatter 仅对 glob命中的文件有效 + formatter: { + home(value, matter, file) { + return value + } + }, + { + // 通配,如果文件没有被其他精细glob命中, + // 则使用 通配 formatter + // 如果是数组,必须有且用一个 glob为 * 的 项 + glob: '*', + formatter: { + title(title) { + return title || '默认标题' + } + } + } + } + ] + + ``` + +## Why ? + +- **为什么需要这个插件?** + + 有时候在开发一些主题时,期望使用户更专注于内容的编写,尽可能减少配置性的工作,可以将一些重复性的必要的配置 + 直接通过本插件自动生成。 + + 以及,我确实想在写新文章的时候,更少的做配置工作,于是便有了这个插件 diff --git a/packages/plugin-auto-frontmatter/package.json b/packages/plugin-auto-frontmatter/package.json new file mode 100644 index 00000000..701b3553 --- /dev/null +++ b/packages/plugin-auto-frontmatter/package.json @@ -0,0 +1,48 @@ +{ + "name": "@vuepress-plume/vuepress-plugin-auto-frontmatter", + "version": "1.0.0-beta.45", + "description": "The Plugin for VuePres 2", + "homepage": "https://github.com/pengzhanbo/vuepress-theme-plume#readme", + "bugs": { + "url": "https://github.com/pengzhanbo/vuepress-theme-plume/issues" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/pengzhanbo/vuepress-theme-plume.git" + }, + "license": "MIT", + "author": "pengzhanbo ", + "type": "module", + "exports": { + ".": "./lib/node/index.js", + "./package.json": "./package.json" + }, + "main": "lib/node/index.js", + "types": "./lib/node/index.d.ts", + "files": [ + "lib" + ], + "scripts": { + "build": "pnpm run clean && pnpm run copy && pnpm run ts", + "clean": "rimraf lib *.tsbuildinfo", + "copy": "cpx \"src/**/*.{d.ts,vue,css,scss,jpg,png}\" lib", + "ts": "tsc -b tsconfig.build.json" + }, + "dependencies": { + "@vuepress/core": "2.0.0-beta.51", + "@vuepress/shared": "2.0.0-beta.51", + "@vuepress/utils": "2.0.0-beta.51", + "chokidar": "^3.5.3", + "glob-to-regexp": "^0.4.1", + "gray-matter": "^4.0.3" + }, + "publishConfig": { + "access": "public" + }, + "keyword": [ + "VuePress", + "vuepress plugin", + "autoFrontmatter", + "vuepress-plugin-plugin-auto-frontmatter" + ] +} diff --git a/packages/plugin-auto-frontmatter/src/node/env.d.ts b/packages/plugin-auto-frontmatter/src/node/env.d.ts new file mode 100644 index 00000000..643357e3 --- /dev/null +++ b/packages/plugin-auto-frontmatter/src/node/env.d.ts @@ -0,0 +1,16 @@ +declare module 'glob-to-regexp' { + interface GlobToRegexp { + ( + glob: string, + options?: { + globstar?: boolean + extended?: boolean + flags?: string + } + ): RegExp + } + + const globToRegexp: GlobToRegexp + + export default globToRegexp +} diff --git a/packages/plugin-auto-frontmatter/src/node/index.ts b/packages/plugin-auto-frontmatter/src/node/index.ts new file mode 100644 index 00000000..9031d476 --- /dev/null +++ b/packages/plugin-auto-frontmatter/src/node/index.ts @@ -0,0 +1,8 @@ +import type { AutoFrontmatterOptions } from '../shared/index.js' +import { autoFrontmatterPlugin } from './plugin.js' + +export * from './plugin.js' + +export { AutoFrontmatterOptions } + +export default autoFrontmatterPlugin diff --git a/packages/plugin-auto-frontmatter/src/node/plugin.ts b/packages/plugin-auto-frontmatter/src/node/plugin.ts new file mode 100644 index 00000000..a00e9058 --- /dev/null +++ b/packages/plugin-auto-frontmatter/src/node/plugin.ts @@ -0,0 +1,83 @@ +import type { Plugin } from '@vuepress/core' +import { fs } from '@vuepress/utils' +import chokidar from 'chokidar' +import globToRegexp from 'glob-to-regexp' +import grayMatter from 'gray-matter' +import type { + AutoFrontmatterOptions, + FormatterArray, + FormatterObject, + MarkdownFile, +} from '../shared/index.js' +import { readMarkdown, readMarkdownList } from './readFiles.js' + +export const autoFrontmatterPlugin = ({ + glob = '', + formatter = {}, +}: AutoFrontmatterOptions = {}): Plugin => { + glob = glob ? (Array.isArray(glob) ? glob : [glob]) : [] + glob = ['**/*.{md,MD}', '!.vuepress/', '!node_modules/', ...glob] + + const matterFormatter: FormatterArray = Array.isArray(formatter) + ? formatter + : [{ glob: '*', formatter }] + + const globFormatter: FormatterObject = + matterFormatter.find(({ glob }) => glob === '*')?.formatter || {} + + const otherFormatters = matterFormatter + .filter(({ glob }) => glob !== '*') + .map(({ glob, formatter }) => { + return { + glob, + regexp: globToRegexp(glob, { + globstar: true, + extended: true, + }), + formatter, + } + }) + + function formatMarkdown(file: MarkdownFile): void { + const { filepath, relativePath } = file + + const formatter = + otherFormatters.find(({ regexp }) => regexp.test(relativePath)) + ?.formatter || globFormatter + const { data, content } = grayMatter(file.content) + + Object.keys(formatter).forEach((key) => { + const value = formatter[key](data[key], data, file) + data[key] = value ?? data[key] + }) + const newContent = grayMatter.stringify({ content }, data) + + fs.writeFileSync(filepath, newContent) + } + + return { + name: '@vuepress-plume/vuepress-plugin-auto-frontmatter', + onInitialized: async (app) => { + const markdownList = await readMarkdownList( + app.dir.source(), + glob as string[] + ) + markdownList.forEach((file) => formatMarkdown(file)) + }, + onWatched: async (app, watchers) => { + const watcher = chokidar.watch('**/*.md', { + cwd: app.dir.source(), + ignoreInitial: true, + ignored: /(node_modules|\.vuepress)\//, + }) + + watcher.on('add', (relativePath) => { + if ((glob as string[]).some((_) => !globToRegexp(_).test(relativePath))) + return + formatMarkdown(readMarkdown(app.dir.source(), relativePath)) + }) + + watchers.push(watcher) + }, + } +} diff --git a/packages/plugin-auto-frontmatter/src/node/readFiles.ts b/packages/plugin-auto-frontmatter/src/node/readFiles.ts new file mode 100644 index 00000000..48c17505 --- /dev/null +++ b/packages/plugin-auto-frontmatter/src/node/readFiles.ts @@ -0,0 +1,33 @@ +import { fs, globby, path } from '@vuepress/utils' +import type { MarkdownFile } from '../shared/index.js' + +type MarkdownFileList = MarkdownFile[] + +export const readMarkdownList = async ( + sourceDir: string, + glob: string[] +): Promise => { + const files: string[] = await globby(glob, { + cwd: sourceDir, + gitignore: true, + }) + + return files.map((file) => readMarkdown(sourceDir, file)) +} + +export const readMarkdown = ( + sourceDir: string, + relativePath: string +): MarkdownFile => { + const filepath = path.join(sourceDir, relativePath) + return { + filepath, + relativePath, + content: fs.readFileSync(filepath, 'utf-8'), + createTime: getFileCreateTime(fs.statSync(filepath)), + } +} + +export const getFileCreateTime = (stat: fs.Stats): Date => { + return stat.birthtime.getFullYear() !== 1970 ? stat.birthtime : stat.atime +} diff --git a/packages/plugin-auto-frontmatter/src/shared/index.ts b/packages/plugin-auto-frontmatter/src/shared/index.ts new file mode 100644 index 00000000..a99a7560 --- /dev/null +++ b/packages/plugin-auto-frontmatter/src/shared/index.ts @@ -0,0 +1,36 @@ +export interface MarkdownFile { + filepath: string + relativePath: string + content: string + createTime: Date +} + +export interface FormatterFn { + (value: T, data: K, file: MarkdownFile): T +} + +export type FormatterObject = Record< + string, + FormatterFn +> + +export type FormatterArray = { + glob: string + formatter: FormatterObject +}[] + +export interface AutoFrontmatterOptions { + /** + * glob string + */ + glob?: string | string[] + + /** + * { + * key(value, data, file) { + * return value + * } + * } + */ + formatter?: FormatterObject | FormatterArray +} diff --git a/packages/plugin-auto-frontmatter/tsconfig.build.json b/packages/plugin-auto-frontmatter/tsconfig.build.json new file mode 100644 index 00000000..e4e8ce38 --- /dev/null +++ b/packages/plugin-auto-frontmatter/tsconfig.build.json @@ -0,0 +1,9 @@ +{ + "extends": "../tsconfig.build.json", + "compilerOptions": { + "rootDir": "./src", + "outDir": "./lib" + }, + "include": ["./src"], + "files": [] +} diff --git a/packages/plugin-blog-data/LICENSE b/packages/plugin-blog-data/LICENSE new file mode 100644 index 00000000..9f677c90 --- /dev/null +++ b/packages/plugin-blog-data/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (C) 2021 - PRESENT by pengzhanbo + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/packages/plugin-blog-data/package.json b/packages/plugin-blog-data/package.json new file mode 100644 index 00000000..23b34a3d --- /dev/null +++ b/packages/plugin-blog-data/package.json @@ -0,0 +1,51 @@ +{ + "name": "@vuepress-plume/vuepress-plugin-blog-data", + "version": "1.0.0-beta.45", + "description": "The Plugin for VuePres 2", + "homepage": "https://github.com/pengzhanbo/vuepress-theme-plume#readme", + "bugs": { + "url": "https://github.com/pengzhanbo/vuepress-theme-plume/issues" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/pengzhanbo/vuepress-theme-plume.git" + }, + "license": "MIT", + "author": "pengzhanbo ", + "type": "module", + "exports": { + ".": "./lib/node/index.js", + "./client": "./lib/client/index.js", + "./package.json": "./package.json" + }, + "main": "lib/node/index.js", + "types": "./lib/node/index.d.ts", + "files": [ + "lib" + ], + "scripts": { + "build": "pnpm run clean && pnpm run copy && pnpm run ts", + "clean": "rimraf lib *.tsbuildinfo", + "copy": "cpx \"src/**/*.{d.ts,vue,css,scss,jpg,png}\" lib", + "ts": "tsc -b tsconfig.build.json" + }, + "dependencies": { + "@vue/devtools-api": "^6.4.5", + "@vuepress/client": "2.0.0-beta.51", + "@vuepress/core": "2.0.0-beta.51", + "@vuepress/shared": "2.0.0-beta.51", + "@vuepress/utils": "2.0.0-beta.51", + "chokidar": "^3.5.3", + "glob-to-regexp": "^0.4.1", + "vue": "^3.2.41" + }, + "publishConfig": { + "access": "public" + }, + "keyword": [ + "VuePress", + "vuepress plugin", + "blogData", + "vuepress-plugin-plugin-blog-data" + ] +} diff --git a/packages/plugin-blog-data/src/client/blogPostData.d.ts b/packages/plugin-blog-data/src/client/blogPostData.d.ts new file mode 100644 index 00000000..52fa5598 --- /dev/null +++ b/packages/plugin-blog-data/src/client/blogPostData.d.ts @@ -0,0 +1,7 @@ +import type { BlogPostData } from '../shared/index.js' + +declare module '@internal/blogData' { + const blogPostData: BlogPostData + + export { blogPostData } +} diff --git a/packages/plugin-blog-data/src/client/composables/index.ts b/packages/plugin-blog-data/src/client/composables/index.ts new file mode 100644 index 00000000..43aec1ef --- /dev/null +++ b/packages/plugin-blog-data/src/client/composables/index.ts @@ -0,0 +1 @@ +export * from './useBlogPostData.js' diff --git a/packages/plugin-blog-data/src/client/composables/useBlogPostData.ts b/packages/plugin-blog-data/src/client/composables/useBlogPostData.ts new file mode 100644 index 00000000..6e8290d0 --- /dev/null +++ b/packages/plugin-blog-data/src/client/composables/useBlogPostData.ts @@ -0,0 +1,20 @@ +import { blogPostData as blogPostDataRaw } from '@internal/blogData' +import { ref } from 'vue' +import type { Ref } from 'vue' +import type { BlogPostData } from '../../shared/index.js' + +declare const __VUE_HMR_RUNTIME__: Record + +export type ThemeDataRef = Ref + +export const blogPostData: ThemeDataRef = ref(blogPostDataRaw) + +export const useBlogPostData = < + T extends BlogPostData = BlogPostData +>(): ThemeDataRef => blogPostData as ThemeDataRef + +if (import.meta.webpackHot || import.meta.hot) { + __VUE_HMR_RUNTIME__.updateBlogData = (data: BlogPostData) => { + blogPostData.value = data + } +} diff --git a/packages/plugin-blog-data/src/client/config.ts b/packages/plugin-blog-data/src/client/config.ts new file mode 100644 index 00000000..27063fc9 --- /dev/null +++ b/packages/plugin-blog-data/src/client/config.ts @@ -0,0 +1,36 @@ +import { setupDevtoolsPlugin } from '@vue/devtools-api' +import { defineClientConfig } from '@vuepress/client' +import { useBlogPostData } from './composables/index.js' + +export default defineClientConfig({ + enhance({ app }) { + // provide theme data & theme locale data + const blogPostData = useBlogPostData() + + // setup devtools in dev mode + if (__VUEPRESS_DEV__ || __VUE_PROD_DEVTOOLS__) { + setupDevtoolsPlugin( + { + // fix recursive reference + app: app as any, + id: 'org.vuepress-plume.plugin-blog-data', + label: 'VuePress Blog Data Plugin', + packageName: '@vuepress/plugin-blog-data', + homepage: 'https://pengzhanbo.cn', + logo: 'https://v2.vuepress.vuejs.org/images/hero.png', + componentStateTypes: ['VuePress'], + }, + (api) => { + api.on.inspectComponent((payload) => { + payload.instanceData.state.push({ + type: 'VuePress', + key: 'blogPostData', + editable: false, + value: blogPostData.value, + }) + }) + } + ) + } + }, +}) diff --git a/packages/plugin-blog-data/src/client/index.ts b/packages/plugin-blog-data/src/client/index.ts new file mode 100644 index 00000000..b9acdbce --- /dev/null +++ b/packages/plugin-blog-data/src/client/index.ts @@ -0,0 +1,4 @@ +import type { BlogPostData, BlogPostDataItem } from '../shared/index.js' +export * from './composables/index.js' + +export { BlogPostData, BlogPostDataItem } diff --git a/packages/plugin-blog-data/src/node/env.d.ts b/packages/plugin-blog-data/src/node/env.d.ts new file mode 100644 index 00000000..643357e3 --- /dev/null +++ b/packages/plugin-blog-data/src/node/env.d.ts @@ -0,0 +1,16 @@ +declare module 'glob-to-regexp' { + interface GlobToRegexp { + ( + glob: string, + options?: { + globstar?: boolean + extended?: boolean + flags?: string + } + ): RegExp + } + + const globToRegexp: GlobToRegexp + + export default globToRegexp +} diff --git a/packages/plugin-blog-data/src/node/index.ts b/packages/plugin-blog-data/src/node/index.ts new file mode 100644 index 00000000..312eda7b --- /dev/null +++ b/packages/plugin-blog-data/src/node/index.ts @@ -0,0 +1,6 @@ +import { blogDataPlugin } from './plugin.js' + +export * from '../shared/index.js' +export * from './plugin.js' + +export default blogDataPlugin diff --git a/packages/plugin-blog-data/src/node/plugin.ts b/packages/plugin-blog-data/src/node/plugin.ts new file mode 100644 index 00000000..8348d0b8 --- /dev/null +++ b/packages/plugin-blog-data/src/node/plugin.ts @@ -0,0 +1,63 @@ +import type { Plugin } from '@vuepress/core' +import { getDirname, path } from '@vuepress/utils' +import chokidar from 'chokidar' +import globToRegexp from 'glob-to-regexp' +import { preparedBlogData } from './prepareBlogData.js' +import type { BlogDataPluginOptions } from './index.js' + +const __dirname = getDirname(import.meta.url) + +export interface PluginOption + extends Omit { + include: { + (filepath: string): boolean + }[] + exclude: { + (filepath: string): boolean + }[] +} + +const globOptions = { + globstar: true, + extended: true, +} + +export const blogDataPlugin = ({ + include, + exclude, + ...pluginOptions +}: BlogDataPluginOptions = {}): Plugin => { + const options: PluginOption = { + include: toArray(include) + .map((str) => globToRegexp(str, globOptions)) + .map((regexp) => (filepath: string) => regexp.test(filepath)), + + exclude: toArray(exclude) + .map((str) => globToRegexp(str, globOptions)) + .map((regexp) => (filepath: string) => !regexp.test(filepath)), + ...pluginOptions, + } + + return { + name: '@vuepress-plume/vuepress-plugin-blog-data', + clientConfigFile: path.resolve(__dirname, '../client/config.js'), + onPrepared: async (app) => await preparedBlogData(app, options), + onWatched(app, watchers) { + const watcher = chokidar.watch('pages/**/*', { + cwd: app.dir.temp(), + ignoreInitial: true, + }) + + watcher.on('add', async () => await preparedBlogData(app, options)) + watcher.on('change', async () => await preparedBlogData(app, options)) + watcher.on('unlink', async () => await preparedBlogData(app, options)) + + watchers.push(watcher) + }, + } +} + +function toArray(likeArr: string | string[] | undefined): string[] { + if (Array.isArray(likeArr)) return likeArr + return likeArr ? [likeArr] : [] +} diff --git a/packages/plugin-blog-data/src/node/prepareBlogData.ts b/packages/plugin-blog-data/src/node/prepareBlogData.ts new file mode 100644 index 00000000..57d332ec --- /dev/null +++ b/packages/plugin-blog-data/src/node/prepareBlogData.ts @@ -0,0 +1,79 @@ +import type { App } from '@vuepress/core' +import type { BlogPostData, BlogPostDataItem } from '../shared/index.js' +import type { PluginOption } from './plugin.js' + +const HMR_CODE = ` +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updateBlogData) { + __VUE_HMR_RUNTIME__.updateBlogData(blogPostData) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ blogPostData }) => { + __VUE_HMR_RUNTIME__.updateBlogData(blogPostData) + }) +} +` + +const getTimestamp = (time: Date): number => { + return new Date(time).getTime() +} + +export const preparedBlogData = async ( + app: App, + options: PluginOption +): Promise => { + let pages = app.pages.filter((page) => { + return ( + page.filePathRelative && + options.exclude.every((filter) => filter(page.filePathRelative!)) && + options.include.some((filter) => filter(page.filePathRelative!)) + ) + }) + if (options.sortBy) { + pages = pages.sort((prev, next) => { + if (options.sortBy === 'createTime') { + return getTimestamp(prev.frontmatter.createTime as Date) < + getTimestamp(next.frontmatter.createTime as Date) + ? 1 + : -1 + } else { + return typeof options.sortBy === 'function' && + options.sortBy(prev, next) + ? 1 + : -1 + } + }) + } + + const blogData: BlogPostData = pages.map((page) => { + let extended: Partial = {} + if (typeof options.extendBlogData === 'function') { + extended = options.extendBlogData(page) + } + const data = { + path: page.path, + title: page.title, + ...extended, + } + + if (options.excerpt) data.excerpt = page.excerpt + + return data as BlogPostDataItem + }) + + let content = `\ +export const blogPostData = JSON.parse(${JSON.stringify( + JSON.stringify(blogData) + )}) +` + + // inject HMR code + if (app.env.isDev) { + content += HMR_CODE + } + + await app.writeTemp('internal/blogData.js', content) +} diff --git a/packages/plugin-blog-data/src/shared/index.ts b/packages/plugin-blog-data/src/shared/index.ts new file mode 100644 index 00000000..a8bae2cd --- /dev/null +++ b/packages/plugin-blog-data/src/shared/index.ts @@ -0,0 +1,16 @@ +export interface BlogDataPluginOptions { + include?: string | string[] + exclude?: string | string[] + sortBy?: 'createTime' | false | ((prev: T, next: T) => boolean) + excerpt?: boolean + extendBlogData?: (page: T) => Partial +} + +export type BlogPostData = BlogPostDataItem[] + +export type BlogPostDataItem = { + path: string + title: string + excerpt: string + [x: string]: any +} & T diff --git a/packages/plugin-blog-data/tsconfig.build.json b/packages/plugin-blog-data/tsconfig.build.json new file mode 100644 index 00000000..2f53b066 --- /dev/null +++ b/packages/plugin-blog-data/tsconfig.build.json @@ -0,0 +1,13 @@ +{ + "extends": "../tsconfig.build.json", + "compilerOptions": { + "rootDir": "./src", + "outDir": "./lib", + "baseUrl": ".", + "paths": { + "@internal/blogData": ["./src/client/blogPostData.d.ts"] + }, + "types": ["@vuepress/client/types", "vite/client", "webpack-env"] + }, + "include": ["./src"] +} diff --git a/packages/theme/CHANGELOG.md b/packages/theme/CHANGELOG.md deleted file mode 100644 index 1339fd8f..00000000 --- a/packages/theme/CHANGELOG.md +++ /dev/null @@ -1,229 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -# [1.0.0-beta.26](https://github.com/pengzhanbo/vuepress-theme-plume/compare/v1.0.0-beta.25...v1.0.0-beta.26) (2022-04-25) - - -### Features - -* support sitemap and seo ([a57af59](https://github.com/pengzhanbo/vuepress-theme-plume/commit/a57af599e649d1f7ce357f704a222c7babc77b06)) - - - - - -# [1.0.0-beta.25](https://github.com/pengzhanbo/vuepress-theme-plume/compare/v1.0.0-beta.24...v1.0.0-beta.25) (2022-04-25) - - -### Bug Fixes - -* fix define config ([00bca40](https://github.com/pengzhanbo/vuepress-theme-plume/commit/00bca40d895499017308359bfce682cec055f42b)) - - - - - -# [1.0.0-beta.24](https://github.com/pengzhanbo/vuepress-theme-plume/compare/v1.0.0-beta.23...v1.0.0-beta.24) (2022-04-25) - - -### Features - -* 主题配置函数 ([844feea](https://github.com/pengzhanbo/vuepress-theme-plume/commit/844feeae7406f5aee8edef35bce4a08e808f692e)) - - - - - -# [1.0.0-beta.23](https://github.com/pengzhanbo/vuepress-theme-plume/compare/v1.0.0-beta.22...v1.0.0-beta.23) (2022-04-23) - -**Note:** Version bump only for package @vuepress-plume/vuepress-theme-plume - - - - - -# [1.0.0-beta.22](https://github.com/pengzhanbo/vuepress-theme-plume/compare/v1.0.0-beta.21...v1.0.0-beta.22) (2022-04-18) - -**Note:** Version bump only for package @vuepress-plume/vuepress-theme-plume - - - - - -# [1.0.0-beta.21](https://github.com/pengzhanbo/vuepress-theme-plume/compare/v1.0.0-beta.20...v1.0.0-beta.21) (2022-04-18) - -**Note:** Version bump only for package @vuepress-plume/vuepress-theme-plume - - - - - -# [1.0.0-beta.20](https://github.com/pengzhanbo/vuepress-theme-plume/compare/v1.0.0-beta.19...v1.0.0-beta.20) (2022-04-18) - -**Note:** Version bump only for package @vuepress-plume/vuepress-theme-plume - - - - - -# [1.0.0-beta.19](https://github.com/pengzhanbo/vuepress-theme-plume/compare/v1.0.0-beta.18...v1.0.0-beta.19) (2022-04-18) - -**Note:** Version bump only for package @vuepress-plume/vuepress-theme-plume - - - - - -# [1.0.0-beta.18](https://github.com/pengzhanbo/vuepress-theme-plume/compare/v1.0.0-beta.17...v1.0.0-beta.18) (2022-04-14) - -**Note:** Version bump only for package @vuepress-plume/vuepress-theme-plume - - - - - -# [1.0.0-beta.17](https://github.com/pengzhanbo/vuepress-theme-plume/compare/v1.0.0-beta.16...v1.0.0-beta.17) (2022-04-12) - -**Note:** Version bump only for package @vuepress-plume/vuepress-theme-plume - - - - - -# [1.0.0-beta.16](https://github.com/pengzhanbo/vuepress-theme-plume/compare/v1.0.0-beta.15...v1.0.0-beta.16) (2022-04-12) - - -### Bug Fixes - -* sidebar ([a2794d7](https://github.com/pengzhanbo/vuepress-theme-plume/commit/a2794d72ea7a276d8fd876475f5e9c77c33f5e90)) - - - - - -# [1.0.0-beta.15](https://github.com/pengzhanbo/vuepress-theme-plume/compare/v1.0.0-beta.14...v1.0.0-beta.15) (2022-04-12) - -**Note:** Version bump only for package @vuepress-plume/vuepress-theme-plume - - - - - -# [1.0.0-beta.14](https://github.com/pengzhanbo/vuepress-theme-plume/compare/v1.0.0-beta.13...v1.0.0-beta.14) (2022-04-12) - - -### Bug Fixes - -* 修复sidebar问题 ([420ec9f](https://github.com/pengzhanbo/vuepress-theme-plume/commit/420ec9fb663793fe2d4fd7e9e61f12ca0d05217e)) - - - - - -# [1.0.0-beta.13](https://github.com/pengzhanbo/vuepress-theme-plume/compare/v1.0.0-beta.12...v1.0.0-beta.13) (2022-04-12) - - -### Bug Fixes - -* 修复note生成sidebar时目录嵌套时未正确识别路径 ([7b3a6e2](https://github.com/pengzhanbo/vuepress-theme-plume/commit/7b3a6e2252582a19bdbf42c1ddf85dfab199d57b)) - - - - - -# [1.0.0-beta.12](https://github.com/pengzhanbo/vuepress-theme-plume/compare/v1.0.0-beta.11...v1.0.0-beta.12) (2022-04-08) - - -### Bug Fixes - -* 修复page页toc问题 ([2d44799](https://github.com/pengzhanbo/vuepress-theme-plume/commit/2d4479909f4c84a8d71c8a97c93f21bde3b8208c)) - - - - - -# [1.0.0-beta.11](https://github.com/pengzhanbo/vuepress-theme-plume/compare/v1.0.0-beta.10...v1.0.0-beta.11) (2022-04-08) - -**Note:** Version bump only for package @vuepress-plume/vuepress-theme-plume - - - - - -# [1.0.0-beta.10](https://github.com/pengzhanbo/vuepress-theme-plume/compare/v1.0.0-beta.9...v1.0.0-beta.10) (2022-04-08) - -**Note:** Version bump only for package @vuepress-plume/vuepress-theme-plume - - - - - -# [1.0.0-beta.9](https://github.com/pengzhanbo/vuepress-theme-plume/compare/v1.0.0-beta.8...v1.0.0-beta.9) (2022-04-06) - -**Note:** Version bump only for package @vuepress-plume/vuepress-theme-plume - - - - - -# [1.0.0-beta.8](https://github.com/pengzhanbo/vuepress-theme-plume/compare/v1.0.0-beta.7...v1.0.0-beta.8) (2022-04-06) - -**Note:** Version bump only for package @vuepress-plume/vuepress-theme-plume - - - - - -# [1.0.0-beta.7](https://github.com/pengzhanbo/vuepress-theme-plume/compare/v1.0.0-beta.6...v1.0.0-beta.7) (2022-04-05) - -**Note:** Version bump only for package @vuepress-plume/vuepress-theme-plume - - - - - -# [1.0.0-beta.6](https://github.com/pengzhanbo/vuepress-theme-plume/compare/v1.0.0-beta.5...v1.0.0-beta.6) (2022-04-05) - -**Note:** Version bump only for package @vuepress-plume/vuepress-theme-plume - - - - - -# [1.0.0-beta.5](https://github.com/pengzhanbo/vuepress-theme-plume/compare/v1.0.0-beta.4...v1.0.0-beta.5) (2022-04-05) - -**Note:** Version bump only for package @vuepress-plume/vuepress-theme-plume - - - - - -# [1.0.0-beta.4](https://github.com/pengzhanbo/vuepress-theme-plume/compare/v1.0.0-beta.3...v1.0.0-beta.4) (2022-04-05) - -**Note:** Version bump only for package @vuepress-plume/vuepress-theme-plume - - - - - -# [1.0.0-beta.3](https://github.com/pengzhanbo/vuepress-theme-plume/compare/v1.0.0-beta.2...v1.0.0-beta.3) (2022-04-05) - -**Note:** Version bump only for package @vuepress-plume/vuepress-theme-plume - - - - - -# [1.0.0-beta.2](https://github.com/pengzhanbo/vuepress-theme-plume/compare/v1.0.0-beta.1...v1.0.0-beta.2) (2022-04-05) - -**Note:** Version bump only for package @vuepress-plume/vuepress-theme-plume - - - - - -# 1.0.0-beta.1 (2022-04-05) - -**Note:** Version bump only for package @vuepress-plume/vuepress-theme-plume diff --git a/packages/theme/package.json b/packages/theme/package.json index 993db5ec..23348b79 100644 --- a/packages/theme/package.json +++ b/packages/theme/package.json @@ -1,15 +1,6 @@ { "name": "@vuepress-plume/vuepress-theme-plume", - "version": "1.0.0-beta.45", - "description": "A Blog Theme for VuePress 2.0", - "keywords": [ - "VuePress", - "Theme", - "plume", - "vuepress-theme", - "vuepress-theme-plume", - "theme-plume" - ], + "version": "0.0.0", "homepage": "https://pengzhanbo.cn/note/vuepress-theme-plume", "bugs": { "url": "https://github.com/pengzhanbo/vuepress-theme-plume/issues" @@ -19,7 +10,7 @@ "url": "git+https://github.com/pengzhanbo/vuepress-theme-plume.git" }, "license": "MIT", - "author": "pengzhanbo ", + "author": "pengzhanbo (https://github.com/pengzhanbo/)", "type": "module", "exports": { ".": "./lib/node/index.js", @@ -43,7 +34,9 @@ }, "dependencies": { "@types/lodash.merge": "^4.6.7", + "@vuepress-plume/vuepress-plugin-auto-frontmatter": "workspace:*", "@vuepress-plume/vuepress-plugin-baidu-tongji": "workspace:*", + "@vuepress-plume/vuepress-plugin-blog-data": "workspace:*", "@vuepress-plume/vuepress-plugin-caniuse": "workspace:*", "@vuepress-plume/vuepress-plugin-copy-code": "workspace:*", "@vuepress/client": "2.0.0-beta.51", @@ -62,15 +55,8 @@ "@vuepress/plugin-toc": "2.0.0-beta.51", "@vuepress/shared": "2.0.0-beta.51", "@vuepress/utils": "2.0.0-beta.51", - "@vueuse/core": "^9.3.0", - "chokidar": "^3.5.3", "date-fns": "^2.29.3", - "gray-matter": "^4.0.3", - "json2yaml": "^1.1.0", - "lodash.merge": "^4.6.2", "nanoid": "^4.0.0", - "sass": "^1.55.0", - "sass-loader": "^13.1.0", "ts-debounce": "^4.0.0", "vue": "^3.2.41", "vue-router": "4.1.5", @@ -78,16 +64,5 @@ "vuepress-plugin-md-enhance": "2.0.0-beta.110", "vuepress-plugin-seo2": "2.0.0-beta.110", "vuepress-plugin-sitemap2": "2.0.0-beta.110" - }, - "peerDependencies": { - "sass-loader": "^13.0.2" - }, - "peerDependenciesMeta": { - "sass-loader": { - "optional": true - } - }, - "publishConfig": { - "access": "public" } } diff --git a/packages/theme/src/client/components/Archive.vue b/packages/theme/src/client/components/Archive.vue deleted file mode 100644 index abf9f2b7..00000000 --- a/packages/theme/src/client/components/Archive.vue +++ /dev/null @@ -1,171 +0,0 @@ - - - diff --git a/packages/theme/src/client/components/AsideNavbar.vue b/packages/theme/src/client/components/AsideNavbar.vue deleted file mode 100644 index 5861cc2b..00000000 --- a/packages/theme/src/client/components/AsideNavbar.vue +++ /dev/null @@ -1,47 +0,0 @@ - - - diff --git a/packages/theme/src/client/components/AutoLink.vue b/packages/theme/src/client/components/AutoLink.vue deleted file mode 100644 index 94bd8995..00000000 --- a/packages/theme/src/client/components/AutoLink.vue +++ /dev/null @@ -1,105 +0,0 @@ - - - - - diff --git a/packages/theme/src/client/components/BackToTop.vue b/packages/theme/src/client/components/BackToTop.vue deleted file mode 100644 index b1ee97ac..00000000 --- a/packages/theme/src/client/components/BackToTop.vue +++ /dev/null @@ -1,65 +0,0 @@ - - - diff --git a/packages/theme/src/client/components/BlogInfo.vue b/packages/theme/src/client/components/BlogInfo.vue deleted file mode 100644 index 6beb2a6a..00000000 --- a/packages/theme/src/client/components/BlogInfo.vue +++ /dev/null @@ -1,32 +0,0 @@ - - - diff --git a/packages/theme/src/client/components/BloggerInfo.vue b/packages/theme/src/client/components/BloggerInfo.vue deleted file mode 100644 index da0cb09e..00000000 --- a/packages/theme/src/client/components/BloggerInfo.vue +++ /dev/null @@ -1,195 +0,0 @@ - - - diff --git a/packages/theme/src/client/components/Category.vue b/packages/theme/src/client/components/Category.vue deleted file mode 100644 index 1f09e4b7..00000000 --- a/packages/theme/src/client/components/Category.vue +++ /dev/null @@ -1,43 +0,0 @@ - - - diff --git a/packages/theme/src/client/components/CategoryGroup.vue b/packages/theme/src/client/components/CategoryGroup.vue deleted file mode 100644 index e510b54f..00000000 --- a/packages/theme/src/client/components/CategoryGroup.vue +++ /dev/null @@ -1,98 +0,0 @@ - - - diff --git a/packages/theme/src/client/components/DarkModeButton.vue b/packages/theme/src/client/components/DarkModeButton.vue deleted file mode 100644 index 3d7abcc5..00000000 --- a/packages/theme/src/client/components/DarkModeButton.vue +++ /dev/null @@ -1,76 +0,0 @@ - - - - - diff --git a/packages/theme/src/client/components/DropdownTransition.vue b/packages/theme/src/client/components/DropdownTransition.vue deleted file mode 100644 index 0b4bb50d..00000000 --- a/packages/theme/src/client/components/DropdownTransition.vue +++ /dev/null @@ -1,59 +0,0 @@ - - diff --git a/packages/theme/src/client/components/Home.vue b/packages/theme/src/client/components/Home.vue index 5a2b00bb..db49aad6 100644 --- a/packages/theme/src/client/components/Home.vue +++ b/packages/theme/src/client/components/Home.vue @@ -1,28 +1,3 @@ - - diff --git a/packages/theme/src/client/components/HomeBigBanner.vue b/packages/theme/src/client/components/HomeBigBanner.vue deleted file mode 100644 index f6dd81c1..00000000 --- a/packages/theme/src/client/components/HomeBigBanner.vue +++ /dev/null @@ -1,166 +0,0 @@ - - - diff --git a/packages/theme/src/client/components/Navbar.vue b/packages/theme/src/client/components/Navbar.vue deleted file mode 100644 index d8f3da8f..00000000 --- a/packages/theme/src/client/components/Navbar.vue +++ /dev/null @@ -1,160 +0,0 @@ - - - diff --git a/packages/theme/src/client/components/NavbarBrand.vue b/packages/theme/src/client/components/NavbarBrand.vue deleted file mode 100644 index cb3901c7..00000000 --- a/packages/theme/src/client/components/NavbarBrand.vue +++ /dev/null @@ -1,84 +0,0 @@ - - - - diff --git a/packages/theme/src/client/components/NavbarDropdown.vue b/packages/theme/src/client/components/NavbarDropdown.vue deleted file mode 100644 index be1e4dfe..00000000 --- a/packages/theme/src/client/components/NavbarDropdown.vue +++ /dev/null @@ -1,334 +0,0 @@ - - - - - diff --git a/packages/theme/src/client/components/NavbarItems.vue b/packages/theme/src/client/components/NavbarItems.vue deleted file mode 100644 index e55e837e..00000000 --- a/packages/theme/src/client/components/NavbarItems.vue +++ /dev/null @@ -1,79 +0,0 @@ - - - - - diff --git a/packages/theme/src/client/components/Page.vue b/packages/theme/src/client/components/Page.vue deleted file mode 100644 index b7ed818d..00000000 --- a/packages/theme/src/client/components/Page.vue +++ /dev/null @@ -1,110 +0,0 @@ - - - diff --git a/packages/theme/src/client/components/PageFooter.vue b/packages/theme/src/client/components/PageFooter.vue deleted file mode 100644 index 840be680..00000000 --- a/packages/theme/src/client/components/PageFooter.vue +++ /dev/null @@ -1,49 +0,0 @@ - - - diff --git a/packages/theme/src/client/components/Pagination.vue b/packages/theme/src/client/components/Pagination.vue deleted file mode 100644 index 1504f353..00000000 --- a/packages/theme/src/client/components/Pagination.vue +++ /dev/null @@ -1,203 +0,0 @@ - - - diff --git a/packages/theme/src/client/components/PostItem.vue b/packages/theme/src/client/components/PostItem.vue deleted file mode 100644 index a37781d2..00000000 --- a/packages/theme/src/client/components/PostItem.vue +++ /dev/null @@ -1,59 +0,0 @@ - - diff --git a/packages/theme/src/client/components/PostList.vue b/packages/theme/src/client/components/PostList.vue deleted file mode 100644 index 3af4988e..00000000 --- a/packages/theme/src/client/components/PostList.vue +++ /dev/null @@ -1,195 +0,0 @@ - - - diff --git a/packages/theme/src/client/components/PostMeta.vue b/packages/theme/src/client/components/PostMeta.vue deleted file mode 100644 index 075ca41c..00000000 --- a/packages/theme/src/client/components/PostMeta.vue +++ /dev/null @@ -1,126 +0,0 @@ - - - diff --git a/packages/theme/src/client/components/Sidebar.vue b/packages/theme/src/client/components/Sidebar.vue deleted file mode 100644 index c7c3e40c..00000000 --- a/packages/theme/src/client/components/Sidebar.vue +++ /dev/null @@ -1,94 +0,0 @@ - - - diff --git a/packages/theme/src/client/components/SidebarItems.vue b/packages/theme/src/client/components/SidebarItems.vue deleted file mode 100644 index 3310fa92..00000000 --- a/packages/theme/src/client/components/SidebarItems.vue +++ /dev/null @@ -1,157 +0,0 @@ - - - diff --git a/packages/theme/src/client/components/Tag.vue b/packages/theme/src/client/components/Tag.vue deleted file mode 100644 index 8845cc91..00000000 --- a/packages/theme/src/client/components/Tag.vue +++ /dev/null @@ -1,100 +0,0 @@ - - - diff --git a/packages/theme/src/client/components/Toc.ts b/packages/theme/src/client/components/Toc.ts deleted file mode 100644 index 56c64365..00000000 --- a/packages/theme/src/client/components/Toc.ts +++ /dev/null @@ -1,148 +0,0 @@ -import { usePageData } from '@vuepress/client' -import type { PageHeader } from '@vuepress/client' -import type { PropType, VNode } from 'vue' -import { computed, defineComponent, h, toRefs } from 'vue' -import type { RouteLocationNormalizedLoaded } from 'vue-router' -import { useRoute } from 'vue-router' -import { scrollTo } from '../utils/index.js' - -export type TocPropsHeaders = PageHeader[] - -export interface TocPropsOptions { - containerTag: string - containerClass: string - listClass: string - itemClass: string - linkClass: string - linkActiveClass: string - linkChildrenActiveClass: string -} - -export interface TocProps { - headers: TocPropsHeaders - options: TocPropsOptions -} - -const renderLink = ( - header: PageHeader, - options: TocPropsOptions, - route: RouteLocationNormalizedLoaded -): VNode => { - const hash = `#${header.slug}` - const linkClass = [options.linkClass] - - if (options.linkActiveClass && route.hash === hash) { - linkClass.push(options.linkActiveClass) - } - - if ( - options.linkChildrenActiveClass && - header.children.some((item) => `#${item.slug}` === route.hash) - ) { - linkClass.push(options.linkChildrenActiveClass) - } - - const setActiveRouteHash = (): void => { - const headerAnchors: HTMLAnchorElement[] = Array.from( - document.querySelectorAll('.header-anchor') - ) - const anchor = headerAnchors.find( - (anchor) => decodeURI(anchor.hash) === hash - ) - if (!anchor) return - const el = document.documentElement - const top = anchor.getBoundingClientRect().top - 80 + el.scrollTop - scrollTo(document, top) - } - - return h( - 'a', - { - href: hash, - class: linkClass, - ariaLabel: header.title, - onClick: (e: MouseEvent) => { - e.preventDefault() - setActiveRouteHash() - }, - }, - header.title - ) -} - -const renderHeaders = ( - headers: PageHeader[], - options: TocPropsOptions, - route: RouteLocationNormalizedLoaded -): VNode[] => { - if (headers.length === 0) { - return [] - } - return [ - h( - 'ul', - { class: options.listClass }, - headers.map((header) => - h('li', { class: options.itemClass }, [ - renderLink(header, options, route), - renderHeaders(header.children, options, route), - ]) - ) - ), - ] -} - -const Toc = defineComponent({ - name: 'Toc', - props: { - headers: { - type: Array as PropType, - required: false, - default: null, - }, - options: { - type: Object as PropType, - required: false, - default: () => ({}), - }, - }, - setup(props) { - const { headers: propsHeaders, options: propsOptions } = toRefs(props) - - const defaultOptions: TocPropsOptions = { - containerTag: 'nav', - containerClass: 'theme-plume-toc', - listClass: 'theme-plume-toc-list', - itemClass: 'theme-plume-toc-item', - linkClass: 'theme-plume-toc-link', - linkActiveClass: 'active', - linkChildrenActiveClass: 'active', - } - - const route = useRoute() - const page = usePageData() - const headers = computed(() => { - const headerToUse = propsHeaders.value || page.value.headers - - return headerToUse[0]?.level === 1 ? headerToUse[0].children : headerToUse - }) - const options = computed(() => ({ - ...defaultOptions, - ...propsOptions.value, - })) - - return () => { - const renderedHeaders = renderHeaders(headers.value, options.value, route) - if (options.value.containerTag) { - return h( - options.value.containerTag, - { class: options.value.containerClass }, - renderedHeaders - ) - } - return renderedHeaders - } - }, -}) - -export default Toc diff --git a/packages/theme/src/client/components/ToggleSidebarButton.vue b/packages/theme/src/client/components/ToggleSidebarButton.vue deleted file mode 100644 index 32756a2d..00000000 --- a/packages/theme/src/client/components/ToggleSidebarButton.vue +++ /dev/null @@ -1,65 +0,0 @@ - - - - diff --git a/packages/theme/src/client/components/global/Badge.vue b/packages/theme/src/client/components/global/Badge.vue deleted file mode 100644 index 8266c5d3..00000000 --- a/packages/theme/src/client/components/global/Badge.vue +++ /dev/null @@ -1,57 +0,0 @@ - - - diff --git a/packages/theme/src/client/components/icons/IconBase.ts b/packages/theme/src/client/components/icons/IconBase.ts deleted file mode 100644 index 29dfb55f..00000000 --- a/packages/theme/src/client/components/icons/IconBase.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { defineComponent, h } from 'vue' -import type { VNode } from 'vue' - -export const IconBase = defineComponent({ - name: 'IconBase', - props: { - name: { - type: String, - required: false, - default: '', - }, - color: { - type: String, - required: false, - default: 'currentColor', - }, - viewBox: { - type: String, - required: false, - default: '0 0 20 20', - }, - }, - setup: - (props, { slots }) => - (): VNode => - h( - 'svg', - { - xmlns: 'http://www.w3.org/2000/svg', - class: ['icon', `${props.name}-icon`], - viewBox: props.viewBox, - ariaLabelledby: props.name, - }, - [ - h('title', { id: props.name, lang: 'en' }, `${props.name}`), - h('g', { fill: props.color }, slots.default?.()), - ] - ), -}) diff --git a/packages/theme/src/client/components/icons/icon.ts b/packages/theme/src/client/components/icons/icon.ts deleted file mode 100644 index f49dfa72..00000000 --- a/packages/theme/src/client/components/icons/icon.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { h } from 'vue' -import type { FunctionalComponent } from 'vue' -import { IconBase } from './IconBase.js' - -export const UserIcon: FunctionalComponent = () => - h(IconBase, { name: 'user' }, () => - h('path', { - 'fill-rule': 'evenodd', - 'clip-rule': 'evenodd', - 'd': 'M10 9a3 3 0 100-6 3 3 0 000 6zm-7 9a7 7 0 1114 0H3z', - }) - ) -UserIcon.displayName = 'UserIcon' - -export const FolderIcon: FunctionalComponent = () => - h(IconBase, { name: 'folder' }, () => - h('path', { - d: 'M2 6a2 2 0 012-2h5l2 2h5a2 2 0 012 2v6a2 2 0 01-2 2H4a2 2 0 01-2-2V6z', - }) - ) -FolderIcon.displayName = 'FolderIcon' - -export const ClockIcon: FunctionalComponent = () => - h(IconBase, { name: 'clock' }, () => - h('path', { - 'fill-rule': 'evenodd', - 'clip-rule': 'evenodd', - 'd': 'M10 18a8 8 0 100-16 8 8 0 000 16zm1-12a1 1 0 10-2 0v4a1 1 0 00.293.707l2.828 2.829a1 1 0 101.415-1.415L11 9.586V6z', - }) - ) -ClockIcon.displayName = 'ClockIcon' - -export const TagIcon: FunctionalComponent = () => - h(IconBase, { name: 'tag' }, () => - h('path', { - 'fill-rule': 'evenodd', - 'clip-rule': 'evenodd', - 'd': 'M17.707 9.293a1 1 0 010 1.414l-7 7a1 1 0 01-1.414 0l-7-7A.997.997 0 012 10V5a3 3 0 013-3h5c.256 0 .512.098.707.293l7 7zM5 6a1 1 0 100-2 1 1 0 000 2z', - }) - ) -TagIcon.displayName = 'TagIcon' - -export const TopIcon: FunctionalComponent = () => - h(IconBase, { name: 'top', viewBox: '0 0 1024 1024' }, () => [ - h('path', { - d: 'M80.96 449.194667l37.696-37.717334 19.626667 19.605334-37.717334 37.717333zM197.205333 541.44l116.16-116.138667 13.568 13.568-116.16 116.16zM220.565333 565.162667l116.16-116.16 13.568 13.589333-116.16 116.138667zM173.845333 517.738667l116.16-116.16 13.568 13.589333-116.16 116.138667zM245.354667 587.477333l116.202666-116.096 13.568 13.589334-116.202666 116.096z', - // fill: '#FA8D14', - }), - h('path', { - d: 'M339.2 0L0 345.6V1024L1024 0H339.2z m-115.2 283.733333l46.933333 46.933334-14.933333 12.8-4.266667-4.266667-140.8 140.8 4.266667 4.266667-14.933333 14.933333-46.933334-46.933333 170.666667-168.533334z m2.133333 375.466667l-12.8-12.8 29.866667-29.866667L149.333333 520.533333l64-64-12.8-12.8L108.8 533.333333l-10.666667-10.666666 89.6-89.6-10.666666-10.666667 14.933333-14.933333 10.666667 10.666666 91.733333-91.733333 10.666667 10.666667-91.733334 91.733333 12.8 12.8 68.266667-68.266667 96 96 27.733333-27.733333 12.8 12.8-204.8 204.8z m232.533334-236.8l-17.066667 17.066667c-6.4-6.4-14.933333-10.666667-21.333333-14.933334 8.533333-4.266667 14.933333-10.666667 21.333333-17.066666 6.4-6.4 6.4-12.8 0-19.2l-136.533333-136.533334-34.133334 34.133334-14.933333-17.066667L332.8 192l14.933333 14.933333-25.6 27.733334 138.666667 138.666666c14.933333 14.933333 14.933333 32-2.133333 49.066667z m-81.066667-200.533333l38.4-38.4-21.333333-34.133334-46.933334 46.933334-14.933333-14.933334 123.733333-123.733333 12.8 17.066667-59.733333 59.733333 21.333333 34.133333 57.6-57.6 98.133334 98.133334-14.933334 14.933333-83.2-83.2-78.933333 78.933333 85.333333 85.333334-14.933333 14.933333-102.4-98.133333z m138.666667 162.133333c-6.4-2.133333-14.933333-4.266667-25.6-4.266667 19.2-34.133333 25.6-61.866667 23.466666-85.333333-2.133333-21.333333-17.066667-44.8-42.666666-70.4L448 200.533333l14.933333-14.933333 23.466667 23.466667c17.066667 17.066667 29.866667 34.133333 38.4 49.066666 38.4-8.533333 74.666667-14.933333 106.666667-19.2l2.133333 25.6c-34.133333 2.133333-68.266667 8.533333-100.266667 14.933334 2.133333 4.266667 2.133333 8.533333 2.133334 12.8 6.4 23.466667 0 55.466667-19.2 91.733333z', - // fill: '#FA8D14', - }), - h('path', { - d: 'M183.765333 346.965333l37.696-37.717333 19.626667 19.584-37.696 37.738667zM132.288 398.037333l37.76-37.674666 19.584 19.626666-37.738667 37.674667z', - // fill: '#FA8D14', - }), - ]) -TopIcon.displayName = 'TopIcon' - -export const ArrowRightIcon: FunctionalComponent = () => - h(IconBase, { name: 'arrow-right', viewBox: '0 0 1024 1024' }, () => - h('path', { - d: 'M709.546667 560.256c-2.389333 2.474667-11.52 13.056-19.968 21.76-49.706667 54.741333-179.370667 144.341333-247.253334 171.690667-10.325333 4.394667-36.394667 13.696-50.304 14.293333-13.354667 0-26.026667-3.072-38.186666-9.301333a79.957333 79.957333 0 0 1-33.92-38.570667c-4.266667-11.221333-10.922667-44.8-10.922667-45.397333-6.656-36.736-10.325333-96.426667-10.325333-162.389334 0-62.848 3.669333-120.106667 9.088-157.397333 0.64-0.597333 7.253333-42.325333 14.549333-56.618667A76.16 76.16 0 0 1 389.632 256h2.389333c18.176 0.64 56.362667 16.853333 56.362667 17.450667 64.213333 27.392 190.890667 112.597333 241.834667 169.216 0 0 14.336 14.549333 20.565333 23.637333 9.728 13.056 14.549333 29.226667 14.549333 45.397333 0 18.048-5.461333 34.858667-15.786666 48.554667z', - }) - ) -ArrowRightIcon.displayName = 'ArrowRightIcon' - -export const ArrowBottomIcon: FunctionalComponent = () => - h(IconBase, { name: 'arrow-bottom', viewBox: '0 0 1024 1024' }, () => - h('path', { - d: 'M150.001 502.111a22.487 22.487 0 0 1 13.185 4.245l348.86 250.152 348.858-250.152a22.577 22.577 0 0 1 26.28 36.665L525.14 802.656a22.577 22.577 0 0 1-26.28 0L136.816 543.02a22.577 22.577 0 0 1 13.185-40.91z m737.183-257.196L525.14 504.55a22.577 22.577 0 0 1-26.28 0L136.816 244.915a22.577 22.577 0 1 1 26.28-36.665l348.859 250.152L860.814 208.25a22.577 22.577 0 1 1 26.28 36.665z', - }) - ) -ArrowBottomIcon.displayName = 'ArrowBottomIcon' - -export const BackTopIcon: FunctionalComponent = () => - h(IconBase, { name: 'back-top', viewBox: '0 0 1024 1024' }, () => - h('path', { - d: 'M725.902 498.916c18.205-251.45-93.298-410.738-205.369-475.592l-6.257-3.982-6.258 3.414c-111.502 64.853-224.711 224.142-204.8 475.59-55.751 53.476-80.214 116.623-80.214 204.8v15.36l179.2-35.27c11.378 40.39 58.596 69.973 113.21 69.973 54.613 0 101.262-29.582 112.64-68.836l180.337 36.41v-15.36c-0.569-89.885-25.031-153.6-82.489-206.507zM571.733 392.533c-33.564 31.29-87.04 28.445-118.329-5.12s-28.444-87.04 5.12-117.76c33.565-31.289 87.04-28.444 118.33 5.12s28.444 86.471-5.12 117.76z m-56.32 368.64c-35.84 0-64.284 29.014-64.284 64.285 0 35.84 54.044 182.613 64.284 182.613s64.285-146.773 64.285-182.613c0-35.271-29.014-64.285-64.285-64.285z', - }) - ) -BackTopIcon.displayName = 'BackTopIcon' - -export const PostIcon: FunctionalComponent = () => - h(IconBase, { name: 'post', viewBox: '0 0 1024 1024' }, () => - h('path', { - d: 'M805.376 81.0496 188.7232 81.0496c-52.6336 0-94.8736 42.3936-94.8736 94.6176l0 664.576c0 52.2752 42.496 94.6176 94.8736 94.6176L805.376 934.8608c52.6336 0 94.8736-42.3936 94.8736-94.6176L900.2496 175.7184C900.2496 123.392 857.8048 81.0496 805.376 81.0496zM288.768 204.8c39.3216 0 71.168 31.5904 71.168 71.168 0 39.3216-31.5904 71.168-71.168 71.168-39.3216 0-71.168-31.5904-71.168-71.168C217.6 236.6464 249.1904 204.8 288.768 204.8zM506.368 741.0176 217.6 741.0176l0-47.4112L506.368 693.6064 506.368 741.0176zM671.3344 617.2672 217.6 617.2672 217.6 569.856l453.7344 0L671.3344 617.2672zM671.3344 493.568 217.6 493.568 217.6 446.1056l453.7344 0L671.3344 493.568z', - }) - ) -PostIcon.displayName = 'PostIcon' - -export const ArrowDoubleRightIcon: FunctionalComponent = () => - h(IconBase, { name: 'arrow-double-right', viewBox: '0 0 1024 1024' }, () => - h('path', { - d: 'M160.117 212.026v-82.233a8 8 0 0 1 13.33-5.966l407.697 364.298c0.9 0.804 1.753 1.658 2.556 2.558 11.764 13.186 10.62 33.419-2.556 45.192L173.448 900.173a8 8 0 0 1-13.33-5.966v-82.233a16 16 0 0 1 5.338-11.93L487.814 512 165.456 223.957a16 16 0 0 1-5.339-11.931z m272.057 0v-82.233a8 8 0 0 1 13.33-5.966l407.697 364.298c0.9 0.804 1.753 1.658 2.556 2.558 11.764 13.186 10.62 33.419-2.556 45.192L445.505 900.173a8 8 0 0 1-13.33-5.966v-82.233a16 16 0 0 1 5.339-11.93L759.87 512 437.514 223.957a16 16 0 0 1-5.34-11.931z', - }) - ) -ArrowDoubleRightIcon.displayName = 'ArrowDoubleRightIcon' - -export const ArrowDoubleLeftIcon: FunctionalComponent = () => - h(IconBase, { name: 'arrow-double-left', viewBox: '0 0 1024 1024' }, () => [ - h('path', { - d: 'M495.976 476.195c19.777 17.656 21.494 48 3.837 67.774a48.003 48.003 0 0 1-3.837 3.836L536.082 512l-40.106-35.805zM864 212.083v-82.217a8 8 0 0 0-13.328-5.967L442.69 488.13c-0.9 0.804-1.754 1.657-2.558 2.557-11.772 13.184-10.626 33.412 2.558 45.183l407.983 364.231A8 8 0 0 0 864 894.134v-82.217a16 16 0 0 0-5.344-11.936L536.082 512l322.574-287.981A16 16 0 0 0 864 212.083zM495.976 476.195c19.777 17.656 21.494 48 3.837 67.774a48.003 48.003 0 0 1-3.837 3.836L536.082 512l-40.106-35.805zM864 212.083v-82.217a8 8 0 0 0-13.328-5.967L442.69 488.13c-0.9 0.804-1.754 1.657-2.558 2.557-11.772 13.184-10.626 33.412 2.558 45.183l407.983 364.231A8 8 0 0 0 864 894.134v-82.217a16 16 0 0 0-5.344-11.936L536.082 512l322.574-287.981A16 16 0 0 0 864 212.083z', - }), - h('path', { - d: 'M223.976 476.195c19.777 17.656 21.494 48 3.837 67.774a48.003 48.003 0 0 1-3.837 3.836L264.082 512l-40.106-35.805zM592 212.083v-82.217a8 8 0 0 0-13.328-5.967L170.69 488.13c-0.9 0.804-1.754 1.657-2.558 2.557-11.772 13.184-10.626 33.412 2.558 45.183l407.983 364.231A8 8 0 0 0 592 894.134v-82.217a16 16 0 0 0-5.344-11.936L264.082 512l322.574-287.981A16 16 0 0 0 592 212.083zM223.976 476.195c19.777 17.656 21.494 48 3.837 67.774a48.003 48.003 0 0 1-3.837 3.836L264.082 512l-40.106-35.805zM592 212.083v-82.217a8 8 0 0 0-13.328-5.967L170.69 488.13c-0.9 0.804-1.754 1.657-2.558 2.557-11.772 13.184-10.626 33.412 2.558 45.183l407.983 364.231A8 8 0 0 0 592 894.134v-82.217a16 16 0 0 0-5.344-11.936L264.082 512l322.574-287.981A16 16 0 0 0 592 212.083z', - }), - ]) -ArrowDoubleLeftIcon.displayName = 'ArrowDoubleLeftIcon' diff --git a/packages/theme/src/client/components/icons/index.ts b/packages/theme/src/client/components/icons/index.ts deleted file mode 100644 index dba30023..00000000 --- a/packages/theme/src/client/components/icons/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './IconBase.js' -export * from './icon.js' -export * from './socialIcon.js' diff --git a/packages/theme/src/client/components/icons/socialIcon.ts b/packages/theme/src/client/components/icons/socialIcon.ts deleted file mode 100644 index 910d7119..00000000 --- a/packages/theme/src/client/components/icons/socialIcon.ts +++ /dev/null @@ -1,126 +0,0 @@ -import { h } from 'vue' -import type { FunctionalComponent } from 'vue' -import { IconBase } from './IconBase.js' - -export const GithubIcon: FunctionalComponent = () => - h(IconBase, { name: 'github', viewBox: '0 0 1024 1024' }, () => - h('path', { - d: 'M512 0C229.283787 0 0.142041 234.942803 0.142041 524.867683c0 231.829001 146.647305 428.553077 350.068189 497.952484 25.592898 4.819996 34.976961-11.38884 34.976961-25.294314 0-12.45521-0.469203-45.470049-0.725133-89.276559-142.381822 31.735193-172.453477-70.380469-172.453477-70.380469-23.246882-60.569859-56.816233-76.693384-56.816234-76.693385-46.493765-32.58829 3.540351-31.948468 3.540351-31.948467 51.356415 3.71097 78.356923 54.086324 78.356923 54.086324 45.683323 80.19108 119.817417 57.072162 148.993321 43.593236 4.649376-33.91059 17.915029-57.029508 32.50298-70.167195-113.675122-13.222997-233.151301-58.223843-233.1513-259.341366 0-57.285437 19.919806-104.163095 52.678715-140.846248-5.246544-13.265652-22.820334-66.626844 4.990615-138.884127 0 0 42.996069-14.076094 140.760939 53.787741 40.863327-11.644769 84.627183-17.445825 128.177764-17.6591 43.465272 0.213274 87.271782 6.014331 128.135109 17.6591 97.679561-67.906489 140.59032-53.787741 140.59032-53.787741 27.938914 72.257282 10.407779 125.618474 5.118579 138.884127 32.844219 36.683154 52.593405 83.560812 52.593405 140.846248 0 201.586726-119.646798 245.990404-233.663158 258.957473 18.341577 16.208835 34.721032 48.199958 34.721032 97.210357 0 70.167195-0.639822 126.7275-0.639823 143.960051 0 14.033439 9.213443 30.370239 35.190235 25.209005 203.250265-69.527373 349.769606-266.123484 349.769605-497.867175C1023.857959 234.942803 794.673558 0 512 0', - fill: '#3E75C3', - }) - ) -GithubIcon.displayName = 'GithubIcon' - -export const EmailIcon: FunctionalComponent = () => - h(IconBase, { name: 'email', viewBox: '0 0 1024 1024' }, () => [ - [ - h('path', { - d: 'M848.76288 333.62432H164.99712C99.32288 333.62432 46.08 386.87232 46.08 452.54144v297.28768c0 65.67424 53.24288 118.92224 118.91712 118.92224h683.77088c65.66912 0 118.91712-53.24288 118.91712-118.92224V452.54144c-0.00512-65.66912-53.248-118.91712-118.92224-118.91712z', - fill: '#96383D', - }), - h('path', { - d: 'M639.8208 51.2h-474.8288a44.58496 44.58496 0 0 0-44.59008 44.59008v609.44896a44.57984 44.57984 0 0 0 44.59008 44.59008h683.776a44.58496 44.58496 0 0 0 44.59008-44.59008V304.73728L639.8208 51.2z', - fill: '#EBE2CE', - }), - h('path', { - d: 'M551.4752 229.57568H209.59232v44.59008h341.88288v-44.59008zM209.59232 794.42432h594.58048v-44.5952H209.59232v44.5952z m0-89.18528h594.58048v-44.5952H209.59232v44.5952z m0-178.37568h594.58048v-44.5952H209.59232v44.5952z m0 89.18528h594.58048v-44.59008H209.59232v44.59008z m0-222.96576v44.59008h594.58048v-44.59008H209.59232z', - fill: '#C9C1B1', - }), - h('path', { - d: 'M941.83936 393.31328L75.60704 955.02848c12.89216 10.93632 29.29664 17.77152 47.44192 17.77152H893.5936c40.91904 0 74.09152-33.4592 74.09152-74.74688V449.60768c-0.00512-22.58432-10.14784-42.58816-25.84576-56.2944z', - fill: '#D54D54', - }), - h('path', { - d: 'M71.99232 396.5696C56.25344 410.18368 46.08 430.08512 46.08 452.54144v445.93152C46.08 939.53024 79.34976 972.8 120.40192 972.8h772.95104c18.20672 0 34.65216-6.79424 47.56992-17.664L71.99232 396.5696z', - fill: '#EA5455', - }), - h('path', { - d: 'M655.52384 66.90816v236.8l237.82912 74.89024V304.73728z', - fill: '', - }), - h('path', { - d: 'M640.66048 52.0448v207.2576a44.58496 44.58496 0 0 0 44.5952 44.5952h207.2576l-251.8528-251.8528z', - fill: '#FFFBF2', - }), - ], - ]) -EmailIcon.displayName = 'EmailIcon' - -export const ZhiHuIcon: FunctionalComponent = () => - h(IconBase, { name: 'zhiHu', viewBox: '0 0 1024 1024' }, () => [ - h('path', { - d: 'M512 73.28A438.72 438.72 0 1 0 950.72 512 438.72 438.72 0 0 0 512 73.28z m-98.56 458.88l-16.8 66.88 23.68-20.8s53.92 61.28 64 76.48 1.44 68.96 1.44 68.96l-92.48-113.12s-29.12 101.12-68.48 124.16a97.6 97.6 0 0 1-80 6.56 342.08 342.08 0 0 0 85.44-89.76 382.88 382.88 0 0 0 39.52-119.36h-115.04s8.8-40.48 24.16-41.6 90.88 0 90.88 0l-1.76-124.8-43.2 2.24a96 96 0 0 1-32 48c-24.16 17.44-38.4 10.88-38.4 10.88s42.72-118.24 55.84-141.28 50.4-25.12 50.4-25.12l-23.04 66.72h147.84c17.6 0 18.56 40.64 18.56 40.64h-90.56v122.56s61.28-2.24 81.12 0 19.68 41.6 19.68 41.6z m329.44 160h-91.52l-65.12 46.24-13.6-46.24h-36.96v-368h208z', - fill: '#49C0FB', - }), - h('path', { - d: 'M602.88 691.68l54.88-41.44h43.04V364.64h-121.12v285.6h11.2l12 41.44z', - fill: '#49C0FB', - }), - ]) -ZhiHuIcon.displayName = 'ZhiHuIcon' - -export const WeiBoIcon: FunctionalComponent = () => - h(IconBase, { name: 'weiBo', viewBox: '0 0 1024 1024' }, () => [ - h('path', { - d: 'M448.698182 482.210909c-96.814545 4.654545-175.010909 56.785455-175.010909 121.949091s78.196364 114.501818 175.010909 109.847273S623.709091 647.912727 623.709091 582.749091c-0.930909-64.232727-79.127273-105.192727-175.010909-100.538182z m65.163636 164.770909c-29.789091 39.098182-88.436364 57.716364-145.221818 26.065455-26.996364-14.894545-26.065455-43.752727-26.065455-43.752728s-11.170909-92.16 85.643637-103.330909c97.745455-12.101818 115.432727 81.92 85.643636 121.018182z', - fill: '#EA5D5C', - }), - h('path', { - d: 'M448.698182 584.610909c-6.516364 4.654545-7.447273 13.032727-3.723637 18.618182 2.792727 5.585455 11.170909 6.516364 16.756364 1.861818 5.585455-4.654545 8.378182-13.032727 4.654546-18.618182-2.792727-5.585455-10.24-6.516364-17.687273-1.861818zM403.083636 597.643636c-18.618182 1.861818-30.72 17.687273-30.72 33.512728 0 14.894545 14.894545 26.065455 32.581819 24.203636 17.687273-1.861818 32.581818-15.825455 32.581818-31.650909s-13.963636-27.927273-34.443637-26.065455z', - fill: '#EA5D5C', - }), - h('path', { - d: 'M512 0C229.003636 0 0 229.003636 0 512s229.003636 512 512 512 512-229.003636 512-512S794.996364 0 512 0z m197.352727 626.501818C669.323636 712.145455 538.065455 754.036364 441.250909 746.589091c-92.16-7.447273-211.316364-38.167273-223.418182-151.738182 0 0-6.516364-51.2 42.821818-117.294545 0 0 70.749091-99.607273 152.669091-128.465455 82.850909-27.927273 92.16 19.549091 92.16 48.407273-4.654545 24.203636-12.101818 38.167273 18.618182 28.858182 0 0 80.989091-38.167273 114.501818-4.654546 26.996364 26.996364 4.654545 65.163636 4.654546 65.163637s-11.170909 12.101818 12.101818 16.756363c21.410909 3.723636 94.021818 37.236364 53.992727 122.88z m-80.058182-236.450909c-8.378182 0-15.825455-7.447273-15.825454-15.825454 0-9.309091 7.447273-15.825455 15.825454-15.825455 0 0 99.607273-18.618182 87.505455 89.367273v1.861818c-0.930909 7.447273-7.447273 13.963636-15.825455 13.963636-9.309091 0-15.825455-7.447273-15.825454-15.825454 0-1.861818 15.825455-73.541818-55.854546-57.716364zM797.789091 493.381818c-2.792727 18.618182-12.101818 11.170909-22.341818 11.170909-13.032727 0-23.272727-16.756364-23.272728-29.789091 0-11.170909 4.654545-22.341818 4.654546-22.341818 0.930909-4.654545 12.101818-34.443636-7.447273-78.196363-35.374545-60.509091-106.123636-60.509091-114.501818-57.716364-8.378182 3.723636-21.410909 5.585455-21.410909 5.585454-13.032727 0-23.272727-10.24-23.272727-23.272727 0-11.170909 7.447273-19.549091 16.756363-22.341818 0 0 0 0.930909 0.930909 0.930909s1.861818 0.930909 1.861819 0.930909c10.24-1.861818 45.614545-4.654545 79.127272 3.723637 62.370909 14.894545 146.152727 83.781818 108.916364 211.316363z', - fill: '#EA5D5C', - }), - ]) -WeiBoIcon.displayName = 'WeiBoIcon' - -// -export const QQIcon: FunctionalComponent = () => - h(IconBase, { name: 'qq', viewBox: '0 0 1024 1024' }, () => - h('path', { - d: 'M512.268258 64.433103c-247.183323 0-447.569968 200.380501-447.569968 447.563825 0 247.189467 200.385621 447.570992 447.569968 447.570992s447.569968-200.380501 447.569968-447.569968c0-247.184347-200.386645-447.564849-447.569968-447.564849z m252.85872 584.692787c-18.997168 16.287968-43.668709-53.628042-47.2134-42.875198-8.642616 26.161294-12.695154 43.646184-38.148944 72.127602-1.35972 1.521494 29.43056 12.647032 38.148944 36.396051 8.346713 22.756875 24.596797 58.811973-81.725503 70.125906-62.389428 6.635801-107.471099-33.244533-111.964932-32.85648-8.325212 0.734126-4.618747 0-13.568528 0-7.321804 0-7.807126 0.534468-14.69685 0-1.899307-0.140272-22.632985 32.85648-115.364231 32.85648-71.878798 0-90.48177-45.243445-76.032701-70.125906 14.464428-24.877342 38.579999-32.122354 35.176604-36.06636-16.73643-19.39546-28.287904-40.1404-35.176604-58.882621-1.705793-4.666869-3.135137-9.209848-4.262434-13.574672-2.611931-10.008479-22.627866 58.76385-44.111028 42.875198-21.483162-15.883533-19.567472-56.309597-5.659014-95.003248 14.033372-39.006959 49.37687-76.562049 49.771065-84.854496 1.412962-30.849665-3.044011-35.975235 0-44.078263 6.780169-18.149391 15.034732-11.190043 15.034733-20.609788 0-118.64476 88.172909-214.829571 196.933079-214.829571 108.755051 0 196.928984 96.184811 196.928984 214.829571 0 4.554242 11.815637 0 17.474651 20.609788 1.165181 4.256291 1.968931 20.684531 0.58771 44.078263-0.658358 11.238165 29.954789 24.914202 45.777913 84.854496 15.845649 59.945414 0 88.215912-7.909514 95.003248z', - fill: '#68A5E1', - }) - ) -QQIcon.displayName = 'QQIcon' - -export const TwitterIcon: FunctionalComponent = () => - h(IconBase, { name: 'twitter', viewBox: '0 0 1024 1024' }, () => [ - h('path', { - d: 'M512.274401 959.556658c247.17718 0 447.556658-200.366167 447.556658-447.556658 0-247.16387-200.379477-447.556658-447.556658-447.556658-247.188443 0-447.569968 200.392788-447.569968 447.556658 0 247.190491 200.382549 447.556658 447.569968 447.556658', - fill: '#78CBEF', - }), - h('path', { - d: 'M736.810405 394.754891c-16.48353 7.310541-34.227463 12.256931-52.82122 14.478763 19.004336-11.383557 33.588558-29.396772 40.435279-50.868671-17.780793 10.536804-37.440415 18.183179-58.42392 22.294079-16.741549-17.872942-40.666677-29.038412-67.134113-29.038412-50.766282 0-91.948998 41.192954-91.948998 91.972548 0 7.220439 0.784296 14.222791 2.366199 20.943574-76.439183-3.841618-144.191723-40.421969-189.587726-96.109044-7.915657 13.630985-12.452493 29.422369-12.452493 46.282688 0 31.877646 16.241893 60.042683 40.924696 76.552835-15.072616-0.460748-29.26981-4.637177-41.682371-11.485946v1.131393c0 44.585086 31.698466 81.757243 73.804725 90.185867-7.723167 2.160398-15.841554 3.239573-24.246628 3.239574a91.24866 91.24866 0 0 1-17.294447-1.63105c11.691747 36.527109 45.654023 63.139936 85.90705 63.845394-31.477307 24.682804-71.144672 39.382725-114.227718 39.382725-7.42624 0-14.762379-0.410578-21.946982-1.270642 40.706609 26.070168 89.057546 41.308653 140.992081 41.308653 169.209337 0 261.697922-140.132017 261.697922-261.695874 0-3.997248-0.078839-7.979138-0.244709-11.899595a186.466924 186.466924 0 0 0 45.883373-47.618859', - fill: '#FFFFFF', - }), - ]) -TwitterIcon.displayName = 'TwitterIcon' - -export const FacebookIcon: FunctionalComponent = () => - h(IconBase, { name: 'facebook', viewBox: '0 0 1024 1024' }, () => [ - h('path', { - d: 'M512.262115 959.556658c247.175132 0 447.569968-200.366167 447.569968-447.556658 0-247.16387-200.394836-447.556658-447.569968-447.556658-247.17718 0-447.556658 200.392788-447.556658 447.556658-0.001024 247.190491 200.378454 447.556658 447.556658 447.556658', - fill: '#537BBC', - }), - h('path', { - d: 'M404.292383 436.216104h46.269378v-44.969044c0-19.828563 0.499656-50.408946 14.904699-69.347753 15.172957-20.05689 36.000832-33.690947 71.826579-33.690946 58.371702 0 82.952117 8.326235 82.952118 8.326235l-11.564785 68.550147s-19.285904-5.576079-37.275569-5.57608c-17.99888 0-34.111763 6.449454-34.111764 24.438095v52.269346h73.791416l-5.152191 66.958004h-68.639225v232.604221h-86.731278V503.174108h-46.269378v-66.958004z', - fill: '#FFFFFF', - }), - ]) -FacebookIcon.displayName = 'FacebookIcon' - -export const LinkedinIcon: FunctionalComponent = () => - h(IconBase, { name: 'linkedin', viewBox: '0 0 1024 1024' }, () => [ - h('path', { - d: 'M512.267234 959.569968c247.223255 0 447.572016-200.400979 447.572016-447.582255 0-247.171037-200.347737-447.558705-447.572016-447.558705-247.194586 0-447.568944 200.387669-447.568944 447.558705 0 247.1823 200.373334 447.582255 447.568944 447.582255', - fill: '#1284C7', - }), - h('path', { - d: 'M387.013295 699.188763h-87.249365V419.999808h87.249365v279.188955z m-45.860848-314.114707h-0.628666c-31.57048 0-52.042043-21.341866-52.042043-48.378582 0-27.573232 21.086918-48.478922 53.286064-48.478922 32.175596 0 51.975491 20.852449 52.607228 48.402131 0.001024 27.046955-20.430608 48.455373-53.222583 48.455373z m394.899259 314.114707H637.125954V554.711376c0-37.815157-15.457597-63.618091-49.496664-63.61809-26.03126 0-40.488521 17.410146-47.233878 34.204937-2.518758 6.013279-2.133777 14.405043-2.133777 22.820356v151.06916h-98.001184s1.273713-255.921161 0-279.188955h98.001184v43.815125c5.794167-19.157918 37.097413-46.5018 87.093733-46.5018 61.986018 0 110.696338 40.168045 110.696338 126.630041v155.246613z', - fill: '#FFFFFF', - }), - ]) -LinkedinIcon.displayName = 'LinkedinIcon' diff --git a/packages/theme/src/client/composables/archive.ts b/packages/theme/src/client/composables/archive.ts deleted file mode 100644 index 28d657eb..00000000 --- a/packages/theme/src/client/composables/archive.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { ref } from 'vue' -import type { Ref } from 'vue' -import { usePostAllIndex } from './postIndex.js' - -export interface ArchiveItem { - year: string - children: ArchiveChild[] -} - -export interface ArchiveChild { - date: string - text: string - link: string -} - -export type ArchiveData = ArchiveItem[] - -export type ArchiveListRef = Ref - -export const useArchive = (): ArchiveListRef => { - let archiveList: ArchiveData = [] - const postList = usePostAllIndex().value - postList.forEach((post) => { - const [year, month, day] = post.createTime.split('-') - let current = archiveList.find((arch) => arch.year === year) - if (!current) { - current = { year, children: [] } - archiveList.push(current) - } - current.children.push({ - date: `${month}-${day}`, - text: post.title, - link: post.path, - }) - }) - - archiveList = archiveList.sort((left, right) => { - return left.year > right.year ? -1 : 1 - }) - - return ref(archiveList) -} diff --git a/packages/theme/src/client/composables/asideNavbar.ts b/packages/theme/src/client/composables/asideNavbar.ts deleted file mode 100644 index 368e9d65..00000000 --- a/packages/theme/src/client/composables/asideNavbar.ts +++ /dev/null @@ -1,23 +0,0 @@ -import type { Ref } from 'vue' -import { ref } from 'vue' - -const asideNavbarShow = ref(false) - -const triggerAsideNavbar = (show?: boolean): void => { - if (typeof show === 'boolean') { - asideNavbarShow.value = show - } else { - asideNavbarShow.value = !asideNavbarShow.value - } -} - -interface UseAsideNavbar { - asideNavbarShow: Ref - triggerAsideNavbar: (show?: boolean) => void -} -export const useAsideNavbar = (): UseAsideNavbar => { - return { - asideNavbarShow, - triggerAsideNavbar, - } -} diff --git a/packages/theme/src/client/composables/blogger.ts b/packages/theme/src/client/composables/blogger.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/theme/src/client/composables/category.ts b/packages/theme/src/client/composables/category.ts deleted file mode 100644 index bc5e3fa4..00000000 --- a/packages/theme/src/client/composables/category.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { ref } from 'vue' -import type { Ref } from 'vue' -import type { PostItem } from '../../shared/index.js' -import { usePostIndex } from './postIndex.js' - -export interface CategoryItem { - label: string - type: string | number - children: CategoryList - postList: PostItem[] -} - -export type CategoryList = CategoryItem[] - -export type CategoryListRef = Ref - -export const useCategoryList = (): CategoryListRef => { - let categoryListRaw: CategoryList = [] - usePostIndex().value.forEach((post: PostItem) => { - if (post.category.length === 0) return - const category = post.category.map((cate, index) => { - if (index > 0) { - return { - type: post.category - .slice(0, index + 1) - .map((c) => c.type) - .join('-'), - name: cate.name, - } - } else { - return cate - } - }) - let index = 1 - let cate = category[0] - let first = categoryListRaw.find((c) => c.type === cate.type) - if (!first) { - first = { - label: cate.name, - type: cate.type, - children: [], - postList: [], - } - categoryListRaw.push(first) - } - - if (category.length === 1) { - first.postList.push(post) - } - let children = first.children - while ((cate = category[index])) { - let current = children.find((c) => c.type === cate.type) - if (!current) { - current = { - label: cate.name, - type: cate.type, - children: [], - postList: [], - } - children.push(current) - } - children = current.children - if (index === category.length - 1) { - current.postList.push(post) - } - index++ - } - }) - categoryListRaw = categorySort(categoryListRaw) - sortChildren(categoryListRaw, 1) - function sortChildren(list: CategoryList, deep: number): void { - list.forEach((category) => { - if (category.children.length > 0) { - category.children = categorySort(category.children, deep) - sortChildren(category.children, deep + 1) - } - }) - } - - return ref(categoryListRaw) -} - -function categorySort(children: CategoryList, deep = 0): CategoryList { - return children.sort((left, right) => { - const leftType = Number((left.type + '').split('-')[deep]) - const rightType = Number((right.type + '').split('-')[deep]) - return leftType > rightType ? 1 : -1 - }) -} diff --git a/packages/theme/src/client/composables/darkMode.ts b/packages/theme/src/client/composables/darkMode.ts deleted file mode 100644 index 789c03aa..00000000 --- a/packages/theme/src/client/composables/darkMode.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { usePreferredDark, useStorage } from '@vueuse/core' -import { computed, inject, onMounted, onUnmounted, provide, watch } from 'vue' -import type { InjectionKey, WritableComputedRef } from 'vue' -import { useThemeLocaleData } from './themeData.js' - -export type DarkModeRef = WritableComputedRef - -export const darkModeSymbol: InjectionKey = Symbol( - __VUEPRESS_DEV__ ? 'darkMode' : '' -) - -export const useDarkMode = (): DarkModeRef => { - const isDarkMode = inject(darkModeSymbol) - if (!isDarkMode) { - throw new Error('useDarkMode() is called without provider') - } - return isDarkMode -} - -export const setupDarkMode = (): void => { - const themeLocale = useThemeLocaleData() - const isDarkPreferred = usePreferredDark() - const darkStorage = useStorage('vuepress-color-scheme', 'auto') - - const isDarkMode = computed({ - get() { - if (!themeLocale.value.darkMode) { - return false - } - if (darkStorage.value === 'auto') { - return isDarkPreferred.value - } - return darkStorage.value === 'dark' - }, - set(val) { - if (val === isDarkPreferred.value) { - darkStorage.value = 'auto' - } else { - darkStorage.value = val ? 'dark' : 'light' - } - }, - }) - provide(darkModeSymbol, isDarkMode) - updateHtmlDarkClass(isDarkMode) -} - -export const updateHtmlDarkClass = (isDarkMode: DarkModeRef): void => { - const update = (value = isDarkMode.value): void => { - const htmlEl = window?.document.querySelector('html') - htmlEl?.classList.toggle('dark', value) - } - onMounted(() => { - watch(isDarkMode, update, { immediate: true }) - }) - onUnmounted(() => update()) -} diff --git a/packages/theme/src/client/composables/index.ts b/packages/theme/src/client/composables/index.ts deleted file mode 100644 index e831b794..00000000 --- a/packages/theme/src/client/composables/index.ts +++ /dev/null @@ -1,16 +0,0 @@ -export * from './themeData.js' -export * from './darkMode.js' -export * from './navbar.js' -export * from './navLink.js' -export * from './resolveRouteWithRedirect.js' - -export * from './postIndex.js' -export * from './sidebarIndex.js' -export * from './postList.js' -export * from './scrollPromise.js' -export * from './asideNavbar.js' -export * from './postStat.js' - -export * from './tag.js' -export * from './category.js' -export * from './archive.js' diff --git a/packages/theme/src/client/composables/navLink.ts b/packages/theme/src/client/composables/navLink.ts deleted file mode 100644 index b467fe9c..00000000 --- a/packages/theme/src/client/composables/navLink.ts +++ /dev/null @@ -1,16 +0,0 @@ -import type { NavLink } from '../../shared/index.js' -import { useResolveRouteWithRedirect } from './resolveRouteWithRedirect.js' - -declare module 'vue-router' { - interface RouteMeta { - title?: string - } -} - -export const useNavLink = (item: string): NavLink => { - const resolved = useResolveRouteWithRedirect(item) - return { - text: resolved.meta.title || item, - link: resolved.name === '404' ? item : resolved.fullPath, - } -} diff --git a/packages/theme/src/client/composables/navbar.ts b/packages/theme/src/client/composables/navbar.ts deleted file mode 100644 index 8fbc0d8d..00000000 --- a/packages/theme/src/client/composables/navbar.ts +++ /dev/null @@ -1,128 +0,0 @@ -import { useRouteLocale, useSiteLocaleData } from '@vuepress/client' -import { isLinkHttp, isString } from '@vuepress/shared' -import type { ComputedRef } from 'vue' -import { computed } from 'vue' -import { useRouter } from 'vue-router' -import type { - NavbarGroup, - NavbarItem, - NavLink, - ResolveNavbarItem, -} from '../../shared/index.js' -import { resolveRepoType } from '../utils/index.js' -import { useNavLink } from './navLink.js' -import { useThemeLocaleData } from './themeData.js' - -export const useNavbarSelectLanguage = (): ComputedRef => { - const router = useRouter() - const routeLocale = useRouteLocale() - const siteLocale = useSiteLocaleData() - const themeLocale = useThemeLocaleData() - - return computed(() => { - const localePaths = Object.keys(siteLocale.value.locales) - if (localePaths.length < 2) { - return [] - } - - const currentPath = router.currentRoute.value.path - const currentFullPath = router.currentRoute.value.fullPath - - const languageDropdown: ResolveNavbarItem = { - text: themeLocale.value.selectLanguageText ?? 'unknown language', - ariaLabel: - themeLocale.value.selectLanguageAriaLabel ?? 'unknown language', - children: localePaths.map((targetLocalPath) => { - const targetSiteLocale = - siteLocale.value.locales?.[targetLocalPath] ?? {} - const targetThemeLocale = - themeLocale.value.locales?.[targetLocalPath] ?? {} - const targetLang = `${targetSiteLocale.lang}` - - const text = targetThemeLocale.selectLanguageName ?? targetLang - let link: string - - if (targetLang === siteLocale.value.lang) { - link = currentFullPath - } else { - const targetLocalePage = currentPath.replace( - routeLocale.value, - targetLocalPath - ) - if ( - router.getRoutes().some((item) => item.path === targetLocalPath) - ) { - link = targetLocalePage - } else { - link = (targetThemeLocale.home as NavLink)?.link ?? targetLocalPath - } - } - return { text, link } - }), - } - return [languageDropdown] - }) -} - -export const useNavbarRepo = (): ComputedRef => { - const themeLocale = useThemeLocaleData() - - const repo = computed(() => themeLocale.value.repo) - const repoType = computed(() => { - return repo.value ? resolveRepoType(repo.value) : null - }) - - const repoLink = computed(() => { - if (repo.value && !isLinkHttp(repo.value)) { - return `https://github.com/${repo.value}` - } - return repo.value - }) - - const repoLabel = computed(() => { - if (!repoLink.value) return null - if (themeLocale.value.repoLabel) return themeLocale.value.repoLabel - if (repoType.value === null) return 'Source' - return repoType.value - }) - - return computed(() => { - if (!repoLink.value || !repoLabel.value) { - return [] - } - return [ - { - text: repoLabel.value, - link: repoLink.value, - }, - ] - }) -} - -const resolveNavbarItem = ( - item: NavbarItem | NavbarGroup | string -): ResolveNavbarItem => { - if (isString(item)) { - return useNavLink(item) - } - if ((item as NavbarGroup).children) { - return { - ...item, - children: (item as NavbarGroup).children.map(resolveNavbarItem), - } - } - return item as ResolveNavbarItem -} - -export const useNavbarConfig = (): ComputedRef => { - const themeLocale = useThemeLocaleData() - const { navbar, home, category, archive, tag } = themeLocale.value - const config: NavbarItem[] = [ - home as NavbarItem, - ...((navbar || []) as unknown as NavbarItem[]), - category as NavbarItem, - tag as NavbarItem, - archive as NavbarItem, - ].filter((nav) => nav) - return computed(() => config.map(resolveNavbarItem)) -} diff --git a/packages/theme/src/client/composables/postIndex.ts b/packages/theme/src/client/composables/postIndex.ts deleted file mode 100644 index de48b271..00000000 --- a/packages/theme/src/client/composables/postIndex.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { postIndex as postIndexRaw } from '@internal/postIndex' -import { ref } from 'vue' -import type { Ref } from 'vue' -import type { PostIndex } from '../../shared/index.js' - -const isBoolean = (arg: unknown): boolean => { - return typeof arg === 'boolean' -} - -export type PostIndexRef = Ref - -export const postIndex: PostIndexRef = ref(postIndexRaw) - -export const usePostAllIndex = (): PostIndexRef => postIndex - -// 在首页文章列表的,默认排除掉 note中的文章,除非显示声明 article -export const usePostIndex = (): PostIndexRef => { - const postIndexData = [ - ...postIndex.value - .filter((post) => post.sticky) - .sort((left, right) => { - const leftSticky = isBoolean(left.sticky) ? 1 : (left.sticky as number) - const rightSticky = isBoolean(right.sticky) - ? 1 - : (right.sticky as number) - return leftSticky < rightSticky ? 1 : -1 - }), - ...postIndex.value.filter((post) => !post.sticky), - ] - const postList = postIndexData.filter((post) => { - if (post.isNote) { - return post.article === true - } else { - return post.article !== false - } - }) - return ref(postList) -} - -export type PostTotalRef = Ref -export const postTotal: PostTotalRef = ref(0) - -if (import.meta.hot) { - __VUE_HMR_RUNTIME__.updatePostIndex = (data: PostIndex) => { - postIndex.value = data - } -} diff --git a/packages/theme/src/client/composables/postList.ts b/packages/theme/src/client/composables/postList.ts deleted file mode 100644 index 7bc8c4d0..00000000 --- a/packages/theme/src/client/composables/postList.ts +++ /dev/null @@ -1,45 +0,0 @@ -import type { Ref } from 'vue' -import { ref } from 'vue' -import type { PostItem } from '../../shared/index.js' -import { usePostIndex } from './postIndex.js' - -export type PostListData = PostItem[] -export type PostListRef = Ref - -interface UsePostList { - postList: PostListRef - total: Ref - page: Ref - setPostListPage: (page: number) => void - resetPostIndex: (postIndex: PostListData) => void -} - -export const usePostList = (): UsePostList => { - const postIndex = ref(usePostIndex().value) - const pageNum = 10 - const total = ref(postIndex.value.length) - let totalPage = Math.ceil(postIndex.value.length / pageNum) - const postList = ref([]) - const page = ref(1) - - const setPostListPage = (_page = 1): void => { - _page = _page - 1 - if (_page < 0) _page = 0 - if (_page > totalPage) _page = totalPage - 1 - const start = _page * pageNum - const end = start + pageNum - postList.value = postIndex.value.filter((_: PostItem, index: number) => { - return start <= index && index < end - }) - page.value = _page + 1 - } - const resetPostIndex = (_postIndex: PostListData): void => { - postIndex.value = _postIndex - totalPage = Math.ceil(postIndex.value.length / pageNum) - total.value = postIndex.value.length - setPostListPage(1) - } - setPostListPage(1) - - return { postList, setPostListPage, page, total, resetPostIndex } -} diff --git a/packages/theme/src/client/composables/postStat.ts b/packages/theme/src/client/composables/postStat.ts deleted file mode 100644 index 888c87db..00000000 --- a/packages/theme/src/client/composables/postStat.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { reactive } from 'vue' -import { usePostAllIndex } from './postIndex.js' -import { useTagList } from './tag.js' - -export interface PostStatData { - postTotal: number - tagTotal: number - categoryTotal: number -} - -export const usePostStat = (): PostStatData => { - const data: PostStatData = Object.create(null) - - const postIndex = usePostAllIndex() - const tagList = useTagList() - - data.postTotal = postIndex.value.length - data.tagTotal = tagList.value.length - - const categorySet = new Set() - - postIndex.value.forEach((post) => { - const category = post.category || [] - category.forEach((cate) => categorySet.add(cate.name)) - }) - - data.categoryTotal = categorySet.size - - const stat = reactive(data) - return stat -} diff --git a/packages/theme/src/client/composables/resolveRouteWithRedirect.ts b/packages/theme/src/client/composables/resolveRouteWithRedirect.ts deleted file mode 100644 index b807a9c4..00000000 --- a/packages/theme/src/client/composables/resolveRouteWithRedirect.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { isFunction, isString } from '@vuepress/shared' -import type { Router } from 'vue-router' -import { useRouter } from 'vue-router' - -export const useResolveRouteWithRedirect = ( - ...args: Parameters -): ReturnType => { - const router = useRouter() - const route = router.resolve(...args) - const lastMatched = route.matched[route.matched.length - 1] - if (!lastMatched?.redirect) { - return route - } - const { redirect } = lastMatched - const resolveRedirect = isFunction(redirect) ? redirect(route) : redirect - const resolveRedirectObj = isString(resolveRedirect) - ? { path: resolveRedirect } - : resolveRedirect - - return useResolveRouteWithRedirect({ - hash: route.hash, - query: route.query, - params: route.params, - ...resolveRedirectObj, - }) -} diff --git a/packages/theme/src/client/composables/scrollPromise.ts b/packages/theme/src/client/composables/scrollPromise.ts deleted file mode 100644 index aecad269..00000000 --- a/packages/theme/src/client/composables/scrollPromise.ts +++ /dev/null @@ -1,21 +0,0 @@ -export interface ScrollPromise { - wait(): Promise | null - pending: () => void - resolve: () => void -} -let promise: Promise | null = null -let promiseResolve: (() => void) | null = null - -const scrollPromise: ScrollPromise = { - wait: () => promise, - pending: () => { - promise = new Promise((resolve) => (promiseResolve = resolve)) - }, - resolve: () => { - promiseResolve?.() - promise = null - promiseResolve = null - }, -} - -export const useScrollPromise = (): ScrollPromise => scrollPromise diff --git a/packages/theme/src/client/composables/sidebarIndex.ts b/packages/theme/src/client/composables/sidebarIndex.ts deleted file mode 100644 index 172157fb..00000000 --- a/packages/theme/src/client/composables/sidebarIndex.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { sidebarIndex as sidebarIndexRaw } from '@internal/sidebarIndex' -import { usePageFrontmatter } from '@vuepress/client' -import { computed, ref } from 'vue' -import type { ComputedRef, Ref } from 'vue' -import { useRoute } from 'vue-router' -import type { SidebarOptions } from '../../shared/index.js' -import { useThemeLocaleData } from './themeData.js' - -export type SidebarIndexRef = Ref> - -export type SidebarRef = ComputedRef - -export const sidebarIndex: SidebarIndexRef = ref(sidebarIndexRaw) - -interface UseSidebarIndex { - sidebarList: SidebarRef - hasSidebar: ComputedRef -} - -export const useSidebarIndex = (): UseSidebarIndex => { - // const sidebarList: SidebarRef = ref([]) - const themeLocale = useThemeLocaleData() - const route = useRoute() - const frontmatter = usePageFrontmatter() - const sidebarList = computed(() => { - const notes = themeLocale.value.notes - if (!notes) return [] - const prefix = notes.link?.replace(/^\/|\/$/g, '') - if (route.path.startsWith(`/${prefix}`)) { - const key = Object.keys(sidebarIndex.value).find((key) => - route.path.startsWith(key) - ) - if (key) return sidebarIndex.value[key] - } - return [] - }) - const hasSidebar = computed(() => { - return !frontmatter.value.home && sidebarList.value.length > 0 - }) - return { sidebarList, hasSidebar } -} - -if (import.meta.hot) { - __VUE_HMR_RUNTIME__.updateSidebarIndex = ( - data: Record - ) => { - sidebarIndex.value = data - } -} diff --git a/packages/theme/src/client/composables/tag.ts b/packages/theme/src/client/composables/tag.ts deleted file mode 100644 index 53c4457e..00000000 --- a/packages/theme/src/client/composables/tag.ts +++ /dev/null @@ -1,25 +0,0 @@ -import type { Ref } from 'vue' -import { ref } from 'vue' -import { getColor } from '../utils/index.js' -import { usePostAllIndex } from './postIndex.js' - -export interface TagItem { - tag: string - color: string -} -export type TagRaw = TagItem[] - -export type TagRef = Ref - -export const tagList: TagRef = ref([]) - -export const useTagList = (): TagRef => { - const postList = usePostAllIndex().value - let list: string[] = [] - postList.forEach((post) => { - list.push(...post.tags) - }) - list = Array.from(new Set(list)) - tagList.value = list.map((tag) => ({ tag, color: getColor() })) - return tagList -} diff --git a/packages/theme/src/client/composables/themeData.ts b/packages/theme/src/client/composables/themeData.ts deleted file mode 100644 index 829d968b..00000000 --- a/packages/theme/src/client/composables/themeData.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { - useThemeData as _useThemeData, - useThemeLocaleData as _useThemeLocaleData, -} from '@vuepress/plugin-theme-data/client' -import type { - ThemeDataRef, - ThemeLocaleDataRef, -} from '@vuepress/plugin-theme-data/client' -import type { PlumeThemeData } from '../../shared/index.js' - -export const useThemeData = (): ThemeDataRef => - _useThemeData() - -export const useThemeLocaleData = (): ThemeLocaleDataRef => - _useThemeLocaleData() diff --git a/packages/theme/src/client/config.ts b/packages/theme/src/client/config.ts index bcfd07eb..dc4e4d21 100644 --- a/packages/theme/src/client/config.ts +++ b/packages/theme/src/client/config.ts @@ -1,44 +1,8 @@ import { defineClientConfig } from '@vuepress/client' -import { h } from 'vue' -import Badge from './components/global/Badge.vue' -import { setupDarkMode, useScrollPromise } from './composables/index.js' -import NotFound from './layouts/404.vue' import Layout from './layouts/Layout.vue' - -import './styles/index.scss' +import NotFound from './layouts/NotFound.vue' export default defineClientConfig({ - enhance({ app, router }) { - // eslint-disable-next-line vue/match-component-file-name - app.component('Badge', Badge) - - // eslint-disable-next-line vue/match-component-file-name - app.component('NavbarSearch', () => { - const SearchComponent = - app.component('Docsearch') || app.component('SearchBox') - if (SearchComponent) { - return h(SearchComponent) - } - return null - }) - // eslint-disable-next-line vue/match-component-file-name - app.component('Comment', (props) => { - const CommentService = app.component('CommentService') - if (CommentService) { - return h(CommentService, props) - } - return null - }) - - const scrollBehavior = router.options.scrollBehavior! - router.options.scrollBehavior = async (...args) => { - await useScrollPromise().wait() - return scrollBehavior(...args) - } - }, - setup() { - setupDarkMode() - }, layouts: { Layout, NotFound, diff --git a/packages/theme/src/client/index.ts b/packages/theme/src/client/index.ts index 72593733..e69de29b 100644 --- a/packages/theme/src/client/index.ts +++ b/packages/theme/src/client/index.ts @@ -1 +0,0 @@ -export * from '../shared/index.js' diff --git a/packages/theme/src/client/layouts/404.vue b/packages/theme/src/client/layouts/404.vue deleted file mode 100644 index 1224c780..00000000 --- a/packages/theme/src/client/layouts/404.vue +++ /dev/null @@ -1,33 +0,0 @@ - - - - diff --git a/packages/theme/src/client/layouts/Layout.vue b/packages/theme/src/client/layouts/Layout.vue index 43fd14a8..167e2c32 100644 --- a/packages/theme/src/client/layouts/Layout.vue +++ b/packages/theme/src/client/layouts/Layout.vue @@ -1,70 +1,3 @@ - diff --git a/packages/theme/src/client/layouts/NotFound.vue b/packages/theme/src/client/layouts/NotFound.vue new file mode 100644 index 00000000..071571d2 --- /dev/null +++ b/packages/theme/src/client/layouts/NotFound.vue @@ -0,0 +1,3 @@ + diff --git a/packages/theme/src/client/shim.d.ts b/packages/theme/src/client/shim.d.ts index 390043ae..bf554924 100644 --- a/packages/theme/src/client/shim.d.ts +++ b/packages/theme/src/client/shim.d.ts @@ -3,19 +3,3 @@ declare module '*.vue' { const comp: ComponentOptions export default comp } - -declare const __VUEPRESS_DEV__: boolean -declare const __VUEPRESS_SSR__: boolean -declare const __VUE_HMR_RUNTIME__: Record - -declare module '@internal/postIndex' { - import type { PostIndex } from '../shared' - const postIndex: PostIndex - export { postIndex } -} - -declare module '@internal/sidebarIndex' { - import type { SidebarOptions } from '../shared' - const sidebarIndex: Record - export { sidebarIndex } -} diff --git a/packages/theme/src/client/styles/_mixins.scss b/packages/theme/src/client/styles/_mixins.scss deleted file mode 100644 index 1d245dea..00000000 --- a/packages/theme/src/client/styles/_mixins.scss +++ /dev/null @@ -1,38 +0,0 @@ -@import '_variables'; - -@mixin content_wrapper { - max-width: var(--content-width); - margin: 0 auto; - padding: 2rem 2.5rem; - - @media (max-width: $MQNarrow) { - padding: 2rem; - } - - @media (max-width: $MQMobileNarrow) { - padding: 1.5rem; - } -} - -@mixin dropdown_wrapper { - transition: height 0.1s ease-out; - overflow: hidden; -} - -@mixin wrapper { - width: 100%; - padding-top: var(--navbar-height); -} - -@mixin container_wrapper { - width: 100%; - max-width: $containerWith; - margin: auto; -} - -@mixin content { - padding: 1.25rem; - background-color: var(--c-bg-container); - // border-radius: var(--p-around); - // box-shadow: var(--shadow); -} diff --git a/packages/theme/src/client/styles/_variables.scss b/packages/theme/src/client/styles/_variables.scss deleted file mode 100644 index 948203a9..00000000 --- a/packages/theme/src/client/styles/_variables.scss +++ /dev/null @@ -1,11 +0,0 @@ -@import '@vuepress/plugin-palette/palette'; - -$MQNarrow: 959px !default; -$MQMobile: 719px !default; -$MQMobileNarrow: 419px !default; - -$containerWith: 1200px !default; - -$codeLang: 'c' 'cpp' 'cs' 'dart' 'docker' 'fs' 'go' 'java' 'kt' 'makefile' 'css' - 'less' 'sass' 'scss' 'styl' 'html' 'js' 'json' 'ts' 'vue' 'jsx' 'md' 'php' - 'py' 'rb' 'rs' 'sh' 'toml' 'yml' !default; diff --git a/packages/theme/src/client/styles/arrow.scss b/packages/theme/src/client/styles/arrow.scss deleted file mode 100644 index 94a4f796..00000000 --- a/packages/theme/src/client/styles/arrow.scss +++ /dev/null @@ -1,37 +0,0 @@ -.arrow { - display: inline-block; - width: 0; - height: 0; - - &.up { - border: { - left: 4px solid transparent; - right: 4px solid transparent; - bottom: 6px solid var(--c-bg-arrow); - } - } - - &.down { - border: { - left: 4px solid transparent; - right: 4px solid transparent; - top: 6px solid var(--c-bg-arrow); - } - } - - &.right { - border: { - top: 4px solid transparent; - bottom: 4px solid transparent; - left: 6px solid var(--c-bg-arrow); - } - } - - &.left { - border: { - top: 4px solid transparent; - bottom: 4px solid transparent; - right: 6px solid var(--c-bg-arrow); - } - } -} diff --git a/packages/theme/src/client/styles/code.scss b/packages/theme/src/client/styles/code.scss deleted file mode 100644 index 3478ccf9..00000000 --- a/packages/theme/src/client/styles/code.scss +++ /dev/null @@ -1,282 +0,0 @@ -@import '_variables'; - -// =============================== -// Forked and modified from prismjs/themes/prism-tomorrow.css - -code[class*='language-'], -pre[class*='language-'] { - color: #ccc; - background: none; - font-family: var(--font-family-code); - font-size: 1em; - text-align: left; - white-space: pre; - word-spacing: normal; - word-break: normal; - word-wrap: normal; - line-height: 1.5; - - -moz-tab-size: 4; - -o-tab-size: 4; - tab-size: 4; - - -webkit-hyphens: none; - -moz-hyphens: none; - -ms-hyphens: none; - hyphens: none; -} - -/* Code blocks */ -pre[class*='language-'] { - padding: 1em; - margin: 0.5em 0; - overflow: auto; -} - -:not(pre) > code[class*='language-'], -pre[class*='language-'] { - background: #2d2d2d; -} - -/* Inline code */ -:not(pre) > code[class*='language-'] { - padding: 0.1em; - border-radius: 0.3em; - white-space: normal; -} - -.token.comment, -.token.block-comment, -.token.prolog, -.token.doctype, -.token.cdata { - color: #999; -} - -.token.punctuation { - color: #ccc; -} - -.token.tag, -.token.attr-name, -.token.namespace, -.token.deleted { - color: #ec5975; -} - -.token.function-name { - color: #6196cc; -} - -.token.boolean, -.token.number, -.token.function { - color: #f08d49; -} - -.token.property, -.token.class-name, -.token.constant, -.token.symbol { - color: #f8c555; -} - -.token.selector, -.token.important, -.token.atrule, -.token.keyword, -.token.builtin { - color: #cc99cd; -} - -.token.string, -.token.char, -.token.attr-value, -.token.regex, -.token.variable { - color: #7ec699; -} - -.token.operator, -.token.entity, -.token.url { - color: #67cdcc; -} - -.token.important, -.token.bold { - font-weight: bold; -} -.token.italic { - font-style: italic; -} - -.token.entity { - cursor: help; -} - -.token.inserted { - color: #3eaf7c; -} - -// =============================== - -.plume-theme-content { - pre, - pre[class*='language-'] { - line-height: 1.4; - padding: 1.3rem 1.5rem; - margin: 0.85rem 0; - border-radius: 6px; - overflow: auto; - scrollbar-width: thin; - scrollbar-color: var(--c-brand) var(--c-border); - - &::-webkit-scrollbar { - width: 7px; - height: 7px; - } - - &::-webkit-scrollbar-track { - background-color: var(--code-bg-color); - } - - &::-webkit-scrollbar-thumb { - background-color: rgba(220, 220, 220, 0.35); - border-radius: 3px; - } - - code { - color: #fff; - padding: 0; - background-color: transparent; - border-radius: 0; - overflow-wrap: unset; - -webkit-font-smoothing: auto; - -moz-osx-font-smoothing: auto; - } - } - - .line-number { - font-family: var(--font-family-code); - } -} - -div[class*='language-'] { - position: relative; - background-color: var(--code-bg-color); - border-radius: 6px; - - &::before { - position: absolute; - z-index: 3; - top: 0.8em; - right: 1em; - font-size: 0.75rem; - color: var(--code-ln-color); - } - - pre, - pre[class*='language-'] { - // force override the background color to be compatible with shiki - background: transparent !important; - position: relative; - z-index: 1; - } - - .highlight-lines { - user-select: none; - padding-top: 1.3rem; - position: absolute; - top: 0; - left: 0; - width: 100%; - line-height: 1.4; - - .highlight-line { - background-color: var(--code-hl-bg-color); - } - } - - &:not(.line-numbers-mode) { - .line-numbers { - display: none; - } - } - - &.line-numbers-mode { - .highlight-lines .highlight-line { - position: relative; - - &::before { - content: ' '; - position: absolute; - z-index: 2; - left: 0; - top: 0; - display: block; - width: var(--code-ln-wrapper-width); - height: 100%; - } - } - - pre { - margin-left: var(--code-ln-wrapper-width); - padding-left: 1rem; - vertical-align: middle; - } - - .line-numbers { - position: absolute; - top: 0; - width: var(--code-ln-wrapper-width); - text-align: center; - color: var(--code-ln-color); - padding-top: 1.25rem; - line-height: 1.4; - counter-reset: line-number; - - .line-number { - position: relative; - z-index: 3; - user-select: none; - height: 1.4em; - - &::before { - counter-increment: line-number; - content: counter(line-number); - font-size: 0.85em; - } - } - } - - &::after { - content: ''; - position: absolute; - top: 0; - left: 0; - width: var(--code-ln-wrapper-width); - height: 100%; - border-radius: 6px 0 0 6px; - border-right: 1px solid var(--code-hl-bg-color); - } - } -} - -@each $lang in $codeLang { - div[class*='language-'].ext-#{$lang} { - &:before { - content: '' + $lang; - } - } -} - -// narrow mobile -@media (max-width: $MQMobileNarrow) { - .plume-theme-content { - div[class*='language-'] { - margin: 0.85rem -1.5rem; - border-radius: 0; - } - } -} diff --git a/packages/theme/src/client/styles/icons.scss b/packages/theme/src/client/styles/icons.scss deleted file mode 100644 index baaad858..00000000 --- a/packages/theme/src/client/styles/icons.scss +++ /dev/null @@ -1,4 +0,0 @@ -.icon { - width: 20px; - height: 20px; -} diff --git a/packages/theme/src/client/styles/index.scss b/packages/theme/src/client/styles/index.scss deleted file mode 100644 index 4eb29e20..00000000 --- a/packages/theme/src/client/styles/index.scss +++ /dev/null @@ -1,13 +0,0 @@ -@use 'vars'; -@use 'vars-dark'; - -@use 'normalize'; -@use 'arrow'; -@use 'transition'; -@use 'icons'; - -@use 'layout'; -@use 'code'; -@use 'toc'; - -@use'@vuepress/plugin-palette/style'; diff --git a/packages/theme/src/client/styles/layout.scss b/packages/theme/src/client/styles/layout.scss deleted file mode 100644 index 04d950af..00000000 --- a/packages/theme/src/client/styles/layout.scss +++ /dev/null @@ -1,13 +0,0 @@ -.plume-theme { - position: relative; - min-height: 100vh; - padding-bottom: 2rem; - - &.bottom { - padding-bottom: 6rem; - } -} - -.task-list-container { - list-style: none; -} diff --git a/packages/theme/src/client/styles/normalize.scss b/packages/theme/src/client/styles/normalize.scss deleted file mode 100644 index 8fd91a1b..00000000 --- a/packages/theme/src/client/styles/normalize.scss +++ /dev/null @@ -1,187 +0,0 @@ -html, -body { - padding: 0; - margin: 0; - background-color: var(--c-bg); - transition: background-color var(--t-color); -} - -*, -*::after, -*::before { - box-sizing: border-box; -} - -:root { - scroll-behavior: smooth; -} - -html.dark { - color-scheme: dark; -} - -body { - font-family: var(--font-family); - -webkit-font-smoothing: antialiased; - -moz-font-smoothing: grayscale; - font-size: 16px; - color: var(--c-text); -} - -a { - font-weight: 500; - color: var(--c-text-accent); - text-decoration: none; - overflow-wrap: break-word; - transition: color var(--t-color); -} - -p a code { - font-weight: 400; - color: var(--c-text-accent); -} - -kbd { - font-family: var(--font-family-code); - color: var(--c-text); - background: var(--c-bg-lighter); - border: solid 0.15rem var(--c-border-dark); - border-bottom: solid 0.25rem var(--c-border-dark); - padding: 0 0.15em; -} - -code { - font-family: var(--font-family-code); - color: var(--c-text-lighter); - padding: 0.25rem 0.5rem; - margin: 0; - font-size: 0.85rem; - background-color: var(--c-bg-light); - border-radius: 3px; - overflow-wrap: break-word; -} - -blockquote { - font-size: 1rem; - color: var(--c-text-quote); - border-left: 0.2rem solid var(--c-border-dark); - margin: 1rem 0; - padding: 0.25rem 0 0.25rem 1rem; - - & > p { - margin: 0; - } -} - -ul, -ol { - padding-left: 1.2em; -} - -strong { - font-weight: 600; -} - -h1, -h2, -h3, -h4, -h5, -h6 { - font-weight: 600; - line-height: 1.25; - transition: color var(--t-color); - - &:focus-visible { - outline: none; - } - - &:hover .header-anchor { - opacity: 1; - } -} - -h1 { - font-size: 2.2rem; -} - -h2 { - font-size: 1.65rem; - padding-bottom: 0.5rem; - border-bottom: solid 1px var(--c-border); - transition: border-color var(--t-color); - margin-top: 2.75rem; -} - -h3 { - font-size: 1.35rem; -} - -h4 { - font-size: 1.15rem; -} - -h5 { - font-size: 1.05rem; -} - -h6 { - font-size: 1rem; -} - -a.header-anchor { - font-size: 0.85rem; - float: left; - margin-left: -0.87rem; - padding-right: 0.23rem; - margin-top: 0.125rem; - opacity: 0; - - &:hover { - text-decoration: none; - - &:focus-visible { - opacity: 1; - } - } -} - -p, -ul, -ol { - line-height: 1.7; -} - -hr { - border: 0; - border-top: solid 1px var(--c-border); -} - -table { - border-collapse: collapse; - margin: 1rem 0; - display: block; - overflow-x: auto; - transition: border-color var(--t-color); -} - -tr { - border-top: solid 1px var(--c-border-dark); - transition: border-color var(--t-color); - - &:nth-child(2n) { - background-color: var(--c-bg-light); - transition: background-color var(--t-color); - - code { - background-color: var(--c-bg-lighter); - } - } -} - -th, -td { - padding: 0.6em 1em; - border: 1px solid var(--c-border-dark); - transition: border-color var(--t-color); -} diff --git a/packages/theme/src/client/styles/toc.scss b/packages/theme/src/client/styles/toc.scss deleted file mode 100644 index 27ddd3c6..00000000 --- a/packages/theme/src/client/styles/toc.scss +++ /dev/null @@ -1,63 +0,0 @@ -.theme-plume-toc { - border-left: solid 1px var(--c-border); - max-height: calc(100vh - var(--navbar-height) - (1.25rem * 3)); - overflow-y: auto; - - &::-webkit-scrollbar { - width: 0; - opacity: 0; - } - > .theme-plume-toc-list { - padding-left: 0; - } -} - -.theme-plume-toc-list { - list-style: none; - - .theme-plume-toc-link { - width: 100%; - display: inline-block; - color: var(--c-text-light); - border-left: solid 3px transparent; - padding-left: 1rem; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - transition: color var(--t-color), border-color var(--t-color); - - &.active { - color: var(--c-text-accent); - border-color: var((--c-text-accent)); - } - } - - .theme-plume-toc-list { - .theme-plume-toc-link { - border: none; - font-size: 14px; - color: var(--c-text-lighter); - - &.active { - color: var(--c-text-accent); - } - } - } -} - -.plume-theme-page-toc { - width: 12.5rem; - margin-left: 1.25rem; - - .theme-plume-toc { - position: sticky; - top: calc(var(--navbar-height) + 1.25rem); - } -} - -.archive-toc { - width: 4rem; - margin-left: 0; - position: sticky; - top: calc(var(--navbar-height) + 1.25rem); -} diff --git a/packages/theme/src/client/styles/transition.scss b/packages/theme/src/client/styles/transition.scss deleted file mode 100644 index 3c816cd2..00000000 --- a/packages/theme/src/client/styles/transition.scss +++ /dev/null @@ -1,30 +0,0 @@ -.fade-slide-y { - &-enter-active { - transition: all 0.3s ease; - } - - &-leave-active { - transition: all 0.3s cubic-bezier(1, 0.5, 0.8, 1); - } - - &-enter-from, - &-leave-to { - transform: translateY(10px); - opacity: 0; - } -} - -.fade { - &-enter-active { - transition: all 0.3s ease; - } - - &-leave-active { - transition: all 0.3s cubic-bezier(1, 0.5, 0.8, 1); - } - - &-enter-from, - &-leave-to { - opacity: 0; - } -} diff --git a/packages/theme/src/client/styles/vars-dark.scss b/packages/theme/src/client/styles/vars-dark.scss deleted file mode 100644 index 33104026..00000000 --- a/packages/theme/src/client/styles/vars-dark.scss +++ /dev/null @@ -1,46 +0,0 @@ -html.dark { - --c-brand: #0094c8; - --c-brand-light: #007bbb; - - --c-bg: #22272e; - --c-bg-light: #2b313a; - --c-bg-lighter: #262c34; - --c-bg-container: #22272e; - --c-bg-navbar: rgba(34, 39, 46, 0.75); - --c-bg-sticky: var(--c-bg-light); - - --c-text: #adbac7; - --c-text-light: #96a7b7; - --c-text-lighter: #8b94a8; - --c-text-lightest: #8094a8; - - --c-sidebar-text: rgba(195, 195, 195, 0.7); - - --c-border: #3e4c5a; - --c-border-dark: #34404c; - - --c-tip: #318a62; - --c-warning: #ceab00; - --c-warning-bg: #7e755b; - --c-warning-title: #ceac03; - --c-warning-text: #362e00; - --c-danger: #940000; - --c-danger-bg: #806161; - --c-danger-title: #610000; - --c-danger-text: #3a0000; - --c-details-bg: #323843; - - --c-hl-bg-color: #363b46; - - --c-home-arrow-bottom: rgba(196, 205, 216, 0.75); -} - -html.dark .DocSearch { - --docsearch-logo-color: var(--c-text); - --docsearch-modal-shadow: inset 1px 1px 0 0 #2c2e40, 0 3px 8px 0 #000309; - --docsearch-key-shadow: inset 0 -2px 0 0 #282d55, inset 0 0 1px 1px #51577d, - 0 2px 2px 0 rgba(3, 4, 9, 0.3); - --docsearch-key-gradient: linear-gradient(-225deg, #444950, #1c1e21); - --docsearch-footer-shadow: inset 0 1px 0 0 rgba(73, 76, 106, 0.5), - 0 -4px 8px 0 rgba(0, 0, 0, 0.2); -} diff --git a/packages/theme/src/client/styles/vars.scss b/packages/theme/src/client/styles/vars.scss deleted file mode 100644 index ebc33cae..00000000 --- a/packages/theme/src/client/styles/vars.scss +++ /dev/null @@ -1,129 +0,0 @@ -:root { - // brand color - --c-brand: #0095d9; - --c-brand-light: #2ca9e1; - - // background color - --c-bg: #fff; - --c-bg-light: #e5e7eb; - --c-bg-lighter: #d1d5db; - --c-bg-container: #fff; - --c-bg-navbar: rgba(255, 255, 255, 0.7); - --c-bg-sidebar: var(--c-bg-container); - --c-bg-arrow: #ccc; - --c-bg-sticky: #f1f2f3; - - // text color-scheme - --c-text: #2c3e50; - --c-text-accent: var(--c-brand); - --c-text-light: #3a5169; - --c-text-lighter: #4e6e8e; - --c-text-lightest: #6a8bad; - --c-text-quote: #999; - - --c-sidebar-text: rgba(60, 60, 60, 0.7); - - // border colors - --c-border: #eaecef; - --c-border-dark: #dfe2e5; - - // container color - --c-tip: #60a5fa; - --c-tip-bg: var(--c-bg-light); - --c-tip-title: var(--c-text); - --c-tip-text: var(--c-text); - --c-tip-text-accent: var(--c-text-accent); - --c-warning: #e7c000; - --c-warning-bg: #fffae3; - --c-warning-title: #ad9000; - --c-warning-text: #746000; - --c-warning-text-accent: var(--c-text); - --c-danger: #cc0000; - --c-danger-bg: #ffe0e0; - --c-danger-title: #990000; - --c-danger-text: #600; - --c-danger-text-accent: var(--c-text); - --c-detail-bg: #eee; - - // badge component colors - --c-badge-tip: var(--c-tip); - --c-badge-warning: var(--c-warning); - --c-badge-danger: var(--c-danger); - - --c-home-arrow-bottom: rgba(255, 255, 255, 0.75); - - // transition - --t-color: 0.3s ease; - --t-transform: 0.3s ease; - - // box-shadow - --shadow-sm: 0 0 #0000, 0 0 #0000, 0 1px 2px 0 rgba(0, 0, 0, 0.05); - --shadow: 0 0 #0000, 0 0 #0000, 0 1px 3px 0 rgba(0, 0, 0, 0.1), - 0 1px 2px 0 rgba(0, 0, 0, 0.06); - --shadow-md: 0 0 #0000, 0 0 #0000, 0 4px 6px -1px rgba(0, 0, 0, 0.1), - 0 2px 4px -1px rgba(0, 0, 0, 0.06); - --shadow-lg: 0 0 #0000, 0 0 #0000, 0 6px 8px -1px rgba(0, 0, 0, 0.1), - 0 3px 6px -1px rgba(0, 0, 0, 0.06); - - --shadow-footer: 0 -1px 3px 0px rgba(0, 0, 0, 0.1), 0 0 #0000, 0 0 #0000, - 0 -1px 2px 0px rgba(0, 0, 0, 0.06); - - // border-radius - --p-around: 4px; - - // code block - --code-bg-color: #282c34; - --code-hl-bg-color: rgba(0, 0, 0, 0.66); - --code-ln-color: #9e9e9e; - --code-ln-wrapper-width: 3.5rem; - - // font vars - --font-family: -apple-system, BlinkMackSystemFont, 'Segoe UI', Roboto, Oxygen, - Ubuntu, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; - --font-family-code: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; - - --navbar-height: 3.6rem; - --navbar-padding-v: 0.7rem; - --navbar-padding-h: 1.5rem; - --sidebar-width: 20rem; - --sidebar-width-mobile: calc(var(--sidebar-width) * 0.82); - --content-width: 850px; - --content-note-width: 1000px; - - // search box vars - --search-bg-color: var(--c-bg-container); - --search-accent-color: var(--c-text-accent); - --search-text-color: var(--c-text); - --search-border-color: var(--c-border); - - --search-item-text-color: var(--c-brand); - --search-item-focus-bg-color: var(--c-bg-light); - - --search-input-width: 8rem; - --search-result-width: 20rem; -} - -.DocSearch { - --docsearch-primary-color: var(--c-brand); - --docsearch-text-color: var(--c-text); - --docsearch-highlight-color: var(--c-brand); - --docsearch-muted-color: var(--c-text-quote); - --docsearch-container-background: rgba(9, 10, 17, 0.8); - --docsearch-modal-background: var(--c-bg-light); - --docsearch-searchbox-background: var(--c-bg-lighter); - --docsearch-searchbox-focus-background: var(--c-bg); - --docsearch-searchbox-shadow: var(--shadow); - --docsearch-hit-color: var(--c-text-light); - --docsearch-hit-active-color: var(--c-bg); - --docsearch-hit-background: var(--c-bg); - --docsearch-hit-shadow: 0 1px 3px 0 var(--c-border-dark); - --docsearch-footer-background: var(--c-bg); -} - -.external-link-icon { - --external-link-icon-color: var(--c-text-quote); -} - -.medium-zoom-overlay { - --medium-zoom-bg-color: var(--c-bg); -} diff --git a/packages/theme/src/client/utils/animate.ts b/packages/theme/src/client/utils/animate.ts deleted file mode 100644 index bdbaad6b..00000000 --- a/packages/theme/src/client/utils/animate.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * @method 缓动算法 - * t: current time(当前时间); - * b: beginning value(初始值); - * c: change in value(变化量); - * d: duration(持续时间)。 - */ -export const tween = (t: number, b: number, c: number, d: number): number => { - return c * (t /= d) * t * t + b -} - -export const linear = (t: number, b: number, c: number, d: number): number => { - return (c * t) / d + b -} diff --git a/packages/theme/src/client/utils/check.ts b/packages/theme/src/client/utils/check.ts deleted file mode 100644 index eb70b2dc..00000000 --- a/packages/theme/src/client/utils/check.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const hasOwn = (val: object, key: string): key is never => { - return Object.prototype.hasOwnProperty.call(val, key) -} diff --git a/packages/theme/src/client/utils/color.ts b/packages/theme/src/client/utils/color.ts deleted file mode 100644 index d6fdcef9..00000000 --- a/packages/theme/src/client/utils/color.ts +++ /dev/null @@ -1,24 +0,0 @@ -export const colorList = [ - '#CC9999', - '#FF9900', - '#0099CC', - '#FF6666', - '#009966', - '#CC0066', - '#666699', - '#99CC33', - '#336699', - '#33CC99', - '#FF99CC', - '#FF6666', - '#CC6699', -] - -let uuid = 0 -export const getColor = (): string => { - const len = colorList.length - if (uuid > len - 1) { - uuid = 0 - } - return colorList[uuid++] -} diff --git a/packages/theme/src/client/utils/dom.ts b/packages/theme/src/client/utils/dom.ts deleted file mode 100644 index 491adb80..00000000 --- a/packages/theme/src/client/utils/dom.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { tween } from './animate.js' - -export function getCssValue(el: HTMLElement | null, property: string): number { - const val = el?.ownerDocument?.defaultView?.getComputedStyle(el, null)?.[ - property as any - ] - const num = Number.parseInt(val as string, 10) - return Number.isNaN(num) ? 0 : num -} - -export function getScrollTop( - target: Document | HTMLElement = document -): number { - if (target === document || !target) { - return ( - window.pageYOffset || - document.documentElement.scrollTop || - document.body.scrollTop || - 0 - ) - } else { - return (target as HTMLElement).scrollTop - } -} - -export function setScrollTop( - target: Document | HTMLElement = document, - scrollTop = 0 -): void { - if (typeof target === 'number') { - scrollTop = target - target = document - document.documentElement.scrollTop = scrollTop - document.body.scrollTop = scrollTop - } else { - if (target === document) { - document.body.scrollTop = scrollTop || 0 - document.documentElement.scrollTop = scrollTop || 0 - } else { - ;(target as HTMLElement).scrollTop = scrollTop || 0 - } - } -} - -export function scrollTo( - target: Document | HTMLElement, - top: number, - time = 300 -): void { - if (target !== document) { - const currentTop = getScrollTop(target) - const step = Math.ceil(time / 16) - let currentStep = 0 - const change = top - currentTop - const timer = setInterval(() => { - currentStep++ - if (currentStep >= step) { - timer && clearInterval(timer) - } - setScrollTop(target, tween(currentStep, currentTop, change, step)) - }, 1000 / 60) - } else { - window.scrollTo({ top, behavior: 'smooth' }) - } -} diff --git a/packages/theme/src/client/utils/index.ts b/packages/theme/src/client/utils/index.ts deleted file mode 100644 index a5cf5864..00000000 --- a/packages/theme/src/client/utils/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export * from './dom.js' -export * from './resolveRepoType.js' -export * from './path.js' -export * from './color.js' -export * from './check.js' diff --git a/packages/theme/src/client/utils/path.ts b/packages/theme/src/client/utils/path.ts deleted file mode 100644 index bcd47129..00000000 --- a/packages/theme/src/client/utils/path.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const normalizePath = (url: string): string => { - return url.trim().replace(/\s+/g, '-') -} diff --git a/packages/theme/src/client/utils/resolveRepoType.ts b/packages/theme/src/client/utils/resolveRepoType.ts deleted file mode 100644 index a5497760..00000000 --- a/packages/theme/src/client/utils/resolveRepoType.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { isLinkHttp } from '@vuepress/shared' - -export type RepoType = 'Github' | 'GitLab' | 'Gitee' | 'Bitbucket' | null - -export const resolveRepoType = (repo: string): RepoType => { - if (isLinkHttp(repo) || /github\.com/.test(repo)) return 'Github' - if (/bitbucket\.org/.test(repo)) return 'Bitbucket' - if (/gitlab\.com/.test(repo)) return 'GitLab' - if (/gitee\.com/.test(repo)) return 'Gitee' - return null -} diff --git a/packages/theme/src/node/alias.ts b/packages/theme/src/node/alias.ts deleted file mode 100644 index 5a036df2..00000000 --- a/packages/theme/src/node/alias.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { fs } from '@vuepress/utils' -import { resolveClient } from './utils/index.js' - -export const getAlias = (): Record => { - return Object.fromEntries( - fs - .readdirSync(resolveClient('components')) - .filter((file) => file.endsWith('.vue')) - .map((file) => [ - `@theme-plume/${file}`, - resolveClient('components', file), - ]) - ) -} diff --git a/packages/theme/src/node/autoFrontmatter.ts b/packages/theme/src/node/autoFrontmatter.ts new file mode 100644 index 00000000..dd8dc3d0 --- /dev/null +++ b/packages/theme/src/node/autoFrontmatter.ts @@ -0,0 +1,36 @@ +import { createRequire } from 'node:module' +import type { AutoFrontmatterOptions } from '@vuepress-plume/vuepress-plugin-auto-frontmatter' +import type { App } from '@vuepress/core' +import type { PlumeThemeLocaleOptions } from '../shared/index.js' + +export default function ( + app: App, + localeOption: PlumeThemeLocaleOptions +): AutoFrontmatterOptions { + // const sourceDir = app.dir.source() + const require = createRequire(process.cwd()) + const pkg = require('./package.json') || {} + + return { + glob: [], + formatter: [ + { + glob: '**/{readme,README,index}.md', + formatter: {}, + }, + { + glob: '*', + formatter: { + author(author: string) { + if (author) return author + return pkg.author || '' + }, + createTime(formatTime: string, data, { createTime }) { + if (formatTime) return formatTime + return createTime + }, + }, + }, + ], + } +} diff --git a/packages/theme/src/node/createPage/archive.ts b/packages/theme/src/node/createPage/archive.ts deleted file mode 100644 index 27816a0e..00000000 --- a/packages/theme/src/node/createPage/archive.ts +++ /dev/null @@ -1,18 +0,0 @@ -import type { App } from '@vuepress/core' -import { createPage } from '@vuepress/core' -import type { PlumeThemeLocaleOptions } from '../../shared/index.js' - -export const createArchivePage = async ( - app: App, - localeOption: PlumeThemeLocaleOptions -): Promise => { - const { archive } = localeOption - if (!archive) return - const archivePage = await createPage(app, { - path: archive.link, - frontmatter: { - pageType: 'archive', - }, - }) - app.pages.push(archivePage) -} diff --git a/packages/theme/src/node/createPage/category.ts b/packages/theme/src/node/createPage/category.ts deleted file mode 100644 index c884a662..00000000 --- a/packages/theme/src/node/createPage/category.ts +++ /dev/null @@ -1,18 +0,0 @@ -import type { App } from '@vuepress/core' -import { createPage } from '@vuepress/core' -import type { PlumeThemeLocaleOptions } from '../../shared/index.js' - -export const createCategoryPage = async ( - app: App, - localeOption: PlumeThemeLocaleOptions -): Promise => { - const { category } = localeOption - if (!category) return - const categoryPage = await createPage(app, { - path: category.link, - frontmatter: { - pageType: 'category', - }, - }) - app.pages.push(categoryPage) -} diff --git a/packages/theme/src/node/createPage/index.ts b/packages/theme/src/node/createPage/index.ts deleted file mode 100644 index d0a88024..00000000 --- a/packages/theme/src/node/createPage/index.ts +++ /dev/null @@ -1,14 +0,0 @@ -import type { App } from '@vuepress/core' -import type { PlumeThemeLocaleOptions } from '../../shared/index.js' -import { createArchivePage } from './archive.js' -import { createCategoryPage } from './category.js' -import { createTagPage } from './tag.js' - -export const createPage = async ( - app: App, - localeOption: PlumeThemeLocaleOptions -): Promise => { - await createCategoryPage(app, localeOption) - await createArchivePage(app, localeOption) - await createTagPage(app, localeOption) -} diff --git a/packages/theme/src/node/createPage/note.ts b/packages/theme/src/node/createPage/note.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/packages/theme/src/node/createPage/tag.ts b/packages/theme/src/node/createPage/tag.ts deleted file mode 100644 index 7a98a812..00000000 --- a/packages/theme/src/node/createPage/tag.ts +++ /dev/null @@ -1,18 +0,0 @@ -import type { App } from '@vuepress/core' -import { createPage } from '@vuepress/core' -import type { PlumeThemeLocaleOptions } from '../../shared/index.js' - -export const createTagPage = async ( - app: App, - localeOption: PlumeThemeLocaleOptions -): Promise => { - const { tag } = localeOption - if (!tag) return - const tagPage = await createPage(app, { - path: tag.link, - frontmatter: { - pageType: 'tag', - }, - }) - app.pages.push(tagPage) -} diff --git a/packages/theme/src/node/defaultLocaleOption.ts b/packages/theme/src/node/defaultLocaleOption.ts deleted file mode 100644 index 4ee9cb48..00000000 --- a/packages/theme/src/node/defaultLocaleOption.ts +++ /dev/null @@ -1,11 +0,0 @@ -import type { PlumeThemeLocaleOptions } from '../shared/index.js' - -export const defaultLocaleOption: Partial = { - darkMode: true, - home: { text: '首页', link: '/' }, - article: '/article', - tag: { text: '标签', link: '/tag' }, - category: { text: '分类', link: '/category' }, - notes: { link: '/note', dir: 'notes', notes: [] }, - archive: { link: '/timeline', text: '归档' }, -} diff --git a/packages/theme/src/node/define.ts b/packages/theme/src/node/defineConfig.ts similarity index 100% rename from packages/theme/src/node/define.ts rename to packages/theme/src/node/defineConfig.ts diff --git a/packages/theme/src/node/extendsPage.ts b/packages/theme/src/node/extendsPage.ts deleted file mode 100644 index ff527520..00000000 --- a/packages/theme/src/node/extendsPage.ts +++ /dev/null @@ -1,60 +0,0 @@ -import type { Page } from '@vuepress/core' -import { path } from '@vuepress/utils' -import type { - CategoryData, - PlumeThemeLocaleOptions, - PlumeThemePageData, - PlumeThemePostFrontmatter, -} from '../shared/index.js' -import { formatDate } from './utils/index.js' - -function normalizePath(filepath: string): string { - return filepath.replace(/^\//, '') -} - -let uuid = 10000 -const cache: Record = {} -export const extendsPage = ( - page: Page>, - localeOption: PlumeThemeLocaleOptions -): void => { - const pagePath = page.filePathRelative || '' - if (page.frontmatter.pageType) return - const { notes } = localeOption - const frontmatter = page.frontmatter as PlumeThemePostFrontmatter - let category: CategoryData = [] - if (notes && notes.dir && pagePath.startsWith(normalizePath(notes.dir))) { - page.data.isNote = true - const filepath = path.relative(notes.dir, pagePath) - if (filepath) { - const note = filepath.split('/')[0] - const currentNote = notes.notes.find(({ link }) => - normalizePath(link).startsWith(note) - ) - if (currentNote) { - !cache[currentNote.text] && (cache[currentNote.text] = uuid++) - category.push({ - type: cache[currentNote.text], - name: currentNote.text, - }) - } - } - } else { - category = pagePath - .split('/') - .slice(0, -1) - .map((category) => { - const match = category.match(/^(\d+)?(?:\.?)([^]+)$/) || [] - !cache[match[2]] && !match[1] && (cache[match[2]] = uuid++) - return { - type: Number(match[1] || cache[match[2]]), - name: match[2], - } - }) - } - page.data.category = category || [] - page.data.createTime = formatDate(frontmatter.createTime) - page.data.tags = frontmatter.tags || [] - page.data.path = page.path - page.data.author = frontmatter.author || '' -} diff --git a/packages/theme/src/node/generateFrontmatter.ts b/packages/theme/src/node/generateFrontmatter.ts deleted file mode 100644 index 5ef70ee5..00000000 --- a/packages/theme/src/node/generateFrontmatter.ts +++ /dev/null @@ -1,143 +0,0 @@ -import type { App } from '@vuepress/core' -import { fs, path } from '@vuepress/utils' -import chokidar from 'chokidar' -import { format } from 'date-fns' -import matter from 'gray-matter' -import jsonToYaml from 'json2yaml' -import { customAlphabet } from 'nanoid' -import type { - PlumeThemeLocaleOptions, - PlumeThemeNotesItem, - PlumeThemeNotesOptions, -} from '../shared/index.js' -import type { MarkdownFile } from './utils/index.js' -import { readFile, readFileList } from './utils/index.js' - -export interface GenerateFrontmatter { - formatFrontmatter: () => void - watchNewMarkDown: (app: App, watchers: unknown) => void -} - -const nanoid = customAlphabet('0123456789abcdefghijklmnopqrstuvwxyz', 8) - -const isReadme = function (filepath: string): boolean { - return /((readme)|(index))\.md$/i.test(filepath) -} - -export const generateFrontmatter = ( - sourceDir: string, - localeOption: PlumeThemeLocaleOptions -): GenerateFrontmatter => { - const { article, notes } = localeOption - const { - notes: noteList, - link: notesLink, - dir: notesDir, - } = notes as PlumeThemeNotesOptions - const matterTask: Record = { - title: ({ filepath }: MarkdownFile, title: string): string => { - if (title) return title - const file = path.relative(sourceDir, filepath) - let currentNote: PlumeThemeNotesItem | undefined - if ( - notesDir && - file.startsWith(notesDir.replace(/^\//, '')) && - isReadme(filepath) && - (currentNote = noteList.find((note) => - file.startsWith(path.join(notesDir.replace(/^\//, ''), note.dir)) - )) - ) { - return currentNote.text || currentNote.dir - } - const basename = path.basename(filepath) - if (isReadme(basename)) { - return path.dirname(filepath).split('/').slice(-1)[0] - } - return basename.replace(/^\d+\./, '').replace(path.extname(filepath), '') - }, - createTime: ({ createTime }: MarkdownFile, formatTime: string): string => { - if (formatTime) return formatTime - return format(new Date(createTime), 'yyyy/MM/dd hh:mm:ss') - }, - author: (_: any, author: string): string => { - if (author) return author - const pkg = require(path.join(process.cwd(), 'package.json')) - return pkg.author - }, - // 自动生成永久链接 - permalink: ({ filepath }: MarkdownFile, permalink: string): string => { - const file = path.relative(sourceDir, filepath) - if (permalink) { - if (notes && notesDir && file.startsWith(notesDir.replace(/^\//, ''))) { - return permalink - } else { - if ( - article && - permalink.startsWith('/' + article.replace(/^\//, '')) - ) { - return permalink - } else { - const per = permalink.split('/') - return path.join(article, per[per.length - 1]) - } - } - } - let prefix = '' - if (notes) { - // 表示是以笔记开头的 - if (notesDir && file.startsWith(notesDir.replace(/^\//, ''))) { - prefix = notesLink || '' - const currentNote = noteList.find((note) => - file.startsWith(path.join(notesDir.replace(/^\//, ''), note.dir)) - ) - currentNote && (prefix = path.join(prefix, currentNote.link)) - } else { - prefix = article as string - } - } else { - prefix = article as string - } - return path.join(prefix, isReadme(filepath) ? '' : nanoid(), '/') - }, - } - - const formatMarkdown = (file: MarkdownFile): string => { - const { data, content } = matter(file.content) - Object.keys(matterTask).forEach((key) => { - const value = matterTask[key](file, data[key]) - data[key] = value ?? data[key] - }) - const yaml = jsonToYaml - .stringify(data) - .replace(/\n\s{2}/g, '\n') - .replace(/"/g, '') - return `${yaml}---\n${content}` - } - - const formatFrontmatter = (): void => { - const files = readFileList(sourceDir) - files.forEach((file) => { - const relativePath = path.relative(sourceDir, file.filepath) - if (isReadme(relativePath)) return - fs.writeFileSync(file.filepath, formatMarkdown(file), 'utf-8') - }) - } - - const watchNewMarkDown = (app: App, watchers: any): void => { - const watcher = chokidar.watch('**/*.md', { - ignored: /node_modules/, - cwd: app.options.source, - ignoreInitial: true, - }) - watcher.on('add', (file, stat) => { - const filepath = path.join(app.options.source, file) - stat = stat || fs.statSync(filepath) - const newFile = readFile(filepath, stat) - const content = formatMarkdown(newFile) - fs.writeFileSync(filepath, content, 'utf-8') - }) - watchers.push(watcher) - } - - return { formatFrontmatter, watchNewMarkDown } -} diff --git a/packages/theme/src/node/index.ts b/packages/theme/src/node/index.ts index 6cb4b71c..a89a69bb 100644 --- a/packages/theme/src/node/index.ts +++ b/packages/theme/src/node/index.ts @@ -1,18 +1,8 @@ -import type { - PlumeThemeNotesItem, - PlumeThemeNotesOptions, - PlumeThemeOptions, - PlumeThemeSidebarConfigOptions, -} from '../shared/index.js' -import { themePlume } from './theme.js' -export * from './theme.js' -export * from './define.js' +import { plumeTheme } from './theme.js' -export { - PlumeThemeOptions, - PlumeThemeNotesOptions, - PlumeThemeNotesItem, - PlumeThemeSidebarConfigOptions, -} +export * from './defineConfig.js' +export * from '../shared/index.js' -export default themePlume +export { plumeTheme } + +export default plumeTheme diff --git a/packages/theme/src/node/plugins.ts b/packages/theme/src/node/plugins.ts new file mode 100644 index 00000000..4ce3adb9 --- /dev/null +++ b/packages/theme/src/node/plugins.ts @@ -0,0 +1,146 @@ +import { autoFrontmatterPlugin } from '@vuepress-plume/vuepress-plugin-auto-frontmatter' +import { baiduTongjiPlugin } from '@vuepress-plume/vuepress-plugin-baidu-tongji' +import { blogDataPlugin } from '@vuepress-plume/vuepress-plugin-blog-data' +import { caniusePlugin } from '@vuepress-plume/vuepress-plugin-caniuse' +import { copyCodePlugin } from '@vuepress-plume/vuepress-plugin-copy-code' +import type { App, PluginConfig } from '@vuepress/core' +import { activeHeaderLinksPlugin } from '@vuepress/plugin-active-header-links' +import { docsearchPlugin } from '@vuepress/plugin-docsearch' +import { externalLinkIconPlugin } from '@vuepress/plugin-external-link-icon' +import { gitPlugin } from '@vuepress/plugin-git' +import { mediumZoomPlugin } from '@vuepress/plugin-medium-zoom' +import { nprogressPlugin } from '@vuepress/plugin-nprogress' +import { palettePlugin } from '@vuepress/plugin-palette' +import { prismjsPlugin } from '@vuepress/plugin-prismjs' +import { searchPlugin } from '@vuepress/plugin-search' +import { themeDataPlugin } from '@vuepress/plugin-theme-data' +import { commentPlugin } from 'vuepress-plugin-comment2' +import { mdEnhancePlugin } from 'vuepress-plugin-md-enhance' +import { seoPlugin } from 'vuepress-plugin-seo2' +import { sitemapPlugin } from 'vuepress-plugin-sitemap2' +import type { + PlumeThemeLocaleOptions, + PlumeThemePluginOptions, +} from '../shared/index.js' +import autoFrontmatter from './autoFrontmatter.js' + +export const setupPlugins = ( + app: App, + options: PlumeThemePluginOptions, + localeOptions: PlumeThemeLocaleOptions +): PluginConfig => { + const isProd = !app.env.isDev + + return [ + palettePlugin({ preset: 'sass' }), + themeDataPlugin({ themeData: localeOptions }), + autoFrontmatterPlugin(autoFrontmatter(app, localeOptions)), + blogDataPlugin({ + include: ['**/*.md'], + exclude: ['**/{README,index}.md', 'notes/**'], + }), + activeHeaderLinksPlugin({ + headerLinkSelector: 'a.theme-plume-toc-link', + headerAnchorSelector: '.header-anchor', + delay: 200, + offset: 20, + }), + + options.nprogress !== false ? nprogressPlugin() : [], + + options.git !== false + ? gitPlugin({ + createdTime: true, + updatedTime: true, + contributors: false, + }) + : [], + + options.mediumZoom !== false + ? mediumZoomPlugin({ + selector: '.page-content > img, .page-content :not(a) > img', + zoomOptions: { + background: 'var(--c-bg)', + }, + delay: 300, + }) + : [], + + options.caniuse !== false + ? caniusePlugin( + options.caniuse || { + mode: 'embed', + } + ) + : [], + + options.externalLinkIcon !== false + ? externalLinkIconPlugin({ + locales: Object.entries(localeOptions.locales || {}).reduce( + (result: Record, [key, value]) => { + result[key] = { + openInNewWindow: + value.openInNewWindow ?? localeOptions.openInNewWindow, + } + return result + }, + {} + ), + }) + : [], + + options.search !== false ? searchPlugin(options.search) : [], + options.docsearch !== false && !options.search + ? docsearchPlugin(options.docsearch!) + : [], + options.prismjs !== false ? prismjsPlugin() : [], + options.copyCode !== false + ? copyCodePlugin({ + selector: '.page-content div[class*="language-"] pre', + locales: { + '/': { + copy: '复制成功', + hint: '复制代码', + }, + }, + ...options.copyCode, + }) + : [], + + options.markdownEnhance !== false + ? mdEnhancePlugin( + Object.assign( + { + container: true, // info note tip warning danger details + codetabs: true, + tabs: true, + align: true, + mark: true, + tasklist: true, + demo: true, + attrs: true, + }, + options.markdownEnhance || {} + ) + ) + : [], + + options.comment !== false ? commentPlugin(options.comment || {}) : [], + + options.baiduTongji !== false && options.baiduTongji?.key + ? baiduTongjiPlugin(options.baiduTongji) + : [], + + options.sitemap !== false && localeOptions.hostname && isProd + ? sitemapPlugin({ + hostname: localeOptions.hostname, + }) + : [], + options.seo !== false && localeOptions.hostname && isProd + ? seoPlugin({ + hostname: localeOptions.hostname || '', + author: localeOptions.avatar?.name, + }) + : [], + ] +} diff --git a/packages/theme/src/node/plugins/activeHeaderLink.ts b/packages/theme/src/node/plugins/activeHeaderLink.ts deleted file mode 100644 index fc9dcda8..00000000 --- a/packages/theme/src/node/plugins/activeHeaderLink.ts +++ /dev/null @@ -1,11 +0,0 @@ -import type { PluginObject } from '@vuepress/core' -import { activeHeaderLinksPlugin } from '@vuepress/plugin-active-header-links' - -export const resolveActiveHeaderLink = (): PluginObject => { - return activeHeaderLinksPlugin({ - headerLinkSelector: 'a.theme-plume-toc-link', - headerAnchorSelector: '.header-anchor', - delay: 200, - offset: 20, - }) -} diff --git a/packages/theme/src/node/plugins/baiduTongji.ts b/packages/theme/src/node/plugins/baiduTongji.ts deleted file mode 100644 index 446aa47b..00000000 --- a/packages/theme/src/node/plugins/baiduTongji.ts +++ /dev/null @@ -1,12 +0,0 @@ -// 8a4e65dd3f2d30e64c828481295e09d1 -import type { BaiduTongjiOptions } from '@vuepress-plume/vuepress-plugin-baidu-tongji' -import { baiduTongjiPlugin } from '@vuepress-plume/vuepress-plugin-baidu-tongji' -import type { Plugin } from '@vuepress/core' -import type { PlumeThemePluginOptions } from '../../shared/index.js' - -export const resolveBaiduTongji = ({ - baiduTongji, -}: PlumeThemePluginOptions): Plugin => { - if (baiduTongji === false || !baiduTongji?.key) return [] as unknown as Plugin - return baiduTongjiPlugin(baiduTongji as BaiduTongjiOptions) -} diff --git a/packages/theme/src/node/plugins/caniuse.ts b/packages/theme/src/node/plugins/caniuse.ts deleted file mode 100644 index 44834a34..00000000 --- a/packages/theme/src/node/plugins/caniuse.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { caniusePlugin } from '@vuepress-plume/vuepress-plugin-caniuse' -import type { Plugin } from '@vuepress/core' -import type { PlumeThemePluginOptions } from '../../shared/index.js' - -export const resolveCanIUse = (plugins: PlumeThemePluginOptions): Plugin => { - if (plugins.caniuse === false) return [] as unknown as Plugin - return caniusePlugin( - plugins.caniuse || { - mode: 'embed', - } - ) -} diff --git a/packages/theme/src/node/plugins/comment.ts b/packages/theme/src/node/plugins/comment.ts deleted file mode 100644 index 30c5c899..00000000 --- a/packages/theme/src/node/plugins/comment.ts +++ /dev/null @@ -1,9 +0,0 @@ -import type { Plugin } from '@vuepress/core' -import { commentPlugin } from 'vuepress-plugin-comment2' -import type { CommentOptions } from 'vuepress-plugin-comment2' -import type { PlumeThemePluginOptions } from '../../shared/index.js' - -export const resolveComment = (plugins: PlumeThemePluginOptions): Plugin => { - if (!plugins.comment) return [] as unknown as Plugin - return commentPlugin(plugins.comment as CommentOptions) -} diff --git a/packages/theme/src/node/plugins/copyCode.ts b/packages/theme/src/node/plugins/copyCode.ts deleted file mode 100644 index f75f7361..00000000 --- a/packages/theme/src/node/plugins/copyCode.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { copyCodePlugin } from '@vuepress-plume/vuepress-plugin-copy-code' -import type { Plugin } from '@vuepress/core' -import type { PlumeThemePluginOptions } from '../../shared/index.js' - -export const resolveCopyCode = (plugins: PlumeThemePluginOptions): Plugin => { - if (plugins.copyCode === false) return [] as unknown as Plugin - return copyCodePlugin( - plugins.copyCode || { - selector: '.page-content div[class*="language-"] pre', - locales: { - '/': { - copy: '复制成功', - hint: '复制代码', - }, - }, - } - ) -} diff --git a/packages/theme/src/node/plugins/externalLinkIcon.ts b/packages/theme/src/node/plugins/externalLinkIcon.ts deleted file mode 100644 index 1e7100be..00000000 --- a/packages/theme/src/node/plugins/externalLinkIcon.ts +++ /dev/null @@ -1,25 +0,0 @@ -import type { Plugin } from '@vuepress/core' -import { externalLinkIconPlugin } from '@vuepress/plugin-external-link-icon' -import type { - PlumeThemeLocaleOptions, - PlumeThemePluginOptions, -} from '../../shared/index.js' - -export const resolveExternalLinkIconPlugin = ( - plugins: PlumeThemePluginOptions, - localeOptions: PlumeThemeLocaleOptions -): Plugin => { - if (plugins.externalLinkIcon === false) return [] as unknown as Plugin - return externalLinkIconPlugin({ - locales: Object.entries(localeOptions.locales || {}).reduce( - (result: Record, [key, value]) => { - result[key] = { - openInNewWindow: - value.openInNewWindow ?? localeOptions.openInNewWindow, - } - return result - }, - {} - ), - }) -} diff --git a/packages/theme/src/node/plugins/git.ts b/packages/theme/src/node/plugins/git.ts deleted file mode 100644 index 71b9dfb6..00000000 --- a/packages/theme/src/node/plugins/git.ts +++ /dev/null @@ -1,14 +0,0 @@ -import type { Plugin } from '@vuepress/core' -import { gitPlugin } from '@vuepress/plugin-git' -import type { PlumeThemePluginOptions } from '../../shared/index.js' - -const isProd = process.env.NODE_ENV === 'production' - -export const resolveGit = (plugins: PlumeThemePluginOptions): Plugin => { - if (plugins.git === false || !isProd) return [] as unknown as Plugin - return gitPlugin({ - createdTime: true, - updatedTime: true, - contributors: false, - }) -} diff --git a/packages/theme/src/node/plugins/index.ts b/packages/theme/src/node/plugins/index.ts deleted file mode 100644 index 2db321d2..00000000 --- a/packages/theme/src/node/plugins/index.ts +++ /dev/null @@ -1,46 +0,0 @@ -import type { PluginConfig } from '@vuepress/core' -import type { - PlumeThemeLocaleOptions, - PlumeThemePluginOptions, -} from '../../shared/index.js' -import { resolveActiveHeaderLink } from './activeHeaderLink.js' -import { resolveBaiduTongji } from './baiduTongji.js' -import { resolveCanIUse } from './caniuse.js' -import { resolveComment } from './comment.js' -import { resolveCopyCode } from './copyCode.js' -import { resolveExternalLinkIconPlugin } from './externalLinkIcon.js' -import { resolveGit } from './git.js' -import { resolveMarkdownEnhance } from './markdownEnhance.js' -import { resolveMediumZoom } from './mediumZoom.js' -import { resolveNprogress } from './nprogress.js' -import { resolvePalette } from './palette.js' -import { resolvePrismjs } from './prismjs.js' -import { resolveSearch } from './search.js' -import { resolveSeo } from './seo.js' -import { resolveSitemap } from './sitemap.js' -import { resolveThemeData } from './themeData.js' - -export const getPlugins = ( - plugins: PlumeThemePluginOptions, - localeOptions: PlumeThemeLocaleOptions -): PluginConfig => { - const resolvePlugins: PluginConfig = [ - resolvePalette(), - resolveActiveHeaderLink(), - resolveNprogress(plugins), - resolveMediumZoom(plugins), - resolveCanIUse(plugins), - resolveExternalLinkIconPlugin(plugins, localeOptions), - resolveSearch(plugins), - resolvePrismjs(plugins), - resolveGit(plugins), - resolveCopyCode(plugins), - resolveMarkdownEnhance(plugins), - resolveComment(plugins), - resolveSitemap(plugins, localeOptions), - resolveSeo(plugins, localeOptions), - resolveThemeData(localeOptions), - resolveBaiduTongji(plugins), - ] - return resolvePlugins -} diff --git a/packages/theme/src/node/plugins/markdownEnhance.ts b/packages/theme/src/node/plugins/markdownEnhance.ts deleted file mode 100644 index ec17c30a..00000000 --- a/packages/theme/src/node/plugins/markdownEnhance.ts +++ /dev/null @@ -1,24 +0,0 @@ -import type { Plugin } from '@vuepress/core' -import { mdEnhancePlugin } from 'vuepress-plugin-md-enhance' -import type { PlumeThemePluginOptions } from '../../shared/index.js' - -export const resolveMarkdownEnhance = ( - plugins: PlumeThemePluginOptions -): Plugin => { - if (plugins.markdownEnhance === false) return [] as unknown as Plugin - return mdEnhancePlugin( - Object.assign( - { - container: true, // info note tip warning danger details - codetabs: true, - tabs: true, - align: true, - mark: true, - tasklist: true, - demo: true, - attrs: true, - }, - plugins.markdownEnhance || {} - ) - ) -} diff --git a/packages/theme/src/node/plugins/mediumZoom.ts b/packages/theme/src/node/plugins/mediumZoom.ts deleted file mode 100644 index bd27d968..00000000 --- a/packages/theme/src/node/plugins/mediumZoom.ts +++ /dev/null @@ -1,12 +0,0 @@ -import type { Plugin } from '@vuepress/core' -import { mediumZoomPlugin } from '@vuepress/plugin-medium-zoom' -import type { PlumeThemePluginOptions } from '../../shared/index.js' - -export const resolveMediumZoom = (plugins: PlumeThemePluginOptions): Plugin => { - if (plugins.mediumZoom === false) return [] as unknown as Plugin - return mediumZoomPlugin({ - selector: '.page-content > img, .page-content :not(a) > img', - zoomOptions: {}, - delay: 300, - }) -} diff --git a/packages/theme/src/node/plugins/nprogress.ts b/packages/theme/src/node/plugins/nprogress.ts deleted file mode 100644 index f24b8820..00000000 --- a/packages/theme/src/node/plugins/nprogress.ts +++ /dev/null @@ -1,8 +0,0 @@ -import type { Plugin } from '@vuepress/core' -import { nprogressPlugin } from '@vuepress/plugin-nprogress' -import type { PlumeThemePluginOptions } from '../../shared/index.js' - -export const resolveNprogress = (plugins: PlumeThemePluginOptions): Plugin => { - if (plugins.nprogress === false) return [] as unknown as Plugin - return nprogressPlugin() -} diff --git a/packages/theme/src/node/plugins/palette.ts b/packages/theme/src/node/plugins/palette.ts deleted file mode 100644 index a1e2cd94..00000000 --- a/packages/theme/src/node/plugins/palette.ts +++ /dev/null @@ -1,6 +0,0 @@ -import type { Plugin } from '@vuepress/core' -import { palettePlugin } from '@vuepress/plugin-palette' - -export const resolvePalette = (): Plugin => { - return palettePlugin({ preset: 'sass' }) -} diff --git a/packages/theme/src/node/plugins/prismjs.ts b/packages/theme/src/node/plugins/prismjs.ts deleted file mode 100644 index ca6a3ff2..00000000 --- a/packages/theme/src/node/plugins/prismjs.ts +++ /dev/null @@ -1,8 +0,0 @@ -import type { Plugin } from '@vuepress/core' -import { prismjsPlugin } from '@vuepress/plugin-prismjs' -import type { PlumeThemePluginOptions } from '../../shared/index.js' - -export const resolvePrismjs = (plugins: PlumeThemePluginOptions): Plugin => { - if (plugins.prismjs === false) return [] as unknown as Plugin - return prismjsPlugin() -} diff --git a/packages/theme/src/node/plugins/search.ts b/packages/theme/src/node/plugins/search.ts deleted file mode 100644 index f39765fb..00000000 --- a/packages/theme/src/node/plugins/search.ts +++ /dev/null @@ -1,14 +0,0 @@ -import type { Plugin } from '@vuepress/core' -import { docsearchPlugin } from '@vuepress/plugin-docsearch' -import { searchPlugin } from '@vuepress/plugin-search' -import type { PlumeThemePluginOptions } from '../../shared/index.js' - -export const resolveSearch = (plugins: PlumeThemePluginOptions): Plugin => { - if (plugins.search) { - return searchPlugin(plugins.search) - } - if (plugins.docsearch) { - return docsearchPlugin(plugins.docsearch) - } - return [] as unknown as Plugin -} diff --git a/packages/theme/src/node/plugins/seo.ts b/packages/theme/src/node/plugins/seo.ts deleted file mode 100644 index 3329f9e1..00000000 --- a/packages/theme/src/node/plugins/seo.ts +++ /dev/null @@ -1,20 +0,0 @@ -import type { Plugin } from '@vuepress/core' -import { seoPlugin } from 'vuepress-plugin-seo2' -import type { - PlumeThemeLocaleOptions, - PlumeThemePluginOptions, -} from '../../shared/index.js' - -const isProd = process.env.NODE_ENV === 'production' - -export const resolveSeo = ( - plugins: PlumeThemePluginOptions, - localeOptions: PlumeThemeLocaleOptions -): Plugin => { - if (plugins.sitemap === false || !localeOptions.hostname || !isProd) - return [] as unknown as Plugin - return seoPlugin({ - hostname: localeOptions.hostname || '', - author: localeOptions.avatar?.name, - }) -} diff --git a/packages/theme/src/node/plugins/sitemap.ts b/packages/theme/src/node/plugins/sitemap.ts deleted file mode 100644 index b13e52bf..00000000 --- a/packages/theme/src/node/plugins/sitemap.ts +++ /dev/null @@ -1,19 +0,0 @@ -import type { Plugin } from '@vuepress/core' -import { sitemapPlugin } from 'vuepress-plugin-sitemap2' -import type { - PlumeThemeLocaleOptions, - PlumeThemePluginOptions, -} from '../../shared/index.js' - -const isProd = process.env.NODE_ENV === 'production' - -export const resolveSitemap = ( - plugins: PlumeThemePluginOptions, - localeOptions: PlumeThemeLocaleOptions -): Plugin => { - if (plugins.sitemap === false || !localeOptions.hostname || !isProd) - return [] as unknown as Plugin - return sitemapPlugin({ - hostname: localeOptions.hostname, - }) -} diff --git a/packages/theme/src/node/plugins/themeData.ts b/packages/theme/src/node/plugins/themeData.ts deleted file mode 100644 index c6ddc929..00000000 --- a/packages/theme/src/node/plugins/themeData.ts +++ /dev/null @@ -1,8 +0,0 @@ -import type { PluginObject } from '@vuepress/core' -import { themeDataPlugin } from '@vuepress/plugin-theme-data' -import type { PlumeThemeLocaleOptions } from '../../shared/index.js' -export const resolveThemeData = ( - localeOptions: PlumeThemeLocaleOptions -): PluginObject => { - return themeDataPlugin({ themeData: localeOptions }) -} diff --git a/packages/theme/src/node/prepared/index.ts b/packages/theme/src/node/prepared/index.ts deleted file mode 100644 index 0718e219..00000000 --- a/packages/theme/src/node/prepared/index.ts +++ /dev/null @@ -1,21 +0,0 @@ -import type { App } from '@vuepress/core' -import type { PlumeThemeLocaleOptions } from '../../shared/index.js' -import { preparedPostIndex, watchPostIndex } from './postIndex.js' -import { preparedSidebarIndex, watchSidebarIndex } from './sidebarIndex.js' - -export const onPrepared = async ( - app: App, - localeOption: PlumeThemeLocaleOptions -): Promise => { - await preparedPostIndex(app, localeOption) - await preparedSidebarIndex(app, localeOption) -} - -export const preparedWatch = ( - app: App, - watchers: any[], - localeOption: PlumeThemeLocaleOptions -): void => { - watchPostIndex(app, watchers, localeOption) - watchSidebarIndex(app, watchers, localeOption) -} diff --git a/packages/theme/src/node/prepared/postIndex.ts b/packages/theme/src/node/prepared/postIndex.ts deleted file mode 100644 index 98af43e8..00000000 --- a/packages/theme/src/node/prepared/postIndex.ts +++ /dev/null @@ -1,87 +0,0 @@ -import type { App, Page } from '@vuepress/core' -import * as chokidar from 'chokidar' -import type { - PlumeThemeLocaleOptions, - PlumeThemePageData, - PlumeThemePostFrontmatter, - PostIndex, - PostItem, -} from '../../shared/index.js' -import { getCreateTime } from '../utils/index.js' - -const HMR_CODE = ` -if (import.meta.webpackHot) { - import.meta.webpackHot.accept() - if (__VUE_HMR_RUNTIME__.updatePostIndex) { - __VUE_HMR_RUNTIME__.updatePostIndex(postIndex) - } -} - -if (import.meta.hot) { - import.meta.hot.accept(({ postIndex }) => { - __VUE_HMR_RUNTIME__.updatePostIndex(postIndex) - }) -} -` - -export const preparedPostIndex = async ( - app: App, - localeOption: PlumeThemeLocaleOptions -): Promise => { - const postIndex: PostIndex = (app.pages as Page[]) - .filter((page) => { - return ( - !!page.pathInferred && - !!page.filePath && - page.path !== '/' && - page.path !== '/404.html' - ) - }) - .sort((left, right) => { - const leftMatter = left.frontmatter as PlumeThemePostFrontmatter - const rightMatter = right.frontmatter as PlumeThemePostFrontmatter - const leftTime = getCreateTime(leftMatter.createTime || '') - const rightTime = getCreateTime(rightMatter.createTime || '') - return leftTime < rightTime ? 1 : -1 - }) - .map((page: Page) => { - const frontmatter = page.frontmatter as PlumeThemePostFrontmatter - return { - title: page.title, - path: page.path, - excerpt: page.excerpt, - tags: frontmatter.tags || [], - createTime: page.data.createTime, - author: frontmatter.author, - sticky: frontmatter.sticky, - article: frontmatter.article, - category: page.data.category, - isNote: page.data.isNote, - banner: frontmatter.banner, - } as PostItem - }) - - let content = ` -export const postIndex = ${JSON.stringify(postIndex, null, 2)} -` - if (app.env.isDev) { - content += HMR_CODE - } - - await app.writeTemp('internal/postIndex.js', content) -} - -export const watchPostIndex = ( - app: App, - watchers: any[], - localeOption: PlumeThemeLocaleOptions -): void => { - const watcher = chokidar.watch('pages/**/*', { - cwd: app.dir.temp(), - ignoreInitial: true, - }) - watcher.on('add', () => preparedPostIndex(app, localeOption)) - watcher.on('change', () => preparedPostIndex(app, localeOption)) - watcher.on('unlink', () => preparedPostIndex(app, localeOption)) - watchers.push(watcher) -} diff --git a/packages/theme/src/node/prepared/sidebarIndex.ts b/packages/theme/src/node/prepared/sidebarIndex.ts deleted file mode 100644 index 5fe77fec..00000000 --- a/packages/theme/src/node/prepared/sidebarIndex.ts +++ /dev/null @@ -1,177 +0,0 @@ -import type { App, Page } from '@vuepress/core' -import { path } from '@vuepress/utils' -import * as chokidar from 'chokidar' -import type { - PlumeThemeLocaleOptions, - PlumeThemeNotesItem, - PlumeThemeNotesOptions, - PlumeThemePageData, - PlumeThemeSidebarConfigOptions, - SidebarItem, - SidebarOptions, -} from '../../shared/index.js' - -const HMR_CODE = ` -if (import.meta.webpackHot) { - import.meta.webpackHot.accept() - if (__VUE_HMR_RUNTIME__.updateSidebarIndex) { - __VUE_HMR_RUNTIME__.updatePostIndex(sidebarIndex) - } -} - -if (import.meta.hot) { - import.meta.hot.accept(({ sidebarIndex }) => { - __VUE_HMR_RUNTIME__.updateSidebarIndex(sidebarIndex) - }) -} -` - -interface NotePage { - relativePath: string[] - title: string - link: string -} - -export const preparedSidebarIndex = async ( - app: App, - { notes }: PlumeThemeLocaleOptions -): Promise => { - const pages = app.pages as Page[] - if (notes === false) return - const { - notes: noteList, - dir: rootDir, - link: rootLink, - } = notes as PlumeThemeNotesOptions - const notePageList: NotePage[] = pages - .filter((page) => page.filePathRelative?.startsWith(rootDir as string)) - .map((page) => { - return { - relativePath: page.filePathRelative?.split('/').slice(1) || [], - title: page.title, - link: page.path, - } - }) - - const sidebarMap: Record = {} - noteList.forEach((note) => { - sidebarMap[path.join('/', rootLink, note.link)] = noteSidebar( - note, - notePageList.filter( - (page) => - page.relativePath?.[0] === note.dir.trim().replace(/^\/|\/$/g, '') - ) - ) - }) - - let content = ` -export const sidebarIndex = ${JSON.stringify(sidebarMap, null, 2)} -` - if (app.env.isDev) { - content += HMR_CODE - } - - await app.writeTemp('internal/sidebarIndex.js', content) -} - -function noteSidebar( - note: PlumeThemeNotesItem, - notePageList: NotePage[] -): SidebarOptions { - if (note.sidebar === undefined) return [] - if (note.sidebar === 'auto') { - return autoSidebar(note, notePageList) - } - return sidebarByConfig( - note.text, - note.link, - note.dir, - note.sidebar, - notePageList - ) -} - -function autoSidebar( - note: PlumeThemeNotesItem, - notePageList: NotePage[] -): SidebarOptions { - return [] -} - -function sidebarByConfig( - text: string, - link: string | undefined, - dir: string, - sidebarConfig: PlumeThemeSidebarConfigOptions, - notePageList: NotePage[] -): SidebarOptions { - return sidebarConfig.map((sidebar) => { - if (typeof sidebar === 'string') { - const current = findNotePage(sidebar, dir, notePageList) - return { - text: current ? current.title : text, - link: current ? current.link : '', - children: [], - } as SidebarItem - } else { - link = path.join(link || '', sidebar.link || '') - const current = sidebar.link - ? findNotePage(sidebar.link, dir, notePageList) - : undefined - return { - text: sidebar.text || sidebar.dir || '', - link: current?.link, - children: sidebarByConfig( - sidebar.text, - sidebar.link, - path.join(dir, sidebar.dir || ''), - sidebar.children, - notePageList - ), - } - } - }) -} - -function findNotePage( - sidebar: string, - dir: string, - notePageList: NotePage[] -): NotePage | undefined { - if (sidebar === '' || sidebar === 'README.md' || sidebar === 'index.md') { - return notePageList.find((page) => { - const relative = page.relativePath.join('/') - return ( - relative === path.join(dir, 'README.md') || - relative === path.join(dir, 'index.md') - ) - }) - } else { - return notePageList.find((page) => { - const relative = page.relativePath.join('/') - return ( - relative === path.join(dir, sidebar) || - relative === path.join(dir, sidebar + '.md') || - page.link === sidebar - ) - }) - } -} - -export const watchSidebarIndex = ( - app: App, - watchers: any[], - localeOption: PlumeThemeLocaleOptions -): void => { - if (!localeOption.notes || !localeOption.notes.dir) return - const dir = path.join('pages', localeOption.notes.dir, '**/*') - const watcher = chokidar.watch(dir, { - cwd: app.dir.temp(), - ignoreInitial: true, - }) - - watcher.on('add', () => preparedSidebarIndex(app, localeOption)) - watcher.on('change', () => preparedSidebarIndex(app, localeOption)) - watcher.on('unlink', () => preparedSidebarIndex(app, localeOption)) - watchers.push(watcher) -} diff --git a/packages/theme/src/node/shims.d.ts b/packages/theme/src/node/shims.d.ts deleted file mode 100644 index 5591cb30..00000000 --- a/packages/theme/src/node/shims.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -declare module 'json2yaml' { - const result: any - - export default result -} diff --git a/packages/theme/src/node/theme.ts b/packages/theme/src/node/theme.ts index 84c214b8..f11f11f9 100644 --- a/packages/theme/src/node/theme.ts +++ b/packages/theme/src/node/theme.ts @@ -1,42 +1,31 @@ -import type { App, Page, Theme } from '@vuepress/core' -import merge from 'lodash.merge' -import type { PlumeThemeOptions, PlumeThemePageData } from '../shared/index.js' -import { getAlias } from './alias.js' -import { createPage } from './createPage/index.js' -import { defaultLocaleOption } from './defaultLocaleOption.js' -import { extendsPage } from './extendsPage.js' -import { generateFrontmatter } from './generateFrontmatter.js' -import { getPlugins } from './plugins/index.js' -import { onPrepared, preparedWatch } from './prepared/index.js' -import { resolveClient, resolveTemplate } from './utils/index.js' +import type { App, Theme } from '@vuepress/core' +import { fs, getDirname, path } from '@vuepress/utils' +import type { PlumeThemeOptions } from '../shared/index.js' +import { setupPlugins } from './plugins.js' -export const themePlume = ({ +const __dirname = getDirname(import.meta.url) + +export const plumeTheme = ({ themePlugins = {}, - ...localeOption + ...localeOptions }: PlumeThemeOptions = {}): Theme => { - localeOption = merge(defaultLocaleOption, localeOption) - let watchMarkdown: null | ((app: App, watchers: unknown) => void) = null - return { - name: '@vuepress-plume/vuepress-theme-plume', - templateBuild: resolveTemplate('index.build.html'), - alias: getAlias(), - clientConfigFile: resolveClient('config.js'), - onInitialized: async (app) => { - const { formatFrontmatter, watchNewMarkDown } = generateFrontmatter( - app.options.source, - localeOption - ) - watchMarkdown = watchNewMarkDown - formatFrontmatter() - await createPage(app, localeOption) - }, - onPrepared: async (app) => await onPrepared(app, localeOption), - extendsPage: (page: Page>) => - extendsPage(page, localeOption), - onWatched: (app, watchers) => { - preparedWatch(app, watchers, localeOption) - watchMarkdown && watchMarkdown(app, watchers) - }, - plugins: getPlugins(themePlugins, localeOption), + return (app: App) => { + return { + name: '@vuepress-plume/theme-plume', + templateBuild: path.resolve(__dirname, '../../templates/build.html'), + alias: { + ...Object.fromEntries( + fs + .readdirSync(path.resolve(__dirname, '../client/components')) + .filter((file) => file.endsWith('.vue')) + .map((file) => [ + `@theme/${file}`, + path.resolve(__dirname, '../client/components', file), + ]) + ), + }, + clientConfigFile: path.resolve(__dirname, '../client/config.js'), + plugins: setupPlugins(app, themePlugins, localeOptions), + } } } diff --git a/packages/theme/src/node/utils/date.ts b/packages/theme/src/node/utils/date.ts deleted file mode 100644 index ce55d2a6..00000000 --- a/packages/theme/src/node/utils/date.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { format, getTime, parse } from 'date-fns' - -export const getCreateTime = (date: string): number => { - const d = parse(date, 'yyyy/MM/dd HH:mm:ss', new Date()) - return getTime(d) -} - -export const formatDate = (date: string | undefined): string => { - if (!date) return '' - const d = parse(date, 'yyyy/MM/dd HH:mm:ss', new Date()) - return format(d, 'yyyy-MM-dd') -} diff --git a/packages/theme/src/node/utils/index.ts b/packages/theme/src/node/utils/index.ts deleted file mode 100644 index 0f359eb3..00000000 --- a/packages/theme/src/node/utils/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './path.js' -export * from './date.js' -export * from './readFileList.js' diff --git a/packages/theme/src/node/utils/path.ts b/packages/theme/src/node/utils/path.ts deleted file mode 100644 index 65be7e04..00000000 --- a/packages/theme/src/node/utils/path.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { getDirname, path } from '@vuepress/utils' - -const __dirname = getDirname(import.meta.url) - -export const resolvePath = (...args: string[]): string => { - return path.resolve(__dirname, '../../', ...args) -} - -export const resolveClient = (...args: string[]): string => { - return resolvePath('client', ...args) -} - -export const resolveTemplate = (...args: string[]): string => { - return resolvePath('../', 'template', ...args) -} diff --git a/packages/theme/src/node/utils/readFileList.ts b/packages/theme/src/node/utils/readFileList.ts deleted file mode 100644 index 32216ce0..00000000 --- a/packages/theme/src/node/utils/readFileList.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { fs, path } from '@vuepress/utils' - -export interface MarkdownFile { - filepath: string - content: string - createTime: Date -} - -export const readFileList = ( - sourceDir: string, - fileList: MarkdownFile[] = [] -): MarkdownFile[] => { - const files = fs.readdirSync(sourceDir) - files.forEach((file) => { - const filepath = path.join(sourceDir, file) - const stat = fs.statSync(filepath) - if (stat.isDirectory()) { - if (file !== '.vuepress' && file !== 'node_modules') - readFileList(filepath, fileList) - } else { - const extname = path.extname(file) - const basename = path.basename(file) - if ( - (extname === '.md' || extname === '.MD') && - basename !== 'CHANGELOG' - ) { - fileList.push(readFile(filepath, stat)) - } - } - }) - return fileList.filter((file) => file.filepath.endsWith('.md')) -} - -export const readFile = (filepath: string, stat: fs.Stats): MarkdownFile => { - return { - filepath, - content: fs.readFileSync(filepath, 'utf-8'), - createTime: getFileCreateTime(stat), - } -} - -export const getFileCreateTime = (stat: fs.Stats): Date => { - return stat.birthtime.getFullYear() !== 1970 ? stat.birthtime : stat.atime -} diff --git a/packages/theme/src/shared/frontmatter/post.ts b/packages/theme/src/shared/frontmatter.ts similarity index 59% rename from packages/theme/src/shared/frontmatter/post.ts rename to packages/theme/src/shared/frontmatter.ts index c96f0f20..097b72b4 100644 --- a/packages/theme/src/shared/frontmatter/post.ts +++ b/packages/theme/src/shared/frontmatter.ts @@ -1,5 +1,8 @@ +export interface PlumeThemeHomeFrontmatter { + home?: true +} + export interface PlumeThemePostFrontmatter { - title?: string createTime?: string author?: string tags?: string[] @@ -8,3 +11,7 @@ export interface PlumeThemePostFrontmatter { banner?: string bgBanner?: string } + +export interface PlumeThemeNoteFrontmatter { + createTime?: string +} diff --git a/packages/theme/src/shared/frontmatter/home.ts b/packages/theme/src/shared/frontmatter/home.ts deleted file mode 100644 index d2e2a9f1..00000000 --- a/packages/theme/src/shared/frontmatter/home.ts +++ /dev/null @@ -1,18 +0,0 @@ -import type { PlumeThemeNormalFrontmatter } from './normal.js' - -export interface PlumeThemeProductItem { - link?: string - text: string - description?: string - logo?: string -} - -export type PlumeThemeProductList = PlumeThemeProductItem[] - -export interface PlumeThemeHomeFrontmatter extends PlumeThemeNormalFrontmatter { - home?: true - banner?: string - mobileBanner?: string - productList?: PlumeThemeProductList - motto?: string -} diff --git a/packages/theme/src/shared/frontmatter/index.ts b/packages/theme/src/shared/frontmatter/index.ts deleted file mode 100644 index 3cea147c..00000000 --- a/packages/theme/src/shared/frontmatter/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './normal.js' -export * from './post.js' -export * from './home.js' diff --git a/packages/theme/src/shared/frontmatter/normal.ts b/packages/theme/src/shared/frontmatter/normal.ts deleted file mode 100644 index 97db9ddb..00000000 --- a/packages/theme/src/shared/frontmatter/normal.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface PlumeThemeNormalFrontmatter { - home?: boolean -} diff --git a/packages/theme/src/shared/index.ts b/packages/theme/src/shared/index.ts index 93b78889..f15365c2 100644 --- a/packages/theme/src/shared/index.ts +++ b/packages/theme/src/shared/index.ts @@ -1,5 +1,3 @@ +export * from './frontmatter.js' +export * from './note.js' export * from './options/index.js' -export * from './layout/index.js' -export * from './post.js' -export * from './frontmatter/index.js' -export * from './page.js' diff --git a/packages/theme/src/shared/layout/index.ts b/packages/theme/src/shared/layout/index.ts deleted file mode 100644 index 1082a2ad..00000000 --- a/packages/theme/src/shared/layout/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './navbar.js' - -export * from './sidebar.js' diff --git a/packages/theme/src/shared/layout/navbar.ts b/packages/theme/src/shared/layout/navbar.ts deleted file mode 100644 index 58ae7487..00000000 --- a/packages/theme/src/shared/layout/navbar.ts +++ /dev/null @@ -1,22 +0,0 @@ -export interface NavItem { - text: string - ariaLabel?: string -} - -export interface NavGroup extends NavItem { - children: T[] -} - -export interface NavLink extends NavItem { - link: string - rel?: string - target?: string - activeMatch?: string -} - -export type NavbarItem = NavLink - -export type NavbarGroup = NavGroup - -export type NavbarConfig = (NavbarItem | NavbarGroup | string)[] -export type ResolveNavbarItem = NavbarItem | NavGroup diff --git a/packages/theme/src/shared/layout/sidebar.ts b/packages/theme/src/shared/layout/sidebar.ts deleted file mode 100644 index 72460ebb..00000000 --- a/packages/theme/src/shared/layout/sidebar.ts +++ /dev/null @@ -1,7 +0,0 @@ -export interface SidebarItem { - text: string - link?: string - children: SidebarOptions -} - -export type SidebarOptions = SidebarItem[] diff --git a/packages/theme/src/shared/options/notes.ts b/packages/theme/src/shared/note.ts similarity index 100% rename from packages/theme/src/shared/options/notes.ts rename to packages/theme/src/shared/note.ts diff --git a/packages/theme/src/shared/options/index.ts b/packages/theme/src/shared/options/index.ts index 62470d6c..940940d0 100644 --- a/packages/theme/src/shared/options/index.ts +++ b/packages/theme/src/shared/options/index.ts @@ -1,4 +1,17 @@ -export * from './plugin.js' +import type { ThemeData } from '@vuepress/plugin-theme-data' +import type { PlumeThemeLocaleData } from './locale.js' +import type { PlumeThemePluginOptions } from './plugins.js' + +export interface PlumeThemeOptions extends PlumeThemeLocaleOptions { + /** + * 对主题内部使用的插件进行配置 + */ + themePlugins?: PlumeThemePluginOptions +} + +export type PlumeThemeLocaleOptions = PlumeThemeData + +export type PlumeThemeData = ThemeData + export * from './locale.js' -export * from './options.js' -export * from './notes.js' +export * from './plugins.js' diff --git a/packages/theme/src/shared/options/locale.ts b/packages/theme/src/shared/options/locale.ts index e2970e6c..2132ecfb 100644 --- a/packages/theme/src/shared/options/locale.ts +++ b/packages/theme/src/shared/options/locale.ts @@ -1,6 +1,11 @@ import type { LocaleData } from '@vuepress/core' -import type { NavbarConfig, NavLink } from '../layout/index.js' -import type { PlumeThemeNotesOptions } from './notes.js' +// import type { NavbarConfig, NavLink } from '../layout/index.js' +// import type { PlumeThemeNotesOptions } from './notes.js' + +// todo type +type NavbarConfig = any +type NavLink = any +type PlumeThemeNotesOptions = any export interface PlumeThemeAvatar { /** diff --git a/packages/theme/src/shared/options/options.ts b/packages/theme/src/shared/options/options.ts deleted file mode 100644 index 49e2160d..00000000 --- a/packages/theme/src/shared/options/options.ts +++ /dev/null @@ -1,14 +0,0 @@ -import type { ThemeData } from '@vuepress/plugin-theme-data' -import type { PlumeThemeLocaleData } from './locale.js' -import type { PlumeThemePluginOptions } from './plugin.js' - -export interface PlumeThemeOptions extends PlumeThemeLocaleOptions { - /** - * 对主题内部使用的插件进行配置 - */ - themePlugins?: PlumeThemePluginOptions -} - -export type PlumeThemeLocaleOptions = PlumeThemeData - -export type PlumeThemeData = ThemeData diff --git a/packages/theme/src/shared/options/plugin.ts b/packages/theme/src/shared/options/plugins.ts similarity index 98% rename from packages/theme/src/shared/options/plugin.ts rename to packages/theme/src/shared/options/plugins.ts index 38057636..2e860bae 100644 --- a/packages/theme/src/shared/options/plugin.ts +++ b/packages/theme/src/shared/options/plugins.ts @@ -5,6 +5,7 @@ import type { DocsearchOptions } from '@vuepress/plugin-docsearch' import type { SearchPluginOptions } from '@vuepress/plugin-search' import type { CommentOptions } from 'vuepress-plugin-comment2' import type { MarkdownEnhanceOptions } from 'vuepress-plugin-md-enhance' + export interface PlumeThemePluginOptions { /** * 是否启用 can-i-use 插件 @@ -42,5 +43,7 @@ export interface PlumeThemePluginOptions { sitemap?: false + seo?: false + baiduTongji?: false | BaiduTongjiOptions } diff --git a/packages/theme/src/shared/page.ts b/packages/theme/src/shared/page.ts deleted file mode 100644 index 83ec492c..00000000 --- a/packages/theme/src/shared/page.ts +++ /dev/null @@ -1,3 +0,0 @@ -import type { PostItem } from './post.js' - -export type PlumeThemePageData = PostItem diff --git a/packages/theme/src/shared/post.ts b/packages/theme/src/shared/post.ts deleted file mode 100644 index 939139a8..00000000 --- a/packages/theme/src/shared/post.ts +++ /dev/null @@ -1,22 +0,0 @@ -export interface CategoryItem { - type: number | string - name: string -} - -export type CategoryData = CategoryItem[] - -export interface PostItem { - title: string - path: string - excerpt: string - tags: string[] - createTime: string - author: string - sticky?: boolean | number - article?: boolean - category: CategoryData - isNote?: boolean - banner?: string -} - -export type PostIndex = PostItem[] diff --git a/packages/theme/template/index.build.html b/packages/theme/templates/build.html similarity index 53% rename from packages/theme/template/index.build.html rename to packages/theme/templates/build.html index dbf2e687..eb399e3d 100644 --- a/packages/theme/template/index.build.html +++ b/packages/theme/templates/build.html @@ -1,9 +1,8 @@ - - - + + + - +
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dc6f9cf3..58a1d7e4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -94,6 +94,22 @@ importers: sass-loader: 13.1.0_sass@1.55.0 vue: 3.2.41 + packages/plugin-auto-frontmatter: + specifiers: + '@vuepress/core': 2.0.0-beta.51 + '@vuepress/shared': 2.0.0-beta.51 + '@vuepress/utils': 2.0.0-beta.51 + chokidar: ^3.5.3 + glob-to-regexp: ^0.4.1 + gray-matter: ^4.0.3 + dependencies: + '@vuepress/core': 2.0.0-beta.51 + '@vuepress/shared': 2.0.0-beta.51 + '@vuepress/utils': 2.0.0-beta.51 + chokidar: 3.5.3 + glob-to-regexp: 0.4.1 + gray-matter: 4.0.3 + packages/plugin-baidu-tongji: specifiers: '@vuepress/client': 2.0.0-beta.51 @@ -106,6 +122,26 @@ importers: '@vuepress/shared': 2.0.0-beta.51 '@vuepress/utils': 2.0.0-beta.51 + packages/plugin-blog-data: + specifiers: + '@vue/devtools-api': ^6.4.5 + '@vuepress/client': 2.0.0-beta.51 + '@vuepress/core': 2.0.0-beta.51 + '@vuepress/shared': 2.0.0-beta.51 + '@vuepress/utils': 2.0.0-beta.51 + chokidar: ^3.5.3 + glob-to-regexp: ^0.4.1 + vue: ^3.2.41 + dependencies: + '@vue/devtools-api': 6.4.5 + '@vuepress/client': 2.0.0-beta.51 + '@vuepress/core': 2.0.0-beta.51 + '@vuepress/shared': 2.0.0-beta.51 + '@vuepress/utils': 2.0.0-beta.51 + chokidar: 3.5.3 + glob-to-regexp: 0.4.1 + vue: 3.2.41 + packages/plugin-caniuse: specifiers: '@types/markdown-it': ^12.2.3 @@ -212,6 +248,72 @@ importers: windicss-webpack-plugin: 1.7.6 packages/theme: + specifiers: + '@types/lodash.merge': ^4.6.7 + '@vuepress-plume/vuepress-plugin-auto-frontmatter': workspace:* + '@vuepress-plume/vuepress-plugin-baidu-tongji': workspace:* + '@vuepress-plume/vuepress-plugin-blog-data': workspace:* + '@vuepress-plume/vuepress-plugin-caniuse': workspace:* + '@vuepress-plume/vuepress-plugin-copy-code': workspace:* + '@vuepress/client': 2.0.0-beta.51 + '@vuepress/core': 2.0.0-beta.51 + '@vuepress/plugin-active-header-links': 2.0.0-beta.51 + '@vuepress/plugin-container': 2.0.0-beta.51 + '@vuepress/plugin-docsearch': 2.0.0-beta.51 + '@vuepress/plugin-external-link-icon': 2.0.0-beta.51 + '@vuepress/plugin-git': 2.0.0-beta.51 + '@vuepress/plugin-medium-zoom': 2.0.0-beta.51 + '@vuepress/plugin-nprogress': 2.0.0-beta.51 + '@vuepress/plugin-palette': 2.0.0-beta.51 + '@vuepress/plugin-prismjs': 2.0.0-beta.51 + '@vuepress/plugin-search': 2.0.0-beta.51 + '@vuepress/plugin-theme-data': 2.0.0-beta.51 + '@vuepress/plugin-toc': 2.0.0-beta.51 + '@vuepress/shared': 2.0.0-beta.51 + '@vuepress/utils': 2.0.0-beta.51 + date-fns: ^2.29.3 + nanoid: ^4.0.0 + ts-debounce: ^4.0.0 + vue: ^3.2.41 + vue-router: 4.1.5 + vuepress-plugin-comment2: 2.0.0-beta.110 + vuepress-plugin-md-enhance: 2.0.0-beta.110 + vuepress-plugin-seo2: 2.0.0-beta.110 + vuepress-plugin-sitemap2: 2.0.0-beta.110 + dependencies: + '@types/lodash.merge': 4.6.7 + '@vuepress-plume/vuepress-plugin-auto-frontmatter': link:../plugin-auto-frontmatter + '@vuepress-plume/vuepress-plugin-baidu-tongji': link:../plugin-baidu-tongji + '@vuepress-plume/vuepress-plugin-blog-data': link:../plugin-blog-data + '@vuepress-plume/vuepress-plugin-caniuse': link:../plugin-caniuse + '@vuepress-plume/vuepress-plugin-copy-code': link:../plugin-copy-code + '@vuepress/client': 2.0.0-beta.51 + '@vuepress/core': 2.0.0-beta.51 + '@vuepress/plugin-active-header-links': 2.0.0-beta.51 + '@vuepress/plugin-container': 2.0.0-beta.51 + '@vuepress/plugin-docsearch': 2.0.0-beta.51 + '@vuepress/plugin-external-link-icon': 2.0.0-beta.51 + '@vuepress/plugin-git': 2.0.0-beta.51 + '@vuepress/plugin-medium-zoom': 2.0.0-beta.51 + '@vuepress/plugin-nprogress': 2.0.0-beta.51 + '@vuepress/plugin-palette': 2.0.0-beta.51 + '@vuepress/plugin-prismjs': 2.0.0-beta.51 + '@vuepress/plugin-search': 2.0.0-beta.51 + '@vuepress/plugin-theme-data': 2.0.0-beta.51 + '@vuepress/plugin-toc': 2.0.0-beta.51 + '@vuepress/shared': 2.0.0-beta.51 + '@vuepress/utils': 2.0.0-beta.51 + date-fns: 2.29.3 + nanoid: 4.0.0 + ts-debounce: 4.0.0 + vue: 3.2.41 + vue-router: 4.1.5_vue@3.2.41 + vuepress-plugin-comment2: 2.0.0-beta.110 + vuepress-plugin-md-enhance: 2.0.0-beta.110 + vuepress-plugin-seo2: 2.0.0-beta.110 + vuepress-plugin-sitemap2: 2.0.0-beta.110 + + packages/theme-back: specifiers: '@types/lodash.merge': ^4.6.7 '@vuepress-plume/vuepress-plugin-baidu-tongji': workspace:* @@ -2718,6 +2820,10 @@ packages: resolution: {integrity: sha512-OEgAMeQXvCoJ+1x8WyQuVZzFo0wcyCmUR3baRVLmKBo1LmYZWMlRiXlux5jd0fqVJu6PfDbOrZItVqUEzLobeQ==} dev: false + /@vue/devtools-api/6.4.5: + resolution: {integrity: sha512-JD5fcdIuFxU4fQyXUu3w2KpAJHzTVdN+p4iOX2lMWSHMOoQdMAcpFLZzm9Z/2nmsoZ1a96QEhZ26e50xLBsgOQ==} + dev: false + /@vue/reactivity-transform/3.2.41: resolution: {integrity: sha512-mK5+BNMsL4hHi+IR3Ft/ho6Za+L3FA5j8WvreJ7XzHrqkPq8jtF/SMo7tuc9gHjLDwKZX1nP1JQOKo9IEAn54A==} dependencies: @@ -2851,7 +2957,7 @@ packages: /@vuepress/client/2.0.0-beta.51: resolution: {integrity: sha512-5iQV765kwR6/eIZPMlV5O34DUvHCMjF7zpr91x5i8BEAg7A0jfHvdrwNavAKWiQEU77f4dIBXtWy6nwX+lgmbw==} dependencies: - '@vue/devtools-api': 6.2.1 + '@vue/devtools-api': 6.4.5 '@vuepress/shared': 2.0.0-beta.51 vue: 3.2.41 vue-router: 4.1.5_vue@3.2.41 @@ -14668,7 +14774,7 @@ packages: peerDependencies: vue: ^3.2.0 dependencies: - '@vue/devtools-api': 6.2.1 + '@vue/devtools-api': 6.4.5 vue: 3.2.41 dev: false @@ -14682,6 +14788,28 @@ packages: '@vue/shared': 3.2.41 dev: false + /vuepress-plugin-comment2/2.0.0-beta.110: + resolution: {integrity: sha512-P9WqGjoKfssFm1JodDahryzCPg94+9qamfrK2xnhe9X9uOaQsgtnH90eb6BsSXyu+apkTV8gPwEfrg3dbPhR4A==} + peerDependencies: + sass-loader: ^13.0.0 + peerDependenciesMeta: + sass-loader: + optional: true + dependencies: + '@vuepress/client': 2.0.0-beta.51 + '@vuepress/utils': 2.0.0-beta.51 + '@waline/client': 2.13.0 + giscus: 1.2.0 + twikoo: 1.6.7 + vue: 3.2.41 + vue-router: 4.1.5_vue@3.2.41 + vuepress-plugin-sass-palette: 2.0.0-beta.110 + vuepress-shared: 2.0.0-beta.110 + transitivePeerDependencies: + - '@vue/composition-api' + - supports-color + dev: false + /vuepress-plugin-comment2/2.0.0-beta.110_sass-loader@13.1.0: resolution: {integrity: sha512-P9WqGjoKfssFm1JodDahryzCPg94+9qamfrK2xnhe9X9uOaQsgtnH90eb6BsSXyu+apkTV8gPwEfrg3dbPhR4A==} peerDependencies: @@ -14705,6 +14833,43 @@ packages: - supports-color dev: false + /vuepress-plugin-md-enhance/2.0.0-beta.110: + resolution: {integrity: sha512-e1AQQeyERo5SiZiEsPqtkjZ0e9Fy8kWdYx+VOUGUBoFGqIaokC/YWOtiUn4ItM+iC2l4e/VFbrJJjeye73UWHw==} + peerDependencies: + sass-loader: ^13.0.0 + peerDependenciesMeta: + sass-loader: + optional: true + dependencies: + '@babel/core': 7.18.10 + '@types/katex': 0.14.0 + '@types/markdown-it': 12.2.3 + '@types/mermaid': 9.1.0 + '@vue/repl': 1.3.2_vue@3.2.41 + '@vuepress/client': 2.0.0-beta.51 + '@vuepress/shared': 2.0.0-beta.51 + '@vuepress/utils': 2.0.0-beta.51 + '@vueuse/core': 9.3.0_vue@3.2.41 + balloon-css: 1.2.0 + chart.js: 3.9.1 + echarts: 5.4.0 + flowchart.js: 1.17.1 + juice: 8.1.0 + katex: 0.16.2 + markdown-it: 13.0.1 + mathjax-full: 3.2.2 + mermaid: 9.1.7 + reveal.js: 4.3.1 + vue: 3.2.41 + vue-router: 4.1.5_vue@3.2.41 + vuepress-plugin-sass-palette: 2.0.0-beta.110 + vuepress-shared: 2.0.0-beta.110 + transitivePeerDependencies: + - '@vue/composition-api' + - encoding + - supports-color + dev: false + /vuepress-plugin-md-enhance/2.0.0-beta.110_sass-loader@13.1.0: resolution: {integrity: sha512-e1AQQeyERo5SiZiEsPqtkjZ0e9Fy8kWdYx+VOUGUBoFGqIaokC/YWOtiUn4ItM+iC2l4e/VFbrJJjeye73UWHw==} peerDependencies: @@ -14743,6 +14908,22 @@ packages: - supports-color dev: false + /vuepress-plugin-sass-palette/2.0.0-beta.110: + resolution: {integrity: sha512-GKBdDQ4vo4NvUrf0+SKkcnUcAFZ9i0u4PGBpmsW+moVcSRZLHHS2uC+Am27X9r05em9XYmtd+0q62Zg1xXZznA==} + peerDependencies: + sass-loader: ^13.0.0 + peerDependenciesMeta: + sass-loader: + optional: true + dependencies: + '@vuepress/utils': 2.0.0-beta.51 + chokidar: 3.5.3 + sass: 1.55.0 + vuepress-shared: 2.0.0-beta.110 + transitivePeerDependencies: + - supports-color + dev: false + /vuepress-plugin-sass-palette/2.0.0-beta.110_sass-loader@13.1.0: resolution: {integrity: sha512-GKBdDQ4vo4NvUrf0+SKkcnUcAFZ9i0u4PGBpmsW+moVcSRZLHHS2uC+Am27X9r05em9XYmtd+0q62Zg1xXZznA==} peerDependencies: diff --git a/tsconfig.json b/tsconfig.json index b1cb9e06..ef8ff890 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,6 +6,9 @@ "jsx": "preserve", "paths": { "@theme-plume/*": ["./packages/theme/src/client/components/*"], + "@internal/blogData": [ + "./packages/plugin-blog-data/src/client/blogPostData.d.ts" + ], "@internal/*": ["./docs/.vuepress/.temp/internal/*"], "@vuepress-plume/vuepress-*": ["./packages/*/src/node/index.ts"], "@vuepress-plume/vuepress-theme-plume": [ From 9737e9810c03396752b442f982fd5fe08657854d Mon Sep 17 00:00:00 2001 From: pengzhanbo Date: Fri, 4 Nov 2022 21:07:32 +0800 Subject: [PATCH 02/29] =?UTF-8?q?feat:=20=E9=87=8D=E6=9E=84=E9=83=A8?= =?UTF-8?q?=E5=88=86=E6=8F=92=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 1 + .../plugin-baidu-tongji/tsconfig.build.json | 3 +- .../plugin-blog-data/src/client/config.ts | 1 - packages/plugin-blog-data/src/node/index.ts | 2 +- packages/plugin-blog-data/src/node/plugin.ts | 9 +++ .../plugin-windicss/src/client/config.vite.ts | 1 + packages/plugin-windicss/src/node/plugin.ts | 5 +- .../plugin-windicss/src/node/windicss.d.ts | 22 +++--- packages/theme/package.json | 5 +- .../src/client/components/Navbar/index.vue | 4 + .../theme/src/client/composables/index.ts | 4 + .../src/client/composables/useDarkMode.ts | 72 ++++++++++++++++++ .../useResolveRouteWithRedirect.ts | 28 +++++++ .../client/composables/useScrollPromise.ts | 22 ++++++ .../src/client/composables/useThemeData.ts | 14 ++++ packages/theme/src/client/config.ts | 6 ++ packages/theme/src/client/layouts/Layout.vue | 13 +++- packages/theme/src/client/styles/index.scss | 0 packages/theme/src/client/windi.config.ts | 73 +++++++++++++++++++ packages/theme/src/node/plugins.ts | 5 ++ packages/theme/src/shared/options/index.ts | 36 +++++++++ packages/theme/src/shared/options/locale.ts | 6 +- pnpm-lock.yaml | 12 +++ tsconfig.base.json | 42 +---------- 24 files changed, 329 insertions(+), 57 deletions(-) create mode 100644 packages/theme/src/client/components/Navbar/index.vue create mode 100644 packages/theme/src/client/composables/index.ts create mode 100644 packages/theme/src/client/composables/useDarkMode.ts create mode 100644 packages/theme/src/client/composables/useResolveRouteWithRedirect.ts create mode 100644 packages/theme/src/client/composables/useScrollPromise.ts create mode 100644 packages/theme/src/client/composables/useThemeData.ts create mode 100644 packages/theme/src/client/styles/index.scss create mode 100644 packages/theme/src/client/windi.config.ts diff --git a/package.json b/package.json index c7c304ec..305d3c75 100644 --- a/package.json +++ b/package.json @@ -76,6 +76,7 @@ "sort-package-json": "^2.0.0", "taze": "^0.8.2", "ts-node": "^10.9.1", + "tsconfig-vuepress": "^4.0.0", "typescript": "^4.8.4", "vite": "^3.1.8" }, diff --git a/packages/plugin-baidu-tongji/tsconfig.build.json b/packages/plugin-baidu-tongji/tsconfig.build.json index 3395ea55..9a9c1efa 100644 --- a/packages/plugin-baidu-tongji/tsconfig.build.json +++ b/packages/plugin-baidu-tongji/tsconfig.build.json @@ -2,7 +2,8 @@ "extends": "../../tsconfig.base.json", "compilerOptions": { "rootDir": "./src", - "outDir": "./lib" + "outDir": "./lib", + "composite": true }, "include": ["./src"], "files": [] diff --git a/packages/plugin-blog-data/src/client/config.ts b/packages/plugin-blog-data/src/client/config.ts index 27063fc9..97d99d32 100644 --- a/packages/plugin-blog-data/src/client/config.ts +++ b/packages/plugin-blog-data/src/client/config.ts @@ -4,7 +4,6 @@ import { useBlogPostData } from './composables/index.js' export default defineClientConfig({ enhance({ app }) { - // provide theme data & theme locale data const blogPostData = useBlogPostData() // setup devtools in dev mode diff --git a/packages/plugin-blog-data/src/node/index.ts b/packages/plugin-blog-data/src/node/index.ts index 312eda7b..289ed329 100644 --- a/packages/plugin-blog-data/src/node/index.ts +++ b/packages/plugin-blog-data/src/node/index.ts @@ -1,6 +1,6 @@ import { blogDataPlugin } from './plugin.js' export * from '../shared/index.js' -export * from './plugin.js' +export { blogDataPlugin } export default blogDataPlugin diff --git a/packages/plugin-blog-data/src/node/plugin.ts b/packages/plugin-blog-data/src/node/plugin.ts index 8348d0b8..38d1694c 100644 --- a/packages/plugin-blog-data/src/node/plugin.ts +++ b/packages/plugin-blog-data/src/node/plugin.ts @@ -41,6 +41,15 @@ export const blogDataPlugin = ({ return { name: '@vuepress-plume/vuepress-plugin-blog-data', clientConfigFile: path.resolve(__dirname, '../client/config.js'), + extendsPage(page) { + if ( + page.filePathRelative && + options.exclude.every((filter) => filter(page.filePathRelative!)) && + options.include.some((filter) => filter(page.filePathRelative!)) + ) { + ;(page.data as any).isBlogPost = true + } + }, onPrepared: async (app) => await preparedBlogData(app, options), onWatched(app, watchers) { const watcher = chokidar.watch('pages/**/*', { diff --git a/packages/plugin-windicss/src/client/config.vite.ts b/packages/plugin-windicss/src/client/config.vite.ts index 0bf9dc52..6558b17a 100644 --- a/packages/plugin-windicss/src/client/config.vite.ts +++ b/packages/plugin-windicss/src/client/config.vite.ts @@ -1,5 +1,6 @@ import { defineClientConfig } from '@vuepress/client' +// import 'virtual:windi-devtools' import 'virtual:windi.css' export default defineClientConfig({}) diff --git a/packages/plugin-windicss/src/node/plugin.ts b/packages/plugin-windicss/src/node/plugin.ts index 8d23f8f3..eaa87e17 100644 --- a/packages/plugin-windicss/src/node/plugin.ts +++ b/packages/plugin-windicss/src/node/plugin.ts @@ -14,7 +14,10 @@ export const windiCSSPlugin = (options?: WindiCSSOptions | string): Plugin => { let userOptions: UserOptions | undefined let utilsOptions: WindiPluginUtilsOptions | undefined if (typeof options === 'string') { - userOptions = { config: options } + userOptions = { + config: options, + include: ['**/.vuepress/**/*.{vue,jsx,tsx}', '**/*.md'], + } } else { options = options || {} userOptions = options.userOptions diff --git a/packages/plugin-windicss/src/node/windicss.d.ts b/packages/plugin-windicss/src/node/windicss.d.ts index 1e309ec4..50c54b58 100644 --- a/packages/plugin-windicss/src/node/windicss.d.ts +++ b/packages/plugin-windicss/src/node/windicss.d.ts @@ -1,17 +1,17 @@ -declare module 'windicss-webpack-plugin' { - const result: any +// declare module 'windicss-webpack-plugin' { +// const result: any - export default result -} +// export default result +// } -declare module 'vite-plugin-windicss' { - const result: any +// declare module 'vite-plugin-windicss' { +// const result: any - type UserOptions = any +// type UserOptions = any - type WindiPluginUtilsOptions = any +// type WindiPluginUtilsOptions = any - export default result +// export default result - export { UserOptions, WindiPluginUtilsOptions } -} +// export { UserOptions, WindiPluginUtilsOptions } +// } diff --git a/packages/theme/package.json b/packages/theme/package.json index 23348b79..68606795 100644 --- a/packages/theme/package.json +++ b/packages/theme/package.json @@ -39,6 +39,7 @@ "@vuepress-plume/vuepress-plugin-blog-data": "workspace:*", "@vuepress-plume/vuepress-plugin-caniuse": "workspace:*", "@vuepress-plume/vuepress-plugin-copy-code": "workspace:*", + "@vuepress-plume/vuepress-plugin-windicss": "workspace:*", "@vuepress/client": "2.0.0-beta.51", "@vuepress/core": "2.0.0-beta.51", "@vuepress/plugin-active-header-links": "2.0.0-beta.51", @@ -55,6 +56,7 @@ "@vuepress/plugin-toc": "2.0.0-beta.51", "@vuepress/shared": "2.0.0-beta.51", "@vuepress/utils": "2.0.0-beta.51", + "@vueuse/core": "^9.3.0", "date-fns": "^2.29.3", "nanoid": "^4.0.0", "ts-debounce": "^4.0.0", @@ -63,6 +65,7 @@ "vuepress-plugin-comment2": "2.0.0-beta.110", "vuepress-plugin-md-enhance": "2.0.0-beta.110", "vuepress-plugin-seo2": "2.0.0-beta.110", - "vuepress-plugin-sitemap2": "2.0.0-beta.110" + "vuepress-plugin-sitemap2": "2.0.0-beta.110", + "windicss": "^3.5.6" } } diff --git a/packages/theme/src/client/components/Navbar/index.vue b/packages/theme/src/client/components/Navbar/index.vue new file mode 100644 index 00000000..6f0ce0e1 --- /dev/null +++ b/packages/theme/src/client/components/Navbar/index.vue @@ -0,0 +1,4 @@ + + diff --git a/packages/theme/src/client/composables/index.ts b/packages/theme/src/client/composables/index.ts new file mode 100644 index 00000000..7021f731 --- /dev/null +++ b/packages/theme/src/client/composables/index.ts @@ -0,0 +1,4 @@ +export * from './useDarkMode.js' +export * from './useScrollPromise.js' +export * from './useThemeData.js' +export * from './useResolveRouteWithRedirect.js' diff --git a/packages/theme/src/client/composables/useDarkMode.ts b/packages/theme/src/client/composables/useDarkMode.ts new file mode 100644 index 00000000..97d049fe --- /dev/null +++ b/packages/theme/src/client/composables/useDarkMode.ts @@ -0,0 +1,72 @@ +import { usePreferredDark, useStorage } from '@vueuse/core' +import { computed, inject, onMounted, onUnmounted, provide, watch } from 'vue' +import type { InjectionKey, WritableComputedRef } from 'vue' +import { useThemeLocaleData } from './useThemeData.js' + +export type DarkModeRef = WritableComputedRef + +export const darkModeSymbol: InjectionKey = Symbol( + __VUEPRESS_DEV__ ? 'darkMode' : '' +) + +/** + * Inject dark mode global computed + */ +export const useDarkMode = (): DarkModeRef => { + const isDarkMode = inject(darkModeSymbol) + if (!isDarkMode) { + throw new Error('useDarkMode() is called without provider.') + } + return isDarkMode +} + +/** + * Create dark mode ref and provide as global computed in setup + */ +export const setupDarkMode = (): void => { + const themeLocale = useThemeLocaleData() + const isDarkPreferred = usePreferredDark() + const darkStorage = useStorage( + 'vuepress-color-scheme', + themeLocale.value.colorMode + ) + + const isDarkMode = computed({ + get() { + // disable color mode switching + if (!themeLocale.value.colorModeSwitch) { + return themeLocale.value.colorMode === 'dark' + } + // auto detected from prefers-color-scheme + if (darkStorage.value === 'auto') { + return isDarkPreferred.value + } + // storage value + return darkStorage.value === 'dark' + }, + set(val) { + if (val === isDarkPreferred.value) { + darkStorage.value = 'auto' + } else { + darkStorage.value = val ? 'dark' : 'light' + } + }, + }) + provide(darkModeSymbol, isDarkMode) + + updateHtmlDarkClass(isDarkMode) +} + +export const updateHtmlDarkClass = (isDarkMode: DarkModeRef): void => { + const update = (value = isDarkMode.value): void => { + // set `class="dark"` on `` element + const htmlEl = window?.document.querySelector('html') + htmlEl?.classList.toggle('dark', value) + } + + onMounted(() => { + watch(isDarkMode, update, { immediate: true }) + }) + + onUnmounted(() => update()) +} diff --git a/packages/theme/src/client/composables/useResolveRouteWithRedirect.ts b/packages/theme/src/client/composables/useResolveRouteWithRedirect.ts new file mode 100644 index 00000000..297b0e95 --- /dev/null +++ b/packages/theme/src/client/composables/useResolveRouteWithRedirect.ts @@ -0,0 +1,28 @@ +import { isFunction, isString } from '@vuepress/shared' +import { useRouter } from 'vue-router' +import type { Router } from 'vue-router' + +/** + * Resolve a route with redirection + */ +export const useResolveRouteWithRedirect = ( + ...args: Parameters +): ReturnType => { + const router = useRouter() + const route = router.resolve(...args) + const lastMatched = route.matched[route.matched.length - 1] + if (!lastMatched?.redirect) { + return route + } + const { redirect } = lastMatched + const resolvedRedirect = isFunction(redirect) ? redirect(route) : redirect + const resolvedRedirectObj = isString(resolvedRedirect) + ? { path: resolvedRedirect } + : resolvedRedirect + return useResolveRouteWithRedirect({ + hash: route.hash, + query: route.query, + params: route.params, + ...resolvedRedirectObj, + }) +} diff --git a/packages/theme/src/client/composables/useScrollPromise.ts b/packages/theme/src/client/composables/useScrollPromise.ts new file mode 100644 index 00000000..0405f8c7 --- /dev/null +++ b/packages/theme/src/client/composables/useScrollPromise.ts @@ -0,0 +1,22 @@ +export interface ScrollPromise { + wait(): Promise | null + pending: () => void + resolve: () => void +} + +let promise: Promise | null = null +let promiseResolve: (() => void) | null = null + +const scrollPromise: ScrollPromise = { + wait: () => promise, + pending: () => { + promise = new Promise((resolve) => (promiseResolve = resolve)) + }, + resolve: () => { + promiseResolve?.() + promise = null + promiseResolve = null + }, +} + +export const useScrollPromise = (): ScrollPromise => scrollPromise diff --git a/packages/theme/src/client/composables/useThemeData.ts b/packages/theme/src/client/composables/useThemeData.ts new file mode 100644 index 00000000..59e41440 --- /dev/null +++ b/packages/theme/src/client/composables/useThemeData.ts @@ -0,0 +1,14 @@ +import { + useThemeData as _useThemeData, + useThemeLocaleData as _useThemeLocaleData, +} from '@vuepress/plugin-theme-data/client' +import type { + ThemeDataRef, + ThemeLocaleDataRef, +} from '@vuepress/plugin-theme-data/client' +import type { PlumeThemeData } from '../../shared/index.js' + +export const useThemeData = (): ThemeDataRef => + _useThemeData() +export const useThemeLocaleData = (): ThemeLocaleDataRef => + _useThemeLocaleData() diff --git a/packages/theme/src/client/config.ts b/packages/theme/src/client/config.ts index dc4e4d21..a3fc2b3e 100644 --- a/packages/theme/src/client/config.ts +++ b/packages/theme/src/client/config.ts @@ -1,8 +1,14 @@ import { defineClientConfig } from '@vuepress/client' +import { setupDarkMode } from './composables/index.js' import Layout from './layouts/Layout.vue' import NotFound from './layouts/NotFound.vue' +import './styles/index.scss' + export default defineClientConfig({ + setup() { + setupDarkMode() + }, layouts: { Layout, NotFound, diff --git a/packages/theme/src/client/layouts/Layout.vue b/packages/theme/src/client/layouts/Layout.vue index 167e2c32..4fb39628 100644 --- a/packages/theme/src/client/layouts/Layout.vue +++ b/packages/theme/src/client/layouts/Layout.vue @@ -1,3 +1,14 @@ + diff --git a/packages/theme/src/client/styles/index.scss b/packages/theme/src/client/styles/index.scss new file mode 100644 index 00000000..e69de29b diff --git a/packages/theme/src/client/windi.config.ts b/packages/theme/src/client/windi.config.ts new file mode 100644 index 00000000..58a7b703 --- /dev/null +++ b/packages/theme/src/client/windi.config.ts @@ -0,0 +1,73 @@ +import { getDirname, path } from '@vuepress/utils' +import { defineConfig } from 'windicss/helpers' +import typography from 'windicss/plugin/typography' + +const __dirname = getDirname(import.meta.url) + +export default defineConfig({ + darkMode: 'class', + // attributify: true, + plugins: [(typography as any)()], + theme: { + extend: { + textColor: '#2c3e50', + fontFamily: { + sans: [ + 'ui-sans-serif', + '-apple-system', + 'BlinkMackSystemFont', + '"Segoe UI"', + 'Roboto', + 'Oxygen', + 'Ubuntu', + 'Cantarell', + '"Fira Sans"', + '"Droid Sans"', + '"Helvetica Neue"', + 'sans-serif', + '"Apple Color Emoji"', + '"Segoe UI Emoji"', + '"Segoe UI Symbol"', + '"Noto Color Emoji"', + ], + mono: [ + 'Consolas', + 'Monaco', + 'ui-monospace', + 'SFMono-Regular', + 'Menlo', + '"Andale Mono"', + '"Ubuntu Mono"', + 'monospace', + ], + }, + typography: { + DEFAULT: { + css: { + color: '#2c3e50', + a: { + color: 'red', + }, + h1: { color: 'inherit' }, + h2: { color: 'inherit' }, + h3: { color: 'inherit' }, + h4: { color: 'inherit' }, + h5: { color: 'inherit' }, + h6: { color: 'inherit' }, + b: { color: 'inherit' }, + em: { color: 'inherit' }, + strong: { color: 'inherit' }, + blockquote: { color: 'inherit' }, + }, + }, + }, + }, + }, + extract: { + include: [ + path.resolve(__dirname, '{components,layouts}/**/*'), + path.resolve(process.cwd(), '**/.vuepress/{components,layouts}/*'), + path.resolve(process.cwd(), '**/*.md'), + ], + }, +}) diff --git a/packages/theme/src/node/plugins.ts b/packages/theme/src/node/plugins.ts index 4ce3adb9..dcdcf661 100644 --- a/packages/theme/src/node/plugins.ts +++ b/packages/theme/src/node/plugins.ts @@ -3,6 +3,7 @@ import { baiduTongjiPlugin } from '@vuepress-plume/vuepress-plugin-baidu-tongji' import { blogDataPlugin } from '@vuepress-plume/vuepress-plugin-blog-data' import { caniusePlugin } from '@vuepress-plume/vuepress-plugin-caniuse' import { copyCodePlugin } from '@vuepress-plume/vuepress-plugin-copy-code' +import { windiCSSPlugin } from '@vuepress-plume/vuepress-plugin-windicss' import type { App, PluginConfig } from '@vuepress/core' import { activeHeaderLinksPlugin } from '@vuepress/plugin-active-header-links' import { docsearchPlugin } from '@vuepress/plugin-docsearch' @@ -14,6 +15,7 @@ import { palettePlugin } from '@vuepress/plugin-palette' import { prismjsPlugin } from '@vuepress/plugin-prismjs' import { searchPlugin } from '@vuepress/plugin-search' import { themeDataPlugin } from '@vuepress/plugin-theme-data' +import { getDirname, path } from '@vuepress/utils' import { commentPlugin } from 'vuepress-plugin-comment2' import { mdEnhancePlugin } from 'vuepress-plugin-md-enhance' import { seoPlugin } from 'vuepress-plugin-seo2' @@ -24,6 +26,8 @@ import type { } from '../shared/index.js' import autoFrontmatter from './autoFrontmatter.js' +const __dirname = getDirname(import.meta.url) + export const setupPlugins = ( app: App, options: PlumeThemePluginOptions, @@ -33,6 +37,7 @@ export const setupPlugins = ( return [ palettePlugin({ preset: 'sass' }), + windiCSSPlugin(path.resolve(__dirname, '../client/windi.config.js')), themeDataPlugin({ themeData: localeOptions }), autoFrontmatterPlugin(autoFrontmatter(app, localeOptions)), blogDataPlugin({ diff --git a/packages/theme/src/shared/options/index.ts b/packages/theme/src/shared/options/index.ts index 940940d0..588243bc 100644 --- a/packages/theme/src/shared/options/index.ts +++ b/packages/theme/src/shared/options/index.ts @@ -7,6 +7,42 @@ export interface PlumeThemeOptions extends PlumeThemeLocaleOptions { * 对主题内部使用的插件进行配置 */ themePlugins?: PlumeThemePluginOptions + + /** + * 是否仅使用博客功能 + * + * @default false + */ + onlyBlog?: boolean + + blog?: { + /** + * blog 文章读取目录 + * + * @default './' 即 vuepress 配置的 source 目录 + */ + dir?: string + + /** + * 在 `blog.dir` 目录中,通过 glob string 配置包含文件 + * + * @default - ['**\*.md'] + */ + include?: string[] + + /** + * 在 `blog.dir` 目录中,通过 glob string 配置排除的文件 + * + * _README.md 文件一般作为主页或者某个目录下的主页,不应该被读取为 blog文章_ + * + * @default - ['.vuepress/', 'node_modules/', '{README,index}.md'] + */ + exclude?: string[] + } + + notes?: { + dir?: string + } } export type PlumeThemeLocaleOptions = PlumeThemeData diff --git a/packages/theme/src/shared/options/locale.ts b/packages/theme/src/shared/options/locale.ts index 2132ecfb..dba9f9f7 100644 --- a/packages/theme/src/shared/options/locale.ts +++ b/packages/theme/src/shared/options/locale.ts @@ -71,9 +71,11 @@ export interface PlumeThemeLocaleData extends LocaleData { */ logoDark?: string /** - * 是否启用深色模式 + * 是否启用深色模式切换按钮 */ - darkMode?: boolean + colorModeSwitch?: boolean + + colorMode?: 'auto' | 'light' | 'dark' toggleDarkMode?: string diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 58a1d7e4..9efacbd0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -33,6 +33,7 @@ importers: sort-package-json: ^2.0.0 taze: ^0.8.2 ts-node: ^10.9.1 + tsconfig-vuepress: ^4.0.0 typescript: ^4.8.4 vite: ^3.1.8 devDependencies: @@ -65,6 +66,7 @@ importers: sort-package-json: 2.0.0 taze: 0.8.2 ts-node: 10.9.1_5ra3kupzwcghzakkfdrtyjk72u + tsconfig-vuepress: 4.0.0 typescript: 4.8.4 vite: 3.1.8 @@ -255,6 +257,7 @@ importers: '@vuepress-plume/vuepress-plugin-blog-data': workspace:* '@vuepress-plume/vuepress-plugin-caniuse': workspace:* '@vuepress-plume/vuepress-plugin-copy-code': workspace:* + '@vuepress-plume/vuepress-plugin-windicss': workspace:* '@vuepress/client': 2.0.0-beta.51 '@vuepress/core': 2.0.0-beta.51 '@vuepress/plugin-active-header-links': 2.0.0-beta.51 @@ -271,6 +274,7 @@ importers: '@vuepress/plugin-toc': 2.0.0-beta.51 '@vuepress/shared': 2.0.0-beta.51 '@vuepress/utils': 2.0.0-beta.51 + '@vueuse/core': ^9.3.0 date-fns: ^2.29.3 nanoid: ^4.0.0 ts-debounce: ^4.0.0 @@ -280,6 +284,7 @@ importers: vuepress-plugin-md-enhance: 2.0.0-beta.110 vuepress-plugin-seo2: 2.0.0-beta.110 vuepress-plugin-sitemap2: 2.0.0-beta.110 + windicss: ^3.5.6 dependencies: '@types/lodash.merge': 4.6.7 '@vuepress-plume/vuepress-plugin-auto-frontmatter': link:../plugin-auto-frontmatter @@ -287,6 +292,7 @@ importers: '@vuepress-plume/vuepress-plugin-blog-data': link:../plugin-blog-data '@vuepress-plume/vuepress-plugin-caniuse': link:../plugin-caniuse '@vuepress-plume/vuepress-plugin-copy-code': link:../plugin-copy-code + '@vuepress-plume/vuepress-plugin-windicss': link:../plugin-windicss '@vuepress/client': 2.0.0-beta.51 '@vuepress/core': 2.0.0-beta.51 '@vuepress/plugin-active-header-links': 2.0.0-beta.51 @@ -303,6 +309,7 @@ importers: '@vuepress/plugin-toc': 2.0.0-beta.51 '@vuepress/shared': 2.0.0-beta.51 '@vuepress/utils': 2.0.0-beta.51 + '@vueuse/core': 9.3.0_vue@3.2.41 date-fns: 2.29.3 nanoid: 4.0.0 ts-debounce: 4.0.0 @@ -312,6 +319,7 @@ importers: vuepress-plugin-md-enhance: 2.0.0-beta.110 vuepress-plugin-seo2: 2.0.0-beta.110 vuepress-plugin-sitemap2: 2.0.0-beta.110 + windicss: 3.5.6 packages/theme-back: specifiers: @@ -14322,6 +14330,10 @@ packages: strip-bom: 3.0.0 dev: true + /tsconfig-vuepress/4.0.0: + resolution: {integrity: sha512-bhujOtmpGdclg92bBrc+Y4L+emxN7jldlmogfT0ks9TmBzcEmzCAiphYRZ+J4idyDyLL+O7Kd9w4nOkUFtOoZA==} + dev: true + /tslib/1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} diff --git a/tsconfig.base.json b/tsconfig.base.json index 8ecec5a4..7dbe13db 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -1,47 +1,13 @@ { + "extends": "tsconfig-vuepress/base.json", "compilerOptions": { - "composite": true, "allowSyntheticDefaultImports": true, "lib": ["DOM", "ES2020"], - "module": "esnext", + "module": "ESNext", "moduleResolution": "NodeNext", "noEmitOnError": true, - "esModuleInterop": true, + "noImplicitAny": false, "skipLibCheck": true, - "target": "ES2020", - "allowJs": false, - "allowUmdGlobalAccess": false, - "allowUnreachableCode": false, - "allowUnusedLabels": false, - "alwaysStrict": true, - "checkJs": false, - "declaration": true, - "declarationMap": false, - "exactOptionalPropertyTypes": false, - "forceConsistentCasingInFileNames": true, - "importsNotUsedAsValues": "error", - "newLine": "lf", - "noFallthroughCasesInSwitch": false, - "noImplicitAny": true, - "noImplicitOverride": true, - "noImplicitReturns": true, - "noImplicitThis": true, - "noImplicitUseStrict": false, - "noPropertyAccessFromIndexSignature": false, - "noStrictGenericChecks": false, - "noUncheckedIndexedAccess": false, - "noUnusedLocals": false, - "noUnusedParameters": false, - "preserveValueImports": false, - "removeComments": false, - "resolveJsonModule": true, - "sourceMap": false, - "strict": true, - "strictBindCallApply": true, - "strictFunctionTypes": true, - "strictNullChecks": true, - "strictPropertyInitialization": true, - "stripInternal": true, - "useUnknownInCatchVariables": true + "target": "ES2020" } } From 1d4814abe58f16e99139bd942c9361bc8d911545 Mon Sep 17 00:00:00 2001 From: pengzhanbo Date: Tue, 22 Nov 2022 00:43:02 +0800 Subject: [PATCH 03/29] build: update tsconfig --- packages/tsconfig.build.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/tsconfig.build.json b/packages/tsconfig.build.json index 39125966..11966cdf 100644 --- a/packages/tsconfig.build.json +++ b/packages/tsconfig.build.json @@ -10,6 +10,7 @@ { "path": "./plugin-copy-code/tsconfig.build.json" }, { "path": "./plugin-netlify-functions/tsconfig.build.json" }, { "path": "./plugin-page-collection/tsconfig.build.json" }, - { "path": "./plugin-windicss/tsconfig.build.json" } + { "path": "./plugin-windicss/tsconfig.build.json" }, + { "path": "./plugin-blog-data/tsconfig.build.json" } ] } From 55af9ac332cc0017f2edd35ec28f66cc674ef3a2 Mon Sep 17 00:00:00 2001 From: pengzhanbo Date: Fri, 30 Dec 2022 01:15:46 +0800 Subject: [PATCH 04/29] build: update deps --- docs/package.json | 18 +- package.json | 39 +- packages/plugin-auto-frontmatter/package.json | 6 +- packages/plugin-baidu-tongji/package.json | 8 +- packages/plugin-blog-data/package.json | 10 +- .../plugin-blog-data/src/client/config.ts | 2 + packages/plugin-caniuse/package.json | 8 +- packages/plugin-copy-code/package.json | 12 +- .../plugin-netlify-functions/package.json | 14 +- packages/plugin-notes-data/package.json | 1 + packages/plugin-page-collection/package.json | 14 +- packages/plugin-windicss/package.json | 12 +- packages/theme/package.json | 46 +- pnpm-lock.yaml | 5066 +++++++++-------- scripts/autoInstall.js | 2 +- tsconfig.json | 3 - 16 files changed, 2922 insertions(+), 2339 deletions(-) create mode 100644 packages/plugin-notes-data/package.json diff --git a/docs/package.json b/docs/package.json index ccc13643..a7b1f29c 100644 --- a/docs/package.json +++ b/docs/package.json @@ -10,15 +10,15 @@ }, "dependencies": { "@vuepress-plume/vuepress-theme-plume": "workspace:*", - "@vuepress/bundler-vite": "2.0.0-beta.51", - "@vuepress/bundler-webpack": "2.0.0-beta.51", - "@vuepress/cli": "2.0.0-beta.51", - "@vuepress/client": "2.0.0-beta.51", - "@vuepress/utils": "2.0.0-beta.51", + "@vuepress/bundler-vite": "2.0.0-beta.60", + "@vuepress/bundler-webpack": "2.0.0-beta.60", + "@vuepress/cli": "2.0.0-beta.60", + "@vuepress/client": "2.0.0-beta.60", + "@vuepress/utils": "2.0.0-beta.60", "anywhere": "^1.6.0", - "leancloud-storage": "^4.13.2", - "sass": "^1.55.0", - "sass-loader": "^13.1.0", - "vue": "^3.2.41" + "leancloud-storage": "^4.14.0", + "sass": "^1.57.1", + "sass-loader": "^13.2.0", + "vue": "^3.2.45" } } diff --git a/package.json b/package.json index 305d3c75..8046853c 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,8 @@ "release:changelog": "conventional-changelog -p angular -i CHANGELOG.md -s", "release:check": "pnpm lint && pnpm build", "release:publish": "pnpm -r publish", - "release:version": "bumpp package.json packages/*/package.json --execute=\"pnpm release:changelog\" --commit \"build: publish v%s\" --all --tag --push" + "release:version": "bumpp package.json packages/*/package.json --execute=\"pnpm release:changelog\" --commit \"build: publish v%s\" --all --tag --push", + "up": "taze -r major" }, "lint-staged": { "*.{js,ts,vue}": "eslint --fix", @@ -47,38 +48,38 @@ }, "prettier": "prettier-config-vuepress", "devDependencies": { - "@commitlint/cli": "^17.1.2", - "@commitlint/config-conventional": "^17.1.0", + "@commitlint/cli": "^17.3.0", + "@commitlint/config-conventional": "^17.3.0", "@types/minimist": "^1.2.2", - "@types/node": "18.8.0", + "@types/node": "18.11.18", "@types/webpack-env": "^1.18.0", "bumpp": "^8.2.1", - "chalk": "^5.1.2", - "commitizen": "^4.2.5", - "concurrently": "^7.4.0", + "chalk": "^5.2.0", + "commitizen": "^4.2.6", + "concurrently": "^7.6.0", "conventional-changelog-cli": "^2.2.2", "cpx2": "^4.2.0", "cross-env": "^7.0.3", "cz-conventional-changelog": "^3.3.0", - "eslint": "^8.25.0", - "eslint-config-vuepress": "^4.0.3", - "eslint-config-vuepress-typescript": "^4.0.3", + "eslint": "^8.30.0", + "eslint-config-vuepress": "^4.0.4", + "eslint-config-vuepress-typescript": "^4.0.4", "execa": "^6.1.0", "handlebars": "^4.7.7", - "husky": "^8.0.1", - "lint-staged": "^13.0.3", + "husky": "^8.0.2", + "lint-staged": "^13.1.0", "minimist": "^1.2.7", "ora": "^6.1.2", - "pnpm": "^7.13.4", - "prettier": "^2.7.1", + "pnpm": "^7.21.0", + "prettier": "^2.8.1", "prettier-config-vuepress": "^4.0.0", "rimraf": "^3.0.2", - "sort-package-json": "^2.0.0", - "taze": "^0.8.2", + "sort-package-json": "^2.1.0", + "taze": "^0.8.5", "ts-node": "^10.9.1", - "tsconfig-vuepress": "^4.0.0", - "typescript": "^4.8.4", - "vite": "^3.1.8" + "tsconfig-vuepress": "^4.0.4", + "typescript": "^4.9.4", + "vite": "^4.0.3" }, "packageManager": "pnpm@7.13.4", "engines": { diff --git a/packages/plugin-auto-frontmatter/package.json b/packages/plugin-auto-frontmatter/package.json index 701b3553..07514ce8 100644 --- a/packages/plugin-auto-frontmatter/package.json +++ b/packages/plugin-auto-frontmatter/package.json @@ -29,9 +29,9 @@ "ts": "tsc -b tsconfig.build.json" }, "dependencies": { - "@vuepress/core": "2.0.0-beta.51", - "@vuepress/shared": "2.0.0-beta.51", - "@vuepress/utils": "2.0.0-beta.51", + "@vuepress/core": "2.0.0-beta.60", + "@vuepress/shared": "2.0.0-beta.60", + "@vuepress/utils": "2.0.0-beta.60", "chokidar": "^3.5.3", "glob-to-regexp": "^0.4.1", "gray-matter": "^4.0.3" diff --git a/packages/plugin-baidu-tongji/package.json b/packages/plugin-baidu-tongji/package.json index 4e06bdb8..8bf2e03e 100644 --- a/packages/plugin-baidu-tongji/package.json +++ b/packages/plugin-baidu-tongji/package.json @@ -29,10 +29,10 @@ "ts": "tsc -b tsconfig.build.json" }, "dependencies": { - "@vuepress/client": "2.0.0-beta.51", - "@vuepress/core": "2.0.0-beta.51", - "@vuepress/shared": "2.0.0-beta.51", - "@vuepress/utils": "2.0.0-beta.51" + "@vuepress/client": "2.0.0-beta.60", + "@vuepress/core": "2.0.0-beta.60", + "@vuepress/shared": "2.0.0-beta.60", + "@vuepress/utils": "2.0.0-beta.60" }, "publishConfig": { "access": "public" diff --git a/packages/plugin-blog-data/package.json b/packages/plugin-blog-data/package.json index 23b34a3d..460fcb6a 100644 --- a/packages/plugin-blog-data/package.json +++ b/packages/plugin-blog-data/package.json @@ -31,13 +31,13 @@ }, "dependencies": { "@vue/devtools-api": "^6.4.5", - "@vuepress/client": "2.0.0-beta.51", - "@vuepress/core": "2.0.0-beta.51", - "@vuepress/shared": "2.0.0-beta.51", - "@vuepress/utils": "2.0.0-beta.51", + "@vuepress/client": "2.0.0-beta.60", + "@vuepress/core": "2.0.0-beta.60", + "@vuepress/shared": "2.0.0-beta.60", + "@vuepress/utils": "2.0.0-beta.60", "chokidar": "^3.5.3", "glob-to-regexp": "^0.4.1", - "vue": "^3.2.41" + "vue": "^3.2.45" }, "publishConfig": { "access": "public" diff --git a/packages/plugin-blog-data/src/client/config.ts b/packages/plugin-blog-data/src/client/config.ts index 97d99d32..162c3523 100644 --- a/packages/plugin-blog-data/src/client/config.ts +++ b/packages/plugin-blog-data/src/client/config.ts @@ -2,6 +2,8 @@ import { setupDevtoolsPlugin } from '@vue/devtools-api' import { defineClientConfig } from '@vuepress/client' import { useBlogPostData } from './composables/index.js' +declare const __VUE_PROD_DEVTOOLS__: boolean + export default defineClientConfig({ enhance({ app }) { const blogPostData = useBlogPostData() diff --git a/packages/plugin-caniuse/package.json b/packages/plugin-caniuse/package.json index 15fe09cd..2e2cedbf 100644 --- a/packages/plugin-caniuse/package.json +++ b/packages/plugin-caniuse/package.json @@ -37,10 +37,10 @@ }, "dependencies": { "@types/markdown-it": "^12.2.3", - "@vuepress/cli": "2.0.0-beta.51", - "@vuepress/client": "2.0.0-beta.51", - "@vuepress/core": "2.0.0-beta.51", - "@vuepress/utils": "2.0.0-beta.51", + "@vuepress/cli": "2.0.0-beta.60", + "@vuepress/client": "2.0.0-beta.60", + "@vuepress/core": "2.0.0-beta.60", + "@vuepress/utils": "2.0.0-beta.60", "markdown-it-container": "^3.0.0" }, "publishConfig": { diff --git a/packages/plugin-copy-code/package.json b/packages/plugin-copy-code/package.json index 33b85bda..6a97f7f0 100644 --- a/packages/plugin-copy-code/package.json +++ b/packages/plugin-copy-code/package.json @@ -30,12 +30,12 @@ "ts": "tsc -b tsconfig.build.json" }, "dependencies": { - "@vuepress/client": "2.0.0-beta.51", - "@vuepress/core": "2.0.0-beta.51", - "@vuepress/shared": "2.0.0-beta.51", - "@vuepress/utils": "2.0.0-beta.51", - "vue": "^3.2.41", - "vue-router": "4.1.5" + "@vuepress/client": "2.0.0-beta.60", + "@vuepress/core": "2.0.0-beta.60", + "@vuepress/shared": "2.0.0-beta.60", + "@vuepress/utils": "2.0.0-beta.60", + "vue": "^3.2.45", + "vue-router": "4.1.6" }, "publishConfig": { "access": "public" diff --git a/packages/plugin-netlify-functions/package.json b/packages/plugin-netlify-functions/package.json index 86cd3110..d680670a 100644 --- a/packages/plugin-netlify-functions/package.json +++ b/packages/plugin-netlify-functions/package.json @@ -39,20 +39,20 @@ "dependencies": { "@iarna/toml": "^2.2.5", "@netlify/functions": "^1.3.0", - "@vuepress/core": "2.0.0-beta.51", - "@vuepress/shared": "2.0.0-beta.51", - "@vuepress/utils": "2.0.0-beta.51", - "chalk": "^5.1.2", + "@vuepress/core": "2.0.0-beta.60", + "@vuepress/shared": "2.0.0-beta.60", + "@vuepress/utils": "2.0.0-beta.60", + "chalk": "^5.2.0", "chokidar": "^3.5.3", "cpx2": "^4.2.0", "dotenv": "^16.0.3", - "esbuild": "^0.15.11", + "esbuild": "^0.16.12", "execa": "^6.1.0", - "netlify-cli": "^12.0.9", + "netlify-cli": "^12.5.0", "portfinder": "^1.0.32" }, "devDependencies": { - "@types/node": "^18.8.5" + "@types/node": "^18.11.18" }, "publishConfig": { "access": "public" diff --git a/packages/plugin-notes-data/package.json b/packages/plugin-notes-data/package.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/packages/plugin-notes-data/package.json @@ -0,0 +1 @@ +{} diff --git a/packages/plugin-page-collection/package.json b/packages/plugin-page-collection/package.json index 84b7c04a..2e2ced07 100644 --- a/packages/plugin-page-collection/package.json +++ b/packages/plugin-page-collection/package.json @@ -33,13 +33,13 @@ "dependencies": { "@netlify/functions": "^1.3.0", "@vuepress-plume/vuepress-plugin-netlify-functions": "workspace:*", - "@vuepress/client": "2.0.0-beta.51", - "@vuepress/core": "2.0.0-beta.51", - "@vuepress/shared": "2.0.0-beta.51", - "@vuepress/utils": "2.0.0-beta.51", - "leancloud-storage": "^4.13.2", - "vue": "^3.2.41", - "vue-router": "4.1.5" + "@vuepress/client": "2.0.0-beta.60", + "@vuepress/core": "2.0.0-beta.60", + "@vuepress/shared": "2.0.0-beta.60", + "@vuepress/utils": "2.0.0-beta.60", + "leancloud-storage": "^4.14.0", + "vue": "^3.2.45", + "vue-router": "4.1.6" }, "publishConfig": { "access": "public" diff --git a/packages/plugin-windicss/package.json b/packages/plugin-windicss/package.json index e2082c37..33ff7d2c 100644 --- a/packages/plugin-windicss/package.json +++ b/packages/plugin-windicss/package.json @@ -29,13 +29,13 @@ "ts": "tsc -b tsconfig.build.json" }, "dependencies": { - "@vuepress/client": "2.0.0-beta.51", - "@vuepress/core": "2.0.0-beta.51", - "@vuepress/shared": "2.0.0-beta.51", - "@vuepress/utils": "2.0.0-beta.51", - "vite-plugin-windicss": "^1.8.8", + "@vuepress/client": "2.0.0-beta.60", + "@vuepress/core": "2.0.0-beta.60", + "@vuepress/shared": "2.0.0-beta.60", + "@vuepress/utils": "2.0.0-beta.60", + "vite-plugin-windicss": "^1.8.10", "windicss": "^3.5.6", - "windicss-webpack-plugin": "^1.7.6" + "windicss-webpack-plugin": "^1.7.7" }, "publishConfig": { "access": "public" diff --git a/packages/theme/package.json b/packages/theme/package.json index 68606795..e733b31f 100644 --- a/packages/theme/package.json +++ b/packages/theme/package.json @@ -40,32 +40,32 @@ "@vuepress-plume/vuepress-plugin-caniuse": "workspace:*", "@vuepress-plume/vuepress-plugin-copy-code": "workspace:*", "@vuepress-plume/vuepress-plugin-windicss": "workspace:*", - "@vuepress/client": "2.0.0-beta.51", - "@vuepress/core": "2.0.0-beta.51", - "@vuepress/plugin-active-header-links": "2.0.0-beta.51", - "@vuepress/plugin-container": "2.0.0-beta.51", - "@vuepress/plugin-docsearch": "2.0.0-beta.51", - "@vuepress/plugin-external-link-icon": "2.0.0-beta.51", - "@vuepress/plugin-git": "2.0.0-beta.51", - "@vuepress/plugin-medium-zoom": "2.0.0-beta.51", - "@vuepress/plugin-nprogress": "2.0.0-beta.51", - "@vuepress/plugin-palette": "2.0.0-beta.51", - "@vuepress/plugin-prismjs": "2.0.0-beta.51", - "@vuepress/plugin-search": "2.0.0-beta.51", - "@vuepress/plugin-theme-data": "2.0.0-beta.51", - "@vuepress/plugin-toc": "2.0.0-beta.51", - "@vuepress/shared": "2.0.0-beta.51", - "@vuepress/utils": "2.0.0-beta.51", - "@vueuse/core": "^9.3.0", + "@vuepress/client": "2.0.0-beta.60", + "@vuepress/core": "2.0.0-beta.60", + "@vuepress/plugin-active-header-links": "2.0.0-beta.60", + "@vuepress/plugin-container": "2.0.0-beta.60", + "@vuepress/plugin-docsearch": "2.0.0-beta.60", + "@vuepress/plugin-external-link-icon": "2.0.0-beta.60", + "@vuepress/plugin-git": "2.0.0-beta.60", + "@vuepress/plugin-medium-zoom": "2.0.0-beta.60", + "@vuepress/plugin-nprogress": "2.0.0-beta.60", + "@vuepress/plugin-palette": "2.0.0-beta.60", + "@vuepress/plugin-prismjs": "2.0.0-beta.60", + "@vuepress/plugin-search": "2.0.0-beta.60", + "@vuepress/plugin-theme-data": "2.0.0-beta.60", + "@vuepress/plugin-toc": "2.0.0-beta.60", + "@vuepress/shared": "2.0.0-beta.60", + "@vuepress/utils": "2.0.0-beta.60", + "@vueuse/core": "^9.9.0", "date-fns": "^2.29.3", "nanoid": "^4.0.0", "ts-debounce": "^4.0.0", - "vue": "^3.2.41", - "vue-router": "4.1.5", - "vuepress-plugin-comment2": "2.0.0-beta.110", - "vuepress-plugin-md-enhance": "2.0.0-beta.110", - "vuepress-plugin-seo2": "2.0.0-beta.110", - "vuepress-plugin-sitemap2": "2.0.0-beta.110", + "vue": "^3.2.45", + "vue-router": "4.1.6", + "vuepress-plugin-comment2": "2.0.0-beta.146", + "vuepress-plugin-md-enhance": "2.0.0-beta.146", + "vuepress-plugin-seo2": "2.0.0-beta.146", + "vuepress-plugin-sitemap2": "2.0.0-beta.146", "windicss": "^3.5.6" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9efacbd0..f08b1d0d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,250 +4,250 @@ importers: .: specifiers: - '@commitlint/cli': ^17.1.2 - '@commitlint/config-conventional': ^17.1.0 + '@commitlint/cli': ^17.3.0 + '@commitlint/config-conventional': ^17.3.0 '@types/minimist': ^1.2.2 - '@types/node': 18.8.0 + '@types/node': 18.11.18 '@types/webpack-env': ^1.18.0 bumpp: ^8.2.1 - chalk: ^5.1.2 - commitizen: ^4.2.5 - concurrently: ^7.4.0 + chalk: ^5.2.0 + commitizen: ^4.2.6 + concurrently: ^7.6.0 conventional-changelog-cli: ^2.2.2 cpx2: ^4.2.0 cross-env: ^7.0.3 cz-conventional-changelog: ^3.3.0 - eslint: ^8.25.0 - eslint-config-vuepress: ^4.0.3 - eslint-config-vuepress-typescript: ^4.0.3 + eslint: ^8.30.0 + eslint-config-vuepress: ^4.0.4 + eslint-config-vuepress-typescript: ^4.0.4 execa: ^6.1.0 handlebars: ^4.7.7 - husky: ^8.0.1 - lint-staged: ^13.0.3 + husky: ^8.0.2 + lint-staged: ^13.1.0 minimist: ^1.2.7 ora: ^6.1.2 - pnpm: ^7.13.4 - prettier: ^2.7.1 + pnpm: ^7.21.0 + prettier: ^2.8.1 prettier-config-vuepress: ^4.0.0 rimraf: ^3.0.2 - sort-package-json: ^2.0.0 - taze: ^0.8.2 + sort-package-json: ^2.1.0 + taze: ^0.8.5 ts-node: ^10.9.1 - tsconfig-vuepress: ^4.0.0 - typescript: ^4.8.4 - vite: ^3.1.8 + tsconfig-vuepress: ^4.0.4 + typescript: ^4.9.4 + vite: ^4.0.3 devDependencies: - '@commitlint/cli': 17.1.2 - '@commitlint/config-conventional': 17.1.0 + '@commitlint/cli': 17.3.0 + '@commitlint/config-conventional': 17.3.0 '@types/minimist': 1.2.2 - '@types/node': 18.8.0 + '@types/node': 18.11.18 '@types/webpack-env': 1.18.0 bumpp: 8.2.1 - chalk: 5.1.2 - commitizen: 4.2.5 - concurrently: 7.4.0 + chalk: 5.2.0 + commitizen: 4.2.6 + concurrently: 7.6.0 conventional-changelog-cli: 2.2.2 cpx2: 4.2.0 cross-env: 7.0.3 cz-conventional-changelog: 3.3.0 - eslint: 8.25.0 - eslint-config-vuepress: 4.0.3_37o5dylkwpyxjsfmdan2qconee - eslint-config-vuepress-typescript: 4.0.3_n4625bddo65vrpuc6jvahan7ta + eslint: 8.30.0 + eslint-config-vuepress: 4.0.4_nveednhrtxclom63fsgwztxh4a + eslint-config-vuepress-typescript: 4.0.4_5c545irdft4vuty3gxgtfdqu3e execa: 6.1.0 handlebars: 4.7.7 - husky: 8.0.1 - lint-staged: 13.0.3 + husky: 8.0.2 + lint-staged: 13.1.0 minimist: 1.2.7 ora: 6.1.2 - pnpm: 7.13.4 - prettier: 2.7.1 + pnpm: 7.21.0 + prettier: 2.8.1 prettier-config-vuepress: 4.0.0 rimraf: 3.0.2 - sort-package-json: 2.0.0 - taze: 0.8.2 - ts-node: 10.9.1_5ra3kupzwcghzakkfdrtyjk72u - tsconfig-vuepress: 4.0.0 - typescript: 4.8.4 - vite: 3.1.8 + sort-package-json: 2.1.0 + taze: 0.8.5 + ts-node: 10.9.1_awa2wsr5thmg3i7jqycphctjfq + tsconfig-vuepress: 4.0.4 + typescript: 4.9.4 + vite: 4.0.3_@types+node@18.11.18 docs: specifiers: '@vuepress-plume/vuepress-theme-plume': workspace:* - '@vuepress/bundler-vite': 2.0.0-beta.51 - '@vuepress/bundler-webpack': 2.0.0-beta.51 - '@vuepress/cli': 2.0.0-beta.51 - '@vuepress/client': 2.0.0-beta.51 - '@vuepress/utils': 2.0.0-beta.51 + '@vuepress/bundler-vite': 2.0.0-beta.60 + '@vuepress/bundler-webpack': 2.0.0-beta.60 + '@vuepress/cli': 2.0.0-beta.60 + '@vuepress/client': 2.0.0-beta.60 + '@vuepress/utils': 2.0.0-beta.60 anywhere: ^1.6.0 - leancloud-storage: ^4.13.2 - sass: ^1.55.0 - sass-loader: ^13.1.0 - vue: ^3.2.41 + leancloud-storage: ^4.14.0 + sass: ^1.57.1 + sass-loader: ^13.2.0 + vue: ^3.2.45 dependencies: '@vuepress-plume/vuepress-theme-plume': link:../packages/theme - '@vuepress/bundler-vite': 2.0.0-beta.51_sass@1.55.0 - '@vuepress/bundler-webpack': 2.0.0-beta.51 - '@vuepress/cli': 2.0.0-beta.51 - '@vuepress/client': 2.0.0-beta.51 - '@vuepress/utils': 2.0.0-beta.51 + '@vuepress/bundler-vite': 2.0.0-beta.60_sass@1.57.1 + '@vuepress/bundler-webpack': 2.0.0-beta.60 + '@vuepress/cli': 2.0.0-beta.60 + '@vuepress/client': 2.0.0-beta.60 + '@vuepress/utils': 2.0.0-beta.60 anywhere: 1.6.0 - leancloud-storage: 4.13.2 - sass: 1.55.0 - sass-loader: 13.1.0_sass@1.55.0 - vue: 3.2.41 + leancloud-storage: 4.14.0 + sass: 1.57.1 + sass-loader: 13.2.0_sass@1.57.1 + vue: 3.2.45 packages/plugin-auto-frontmatter: specifiers: - '@vuepress/core': 2.0.0-beta.51 - '@vuepress/shared': 2.0.0-beta.51 - '@vuepress/utils': 2.0.0-beta.51 + '@vuepress/core': 2.0.0-beta.60 + '@vuepress/shared': 2.0.0-beta.60 + '@vuepress/utils': 2.0.0-beta.60 chokidar: ^3.5.3 glob-to-regexp: ^0.4.1 gray-matter: ^4.0.3 dependencies: - '@vuepress/core': 2.0.0-beta.51 - '@vuepress/shared': 2.0.0-beta.51 - '@vuepress/utils': 2.0.0-beta.51 + '@vuepress/core': 2.0.0-beta.60 + '@vuepress/shared': 2.0.0-beta.60 + '@vuepress/utils': 2.0.0-beta.60 chokidar: 3.5.3 glob-to-regexp: 0.4.1 gray-matter: 4.0.3 packages/plugin-baidu-tongji: specifiers: - '@vuepress/client': 2.0.0-beta.51 - '@vuepress/core': 2.0.0-beta.51 - '@vuepress/shared': 2.0.0-beta.51 - '@vuepress/utils': 2.0.0-beta.51 + '@vuepress/client': 2.0.0-beta.60 + '@vuepress/core': 2.0.0-beta.60 + '@vuepress/shared': 2.0.0-beta.60 + '@vuepress/utils': 2.0.0-beta.60 dependencies: - '@vuepress/client': 2.0.0-beta.51 - '@vuepress/core': 2.0.0-beta.51 - '@vuepress/shared': 2.0.0-beta.51 - '@vuepress/utils': 2.0.0-beta.51 + '@vuepress/client': 2.0.0-beta.60 + '@vuepress/core': 2.0.0-beta.60 + '@vuepress/shared': 2.0.0-beta.60 + '@vuepress/utils': 2.0.0-beta.60 packages/plugin-blog-data: specifiers: '@vue/devtools-api': ^6.4.5 - '@vuepress/client': 2.0.0-beta.51 - '@vuepress/core': 2.0.0-beta.51 - '@vuepress/shared': 2.0.0-beta.51 - '@vuepress/utils': 2.0.0-beta.51 + '@vuepress/client': 2.0.0-beta.60 + '@vuepress/core': 2.0.0-beta.60 + '@vuepress/shared': 2.0.0-beta.60 + '@vuepress/utils': 2.0.0-beta.60 chokidar: ^3.5.3 glob-to-regexp: ^0.4.1 - vue: ^3.2.41 + vue: ^3.2.45 dependencies: '@vue/devtools-api': 6.4.5 - '@vuepress/client': 2.0.0-beta.51 - '@vuepress/core': 2.0.0-beta.51 - '@vuepress/shared': 2.0.0-beta.51 - '@vuepress/utils': 2.0.0-beta.51 + '@vuepress/client': 2.0.0-beta.60 + '@vuepress/core': 2.0.0-beta.60 + '@vuepress/shared': 2.0.0-beta.60 + '@vuepress/utils': 2.0.0-beta.60 chokidar: 3.5.3 glob-to-regexp: 0.4.1 - vue: 3.2.41 + vue: 3.2.45 packages/plugin-caniuse: specifiers: '@types/markdown-it': ^12.2.3 - '@vuepress/cli': 2.0.0-beta.51 - '@vuepress/client': 2.0.0-beta.51 - '@vuepress/core': 2.0.0-beta.51 - '@vuepress/utils': 2.0.0-beta.51 + '@vuepress/cli': 2.0.0-beta.60 + '@vuepress/client': 2.0.0-beta.60 + '@vuepress/core': 2.0.0-beta.60 + '@vuepress/utils': 2.0.0-beta.60 markdown-it-container: ^3.0.0 dependencies: '@types/markdown-it': 12.2.3 - '@vuepress/cli': 2.0.0-beta.51 - '@vuepress/client': 2.0.0-beta.51 - '@vuepress/core': 2.0.0-beta.51 - '@vuepress/utils': 2.0.0-beta.51 + '@vuepress/cli': 2.0.0-beta.60 + '@vuepress/client': 2.0.0-beta.60 + '@vuepress/core': 2.0.0-beta.60 + '@vuepress/utils': 2.0.0-beta.60 markdown-it-container: 3.0.0 packages/plugin-copy-code: specifiers: - '@vuepress/client': 2.0.0-beta.51 - '@vuepress/core': 2.0.0-beta.51 - '@vuepress/shared': 2.0.0-beta.51 - '@vuepress/utils': 2.0.0-beta.51 - vue: ^3.2.41 - vue-router: 4.1.5 + '@vuepress/client': 2.0.0-beta.60 + '@vuepress/core': 2.0.0-beta.60 + '@vuepress/shared': 2.0.0-beta.60 + '@vuepress/utils': 2.0.0-beta.60 + vue: ^3.2.45 + vue-router: 4.1.6 dependencies: - '@vuepress/client': 2.0.0-beta.51 - '@vuepress/core': 2.0.0-beta.51 - '@vuepress/shared': 2.0.0-beta.51 - '@vuepress/utils': 2.0.0-beta.51 - vue: 3.2.41 - vue-router: 4.1.5_vue@3.2.41 + '@vuepress/client': 2.0.0-beta.60 + '@vuepress/core': 2.0.0-beta.60 + '@vuepress/shared': 2.0.0-beta.60 + '@vuepress/utils': 2.0.0-beta.60 + vue: 3.2.45 + vue-router: 4.1.6_vue@3.2.45 packages/plugin-netlify-functions: specifiers: '@iarna/toml': ^2.2.5 '@netlify/functions': ^1.3.0 - '@types/node': ^18.8.5 - '@vuepress/core': 2.0.0-beta.51 - '@vuepress/shared': 2.0.0-beta.51 - '@vuepress/utils': 2.0.0-beta.51 - chalk: ^5.1.2 + '@types/node': ^18.11.18 + '@vuepress/core': 2.0.0-beta.60 + '@vuepress/shared': 2.0.0-beta.60 + '@vuepress/utils': 2.0.0-beta.60 + chalk: ^5.2.0 chokidar: ^3.5.3 cpx2: ^4.2.0 dotenv: ^16.0.3 - esbuild: ^0.15.11 + esbuild: ^0.16.12 execa: ^6.1.0 - netlify-cli: ^12.0.9 + netlify-cli: ^12.5.0 portfinder: ^1.0.32 dependencies: '@iarna/toml': 2.2.5 '@netlify/functions': 1.3.0 - '@vuepress/core': 2.0.0-beta.51 - '@vuepress/shared': 2.0.0-beta.51 - '@vuepress/utils': 2.0.0-beta.51 - chalk: 5.1.2 + '@vuepress/core': 2.0.0-beta.60 + '@vuepress/shared': 2.0.0-beta.60 + '@vuepress/utils': 2.0.0-beta.60 + chalk: 5.2.0 chokidar: 3.5.3 cpx2: 4.2.0 dotenv: 16.0.3 - esbuild: 0.15.11 + esbuild: 0.16.12 execa: 6.1.0 - netlify-cli: 12.0.9_@types+node@18.8.5 + netlify-cli: 12.5.0_@types+node@18.11.18 portfinder: 1.0.32 devDependencies: - '@types/node': 18.8.5 + '@types/node': 18.11.18 packages/plugin-page-collection: specifiers: '@netlify/functions': ^1.3.0 '@vuepress-plume/vuepress-plugin-netlify-functions': workspace:* - '@vuepress/client': 2.0.0-beta.51 - '@vuepress/core': 2.0.0-beta.51 - '@vuepress/shared': 2.0.0-beta.51 - '@vuepress/utils': 2.0.0-beta.51 - leancloud-storage: ^4.13.2 - vue: ^3.2.41 - vue-router: 4.1.5 + '@vuepress/client': 2.0.0-beta.60 + '@vuepress/core': 2.0.0-beta.60 + '@vuepress/shared': 2.0.0-beta.60 + '@vuepress/utils': 2.0.0-beta.60 + leancloud-storage: ^4.14.0 + vue: ^3.2.45 + vue-router: 4.1.6 dependencies: '@netlify/functions': 1.3.0 '@vuepress-plume/vuepress-plugin-netlify-functions': link:../plugin-netlify-functions - '@vuepress/client': 2.0.0-beta.51 - '@vuepress/core': 2.0.0-beta.51 - '@vuepress/shared': 2.0.0-beta.51 - '@vuepress/utils': 2.0.0-beta.51 - leancloud-storage: 4.13.2 - vue: 3.2.41 - vue-router: 4.1.5_vue@3.2.41 + '@vuepress/client': 2.0.0-beta.60 + '@vuepress/core': 2.0.0-beta.60 + '@vuepress/shared': 2.0.0-beta.60 + '@vuepress/utils': 2.0.0-beta.60 + leancloud-storage: 4.14.0 + vue: 3.2.45 + vue-router: 4.1.6_vue@3.2.45 packages/plugin-windicss: specifiers: - '@vuepress/client': 2.0.0-beta.51 - '@vuepress/core': 2.0.0-beta.51 - '@vuepress/shared': 2.0.0-beta.51 - '@vuepress/utils': 2.0.0-beta.51 - vite-plugin-windicss: ^1.8.8 + '@vuepress/client': 2.0.0-beta.60 + '@vuepress/core': 2.0.0-beta.60 + '@vuepress/shared': 2.0.0-beta.60 + '@vuepress/utils': 2.0.0-beta.60 + vite-plugin-windicss: ^1.8.10 windicss: ^3.5.6 - windicss-webpack-plugin: ^1.7.6 + windicss-webpack-plugin: ^1.7.7 dependencies: - '@vuepress/client': 2.0.0-beta.51 - '@vuepress/core': 2.0.0-beta.51 - '@vuepress/shared': 2.0.0-beta.51 - '@vuepress/utils': 2.0.0-beta.51 - vite-plugin-windicss: 1.8.8 + '@vuepress/client': 2.0.0-beta.60 + '@vuepress/core': 2.0.0-beta.60 + '@vuepress/shared': 2.0.0-beta.60 + '@vuepress/utils': 2.0.0-beta.60 + vite-plugin-windicss: 1.8.10 windicss: 3.5.6 - windicss-webpack-plugin: 1.7.6 + windicss-webpack-plugin: 1.7.7 packages/theme: specifiers: @@ -258,32 +258,32 @@ importers: '@vuepress-plume/vuepress-plugin-caniuse': workspace:* '@vuepress-plume/vuepress-plugin-copy-code': workspace:* '@vuepress-plume/vuepress-plugin-windicss': workspace:* - '@vuepress/client': 2.0.0-beta.51 - '@vuepress/core': 2.0.0-beta.51 - '@vuepress/plugin-active-header-links': 2.0.0-beta.51 - '@vuepress/plugin-container': 2.0.0-beta.51 - '@vuepress/plugin-docsearch': 2.0.0-beta.51 - '@vuepress/plugin-external-link-icon': 2.0.0-beta.51 - '@vuepress/plugin-git': 2.0.0-beta.51 - '@vuepress/plugin-medium-zoom': 2.0.0-beta.51 - '@vuepress/plugin-nprogress': 2.0.0-beta.51 - '@vuepress/plugin-palette': 2.0.0-beta.51 - '@vuepress/plugin-prismjs': 2.0.0-beta.51 - '@vuepress/plugin-search': 2.0.0-beta.51 - '@vuepress/plugin-theme-data': 2.0.0-beta.51 - '@vuepress/plugin-toc': 2.0.0-beta.51 - '@vuepress/shared': 2.0.0-beta.51 - '@vuepress/utils': 2.0.0-beta.51 - '@vueuse/core': ^9.3.0 + '@vuepress/client': 2.0.0-beta.60 + '@vuepress/core': 2.0.0-beta.60 + '@vuepress/plugin-active-header-links': 2.0.0-beta.60 + '@vuepress/plugin-container': 2.0.0-beta.60 + '@vuepress/plugin-docsearch': 2.0.0-beta.60 + '@vuepress/plugin-external-link-icon': 2.0.0-beta.60 + '@vuepress/plugin-git': 2.0.0-beta.60 + '@vuepress/plugin-medium-zoom': 2.0.0-beta.60 + '@vuepress/plugin-nprogress': 2.0.0-beta.60 + '@vuepress/plugin-palette': 2.0.0-beta.60 + '@vuepress/plugin-prismjs': 2.0.0-beta.60 + '@vuepress/plugin-search': 2.0.0-beta.60 + '@vuepress/plugin-theme-data': 2.0.0-beta.60 + '@vuepress/plugin-toc': 2.0.0-beta.60 + '@vuepress/shared': 2.0.0-beta.60 + '@vuepress/utils': 2.0.0-beta.60 + '@vueuse/core': ^9.9.0 date-fns: ^2.29.3 nanoid: ^4.0.0 ts-debounce: ^4.0.0 - vue: ^3.2.41 - vue-router: 4.1.5 - vuepress-plugin-comment2: 2.0.0-beta.110 - vuepress-plugin-md-enhance: 2.0.0-beta.110 - vuepress-plugin-seo2: 2.0.0-beta.110 - vuepress-plugin-sitemap2: 2.0.0-beta.110 + vue: ^3.2.45 + vue-router: 4.1.6 + vuepress-plugin-comment2: 2.0.0-beta.146 + vuepress-plugin-md-enhance: 2.0.0-beta.146 + vuepress-plugin-seo2: 2.0.0-beta.146 + vuepress-plugin-sitemap2: 2.0.0-beta.146 windicss: ^3.5.6 dependencies: '@types/lodash.merge': 4.6.7 @@ -293,133 +293,57 @@ importers: '@vuepress-plume/vuepress-plugin-caniuse': link:../plugin-caniuse '@vuepress-plume/vuepress-plugin-copy-code': link:../plugin-copy-code '@vuepress-plume/vuepress-plugin-windicss': link:../plugin-windicss - '@vuepress/client': 2.0.0-beta.51 - '@vuepress/core': 2.0.0-beta.51 - '@vuepress/plugin-active-header-links': 2.0.0-beta.51 - '@vuepress/plugin-container': 2.0.0-beta.51 - '@vuepress/plugin-docsearch': 2.0.0-beta.51 - '@vuepress/plugin-external-link-icon': 2.0.0-beta.51 - '@vuepress/plugin-git': 2.0.0-beta.51 - '@vuepress/plugin-medium-zoom': 2.0.0-beta.51 - '@vuepress/plugin-nprogress': 2.0.0-beta.51 - '@vuepress/plugin-palette': 2.0.0-beta.51 - '@vuepress/plugin-prismjs': 2.0.0-beta.51 - '@vuepress/plugin-search': 2.0.0-beta.51 - '@vuepress/plugin-theme-data': 2.0.0-beta.51 - '@vuepress/plugin-toc': 2.0.0-beta.51 - '@vuepress/shared': 2.0.0-beta.51 - '@vuepress/utils': 2.0.0-beta.51 - '@vueuse/core': 9.3.0_vue@3.2.41 + '@vuepress/client': 2.0.0-beta.60 + '@vuepress/core': 2.0.0-beta.60 + '@vuepress/plugin-active-header-links': 2.0.0-beta.60 + '@vuepress/plugin-container': 2.0.0-beta.60 + '@vuepress/plugin-docsearch': 2.0.0-beta.60 + '@vuepress/plugin-external-link-icon': 2.0.0-beta.60 + '@vuepress/plugin-git': 2.0.0-beta.60 + '@vuepress/plugin-medium-zoom': 2.0.0-beta.60 + '@vuepress/plugin-nprogress': 2.0.0-beta.60 + '@vuepress/plugin-palette': 2.0.0-beta.60 + '@vuepress/plugin-prismjs': 2.0.0-beta.60 + '@vuepress/plugin-search': 2.0.0-beta.60 + '@vuepress/plugin-theme-data': 2.0.0-beta.60 + '@vuepress/plugin-toc': 2.0.0-beta.60 + '@vuepress/shared': 2.0.0-beta.60 + '@vuepress/utils': 2.0.0-beta.60 + '@vueuse/core': 9.9.0_vue@3.2.45 date-fns: 2.29.3 nanoid: 4.0.0 ts-debounce: 4.0.0 - vue: 3.2.41 - vue-router: 4.1.5_vue@3.2.41 - vuepress-plugin-comment2: 2.0.0-beta.110 - vuepress-plugin-md-enhance: 2.0.0-beta.110 - vuepress-plugin-seo2: 2.0.0-beta.110 - vuepress-plugin-sitemap2: 2.0.0-beta.110 + vue: 3.2.45 + vue-router: 4.1.6_vue@3.2.45 + vuepress-plugin-comment2: 2.0.0-beta.146 + vuepress-plugin-md-enhance: 2.0.0-beta.146 + vuepress-plugin-seo2: 2.0.0-beta.146 + vuepress-plugin-sitemap2: 2.0.0-beta.146 windicss: 3.5.6 - packages/theme-back: - specifiers: - '@types/lodash.merge': ^4.6.7 - '@vuepress-plume/vuepress-plugin-baidu-tongji': workspace:* - '@vuepress-plume/vuepress-plugin-caniuse': workspace:* - '@vuepress-plume/vuepress-plugin-copy-code': workspace:* - '@vuepress/client': 2.0.0-beta.51 - '@vuepress/core': 2.0.0-beta.51 - '@vuepress/plugin-active-header-links': 2.0.0-beta.51 - '@vuepress/plugin-container': 2.0.0-beta.51 - '@vuepress/plugin-docsearch': 2.0.0-beta.51 - '@vuepress/plugin-external-link-icon': 2.0.0-beta.51 - '@vuepress/plugin-git': 2.0.0-beta.51 - '@vuepress/plugin-medium-zoom': 2.0.0-beta.51 - '@vuepress/plugin-nprogress': 2.0.0-beta.51 - '@vuepress/plugin-palette': 2.0.0-beta.51 - '@vuepress/plugin-prismjs': 2.0.0-beta.51 - '@vuepress/plugin-search': 2.0.0-beta.51 - '@vuepress/plugin-theme-data': 2.0.0-beta.51 - '@vuepress/plugin-toc': 2.0.0-beta.51 - '@vuepress/shared': 2.0.0-beta.51 - '@vuepress/utils': 2.0.0-beta.51 - '@vueuse/core': ^9.3.0 - chokidar: ^3.5.3 - date-fns: ^2.29.3 - gray-matter: ^4.0.3 - json2yaml: ^1.1.0 - lodash.merge: ^4.6.2 - nanoid: ^4.0.0 - sass: ^1.55.0 - sass-loader: ^13.1.0 - ts-debounce: ^4.0.0 - vue: ^3.2.41 - vue-router: 4.1.5 - vuepress-plugin-comment2: 2.0.0-beta.110 - vuepress-plugin-md-enhance: 2.0.0-beta.110 - vuepress-plugin-seo2: 2.0.0-beta.110 - vuepress-plugin-sitemap2: 2.0.0-beta.110 - dependencies: - '@types/lodash.merge': 4.6.7 - '@vuepress-plume/vuepress-plugin-baidu-tongji': link:../plugin-baidu-tongji - '@vuepress-plume/vuepress-plugin-caniuse': link:../plugin-caniuse - '@vuepress-plume/vuepress-plugin-copy-code': link:../plugin-copy-code - '@vuepress/client': 2.0.0-beta.51 - '@vuepress/core': 2.0.0-beta.51 - '@vuepress/plugin-active-header-links': 2.0.0-beta.51 - '@vuepress/plugin-container': 2.0.0-beta.51 - '@vuepress/plugin-docsearch': 2.0.0-beta.51 - '@vuepress/plugin-external-link-icon': 2.0.0-beta.51 - '@vuepress/plugin-git': 2.0.0-beta.51 - '@vuepress/plugin-medium-zoom': 2.0.0-beta.51 - '@vuepress/plugin-nprogress': 2.0.0-beta.51 - '@vuepress/plugin-palette': 2.0.0-beta.51 - '@vuepress/plugin-prismjs': 2.0.0-beta.51 - '@vuepress/plugin-search': 2.0.0-beta.51 - '@vuepress/plugin-theme-data': 2.0.0-beta.51 - '@vuepress/plugin-toc': 2.0.0-beta.51 - '@vuepress/shared': 2.0.0-beta.51 - '@vuepress/utils': 2.0.0-beta.51 - '@vueuse/core': 9.3.0_vue@3.2.41 - chokidar: 3.5.3 - date-fns: 2.29.3 - gray-matter: 4.0.3 - json2yaml: 1.1.0 - lodash.merge: 4.6.2 - nanoid: 4.0.0 - sass: 1.55.0 - sass-loader: 13.1.0_sass@1.55.0 - ts-debounce: 4.0.0 - vue: 3.2.41 - vue-router: 4.1.5_vue@3.2.41 - vuepress-plugin-comment2: 2.0.0-beta.110_sass-loader@13.1.0 - vuepress-plugin-md-enhance: 2.0.0-beta.110_sass-loader@13.1.0 - vuepress-plugin-seo2: 2.0.0-beta.110 - vuepress-plugin-sitemap2: 2.0.0-beta.110 - packages: - /@algolia/autocomplete-core/1.7.1: - resolution: {integrity: sha512-eiZw+fxMzNQn01S8dA/hcCpoWCOCwcIIEUtHHdzN5TGB3IpzLbuhqFeTfh2OUhhgkE8Uo17+wH+QJ/wYyQmmzg==} + /@algolia/autocomplete-core/1.7.2: + resolution: {integrity: sha512-eclwUDC6qfApNnEfu1uWcL/rudQsn59tjEoUYZYE2JSXZrHLRjBUGMxiCoknobU2Pva8ejb0eRxpIYDtVVqdsw==} dependencies: - '@algolia/autocomplete-shared': 1.7.1 + '@algolia/autocomplete-shared': 1.7.2 dev: false - /@algolia/autocomplete-preset-algolia/1.7.1_algoliasearch@4.14.2: - resolution: {integrity: sha512-pJwmIxeJCymU1M6cGujnaIYcY3QPOVYZOXhFkWVM7IxKzy272BwCvMFMyc5NpG/QmiObBxjo7myd060OeTNJXg==} + /@algolia/autocomplete-preset-algolia/1.7.2_algoliasearch@4.14.2: + resolution: {integrity: sha512-+RYEG6B0QiGGfRb2G3MtPfyrl0dALF3cQNTWBzBX6p5o01vCCGTTinAm2UKG3tfc2CnOMAtnPLkzNZyJUpnVJw==} peerDependencies: - '@algolia/client-search': ^4.9.1 - algoliasearch: ^4.9.1 + '@algolia/client-search': '>= 4.9.1 < 6' + algoliasearch: '>= 4.9.1 < 6' peerDependenciesMeta: '@algolia/client-search': optional: true dependencies: - '@algolia/autocomplete-shared': 1.7.1 + '@algolia/autocomplete-shared': 1.7.2 algoliasearch: 4.14.2 dev: false - /@algolia/autocomplete-shared/1.7.1: - resolution: {integrity: sha512-eTmGVqY3GeyBTT8IWiB2K5EuURAqhnumfktAEoHxfDY2o7vg2rSnO16ZtIG0fMgt3py28Vwgq42/bVEuaQV7pg==} + /@algolia/autocomplete-shared/1.7.2: + resolution: {integrity: sha512-QCckjiC7xXHIUaIL3ektBtjJ0w7tTA3iqKcAE/Hjn1lZ5omp7i3Y4e09rAr9ZybqirL7AbxCLLq0Ra5DDPKeug==} dev: false /@algolia/cache-browser-local-storage/4.14.2: @@ -520,39 +444,43 @@ packages: '@jridgewell/trace-mapping': 0.3.14 dev: false - /@antfu/ni/0.18.2: - resolution: {integrity: sha512-OZalxEGupqCd8hKV2wyT5IHQTx1BR5/iXZEbseLpSdgcSn8fLjLOqi+LLhLly0a1XIkCAUeknV5/JXvMbjIstA==} + /@antfu/ni/0.18.8: + resolution: {integrity: sha512-0m++AudwQq+wWAz/Ax7g+sh/wFW51HHQ6BtPLsuTAsFIzWB/bv/0COwZE7BRS+u0nqMb6Ks6nlk6cY1TpPDwHg==} hasBin: true dev: true /@antfu/utils/0.5.2: resolution: {integrity: sha512-CQkeV+oJxUazwjlHD0/3ZD08QWKuGQkhnrKo3e6ly5pd48VUpXbb77q0xMU4+vc2CkJnDS02Eq/M9ugyX20XZA==} + /@antfu/utils/0.7.2: + resolution: {integrity: sha512-vy9fM3pIxZmX07dL+VX1aZe7ynZ+YyB0jY+jE6r3hOK6GNY2t6W8rzpFC4tgpbXUYABkFQwgJq2XYXlxbXAI0g==} + dev: false + /@babel/code-frame/7.18.6: resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} engines: {node: '>=6.9.0'} dependencies: '@babel/highlight': 7.18.6 - /@babel/compat-data/7.18.8: - resolution: {integrity: sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==} + /@babel/compat-data/7.20.10: + resolution: {integrity: sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==} engines: {node: '>=6.9.0'} dev: false - /@babel/core/7.18.10: - resolution: {integrity: sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==} + /@babel/core/7.20.7: + resolution: {integrity: sha512-t1ZjCluspe5DW24bn2Rr1CDb2v9rn/hROtg9a2tmd0+QYf4bsloYfLQzjG4qHPNMhWtKdGC33R5AxGR2Af2cBw==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.0 '@babel/code-frame': 7.18.6 - '@babel/generator': 7.18.10 - '@babel/helper-compilation-targets': 7.18.9_@babel+core@7.18.10 - '@babel/helper-module-transforms': 7.18.9 - '@babel/helpers': 7.18.9 - '@babel/parser': 7.18.10 - '@babel/template': 7.18.10 - '@babel/traverse': 7.18.10 - '@babel/types': 7.18.10 + '@babel/generator': 7.20.7 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.7 + '@babel/helper-module-transforms': 7.20.11 + '@babel/helpers': 7.20.7 + '@babel/parser': 7.20.7 + '@babel/template': 7.20.7 + '@babel/traverse': 7.20.10 + '@babel/types': 7.20.7 convert-source-map: 1.8.0 debug: 4.3.4 gensync: 1.0.0-beta.2 @@ -562,25 +490,26 @@ packages: - supports-color dev: false - /@babel/generator/7.18.10: - resolution: {integrity: sha512-0+sW7e3HjQbiHbj1NeU/vN8ornohYlacAfZIaXhdoGweQqgcNy69COVciYYqEXJ/v+9OBA7Frxm4CVAuNqKeNA==} + /@babel/generator/7.20.7: + resolution: {integrity: sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.18.10 + '@babel/types': 7.20.7 '@jridgewell/gen-mapping': 0.3.2 jsesc: 2.5.2 dev: false - /@babel/helper-compilation-targets/7.18.9_@babel+core@7.18.10: - resolution: {integrity: sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==} + /@babel/helper-compilation-targets/7.20.7_@babel+core@7.20.7: + resolution: {integrity: sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/compat-data': 7.18.8 - '@babel/core': 7.18.10 + '@babel/compat-data': 7.20.10 + '@babel/core': 7.20.7 '@babel/helper-validator-option': 7.18.6 browserslist: 4.21.3 + lru-cache: 5.1.1 semver: 6.3.0 dev: false @@ -589,56 +518,56 @@ packages: engines: {node: '>=6.9.0'} dev: false - /@babel/helper-function-name/7.18.9: - resolution: {integrity: sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==} + /@babel/helper-function-name/7.19.0: + resolution: {integrity: sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.18.10 - '@babel/types': 7.18.10 + '@babel/template': 7.20.7 + '@babel/types': 7.20.7 dev: false /@babel/helper-hoist-variables/7.18.6: resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.18.10 + '@babel/types': 7.20.7 dev: false /@babel/helper-module-imports/7.18.6: resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.18.10 + '@babel/types': 7.20.7 dev: false - /@babel/helper-module-transforms/7.18.9: - resolution: {integrity: sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==} + /@babel/helper-module-transforms/7.20.11: + resolution: {integrity: sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-module-imports': 7.18.6 - '@babel/helper-simple-access': 7.18.6 + '@babel/helper-simple-access': 7.20.2 '@babel/helper-split-export-declaration': 7.18.6 - '@babel/helper-validator-identifier': 7.18.6 - '@babel/template': 7.18.10 - '@babel/traverse': 7.18.10 - '@babel/types': 7.18.10 + '@babel/helper-validator-identifier': 7.19.1 + '@babel/template': 7.20.7 + '@babel/traverse': 7.20.10 + '@babel/types': 7.20.7 transitivePeerDependencies: - supports-color dev: false - /@babel/helper-simple-access/7.18.6: - resolution: {integrity: sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==} + /@babel/helper-simple-access/7.20.2: + resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.18.10 + '@babel/types': 7.20.7 dev: false /@babel/helper-split-export-declaration/7.18.6: resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.18.10 + '@babel/types': 7.20.7 dev: false /@babel/helper-string-parser/7.18.10: @@ -646,8 +575,13 @@ packages: engines: {node: '>=6.9.0'} dev: false - /@babel/helper-validator-identifier/7.18.6: - resolution: {integrity: sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==} + /@babel/helper-string-parser/7.19.4: + resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/helper-validator-identifier/7.19.1: + resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} engines: {node: '>=6.9.0'} /@babel/helper-validator-option/7.18.6: @@ -655,13 +589,13 @@ packages: engines: {node: '>=6.9.0'} dev: false - /@babel/helpers/7.18.9: - resolution: {integrity: sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==} + /@babel/helpers/7.20.7: + resolution: {integrity: sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.18.10 - '@babel/traverse': 7.18.10 - '@babel/types': 7.18.10 + '@babel/template': 7.20.7 + '@babel/traverse': 7.20.10 + '@babel/types': 7.20.7 transitivePeerDependencies: - supports-color dev: false @@ -670,7 +604,7 @@ packages: resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-validator-identifier': 7.18.6 + '@babel/helper-validator-identifier': 7.19.1 chalk: 2.4.2 js-tokens: 4.0.0 @@ -687,7 +621,15 @@ packages: engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.18.10 + '@babel/types': 7.20.7 + dev: false + + /@babel/parser/7.20.7: + resolution: {integrity: sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.20.7 dev: false /@babel/runtime-corejs3/7.18.9: @@ -705,27 +647,27 @@ packages: regenerator-runtime: 0.13.9 dev: false - /@babel/template/7.18.10: - resolution: {integrity: sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==} + /@babel/template/7.20.7: + resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==} engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.18.6 - '@babel/parser': 7.18.10 - '@babel/types': 7.18.10 + '@babel/parser': 7.20.7 + '@babel/types': 7.20.7 dev: false - /@babel/traverse/7.18.10: - resolution: {integrity: sha512-J7ycxg0/K9XCtLyHf0cz2DqDihonJeIo+z+HEdRe9YuT8TY4A66i+Ab2/xZCEW7Ro60bPCBBfqqboHSamoV3+g==} + /@babel/traverse/7.20.10: + resolution: {integrity: sha512-oSf1juCgymrSez8NI4A2sr4+uB/mFd9MXplYGPEBnfAuWmmyeVcHa6xLPiaRBcXkcb/28bgxmQLTVwFKE1yfsg==} engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.18.6 - '@babel/generator': 7.18.10 + '@babel/generator': 7.20.7 '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.18.9 + '@babel/helper-function-name': 7.19.0 '@babel/helper-hoist-variables': 7.18.6 '@babel/helper-split-export-declaration': 7.18.6 - '@babel/parser': 7.18.10 - '@babel/types': 7.18.10 + '@babel/parser': 7.20.7 + '@babel/types': 7.20.7 debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: @@ -737,7 +679,16 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/helper-string-parser': 7.18.10 - '@babel/helper-validator-identifier': 7.18.6 + '@babel/helper-validator-identifier': 7.19.1 + to-fast-properties: 2.0.0 + dev: false + + /@babel/types/7.20.7: + resolution: {integrity: sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.19.4 + '@babel/helper-validator-identifier': 7.19.1 to-fast-properties: 2.0.0 dev: false @@ -792,28 +743,28 @@ packages: engines: {node: '>=0.1.90'} dev: false - /@commitlint/cli/17.1.2: - resolution: {integrity: sha512-h/4Hlka3bvCLbnxf0Er2ri5A44VMlbMSkdTRp8Adv2tRiklSTRIoPGs7OEXDv3EoDs2AAzILiPookgM4Gi7LOw==} + /@commitlint/cli/17.3.0: + resolution: {integrity: sha512-/H0md7TsKflKzVPz226VfXzVafJFO1f9+r2KcFvmBu08V0T56lZU1s8WL7/xlxqLMqBTVaBf7Ixtc4bskdEEZg==} engines: {node: '>=v14'} hasBin: true dependencies: '@commitlint/format': 17.0.0 - '@commitlint/lint': 17.1.0 - '@commitlint/load': 17.1.2 - '@commitlint/read': 17.1.0 + '@commitlint/lint': 17.3.0 + '@commitlint/load': 17.3.0 + '@commitlint/read': 17.2.0 '@commitlint/types': 17.0.0 execa: 5.1.1 - lodash: 4.17.21 + lodash.isfunction: 3.0.9 resolve-from: 5.0.0 resolve-global: 1.0.0 - yargs: 17.5.1 + yargs: 17.6.2 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' dev: true - /@commitlint/config-conventional/17.1.0: - resolution: {integrity: sha512-WU2p0c9/jLi8k2q2YrDV96Y8XVswQOceIQ/wyJvQxawJSCasLdRB3kUIYdNjOCJsxkpoUlV/b90ZPxp1MYZDiA==} + /@commitlint/config-conventional/17.3.0: + resolution: {integrity: sha512-hgI+fN5xF8nhS9uG/V06xyT0nlcyvHHMkq0kwRSr96vl5BFlRGaL2C0/YY4kQagfU087tmj01bJkG9Ek98Wllw==} engines: {node: '>=v14'} dependencies: conventional-changelog-conventionalcommits: 5.0.0 @@ -824,15 +775,19 @@ packages: engines: {node: '>=v14'} dependencies: '@commitlint/types': 17.0.0 - ajv: 8.11.0 + ajv: 8.11.2 dev: true - /@commitlint/ensure/17.0.0: - resolution: {integrity: sha512-M2hkJnNXvEni59S0QPOnqCKIK52G1XyXBGw51mvh7OXDudCmZ9tZiIPpU882p475Mhx48Ien1MbWjCP1zlyC0A==} + /@commitlint/ensure/17.3.0: + resolution: {integrity: sha512-kWbrQHDoW5veIUQx30gXoLOCjWvwC6OOEofhPCLl5ytRPBDAQObMbxTha1Bt2aSyNE/IrJ0s0xkdZ1Gi3wJwQg==} engines: {node: '>=v14'} dependencies: '@commitlint/types': 17.0.0 - lodash: 4.17.21 + lodash.camelcase: 4.3.0 + lodash.kebabcase: 4.1.1 + lodash.snakecase: 4.1.1 + lodash.startcase: 4.4.0 + lodash.upperfirst: 4.3.1 dev: true /@commitlint/execute-rule/17.0.0: @@ -848,52 +803,54 @@ packages: chalk: 4.1.2 dev: true - /@commitlint/is-ignored/17.1.0: - resolution: {integrity: sha512-JITWKDMHhIh8IpdIbcbuH9rEQJty1ZWelgjleTFrVRAcEwN/sPzk1aVUXRIZNXMJWbZj8vtXRJnFihrml8uECQ==} + /@commitlint/is-ignored/17.2.0: + resolution: {integrity: sha512-rgUPUQraHxoMLxiE8GK430HA7/R2vXyLcOT4fQooNrZq9ERutNrP6dw3gdKLkq22Nede3+gEHQYUzL4Wu75ndg==} engines: {node: '>=v14'} dependencies: '@commitlint/types': 17.0.0 semver: 7.3.7 dev: true - /@commitlint/lint/17.1.0: - resolution: {integrity: sha512-ltpqM2ogt/+SDhUaScFo0MdscncEF96lvQTPMM/VTTWlw7sTGLLWkOOppsee2MN/uLNNWjQ7kqkd4h6JqoM9AQ==} + /@commitlint/lint/17.3.0: + resolution: {integrity: sha512-VilOTPg0i9A7CCWM49E9bl5jytfTvfTxf9iwbWAWNjxJ/A5mhPKbm3sHuAdwJ87tDk1k4j8vomYfH23iaY+1Rw==} engines: {node: '>=v14'} dependencies: - '@commitlint/is-ignored': 17.1.0 - '@commitlint/parse': 17.0.0 - '@commitlint/rules': 17.0.0 + '@commitlint/is-ignored': 17.2.0 + '@commitlint/parse': 17.2.0 + '@commitlint/rules': 17.3.0 '@commitlint/types': 17.0.0 dev: true - /@commitlint/load/17.1.2: - resolution: {integrity: sha512-sk2p/jFYAWLChIfOIp/MGSIn/WzZ0vkc3afw+l4X8hGEYkvDe4gQUUAVxjl/6xMRn0HgnSLMZ04xXh5pkTsmgg==} + /@commitlint/load/17.3.0: + resolution: {integrity: sha512-u/pV6rCAJrCUN+HylBHLzZ4qj1Ew3+eN9GBPhNi9otGxtOfA8b+8nJSxaNbcC23Ins/kcpjGf9zPSVW7628Umw==} engines: {node: '>=v14'} dependencies: '@commitlint/config-validator': 17.1.0 '@commitlint/execute-rule': 17.0.0 - '@commitlint/resolve-extends': 17.1.0 + '@commitlint/resolve-extends': 17.3.0 '@commitlint/types': 17.0.0 - '@types/node': 14.18.32 + '@types/node': 14.18.36 chalk: 4.1.2 - cosmiconfig: 7.0.1 - cosmiconfig-typescript-loader: 4.1.1_vfayau7oz5qy4giwqlppd3j3ti - lodash: 4.17.21 + cosmiconfig: 7.1.0 + cosmiconfig-typescript-loader: 4.3.0_k32j2iwrrwkbro5edqflmrijke + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + lodash.uniq: 4.5.0 resolve-from: 5.0.0 - ts-node: 10.9.1_jcmx33t3olsvcxopqdljsohpme - typescript: 4.8.4 + ts-node: 10.9.1_ocil65wecyuhsmrrocoajouipe + typescript: 4.9.4 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' dev: true - /@commitlint/message/17.0.0: - resolution: {integrity: sha512-LpcwYtN+lBlfZijHUdVr8aNFTVpHjuHI52BnfoV01TF7iSLnia0jttzpLkrLmI8HNQz6Vhr9UrxDWtKZiMGsBw==} + /@commitlint/message/17.2.0: + resolution: {integrity: sha512-/4l2KFKxBOuoEn1YAuuNNlAU05Zt7sNsC9H0mPdPm3chOrT4rcX0pOqrQcLtdMrMkJz0gC7b3SF80q2+LtdL9Q==} engines: {node: '>=v14'} dev: true - /@commitlint/parse/17.0.0: - resolution: {integrity: sha512-cKcpfTIQYDG1ywTIr5AG0RAiLBr1gudqEsmAGCTtj8ffDChbBRxm6xXs2nv7GvmJN7msOt7vOKleLvcMmRa1+A==} + /@commitlint/parse/17.2.0: + resolution: {integrity: sha512-vLzLznK9Y21zQ6F9hf8D6kcIJRb2haAK5T/Vt1uW2CbHYOIfNsR/hJs0XnF/J9ctM20Tfsqv4zBitbYvVw7F6Q==} engines: {node: '>=v14'} dependencies: '@commitlint/types': 17.0.0 @@ -901,8 +858,8 @@ packages: conventional-commits-parser: 3.2.4 dev: true - /@commitlint/read/17.1.0: - resolution: {integrity: sha512-73BoFNBA/3Ozo2JQvGsE0J8SdrJAWGfZQRSHqvKaqgmY042Su4gXQLqvAzgr55S9DI1l9TiU/5WDuh8IE86d/g==} + /@commitlint/read/17.2.0: + resolution: {integrity: sha512-bbblBhrHkjxra3ptJNm0abxu7yeAaxumQ8ZtD6GIVqzURCETCP7Dm0tlVvGRDyXBuqX6lIJxh3W7oyKqllDsHQ==} engines: {node: '>=v14'} dependencies: '@commitlint/top-level': 17.0.0 @@ -912,24 +869,24 @@ packages: minimist: 1.2.7 dev: true - /@commitlint/resolve-extends/17.1.0: - resolution: {integrity: sha512-jqKm00LJ59T0O8O4bH4oMa4XyJVEOK4GzH8Qye9XKji+Q1FxhZznxMV/bDLyYkzbTodBt9sL0WLql8wMtRTbqQ==} + /@commitlint/resolve-extends/17.3.0: + resolution: {integrity: sha512-Lf3JufJlc5yVEtJWC8o4IAZaB8FQAUaVlhlAHRACd0TTFizV2Lk2VH70et23KgvbQNf7kQzHs/2B4QZalBv6Cg==} engines: {node: '>=v14'} dependencies: '@commitlint/config-validator': 17.1.0 '@commitlint/types': 17.0.0 import-fresh: 3.3.0 - lodash: 4.17.21 + lodash.mergewith: 4.6.2 resolve-from: 5.0.0 resolve-global: 1.0.0 dev: true - /@commitlint/rules/17.0.0: - resolution: {integrity: sha512-45nIy3dERKXWpnwX9HeBzK5SepHwlDxdGBfmedXhL30fmFCkJOdxHyOJsh0+B0RaVsLGT01NELpfzJUmtpDwdQ==} + /@commitlint/rules/17.3.0: + resolution: {integrity: sha512-s2UhDjC5yP2utx3WWqsnZRzjgzAX8BMwr1nltC0u0p8T/nzpkx4TojEfhlsOUj1t7efxzZRjUAV0NxNwdJyk+g==} engines: {node: '>=v14'} dependencies: - '@commitlint/ensure': 17.0.0 - '@commitlint/message': 17.0.0 + '@commitlint/ensure': 17.3.0 + '@commitlint/message': 17.2.0 '@commitlint/to-lines': 17.0.0 '@commitlint/types': 17.0.0 execa: 5.1.1 @@ -968,14 +925,14 @@ packages: kuler: 2.0.0 dev: false - /@docsearch/css/3.2.1: - resolution: {integrity: sha512-gaP6TxxwQC+K8D6TRx5WULUWKrcbzECOPA2KCVMuI+6C7dNiGUk5yXXzVhc5sld79XKYLnO9DRTI4mjXDYkh+g==} + /@docsearch/css/3.3.1: + resolution: {integrity: sha512-nznHXeFHpAYjyaSNFNFpU+IJPjQA7AINM8ONjDx/Zx4O/pGAvqwgmcLNc7zR8qXRutqnzLo06yN63xFn36KFBw==} dev: false - /@docsearch/js/3.2.1: - resolution: {integrity: sha512-H1PekEtSeS0msetR2YGGey2w7jQ2wAKfGODJvQTygSwMgUZ+2DHpzUgeDyEBIXRIfaBcoQneqrzsljM62pm6Xg==} + /@docsearch/js/3.3.1: + resolution: {integrity: sha512-BCVu7njUFJSUXDNvgK65xNYU1L7U3CKFJlawDXql17nQwfpBrNZHqp+eb8z9qu0SzauQKss9tsf/qwlFJ9BOGw==} dependencies: - '@docsearch/react': 3.2.1 + '@docsearch/react': 3.3.1 preact: 10.10.0 transitivePeerDependencies: - '@algolia/client-search' @@ -984,8 +941,8 @@ packages: - react-dom dev: false - /@docsearch/react/3.2.1: - resolution: {integrity: sha512-EzTQ/y82s14IQC5XVestiK/kFFMe2aagoYFuTAIfIb/e+4FU7kSMKonRtLwsCiLQHmjvNQq+HO+33giJ5YVtaQ==} + /@docsearch/react/3.3.1: + resolution: {integrity: sha512-wdeQBODPkue6yVEEg4ntt+TiGJ6iXMBUNjBQJ0s1WVoc1OdcCnks/lkQ5LEfXETYR/q9QSbCCBnMjvnSoILaag==} peerDependencies: '@types/react': '>= 16.8.0 < 19.0.0' react: '>= 16.8.0 < 19.0.0' @@ -998,9 +955,9 @@ packages: react-dom: optional: true dependencies: - '@algolia/autocomplete-core': 1.7.1 - '@algolia/autocomplete-preset-algolia': 1.7.1_algoliasearch@4.14.2 - '@docsearch/css': 3.2.1 + '@algolia/autocomplete-core': 1.7.2 + '@algolia/autocomplete-preset-algolia': 1.7.2_algoliasearch@4.14.2 + '@docsearch/css': 3.3.1 algoliasearch: 4.14.2 transitivePeerDependencies: - '@algolia/client-search' @@ -1012,15 +969,87 @@ packages: cpu: [arm] os: [android] requiresBuild: true + dev: false optional: true - /@esbuild/linux-loong64/0.14.53: - resolution: {integrity: sha512-W2dAL6Bnyn4xa/QRSU3ilIK4EzD5wgYXKXJiS1HDF5vU3675qc2bvFyLwbUcdmssDveyndy7FbitrCoiV/eMLg==} + /@esbuild/android-arm/0.16.12: + resolution: {integrity: sha512-CTWgMJtpCyCltrvipZrrcjjRu+rzm6pf9V8muCsJqtKujR3kPmU4ffbckvugNNaRmhxAF1ZI3J+0FUIFLFg8KA==} engines: {node: '>=12'} - cpu: [loong64] + cpu: [arm] + os: [android] + requiresBuild: true + optional: true + + /@esbuild/android-arm64/0.16.12: + resolution: {integrity: sha512-0LacmiIW+X0/LOLMZqYtZ7d4uY9fxYABAYhSSOu+OGQVBqH4N5eIYgkT7bBFnR4Nm3qo6qS3RpHKVrDASqj/uQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + optional: true + + /@esbuild/android-x64/0.16.12: + resolution: {integrity: sha512-sS5CR3XBKQXYpSGMM28VuiUnbX83Z+aWPZzClW+OB2JquKqxoiwdqucJ5qvXS8pM6Up3RtJfDnRQZkz3en2z5g==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + optional: true + + /@esbuild/darwin-arm64/0.16.12: + resolution: {integrity: sha512-Dpe5hOAQiQRH20YkFAg+wOpcd4PEuXud+aGgKBQa/VriPJA8zuVlgCOSTwna1CgYl05lf6o5els4dtuyk1qJxQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + optional: true + + /@esbuild/darwin-x64/0.16.12: + resolution: {integrity: sha512-ApGRA6X5txIcxV0095X4e4KKv87HAEXfuDRcGTniDWUUN+qPia8sl/BqG/0IomytQWajnUn4C7TOwHduk/FXBQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + optional: true + + /@esbuild/freebsd-arm64/0.16.12: + resolution: {integrity: sha512-AMdK2gA9EU83ccXCWS1B/KcWYZCj4P3vDofZZkl/F/sBv/fphi2oUqUTox/g5GMcIxk8CF1CVYTC82+iBSyiUg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + optional: true + + /@esbuild/freebsd-x64/0.16.12: + resolution: {integrity: sha512-KUKB9w8G/xaAbD39t6gnRBuhQ8vIYYlxGT2I+mT6UGRnCGRr1+ePFIGBQmf5V16nxylgUuuWVW1zU2ktKkf6WQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + optional: true + + /@esbuild/linux-arm/0.16.12: + resolution: {integrity: sha512-vhDdIv6z4eL0FJyNVfdr3C/vdd/Wc6h1683GJsFoJzfKb92dU/v88FhWdigg0i6+3TsbSDeWbsPUXb4dif2abg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-arm64/0.16.12: + resolution: {integrity: sha512-29HXMLpLklDfmw7T2buGqq3HImSUaZ1ArmrPOMaNiZZQptOSZs32SQtOHEl8xWX5vfdwZqrBfNf8Te4nArVzKQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-ia32/0.16.12: + resolution: {integrity: sha512-JFDuNDTTfgD1LJg7wHA42o2uAO/9VzHYK0leAVnCQE/FdMB599YMH73ux+nS0xGr79pv/BK+hrmdRin3iLgQjg==} + engines: {node: '>=12'} + cpu: [ia32] os: [linux] requiresBuild: true - dev: false optional: true /@esbuild/linux-loong64/0.15.11: @@ -1029,17 +1058,114 @@ packages: cpu: [loong64] os: [linux] requiresBuild: true + dev: false optional: true - /@eslint/eslintrc/1.3.3: - resolution: {integrity: sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==} + /@esbuild/linux-loong64/0.16.12: + resolution: {integrity: sha512-xTGzVPqm6WKfCC0iuj1fryIWr1NWEM8DMhAIo+4rFgUtwy/lfHl+Obvus4oddzRDbBetLLmojfVZGmt/g/g+Rw==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-mips64el/0.16.12: + resolution: {integrity: sha512-zI1cNgHa3Gol+vPYjIYHzKhU6qMyOQrvZ82REr5Fv7rlh5PG6SkkuCoH7IryPqR+BK2c/7oISGsvPJPGnO2bHQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-ppc64/0.16.12: + resolution: {integrity: sha512-/C8OFXExoMmvTDIOAM54AhtmmuDHKoedUd0Otpfw3+AuuVGemA1nQK99oN909uZbLEU6Bi+7JheFMG3xGfZluQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-riscv64/0.16.12: + resolution: {integrity: sha512-qeouyyc8kAGV6Ni6Isz8hUsKMr00EHgVwUKWNp1r4l88fHEoNTDB8mmestvykW6MrstoGI7g2EAsgr0nxmuGYg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-s390x/0.16.12: + resolution: {integrity: sha512-s9AyI/5vz1U4NNqnacEGFElqwnHusWa81pskAf8JNDM2eb6b2E6PpBmT8RzeZv6/TxE6/TADn2g9bb0jOUmXwQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/linux-x64/0.16.12: + resolution: {integrity: sha512-e8YA7GQGLWhvakBecLptUiKxOk4E/EPtSckS1i0MGYctW8ouvNUoh7xnU15PGO2jz7BYl8q1R6g0gE5HFtzpqQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + optional: true + + /@esbuild/netbsd-x64/0.16.12: + resolution: {integrity: sha512-z2+kUxmOqBS+6SRVd57iOLIHE8oGOoEnGVAmwjm2aENSP35HPS+5cK+FL1l+rhrsJOFIPrNHqDUNechpuG96Sg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + optional: true + + /@esbuild/openbsd-x64/0.16.12: + resolution: {integrity: sha512-PAonw4LqIybwn2/vJujhbg1N9W2W8lw9RtXIvvZoyzoA/4rA4CpiuahVbASmQohiytRsixbNoIOUSjRygKXpyA==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + optional: true + + /@esbuild/sunos-x64/0.16.12: + resolution: {integrity: sha512-+wr1tkt1RERi+Zi/iQtkzmMH4nS8+7UIRxjcyRz7lur84wCkAITT50Olq/HiT4JN2X2bjtlOV6vt7ptW5Gw60Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + optional: true + + /@esbuild/win32-arm64/0.16.12: + resolution: {integrity: sha512-XEjeUSHmjsAOJk8+pXJu9pFY2O5KKQbHXZWQylJzQuIBeiGrpMeq9sTVrHefHxMOyxUgoKQTcaTS+VK/K5SviA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + optional: true + + /@esbuild/win32-ia32/0.16.12: + resolution: {integrity: sha512-eRKPM7e0IecUAUYr2alW7JGDejrFJXmpjt4MlfonmQ5Rz9HWpKFGCjuuIRgKO7W9C/CWVFXdJ2GjddsBXqQI4A==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + optional: true + + /@esbuild/win32-x64/0.16.12: + resolution: {integrity: sha512-iPYKN78t3op2+erv2frW568j1q0RpqX6JOLZ7oPPaAV1VaF7dDstOrNw37PVOYoTWE11pV4A1XUitpdEFNIsPg==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + optional: true + + /@eslint/eslintrc/1.4.0: + resolution: {integrity: sha512-7yfvXy6MWLgWSFsLhz5yH3iQ52St8cdUY6FoGieKkRDVxuxmrNuUetIuu6cmjNWwniUHiWXjxCr5tTXDrbYS5A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 debug: 4.3.4 - espree: 9.4.0 - globals: 13.17.0 - ignore: 5.2.0 + espree: 9.4.1 + globals: 13.19.0 + ignore: 5.2.4 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 @@ -1052,8 +1178,8 @@ packages: resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} dev: true - /@humanwhocodes/config-array/0.10.7: - resolution: {integrity: sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==} + /@humanwhocodes/config-array/0.11.8: + resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==} engines: {node: '>=10.10.0'} dependencies: '@humanwhocodes/object-schema': 1.2.1 @@ -1068,6 +1194,11 @@ packages: engines: {node: '>=12.22'} dev: true + /@humanwhocodes/momoa/2.0.4: + resolution: {integrity: sha512-RE815I4arJFtt+FVeU1Tgp9/Xvecacji8w/V6XtXsWWH/wz/eNkNbhb+ny/+PlVZjV0rxQpRSQKNKE3lcktHEA==} + engines: {node: '>=10.10.0'} + dev: false + /@humanwhocodes/object-schema/1.2.1: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: true @@ -1101,7 +1232,7 @@ packages: dependencies: '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 18.8.5 + '@types/node': 18.11.18 '@types/yargs': 16.0.4 chalk: 4.1.2 dev: false @@ -1159,12 +1290,16 @@ packages: resolution: {integrity: sha512-f5DRIOZf7wxogefH03RjMPMdBF7ADTWUMoOs9kaJo06EfwF+aFhMZMDZxHg/Xe12hptN9xoZjGso2fdjapBRIA==} engines: {node: '>=10'} dependencies: - call-me-maybe: 1.0.1 + call-me-maybe: 1.0.2 cross-spawn: 7.0.3 string-argv: 0.3.1 type-detect: 4.0.8 dev: true + /@kurkle/color/0.3.1: + resolution: {integrity: sha512-hW0GwZj06z/ZFUW2Espl7toVDjghJN+EKqyXzPSV8NV89d5BYp5rRMBJoc+aUN0x5OXDMeRQHazejr2Xmqj2tw==} + dev: false + /@leancloud/adapter-types/3.0.0: resolution: {integrity: sha512-/1l2PWJ6pXizHphBorMN7B0d2YjmxZJf1s+bitvLALt7wBid5qbGpHqGGKE/yRdNlCKwl9FbXG1x5wUFZfQwHQ==} dev: false @@ -1224,8 +1359,8 @@ packages: resolution: {integrity: sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==} dev: false - /@lit/reactive-element/1.3.4: - resolution: {integrity: sha512-I1wz4uxOA52zSBhKmv4KQWLJpCyvfpnDg+eQR6mjpRgV+Ldi14HLPpSUpJklZRldz0fFmGCC/kVmuc/3cPFqCg==} + /@lit/reactive-element/1.5.0: + resolution: {integrity: sha512-fQh9FDK0LPTwDk+0HhSZEtb8K0LTN1wXerwpGrWA+a8tWulYRDLI4vQDWp4GOIsewn0572KYV/oZ3+492D7osA==} dev: false /@mapbox/node-pre-gyp/1.0.9: @@ -1239,8 +1374,8 @@ packages: nopt: 5.0.0 npmlog: 5.0.1 rimraf: 3.0.2 - semver: 7.3.7 - tar: 6.1.11 + semver: 7.3.8 + tar: 6.1.13 transitivePeerDependencies: - encoding - supports-color @@ -1257,81 +1392,244 @@ packages: nopt: 5.0.0 npmlog: 5.0.1 rimraf: 3.0.2 - semver: 7.3.7 - tar: 6.1.11 + semver: 7.3.8 + tar: 6.1.13 transitivePeerDependencies: - encoding - supports-color dev: false - /@mdit-vue/plugin-component/0.10.0: - resolution: {integrity: sha512-cfxmPVcp6880TRUgpT3eUjem1gCkg3vsBHOcjOoiD2gAu3hWg48d3woz5+F9WVrAhv8P6wpDYBzFqt29D6D4MQ==} + /@mdit-vue/plugin-component/0.11.2: + resolution: {integrity: sha512-ucFiEULCkLcCG1Tf1MfG5u5PS4BIXWIeKGHRGsXxz1ix2GbZWKFVgWEdNEckBu8s75Fv1WJLIOiAYZyri2f1nw==} dependencies: '@types/markdown-it': 12.2.3 markdown-it: 13.0.1 dev: false - /@mdit-vue/plugin-frontmatter/0.10.0: - resolution: {integrity: sha512-rJa4QM04YKRH9Edpr07BZvOjzOH2BwkPkalIa8YFIsZkCXLmrPpLsQteXbRLTkLGHLXnniW4V4tn5Y7bf7J74g==} + /@mdit-vue/plugin-frontmatter/0.11.1: + resolution: {integrity: sha512-AdZJInjD1pTJXlfhuoBS5ycuIQ3ewBfY0R/XHM3TRDEaDHQJHxouUCpCyijZmpdljTU45lFetIowaKtAi7GBog==} dependencies: - '@mdit-vue/types': 0.10.0 + '@mdit-vue/types': 0.11.0 '@types/markdown-it': 12.2.3 gray-matter: 4.0.3 markdown-it: 13.0.1 dev: false - /@mdit-vue/plugin-headers/0.10.0: - resolution: {integrity: sha512-DPrQyv83jVxX3FwmCnemVeBsSdtH4Hz+geDMwbzATtaqzaYDDpuAxoeiLGpTg41EpLe2SPDk94N3OOh0cdV0Lw==} + /@mdit-vue/plugin-headers/0.11.2: + resolution: {integrity: sha512-hH2zm4m+2tWe7dya/nxbbpB95pa9RjwYxl++kyZuRrqyhNTtsi2HWojX02peQ1nQMKKIWPDHtpeAHGP7dOLKFw==} dependencies: - '@mdit-vue/shared': 0.10.0 - '@mdit-vue/types': 0.10.0 + '@mdit-vue/shared': 0.11.2 + '@mdit-vue/types': 0.11.0 '@types/markdown-it': 12.2.3 markdown-it: 13.0.1 dev: false - /@mdit-vue/plugin-sfc/0.10.0: - resolution: {integrity: sha512-MoKnA8rApIyNeiIXbEUbQ+LAYr51YOWnNzJnum/ttX7kHmfh0+iMDAM1MnvmgVZWqhAzwdkEFOPTb9EVUI1dng==} + /@mdit-vue/plugin-sfc/0.11.1: + resolution: {integrity: sha512-3AjQXqExzT9FWGNOeTBqK1pbt1UA5anrZvjo7OO2PJ3lrfZd0rbjionFkmW/VW1912laHUraIP6n74mUNqPuWw==} dependencies: - '@mdit-vue/types': 0.10.0 + '@mdit-vue/types': 0.11.0 '@types/markdown-it': 12.2.3 markdown-it: 13.0.1 dev: false - /@mdit-vue/plugin-title/0.10.0: - resolution: {integrity: sha512-odJ9vIazAHiomjCEEFwHNuPnmDtx/FGOYrf9xUfi3tjG9r/JZW+G++AABxvevTozwpGlpU+wkpJ7mTr+rNtBrw==} + /@mdit-vue/plugin-title/0.11.2: + resolution: {integrity: sha512-R91WCN16CePWRT2bSXaDJGXvj0MuaCz4m2GbYqUbQxd+dqf18uuGPdbhr1rwhIqCvy7GD/g7hSgOFi3DNDAIzA==} dependencies: - '@mdit-vue/shared': 0.10.0 - '@mdit-vue/types': 0.10.0 + '@mdit-vue/shared': 0.11.2 + '@mdit-vue/types': 0.11.0 '@types/markdown-it': 12.2.3 markdown-it: 13.0.1 dev: false - /@mdit-vue/plugin-toc/0.10.0: - resolution: {integrity: sha512-P9aNy4jtqfjI08wUYGT/HVd5x/IpTjgSnNdJ3lU52qAO5AeFsW3v4gt+NmW0lO8We0S2YDEONRHBuBN6r40y6A==} + /@mdit-vue/plugin-toc/0.11.2: + resolution: {integrity: sha512-0OcGG4TnYIZJ6SLZtk24Nj0oP2vcLn0FyMTao/nB/2Z17/fP3whoo6dVV+0G4Oi8HZ+MMDi661lvS2b4b/glYA==} dependencies: - '@mdit-vue/shared': 0.10.0 - '@mdit-vue/types': 0.10.0 + '@mdit-vue/shared': 0.11.2 + '@mdit-vue/types': 0.11.0 '@types/markdown-it': 12.2.3 markdown-it: 13.0.1 dev: false - /@mdit-vue/shared/0.10.0: - resolution: {integrity: sha512-rUyu0NVNbaEg4DUiQenh/fam1MLdkItdzEVScN7vP0UzDWOwmGaKwkhlMmkSTW80H63ZlKst0fPe9LaGHImSZg==} + /@mdit-vue/shared/0.11.2: + resolution: {integrity: sha512-Z/GS/v9DURZE13Hv41meKzdnprMwenVJoM3t82OE5HIGvtE6QovsZ+mMF/rMvLgaLLMDjT3EwvrrBmemWkHYTQ==} dependencies: - '@mdit-vue/types': 0.10.0 + '@mdit-vue/types': 0.11.0 '@types/markdown-it': 12.2.3 markdown-it: 13.0.1 dev: false - /@mdit-vue/types/0.10.0: - resolution: {integrity: sha512-ROz5zVKt3COpuWUYFnpJh5kIXit9SQeMtimGBlwKJL1xEBNPG3QKD3VZzez5Ng/dBCApianCQhNVZGCza82Myw==} + /@mdit-vue/types/0.11.0: + resolution: {integrity: sha512-ygCGP7vFpqS02hpZwEe1uz8cfImWX06+zRs08J+tCZRKb6k+easIaIHFtY9ZSxt7j9L/gAPLDo/5RmOT6z0DPQ==} + dev: false + + /@mdit/plugin-align/0.1.0: + resolution: {integrity: sha512-zSWWRgeufXCfIMfNRCl3vWHGCPtr8USBOYnApTYVa1WURbTi9pyUx9BESDEVF2urYo3RppeSuZ8/wXg4P5mJfA==} + engines: {node: '>= 14'} + dependencies: + '@mdit/plugin-container': 0.1.0 + '@types/markdown-it': 12.2.3 + markdown-it: 13.0.1 + dev: false + + /@mdit/plugin-attrs/0.1.0: + resolution: {integrity: sha512-3kKuKofMJY7hPPU+65612Ni6rHIRUcbwKHSDKzuErSoC+jtsaf3anlFI3O8EoKrNEpYbmnHoDgR4jG6d3ZJSxw==} + engines: {node: '>= 14'} + dependencies: + '@types/markdown-it': 12.2.3 + markdown-it: 13.0.1 + dev: false + + /@mdit/plugin-container/0.1.0: + resolution: {integrity: sha512-YpSiQGWsfRGciYaLP1TR75PS7wdPSL/OEcMYskO0LUAgGKQ9oNjonpxJ5DvBfwnw3yWYgymdoLBiciWNeE3m5Q==} + engines: {node: '>= 14'} + dependencies: + '@types/markdown-it': 12.2.3 + markdown-it: 13.0.1 + dev: false + + /@mdit/plugin-figure/0.1.0: + resolution: {integrity: sha512-57Nd3LvscdvVjt7b4YAr2D/gLfQ2DaSpH2lAnFYaprQfQhSNSVjOIxKjrkGoYXSSharvwbhy2UXGNtN5A6ShhA==} + engines: {node: '>= 14'} + dependencies: + '@types/markdown-it': 12.2.3 + markdown-it: 13.0.1 + dev: false + + /@mdit/plugin-footnote/0.1.0: + resolution: {integrity: sha512-pLeEmc0/JM20P2Encf0uFDtH4UDcdginViS/6jRwHsxbBzHbb30ISl22Iw8oLAs1T068m01iZFPQOwt1dXJ1zQ==} + engines: {node: '>= 14'} + dependencies: + '@types/markdown-it': 12.2.3 + markdown-it: 13.0.1 + dev: false + + /@mdit/plugin-img-lazyload/0.1.0: + resolution: {integrity: sha512-RVky+MMtand7nfzv/oYakLDOCCCUIRQeJMBLQjIO0rpj/th+RyEHRbsGvojB513PdsXOw2wiSsqlTAQP3EP4wA==} + engines: {node: '>= 14'} + dependencies: + '@types/markdown-it': 12.2.3 + markdown-it: 13.0.1 + dev: false + + /@mdit/plugin-img-mark/0.1.0: + resolution: {integrity: sha512-FNjZLFHXXoIut9lk/Zi3V5a6nJpAexQMhWCI4IwXes1xDrpEIrCo+mF1zpA9vj/F1SxUwYYldbRzPDdbo76qxg==} + engines: {node: '>= 14'} + dependencies: + '@types/markdown-it': 12.2.3 + markdown-it: 13.0.1 + dev: false + + /@mdit/plugin-img-size/0.1.0: + resolution: {integrity: sha512-QA1xCiCp1u+RpJLU/dFQUWlSsWr1/a03tqvcGya/Xr0Xn+8eY4qX9E1v8jCMJ2DzrxG+3g1eUj6jQfhLq0aTxw==} + engines: {node: '>= 14'} + dependencies: + '@types/markdown-it': 12.2.3 + markdown-it: 13.0.1 + dev: false + + /@mdit/plugin-include/0.1.0: + resolution: {integrity: sha512-HyLSAarXlvoCVsh72I1MbgjQ6Od+x9KMnXDwuYzyshbA5L0G/yuYjDGc272Oy2Isdl4FmT/eFDlaIkfe3s7mWw==} + dependencies: + '@types/markdown-it': 12.2.3 + markdown-it: 13.0.1 + upath: 2.0.1 + dev: false + + /@mdit/plugin-katex/0.1.0: + resolution: {integrity: sha512-TNSAdUbNgAcc3VVtC6dV/ahmWmziagN2Hs0KdmFVWu3BLhY7NxcbAIIi2Zm3VehKDyxCL/PH66thqan8xM7wEA==} + engines: {node: '>= 14'} + dependencies: + '@mdit/plugin-tex': 0.1.0 + '@types/katex': 0.16.0 + '@types/markdown-it': 12.2.3 + katex: 0.16.4 + markdown-it: 13.0.1 + dev: false + + /@mdit/plugin-mark/0.1.0: + resolution: {integrity: sha512-qL9J9hl1gyBI4kByZ4ReDYCJN++HRfXL6fuPDM6oBvUHR496GbrUVnKQI9jSe9ZD0uRhGUIXS1xtbDG1AqdrXA==} + engines: {node: '>= 14'} + dependencies: + '@types/markdown-it': 12.2.3 + markdown-it: 13.0.1 + dev: false + + /@mdit/plugin-mathjax/0.1.0: + resolution: {integrity: sha512-dClH14tH894fhwy55KgzwfiuN7iI9CkZiaNBXoSZCTDtO8FllvsJdZIO5Dr/0y778YQn46D6hPnLTJ0TA/kRUg==} + engines: {node: '>= 14'} + dependencies: + '@mdit/plugin-tex': 0.1.0 + '@types/markdown-it': 12.2.3 + markdown-it: 13.0.1 + mathjax-full: 3.2.2 + upath: 2.0.1 + dev: false + + /@mdit/plugin-stylize/0.1.0: + resolution: {integrity: sha512-Z44GBVGhnV4Z+FLqYnGC+HFWivg4IEJQiFndcZp9BEJjHsp+BVwk7TgekK+MLam45W3HcKYRgqe8L+G5YYLwcw==} + engines: {node: '>= 14'} + dependencies: + '@types/markdown-it': 12.2.3 + markdown-it: 13.0.1 + dev: false + + /@mdit/plugin-sub/0.1.0: + resolution: {integrity: sha512-MOBMaUeUxwrtOF6vo0u2ET83+epWdethX2/jfHkM+esKtEUuH80mRQ7MzfCu/F4PT0uMG1kmsc0EpmBzPNaYew==} + engines: {node: '>= 14'} + dependencies: + '@types/markdown-it': 12.2.3 + markdown-it: 13.0.1 + dev: false + + /@mdit/plugin-sup/0.1.0: + resolution: {integrity: sha512-eUoUdAwKvW9H0uic2FiPBBZ5Bua3SkJHl/MiXVZGoJcJfvoNk3zKuIUNZyU+L7yHg8Rf5Xs1zrmLuZQtdRY9YQ==} + engines: {node: '>= 14'} + dependencies: + '@types/markdown-it': 12.2.3 + markdown-it: 13.0.1 + dev: false + + /@mdit/plugin-tasklist/0.1.0: + resolution: {integrity: sha512-fnNKpVLCDe4UHZfG2zq6DVBt6U3Tyx6trKGglt7NVqC9i3Wik/DRG+l1I+hIrr7Dh5nM2hLN4JsqB0bxybRxew==} + engines: {node: '>= 14'} + dependencies: + '@types/markdown-it': 12.2.3 + markdown-it: 13.0.1 + dev: false + + /@mdit/plugin-tex/0.1.0: + resolution: {integrity: sha512-wcYKqSwtLmN6ZFY4QySsZ6niMNyWTWDz0UFf2HJ8gQyJfYVsG4IddxQbI+e7cshWaaw6gYLW8MkSeNpr1b1HCg==} + engines: {node: '>= 14'} + dependencies: + '@types/markdown-it': 12.2.3 + markdown-it: 13.0.1 + dev: false + + /@mdit/plugin-uml/0.1.0: + resolution: {integrity: sha512-i8Axd91uhspuXTxvF6k8LNNS4r/6LpK6psYC0uBycjf1VV71WUJ8DCJGlF21aGQqUcVCSomprJXQjfg78mj8Sg==} + engines: {node: '>= 14'} + dependencies: + '@types/markdown-it': 12.2.3 + markdown-it: 13.0.1 + dev: false + + /@mermaid-js/mermaid-mindmap/9.3.0: + resolution: {integrity: sha512-IhtYSVBBRYviH1Ehu8gk69pMDF8DSRqXBRDMWrEfHoaMruHeaP2DXA3PBnuwsMaCdPQhlUUcy/7DBLAEIXvCAw==} + dependencies: + '@braintree/sanitize-url': 6.0.0 + cytoscape: 3.23.0 + cytoscape-cose-bilkent: 4.1.0_cytoscape@3.23.0 + cytoscape-fcose: 2.1.0_cytoscape@3.23.0 + d3: 7.6.1 + khroma: 2.0.0 + non-layered-tidy-tree-layout: 2.0.2 dev: false /@mrmlnc/readdir-enhanced/2.2.1: resolution: {integrity: sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==} engines: {node: '>=4'} dependencies: - call-me-maybe: 1.0.1 + call-me-maybe: 1.0.2 glob-to-regexp: 0.3.0 dev: false @@ -1339,25 +1637,23 @@ packages: resolution: {integrity: sha512-4wMPu9iN3/HL97QblBsBay3E1etIciR84izI3U+4iALY+JHCrI+a2jO0qbAZ/nxKoegypYEaiiqWXylm+/zfrw==} dev: false - /@netlify/build/28.0.0_@types+node@18.8.5: - resolution: {integrity: sha512-yeCS2q6rrMftWdk1tDRCJY6BWI5OYgH0qKC+V3zetY1YAFAGY6UVPFmCWwsQBea7VzGa4RUBEUvqZpMBvl4ksg==} + /@netlify/build/29.3.0_@types+node@18.11.18: + resolution: {integrity: sha512-ukQlZNOYPnnhfcDWBaX5i5FLN5dUENyPgS/ng2E/g5jW0kuVWf83Fz608nOmO9MACzujDDj87rq1GTdX7ym6tA==} engines: {node: ^14.16.0 || >=16.0.0} hasBin: true dependencies: '@bugsnag/js': 7.17.0 - '@netlify/cache-utils': 5.0.0_supports-color@9.2.2 - '@netlify/config': 19.0.0 - '@netlify/edge-bundler': 2.7.0 - '@netlify/functions-utils': 5.0.0_supports-color@9.2.2 - '@netlify/git-utils': 5.0.0 - '@netlify/plugins-list': 6.49.1 - '@netlify/run-utils': 5.0.0 - '@netlify/zip-it-and-ship-it': 7.1.2_supports-color@9.2.2 + '@netlify/cache-utils': 5.1.0_supports-color@9.2.2 + '@netlify/config': 20.2.0 + '@netlify/edge-bundler': 8.0.0 + '@netlify/functions-utils': 5.1.1_supports-color@9.2.2 + '@netlify/git-utils': 5.1.0 + '@netlify/plugins-list': 6.61.0 + '@netlify/run-utils': 5.1.0 + '@netlify/zip-it-and-ship-it': 8.2.0_supports-color@9.2.2 '@sindresorhus/slugify': 2.1.0 - ajv: 8.11.0 - ajv-errors: 3.0.0_ajv@8.11.0 ansi-escapes: 5.0.0 - chalk: 5.1.2 + chalk: 5.2.0 clean-stack: 4.2.0 execa: 6.1.0 figures: 4.0.1 @@ -1387,17 +1683,18 @@ packages: resolve: 2.0.0-next.4 rfdc: 1.3.0 safe-json-stringify: 1.2.0 - semver: 7.3.7 + semver: 7.3.8 statsd-client: 0.4.7 string-width: 5.1.2 strip-ansi: 7.0.1 supports-color: 9.2.2 + terminal-link: 3.0.0 tmp-promise: 3.0.3 - ts-node: 10.9.1_ptpocrdt7oaz4ni5mlvucph5pa - typescript: 4.8.4 + ts-node: 10.9.1_awa2wsr5thmg3i7jqycphctjfq + typescript: 4.9.4 update-notifier: 5.1.0 uuid: 8.3.2 - yargs: 17.5.1 + yargs: 17.6.2 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' @@ -1405,14 +1702,14 @@ packages: - encoding dev: false - /@netlify/cache-utils/5.0.0_supports-color@9.2.2: - resolution: {integrity: sha512-JDoEr86O/ObEqk1Zr9KYL42VhIcKFKzme0bAU9BBHtBoyLCElVPfo5xudkNTcEuONFCK5WNCuU6TXBQX63/uJg==} + /@netlify/cache-utils/5.1.0_supports-color@9.2.2: + resolution: {integrity: sha512-KmiklYOkj8j9riQU8ww/KlZDZmGUc0Nqfo7IVuPcjagp/Xb0/HiwuAS+z4buHXDRF2rQ/lMln5Wp+FGE7wbc+g==} engines: {node: ^14.16.0 || >=16.0.0} dependencies: cpy: 8.1.2_supports-color@9.2.2 del: 6.1.1 get-stream: 6.0.1 - globby: 13.1.2 + globby: 13.1.3 junk: 4.0.0 locate-path: 7.1.1 move-file: 3.0.0 @@ -1422,12 +1719,12 @@ packages: - supports-color dev: false - /@netlify/config/19.0.0: - resolution: {integrity: sha512-fop3dyP20pkT6UqN7OBbMPnAAx5t1W/ZQvshr3ITXGtdQkbMJLXalWDf3CXdSCeiDHJ3mxk67JuOho2PW7B50w==} + /@netlify/config/20.2.0: + resolution: {integrity: sha512-G8VnQ7JZPP07+Pii10JIHLDCqwDIyfc0Jf6WRKK/LnSmtZzsx5Q0kEBxcJ8pYoyA5kGoGfT3bczbTr9FDCMKrw==} engines: {node: ^14.16.0 || >=16.0.0} hasBin: true dependencies: - chalk: 5.1.2 + chalk: 5.2.0 cron-parser: 4.6.0 deepmerge: 4.2.2 dot-prop: 7.2.0 @@ -1440,9 +1737,9 @@ packages: is-plain-obj: 4.1.0 js-yaml: 4.1.0 map-obj: 5.0.2 - netlify: 13.0.0 - netlify-headers-parser: 7.0.0 - netlify-redirect-parser: 14.0.0 + netlify: 13.1.0 + netlify-headers-parser: 7.1.0 + netlify-redirect-parser: 14.1.0 omit.js: 2.0.2 p-locate: 6.0.0 path-exists: 5.0.0 @@ -1450,27 +1747,31 @@ packages: toml: 3.0.0 tomlify-j0.4: 3.0.0 validate-npm-package-name: 4.0.0 - yargs: 17.5.1 + yargs: 17.6.2 dev: false - /@netlify/edge-bundler/2.7.0: - resolution: {integrity: sha512-BEIZkjSK0HyhGiTImfVHUjIMQ852YyxzNRikgOzvXDGvWVs74y7n3clSm66J55vilvEZmK6GpXZiGtaNN9kH6g==} - engines: {node: ^12.20.0 || ^14.14.0 || >=16.0.0} + /@netlify/edge-bundler/8.0.0: + resolution: {integrity: sha512-th0HKJ0oqsSVq+kyElP2e1goVZtElz+1b0dK+ddRj6BYAZfGjskoiN1LZo58QPHtZ8Vim3EYQwhDCaLddqGIQw==} + engines: {node: ^14.16.0 || >=16.0.0} dependencies: '@import-maps/resolve': 1.0.1 + ajv: 8.11.2 + ajv-errors: 3.0.0_ajv@8.11.2 + better-ajv-errors: 1.2.0_ajv@8.11.2 common-path-prefix: 3.0.0 - del: 6.1.1 + del: 7.0.0 env-paths: 3.0.0 execa: 6.1.0 find-up: 6.3.0 get-port: 6.1.2 glob-to-regexp: 0.4.1 + jsonc-parser: 3.2.0 node-fetch: 3.2.10 node-stream-zip: 1.15.0 p-retry: 5.1.1 p-wait-for: 4.1.0 path-key: 4.0.0 - semver: 7.3.7 + semver: 7.3.8 tmp-promise: 3.0.3 uuid: 9.0.0 dev: false @@ -1683,25 +1984,29 @@ packages: '@netlify/esbuild-windows-arm64': 0.14.39 dev: false - /@netlify/framework-info/9.3.0: - resolution: {integrity: sha512-GfGG6DGHeVNpSN9yesKvgT0LTgrD0d0toV3kU86+E9j+yByKnRUdxVlGXocA454t/eVw0Vww/xeKY10oGUljEw==} - engines: {node: ^12.20.0 || ^14.14.0 || >=16.0.0} + /@netlify/framework-info/9.5.3: + resolution: {integrity: sha512-b4UMooyad0FBIhDqehlSRQ5/5y6SmEAmtdtpOi/ien1TaN+c80rknkrCHw2mlXaw+quRWweGfMNw8oALxjxmLQ==} + engines: {node: ^14.14.0 || >=16.0.0} dependencies: - ajv: 8.11.0 + ajv: 8.11.2 filter-obj: 3.0.0 + find-up: 6.3.0 + fs-extra: 10.1.0 is-plain-obj: 4.1.0 locate-path: 7.1.1 p-filter: 3.0.0 p-locate: 6.0.0 + process: 0.11.10 read-pkg-up: 9.1.0 - semver: 7.3.7 + semver: 7.3.8 + url: 0.11.0 dev: false - /@netlify/functions-utils/5.0.0_supports-color@9.2.2: - resolution: {integrity: sha512-gI54Bz3h7pNInt+1I2g3433AL00CYNz8T4fE4M+ZzCpYS4F0nawqQeHx18uO+QpUGjfPYArekqOSAgkJeyabTg==} + /@netlify/functions-utils/5.1.1_supports-color@9.2.2: + resolution: {integrity: sha512-e++/c7r1lM1CBQwBHXrELaLl06gtvvmlSmSNkzafsYgPGkLwPk7yaUOkjqnhi9xiDZAJiohm0ItglCR8YjP5Rw==} engines: {node: ^14.16.0 || >=16.0.0} dependencies: - '@netlify/zip-it-and-ship-it': 7.1.2_supports-color@9.2.2 + '@netlify/zip-it-and-ship-it': 8.2.0_supports-color@9.2.2 cpy: 8.1.2_supports-color@9.2.2 path-exists: 5.0.0 transitivePeerDependencies: @@ -1716,14 +2021,14 @@ packages: is-promise: 4.0.0 dev: false - /@netlify/git-utils/5.0.0: - resolution: {integrity: sha512-0HT1g7aH+dIUaZAfC317aq1LB5dnGnS6g3NUUrZxH2xPMwqUR2sdfUgczXNfgZbHUnTpMKNbkz4WmtcNb7ABlg==} + /@netlify/git-utils/5.1.0: + resolution: {integrity: sha512-/OGTTH8wtnTit7ZTL4tUFbys3+zL9I7h82K0nIoQDeGNf4LMbjqgC5TFEsMbK3K/WE/yK5c4V8mQS8BHARHQOQ==} engines: {node: ^14.16.0 || >=16.0.0} dependencies: execa: 6.1.0 map-obj: 5.0.2 micromatch: 4.0.5 - moize: 6.1.1 + moize: 6.1.4 path-exists: 5.0.0 dev: false @@ -1856,21 +2161,21 @@ packages: resolution: {integrity: sha512-1n9VvO/9qM7cRB5f7NgSNqeUrovM7j9WVAY7ZQ4LtQuXSquFmO9Fku7WrV3zAUC6v2Y62fxGyJ0fRllYz5uXLw==} dev: false - /@netlify/plugins-list/6.49.1: - resolution: {integrity: sha512-+4/v0IeSDSKInz2RuoemmqQXpqxff600Pr2sDhQ+dNaKCdIeeFstG6D9lKlHtztEmpKMmZa4dCUAkBMnd9vcjQ==} + /@netlify/plugins-list/6.61.0: + resolution: {integrity: sha512-76pkuMxDdRQcAKu5WXBl24fFCzjV8rQyBS2xh/xphAntPn57uLBtQYasncTzsgGjckWwDPjwoIkmxOzi3OeqFQ==} engines: {node: ^14.14.0 || >=16.0.0} dev: false - /@netlify/run-utils/5.0.0: - resolution: {integrity: sha512-OLUpiOA8TnMdPEQhoPYyv77vflTks3K36FRIHZENi+vf79/jXWmyGjNqv5WE0Wazj/tXrnA4JtLPhgXCyZhDNQ==} + /@netlify/run-utils/5.1.0: + resolution: {integrity: sha512-fHBXEW35QmKB2MiSRXVBZ4t29t+QhvTClUfXsxLHLEPkEi9tE9N+d55ycZha/b5U8Tc1ZeyzzDFjjnKk+XHWbA==} engines: {node: ^14.16.0 || >=16.0.0} dependencies: execa: 6.1.0 dev: false - /@netlify/zip-it-and-ship-it/7.1.2: - resolution: {integrity: sha512-WGCt5KDk5Zr+A0fhPGEgAAW2aNiGyLcZohBq4nu/4BoFtHkk+8vCZOH1lMytZiIFu0eAq00j2q4kdzyLFV0Wuw==} - engines: {node: ^12.20.0 || ^14.14.0 || >=16.0.0} + /@netlify/zip-it-and-ship-it/8.2.0: + resolution: {integrity: sha512-gaq+SnQB/VNCLPT1HfYbW1XmCRPG21d3ecOTyOf8ikDsGoypI4VaGVzjINVo8mu0uQWtRY+wWHcYeiQdN54GuQ==} + engines: {node: ^14.16.0 || >=16.0.0} hasBin: true dependencies: '@babel/parser': 7.16.8 @@ -1879,40 +2184,39 @@ packages: '@vercel/nft': 0.22.1 archiver: 5.3.1 common-path-prefix: 3.0.0 - cp-file: 9.1.0 - del: 6.1.1 + cp-file: 10.0.0 + del: 7.0.0 end-of-stream: 1.4.4 es-module-lexer: 1.0.1 - execa: 5.1.1 - filter-obj: 2.0.2 - find-up: 5.0.0 + execa: 6.1.0 + filter-obj: 5.1.0 + find-up: 6.3.0 glob: 8.0.3 is-builtin-module: 3.2.0 - is-path-inside: 3.0.3 - junk: 3.1.0 - locate-path: 6.0.0 + is-path-inside: 4.0.0 + junk: 4.0.0 + locate-path: 7.1.1 merge-options: 3.0.4 - minimatch: 5.1.0 + minimatch: 5.1.2 normalize-path: 3.0.0 - p-map: 4.0.0 - path-exists: 4.0.0 + p-map: 5.5.0 + path-exists: 5.0.0 precinct: 9.0.1 - read-package-json-fast: 2.0.3 require-package-name: 2.0.1 resolve: 2.0.0-next.4 - semver: 7.3.7 + semver: 7.3.8 tmp-promise: 3.0.3 toml: 3.0.0 unixify: 1.0.0 - yargs: 17.5.1 + yargs: 17.6.2 transitivePeerDependencies: - encoding - supports-color dev: false - /@netlify/zip-it-and-ship-it/7.1.2_supports-color@9.2.2: - resolution: {integrity: sha512-WGCt5KDk5Zr+A0fhPGEgAAW2aNiGyLcZohBq4nu/4BoFtHkk+8vCZOH1lMytZiIFu0eAq00j2q4kdzyLFV0Wuw==} - engines: {node: ^12.20.0 || ^14.14.0 || >=16.0.0} + /@netlify/zip-it-and-ship-it/8.2.0_supports-color@9.2.2: + resolution: {integrity: sha512-gaq+SnQB/VNCLPT1HfYbW1XmCRPG21d3ecOTyOf8ikDsGoypI4VaGVzjINVo8mu0uQWtRY+wWHcYeiQdN54GuQ==} + engines: {node: ^14.16.0 || >=16.0.0} hasBin: true dependencies: '@babel/parser': 7.16.8 @@ -1921,32 +2225,31 @@ packages: '@vercel/nft': 0.22.1_supports-color@9.2.2 archiver: 5.3.1 common-path-prefix: 3.0.0 - cp-file: 9.1.0 - del: 6.1.1 + cp-file: 10.0.0 + del: 7.0.0 end-of-stream: 1.4.4 es-module-lexer: 1.0.1 - execa: 5.1.1 - filter-obj: 2.0.2 - find-up: 5.0.0 + execa: 6.1.0 + filter-obj: 5.1.0 + find-up: 6.3.0 glob: 8.0.3 is-builtin-module: 3.2.0 - is-path-inside: 3.0.3 - junk: 3.1.0 - locate-path: 6.0.0 + is-path-inside: 4.0.0 + junk: 4.0.0 + locate-path: 7.1.1 merge-options: 3.0.4 - minimatch: 5.1.0 + minimatch: 5.1.2 normalize-path: 3.0.0 - p-map: 4.0.0 - path-exists: 4.0.0 + p-map: 5.5.0 + path-exists: 5.0.0 precinct: 9.0.1_supports-color@9.2.2 - read-package-json-fast: 2.0.3 require-package-name: 2.0.1 resolve: 2.0.0-next.4 - semver: 7.3.7 + semver: 7.3.8 tmp-promise: 3.0.3 toml: 3.0.0 unixify: 1.0.0 - yargs: 17.5.1 + yargs: 17.6.2 transitivePeerDependencies: - encoding - supports-color @@ -1973,14 +2276,27 @@ packages: engines: {node: '>= 8'} dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.13.0 + fastq: 1.14.0 + + /@npmcli/config/6.1.0: + resolution: {integrity: sha512-fPVlvy6MmSN0zgJU1TOD0fimnKVmcFpK3WuPyIQfNtCE+HMkFDN1mIKBKhUNow5QYHmCzMvGbu7pAgwdlSoaQA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + '@npmcli/map-workspaces': 3.0.1 + ini: 3.0.1 + nopt: 7.0.0 + proc-log: 3.0.0 + read-package-json-fast: 3.0.2 + semver: 7.3.8 + walk-up-path: 1.0.0 + dev: true /@npmcli/fs/2.1.2: resolution: {integrity: sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: '@gar/promisify': 1.1.3 - semver: 7.3.7 + semver: 7.3.8 dev: true /@npmcli/git/3.0.2: @@ -1988,13 +2304,13 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: '@npmcli/promise-spawn': 3.0.0 - lru-cache: 7.14.0 + lru-cache: 7.14.1 mkdirp: 1.0.4 npm-pick-manifest: 7.0.2 proc-log: 2.0.1 promise-inflight: 1.0.1 promise-retry: 2.0.1 - semver: 7.3.7 + semver: 7.3.8 which: 2.0.2 transitivePeerDependencies: - bluebird @@ -2009,14 +2325,30 @@ packages: npm-normalize-package-bin: 1.0.1 dev: true + /@npmcli/map-workspaces/3.0.1: + resolution: {integrity: sha512-QXwE2p5zRTP6X8Irgf/swYwwdQEalSA1GBm0IGE/86R5EJbUGgKMOP0kOjaJWJxaWPkSqyhM8N50SPxFHTfkNg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + '@npmcli/name-from-folder': 2.0.0 + glob: 8.0.3 + minimatch: 5.1.2 + read-package-json-fast: 3.0.2 + dev: true + /@npmcli/move-file/2.0.1: resolution: {integrity: sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This functionality has been moved to @npmcli/fs dependencies: mkdirp: 1.0.4 rimraf: 3.0.2 dev: true + /@npmcli/name-from-folder/2.0.0: + resolution: {integrity: sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + /@npmcli/node-gyp/2.0.0: resolution: {integrity: sha512-doNI35wIe3bBaEgrlPfdJPaCpUR89pJWep4Hq3aRdh6gKazIVWfs0jHttvSSoq47ZXgC7h73kDsUl8AoIQUB+A==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -2035,7 +2367,7 @@ packages: dependencies: '@npmcli/node-gyp': 2.0.0 '@npmcli/promise-spawn': 3.0.0 - node-gyp: 9.3.0 + node-gyp: 9.3.1 read-package-json-fast: 2.0.3 which: 2.0.2 transitivePeerDependencies: @@ -2159,6 +2491,21 @@ packages: '@octokit/openapi-types': 14.0.0 dev: false + /@pnpm/network.ca-file/1.0.2: + resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} + engines: {node: '>=12.22.0'} + dependencies: + graceful-fs: 4.2.10 + dev: false + + /@pnpm/npm-conf/1.0.5: + resolution: {integrity: sha512-hD8ml183638O3R6/Txrh0L8VzGOrFXgRtRDG4qQC4tONdZ5Z1M+tlUUDUvrjYdmK6G+JTBTeaCLMna11cXzi8A==} + engines: {node: '>=12'} + dependencies: + '@pnpm/network.ca-file': 1.0.2 + config-chain: 1.1.13 + dev: false + /@samverschueren/stream-to-observable/0.3.1_rxjs@6.6.7: resolution: {integrity: sha512-c/qwwcHyafOQuVQJj0IlBjf5yYgBI7YPJ77k4fOJYesb41jio65eaJODRUmfYKhTOFBrIZ66kgvGPlNbjuoRdQ==} engines: {node: '>=6'} @@ -2192,6 +2539,11 @@ packages: engines: {node: '>=10'} dev: false + /@sindresorhus/is/5.3.0: + resolution: {integrity: sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==} + engines: {node: '>=14.16'} + dev: false + /@sindresorhus/slugify/2.1.0: resolution: {integrity: sha512-gU3Gdm/V167BmUwIn8APHZ3SeeRVRUSOdXxnt7Q/JkUHLXaaTA/prYmoRumwsSitJZWUDYMzDWdWgrOdvE8IRQ==} engines: {node: '>=12'} @@ -2222,6 +2574,13 @@ packages: defer-to-connect: 2.0.1 dev: false + /@szmarczak/http-timer/5.0.1: + resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} + engines: {node: '>=14.16'} + dependencies: + defer-to-connect: 2.0.1 + dev: false + /@tootallnate/once/2.0.0: resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} engines: {node: '>= 10'} @@ -2243,13 +2602,13 @@ packages: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.35 - '@types/node': 18.8.5 + '@types/node': 18.11.18 dev: false /@types/bonjour/3.5.10: resolution: {integrity: sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==} dependencies: - '@types/node': 18.8.5 + '@types/node': 18.11.18 dev: false /@types/cacheable-request/6.0.2: @@ -2257,21 +2616,21 @@ packages: dependencies: '@types/http-cache-semantics': 4.0.1 '@types/keyv': 3.1.4 - '@types/node': 18.8.5 + '@types/node': 18.11.18 '@types/responselike': 1.0.0 dev: false /@types/connect-history-api-fallback/1.3.5: resolution: {integrity: sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==} dependencies: - '@types/express-serve-static-core': 4.17.30 - '@types/node': 18.8.5 + '@types/express-serve-static-core': 4.17.31 + '@types/node': 18.11.18 dev: false /@types/connect/3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 18.8.5 + '@types/node': 18.11.18 dev: false /@types/cookiejar/2.1.2: @@ -2287,7 +2646,7 @@ packages: /@types/decompress/4.2.4: resolution: {integrity: sha512-/C8kTMRTNiNuWGl5nEyKbPiMv6HA+0RbEXzFhFBEzASM6+oa4tJro9b8nj7eRlOFfuLdzUU+DS/GPDlvvzMOhA==} dependencies: - '@types/node': 18.8.5 + '@types/node': 18.11.18 dev: false /@types/download/8.0.1: @@ -2295,7 +2654,7 @@ packages: dependencies: '@types/decompress': 4.2.4 '@types/got': 8.3.6 - '@types/node': 18.8.5 + '@types/node': 18.11.18 dev: false /@types/eslint-scope/3.7.4: @@ -2316,19 +2675,19 @@ packages: resolution: {integrity: sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==} dev: false - /@types/express-serve-static-core/4.17.30: - resolution: {integrity: sha512-gstzbTWro2/nFed1WXtf+TtrpwxH7Ggs4RLYTLbeVgIkUQOI3WG/JKjgeOU1zXDvezllupjrf8OPIdvTbIaVOQ==} + /@types/express-serve-static-core/4.17.31: + resolution: {integrity: sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==} dependencies: - '@types/node': 18.8.5 + '@types/node': 18.11.18 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 dev: false - /@types/express/4.17.13: - resolution: {integrity: sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==} + /@types/express/4.17.15: + resolution: {integrity: sha512-Yv0k4bXGOH+8a+7bELd2PqHQsuiANB+A8a4gnQrkRWzrkKlb6KHaVvyXhqs04sVW/OWlbPyYxRgYlIXLfrufMQ==} dependencies: '@types/body-parser': 1.19.2 - '@types/express-serve-static-core': 4.17.30 + '@types/express-serve-static-core': 4.17.31 '@types/qs': 6.9.7 '@types/serve-static': 1.15.0 dev: false @@ -2336,20 +2695,20 @@ packages: /@types/fs-extra/9.0.13: resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} dependencies: - '@types/node': 18.8.5 + '@types/node': 18.11.18 dev: false /@types/glob/7.2.0: resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} dependencies: '@types/minimatch': 3.0.5 - '@types/node': 18.8.5 + '@types/node': 18.11.18 dev: false /@types/got/8.3.6: resolution: {integrity: sha512-nvLlj+831dhdm4LR2Ly+HTpdLyBaMynoOr6wpIxS19d/bPeHQxFU5XQ6Gp6ohBpxvCWZM1uHQIC2+ySRH1rGrQ==} dependencies: - '@types/node': 18.8.5 + '@types/node': 18.11.18 dev: false /@types/hash-sum/1.0.0: @@ -2367,7 +2726,7 @@ packages: /@types/http-proxy/1.17.9: resolution: {integrity: sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==} dependencies: - '@types/node': 18.8.5 + '@types/node': 18.11.18 dev: false /@types/istanbul-lib-coverage/2.0.4: @@ -2404,14 +2763,14 @@ packages: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} dev: true - /@types/katex/0.14.0: - resolution: {integrity: sha512-+2FW2CcT0K3P+JMR8YG846bmDwplKUTsWgT2ENwdQ1UdVfRk3GQrh6Mi4sTopy30gI8Uau5CEqHTDZ6YvWIUPA==} + /@types/katex/0.16.0: + resolution: {integrity: sha512-hz+S3nV6Mym5xPbT9fnO8dDhBFQguMYpY0Ipxv06JMi1ORgnEM4M1ymWDUhUNer3ElLmT583opRo4RzxKmh9jw==} dev: false /@types/keyv/3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 18.8.5 + '@types/node': 18.11.18 dev: false /@types/linkify-it/3.0.2: @@ -2445,10 +2804,6 @@ packages: resolution: {integrity: sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==} dev: false - /@types/mermaid/9.1.0: - resolution: {integrity: sha512-rc8QqhveKAY7PouzY/p8ljS+eBSNCv7o79L97RSub/Ic2SQ34ph1Ng3s8wFLWVjvaEt6RLOWtSCsgYWd95NY8A==} - dev: false - /@types/mime/3.0.0: resolution: {integrity: sha512-fccbsHKqFDXClBZTDLA43zl0+TbxyIwyzIzwwhvoJvhNjOErCdeX2xJbURimv2EbSVUGav001PaCJg4mZxMl4w==} dev: false @@ -2468,24 +2823,20 @@ packages: /@types/node-fetch/2.6.2: resolution: {integrity: sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==} dependencies: - '@types/node': 18.8.5 + '@types/node': 18.11.18 form-data: 3.0.1 dev: false - /@types/node/14.18.32: - resolution: {integrity: sha512-Y6S38pFr04yb13qqHf8uk1nHE3lXgQ30WZbv1mLliV9pt0NjvqdWttLcrOYLnXbOafknVYRHZGoMSpR9UwfYow==} + /@types/node/14.18.36: + resolution: {integrity: sha512-FXKWbsJ6a1hIrRxv+FoukuHnGTgEzKYGi7kilfMae96AL9UNkPFNWJEEYWzdRI9ooIkbr4AKldyuSTLql06vLQ==} dev: true /@types/node/17.0.45: resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} dev: false - /@types/node/18.8.0: - resolution: {integrity: sha512-u+h43R6U8xXDt2vzUaVP3VwjjLyOJk6uEciZS8OSyziUQGOwmk+l+4drxcsDboHXwyTaqS1INebghmWMRxq3LA==} - dev: true - - /@types/node/18.8.5: - resolution: {integrity: sha512-Bq7G3AErwe5A/Zki5fdD3O6+0zDChhg671NfPjtIcbtzDNZTv4NPKMRFr7gtYPG7y+B8uTiNK4Ngd9T0FTar6Q==} + /@types/node/18.11.18: + resolution: {integrity: sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==} /@types/normalize-package-data/2.4.1: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} @@ -2504,7 +2855,7 @@ packages: /@types/responselike/1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} dependencies: - '@types/node': 18.8.5 + '@types/node': 18.11.18 dev: false /@types/retry/0.12.0: @@ -2518,45 +2869,44 @@ packages: /@types/sax/1.2.4: resolution: {integrity: sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw==} dependencies: - '@types/node': 18.8.5 + '@types/node': 18.11.18 dev: false - /@types/semver/7.3.10: - resolution: {integrity: sha512-zsv3fsC7S84NN6nPK06u79oWgrPVd0NvOyqgghV1haPaFcVxIrP4DLomRwGAXk0ui4HZA7mOcSFL98sMVW9viw==} - dev: false + /@types/semver/7.3.13: + resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} /@types/serve-index/1.9.1: resolution: {integrity: sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==} dependencies: - '@types/express': 4.17.13 + '@types/express': 4.17.15 dev: false /@types/serve-static/1.15.0: resolution: {integrity: sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==} dependencies: '@types/mime': 3.0.0 - '@types/node': 18.8.5 + '@types/node': 18.11.18 dev: false /@types/sockjs/0.3.33: resolution: {integrity: sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==} dependencies: - '@types/node': 18.8.5 + '@types/node': 18.11.18 dev: false /@types/superagent/4.1.15: resolution: {integrity: sha512-mu/N4uvfDN2zVQQ5AYJI/g4qxn2bHB6521t1UuH09ShNWjebTqN0ZFuYK9uYjcgmI0dTQEs+Owi1EO6U0OkOZQ==} dependencies: '@types/cookiejar': 2.1.2 - '@types/node': 18.8.5 + '@types/node': 18.11.18 dev: false /@types/trusted-types/2.0.2: resolution: {integrity: sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==} dev: false - /@types/web-bluetooth/0.0.15: - resolution: {integrity: sha512-w7hEHXnPMEZ+4nGKl/KDRVpxkwYxYExuHOYXyzIzCDzEZ9ZCGMAewulr9IqJu2LR4N37fcnb1XVeuZ09qgOxhA==} + /@types/web-bluetooth/0.0.16: + resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==} dev: false /@types/webpack-env/1.18.0: @@ -2565,13 +2915,13 @@ packages: /@types/ws/7.4.7: resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} dependencies: - '@types/node': 18.8.5 + '@types/node': 18.11.18 dev: false /@types/ws/8.5.3: resolution: {integrity: sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==} dependencies: - '@types/node': 18.8.5 + '@types/node': 18.11.18 dev: false /@types/yargs-parser/21.0.0: @@ -2590,8 +2940,8 @@ packages: '@types/yargs-parser': 21.0.0 dev: false - /@typescript-eslint/eslint-plugin/5.40.0_25sstg4uu2sk4pm7xcyzuov7xq: - resolution: {integrity: sha512-FIBZgS3DVJgqPwJzvZTuH4HNsZhHMa9SjxTKAZTlMsPw/UzpEjcf9f4dfgDJEHjK+HboUJo123Eshl6niwEm/Q==} + /@typescript-eslint/eslint-plugin/5.47.1_txmweb6yn7coi7nfrp22gpyqmy: + resolution: {integrity: sha512-r4RZ2Jl9kcQN7K/dcOT+J7NAimbiis4sSM9spvWimsBvDegMhKLA5vri2jG19PmIPbDjPeWzfUPQ2hjEzA4Nmg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: '@typescript-eslint/parser': ^5.0.0 @@ -2601,23 +2951,24 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.40.0_z4bbprzjrhnsfa24uvmcbu7f5q - '@typescript-eslint/scope-manager': 5.40.0 - '@typescript-eslint/type-utils': 5.40.0_z4bbprzjrhnsfa24uvmcbu7f5q - '@typescript-eslint/utils': 5.40.0_z4bbprzjrhnsfa24uvmcbu7f5q + '@typescript-eslint/parser': 5.47.1_lzzuuodtsqwxnvqeq4g4likcqa + '@typescript-eslint/scope-manager': 5.47.1 + '@typescript-eslint/type-utils': 5.47.1_lzzuuodtsqwxnvqeq4g4likcqa + '@typescript-eslint/utils': 5.47.1_lzzuuodtsqwxnvqeq4g4likcqa debug: 4.3.4 - eslint: 8.25.0 - ignore: 5.2.0 + eslint: 8.30.0 + ignore: 5.2.4 + natural-compare-lite: 1.4.0 regexpp: 3.2.0 - semver: 7.3.7 - tsutils: 3.21.0_typescript@4.8.4 - typescript: 4.8.4 + semver: 7.3.8 + tsutils: 3.21.0_typescript@4.9.4 + typescript: 4.9.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser/5.40.0_z4bbprzjrhnsfa24uvmcbu7f5q: - resolution: {integrity: sha512-Ah5gqyX2ySkiuYeOIDg7ap51/b63QgWZA7w6AHtFrag7aH0lRQPbLzUjk0c9o5/KZ6JRkTTDKShL4AUrQa6/hw==} + /@typescript-eslint/parser/5.47.1_lzzuuodtsqwxnvqeq4g4likcqa: + resolution: {integrity: sha512-9Vb+KIv29r6GPu4EboWOnQM7T+UjpjXvjCPhNORlgm40a9Ia9bvaPJswvtae1gip2QEeVeGh6YquqAzEgoRAlw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -2626,26 +2977,26 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 5.40.0 - '@typescript-eslint/types': 5.40.0 - '@typescript-eslint/typescript-estree': 5.40.0_typescript@4.8.4 + '@typescript-eslint/scope-manager': 5.47.1 + '@typescript-eslint/types': 5.47.1 + '@typescript-eslint/typescript-estree': 5.47.1_typescript@4.9.4 debug: 4.3.4 - eslint: 8.25.0 - typescript: 4.8.4 + eslint: 8.30.0 + typescript: 4.9.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/scope-manager/5.40.0: - resolution: {integrity: sha512-d3nPmjUeZtEWRvyReMI4I1MwPGC63E8pDoHy0BnrYjnJgilBD3hv7XOiETKLY/zTwI7kCnBDf2vWTRUVpYw0Uw==} + /@typescript-eslint/scope-manager/5.47.1: + resolution: {integrity: sha512-9hsFDsgUwrdOoW1D97Ewog7DYSHaq4WKuNs0LHF9RiCmqB0Z+XRR4Pf7u7u9z/8CciHuJ6yxNws1XznI3ddjEw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.40.0 - '@typescript-eslint/visitor-keys': 5.40.0 + '@typescript-eslint/types': 5.47.1 + '@typescript-eslint/visitor-keys': 5.47.1 dev: true - /@typescript-eslint/type-utils/5.40.0_z4bbprzjrhnsfa24uvmcbu7f5q: - resolution: {integrity: sha512-nfuSdKEZY2TpnPz5covjJqav+g5qeBqwSHKBvz7Vm1SAfy93SwKk/JeSTymruDGItTwNijSsno5LhOHRS1pcfw==} + /@typescript-eslint/type-utils/5.47.1_lzzuuodtsqwxnvqeq4g4likcqa: + resolution: {integrity: sha512-/UKOeo8ee80A7/GJA427oIrBi/Gd4osk/3auBUg4Rn9EahFpevVV1mUK8hjyQD5lHPqX397x6CwOk5WGh1E/1w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: '*' @@ -2654,22 +3005,22 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 5.40.0_typescript@4.8.4 - '@typescript-eslint/utils': 5.40.0_z4bbprzjrhnsfa24uvmcbu7f5q + '@typescript-eslint/typescript-estree': 5.47.1_typescript@4.9.4 + '@typescript-eslint/utils': 5.47.1_lzzuuodtsqwxnvqeq4g4likcqa debug: 4.3.4 - eslint: 8.25.0 - tsutils: 3.21.0_typescript@4.8.4 - typescript: 4.8.4 + eslint: 8.30.0 + tsutils: 3.21.0_typescript@4.9.4 + typescript: 4.9.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/types/5.40.0: - resolution: {integrity: sha512-V1KdQRTXsYpf1Y1fXCeZ+uhjW48Niiw0VGt4V8yzuaDTU8Z1Xl7yQDyQNqyAFcVhpYXIVCEuxSIWTsLDpHgTbw==} + /@typescript-eslint/types/5.47.1: + resolution: {integrity: sha512-CmALY9YWXEpwuu6377ybJBZdtSAnzXLSQcxLSqSQSbC7VfpMu/HLVdrnVJj7ycI138EHqocW02LPJErE35cE9A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - /@typescript-eslint/typescript-estree/5.40.0_typescript@4.8.4: - resolution: {integrity: sha512-b0GYlDj8TLTOqwX7EGbw2gL5EXS2CPEWhF9nGJiGmEcmlpNBjyHsTwbqpyIEPVpl6br4UcBOYlcI2FJVtJkYhg==} + /@typescript-eslint/typescript-estree/5.47.1_typescript@4.9.4: + resolution: {integrity: sha512-4+ZhFSuISAvRi2xUszEj0xXbNTHceV9GbH9S8oAD2a/F9SW57aJNQVOCxG8GPfSWH/X4eOPdMEU2jYVuWKEpWA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: typescript: '*' @@ -2677,19 +3028,19 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 5.40.0 - '@typescript-eslint/visitor-keys': 5.40.0 + '@typescript-eslint/types': 5.47.1 + '@typescript-eslint/visitor-keys': 5.47.1 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.3.7 - tsutils: 3.21.0_typescript@4.8.4 - typescript: 4.8.4 + semver: 7.3.8 + tsutils: 3.21.0_typescript@4.9.4 + typescript: 4.9.4 transitivePeerDependencies: - supports-color - /@typescript-eslint/typescript-estree/5.40.0_xdmo64ntgiljjfyvpcolhvypxi: - resolution: {integrity: sha512-b0GYlDj8TLTOqwX7EGbw2gL5EXS2CPEWhF9nGJiGmEcmlpNBjyHsTwbqpyIEPVpl6br4UcBOYlcI2FJVtJkYhg==} + /@typescript-eslint/typescript-estree/5.47.1_w6zgx7jig4ppjo57goygyg47o4: + resolution: {integrity: sha512-4+ZhFSuISAvRi2xUszEj0xXbNTHceV9GbH9S8oAD2a/F9SW57aJNQVOCxG8GPfSWH/X4eOPdMEU2jYVuWKEpWA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: typescript: '*' @@ -2697,42 +3048,43 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 5.40.0 - '@typescript-eslint/visitor-keys': 5.40.0 + '@typescript-eslint/types': 5.47.1 + '@typescript-eslint/visitor-keys': 5.47.1 debug: 4.3.4_supports-color@9.2.2 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.3.7 - tsutils: 3.21.0_typescript@4.8.4 - typescript: 4.8.4 + semver: 7.3.8 + tsutils: 3.21.0_typescript@4.9.4 + typescript: 4.9.4 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/utils/5.40.0_z4bbprzjrhnsfa24uvmcbu7f5q: - resolution: {integrity: sha512-MO0y3T5BQ5+tkkuYZJBjePewsY+cQnfkYeRqS6tPh28niiIwPnQ1t59CSRcs1ZwJJNOdWw7rv9pF8aP58IMihA==} + /@typescript-eslint/utils/5.47.1_lzzuuodtsqwxnvqeq4g4likcqa: + resolution: {integrity: sha512-l90SdwqfmkuIVaREZ2ykEfCezepCLxzWMo5gVfcJsJCaT4jHT+QjgSkYhs5BMQmWqE9k3AtIfk4g211z/sTMVw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: '@types/json-schema': 7.0.11 - '@typescript-eslint/scope-manager': 5.40.0 - '@typescript-eslint/types': 5.40.0 - '@typescript-eslint/typescript-estree': 5.40.0_typescript@4.8.4 - eslint: 8.25.0 + '@types/semver': 7.3.13 + '@typescript-eslint/scope-manager': 5.47.1 + '@typescript-eslint/types': 5.47.1 + '@typescript-eslint/typescript-estree': 5.47.1_typescript@4.9.4 + eslint: 8.30.0 eslint-scope: 5.1.1 - eslint-utils: 3.0.0_eslint@8.25.0 - semver: 7.3.7 + eslint-utils: 3.0.0_eslint@8.30.0 + semver: 7.3.8 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/visitor-keys/5.40.0: - resolution: {integrity: sha512-ijJ+6yig+x9XplEpG2K6FUdJeQGGj/15U3S56W9IqXKJqleuD7zJ2AX/miLezwxpd7ZxDAqO87zWufKg+RPZyQ==} + /@typescript-eslint/visitor-keys/5.47.1: + resolution: {integrity: sha512-rF3pmut2JCCjh6BLRhNKdYjULMb1brvoaiWDlHfLNVgmnZ0sBVJrs3SyaKE1XoDDnJuAx/hDQryHYmPUuNq0ig==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.40.0 + '@typescript-eslint/types': 5.47.1 eslint-visitor-keys: 3.3.0 /@vercel/nft/0.22.1: @@ -2740,7 +3092,7 @@ packages: hasBin: true dependencies: '@mapbox/node-pre-gyp': 1.0.9 - acorn: 8.8.0 + acorn: 8.8.1 async-sema: 3.1.1 bindings: 1.5.0 estree-walker: 2.0.2 @@ -2760,7 +3112,7 @@ packages: hasBin: true dependencies: '@mapbox/node-pre-gyp': 1.0.9_supports-color@9.2.2 - acorn: 8.8.0 + acorn: 8.8.1 async-sema: 3.1.1 bindings: 1.5.0 estree-walker: 2.0.2 @@ -2775,169 +3127,170 @@ packages: - supports-color dev: false - /@vitejs/plugin-vue/3.1.2_vite@3.0.9+vue@3.2.41: - resolution: {integrity: sha512-3zxKNlvA3oNaKDYX0NBclgxTQ1xaFdL7PzwF6zj9tGFziKwmBa3Q/6XcJQxudlT81WxDjEhHmevvIC4Orc1LhQ==} + /@vitejs/plugin-vue/4.0.0_vite@4.0.3+vue@3.2.45: + resolution: {integrity: sha512-e0X4jErIxAB5oLtDqbHvHpJe/uWNkdpYV83AOG2xo2tEVSzCzewgJMtREZM30wXnM5ls90hxiOtAuVU6H5JgbA==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: - vite: ^3.0.0 + vite: ^4.0.0 vue: ^3.2.25 dependencies: - vite: 3.0.9_sass@1.55.0 - vue: 3.2.41 + vite: 4.0.3_sass@1.57.1 + vue: 3.2.45 dev: false - /@vue/compiler-core/3.2.41: - resolution: {integrity: sha512-oA4mH6SA78DT+96/nsi4p9DX97PHcNROxs51lYk7gb9Z4BPKQ3Mh+BLn6CQZBw857Iuhu28BfMSRHAlPvD4vlw==} + /@vue/compiler-core/3.2.45: + resolution: {integrity: sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A==} dependencies: - '@babel/parser': 7.18.10 - '@vue/shared': 3.2.41 + '@babel/parser': 7.20.7 + '@vue/shared': 3.2.45 estree-walker: 2.0.2 source-map: 0.6.1 dev: false - /@vue/compiler-dom/3.2.41: - resolution: {integrity: sha512-xe5TbbIsonjENxJsYRbDJvthzqxLNk+tb3d/c47zgREDa/PCp6/Y4gC/skM4H6PIuX5DAxm7fFJdbjjUH2QTMw==} + /@vue/compiler-dom/3.2.45: + resolution: {integrity: sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw==} dependencies: - '@vue/compiler-core': 3.2.41 - '@vue/shared': 3.2.41 + '@vue/compiler-core': 3.2.45 + '@vue/shared': 3.2.45 dev: false - /@vue/compiler-sfc/3.2.41: - resolution: {integrity: sha512-+1P2m5kxOeaxVmJNXnBskAn3BenbTmbxBxWOtBq3mQTCokIreuMULFantBUclP0+KnzNCMOvcnKinqQZmiOF8w==} + /@vue/compiler-sfc/3.2.45: + resolution: {integrity: sha512-1jXDuWah1ggsnSAOGsec8cFjT/K6TMZ0sPL3o3d84Ft2AYZi2jWJgRMjw4iaK0rBfA89L5gw427H4n1RZQBu6Q==} dependencies: - '@babel/parser': 7.18.10 - '@vue/compiler-core': 3.2.41 - '@vue/compiler-dom': 3.2.41 - '@vue/compiler-ssr': 3.2.41 - '@vue/reactivity-transform': 3.2.41 - '@vue/shared': 3.2.41 + '@babel/parser': 7.20.7 + '@vue/compiler-core': 3.2.45 + '@vue/compiler-dom': 3.2.45 + '@vue/compiler-ssr': 3.2.45 + '@vue/reactivity-transform': 3.2.45 + '@vue/shared': 3.2.45 estree-walker: 2.0.2 magic-string: 0.25.9 - postcss: 8.4.18 + postcss: 8.4.20 source-map: 0.6.1 dev: false - /@vue/compiler-ssr/3.2.41: - resolution: {integrity: sha512-Y5wPiNIiaMz/sps8+DmhaKfDm1xgj6GrH99z4gq2LQenfVQcYXmHIOBcs5qPwl7jaW3SUQWjkAPKMfQemEQZwQ==} + /@vue/compiler-ssr/3.2.45: + resolution: {integrity: sha512-6BRaggEGqhWht3lt24CrIbQSRD5O07MTmd+LjAn5fJj568+R9eUD2F7wMQJjX859seSlrYog7sUtrZSd7feqrQ==} dependencies: - '@vue/compiler-dom': 3.2.41 - '@vue/shared': 3.2.41 - dev: false - - /@vue/devtools-api/6.2.1: - resolution: {integrity: sha512-OEgAMeQXvCoJ+1x8WyQuVZzFo0wcyCmUR3baRVLmKBo1LmYZWMlRiXlux5jd0fqVJu6PfDbOrZItVqUEzLobeQ==} + '@vue/compiler-dom': 3.2.45 + '@vue/shared': 3.2.45 dev: false /@vue/devtools-api/6.4.5: resolution: {integrity: sha512-JD5fcdIuFxU4fQyXUu3w2KpAJHzTVdN+p4iOX2lMWSHMOoQdMAcpFLZzm9Z/2nmsoZ1a96QEhZ26e50xLBsgOQ==} dev: false - /@vue/reactivity-transform/3.2.41: - resolution: {integrity: sha512-mK5+BNMsL4hHi+IR3Ft/ho6Za+L3FA5j8WvreJ7XzHrqkPq8jtF/SMo7tuc9gHjLDwKZX1nP1JQOKo9IEAn54A==} + /@vue/reactivity-transform/3.2.45: + resolution: {integrity: sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ==} dependencies: - '@babel/parser': 7.18.10 - '@vue/compiler-core': 3.2.41 - '@vue/shared': 3.2.41 + '@babel/parser': 7.20.7 + '@vue/compiler-core': 3.2.45 + '@vue/shared': 3.2.45 estree-walker: 2.0.2 magic-string: 0.25.9 dev: false - /@vue/reactivity/3.2.41: - resolution: {integrity: sha512-9JvCnlj8uc5xRiQGZ28MKGjuCoPhhTwcoAdv3o31+cfGgonwdPNuvqAXLhlzu4zwqavFEG5tvaoINQEfxz+l6g==} + /@vue/reactivity/3.2.45: + resolution: {integrity: sha512-PRvhCcQcyEVohW0P8iQ7HDcIOXRjZfAsOds3N99X/Dzewy8TVhTCT4uXpAHfoKjVTJRA0O0K+6QNkDIZAxNi3A==} dependencies: - '@vue/shared': 3.2.41 + '@vue/shared': 3.2.45 dev: false - /@vue/repl/1.3.2_vue@3.2.41: + /@vue/repl/1.3.2_vue@3.2.45: resolution: {integrity: sha512-5joGOuTFmjaugG3E1h/oP1EXSMcVXRUwLIoo8xvYQnqDrCT6g1SfsH1pfei5PpC5DUxMX1584CekZu6REgGYkQ==} peerDependencies: vue: ^3.2.13 dependencies: - vue: 3.2.41 + vue: 3.2.45 dev: false - /@vue/runtime-core/3.2.41: - resolution: {integrity: sha512-0LBBRwqnI0p4FgIkO9q2aJBBTKDSjzhnxrxHYengkAF6dMOjeAIZFDADAlcf2h3GDALWnblbeprYYpItiulSVQ==} + /@vue/runtime-core/3.2.45: + resolution: {integrity: sha512-gzJiTA3f74cgARptqzYswmoQx0fIA+gGYBfokYVhF8YSXjWTUA2SngRzZRku2HbGbjzB6LBYSbKGIaK8IW+s0A==} dependencies: - '@vue/reactivity': 3.2.41 - '@vue/shared': 3.2.41 + '@vue/reactivity': 3.2.45 + '@vue/shared': 3.2.45 dev: false - /@vue/runtime-dom/3.2.41: - resolution: {integrity: sha512-U7zYuR1NVIP8BL6jmOqmapRAHovEFp7CSw4pR2FacqewXNGqZaRfHoNLQsqQvVQ8yuZNZtxSZy0FFyC70YXPpA==} + /@vue/runtime-dom/3.2.45: + resolution: {integrity: sha512-cy88YpfP5Ue2bDBbj75Cb4bIEZUMM/mAkDMfqDTpUYVgTf/kuQ2VQ8LebuZ8k6EudgH8pYhsGWHlY0lcxlvTwA==} dependencies: - '@vue/runtime-core': 3.2.41 - '@vue/shared': 3.2.41 + '@vue/runtime-core': 3.2.45 + '@vue/shared': 3.2.45 csstype: 2.6.20 dev: false - /@vue/server-renderer/3.2.41_vue@3.2.41: - resolution: {integrity: sha512-7YHLkfJdTlsZTV0ae5sPwl9Gn/EGr2hrlbcS/8naXm2CDpnKUwC68i1wGlrYAfIgYWL7vUZwk2GkYLQH5CvFig==} + /@vue/server-renderer/3.2.45_vue@3.2.45: + resolution: {integrity: sha512-ebiMq7q24WBU1D6uhPK//2OTR1iRIyxjF5iVq/1a5I1SDMDyDu4Ts6fJaMnjrvD3MqnaiFkKQj+LKAgz5WIK3g==} peerDependencies: - vue: 3.2.41 + vue: 3.2.45 dependencies: - '@vue/compiler-ssr': 3.2.41 - '@vue/shared': 3.2.41 - vue: 3.2.41 + '@vue/compiler-ssr': 3.2.45 + '@vue/shared': 3.2.45 + vue: 3.2.45 dev: false - /@vue/shared/3.2.41: - resolution: {integrity: sha512-W9mfWLHmJhkfAmV+7gDjcHeAWALQtgGT3JErxULl0oz6R6+3ug91I7IErs93eCFhPCZPHBs4QJS7YWEV7A3sxw==} + /@vue/shared/3.2.45: + resolution: {integrity: sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==} dev: false - /@vuepress/bundler-vite/2.0.0-beta.51_sass@1.55.0: - resolution: {integrity: sha512-HADQujwuj0KbONq6R0UGSiktMzG0iOFmI2OACgi7r5P4pHAEF06h333g0q4tSH6HQg6VuqelQrVgWwq/0puIfA==} + /@vuepress/bundler-vite/2.0.0-beta.60_sass@1.57.1: + resolution: {integrity: sha512-nf+UAKNlAEZXZqu2Ztvr8Hg/5CtevWxvQGfYKV4lhw8UmoDjKKHoHPpPhF1QTUbnZ8W+jPLzIVz+hjunzsxl/A==} dependencies: - '@vitejs/plugin-vue': 3.1.2_vite@3.0.9+vue@3.2.41 - '@vuepress/client': 2.0.0-beta.51 - '@vuepress/core': 2.0.0-beta.51 - '@vuepress/shared': 2.0.0-beta.51 - '@vuepress/utils': 2.0.0-beta.51 - autoprefixer: 10.4.8_postcss@8.4.18 + '@vitejs/plugin-vue': 4.0.0_vite@4.0.3+vue@3.2.45 + '@vuepress/client': 2.0.0-beta.60 + '@vuepress/core': 2.0.0-beta.60 + '@vuepress/shared': 2.0.0-beta.60 + '@vuepress/utils': 2.0.0-beta.60 + autoprefixer: 10.4.13_postcss@8.4.20 connect-history-api-fallback: 2.0.0 - postcss: 8.4.18 - rollup: 2.78.1 - vite: 3.0.9_sass@1.55.0 - vue: 3.2.41 - vue-router: 4.1.5_vue@3.2.41 + postcss: 8.4.20 + postcss-load-config: 4.0.1_postcss@8.4.20 + rollup: 3.9.0 + vite: 4.0.3_sass@1.57.1 + vue: 3.2.45 + vue-router: 4.1.6_vue@3.2.45 transitivePeerDependencies: + - '@types/node' - less - sass - stylus + - sugarss - supports-color - terser + - ts-node dev: false - /@vuepress/bundler-webpack/2.0.0-beta.51: - resolution: {integrity: sha512-ell4t2sNiGxtSZGk0m6ygapmrte5RKGEubW0D7qskYvmmCbwvB/g/orIjIVfU2aZSVA1QbuPspQ/N0KMCIzxPg==} + /@vuepress/bundler-webpack/2.0.0-beta.60: + resolution: {integrity: sha512-vHqRha7Dw3kktorC6s/dyeysf1tdYg01PiBzWP16e1UWejVr54O9HiqK0hG8fr469DYKIk5kHPwB1r5yu4hyqQ==} dependencies: - '@types/express': 4.17.13 + '@types/express': 4.17.15 '@types/webpack-env': 1.18.0 - '@vuepress/client': 2.0.0-beta.51 - '@vuepress/core': 2.0.0-beta.51 - '@vuepress/shared': 2.0.0-beta.51 - '@vuepress/utils': 2.0.0-beta.51 - autoprefixer: 10.4.8_postcss@8.4.18 + '@vuepress/client': 2.0.0-beta.60 + '@vuepress/core': 2.0.0-beta.60 + '@vuepress/shared': 2.0.0-beta.60 + '@vuepress/utils': 2.0.0-beta.60 + autoprefixer: 10.4.13_postcss@8.4.20 chokidar: 3.5.3 - copy-webpack-plugin: 11.0.0_webpack@5.74.0 - css-loader: 6.7.1_webpack@5.74.0 - esbuild-loader: 2.19.0_webpack@5.74.0 - express: 4.18.1 - html-webpack-plugin: 5.5.0_webpack@5.74.0 - mini-css-extract-plugin: 2.6.1_webpack@5.74.0 - postcss: 8.4.18 - postcss-csso: 6.0.1_postcss@8.4.18 - postcss-loader: 7.0.1_igyeriywjd4lwzfk4socqbj2qi - style-loader: 3.3.1_webpack@5.74.0 - vue: 3.2.41 - vue-loader: 17.0.0_webpack@5.74.0 - vue-router: 4.1.5_vue@3.2.41 - webpack: 5.74.0 + copy-webpack-plugin: 11.0.0_webpack@5.75.0 + css-loader: 6.7.3_webpack@5.75.0 + esbuild-loader: 2.20.0_webpack@5.75.0 + express: 4.18.2 + html-webpack-plugin: 5.5.0_webpack@5.75.0 + mini-css-extract-plugin: 2.7.2_webpack@5.75.0 + postcss: 8.4.20 + postcss-csso: 6.0.1_postcss@8.4.20 + postcss-loader: 7.0.2_qxxfhhrl3yknjjmta266mo3u64 + style-loader: 3.3.1_webpack@5.75.0 + vue: 3.2.45 + vue-loader: 17.0.1_vue@3.2.45+webpack@5.75.0 + vue-router: 4.1.6_vue@3.2.45 + webpack: 5.75.0 webpack-chain: 6.5.1 - webpack-dev-server: 4.11.1_webpack@5.74.0 + webpack-dev-server: 4.11.1_webpack@5.75.0 webpack-merge: 5.8.0 transitivePeerDependencies: - '@swc/core' + - '@vue/compiler-sfc' - bufferutil - debug - esbuild @@ -2947,105 +3300,105 @@ packages: - webpack-cli dev: false - /@vuepress/cli/2.0.0-beta.51: - resolution: {integrity: sha512-NcMNpsGxdlPgrHhIMW+hkRd9l+E+89M8IoN9SnBJFTgokKrUOwLm2BEQPVuucebj4ff94IorG1WQR9iah/qOgQ==} + /@vuepress/cli/2.0.0-beta.60: + resolution: {integrity: sha512-ibC6ezsn1m+r3PB382ZZfmwBFlkR/9LVk5u2cUBmhBj4t+W2XPgWkKTTmG81ny7lnUJweloQc9fa1ww77se2Ug==} hasBin: true dependencies: - '@vuepress/core': 2.0.0-beta.51 - '@vuepress/shared': 2.0.0-beta.51 - '@vuepress/utils': 2.0.0-beta.51 - cac: 6.7.12 + '@vuepress/core': 2.0.0-beta.60 + '@vuepress/shared': 2.0.0-beta.60 + '@vuepress/utils': 2.0.0-beta.60 + cac: 6.7.14 chokidar: 3.5.3 envinfo: 7.8.1 - esbuild: 0.15.11 + esbuild: 0.16.12 transitivePeerDependencies: - supports-color dev: false - /@vuepress/client/2.0.0-beta.51: - resolution: {integrity: sha512-5iQV765kwR6/eIZPMlV5O34DUvHCMjF7zpr91x5i8BEAg7A0jfHvdrwNavAKWiQEU77f4dIBXtWy6nwX+lgmbw==} + /@vuepress/client/2.0.0-beta.60: + resolution: {integrity: sha512-WU5VGeDp41A2dVXqp18YBggflIjTq68mA+s5TCz93wk+7elAmPAkWKcobQBYQgvsuwHyg9nWulZAfMN6OEygKQ==} dependencies: '@vue/devtools-api': 6.4.5 - '@vuepress/shared': 2.0.0-beta.51 - vue: 3.2.41 - vue-router: 4.1.5_vue@3.2.41 + '@vuepress/shared': 2.0.0-beta.60 + vue: 3.2.45 + vue-router: 4.1.6_vue@3.2.45 dev: false - /@vuepress/core/2.0.0-beta.51: - resolution: {integrity: sha512-j0KI6PBsf0doMZPXa1H4Vi88NSTrpsnSVhMgcr9gw81atgKl+I13SykHpWZRRkugTRCgL1IOpyY68cond58eeA==} + /@vuepress/core/2.0.0-beta.60: + resolution: {integrity: sha512-HkUkqBnBI7GMVZGxdzV4C/iyFwPo215sVLYvZVEWpQIaLk/47WkK0sHtz/1i00ujwJC3uGOH1+f0IHkxzqjUmg==} dependencies: - '@vuepress/client': 2.0.0-beta.51 - '@vuepress/markdown': 2.0.0-beta.51 - '@vuepress/shared': 2.0.0-beta.51 - '@vuepress/utils': 2.0.0-beta.51 - vue: 3.2.41 + '@vuepress/client': 2.0.0-beta.60 + '@vuepress/markdown': 2.0.0-beta.60 + '@vuepress/shared': 2.0.0-beta.60 + '@vuepress/utils': 2.0.0-beta.60 + vue: 3.2.45 transitivePeerDependencies: - supports-color dev: false - /@vuepress/markdown/2.0.0-beta.51: - resolution: {integrity: sha512-q11+6j3OAutuV0LkH7BGdhh4jKOMKMiiX8bKD366mzr7JkjHb34xd+WhM394B7zh410CtYYWvAWS+m9RJGQ/5w==} + /@vuepress/markdown/2.0.0-beta.60: + resolution: {integrity: sha512-97AT4aZr1k1VrJZoUvzbrX6nU/TwxlFpLNi8KNtWK3TMZT6+hAU0aCg6TwuwirShvey8mr9GaMNSssAdpSK4mg==} dependencies: - '@mdit-vue/plugin-component': 0.10.0 - '@mdit-vue/plugin-frontmatter': 0.10.0 - '@mdit-vue/plugin-headers': 0.10.0 - '@mdit-vue/plugin-sfc': 0.10.0 - '@mdit-vue/plugin-title': 0.10.0 - '@mdit-vue/plugin-toc': 0.10.0 - '@mdit-vue/shared': 0.10.0 - '@mdit-vue/types': 0.10.0 + '@mdit-vue/plugin-component': 0.11.2 + '@mdit-vue/plugin-frontmatter': 0.11.1 + '@mdit-vue/plugin-headers': 0.11.2 + '@mdit-vue/plugin-sfc': 0.11.1 + '@mdit-vue/plugin-title': 0.11.2 + '@mdit-vue/plugin-toc': 0.11.2 + '@mdit-vue/shared': 0.11.2 + '@mdit-vue/types': 0.11.0 '@types/markdown-it': 12.2.3 '@types/markdown-it-emoji': 2.0.2 - '@vuepress/shared': 2.0.0-beta.51 - '@vuepress/utils': 2.0.0-beta.51 + '@vuepress/shared': 2.0.0-beta.60 + '@vuepress/utils': 2.0.0-beta.60 markdown-it: 13.0.1 - markdown-it-anchor: 8.6.4_ea7kj7wzjkld5jo2noyjqxi764 + markdown-it-anchor: 8.6.6_ea7kj7wzjkld5jo2noyjqxi764 markdown-it-emoji: 2.0.2 mdurl: 1.0.1 transitivePeerDependencies: - supports-color dev: false - /@vuepress/plugin-active-header-links/2.0.0-beta.51: - resolution: {integrity: sha512-AV9qLVSD3e9Xnp+2Vu9tegUdzbm9HD2bF6pRC3xEdW8GzRlsHBTfMpFwfsKvkKofk90+4ICkPWY9mY95P4mNSw==} + /@vuepress/plugin-active-header-links/2.0.0-beta.60: + resolution: {integrity: sha512-L+KijW7FvoDWMTd6wiIZhMA/uZYgMhiukL6IaVWtQ0COyWGIjaZUlX+mHd1munSzz4aWBMbck7no82bPswCh0g==} dependencies: - '@vuepress/client': 2.0.0-beta.51 - '@vuepress/core': 2.0.0-beta.51 - '@vuepress/utils': 2.0.0-beta.51 + '@vuepress/client': 2.0.0-beta.60 + '@vuepress/core': 2.0.0-beta.60 + '@vuepress/utils': 2.0.0-beta.60 ts-debounce: 4.0.0 - vue: 3.2.41 - vue-router: 4.1.5_vue@3.2.41 + vue: 3.2.45 + vue-router: 4.1.6_vue@3.2.45 transitivePeerDependencies: - supports-color dev: false - /@vuepress/plugin-container/2.0.0-beta.51: - resolution: {integrity: sha512-81FzcStQs5A0VTReWsS/CSVpaxfcAA5Gj0pzbcc6/QpNTa9Gaj2UywbcWOLIk3wozCrKucCLu8TSL31cj0+LqA==} + /@vuepress/plugin-container/2.0.0-beta.60: + resolution: {integrity: sha512-yQBAm7sFRGMvCz8Ju2qFG0iLQs/XvWd11UAsywSdvps3A0nZuANSb68QTYJPN3JJfZ5d0LCxlhJ4rbBWT49+wQ==} dependencies: '@types/markdown-it': 12.2.3 - '@vuepress/core': 2.0.0-beta.51 - '@vuepress/markdown': 2.0.0-beta.51 - '@vuepress/shared': 2.0.0-beta.51 - '@vuepress/utils': 2.0.0-beta.51 + '@vuepress/core': 2.0.0-beta.60 + '@vuepress/markdown': 2.0.0-beta.60 + '@vuepress/shared': 2.0.0-beta.60 + '@vuepress/utils': 2.0.0-beta.60 markdown-it: 13.0.1 markdown-it-container: 3.0.0 transitivePeerDependencies: - supports-color dev: false - /@vuepress/plugin-docsearch/2.0.0-beta.51: - resolution: {integrity: sha512-qVrsji7YgGqzOuxRdfeAtfJQL7hFCbc6W9pxNlxsYteIm3HR6V/SQ0xD3aetow/U0c3qJGTTm73i0IcRfdLjIg==} + /@vuepress/plugin-docsearch/2.0.0-beta.60: + resolution: {integrity: sha512-4aquipHuEd87KdFh2ufh5OTeU5qaREer4DqJShpXemY5JiJqvGpda5KmLUTkAis/WPo44GWeFsgtgOqiHevqcA==} dependencies: - '@docsearch/css': 3.2.1 - '@docsearch/js': 3.2.1 - '@docsearch/react': 3.2.1 - '@vuepress/client': 2.0.0-beta.51 - '@vuepress/core': 2.0.0-beta.51 - '@vuepress/shared': 2.0.0-beta.51 - '@vuepress/utils': 2.0.0-beta.51 + '@docsearch/css': 3.3.1 + '@docsearch/js': 3.3.1 + '@docsearch/react': 3.3.1 + '@vuepress/client': 2.0.0-beta.60 + '@vuepress/core': 2.0.0-beta.60 + '@vuepress/shared': 2.0.0-beta.60 + '@vuepress/utils': 2.0.0-beta.60 ts-debounce: 4.0.0 - vue: 3.2.41 - vue-router: 4.1.5_vue@3.2.41 + vue: 3.2.45 + vue-router: 4.1.6_vue@3.2.45 transitivePeerDependencies: - '@algolia/client-search' - '@types/react' @@ -3054,169 +3407,169 @@ packages: - supports-color dev: false - /@vuepress/plugin-external-link-icon/2.0.0-beta.51: - resolution: {integrity: sha512-6ITMmvD/6DX2MLCCnGOJBXkB+rFbRkVboWzBibCzITHfUORsmFwLMjmrDxnIbZl74F0VZ7533zk/BRJIy4uYLA==} + /@vuepress/plugin-external-link-icon/2.0.0-beta.60: + resolution: {integrity: sha512-We4YmS4G7sWoOec/FKYhTM86qRCMBbDThcxOiPm6sWHrhTdxk3bFgJq/DfqJU/ply1ta72AWep0rEY6fj6JJ2A==} dependencies: - '@vuepress/client': 2.0.0-beta.51 - '@vuepress/core': 2.0.0-beta.51 - '@vuepress/markdown': 2.0.0-beta.51 - '@vuepress/shared': 2.0.0-beta.51 - '@vuepress/utils': 2.0.0-beta.51 - vue: 3.2.41 + '@vuepress/client': 2.0.0-beta.60 + '@vuepress/core': 2.0.0-beta.60 + '@vuepress/markdown': 2.0.0-beta.60 + '@vuepress/shared': 2.0.0-beta.60 + '@vuepress/utils': 2.0.0-beta.60 + vue: 3.2.45 transitivePeerDependencies: - supports-color dev: false - /@vuepress/plugin-git/2.0.0-beta.51: - resolution: {integrity: sha512-lw45Vjg5pI25zNgPOTBcIrBNhNB9jU9o/j+fhb5TnW1j9hX3mwWDeJhdWLLErodSlmnTVdyL3e7qNKJpKo1Wmg==} + /@vuepress/plugin-git/2.0.0-beta.60: + resolution: {integrity: sha512-Yu+D8gItxD8BFueV5fQd7AxIgjcxyDY1AFCTmPsP9VDMJ0AuJuaPTLWOf5o0uKzWd5z1mDw0ZwWFh8j3FyHv+A==} dependencies: - '@vuepress/core': 2.0.0-beta.51 - '@vuepress/utils': 2.0.0-beta.51 + '@vuepress/core': 2.0.0-beta.60 + '@vuepress/utils': 2.0.0-beta.60 execa: 6.1.0 transitivePeerDependencies: - supports-color dev: false - /@vuepress/plugin-medium-zoom/2.0.0-beta.51: - resolution: {integrity: sha512-pgsKfsuEazHOLEE0xAWWi2McrygR5shQ1Xi4mZzn1MD9cn5o4JKbJxp2BlUs8q+yG5QMUQ0ugAJ9yRgCkMkUBw==} + /@vuepress/plugin-medium-zoom/2.0.0-beta.60: + resolution: {integrity: sha512-KiJui/sTIHa321jJ/dc11ysyqTMj4Sz9tWoTSnwBJ4nebaO/0OFGQcFajk2+1ELs4poUh/w0THxc+NskR+bf+g==} dependencies: - '@vuepress/client': 2.0.0-beta.51 - '@vuepress/core': 2.0.0-beta.51 - '@vuepress/utils': 2.0.0-beta.51 - medium-zoom: 1.0.6 - vue: 3.2.41 + '@vuepress/client': 2.0.0-beta.60 + '@vuepress/core': 2.0.0-beta.60 + '@vuepress/utils': 2.0.0-beta.60 + medium-zoom: 1.0.8 + vue: 3.2.45 transitivePeerDependencies: - supports-color dev: false - /@vuepress/plugin-nprogress/2.0.0-beta.51: - resolution: {integrity: sha512-eu3IxuiCS5y+Za9l86xKrNSo13VseoZCnAPSIqZj6I6wvyWI62ffCP5NztdR0Z9izp0g/FL6KBtBlwN1PnkY7A==} + /@vuepress/plugin-nprogress/2.0.0-beta.60: + resolution: {integrity: sha512-zRdJP39qFO8q9TAwlCS4tLOd2rLGtkKqkPTsfhjtWwDqSbtTHy0GqVBL8KJUy3H0+qSiyvtC647yLNRbJ9LOlw==} dependencies: - '@vuepress/client': 2.0.0-beta.51 - '@vuepress/core': 2.0.0-beta.51 - '@vuepress/utils': 2.0.0-beta.51 - vue: 3.2.41 - vue-router: 4.1.5_vue@3.2.41 + '@vuepress/client': 2.0.0-beta.60 + '@vuepress/core': 2.0.0-beta.60 + '@vuepress/utils': 2.0.0-beta.60 + vue: 3.2.45 + vue-router: 4.1.6_vue@3.2.45 transitivePeerDependencies: - supports-color dev: false - /@vuepress/plugin-palette/2.0.0-beta.51: - resolution: {integrity: sha512-Q3uFQxiPC7W3JKlyoAT0Nu1bZy6PXXUadjzwpk8dcHDsh+OmdUQqdNfeU1hc4pPQjHIiGdsBAnnGnb+8dNXqkw==} + /@vuepress/plugin-palette/2.0.0-beta.60: + resolution: {integrity: sha512-KPIQCLUEIsgsdxINR6mYJRhHmWCo0850QEvy9+ikdv+ds1z6wJ5xwq/xWy/pRJ6lXdgHQrtuVkroWl+IdppcRw==} dependencies: - '@vuepress/core': 2.0.0-beta.51 - '@vuepress/utils': 2.0.0-beta.51 + '@vuepress/core': 2.0.0-beta.60 + '@vuepress/utils': 2.0.0-beta.60 chokidar: 3.5.3 transitivePeerDependencies: - supports-color dev: false - /@vuepress/plugin-prismjs/2.0.0-beta.51: - resolution: {integrity: sha512-C1kyhWYlehZVuOQK6H8eyo2Mw8Lj3wAA9Lp3YbX9bt0qNf4kfzviEQL+mTrgzM+j1Jpaijjj6nZS0Ev42mO+kw==} + /@vuepress/plugin-prismjs/2.0.0-beta.60: + resolution: {integrity: sha512-yWRWAsUX6iO7uUN67yyy20x3H1clQZ519rHh2dvs6wMyXsO0E3vlNB8jrveOdr+0lfoUll58t2AsxpvzTObY0A==} dependencies: - '@vuepress/core': 2.0.0-beta.51 - prismjs: 1.28.0 + '@vuepress/core': 2.0.0-beta.60 + prismjs: 1.29.0 transitivePeerDependencies: - supports-color dev: false - /@vuepress/plugin-search/2.0.0-beta.51: - resolution: {integrity: sha512-LUKD1WOhesfbjRmy+3wPz27ZOat5sEL7nRVFrmoZNGjqGoUSuh/AFnd04z2utVEoceeuWWOluVmpoYKhxJVMFQ==} + /@vuepress/plugin-search/2.0.0-beta.60: + resolution: {integrity: sha512-9ENqni4H35/L6vab5DpQfy92DcKPL+36xxoOj1EqZfjU/IlIOFKz4TK8JwhaX+reswokF8NriPFcWol4xIa5IA==} dependencies: - '@vuepress/client': 2.0.0-beta.51 - '@vuepress/core': 2.0.0-beta.51 - '@vuepress/shared': 2.0.0-beta.51 - '@vuepress/utils': 2.0.0-beta.51 + '@vuepress/client': 2.0.0-beta.60 + '@vuepress/core': 2.0.0-beta.60 + '@vuepress/shared': 2.0.0-beta.60 + '@vuepress/utils': 2.0.0-beta.60 chokidar: 3.5.3 - vue: 3.2.41 - vue-router: 4.1.5_vue@3.2.41 + vue: 3.2.45 + vue-router: 4.1.6_vue@3.2.45 transitivePeerDependencies: - supports-color dev: false - /@vuepress/plugin-theme-data/2.0.0-beta.51: - resolution: {integrity: sha512-sfsZRhb7zZATqY1+BXkynZZ7HEZnBZEd4iuEyCNpWEnjwa7/qjPSKJyAb/M0a2SLgN2/UcPdM5URMfE1mV/4QQ==} + /@vuepress/plugin-theme-data/2.0.0-beta.60: + resolution: {integrity: sha512-3b34sXEAzShvUzeEMA/0JE4VrLxoMqGJOGMl0I9m0DKg2apgjRG6nYYq6gUnJW0gcUVK+tOOOHsMT6mTMs3xdA==} dependencies: - '@vue/devtools-api': 6.2.1 - '@vuepress/client': 2.0.0-beta.51 - '@vuepress/core': 2.0.0-beta.51 - '@vuepress/shared': 2.0.0-beta.51 - '@vuepress/utils': 2.0.0-beta.51 - vue: 3.2.41 + '@vue/devtools-api': 6.4.5 + '@vuepress/client': 2.0.0-beta.60 + '@vuepress/core': 2.0.0-beta.60 + '@vuepress/shared': 2.0.0-beta.60 + '@vuepress/utils': 2.0.0-beta.60 + vue: 3.2.45 transitivePeerDependencies: - supports-color dev: false - /@vuepress/plugin-toc/2.0.0-beta.51: - resolution: {integrity: sha512-qpAVyCbjuFQlR3A8vsApgVxNuRrEoZovdf96q0e/L77KY85yqP2h5+Tv1z7R8CowsaDZBaABt6BFM+8THMHClA==} + /@vuepress/plugin-toc/2.0.0-beta.60: + resolution: {integrity: sha512-rl65GtYahh7Mm6JiOT7WKuvYgkPquhQCFOSOFKWFEH/4A+950XKfSARJVwu+bsn0xx25X3RMErWuS1l7hNkNgw==} dependencies: - '@vuepress/client': 2.0.0-beta.51 - '@vuepress/core': 2.0.0-beta.51 - '@vuepress/utils': 2.0.0-beta.51 - vue: 3.2.41 - vue-router: 4.1.5_vue@3.2.41 + '@vuepress/client': 2.0.0-beta.60 + '@vuepress/core': 2.0.0-beta.60 + '@vuepress/utils': 2.0.0-beta.60 + vue: 3.2.45 + vue-router: 4.1.6_vue@3.2.45 transitivePeerDependencies: - supports-color dev: false - /@vuepress/shared/2.0.0-beta.51: - resolution: {integrity: sha512-0dbJp0M+d/schkD+xUI7MwwoyJRtFxH3QEYMcLTKhgkaNFjgzlIEG/coh1QywVIoQGX9cGQSa8PZk8BeMeePug==} + /@vuepress/shared/2.0.0-beta.60: + resolution: {integrity: sha512-bwFksEtSQpbyAGJZkvRK9Z2zGmS144nv759vOzbRUZPPlGffeauzrPw9w7wxqp3gTJvIE/4Ufqt0AZTuSP/F/g==} dependencies: - '@mdit-vue/types': 0.10.0 - '@vue/shared': 3.2.41 + '@mdit-vue/types': 0.11.0 + '@vue/shared': 3.2.45 dev: false - /@vuepress/utils/2.0.0-beta.51: - resolution: {integrity: sha512-BtWK38047GNk3CnzAN9dxm8n7XplHqOU/DhW4BYO84Czl6XZh0NExPny3aPf7SL8roy03eAzF0dgPgmug6whIQ==} + /@vuepress/utils/2.0.0-beta.60: + resolution: {integrity: sha512-R5m5/AtKWAnlH+Su2yxoHQNp2JdJZ7gHV5531RbFySq9FTlKHtvE5RFceeppc0/UpzPE6KggRdaRqyjc77vg4g==} dependencies: '@types/debug': 4.1.7 '@types/fs-extra': 9.0.13 '@types/hash-sum': 1.0.0 - '@vuepress/shared': 2.0.0-beta.51 - chalk: 5.1.2 + '@vuepress/shared': 2.0.0-beta.60 debug: 4.3.4 - fs-extra: 10.1.0 - globby: 13.1.2 + fs-extra: 11.1.0 + globby: 13.1.3 hash-sum: 2.0.0 ora: 6.1.2 + picocolors: 1.0.0 upath: 2.0.1 transitivePeerDependencies: - supports-color dev: false - /@vueuse/core/9.3.0_vue@3.2.41: - resolution: {integrity: sha512-64Rna8IQDWpdrJxgitDg7yv1yTp41ZmvV8zlLEylK4QQLWAhz1OFGZDPZ8bU4lwcGgbEJ2sGi2jrdNh4LttUSQ==} + /@vueuse/core/9.9.0_vue@3.2.45: + resolution: {integrity: sha512-JdDb7TrE0imZnwBhMF4+0PCJqGD3AxzH8S2sfk54P0rqvklK+EAtAR/mPb1HwV/JPujQFQJhghQ190Yq03YpVw==} dependencies: - '@types/web-bluetooth': 0.0.15 - '@vueuse/metadata': 9.3.0 - '@vueuse/shared': 9.3.0_vue@3.2.41 - vue-demi: 0.13.6_vue@3.2.41 + '@types/web-bluetooth': 0.0.16 + '@vueuse/metadata': 9.9.0 + '@vueuse/shared': 9.9.0_vue@3.2.45 + vue-demi: 0.13.6_vue@3.2.45 transitivePeerDependencies: - '@vue/composition-api' - vue dev: false - /@vueuse/metadata/9.3.0: - resolution: {integrity: sha512-GnnfjbzIPJIh9ngL9s9oGU1+Hx/h5/KFqTfJykzh/1xjaHkedV9g0MASpdmPZIP+ynNhKAcEfA6g5i8KXwtoMA==} + /@vueuse/metadata/9.9.0: + resolution: {integrity: sha512-pgxsUJv/d7IjKpLeB6TthggEsaBwM3ffc5jPrr5TmxAm/fup0mGR5VTzrdA/PSx85tpb+CIvP92D+55qBNc8ag==} dev: false - /@vueuse/shared/9.3.0_vue@3.2.41: - resolution: {integrity: sha512-caGUWLY0DpPC6l31KxeUy6vPVNA0yKxx81jFYLoMpyP6cF84FG5Dkf69DfSUqL57wX8JcUkJDMnQaQIZPWFEQQ==} + /@vueuse/shared/9.9.0_vue@3.2.45: + resolution: {integrity: sha512-+D0XFwHG0T+uaIbCSlROBwm1wzs71B7n3KyDOxnvfEMMHDOzl09rYKwaE2AENmYwYPXfHPbSBRDD2gBVHbvTcg==} dependencies: - vue-demi: 0.13.6_vue@3.2.41 + vue-demi: 0.13.6_vue@3.2.45 transitivePeerDependencies: - '@vue/composition-api' - vue dev: false - /@waline/client/2.13.0: - resolution: {integrity: sha512-7NrEVpAaT79PTCjjK06WEBRu8gR+/jDU40kn1D4SOJB3fEfvZg1Ztzf2mj1xqy3r4xdOrJ+KWFD88xvPVU96ZA==} + /@waline/client/2.14.4: + resolution: {integrity: sha512-GaZ66drHHcHFD1gswhOQcv+FiiWzIjkzEfL9OW3bUTxi1EHQwXzLGd2QXKgtVocgiZxaxlGRMdaiOvls8Z32qg==} engines: {node: '>=14'} dependencies: - '@vueuse/core': 9.3.0_vue@3.2.41 - autosize: 5.0.1 - marked: 4.1.1 - vue: 3.2.41 + '@vueuse/core': 9.9.0_vue@3.2.45 + autosize: 5.0.2 + marked: 4.2.5 + vue: 3.2.45 transitivePeerDependencies: - '@vue/composition-api' dev: false @@ -3327,8 +3680,8 @@ packages: '@xtuc/long': 4.2.2 dev: false - /@windicss/config/1.8.7: - resolution: {integrity: sha512-8n+/Y36j5L3rw2tgMdLjeGRuNV7VYfKoHoraLK6Bk9OJ1MTPd5vv7pekof/uOPWVV7WWjVeZ6CTO8SDbDDW3iw==} + /@windicss/config/1.8.10: + resolution: {integrity: sha512-O9SsC110b1Ik3YYa4Ck/0TWuCo7YFfA9KDrwD5sAeqscT5COIGK1HszdCT3oh0MJFej2wNrvpfyW9h6yQaW6PA==} dependencies: debug: 4.3.4 jiti: 1.16.0 @@ -3347,14 +3700,14 @@ packages: - supports-color dev: false - /@windicss/plugin-utils/1.8.7: - resolution: {integrity: sha512-dfj95olNZyGFDPFMBvE5oq8hA5f0ooUJZjVdWlthS4ek4W1/xNOHDxB6ygWR8LE9zCOXZykApjt1LOhy9Ky2QA==} + /@windicss/plugin-utils/1.8.10: + resolution: {integrity: sha512-Phqk5OW1w+Mv+ry6t7BzAeDq3aMhbI94gR49j9vQCufFfDGCHndhhjtMK0sBv+NPJUsIAIh6qayb1iwBCXUGrw==} dependencies: - '@antfu/utils': 0.5.2 - '@windicss/config': 1.8.7 + '@antfu/utils': 0.7.2 + '@windicss/config': 1.8.10 debug: 4.3.4 - fast-glob: 3.2.11 - magic-string: 0.26.2 + fast-glob: 3.2.12 + magic-string: 0.27.0 micromatch: 4.0.5 windicss: 3.5.6 transitivePeerDependencies: @@ -3367,7 +3720,7 @@ packages: '@antfu/utils': 0.5.2 '@windicss/config': 1.8.8 debug: 4.3.4 - fast-glob: 3.2.11 + fast-glob: 3.2.12 magic-string: 0.26.2 micromatch: 4.0.5 windicss: 3.5.6 @@ -3394,6 +3747,11 @@ packages: /abbrev/1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + /abbrev/2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + /accepts/1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} @@ -3402,28 +3760,28 @@ packages: negotiator: 0.6.3 dev: false - /acorn-import-assertions/1.8.0_acorn@8.8.0: + /acorn-import-assertions/1.8.0_acorn@8.8.1: resolution: {integrity: sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==} peerDependencies: acorn: ^8 dependencies: - acorn: 8.8.0 + acorn: 8.8.1 dev: false - /acorn-jsx/5.3.2_acorn@8.8.0: + /acorn-jsx/5.3.2_acorn@8.8.1: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 8.8.0 + acorn: 8.8.1 dev: true /acorn-walk/8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} - /acorn/8.8.0: - resolution: {integrity: sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==} + /acorn/8.8.1: + resolution: {integrity: sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==} engines: {node: '>=0.4.0'} hasBin: true @@ -3474,12 +3832,12 @@ packages: indent-string: 5.0.0 dev: false - /ajv-errors/3.0.0_ajv@8.11.0: + /ajv-errors/3.0.0_ajv@8.11.2: resolution: {integrity: sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ==} peerDependencies: ajv: ^8.0.1 dependencies: - ajv: 8.11.0 + ajv: 8.11.2 dev: false /ajv-formats/2.1.1: @@ -3488,7 +3846,7 @@ packages: ajv: optional: true dependencies: - ajv: 8.11.0 + ajv: 8.11.2 dev: false /ajv-keywords/3.5.2_ajv@6.12.6: @@ -3499,12 +3857,12 @@ packages: ajv: 6.12.6 dev: false - /ajv-keywords/5.1.0_ajv@8.11.0: + /ajv-keywords/5.1.0_ajv@8.11.2: resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} peerDependencies: ajv: ^8.8.2 dependencies: - ajv: 8.11.0 + ajv: 8.11.2 fast-deep-equal: 3.1.3 dev: false @@ -3516,8 +3874,8 @@ packages: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - /ajv/8.11.0: - resolution: {integrity: sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==} + /ajv/8.11.2: + resolution: {integrity: sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==} dependencies: fast-deep-equal: 3.1.3 json-schema-traverse: 1.0.0 @@ -3553,7 +3911,7 @@ packages: global-cache-dir: 2.0.0 jest-validate: 25.5.0 path-exists: 4.0.0 - semver: 7.3.7 + semver: 7.3.8 write-file-atomic: 3.0.3 dev: false @@ -3563,11 +3921,6 @@ packages: string-width: 4.2.3 dev: false - /ansi-colors/4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} - dev: false - /ansi-escapes/3.2.0: resolution: {integrity: sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==} engines: {node: '>=4'} @@ -3647,8 +4000,8 @@ packages: engines: {node: '>=10'} dev: false - /ansi-styles/6.1.0: - resolution: {integrity: sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ==} + /ansi-styles/6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} /ansi-to-html/0.7.2: @@ -3795,14 +4148,14 @@ packages: resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} dev: true - /array-includes/3.1.5: - resolution: {integrity: sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==} + /array-includes/3.1.6: + resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 define-properties: 1.1.4 - es-abstract: 1.20.1 - get-intrinsic: 1.1.2 + es-abstract: 1.20.5 + get-intrinsic: 1.1.3 is-string: 1.0.7 dev: true @@ -3827,13 +4180,13 @@ packages: engines: {node: '>=0.10.0'} dev: false - /array.prototype.flat/1.3.0: - resolution: {integrity: sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==} + /array.prototype.flat/1.3.1: + resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 define-properties: 1.1.4 - es-abstract: 1.20.1 + es-abstract: 1.20.5 es-shim-unscopables: 1.0.0 dev: true @@ -3910,8 +4263,8 @@ packages: hasBin: true dev: false - /autoprefixer/10.4.8_postcss@8.4.18: - resolution: {integrity: sha512-75Jr6Q/XpTqEf6D2ltS5uMewJIx5irCU1oBYJrWjFenq/m12WRRrz6g15L1EIoYvPLXTbEry7rDOwrcYNj77xw==} + /autoprefixer/10.4.13_postcss@8.4.20: + resolution: {integrity: sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==} engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: @@ -3920,17 +4273,17 @@ packages: postcss: optional: true dependencies: - browserslist: 4.21.3 - caniuse-lite: 1.0.30001373 + browserslist: 4.21.4 + caniuse-lite: 1.0.30001441 fraction.js: 4.2.0 normalize-range: 0.1.2 picocolors: 1.0.0 - postcss: 8.4.18 + postcss: 8.4.20 postcss-value-parser: 4.2.0 dev: false - /autosize/5.0.1: - resolution: {integrity: sha512-UIWUlE4TOVPNNj2jjrU39wI4hEYbneUypEqcyRmRFIx5CC2gNdg3rQr+Zh7/3h6egbBvm33TDQjNQKtj9Tk1HA==} + /autosize/5.0.2: + resolution: {integrity: sha512-FPVt5ynkqUAA9gcMZnJHka1XfQgr1WNd/yRfIjmj5WGmjua+u5Hl9hn8M2nU5CNy2bEIcj1ZUwXq7IOHsfZG9w==} dev: false /backoff/2.5.0: @@ -3976,6 +4329,20 @@ packages: resolution: {integrity: sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ==} dev: false + /better-ajv-errors/1.2.0_ajv@8.11.2: + resolution: {integrity: sha512-UW+IsFycygIo7bclP9h5ugkNH8EjCSgqyFB/yQ4Hqqa1OEYDtb0uFIkYE0b6+CjkgJYVM5UKI/pJPxjYe9EZlA==} + engines: {node: '>= 12.13.0'} + peerDependencies: + ajv: 4.11.8 - 8 + dependencies: + '@babel/code-frame': 7.18.6 + '@humanwhocodes/momoa': 2.0.4 + ajv: 8.11.2 + chalk: 4.1.2 + jsonpointer: 5.0.1 + leven: 3.1.0 + dev: false + /better-opn/3.0.2: resolution: {integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==} engines: {node: '>=12.0.0'} @@ -4012,8 +4379,8 @@ packages: inherits: 2.0.4 readable-stream: 3.6.0 - /bl/5.0.0: - resolution: {integrity: sha512-8vxFNZ0pflFfi0WXA3WQXlj6CaMEwsmh63I1CNp0q+wWv8sD0ARx1KovSQd0l2GkwrMIOyedq0EF1FxI+RCZLQ==} + /bl/5.1.0: + resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} dependencies: buffer: 6.0.3 inherits: 2.0.4 @@ -4043,6 +4410,26 @@ packages: - supports-color dev: false + /body-parser/1.20.1: + resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dependencies: + bytes: 3.1.2 + content-type: 1.0.4 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.1 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: false + /bonjour-service/1.0.13: resolution: {integrity: sha512-LWKRU/7EqDUC9CTAQtuZl5HzBALoCYwtLhffW3et7vZMwv3bWLpJf8bRYlMD5OCcDpTfnPgNCV4yo9ZIaJGMiA==} dependencies: @@ -4069,6 +4456,20 @@ packages: wrap-ansi: 7.0.0 dev: false + /boxen/7.0.1: + resolution: {integrity: sha512-8k2eH6SRAK00NDl1iX5q17RJ8rfl53TajdYxE3ssMLehbg487dEVgsad4pIsZb/QqBgYWIl6JOauMTLGX2Kpkw==} + engines: {node: '>=14.16'} + dependencies: + ansi-align: 3.0.1 + camelcase: 7.0.1 + chalk: 5.2.0 + cli-boxes: 3.0.0 + string-width: 5.1.2 + type-fest: 2.18.0 + widest-line: 4.0.1 + wrap-ansi: 8.0.1 + dev: false + /brace-expansion/1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: @@ -4133,6 +4534,17 @@ packages: update-browserslist-db: 1.0.5_browserslist@4.21.3 dev: false + /browserslist/4.21.4: + resolution: {integrity: sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001441 + electron-to-chromium: 1.4.284 + node-releases: 2.0.6 + update-browserslist-db: 1.0.10_browserslist@4.21.4 + dev: false + /buffer-alloc-unsafe/1.1.0: resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==} dev: false @@ -4180,7 +4592,7 @@ packages: /builtins/5.0.1: resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} dependencies: - semver: 7.3.7 + semver: 7.3.8 /bumpp/8.2.1: resolution: {integrity: sha512-4tHKsWC2mqHQvdjZ4AXgVhS2xMsz8qQ4zYt87vGRXW5tqAjrYa/UJqy7s/dGYI2OIe9ghBdiFhKpyKEX9SXffg==} @@ -4188,11 +4600,11 @@ packages: hasBin: true dependencies: '@jsdevtools/ez-spawn': 3.0.4 - cac: 6.7.12 - fast-glob: 3.2.11 + cac: 6.7.14 + fast-glob: 3.2.12 kleur: 4.1.5 prompts: 2.4.2 - semver: 7.3.7 + semver: 7.3.8 dev: true /byline/5.0.0: @@ -4217,8 +4629,8 @@ packages: engines: {node: '>= 0.8'} dev: false - /cac/6.7.12: - resolution: {integrity: sha512-rM7E2ygtMkJqD9c7WnFU6fruFcN3xe4FM5yUmgxhZzIKJk4uHl9U/fhwdajGFQbQuv43FAUo1Fe8gX/oIKDeSA==} + /cac/6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} /cacache/16.1.3: @@ -4231,8 +4643,8 @@ packages: fs-minipass: 2.1.0 glob: 8.0.3 infer-owner: 1.0.4 - lru-cache: 7.14.0 - minipass: 3.3.4 + lru-cache: 7.14.1 + minipass: 3.3.6 minipass-collect: 1.0.2 minipass-flush: 1.0.5 minipass-pipeline: 1.2.4 @@ -4241,7 +4653,7 @@ packages: promise-inflight: 1.0.1 rimraf: 3.0.2 ssri: 9.0.1 - tar: 6.1.11 + tar: 6.1.13 unique-filename: 2.0.1 transitivePeerDependencies: - bluebird @@ -4270,6 +4682,23 @@ packages: keyv: 4.3.3 dev: false + /cacheable-lookup/7.0.0: + resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} + engines: {node: '>=14.16'} + dev: false + + /cacheable-request/10.2.4: + resolution: {integrity: sha512-IWIea8ei1Ht4dBqvlvh7Gs7EYlMyBhlJybLDUB9sadEqHqftmdNieMLIR5ia3vs8gbjj9t8hXLBpUVg3vcQNbg==} + engines: {node: '>=14.16'} + dependencies: + get-stream: 6.0.1 + http-cache-semantics: 4.1.0 + keyv: 4.5.2 + mimic-response: 4.0.0 + normalize-url: 8.0.0 + responselike: 3.0.0 + dev: false + /cacheable-request/2.1.4: resolution: {integrity: sha512-vag0O2LKZ/najSoUwDbVlnlCFvhBE/7mGTY2B5FgCBDcRD+oVV1HYTOwM6JZfMg/hIcM6IwnTZ1uQQL5/X3xIQ==} dependencies: @@ -4316,10 +4745,10 @@ packages: resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} dependencies: function-bind: 1.1.1 - get-intrinsic: 1.1.2 + get-intrinsic: 1.1.3 - /call-me-maybe/1.0.1: - resolution: {integrity: sha512-wCyFsDQkKPwwF8BDwOiWNx/9K45L/hvggQiDbve+viMNMQnWhrlYIuBk09offfwCRtCO9P6XwUttufzU11WCVw==} + /call-me-maybe/1.0.2: + resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} /callsite/1.0.0: resolution: {integrity: sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==} @@ -4333,7 +4762,7 @@ packages: resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} dependencies: pascal-case: 3.1.2 - tslib: 2.4.0 + tslib: 2.4.1 dev: false /camelcase-keys/6.2.2: @@ -4359,10 +4788,19 @@ packages: engines: {node: '>=10'} dev: false + /camelcase/7.0.1: + resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} + engines: {node: '>=14.16'} + dev: false + /caniuse-lite/1.0.30001373: resolution: {integrity: sha512-pJYArGHrPp3TUqQzFYRmP/lwJlj8RCbVe3Gd3eJQkAV8SAC6b19XS9BjMvRdvaS8RMkaTN8ZhoHP6S1y8zzwEQ==} dev: false + /caniuse-lite/1.0.30001441: + resolution: {integrity: sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg==} + dev: false + /chalk/0.5.1: resolution: {integrity: sha512-bIKA54hP8iZhyDT81TOsJiQvR1gW+ZYSXFaZUAvoD4wCHdbHY2actmpTE4x344ZlFqHbvoxKOaESULTZN2gstg==} engines: {node: '>=0.10.0'} @@ -4408,8 +4846,8 @@ packages: ansi-styles: 4.3.0 supports-color: 7.2.0 - /chalk/5.1.2: - resolution: {integrity: sha512-E5CkT4jWURs1Vy5qGJye+XwCkNj7Od3Af7CP6SujMetSMkLs8Do2RWJK5yx1wamHV/op8Rz+9rltjaTQWDnEFQ==} + /chalk/5.2.0: + resolution: {integrity: sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} /chardet/0.7.0: @@ -4419,31 +4857,35 @@ packages: resolution: {integrity: sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=} dev: false - /chart.js/3.9.1: - resolution: {integrity: sha512-Ro2JbLmvg83gXF5F4sniaQ+lTbSv18E+TIf2cOeiH1Iqd2PGFOtem+DUufMZsCJwFE7ywPOpfXFBwRTGq7dh6w==} + /chart.js/4.1.1: + resolution: {integrity: sha512-P0pCosNXp+LR8zO/QTkZKT6Hb7p0DPFtypEeVOf+6x06hX13NIb75R0DXUA4Ksx/+48chDQKtCCmRCviQRTqsA==} + engines: {pnpm: ^7.0.0} + dependencies: + '@kurkle/color': 0.3.1 dev: false - /cheerio-select/1.6.0: - resolution: {integrity: sha512-eq0GdBvxVFbqWgmCm7M3XGs1I8oLy/nExUnh6oLqmBditPO9AqQJrkslDpMun/hZ0yyTs8L0m85OHp4ho6Qm9g==} + /cheerio-select/2.1.0: + resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} dependencies: - css-select: 4.3.0 + boolbase: 1.0.0 + css-select: 5.1.0 css-what: 6.1.0 domelementtype: 2.3.0 - domhandler: 4.3.1 - domutils: 2.8.0 + domhandler: 5.0.3 + domutils: 3.0.1 dev: false - /cheerio/1.0.0-rc.10: - resolution: {integrity: sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==} + /cheerio/1.0.0-rc.12: + resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} engines: {node: '>= 6'} dependencies: - cheerio-select: 1.6.0 - dom-serializer: 1.4.1 - domhandler: 4.3.1 - htmlparser2: 6.1.0 - parse5: 6.0.1 - parse5-htmlparser2-tree-adapter: 6.0.1 - tslib: 2.4.0 + cheerio-select: 2.1.0 + dom-serializer: 2.0.0 + domhandler: 5.0.3 + domutils: 3.0.1 + htmlparser2: 8.0.1 + parse5: 7.1.2 + parse5-htmlparser2-tree-adapter: 7.0.0 dev: false /chokidar/3.5.3: @@ -4520,6 +4962,11 @@ packages: engines: {node: '>=6'} dev: false + /cli-boxes/3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + dev: false + /cli-cursor/2.1.0: resolution: {integrity: sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==} engines: {node: '>=4'} @@ -4597,6 +5044,15 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 + dev: true + + /cliui/8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 /clone-deep/4.0.1: resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} @@ -4678,7 +5134,7 @@ packages: resolution: {integrity: sha512-DP3FpjsiDDvnQC1OJBsdOJZPuy7r0o6sepY2T5M3L/d2nrE23O/ErFkEqyY3ngVL1ZhTj/H0pCMNObZGkEOaaQ==} engines: {node: '>=12.20.0'} dependencies: - chalk: 5.1.2 + chalk: 5.2.0 filter-obj: 3.0.0 is-plain-obj: 4.1.0 jest-validate: 27.5.1 @@ -4712,11 +5168,6 @@ packages: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} dev: false - /commander/6.2.1: - resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} - engines: {node: '>= 6'} - dev: false - /commander/7.2.0: resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} engines: {node: '>= 10'} @@ -4732,12 +5183,12 @@ packages: engines: {node: ^12.20.0 || >=14} dev: false - /commander/9.4.0: - resolution: {integrity: sha512-sRPT+umqkz90UA8M1yqYfnHlZA7fF6nSphDtxeywPZ49ysjxDQybzk13CL+mXekDRG92skbcqCLVovuCusNmFw==} + /commander/9.4.1: + resolution: {integrity: sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==} engines: {node: ^12.20.0 || >=14} - /commitizen/4.2.5: - resolution: {integrity: sha512-9sXju8Qrz1B4Tw7kC5KhnvwYQN88qs2zbiB8oyMsnXZyJ24PPGiNM3nHr73d32dnE3i8VJEXddBFIbOgYSEXtQ==} + /commitizen/4.2.6: + resolution: {integrity: sha512-RyTM+EiD9GO01DJUn9MRRAet3XUHGfoUZoksLfr+1ym1Xt2q5EYJs9Fg2BtKSb5Mo53i0BtMBmWMHQXVlZ/L9w==} engines: {node: '>= 12'} hasBin: true dependencies: @@ -4828,26 +5279,33 @@ packages: js-string-escape: 1.0.1 lodash: 4.17.21 md5-hex: 3.0.1 - semver: 7.3.7 + semver: 7.3.8 well-known-symbols: 2.0.0 dev: false - /concurrently/7.4.0: - resolution: {integrity: sha512-M6AfrueDt/GEna/Vg9BqQ+93yuvzkSKmoTixnwEJkH0LlcGrRC2eCmjeG1tLLHIYfpYJABokqSGyMcXjm96AFA==} + /concurrently/7.6.0: + resolution: {integrity: sha512-BKtRgvcJGeZ4XttiDiNcFiRlxoAeZOseqUvyYRUp/Vtd+9p1ULmeoSqGsDA+2ivdeDFpqrJvGvmI+StKfKl5hw==} engines: {node: ^12.20.0 || ^14.13.0 || >=16.0.0} hasBin: true dependencies: chalk: 4.1.2 date-fns: 2.29.3 lodash: 4.17.21 - rxjs: 7.5.6 - shell-quote: 1.7.3 + rxjs: 7.8.0 + shell-quote: 1.7.4 spawn-command: 0.0.2-1 supports-color: 8.1.1 tree-kill: 1.2.2 - yargs: 17.5.1 + yargs: 17.6.2 dev: true + /config-chain/1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + dev: false + /configstore/5.0.1: resolution: {integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==} engines: {node: '>=8'} @@ -4860,6 +5318,17 @@ packages: xdg-basedir: 4.0.0 dev: false + /configstore/6.0.0: + resolution: {integrity: sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==} + engines: {node: '>=12'} + dependencies: + dot-prop: 6.0.1 + graceful-fs: 4.2.10 + unique-string: 3.0.0 + write-file-atomic: 3.0.3 + xdg-basedir: 5.1.0 + dev: false + /connect-history-api-fallback/1.6.0: resolution: {integrity: sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==} engines: {node: '>=0.8'} @@ -5108,7 +5577,7 @@ packages: - supports-color dev: false - /copy-webpack-plugin/11.0.0_webpack@5.74.0: + /copy-webpack-plugin/11.0.0_webpack@5.75.0: resolution: {integrity: sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==} engines: {node: '>= 14.15.0'} peerDependencies: @@ -5117,13 +5586,13 @@ packages: webpack: optional: true dependencies: - fast-glob: 3.2.11 + fast-glob: 3.2.12 glob-parent: 6.0.2 - globby: 13.1.2 + globby: 13.1.3 normalize-path: 3.0.0 schema-utils: 4.0.0 serialize-javascript: 6.0.0 - webpack: 5.74.0 + webpack: 5.75.0 dev: false /core-js-pure/3.24.1: @@ -5134,8 +5603,20 @@ packages: /core-util-is/1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - /cosmiconfig-typescript-loader/4.1.1_vfayau7oz5qy4giwqlppd3j3ti: - resolution: {integrity: sha512-9DHpa379Gp0o0Zefii35fcmuuin6q92FnLDffzdZ0l9tVd3nEobG3O+MZ06+kuBvFTSVScvNb/oHA13Nd4iipg==} + /cose-base/1.0.3: + resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} + dependencies: + layout-base: 1.0.2 + dev: false + + /cose-base/2.1.0: + resolution: {integrity: sha512-HTMm07dhxq1dIPGWwpiVrIk9n+DH7KYmqWA786mLe8jDS+1ZjGtJGIIsJVKoseZXS6/FxiUWCJ2B7XzqUCuhPw==} + dependencies: + layout-base: 2.0.1 + dev: false + + /cosmiconfig-typescript-loader/4.3.0_k32j2iwrrwkbro5edqflmrijke: + resolution: {integrity: sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q==} engines: {node: '>=12', npm: '>=6'} peerDependencies: '@types/node': '*' @@ -5143,14 +5624,14 @@ packages: ts-node: '>=10' typescript: '>=3' dependencies: - '@types/node': 14.18.32 - cosmiconfig: 7.0.1 - ts-node: 10.9.1_jcmx33t3olsvcxopqdljsohpme - typescript: 4.8.4 + '@types/node': 14.18.36 + cosmiconfig: 7.1.0 + ts-node: 10.9.1_ocil65wecyuhsmrrocoajouipe + typescript: 4.9.4 dev: true - /cosmiconfig/7.0.1: - resolution: {integrity: sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==} + /cosmiconfig/7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} engines: {node: '>=10'} dependencies: '@types/parse-json': 4.0.0 @@ -5159,6 +5640,15 @@ packages: path-type: 4.0.0 yaml: 1.10.2 + /cp-file/10.0.0: + resolution: {integrity: sha512-vy2Vi1r2epK5WqxOLnskeKeZkdZvTKfFZQCplE3XWsP+SUJyd5XAUFC9lFgTjjXJF2GMne/UML14iEmkAaDfFg==} + engines: {node: '>=14.16'} + dependencies: + graceful-fs: 4.2.10 + nested-error-stacks: 2.1.1 + p-event: 5.0.1 + dev: false + /cp-file/7.0.0: resolution: {integrity: sha512-0Cbj7gyvFVApzpK/uhCtQ/9kE9UnYpxMzaq5nQQC/Dh4iaj5fxp7iEFIullrYwzj8nf0qnsI1Qsx34hAeAebvw==} engines: {node: '>=8'} @@ -5169,16 +5659,6 @@ packages: p-event: 4.2.0 dev: false - /cp-file/9.1.0: - resolution: {integrity: sha512-3scnzFj/94eb7y4wyXRWwvzLFaQp87yyfTnChIjlfYrVqp5lVO3E2hIJMeQIltUT0K2ZAB3An1qXcBmwGyvuwA==} - engines: {node: '>=10'} - dependencies: - graceful-fs: 4.2.10 - make-dir: 3.1.0 - nested-error-stacks: 2.1.1 - p-event: 4.2.0 - dev: false - /cpx2/4.2.0: resolution: {integrity: sha512-Ik81d7J849x0dGpR/8TBLXc1MwkFuv29kkstgLau8IOQwptrEENsXefC4o+tnkTjiFnXbsaz08/6YSZdJER+nQ==} engines: {node: '>=14'} @@ -5190,12 +5670,12 @@ packages: fs-extra: 10.1.0 glob-gitignore: 1.0.14 glob2base: 0.0.12 - ignore: 5.2.0 + ignore: 5.2.4 minimatch: 3.1.2 p-map: 4.0.0 resolve: 1.22.1 safe-buffer: 5.2.1 - shell-quote: 1.7.3 + shell-quote: 1.7.4 subarg: 1.0.0 transitivePeerDependencies: - supports-color @@ -5266,8 +5746,15 @@ packages: engines: {node: '>=8'} dev: false - /css-loader/6.7.1_webpack@5.74.0: - resolution: {integrity: sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==} + /crypto-random-string/4.0.0: + resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} + engines: {node: '>=12'} + dependencies: + type-fest: 1.4.0 + dev: false + + /css-loader/6.7.3_webpack@5.75.0: + resolution: {integrity: sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==} engines: {node: '>= 12.13.0'} peerDependencies: webpack: ^5.0.0 @@ -5275,15 +5762,15 @@ packages: webpack: optional: true dependencies: - icss-utils: 5.1.0_postcss@8.4.18 - postcss: 8.4.18 - postcss-modules-extract-imports: 3.0.0_postcss@8.4.18 - postcss-modules-local-by-default: 4.0.0_postcss@8.4.18 - postcss-modules-scope: 3.0.0_postcss@8.4.18 - postcss-modules-values: 4.0.0_postcss@8.4.18 + icss-utils: 5.1.0_postcss@8.4.20 + postcss: 8.4.20 + postcss-modules-extract-imports: 3.0.0_postcss@8.4.20 + postcss-modules-local-by-default: 4.0.0_postcss@8.4.20 + postcss-modules-scope: 3.0.0_postcss@8.4.20 + postcss-modules-values: 4.0.0_postcss@8.4.20 postcss-value-parser: 4.2.0 - semver: 7.3.7 - webpack: 5.74.0 + semver: 7.3.8 + webpack: 5.75.0 dev: false /css-select/4.3.0: @@ -5296,6 +5783,16 @@ packages: nth-check: 2.1.1 dev: false + /css-select/5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 5.0.3 + domutils: 3.0.1 + nth-check: 2.1.1 + dev: false + /css-tree/2.2.1: resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} @@ -5329,27 +5826,49 @@ packages: resolution: {integrity: sha512-NJGVKPS81XejHcLhaLJS7plab0fK3slPh11mESeeDq2W4ZI5kUKK/LRRdVDvjJseojbPB7ZwjnyOybg3Igea/A==} dev: false + /cytoscape-cose-bilkent/4.1.0_cytoscape@3.23.0: + resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} + peerDependencies: + cytoscape: ^3.2.0 + dependencies: + cose-base: 1.0.3 + cytoscape: 3.23.0 + dev: false + + /cytoscape-fcose/2.1.0_cytoscape@3.23.0: + resolution: {integrity: sha512-Q3apPl66jf8/2sMsrCjNP247nbDkyIPjA9g5iPMMWNLZgP3/mn9aryF7EFY/oRPEpv7bKJ4jYmCoU5r5/qAc1Q==} + peerDependencies: + cytoscape: ^3.2.0 + dependencies: + cose-base: 2.1.0 + cytoscape: 3.23.0 + dev: false + + /cytoscape/3.23.0: + resolution: {integrity: sha512-gRZqJj/1kiAVPkrVFvz/GccxsXhF3Qwpptl32gKKypO4IlqnKBjTOu+HbXtEggSGzC5KCaHp3/F7GgENrtsFkA==} + engines: {node: '>=0.10'} + dependencies: + heap: 0.2.7 + lodash: 4.17.21 + dev: false + /cz-conventional-changelog/3.3.0: resolution: {integrity: sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==} engines: {node: '>= 10'} dependencies: chalk: 2.4.2 - commitizen: 4.2.5 + commitizen: 4.2.6 conventional-commit-types: 3.0.0 lodash.map: 4.6.0 longest: 2.0.1 word-wrap: 1.2.3 optionalDependencies: - '@commitlint/load': 17.1.2 + '@commitlint/load': 17.3.0 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' dev: true - /d3-array/1.2.4: - resolution: {integrity: sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==} - dev: false - /d3-array/3.2.0: resolution: {integrity: sha512-3yXFQo0oG3QCxbF06rMPFyGRMGJNS7NvsV1+2joOjbBE+9xvWQ8+GcMJAjRCzw06zQ3/arXeJgbPYcjUCuC+3g==} engines: {node: '>=12'} @@ -5357,25 +5876,11 @@ packages: internmap: 2.0.3 dev: false - /d3-axis/1.0.12: - resolution: {integrity: sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ==} - dev: false - /d3-axis/3.0.0: resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} engines: {node: '>=12'} dev: false - /d3-brush/1.1.6: - resolution: {integrity: sha512-7RW+w7HfMCPyZLifTz/UnJmI5kdkXtpCbombUSs8xniAyo0vIbrDzDwUJB6eJOgl9u5DQOt2TQlYumxzD1SvYA==} - dependencies: - d3-dispatch: 1.0.6 - d3-drag: 1.2.5 - d3-interpolate: 1.4.0 - d3-selection: 1.4.2 - d3-transition: 1.3.2 - dev: false - /d3-brush/3.0.0: resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} engines: {node: '>=12'} @@ -5387,13 +5892,6 @@ packages: d3-transition: 3.0.1_d3-selection@3.0.0 dev: false - /d3-chord/1.0.6: - resolution: {integrity: sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==} - dependencies: - d3-array: 1.2.4 - d3-path: 1.0.9 - dev: false - /d3-chord/3.0.1: resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} engines: {node: '>=12'} @@ -5401,25 +5899,11 @@ packages: d3-path: 3.0.1 dev: false - /d3-collection/1.0.7: - resolution: {integrity: sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==} - dev: false - - /d3-color/1.4.1: - resolution: {integrity: sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==} - dev: false - /d3-color/3.1.0: resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} engines: {node: '>=12'} dev: false - /d3-contour/1.3.2: - resolution: {integrity: sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==} - dependencies: - d3-array: 1.2.4 - dev: false - /d3-contour/4.0.0: resolution: {integrity: sha512-7aQo0QHUTu/Ko3cP9YK9yUTxtoDEiDGwnBHyLxG5M4vqlBkO/uixMRele3nfsfj6UXOcuReVpVXzAboGraYIJw==} engines: {node: '>=12'} @@ -5434,22 +5918,11 @@ packages: delaunator: 5.0.0 dev: false - /d3-dispatch/1.0.6: - resolution: {integrity: sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==} - dev: false - /d3-dispatch/3.0.1: resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} engines: {node: '>=12'} dev: false - /d3-drag/1.2.5: - resolution: {integrity: sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==} - dependencies: - d3-dispatch: 1.0.6 - d3-selection: 1.4.2 - dev: false - /d3-drag/3.0.0: resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} engines: {node: '>=12'} @@ -5458,15 +5931,6 @@ packages: d3-selection: 3.0.0 dev: false - /d3-dsv/1.2.0: - resolution: {integrity: sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g==} - hasBin: true - dependencies: - commander: 2.20.3 - iconv-lite: 0.4.24 - rw: 1.3.3 - dev: false - /d3-dsv/3.0.1: resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} engines: {node: '>=12'} @@ -5477,21 +5941,11 @@ packages: rw: 1.3.3 dev: false - /d3-ease/1.0.7: - resolution: {integrity: sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==} - dev: false - /d3-ease/3.0.1: resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} engines: {node: '>=12'} dev: false - /d3-fetch/1.2.0: - resolution: {integrity: sha512-yC78NBVcd2zFAyR/HnUiBS7Lf6inSCoWcSxFfw8FYL7ydiqe80SazNwoffcqOfs95XaLo7yebsmQqDKSsXUtvA==} - dependencies: - d3-dsv: 1.2.0 - dev: false - /d3-fetch/3.0.1: resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} engines: {node: '>=12'} @@ -5499,15 +5953,6 @@ packages: d3-dsv: 3.0.1 dev: false - /d3-force/1.2.1: - resolution: {integrity: sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==} - dependencies: - d3-collection: 1.0.7 - d3-dispatch: 1.0.6 - d3-quadtree: 1.0.7 - d3-timer: 1.0.10 - dev: false - /d3-force/3.0.0: resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} engines: {node: '>=12'} @@ -5517,21 +5962,11 @@ packages: d3-timer: 3.0.1 dev: false - /d3-format/1.4.5: - resolution: {integrity: sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==} - dev: false - /d3-format/3.1.0: resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} engines: {node: '>=12'} dev: false - /d3-geo/1.12.1: - resolution: {integrity: sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==} - dependencies: - d3-array: 1.2.4 - dev: false - /d3-geo/3.0.1: resolution: {integrity: sha512-Wt23xBych5tSy9IYAM1FR2rWIBFWa52B/oF/GYe5zbdHrg08FU8+BuI6X4PvTwPDdqdAdq04fuWJpELtsaEjeA==} engines: {node: '>=12'} @@ -5539,21 +5974,11 @@ packages: d3-array: 3.2.0 dev: false - /d3-hierarchy/1.1.9: - resolution: {integrity: sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==} - dev: false - /d3-hierarchy/3.1.2: resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} engines: {node: '>=12'} dev: false - /d3-interpolate/1.4.0: - resolution: {integrity: sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==} - dependencies: - d3-color: 1.4.1 - dev: false - /d3-interpolate/3.0.1: resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} engines: {node: '>=12'} @@ -5561,49 +5986,26 @@ packages: d3-color: 3.1.0 dev: false - /d3-path/1.0.9: - resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} - dev: false - /d3-path/3.0.1: resolution: {integrity: sha512-gq6gZom9AFZby0YLduxT1qmrp4xpBA1YZr19OI717WIdKE2OM5ETq5qrHLb301IgxhLwcuxvGZVLeeWc/k1I6w==} engines: {node: '>=12'} dev: false - /d3-polygon/1.0.6: - resolution: {integrity: sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ==} - dev: false - /d3-polygon/3.0.1: resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} engines: {node: '>=12'} dev: false - /d3-quadtree/1.0.7: - resolution: {integrity: sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==} - dev: false - /d3-quadtree/3.0.1: resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} engines: {node: '>=12'} dev: false - /d3-random/1.1.2: - resolution: {integrity: sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ==} - dev: false - /d3-random/3.0.1: resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} engines: {node: '>=12'} dev: false - /d3-scale-chromatic/1.5.0: - resolution: {integrity: sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==} - dependencies: - d3-color: 1.4.1 - d3-interpolate: 1.4.0 - dev: false - /d3-scale-chromatic/3.0.0: resolution: {integrity: sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==} engines: {node: '>=12'} @@ -5612,17 +6014,6 @@ packages: d3-interpolate: 3.0.1 dev: false - /d3-scale/2.2.2: - resolution: {integrity: sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==} - dependencies: - d3-array: 1.2.4 - d3-collection: 1.0.7 - d3-format: 1.4.5 - d3-interpolate: 1.4.0 - d3-time: 1.1.0 - d3-time-format: 2.3.0 - dev: false - /d3-scale/4.0.2: resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} engines: {node: '>=12'} @@ -5634,21 +6025,11 @@ packages: d3-time-format: 4.1.0 dev: false - /d3-selection/1.4.2: - resolution: {integrity: sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==} - dev: false - /d3-selection/3.0.0: resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} engines: {node: '>=12'} dev: false - /d3-shape/1.3.7: - resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} - dependencies: - d3-path: 1.0.9 - dev: false - /d3-shape/3.1.0: resolution: {integrity: sha512-tGDh1Muf8kWjEDT/LswZJ8WF85yDZLvVJpYU9Nq+8+yW1Z5enxrmXOhTArlkaElU+CTn0OTVNli+/i+HP45QEQ==} engines: {node: '>=12'} @@ -5656,12 +6037,6 @@ packages: d3-path: 3.0.1 dev: false - /d3-time-format/2.3.0: - resolution: {integrity: sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==} - dependencies: - d3-time: 1.1.0 - dev: false - /d3-time-format/4.1.0: resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} engines: {node: '>=12'} @@ -5669,10 +6044,6 @@ packages: d3-time: 3.0.0 dev: false - /d3-time/1.1.0: - resolution: {integrity: sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==} - dev: false - /d3-time/3.0.0: resolution: {integrity: sha512-zmV3lRnlaLI08y9IMRXSDshQb5Nj77smnfpnd2LrBa/2K281Jijactokeak14QacHs/kKq0AQ121nidNYlarbQ==} engines: {node: '>=12'} @@ -5680,26 +6051,11 @@ packages: d3-array: 3.2.0 dev: false - /d3-timer/1.0.10: - resolution: {integrity: sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==} - dev: false - /d3-timer/3.0.1: resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} engines: {node: '>=12'} dev: false - /d3-transition/1.3.2: - resolution: {integrity: sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==} - dependencies: - d3-color: 1.4.1 - d3-dispatch: 1.0.6 - d3-ease: 1.0.7 - d3-interpolate: 1.4.0 - d3-selection: 1.4.2 - d3-timer: 1.0.10 - dev: false - /d3-transition/3.0.1_d3-selection@3.0.0: resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} engines: {node: '>=12'} @@ -5714,20 +6070,6 @@ packages: d3-timer: 3.0.1 dev: false - /d3-voronoi/1.1.4: - resolution: {integrity: sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg==} - dev: false - - /d3-zoom/1.8.3: - resolution: {integrity: sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==} - dependencies: - d3-dispatch: 1.0.6 - d3-drag: 1.2.5 - d3-interpolate: 1.4.0 - d3-selection: 1.4.2 - d3-transition: 1.3.2 - dev: false - /d3-zoom/3.0.0: resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} engines: {node: '>=12'} @@ -5739,42 +6081,6 @@ packages: d3-transition: 3.0.1_d3-selection@3.0.0 dev: false - /d3/5.16.0: - resolution: {integrity: sha512-4PL5hHaHwX4m7Zr1UapXW23apo6pexCgdetdJ5kTmADpG/7T9Gkxw0M0tf/pjoB63ezCCm0u5UaFYy2aMt0Mcw==} - dependencies: - d3-array: 1.2.4 - d3-axis: 1.0.12 - d3-brush: 1.1.6 - d3-chord: 1.0.6 - d3-collection: 1.0.7 - d3-color: 1.4.1 - d3-contour: 1.3.2 - d3-dispatch: 1.0.6 - d3-drag: 1.2.5 - d3-dsv: 1.2.0 - d3-ease: 1.0.7 - d3-fetch: 1.2.0 - d3-force: 1.2.1 - d3-format: 1.4.5 - d3-geo: 1.12.1 - d3-hierarchy: 1.1.9 - d3-interpolate: 1.4.0 - d3-path: 1.0.9 - d3-polygon: 1.0.6 - d3-quadtree: 1.0.7 - d3-random: 1.1.2 - d3-scale: 2.2.2 - d3-scale-chromatic: 1.5.0 - d3-selection: 1.4.2 - d3-shape: 1.3.7 - d3-time: 1.1.0 - d3-time-format: 2.3.0 - d3-timer: 1.0.10 - d3-transition: 1.3.2 - d3-voronoi: 1.1.4 - d3-zoom: 1.8.3 - dev: false - /d3/7.6.1: resolution: {integrity: sha512-txMTdIHFbcpLx+8a0IFhZsbp+PfBBPt8yfbmukZTQFroKuFqIwqswF0qE5JXWefylaAVpSXFoKm3yP+jpNLFLw==} engines: {node: '>=12'} @@ -5811,20 +6117,47 @@ packages: d3-zoom: 3.0.0 dev: false - /dagre-d3/0.6.4: - resolution: {integrity: sha512-e/6jXeCP7/ptlAM48clmX4xTZc5Ek6T6kagS7Oz2HrYSdqcLZFLqpAfh7ldbZRFfxCZVyh61NEPR08UQRVxJzQ==} + /d3/7.8.0: + resolution: {integrity: sha512-a5rNemRadWkEfqnY5NsD4RdCP9vn8EIJ4I5Rl14U0uKH1SXqcNmk/h9aGaAF1O98lz6L9M0IeUcuPa9GUYbI5A==} + engines: {node: '>=12'} dependencies: - d3: 5.16.0 - dagre: 0.8.5 - graphlib: 2.1.8 - lodash: 4.17.21 + d3-array: 3.2.0 + d3-axis: 3.0.0 + d3-brush: 3.0.0 + d3-chord: 3.0.1 + d3-color: 3.1.0 + d3-contour: 4.0.0 + d3-delaunay: 6.0.2 + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-dsv: 3.0.1 + d3-ease: 3.0.1 + d3-fetch: 3.0.1 + d3-force: 3.0.0 + d3-format: 3.1.0 + d3-geo: 3.0.1 + d3-hierarchy: 3.1.2 + d3-interpolate: 3.0.1 + d3-path: 3.0.1 + d3-polygon: 3.0.1 + d3-quadtree: 3.0.1 + d3-random: 3.0.1 + d3-scale: 4.0.2 + d3-scale-chromatic: 3.0.0 + d3-selection: 3.0.0 + d3-shape: 3.1.0 + d3-time: 3.0.0 + d3-time-format: 4.1.0 + d3-timer: 3.0.1 + d3-transition: 3.0.1_d3-selection@3.0.0 + d3-zoom: 3.0.0 dev: false - /dagre/0.8.5: - resolution: {integrity: sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==} + /dagre-d3-es/7.0.6: + resolution: {integrity: sha512-CaaE/nZh205ix+Up4xsnlGmpog5GGm81Upi2+/SBHxwNwrccBb3K51LzjZ1U6hgvOlAEUsVWf1xSTzCyKpJ6+Q==} dependencies: - graphlib: 2.1.8 - lodash: 4.17.21 + d3: 7.8.0 + lodash-es: 4.17.21 dev: false /dargs/7.0.0: @@ -5856,8 +6189,8 @@ packages: resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} dev: true - /dayjs/1.11.5: - resolution: {integrity: sha512-CAdX5Q3YW3Gclyo5Vpqkgpj8fSdLQcRuzfX6mC6Phy0nfJ0eGYOeS7m4mt2plDWLAtA4TqTakvbboHvUxfe4iA==} + /dayjs/1.11.7: + resolution: {integrity: sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==} dev: false /debounce/1.2.1: @@ -5925,8 +6258,8 @@ packages: callsite: 1.0.0 dev: false - /decamelize-keys/1.1.0: - resolution: {integrity: sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg==} + /decamelize-keys/1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} engines: {node: '>=0.10.0'} dependencies: decamelize: 1.2.0 @@ -5956,6 +6289,13 @@ packages: mimic-response: 2.1.0 dev: false + /decompress-response/6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dependencies: + mimic-response: 3.1.0 + dev: false + /decompress-tar/4.1.1: resolution: {integrity: sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==} engines: {node: '>=4'} @@ -6038,8 +6378,8 @@ packages: execa: 5.1.1 dev: false - /defaults/1.0.3: - resolution: {integrity: sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==} + /defaults/1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} dependencies: clone: 1.0.4 @@ -6087,8 +6427,8 @@ packages: isobject: 3.0.1 dev: false - /defu/6.1.0: - resolution: {integrity: sha512-pOFYRTIhoKujrmbTRhcW5lYQLBXw/dlTwfI8IguF1QCDJOcJzNH1w+YFjxqy6BAuJrClTy6MUE8q+oKJ2FLsIw==} + /defu/6.1.1: + resolution: {integrity: sha512-aA964RUCsBt0FGoNIlA3uFgo2hO+WWC0fiC6DBps/0SFzkKcYoM/3CzVLIa5xSsrFjdioMdYgAIbwo80qp2MoA==} dev: true /del/6.1.1: @@ -6105,6 +6445,20 @@ packages: slash: 3.0.0 dev: false + /del/7.0.0: + resolution: {integrity: sha512-tQbV/4u5WVB8HMJr08pgw0b6nG4RGt/tj+7Numvq+zqcvUFeMaIWWOUFltiU+6go8BSO2/ogsB4EasDaj0y68Q==} + engines: {node: '>=14.16'} + dependencies: + globby: 13.1.3 + graceful-fs: 4.2.10 + is-glob: 4.0.3 + is-path-cwd: 3.0.0 + is-path-inside: 4.0.0 + p-map: 5.5.0 + rimraf: 3.0.2 + slash: 4.0.0 + dev: false + /delaunator/5.0.0: resolution: {integrity: sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==} dependencies: @@ -6219,8 +6573,8 @@ packages: engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} dependencies: is-url: 1.2.4 - postcss: 8.4.18 - postcss-values-parser: 6.0.2_postcss@8.4.18 + postcss: 8.4.20 + postcss-values-parser: 6.0.2_postcss@8.4.20 dev: false /detective-sass/4.0.1: @@ -6248,10 +6602,10 @@ packages: resolution: {integrity: sha512-lR78AugfUSBojwlSRZBeEqQ1l8LI7rbxOl1qTUnGLcjZQDjZmrZCb7R46rK8U8B5WzFvJrxa7fEBA8FoD/n5fA==} engines: {node: ^12.20.0 || ^14.14.0 || >=16.0.0} dependencies: - '@typescript-eslint/typescript-estree': 5.40.0_typescript@4.8.4 + '@typescript-eslint/typescript-estree': 5.47.1_typescript@4.9.4 ast-module-types: 3.0.0 node-source-walk: 5.0.0 - typescript: 4.8.4 + typescript: 4.9.4 transitivePeerDependencies: - supports-color dev: false @@ -6260,10 +6614,10 @@ packages: resolution: {integrity: sha512-lR78AugfUSBojwlSRZBeEqQ1l8LI7rbxOl1qTUnGLcjZQDjZmrZCb7R46rK8U8B5WzFvJrxa7fEBA8FoD/n5fA==} engines: {node: ^12.20.0 || ^14.14.0 || >=16.0.0} dependencies: - '@typescript-eslint/typescript-estree': 5.40.0_xdmo64ntgiljjfyvpcolhvypxi + '@typescript-eslint/typescript-estree': 5.47.1_w6zgx7jig4ppjo57goygyg47o4 ast-module-types: 3.0.0 node-source-walk: 5.0.0 - typescript: 4.8.4 + typescript: 4.9.4 transitivePeerDependencies: - supports-color dev: false @@ -6324,15 +6678,16 @@ packages: entities: 2.2.0 dev: false - /domelementtype/2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - dev: false - - /domhandler/3.3.0: - resolution: {integrity: sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==} - engines: {node: '>= 4'} + /dom-serializer/2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} dependencies: domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.4.0 + dev: false + + /domelementtype/2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} dev: false /domhandler/4.3.1: @@ -6342,8 +6697,15 @@ packages: domelementtype: 2.3.0 dev: false - /dompurify/2.4.0: - resolution: {integrity: sha512-Be9tbQMZds4a3C6xTmz68NlMfeONA//4dOavl/1rNw50E+/QO0KVpbcU0PcaW0nsQxurXls9ZocqFxk8R2mWEA==} + /domhandler/5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + dev: false + + /dompurify/2.4.1: + resolution: {integrity: sha512-ewwFzHzrrneRjxzmK6oVz/rZn9VWspGFRDb4/rRtIsM1n36t9AKma/ye8syCpcw+XJ25kOK/hOG7t1j2I2yBqA==} dev: false /domutils/2.8.0: @@ -6354,11 +6716,19 @@ packages: domhandler: 4.3.1 dev: false + /domutils/3.0.1: + resolution: {integrity: sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==} + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + dev: false + /dot-case/3.0.4: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} dependencies: no-case: 3.0.4 - tslib: 2.4.0 + tslib: 2.4.1 dev: false /dot-prop/5.3.0: @@ -6419,11 +6789,11 @@ packages: safe-buffer: 5.2.1 dev: false - /echarts/5.4.0: - resolution: {integrity: sha512-uPsO9VRUIKAdFOoH3B0aNg7NRVdN7aM39/OjovjO9MwmWsAkfGyeXJhK+dbRi51iDrQWliXV60/XwLA7kg3z0w==} + /echarts/5.4.1: + resolution: {integrity: sha512-9ltS3M2JB0w2EhcYjCdmtrJ+6haZcW6acBolMGIuf01Hql1yrIV01L1aRj7jsaaIULJslEP9Z3vKlEmnJaWJVQ==} dependencies: tslib: 2.3.0 - zrender: 5.4.0 + zrender: 5.4.1 dev: false /ee-first/1.1.1: @@ -6434,6 +6804,10 @@ packages: resolution: {integrity: sha512-kSiX4tuyZijV7Cz0MWVmGT8K2siqaOA4Z66K5dCttPPRh0HicOcOAEj1KlC8O8J1aOS/1M8rGofOzksLKaHWcQ==} dev: false + /electron-to-chromium/1.4.284: + resolution: {integrity: sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==} + dev: false + /elegant-spinner/1.0.1: resolution: {integrity: sha512-B+ZM+RXvRqQaAmkMlO/oSe5nMUOaUnyfGYCEHoR8wrXsZR2mA0XVibsxV1bvTwxdRWah1PkQqso2EzhILGHtEQ==} engines: {node: '>=0.10.0'} @@ -6490,6 +6864,11 @@ packages: engines: {node: '>=0.12'} dev: false + /entities/4.4.0: + resolution: {integrity: sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==} + engines: {node: '>=0.12'} + dev: false + /env-paths/2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} @@ -6520,21 +6899,22 @@ packages: stackframe: 1.3.4 dev: false - /es-abstract/1.20.1: - resolution: {integrity: sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==} + /es-abstract/1.20.5: + resolution: {integrity: sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 es-to-primitive: 1.2.1 function-bind: 1.1.1 function.prototype.name: 1.1.5 - get-intrinsic: 1.1.2 + get-intrinsic: 1.1.3 get-symbol-description: 1.0.0 + gopd: 1.0.1 has: 1.0.3 has-property-descriptors: 1.0.0 has-symbols: 1.0.3 - internal-slot: 1.0.3 - is-callable: 1.2.4 + internal-slot: 1.0.4 + is-callable: 1.2.7 is-negative-zero: 2.0.2 is-regex: 1.1.4 is-shared-array-buffer: 1.0.2 @@ -6542,10 +6922,11 @@ packages: is-weakref: 1.0.2 object-inspect: 1.12.2 object-keys: 1.1.1 - object.assign: 4.1.2 + object.assign: 4.1.4 regexp.prototype.flags: 1.4.3 - string.prototype.trimend: 1.0.5 - string.prototype.trimstart: 1.0.5 + safe-regex-test: 1.0.0 + string.prototype.trimend: 1.0.6 + string.prototype.trimstart: 1.0.6 unbox-primitive: 1.0.2 dev: true @@ -6567,7 +6948,7 @@ packages: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} engines: {node: '>= 0.4'} dependencies: - is-callable: 1.2.4 + is-callable: 1.2.7 is-date-object: 1.0.5 is-symbol: 1.0.4 dev: true @@ -6576,29 +6957,12 @@ packages: resolution: {integrity: sha512-HBL8I3mIki5C1Cc9QjKUenHtnG0A5/xA8Q/AllRcfiwl2CZFXGK7ddBiCoRwAix4i2KxcQfjtIVcrVbB3vbmwg==} dev: false - /esbuild-android-64/0.14.53: - resolution: {integrity: sha512-fIL93sOTnEU+NrTAVMIKiAw0YH22HWCAgg4N4Z6zov2t0kY9RAJ50zY9ZMCQ+RT6bnOfDt8gCTnt/RaSNA2yRA==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: false - optional: true - /esbuild-android-64/0.15.11: resolution: {integrity: sha512-rrwoXEiuI1kaw4k475NJpexs8GfJqQUKcD08VR8sKHmuW9RUuTR2VxcupVvHdiGh9ihxL9m3lpqB1kju92Ialw==} engines: {node: '>=12'} cpu: [x64] os: [android] requiresBuild: true - optional: true - - /esbuild-android-arm64/0.14.53: - resolution: {integrity: sha512-PC7KaF1v0h/nWpvlU1UMN7dzB54cBH8qSsm7S9mkwFA1BXpaEOufCg8hdoEI1jep0KeO/rjZVWrsH8+q28T77A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true dev: false optional: true @@ -6608,14 +6972,6 @@ packages: cpu: [arm64] os: [android] requiresBuild: true - optional: true - - /esbuild-darwin-64/0.14.53: - resolution: {integrity: sha512-gE7P5wlnkX4d4PKvLBUgmhZXvL7lzGRLri17/+CmmCzfncIgq8lOBvxGMiQ4xazplhxq+72TEohyFMZLFxuWvg==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true dev: false optional: true @@ -6625,14 +6981,6 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true - optional: true - - /esbuild-darwin-arm64/0.14.53: - resolution: {integrity: sha512-otJwDU3hnI15Q98PX4MJbknSZ/WSR1I45il7gcxcECXzfN4Mrpft5hBDHXNRnCh+5858uPXBXA1Vaz2jVWLaIA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true dev: false optional: true @@ -6642,14 +6990,6 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true - optional: true - - /esbuild-freebsd-64/0.14.53: - resolution: {integrity: sha512-WkdJa8iyrGHyKiPF4lk0MiOF87Q2SkE+i+8D4Cazq3/iqmGPJ6u49je300MFi5I2eUsQCkaOWhpCVQMTKGww2w==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true dev: false optional: true @@ -6659,14 +6999,6 @@ packages: cpu: [x64] os: [freebsd] requiresBuild: true - optional: true - - /esbuild-freebsd-arm64/0.14.53: - resolution: {integrity: sha512-9T7WwCuV30NAx0SyQpw8edbKvbKELnnm1FHg7gbSYaatH+c8WJW10g/OdM7JYnv7qkimw2ZTtSA+NokOLd2ydQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true dev: false optional: true @@ -6676,14 +7008,6 @@ packages: cpu: [arm64] os: [freebsd] requiresBuild: true - optional: true - - /esbuild-linux-32/0.14.53: - resolution: {integrity: sha512-VGanLBg5en2LfGDgLEUxQko2lqsOS7MTEWUi8x91YmsHNyzJVT/WApbFFx3MQGhkf+XdimVhpyo5/G0PBY91zg==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true dev: false optional: true @@ -6693,14 +7017,6 @@ packages: cpu: [ia32] os: [linux] requiresBuild: true - optional: true - - /esbuild-linux-64/0.14.53: - resolution: {integrity: sha512-pP/FA55j/fzAV7N9DF31meAyjOH6Bjuo3aSKPh26+RW85ZEtbJv9nhoxmGTd9FOqjx59Tc1ZbrJabuiXlMwuZQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true dev: false optional: true @@ -6710,14 +7026,6 @@ packages: cpu: [x64] os: [linux] requiresBuild: true - optional: true - - /esbuild-linux-arm/0.14.53: - resolution: {integrity: sha512-/u81NGAVZMopbmzd21Nu/wvnKQK3pT4CrvQ8BTje1STXcQAGnfyKgQlj3m0j2BzYbvQxSy+TMck4TNV2onvoPA==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true dev: false optional: true @@ -6727,14 +7035,6 @@ packages: cpu: [arm] os: [linux] requiresBuild: true - optional: true - - /esbuild-linux-arm64/0.14.53: - resolution: {integrity: sha512-GDmWITT+PMsjCA6/lByYk7NyFssW4Q6in32iPkpjZ/ytSyH+xeEx8q7HG3AhWH6heemEYEWpTll/eui3jwlSnw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true dev: false optional: true @@ -6744,14 +7044,6 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true - optional: true - - /esbuild-linux-mips64le/0.14.53: - resolution: {integrity: sha512-d6/XHIQW714gSSp6tOOX2UscedVobELvQlPMkInhx1NPz4ThZI9uNLQ4qQJHGBGKGfu+rtJsxM4NVHLhnNRdWQ==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true dev: false optional: true @@ -6761,14 +7053,6 @@ packages: cpu: [mips64el] os: [linux] requiresBuild: true - optional: true - - /esbuild-linux-ppc64le/0.14.53: - resolution: {integrity: sha512-ndnJmniKPCB52m+r6BtHHLAOXw+xBCWIxNnedbIpuREOcbSU/AlyM/2dA3BmUQhsHdb4w3amD5U2s91TJ3MzzA==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true dev: false optional: true @@ -6778,14 +7062,6 @@ packages: cpu: [ppc64] os: [linux] requiresBuild: true - optional: true - - /esbuild-linux-riscv64/0.14.53: - resolution: {integrity: sha512-yG2sVH+QSix6ct4lIzJj329iJF3MhloLE6/vKMQAAd26UVPVkhMFqFopY+9kCgYsdeWvXdPgmyOuKa48Y7+/EQ==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true dev: false optional: true @@ -6795,14 +7071,6 @@ packages: cpu: [riscv64] os: [linux] requiresBuild: true - optional: true - - /esbuild-linux-s390x/0.14.53: - resolution: {integrity: sha512-OCJlgdkB+XPYndHmw6uZT7jcYgzmx9K+28PVdOa/eLjdoYkeAFvH5hTwX4AXGLZLH09tpl4bVsEtvuyUldaNCg==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true dev: false optional: true @@ -6812,48 +7080,32 @@ packages: cpu: [s390x] os: [linux] requiresBuild: true + dev: false optional: true - /esbuild-loader/2.19.0_webpack@5.74.0: - resolution: {integrity: sha512-urGNVE6Tl2rqx92ElKi/LiExXjGvcH6HfDBFzJ9Ppwqh4n6Jmx8x7RKAyMzSM78b6CAaJLhDncG5sPrL0ROh5Q==} + /esbuild-loader/2.20.0_webpack@5.75.0: + resolution: {integrity: sha512-dr+j8O4w5RvqZ7I4PPB4EIyVTd679EBQnMm+JBB7av+vu05Zpje2IpK5N3ld1VWa+WxrInIbNFAg093+E1aRsA==} peerDependencies: webpack: ^4.40.0 || ^5.0.0 peerDependenciesMeta: webpack: optional: true dependencies: - esbuild: 0.14.53 + esbuild: 0.15.11 joycon: 3.1.1 json5: 2.2.1 loader-utils: 2.0.2 tapable: 2.2.1 - webpack: 5.74.0 + webpack: 5.75.0 webpack-sources: 2.3.1 dev: false - /esbuild-netbsd-64/0.14.53: - resolution: {integrity: sha512-gp2SB+Efc7MhMdWV2+pmIs/Ja/Mi5rjw+wlDmmbIn68VGXBleNgiEZG+eV2SRS0kJEUyHNedDtwRIMzaohWedQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: false - optional: true - /esbuild-netbsd-64/0.15.11: resolution: {integrity: sha512-hUC9yN06K9sg7ju4Vgu9ChAPdsEgtcrcLfyNT5IKwKyfpLvKUwCMZSdF+gRD3WpyZelgTQfJ+pDx5XFbXTlB0A==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] requiresBuild: true - optional: true - - /esbuild-openbsd-64/0.14.53: - resolution: {integrity: sha512-eKQ30ZWe+WTZmteDYg8S+YjHV5s4iTxeSGhJKJajFfQx9TLZJvsJX0/paqwP51GicOUruFpSUAs2NCc0a4ivQQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true dev: false optional: true @@ -6863,14 +7115,6 @@ packages: cpu: [x64] os: [openbsd] requiresBuild: true - optional: true - - /esbuild-sunos-64/0.14.53: - resolution: {integrity: sha512-OWLpS7a2FrIRukQqcgQqR1XKn0jSJoOdT+RlhAxUoEQM/IpytS3FXzCJM6xjUYtpO5GMY0EdZJp+ur2pYdm39g==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true dev: false optional: true @@ -6880,14 +7124,6 @@ packages: cpu: [x64] os: [sunos] requiresBuild: true - optional: true - - /esbuild-windows-32/0.14.53: - resolution: {integrity: sha512-m14XyWQP5rwGW0tbEfp95U6A0wY0DYPInWBB7D69FAXUpBpBObRoGTKRv36lf2RWOdE4YO3TNvj37zhXjVL5xg==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true dev: false optional: true @@ -6897,14 +7133,6 @@ packages: cpu: [ia32] os: [win32] requiresBuild: true - optional: true - - /esbuild-windows-64/0.14.53: - resolution: {integrity: sha512-s9skQFF0I7zqnQ2K8S1xdLSfZFsPLuOGmSx57h2btSEswv0N0YodYvqLcJMrNMXh6EynOmWD7rz+0rWWbFpIHQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true dev: false optional: true @@ -6914,14 +7142,6 @@ packages: cpu: [x64] os: [win32] requiresBuild: true - optional: true - - /esbuild-windows-arm64/0.14.53: - resolution: {integrity: sha512-E+5Gvb+ZWts+00T9II6wp2L3KG2r3iGxByqd/a1RmLmYWVsSVUjkvIxZuJ3hYTIbhLkH5PRwpldGTKYqVz0nzQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true dev: false optional: true @@ -6931,36 +7151,8 @@ packages: cpu: [arm64] os: [win32] requiresBuild: true - optional: true - - /esbuild/0.14.53: - resolution: {integrity: sha512-ohO33pUBQ64q6mmheX1mZ8mIXj8ivQY/L4oVuAshr+aJI+zLl+amrp3EodrUNDNYVrKJXGPfIHFGhO8slGRjuw==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/linux-loong64': 0.14.53 - esbuild-android-64: 0.14.53 - esbuild-android-arm64: 0.14.53 - esbuild-darwin-64: 0.14.53 - esbuild-darwin-arm64: 0.14.53 - esbuild-freebsd-64: 0.14.53 - esbuild-freebsd-arm64: 0.14.53 - esbuild-linux-32: 0.14.53 - esbuild-linux-64: 0.14.53 - esbuild-linux-arm: 0.14.53 - esbuild-linux-arm64: 0.14.53 - esbuild-linux-mips64le: 0.14.53 - esbuild-linux-ppc64le: 0.14.53 - esbuild-linux-riscv64: 0.14.53 - esbuild-linux-s390x: 0.14.53 - esbuild-netbsd-64: 0.14.53 - esbuild-openbsd-64: 0.14.53 - esbuild-sunos-64: 0.14.53 - esbuild-windows-32: 0.14.53 - esbuild-windows-64: 0.14.53 - esbuild-windows-arm64: 0.14.53 dev: false + optional: true /esbuild/0.15.11: resolution: {integrity: sha512-OgHGuhlfZ//mToxjte1D5iiiQgWfJ2GByVMwEC/IuoXsBGkuyK1+KrjYu0laSpnN/L1UmLUCv0s25vObdc1bVg==} @@ -6990,6 +7182,36 @@ packages: esbuild-windows-32: 0.15.11 esbuild-windows-64: 0.15.11 esbuild-windows-arm64: 0.15.11 + dev: false + + /esbuild/0.16.12: + resolution: {integrity: sha512-eq5KcuXajf2OmivCl4e89AD3j8fbV+UTE9vczEzq5haA07U9oOTzBWlh3+6ZdjJR7Rz2QfWZ2uxZyhZxBgJ4+g==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.16.12 + '@esbuild/android-arm64': 0.16.12 + '@esbuild/android-x64': 0.16.12 + '@esbuild/darwin-arm64': 0.16.12 + '@esbuild/darwin-x64': 0.16.12 + '@esbuild/freebsd-arm64': 0.16.12 + '@esbuild/freebsd-x64': 0.16.12 + '@esbuild/linux-arm': 0.16.12 + '@esbuild/linux-arm64': 0.16.12 + '@esbuild/linux-ia32': 0.16.12 + '@esbuild/linux-loong64': 0.16.12 + '@esbuild/linux-mips64el': 0.16.12 + '@esbuild/linux-ppc64': 0.16.12 + '@esbuild/linux-riscv64': 0.16.12 + '@esbuild/linux-s390x': 0.16.12 + '@esbuild/linux-x64': 0.16.12 + '@esbuild/netbsd-x64': 0.16.12 + '@esbuild/openbsd-x64': 0.16.12 + '@esbuild/sunos-x64': 0.16.12 + '@esbuild/win32-arm64': 0.16.12 + '@esbuild/win32-ia32': 0.16.12 + '@esbuild/win32-x64': 0.16.12 /escalade/3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} @@ -7000,9 +7222,9 @@ packages: engines: {node: '>=8'} dev: false - /escape-goat/3.0.0: - resolution: {integrity: sha512-w3PwNZJwRxlp47QGzhuEBldEqVHHhh8/tIPcl6ecf2Bou99cdAt0knihBV0Ecc7CGxYduXVBDheH1K2oADRlvw==} - engines: {node: '>=10'} + /escape-goat/4.0.0: + resolution: {integrity: sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==} + engines: {node: '>=12'} dev: false /escape-html/1.0.3: @@ -7036,16 +7258,16 @@ packages: source-map: 0.6.1 dev: false - /eslint-config-prettier/8.5.0_eslint@8.25.0: + /eslint-config-prettier/8.5.0_eslint@8.30.0: resolution: {integrity: sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 8.25.0 + eslint: 8.30.0 dev: true - /eslint-config-standard/17.0.0_eslint@8.25.0: + /eslint-config-standard/17.0.0_eslint@8.30.0: resolution: {integrity: sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg==} peerDependencies: eslint: ^8.0.1 @@ -7060,10 +7282,10 @@ packages: eslint-plugin-promise: optional: true dependencies: - eslint: 8.25.0 + eslint: 8.30.0 dev: true - /eslint-config-standard/17.0.0_xvtgxlakewmtefe2kahk4f5uji: + /eslint-config-standard/17.0.0_snpl5wgzq3nl6iwyoqvj6sxsdi: resolution: {integrity: sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg==} peerDependencies: eslint: ^8.0.1 @@ -7078,20 +7300,20 @@ packages: eslint-plugin-promise: optional: true dependencies: - eslint: 8.25.0 - eslint-plugin-import: 2.26.0_eslint@8.25.0 - eslint-plugin-n: 15.2.4_eslint@8.25.0 - eslint-plugin-promise: 6.0.0_eslint@8.25.0 + eslint: 8.30.0 + eslint-plugin-import: 2.26.0_eslint@8.30.0 + eslint-plugin-n: 15.6.0_eslint@8.30.0 + eslint-plugin-promise: 6.1.1_eslint@8.30.0 dev: true - /eslint-config-vuepress-typescript/4.0.3_n4625bddo65vrpuc6jvahan7ta: - resolution: {integrity: sha512-y/XltMMl6AWUcCihqYaYDpKznT25zvxRSmXUZYm3rci74Sm3erFhwkLCiByRBjDeazSDbBU/zMuUSHmml+ImzA==} + /eslint-config-vuepress-typescript/4.0.4_5c545irdft4vuty3gxgtfdqu3e: + resolution: {integrity: sha512-nFotoEouFD/ok8GIyZChTASK1e0TVZFLwHnR16MXaIWCRdL2tjWJcud53323aEJ/8PcYrY/GgRLwhTJR4rMZ7Q==} dependencies: - '@typescript-eslint/eslint-plugin': 5.40.0_25sstg4uu2sk4pm7xcyzuov7xq - '@typescript-eslint/parser': 5.40.0_z4bbprzjrhnsfa24uvmcbu7f5q - eslint-config-standard: 17.0.0_eslint@8.25.0 - eslint-config-vuepress: 4.0.3_sswrskcyz66hatsyuqpbc3haxy - eslint-plugin-vue: 9.3.0_eslint@8.25.0 + '@typescript-eslint/eslint-plugin': 5.47.1_txmweb6yn7coi7nfrp22gpyqmy + '@typescript-eslint/parser': 5.47.1_lzzuuodtsqwxnvqeq4g4likcqa + eslint-config-standard: 17.0.0_eslint@8.30.0 + eslint-config-vuepress: 4.0.4_277hnodg54nckvpj57x34abizy + eslint-plugin-vue: 9.8.0_eslint@8.30.0 transitivePeerDependencies: - eslint - eslint-import-resolver-typescript @@ -7105,10 +7327,10 @@ packages: - typescript dev: true - /eslint-config-vuepress/4.0.3_37o5dylkwpyxjsfmdan2qconee: - resolution: {integrity: sha512-pks3B+T4DiETp9Uhshv7s+9VGSpbi1BFWQQ7TWs7zcSmcxYeNz+jX4dVFmJPzZYP7qs5HSgqGMf+HChoZm33Nw==} + /eslint-config-vuepress/4.0.4_277hnodg54nckvpj57x34abizy: + resolution: {integrity: sha512-MUd3IYOTVQfzuL/lAvSJPGMrJEus2/PVbQHs01N5AQw5MXc7kdhbaTJU3melExmgRe08meH88On9lNBmzbw/SQ==} peerDependencies: - prettier: ^2.7.1 + prettier: ^2.8.0 prettier-config-vuepress: '*' peerDependenciesMeta: prettier: @@ -7116,13 +7338,13 @@ packages: prettier-config-vuepress: optional: true dependencies: - eslint-config-prettier: 8.5.0_eslint@8.25.0 - eslint-config-standard: 17.0.0_xvtgxlakewmtefe2kahk4f5uji - eslint-plugin-import: 2.26.0_eslint@8.25.0 - eslint-plugin-n: 15.2.4_eslint@8.25.0 - eslint-plugin-prettier: 4.2.1_hvbqyfstm4urdpm6ffpwfka4e4 - eslint-plugin-promise: 6.0.0_eslint@8.25.0 - prettier: 2.7.1 + eslint-config-prettier: 8.5.0_eslint@8.30.0 + eslint-config-standard: 17.0.0_snpl5wgzq3nl6iwyoqvj6sxsdi + eslint-plugin-import: 2.26.0_smw3o7qjeokkcohbvp7rylsoqq + eslint-plugin-n: 15.6.0_eslint@8.30.0 + eslint-plugin-prettier: 4.2.1_kl4pe43v5b43npmso5hoplpbyi + eslint-plugin-promise: 6.1.1_eslint@8.30.0 + prettier: 2.8.1 prettier-config-vuepress: 4.0.0 transitivePeerDependencies: - '@typescript-eslint/parser' @@ -7132,10 +7354,10 @@ packages: - supports-color dev: true - /eslint-config-vuepress/4.0.3_sswrskcyz66hatsyuqpbc3haxy: - resolution: {integrity: sha512-pks3B+T4DiETp9Uhshv7s+9VGSpbi1BFWQQ7TWs7zcSmcxYeNz+jX4dVFmJPzZYP7qs5HSgqGMf+HChoZm33Nw==} + /eslint-config-vuepress/4.0.4_nveednhrtxclom63fsgwztxh4a: + resolution: {integrity: sha512-MUd3IYOTVQfzuL/lAvSJPGMrJEus2/PVbQHs01N5AQw5MXc7kdhbaTJU3melExmgRe08meH88On9lNBmzbw/SQ==} peerDependencies: - prettier: ^2.7.1 + prettier: ^2.8.0 prettier-config-vuepress: '*' peerDependenciesMeta: prettier: @@ -7143,13 +7365,13 @@ packages: prettier-config-vuepress: optional: true dependencies: - eslint-config-prettier: 8.5.0_eslint@8.25.0 - eslint-config-standard: 17.0.0_xvtgxlakewmtefe2kahk4f5uji - eslint-plugin-import: 2.26.0_zb5prbqp7qzcgafjm73dfpyyvm - eslint-plugin-n: 15.2.4_eslint@8.25.0 - eslint-plugin-prettier: 4.2.1_hvbqyfstm4urdpm6ffpwfka4e4 - eslint-plugin-promise: 6.0.0_eslint@8.25.0 - prettier: 2.7.1 + eslint-config-prettier: 8.5.0_eslint@8.30.0 + eslint-config-standard: 17.0.0_snpl5wgzq3nl6iwyoqvj6sxsdi + eslint-plugin-import: 2.26.0_eslint@8.30.0 + eslint-plugin-n: 15.6.0_eslint@8.30.0 + eslint-plugin-prettier: 4.2.1_kl4pe43v5b43npmso5hoplpbyi + eslint-plugin-promise: 6.1.1_eslint@8.30.0 + prettier: 2.8.1 prettier-config-vuepress: 4.0.0 transitivePeerDependencies: - '@typescript-eslint/parser' @@ -7168,42 +7390,19 @@ packages: - supports-color dev: true - /eslint-module-utils/2.7.3_nas2du3p2cg5vdmul5hbwjbapu: - resolution: {integrity: sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==} + /eslint-module-utils/2.7.4_dc7heojkjdjw5ttc65wer4jauy: + resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' + eslint: '*' eslint-import-resolver-node: '*' eslint-import-resolver-typescript: '*' eslint-import-resolver-webpack: '*' peerDependenciesMeta: '@typescript-eslint/parser': optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - dependencies: - '@typescript-eslint/parser': 5.40.0_z4bbprzjrhnsfa24uvmcbu7f5q - debug: 3.2.7 - eslint-import-resolver-node: 0.3.6 - find-up: 2.1.0 - transitivePeerDependencies: - - supports-color - dev: true - - /eslint-module-utils/2.7.3_ulu2225r2ychl26a37c6o2rfje: - resolution: {integrity: sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': + eslint: optional: true eslint-import-resolver-node: optional: true @@ -7213,24 +7412,53 @@ packages: optional: true dependencies: debug: 3.2.7 + eslint: 8.30.0 eslint-import-resolver-node: 0.3.6 - find-up: 2.1.0 transitivePeerDependencies: - supports-color dev: true - /eslint-plugin-es/4.1.0_eslint@8.25.0: + /eslint-module-utils/2.7.4_ehosaqfug4in6rsga5hlj3hmya: + resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + '@typescript-eslint/parser': 5.47.1_lzzuuodtsqwxnvqeq4g4likcqa + debug: 3.2.7 + eslint: 8.30.0 + eslint-import-resolver-node: 0.3.6 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-plugin-es/4.1.0_eslint@8.30.0: resolution: {integrity: sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==} engines: {node: '>=8.10.0'} peerDependencies: eslint: '>=4.19.1' dependencies: - eslint: 8.25.0 + eslint: 8.30.0 eslint-utils: 2.1.0 regexpp: 3.2.0 dev: true - /eslint-plugin-import/2.26.0_eslint@8.25.0: + /eslint-plugin-import/2.26.0_eslint@8.30.0: resolution: {integrity: sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==} engines: {node: '>=4'} peerDependencies: @@ -7240,18 +7468,18 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - array-includes: 3.1.5 - array.prototype.flat: 1.3.0 + array-includes: 3.1.6 + array.prototype.flat: 1.3.1 debug: 2.6.9 doctrine: 2.1.0 - eslint: 8.25.0 + eslint: 8.30.0 eslint-import-resolver-node: 0.3.6 - eslint-module-utils: 2.7.3_ulu2225r2ychl26a37c6o2rfje + eslint-module-utils: 2.7.4_dc7heojkjdjw5ttc65wer4jauy has: 1.0.3 - is-core-module: 2.9.0 + is-core-module: 2.11.0 is-glob: 4.0.3 minimatch: 3.1.2 - object.values: 1.1.5 + object.values: 1.1.6 resolve: 1.22.1 tsconfig-paths: 3.14.1 transitivePeerDependencies: @@ -7260,7 +7488,7 @@ packages: - supports-color dev: true - /eslint-plugin-import/2.26.0_zb5prbqp7qzcgafjm73dfpyyvm: + /eslint-plugin-import/2.26.0_smw3o7qjeokkcohbvp7rylsoqq: resolution: {integrity: sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==} engines: {node: '>=4'} peerDependencies: @@ -7270,19 +7498,19 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 5.40.0_z4bbprzjrhnsfa24uvmcbu7f5q - array-includes: 3.1.5 - array.prototype.flat: 1.3.0 + '@typescript-eslint/parser': 5.47.1_lzzuuodtsqwxnvqeq4g4likcqa + array-includes: 3.1.6 + array.prototype.flat: 1.3.1 debug: 2.6.9 doctrine: 2.1.0 - eslint: 8.25.0 + eslint: 8.30.0 eslint-import-resolver-node: 0.3.6 - eslint-module-utils: 2.7.3_nas2du3p2cg5vdmul5hbwjbapu + eslint-module-utils: 2.7.4_ehosaqfug4in6rsga5hlj3hmya has: 1.0.3 - is-core-module: 2.9.0 + is-core-module: 2.11.0 is-glob: 4.0.3 minimatch: 3.1.2 - object.values: 1.1.5 + object.values: 1.1.6 resolve: 1.22.1 tsconfig-paths: 3.14.1 transitivePeerDependencies: @@ -7291,24 +7519,24 @@ packages: - supports-color dev: true - /eslint-plugin-n/15.2.4_eslint@8.25.0: - resolution: {integrity: sha512-tjnVMv2fiXYMnuiIFI8QMtyUFI42SckEEWvi8h68SWGWshfqO6SSCASy24dGMGAiy7NUk6DZt90DM0iNUsmQ5w==} + /eslint-plugin-n/15.6.0_eslint@8.30.0: + resolution: {integrity: sha512-Hd/F7wz4Mj44Jp0H6Jtty13NcE69GNTY0rVlgTIj1XBnGGVI6UTdDrpE6vqu3AHo07bygq/N+7OH/lgz1emUJw==} engines: {node: '>=12.22.0'} peerDependencies: eslint: '>=7.0.0' dependencies: builtins: 5.0.1 - eslint: 8.25.0 - eslint-plugin-es: 4.1.0_eslint@8.25.0 - eslint-utils: 3.0.0_eslint@8.25.0 - ignore: 5.2.0 - is-core-module: 2.9.0 + eslint: 8.30.0 + eslint-plugin-es: 4.1.0_eslint@8.30.0 + eslint-utils: 3.0.0_eslint@8.30.0 + ignore: 5.2.4 + is-core-module: 2.11.0 minimatch: 3.1.2 resolve: 1.22.1 - semver: 7.3.7 + semver: 7.3.8 dev: true - /eslint-plugin-prettier/4.2.1_hvbqyfstm4urdpm6ffpwfka4e4: + /eslint-plugin-prettier/4.2.1_kl4pe43v5b43npmso5hoplpbyi: resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} engines: {node: '>=12.0.0'} peerDependencies: @@ -7319,34 +7547,34 @@ packages: eslint-config-prettier: optional: true dependencies: - eslint: 8.25.0 - eslint-config-prettier: 8.5.0_eslint@8.25.0 - prettier: 2.7.1 + eslint: 8.30.0 + eslint-config-prettier: 8.5.0_eslint@8.30.0 + prettier: 2.8.1 prettier-linter-helpers: 1.0.0 dev: true - /eslint-plugin-promise/6.0.0_eslint@8.25.0: - resolution: {integrity: sha512-7GPezalm5Bfi/E22PnQxDWH2iW9GTvAlUNTztemeHb6c1BniSyoeTrM87JkC0wYdi6aQrZX9p2qEiAno8aTcbw==} + /eslint-plugin-promise/6.1.1_eslint@8.30.0: + resolution: {integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: - eslint: 8.25.0 + eslint: 8.30.0 dev: true - /eslint-plugin-vue/9.3.0_eslint@8.25.0: - resolution: {integrity: sha512-iscKKkBZgm6fGZwFt6poRoWC0Wy2dQOlwUPW++CiPoQiw1enctV2Hj5DBzzjJZfyqs+FAXhgzL4q0Ww03AgSmQ==} + /eslint-plugin-vue/9.8.0_eslint@8.30.0: + resolution: {integrity: sha512-E/AXwcTzunyzM83C2QqDHxepMzvI2y6x+mmeYHbVDQlKFqmKYvRrhaVixEeeG27uI44p9oKDFiyCRw4XxgtfHA==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 dependencies: - eslint: 8.25.0 - eslint-utils: 3.0.0_eslint@8.25.0 + eslint: 8.30.0 + eslint-utils: 3.0.0_eslint@8.30.0 natural-compare: 1.4.0 nth-check: 2.1.1 - postcss-selector-parser: 6.0.10 - semver: 7.3.7 - vue-eslint-parser: 9.0.3_eslint@8.25.0 + postcss-selector-parser: 6.0.11 + semver: 7.3.8 + vue-eslint-parser: 9.1.0_eslint@8.30.0 xml-name-validator: 4.0.0 transitivePeerDependencies: - supports-color @@ -7374,13 +7602,13 @@ packages: eslint-visitor-keys: 1.3.0 dev: true - /eslint-utils/3.0.0_eslint@8.25.0: + /eslint-utils/3.0.0_eslint@8.30.0: resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} peerDependencies: eslint: '>=5' dependencies: - eslint: 8.25.0 + eslint: 8.30.0 eslint-visitor-keys: 2.1.0 dev: true @@ -7398,14 +7626,15 @@ packages: resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - /eslint/8.25.0: - resolution: {integrity: sha512-DVlJOZ4Pn50zcKW5bYH7GQK/9MsoQG2d5eDH0ebEkE8PbgzTTmtt/VTH9GGJ4BfeZCpBLqFfvsjX35UacUL83A==} + /eslint/8.30.0: + resolution: {integrity: sha512-MGADB39QqYuzEGov+F/qb18r4i7DohCDOfatHaxI2iGlPuC65bwG2gxgO+7DkyL38dRFaRH7RaRAgU6JKL9rMQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint/eslintrc': 1.3.3 - '@humanwhocodes/config-array': 0.10.7 + '@eslint/eslintrc': 1.4.0 + '@humanwhocodes/config-array': 0.11.8 '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 @@ -7413,23 +7642,23 @@ packages: doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.1.1 - eslint-utils: 3.0.0_eslint@8.25.0 + eslint-utils: 3.0.0_eslint@8.30.0 eslint-visitor-keys: 3.3.0 - espree: 9.4.0 + espree: 9.4.1 esquery: 1.4.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 6.0.1 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.17.0 - globby: 11.1.0 + globals: 13.19.0 grapheme-splitter: 1.0.4 - ignore: 5.2.0 + ignore: 5.2.4 import-fresh: 3.3.0 imurmurhash: 0.1.4 is-glob: 4.0.3 - js-sdsl: 4.1.5 + is-path-inside: 3.0.3 + js-sdsl: 4.2.0 js-yaml: 4.1.0 json-stable-stringify-without-jsonify: 1.0.1 levn: 0.4.1 @@ -7450,12 +7679,12 @@ packages: engines: {node: '>=6'} dev: false - /espree/9.4.0: - resolution: {integrity: sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==} + /espree/9.4.1: + resolution: {integrity: sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.8.0 - acorn-jsx: 5.3.2_acorn@8.8.0 + acorn: 8.8.1 + acorn-jsx: 5.3.2_acorn@8.8.1 eslint-visitor-keys: 3.3.0 dev: true @@ -7640,6 +7869,45 @@ packages: - supports-color dev: false + /express/4.18.2: + resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} + engines: {node: '>= 0.10.0'} + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.1 + content-disposition: 0.5.4 + content-type: 1.0.4 + cookie: 0.5.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.2.0 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.11.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.18.0 + serve-static: 1.15.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: false + /ext-list/2.2.2: resolution: {integrity: sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==} engines: {node: '>=0.10.0'} @@ -7734,8 +8002,8 @@ packages: - supports-color dev: false - /fast-glob/3.2.11: - resolution: {integrity: sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==} + /fast-glob/3.2.12: + resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} engines: {node: '>=8.6.0'} dependencies: '@nodelib/fs.stat': 2.0.5 @@ -7754,8 +8022,8 @@ packages: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} dev: false - /fastq/1.13.0: - resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} + /fastq/1.14.0: + resolution: {integrity: sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==} dependencies: reusify: 1.0.4 @@ -7800,10 +8068,6 @@ packages: resolution: {integrity: sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw==} dev: false - /figgy-pudding/3.5.2: - resolution: {integrity: sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==} - dev: true - /figures/1.7.0: resolution: {integrity: sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==} engines: {node: '>=0.10.0'} @@ -7830,7 +8094,7 @@ packages: engines: {node: '>=12'} dependencies: escape-string-regexp: 5.0.0 - is-unicode-supported: 1.2.0 + is-unicode-supported: 1.3.0 dev: false /file-entry-cache/6.0.1: @@ -7913,6 +8177,11 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: false + /filter-obj/5.1.0: + resolution: {integrity: sha512-qWeTREPoT7I0bifpPUXtxkZJ1XJzxWtfoWWkdVGqa+eCr3SHW/Ocp89o8vLvbUuQnadybJpjOKu4V+RwO6sGng==} + engines: {node: '>=14.16'} + dev: false + /finalhandler/1.1.2: resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} engines: {node: '>= 0.8'} @@ -7964,13 +8233,6 @@ packages: locate-path: 2.0.0 dev: true - /find-up/3.0.0: - resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} - engines: {node: '>=6'} - dependencies: - locate-path: 3.0.0 - dev: true - /find-up/4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -8007,12 +8269,12 @@ packages: resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: - flatted: 3.2.6 + flatted: 3.2.7 rimraf: 3.0.2 dev: true - /flatted/3.2.6: - resolution: {integrity: sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==} + /flatted/3.2.7: + resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} dev: true /flowchart.js/1.17.1: @@ -8078,6 +8340,11 @@ packages: engines: {node: '>=0.10.0'} dev: false + /form-data-encoder/2.1.4: + resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} + engines: {node: '>= 14.17'} + dev: false + /form-data/3.0.1: resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} engines: {node: '>= 6'} @@ -8145,6 +8412,15 @@ packages: jsonfile: 6.1.0 universalify: 2.0.0 + /fs-extra/11.1.0: + resolution: {integrity: sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==} + engines: {node: '>=14.14'} + dependencies: + graceful-fs: 4.2.10 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: false + /fs-extra/9.1.0: resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} engines: {node: '>=10'} @@ -8159,7 +8435,7 @@ packages: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} dependencies: - minipass: 3.3.4 + minipass: 3.3.6 /fs-monkey/1.0.3: resolution: {integrity: sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==} @@ -8184,7 +8460,7 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.1.4 - es-abstract: 1.20.1 + es-abstract: 1.20.5 functions-have-names: 1.2.3 dev: true @@ -8243,8 +8519,8 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - /get-intrinsic/1.1.2: - resolution: {integrity: sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==} + /get-intrinsic/1.1.3: + resolution: {integrity: sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==} dependencies: function-bind: 1.1.1 has: 1.0.3 @@ -8307,7 +8583,7 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - get-intrinsic: 1.1.2 + get-intrinsic: 1.1.3 dev: true /get-value/2.0.6: @@ -8321,18 +8597,18 @@ packages: dependencies: '@types/download': 8.0.1 '@types/node-fetch': 2.6.2 - '@types/semver': 7.3.10 + '@types/semver': 7.3.13 download: 8.0.0 node-fetch: 2.6.7 - semver: 7.3.7 + semver: 7.3.8 transitivePeerDependencies: - encoding dev: false - /giscus/1.2.0: - resolution: {integrity: sha512-IpfWvU0/hYbMGQKuoPlED8wWmluRYIOjtrBCnL7logsWjMpPRxiAC2pUIC0+SC0pDMOqXrk1onTYMHgwgRpRzg==} + /giscus/1.2.6: + resolution: {integrity: sha512-VqMWmCdlUk9krX2M3oMgn9/Y6XEbRXRHtfhNTuRn/AdeGOeko54OFEIsizQ/nYWymuUNGZR48KGptCtYL77rtA==} dependencies: - lit: 2.2.8 + lit: 2.5.0 dev: false /git-hooks-list/3.0.0: @@ -8390,7 +8666,7 @@ packages: engines: {node: '>= 6'} dependencies: glob: 7.2.3 - ignore: 5.2.0 + ignore: 5.2.4 lodash.difference: 4.5.0 lodash.union: 4.6.0 make-array: 1.0.5 @@ -8440,7 +8716,7 @@ packages: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 - minimatch: 5.1.0 + minimatch: 5.1.2 once: 1.4.0 /glob2base/0.0.12: @@ -8496,8 +8772,8 @@ packages: engines: {node: '>=4'} dev: false - /globals/13.17.0: - resolution: {integrity: sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==} + /globals/13.19.0: + resolution: {integrity: sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==} engines: {node: '>=8'} dependencies: type-fest: 0.20.2 @@ -8509,18 +8785,18 @@ packages: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.2.11 - ignore: 5.2.0 + fast-glob: 3.2.12 + ignore: 5.2.4 merge2: 1.4.1 slash: 3.0.0 - /globby/13.1.2: - resolution: {integrity: sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==} + /globby/13.1.3: + resolution: {integrity: sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: dir-glob: 3.0.1 - fast-glob: 3.2.11 - ignore: 5.2.0 + fast-glob: 3.2.12 + ignore: 5.2.4 merge2: 1.4.1 slash: 4.0.0 @@ -8548,6 +8824,12 @@ packages: minimist: 1.2.7 dev: false + /gopd/1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.1.3 + dev: true + /got/10.7.0: resolution: {integrity: sha512-aWTDeNw9g+XqEZNcTjMMZSy7B7yE9toWOFYip7ofFTLleJhvZwUxxTxkTpKvF+p1SAA4VHmuEy7PiHTHyq8tJg==} engines: {node: '>=10'} @@ -8571,6 +8853,23 @@ packages: type-fest: 0.10.0 dev: false + /got/12.5.3: + resolution: {integrity: sha512-8wKnb9MGU8IPGRIo+/ukTy9XLJBwDiCpIf5TVzQ9Cpol50eMTpBq2GAuDsuDIz7hTYmZgMgC1e9ydr6kSDWs3w==} + engines: {node: '>=14.16'} + dependencies: + '@sindresorhus/is': 5.3.0 + '@szmarczak/http-timer': 5.0.1 + cacheable-lookup: 7.0.0 + cacheable-request: 10.2.4 + decompress-response: 6.0.0 + form-data-encoder: 2.1.4 + get-stream: 6.0.1 + http2-wrapper: 2.2.0 + lowercase-keys: 3.0.0 + p-cancelable: 3.0.0 + responselike: 3.0.0 + dev: false + /got/8.3.2: resolution: {integrity: sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==} engines: {node: '>=4'} @@ -8622,12 +8921,6 @@ packages: resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} dev: true - /graphlib/2.1.8: - resolution: {integrity: sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==} - dependencies: - lodash: 4.17.21 - dev: false - /graphql/16.5.0: resolution: {integrity: sha512-qbHgh8Ix+j/qY+a/ZcJnFQ+j8ezakqPiHwPiZhV/3PgGlgf96QMBB5/f2rkiC9sgLoy/xvT6TSiaf2nTHJh5iA==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} @@ -8657,7 +8950,7 @@ packages: source-map: 0.6.1 wordwrap: 1.0.0 optionalDependencies: - uglify-js: 3.16.3 + uglify-js: 3.17.4 dev: true /hard-rejection/2.1.0: @@ -8702,7 +8995,7 @@ packages: /has-property-descriptors/1.0.0: resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} dependencies: - get-intrinsic: 1.1.2 + get-intrinsic: 1.1.3 dev: true /has-symbol-support-x/1.4.2: @@ -8765,6 +9058,11 @@ packages: engines: {node: '>=8'} dev: false + /has-yarn/3.0.0: + resolution: {integrity: sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + /has/1.0.3: resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} engines: {node: '>= 0.4.0'} @@ -8795,6 +9093,10 @@ packages: hasBin: true dev: false + /heap/0.2.7: + resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} + dev: false + /homedir-polyfill/1.0.3: resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} engines: {node: '>=0.10.0'} @@ -8811,11 +9113,11 @@ packages: dependencies: lru-cache: 6.0.0 - /hosted-git-info/5.1.0: - resolution: {integrity: sha512-Ek+QmMEqZF8XrbFdwoDjSbm7rT23pCgEMOJmz6GPk/s4yH//RQfNPArhIxbguNxROq/+5lNBwCDHMhA903Kx1Q==} + /hosted-git-info/5.2.1: + resolution: {integrity: sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: - lru-cache: 7.14.0 + lru-cache: 7.14.1 dev: true /hpack.js/2.1.6: @@ -8845,7 +9147,7 @@ packages: terser: 5.14.2 dev: false - /html-webpack-plugin/5.5.0_webpack@5.74.0: + /html-webpack-plugin/5.5.0_webpack@5.75.0: resolution: {integrity: sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==} engines: {node: '>=10.13.0'} peerDependencies: @@ -8859,16 +9161,7 @@ packages: lodash: 4.17.21 pretty-error: 4.0.0 tapable: 2.2.1 - webpack: 5.74.0 - dev: false - - /htmlparser2/5.0.1: - resolution: {integrity: sha512-vKZZra6CSe9qsJzh0BjBGXo8dvzNsq/oGvsjfRdOrrryfeD9UOBEEQdeoqCRmKZchF5h2zOBMQ6YuQ0uRUmdbQ==} - dependencies: - domelementtype: 2.3.0 - domhandler: 3.3.0 - domutils: 2.8.0 - entities: 2.2.0 + webpack: 5.75.0 dev: false /htmlparser2/6.1.0: @@ -8880,6 +9173,15 @@ packages: entities: 2.2.0 dev: false + /htmlparser2/8.0.1: + resolution: {integrity: sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.0.1 + entities: 4.4.0 + dev: false + /http-cache-semantics/3.8.1: resolution: {integrity: sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==} dev: false @@ -8951,7 +9253,7 @@ packages: - supports-color dev: false - /http-proxy-middleware/2.0.6_@types+express@4.17.13: + /http-proxy-middleware/2.0.6_@types+express@4.17.15: resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==} engines: {node: '>=12.0.0'} peerDependencies: @@ -8960,7 +9262,7 @@ packages: '@types/express': optional: true dependencies: - '@types/express': 4.17.13 + '@types/express': 4.17.15 '@types/http-proxy': 1.17.9 http-proxy: 1.18.1 is-glob: 4.0.3 @@ -9021,6 +9323,14 @@ packages: - debug dev: false + /http2-wrapper/2.2.0: + resolution: {integrity: sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==} + engines: {node: '>=10.19.0'} + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + dev: false + /https-proxy-agent/5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} @@ -9054,8 +9364,8 @@ packages: ms: 2.1.3 dev: true - /husky/8.0.1: - resolution: {integrity: sha512-xs7/chUH/CKdOCs7Zy0Aev9e/dKOMZf3K1Az1nar3tzlv0jfqnYtu235bstsWTmXOR0EfINrPa97yy4Lz6RiKw==} + /husky/8.0.2: + resolution: {integrity: sha512-Tkv80jtvbnkK3mYWxPZePGFpQ/tT3HNSs/sasF9P2YfkMezDl3ON37YN6jUUI4eTg5LcyVynlb6r4eyvOmspvg==} engines: {node: '>=14'} hasBin: true dev: true @@ -9072,7 +9382,7 @@ packages: dependencies: safer-buffer: 2.1.2 - /icss-utils/5.1.0_postcss@8.4.18: + /icss-utils/5.1.0_postcss@8.4.20: resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: @@ -9081,7 +9391,7 @@ packages: postcss: optional: true dependencies: - postcss: 8.4.18 + postcss: 8.4.20 dev: false /ieee754/1.2.1: @@ -9091,7 +9401,7 @@ packages: resolution: {integrity: sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: - minimatch: 5.1.0 + minimatch: 5.1.2 dev: true /ignore/4.0.6: @@ -9099,8 +9409,8 @@ packages: engines: {node: '>= 4'} dev: false - /ignore/5.2.0: - resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==} + /ignore/5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} engines: {node: '>= 4'} /immutable/4.1.0: @@ -9119,6 +9429,11 @@ packages: engines: {node: '>=4'} dev: false + /import-lazy/4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + dev: false + /imurmurhash/0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} @@ -9162,6 +9477,11 @@ packages: engines: {node: '>=10'} dev: false + /ini/3.0.1: + resolution: {integrity: sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dev: true + /inquirer-autocomplete-prompt/1.4.0_inquirer@6.5.2: resolution: {integrity: sha512-qHgHyJmbULt4hI+kCmwX92MnSxDs/Yhdt4wPA30qnoa01OF6uTXV8yvH4hKXgdaTNmkZ9D01MHjqKYEuJN+ONw==} engines: {node: '>=10'} @@ -9209,18 +9529,18 @@ packages: mute-stream: 0.0.8 ora: 5.4.1 run-async: 2.4.1 - rxjs: 7.5.6 + rxjs: 7.8.0 string-width: 4.2.3 strip-ansi: 6.0.1 through: 2.3.8 wrap-ansi: 7.0.0 dev: true - /internal-slot/1.0.3: - resolution: {integrity: sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==} + /internal-slot/1.0.4: + resolution: {integrity: sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.1.2 + get-intrinsic: 1.1.3 has: 1.0.3 side-channel: 1.0.4 dev: true @@ -9310,8 +9630,8 @@ packages: builtin-modules: 3.3.0 dev: false - /is-callable/1.2.4: - resolution: {integrity: sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==} + /is-callable/1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} dev: true @@ -9322,8 +9642,15 @@ packages: ci-info: 2.0.0 dev: false - /is-core-module/2.9.0: - resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==} + /is-ci/3.0.1: + resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} + hasBin: true + dependencies: + ci-info: 3.3.2 + dev: false + + /is-core-module/2.11.0: + resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} dependencies: has: 1.0.3 @@ -9455,6 +9782,11 @@ packages: engines: {node: '>=10'} dev: false + /is-npm/6.0.0: + resolution: {integrity: sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + /is-number-object/1.0.7: resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} engines: {node: '>= 0.4'} @@ -9493,9 +9825,18 @@ packages: engines: {node: '>=6'} dev: false + /is-path-cwd/3.0.0: + resolution: {integrity: sha512-kyiNFFLU0Ampr6SDZitD/DwUo4Zs1nSdnygUBqsu3LooL00Qvb5j+UnvApUn/TTj1J3OuE6BTdQ5rudKmU2ZaA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + /is-path-inside/3.0.3: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} + + /is-path-inside/4.0.0: + resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} + engines: {node: '>=12'} dev: false /is-plain-obj/1.1.0: @@ -9597,8 +9938,8 @@ packages: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} - /is-unicode-supported/1.2.0: - resolution: {integrity: sha512-wH+U77omcRzevfIG8dDhTS0V9zZyweakfD01FULl97+0EHiJTTZtJqxPSkIIo/SDPv/i07k/C9jAPY+jwLLeUQ==} + /is-unicode-supported/1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} engines: {node: '>=12'} /is-url-superb/4.0.0: @@ -9640,6 +9981,11 @@ packages: resolution: {integrity: sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==} dev: false + /is-yarn-global/0.4.1: + resolution: {integrity: sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==} + engines: {node: '>=12'} + dev: false + /isarray/1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} @@ -9716,7 +10062,7 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 18.8.5 + '@types/node': 18.11.18 merge-stream: 2.0.0 supports-color: 8.1.1 dev: false @@ -9730,8 +10076,8 @@ packages: engines: {node: '>=10'} dev: false - /js-sdsl/4.1.5: - resolution: {integrity: sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==} + /js-sdsl/4.2.0: + resolution: {integrity: sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==} dev: true /js-string-escape/1.0.1: @@ -9777,6 +10123,11 @@ packages: /json-parse-even-better-errors/2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + /json-parse-even-better-errors/3.0.0: + resolution: {integrity: sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + /json-schema-traverse/0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -9791,14 +10142,6 @@ packages: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} dev: true - /json2yaml/1.1.0: - resolution: {integrity: sha512-/xse+m0SlllfZahQrNOelmLrFNfeZv4QG0QKlvg7VsPSGIxpB3X+ggLkdffwmI1DdQ3o9XjZX+K+EOI1epdKgg==} - engines: {node: '>= 0.2.0'} - hasBin: true - dependencies: - remedial: 1.0.8 - dev: false - /json5/1.0.1: resolution: {integrity: sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==} hasBin: true @@ -9812,6 +10155,10 @@ packages: hasBin: true dev: false + /jsonc-parser/3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: false + /jsonfile/6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} dependencies: @@ -9824,6 +10171,11 @@ packages: engines: {'0': node >= 0.2.0} dev: true + /jsonpointer/5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} + engines: {node: '>=0.10.0'} + dev: false + /jsonwebtoken/8.5.1: resolution: {integrity: sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==} engines: {node: '>=4', npm: '>=1.4.28'} @@ -9840,20 +10192,6 @@ packages: semver: 5.7.1 dev: false - /juice/8.1.0: - resolution: {integrity: sha512-FLzurJrx5Iv1e7CfBSZH68dC04EEvXvvVvPYB7Vx1WAuhCp1ZPIMtqxc+WTWxVkpTIC2Ach/GAv0rQbtGf6YMA==} - engines: {node: '>=10.0.0'} - hasBin: true - dependencies: - cheerio: 1.0.0-rc.10 - commander: 6.2.1 - mensch: 0.3.4 - slick: 1.12.2 - web-resource-inliner: 6.0.1 - transitivePeerDependencies: - - encoding - dev: false - /junk/3.1.0: resolution: {integrity: sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==} engines: {node: '>=8'} @@ -9883,8 +10221,8 @@ packages: resolution: {integrity: sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==} dev: false - /katex/0.16.2: - resolution: {integrity: sha512-70DJdQAyh9EMsthw3AaQlDyFf54X7nWEUIa5W+rq8XOpEk//w5Th7/8SqFqpvi/KZ2t6MHUj4f9wLmztBmAYQA==} + /katex/0.16.4: + resolution: {integrity: sha512-WudRKUj8yyBeVDI4aYMNxhx5Vhh2PjpzQw1GRu/LVGqL4m1AxwD1GcUp0IMbdJaf5zsjtj8ghP0DOQRYhroNkw==} hasBin: true dependencies: commander: 8.3.0 @@ -9916,6 +10254,12 @@ packages: json-buffer: 3.0.1 dev: false + /keyv/4.5.2: + resolution: {integrity: sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==} + dependencies: + json-buffer: 3.0.1 + dev: false + /khroma/2.0.0: resolution: {integrity: sha512-2J8rDNlQWbtiNYThZRvmMv5yt44ZakX+Tz5ZIp/mN1pt4snn+m030Va5Z4v8xA0cQFDXBwO/8i42xL4QPsVk3g==} dev: false @@ -9958,8 +10302,8 @@ packages: engines: {node: '>= 8'} dev: false - /kolorist/1.5.1: - resolution: {integrity: sha512-lxpCM3HTvquGxKGzHeknB/sUjuVoUElLlfYnXZT73K8geR9jQbroGlSCFBax9/0mpGoD3kzcMLnOlGQPJJNyqQ==} + /kolorist/1.6.0: + resolution: {integrity: sha512-dLkz37Ab97HWMx9KTes3Tbi3D1ln9fCAy2zr2YVExJasDRPGRaKcoE4fycWNtnCAJfjFqe0cnY+f8KT2JePEXQ==} dev: false /kuler/2.0.0: @@ -9971,7 +10315,7 @@ packages: engines: {node: '>=6'} hasBin: true dependencies: - commander: 9.4.0 + commander: 9.4.1 dotenv: 16.0.3 winston: 3.8.1 dev: false @@ -9983,6 +10327,21 @@ packages: package-json: 6.5.0 dev: false + /latest-version/7.0.0: + resolution: {integrity: sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==} + engines: {node: '>=14.16'} + dependencies: + package-json: 8.1.0 + dev: false + + /layout-base/1.0.2: + resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} + dev: false + + /layout-base/2.0.1: + resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==} + dev: false + /lazystream/1.0.1: resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} engines: {node: '>= 0.6.3'} @@ -10027,8 +10386,8 @@ packages: - utf-8-validate dev: false - /leancloud-storage/4.13.2: - resolution: {integrity: sha512-JTZFpgNZ9locakd5yzz+aE5YKrwJhIXM1XZAXcLcDOtWnSsT1y1oiOC0qGOcIbRnE1RlOxiYMvySZXGL2vwV2g==} + /leancloud-storage/4.14.0: + resolution: {integrity: sha512-DCJ67Dk6jrmCnoKZ/zTDwZSeBg2Gk2vHG8wnk2oWEJgcR290BB/2nDSe0H0xPT6nY36qfYYbNmM/tHPtLzRO0A==} dependencies: '@babel/runtime-corejs3': 7.18.9 '@leancloud/adapter-types': 5.0.0 @@ -10070,19 +10429,9 @@ packages: type-check: 0.4.0 dev: true - /libnpmconfig/1.2.1: - resolution: {integrity: sha512-9esX8rTQAHqarx6qeZqmGQKBNZR5OIbl/Ayr0qQDy3oXja2iFVQQI81R6GZ2a02bSNZ9p3YOGX1O6HHCb1X7kA==} - deprecated: This module is not used anymore. npm config is parsed by npm itself and by @npmcli/config - dependencies: - figgy-pudding: 3.5.2 - find-up: 3.0.0 - ini: 1.3.8 - dev: true - - /lilconfig/2.0.5: - resolution: {integrity: sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==} + /lilconfig/2.0.6: + resolution: {integrity: sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==} engines: {node: '>=10'} - dev: true /lines-and-columns/1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} @@ -10093,24 +10442,24 @@ packages: uc.micro: 1.0.6 dev: false - /lint-staged/13.0.3: - resolution: {integrity: sha512-9hmrwSCFroTSYLjflGI8Uk+GWAwMB4OlpU4bMJEAT5d/llQwtYKoim4bLOyLCuWFAhWEupE0vkIFqtw/WIsPug==} + /lint-staged/13.1.0: + resolution: {integrity: sha512-pn/sR8IrcF/T0vpWLilih8jmVouMlxqXxKuAojmbiGX5n/gDnz+abdPptlj0vYnbfE0SQNl3CY/HwtM0+yfOVQ==} engines: {node: ^14.13.1 || >=16.0.0} hasBin: true dependencies: cli-truncate: 3.1.0 colorette: 2.0.19 - commander: 9.4.0 + commander: 9.4.1 debug: 4.3.4 execa: 6.1.0 - lilconfig: 2.0.5 - listr2: 4.0.5 + lilconfig: 2.0.6 + listr2: 5.0.6 micromatch: 4.0.5 normalize-path: 3.0.0 object-inspect: 1.12.2 pidtree: 0.6.0 string-argv: 0.3.1 - yaml: 2.1.3 + yaml: 2.2.0 transitivePeerDependencies: - enquirer - supports-color @@ -10166,9 +10515,9 @@ packages: - zenObservable dev: false - /listr2/4.0.5: - resolution: {integrity: sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA==} - engines: {node: '>=12'} + /listr2/5.0.6: + resolution: {integrity: sha512-u60KxKBy1BR2uLJNTWNptzWQ1ob/gjMzIJPZffAENzpZqbMZ/5PrXXOomDcevIS/+IB7s1mmCEtSlT2qHWMqag==} + engines: {node: ^14.13.1 || >=16.0.0} peerDependencies: enquirer: '>= 2.3.0 < 3' peerDependenciesMeta: @@ -10180,7 +10529,7 @@ packages: log-update: 4.0.0 p-map: 4.0.0 rfdc: 1.3.0 - rxjs: 7.5.6 + rxjs: 7.8.0 through: 2.3.8 wrap-ansi: 7.0.0 dev: true @@ -10188,22 +10537,22 @@ packages: /lit-element/3.2.2: resolution: {integrity: sha512-6ZgxBR9KNroqKb6+htkyBwD90XGRiqKDHVrW/Eh0EZ+l+iC+u+v+w3/BA5NGi4nizAVHGYvQBHUDuSmLjPp7NQ==} dependencies: - '@lit/reactive-element': 1.3.4 - lit-html: 2.2.7 + '@lit/reactive-element': 1.5.0 + lit-html: 2.5.0 dev: false - /lit-html/2.2.7: - resolution: {integrity: sha512-JhqiAwO1l03kRe68uBZ0i2x4ef2S5szY9vvP411nlrFZIpKK4/hwnhA/15bqbvxe1lV3ipBdhaOzHmyOk7QIRg==} + /lit-html/2.5.0: + resolution: {integrity: sha512-bLHosg1XL3JRUcKdSVI0sLCs0y1wWrj2sqqAN3cZ7bDDPNgmDHH29RV48x6Wz3ZmkxIupaE+z7uXSZ/pXWAO1g==} dependencies: '@types/trusted-types': 2.0.2 dev: false - /lit/2.2.8: - resolution: {integrity: sha512-QjeNbi/H9LVIHR+u0OqsL+hs62a16m02JlJHYN48HcBuXyiPYR8JvzsTp5dYYS81l+b9Emp3UaGo82EheV0pog==} + /lit/2.5.0: + resolution: {integrity: sha512-DtnUP6vR3l4Q8nRPPNBD+UxbAhwJPeky+OVbi3pdgMqm0g57xFSl1Sj64D1rIB+nVNdiVVg8YxB0hqKjvdadZA==} dependencies: - '@lit/reactive-element': 1.3.4 + '@lit/reactive-element': 1.5.0 lit-element: 3.2.2 - lit-html: 2.2.7 + lit-html: 2.5.0 dev: false /load-json-file/4.0.0: @@ -10242,14 +10591,6 @@ packages: path-exists: 3.0.0 dev: true - /locate-path/3.0.0: - resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} - engines: {node: '>=6'} - dependencies: - p-locate: 3.0.0 - path-exists: 3.0.0 - dev: true - /locate-path/5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -10273,6 +10614,10 @@ packages: resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} dev: false + /lodash.camelcase/4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + dev: true + /lodash.deburr/4.1.0: resolution: {integrity: sha512-m/M1U1f3ddMCs6Hq2tAsYThTBDaAKFDX3dwDo97GEYzamXi9SqUpjWi/Rrj/gf3X2n8ktwgZrlP1z6E3v/IExQ==} dev: false @@ -10300,6 +10645,10 @@ packages: resolution: {integrity: sha512-oKMuF3xEeqDltrGMfDxAPGIVMSSRv8tbRSODbrs4KGsRRLEhrW8N8Rd4DRgB2+621hY8A8XwwrTVhXWpxFvMzg==} dev: false + /lodash.isfunction/3.0.9: + resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==} + dev: true + /lodash.isinteger/4.0.4: resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} dev: false @@ -10314,23 +10663,39 @@ packages: /lodash.isplainobject/4.0.6: resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} - dev: false /lodash.isstring/4.0.1: resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} dev: false + /lodash.kebabcase/4.1.1: + resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} + dev: true + /lodash.map/4.6.0: resolution: {integrity: sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==} dev: true /lodash.merge/4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /lodash.mergewith/4.6.2: + resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + dev: true /lodash.once/4.1.1: resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} dev: false + /lodash.snakecase/4.1.1: + resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} + dev: true + + /lodash.startcase/4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + dev: true + /lodash.transform/4.6.0: resolution: {integrity: sha512-LO37ZnhmBVx0GvOU/caQuipEh4GN82TcWv3yHlebGDgOxbxiwwzW5Pcx2AcvpIv2WmvmSMoC492yQFNhy/l/UQ==} dev: false @@ -10338,6 +10703,14 @@ packages: /lodash.union/4.6.0: resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==} + /lodash.uniq/4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + dev: true + + /lodash.upperfirst/4.3.1: + resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} + dev: true + /lodash/4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} @@ -10351,7 +10724,7 @@ packages: jest-validate: 27.5.1 map-obj: 5.0.2 moize: 6.1.1 - semver: 7.3.7 + semver: 7.3.8 dev: false /log-symbols/1.0.2: @@ -10372,8 +10745,8 @@ packages: resolution: {integrity: sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==} engines: {node: '>=12'} dependencies: - chalk: 5.1.2 - is-unicode-supported: 1.2.0 + chalk: 5.2.0 + is-unicode-supported: 1.3.0 /log-update/2.3.0: resolution: {integrity: sha512-vlP11XfFGyeNQlmEn9tJ66rEW1coA/79m5z6BCkudjbAGE83uhAcGYrBFwfs3AdLiLzGRusRPAbSPK9xZteCmg==} @@ -10428,7 +10801,7 @@ packages: /lower-case/2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} dependencies: - tslib: 2.4.0 + tslib: 2.4.1 dev: false /lowercase-keys/1.0.0: @@ -10446,14 +10819,25 @@ packages: engines: {node: '>=8'} dev: false + /lowercase-keys/3.0.0: + resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + + /lru-cache/5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + dev: false + /lru-cache/6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} dependencies: yallist: 4.0.0 - /lru-cache/7.14.0: - resolution: {integrity: sha512-EIRtP1GrSJny0dqb50QXRUNBxHJhcpxHC++M5tD7RYbvLLn5KVWKsbyswSSqDuU15UFi3bgTQIY8nhDMeF6aDQ==} + /lru-cache/7.14.1: + resolution: {integrity: sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==} engines: {node: '>=12'} dev: true @@ -10480,6 +10864,13 @@ packages: sourcemap-codec: 1.4.8 dev: false + /magic-string/0.27.0: + resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.14 + dev: false + /make-array/1.0.5: resolution: {integrity: sha512-sgK2SAzxT19rWU+qxKUcn6PAh/swiIiz2F8C2cZjLc1z4iwYIfdoihqFIDQ8BDzAGtWPYJ6Sr13K1j/DXynDLA==} engines: {node: '>=0.10.0'} @@ -10519,8 +10910,8 @@ packages: http-proxy-agent: 5.0.0 https-proxy-agent: 5.0.1 is-lambda: 1.0.1 - lru-cache: 7.14.0 - minipass: 3.3.4 + lru-cache: 7.14.1 + minipass: 3.3.6 minipass-collect: 1.0.2 minipass-fetch: 2.1.2 minipass-flush: 1.0.5 @@ -10561,8 +10952,8 @@ packages: object-visit: 1.0.1 dev: false - /markdown-it-anchor/8.6.4_ea7kj7wzjkld5jo2noyjqxi764: - resolution: {integrity: sha512-Ul4YVYZNxMJYALpKtu+ZRdrryYt/GlQ5CK+4l1bp/gWXOG2QWElt6AqF3Mih/wfUKdZbNAZVXGR73/n6U/8img==} + /markdown-it-anchor/8.6.6_ea7kj7wzjkld5jo2noyjqxi764: + resolution: {integrity: sha512-jRW30YGywD2ESXDc+l17AiritL0uVaSnWsb26f+68qaW9zgbIIr1f4v2Nsvc0+s0Z2N3uX6t/yAw7BwCQ1wMsA==} peerDependencies: '@types/markdown-it': '*' markdown-it: '*' @@ -10590,8 +10981,8 @@ packages: uc.micro: 1.0.6 dev: false - /marked/4.1.1: - resolution: {integrity: sha512-0cNMnTcUJPxbA6uWmCmjWz4NJRe/0Xfk2NhXCUHjew9qJzFN20krFnsUe7QynwqOwa5m1fZ4UDg0ycKFVC0ccw==} + /marked/4.2.5: + resolution: {integrity: sha512-jPueVhumq7idETHkb203WDD4fMA3yV9emQ5vLwop58lu8bTclMghBWcYAavlDqIEMaisADinV1TooIFCfqOsYQ==} engines: {node: '>= 12'} hasBin: true dev: false @@ -10646,8 +11037,8 @@ packages: engines: {node: '>= 0.6'} dev: false - /medium-zoom/1.0.6: - resolution: {integrity: sha512-UdiUWfvz9fZMg1pzf4dcuqA0W079o0mpqbTnOz5ip4VGYX96QjmbM+OgOU/0uOzAytxC0Ny4z+VcYQnhdifimg==} + /medium-zoom/1.0.8: + resolution: {integrity: sha512-CjFVuFq/IfrdqesAXfg+hzlDKu6A2n80ZIq0Kl9kWjoHh9j1N9Uvk5X0/MmN0hOfm5F9YBswlClhcwnmtwz7gA==} dev: false /memfs/3.4.7: @@ -10661,17 +11052,13 @@ packages: resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==} dev: false - /mensch/0.3.4: - resolution: {integrity: sha512-IAeFvcOnV9V0Yk+bFhYR07O3yNina9ANIN5MoXBKYJ/RLYPurd2d0yw14MDhpr9/momp0WofT1bPUh3hkzdi/g==} - dev: false - /meow/8.1.2: resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} engines: {node: '>=10'} dependencies: '@types/minimist': 1.2.2 camelcase-keys: 6.2.2 - decamelize-keys: 1.1.0 + decamelize-keys: 1.1.1 hard-rejection: 2.1.0 minimist-options: 4.1.0 normalize-package-data: 3.0.3 @@ -10704,18 +11091,19 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - /mermaid/9.1.7: - resolution: {integrity: sha512-MRVHXy5FLjnUQUG7YS3UN9jEN6FXCJbFCXVGJQjVIbiR6Vhw0j/6pLIjqsiah9xoHmQU6DEaKOvB3S1g/1nBPA==} + /mermaid/9.3.0: + resolution: {integrity: sha512-mGl0BM19TD/HbU/LmlaZbjBi//tojelg8P/mxD6pPZTAYaI+VawcyBdqRsoUHSc7j71PrMdJ3HBadoQNdvP5cg==} dependencies: '@braintree/sanitize-url': 6.0.0 d3: 7.6.1 - dagre: 0.8.5 - dagre-d3: 0.6.4 - dompurify: 2.4.0 - graphlib: 2.1.8 + dagre-d3-es: 7.0.6 + dompurify: 2.4.1 khroma: 2.0.0 + lodash-es: 4.17.21 moment-mini: 2.24.0 - stylis: 4.1.1 + non-layered-tidy-tree-layout: 2.0.2 + stylis: 4.1.3 + uuid: 9.0.0 dev: false /methods/1.1.2: @@ -10735,6 +11123,10 @@ packages: resolution: {integrity: sha512-rk0OlvEQkShjbr2EvGn1+GdCsgLDgABQyM9ZV6VoHNU7hiNM+eSOkjGWhiNabU/XWiEalWbjNQrNO+zcqd+pEA==} dev: false + /micro-memoize/4.0.14: + resolution: {integrity: sha512-2tzWP1w2Hh+r7kCYa4f//jpBEA6dAueiuLco38NxfjF9Py3KCCI7wVOTdCvOhmTC043t+ulclVBdl3v+s+UJIQ==} + dev: false + /micromatch/3.1.10: resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==} engines: {node: '>=0.10.0'} @@ -10831,13 +11223,23 @@ packages: engines: {node: '>=8'} dev: false + /mimic-response/3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + dev: false + + /mimic-response/4.0.0: + resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + /min-indent/1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} dev: true - /mini-css-extract-plugin/2.6.1_webpack@5.74.0: - resolution: {integrity: sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg==} + /mini-css-extract-plugin/2.7.2_webpack@5.75.0: + resolution: {integrity: sha512-EdlUizq13o0Pd+uCp+WO/JpkLvHRVGt97RqfeGhXqAcorYo1ypJSpkV+WDT0vY/kmh/p7wRdJNJtuyK540PXDw==} engines: {node: '>= 12.13.0'} peerDependencies: webpack: ^5.0.0 @@ -10846,7 +11248,7 @@ packages: optional: true dependencies: schema-utils: 4.0.0 - webpack: 5.74.0 + webpack: 5.75.0 dev: false /minimalistic-assert/1.0.1: @@ -10858,8 +11260,8 @@ packages: dependencies: brace-expansion: 1.1.11 - /minimatch/5.1.0: - resolution: {integrity: sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==} + /minimatch/5.1.2: + resolution: {integrity: sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==} engines: {node: '>=10'} dependencies: brace-expansion: 2.0.1 @@ -10884,14 +11286,14 @@ packages: resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} engines: {node: '>= 8'} dependencies: - minipass: 3.3.4 + minipass: 3.3.6 dev: true /minipass-fetch/2.1.2: resolution: {integrity: sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: - minipass: 3.3.4 + minipass: 3.3.6 minipass-sized: 1.0.3 minizlib: 2.1.2 optionalDependencies: @@ -10902,32 +11304,38 @@ packages: resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} engines: {node: '>= 8'} dependencies: - minipass: 3.3.4 + minipass: 3.3.6 dev: true /minipass-json-stream/1.0.1: resolution: {integrity: sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==} dependencies: jsonparse: 1.3.1 - minipass: 3.3.4 + minipass: 3.3.6 dev: true /minipass-pipeline/1.2.4: resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} engines: {node: '>=8'} dependencies: - minipass: 3.3.4 + minipass: 3.3.6 dev: true /minipass-sized/1.0.3: resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} engines: {node: '>=8'} dependencies: - minipass: 3.3.4 + minipass: 3.3.6 dev: true - /minipass/3.3.4: - resolution: {integrity: sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==} + /minipass/3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + dependencies: + yallist: 4.0.0 + + /minipass/4.0.0: + resolution: {integrity: sha512-g2Uuh2jEKoht+zvO6vJqXmYpflPqzRBT+Th2h01DKh5z7wbY/AZ2gCQ78cP70YoHPyFdY30YBV5WxgLOEwOykw==} engines: {node: '>=8'} dependencies: yallist: 4.0.0 @@ -10940,7 +11348,7 @@ packages: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} dependencies: - minipass: 3.3.4 + minipass: 3.3.6 yallist: 4.0.0 /mixin-deep/1.3.2: @@ -10988,6 +11396,13 @@ packages: micro-memoize: 4.0.10 dev: false + /moize/6.1.4: + resolution: {integrity: sha512-Ga8V0iu7XHDz6GR50pAaGjc3hJ5CVmWUgQRyWFAn4pYrBzITx9dMlXOGhURP2qmO3WTeOC9Yu17MlFV6PY2m/g==} + dependencies: + fast-equals: 3.0.3 + micro-memoize: 4.0.14 + dev: false + /moment-mini/2.24.0: resolution: {integrity: sha512-9ARkWHBs+6YJIvrIp0Ik5tyTTtP9PoV0Ssu2Ocq5y9v8+NOOpWiRshAp8c4rZVWTOe+157on/5G+zj5pwIQFEQ==} dev: false @@ -11026,7 +11441,7 @@ packages: dev: false /mute-stream/0.0.7: - resolution: {integrity: sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=} + resolution: {integrity: sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==} dev: false /mute-stream/0.0.8: @@ -11082,6 +11497,10 @@ packages: - supports-color dev: false + /natural-compare-lite/1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + dev: true + /natural-compare/1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true @@ -11097,18 +11516,18 @@ packages: resolution: {integrity: sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==} dev: false - /netlify-cli/12.0.9_@types+node@18.8.5: - resolution: {integrity: sha512-AbQZvKKkvQi0WV20G9kr7HlkY6yMnGeq00o9pK2Qox/owzjn4p6zq/a//SmgWuiqaIkXMOTlDd+3vwtfSPwywg==} + /netlify-cli/12.5.0_@types+node@18.11.18: + resolution: {integrity: sha512-W8e+k7q0GOCHiVgq4LiV/FVtwcnbAy6G9u8tMdpjY0By7/lhnUzyxnntLaTFJ+40On4qflkin0DGYpzlnWtqEw==} engines: {node: ^14.16.0 || >=16.0.0} hasBin: true requiresBuild: true dependencies: - '@netlify/build': 28.0.0_@types+node@18.8.5 - '@netlify/config': 19.0.0 - '@netlify/edge-bundler': 2.7.0 - '@netlify/framework-info': 9.3.0 + '@netlify/build': 29.3.0_@types+node@18.11.18 + '@netlify/config': 20.2.0 + '@netlify/edge-bundler': 8.0.0 + '@netlify/framework-info': 9.5.3 '@netlify/local-functions-proxy': 1.1.1 - '@netlify/zip-it-and-ship-it': 7.1.2 + '@netlify/zip-it-and-ship-it': 8.2.0 '@octokit/rest': 19.0.5 ansi-escapes: 5.0.0 ansi-styles: 5.2.0 @@ -11121,7 +11540,7 @@ packages: chokidar: 3.5.3 ci-info: 3.3.2 clean-deep: 3.4.0 - commander: 9.4.0 + commander: 9.4.1 concordance: 5.0.4 configstore: 5.0.1 content-type: 1.0.4 @@ -11130,7 +11549,6 @@ packages: cron-parser: 4.6.0 debug: 4.3.4 decache: 4.6.1 - del: 6.1.1 dot-prop: 6.0.1 dotenv: 16.0.3 env-paths: 2.2.1 @@ -11167,17 +11585,15 @@ packages: lodash: 4.17.21 log-symbols: 4.1.0 log-update: 5.0.1 - memoize-one: 6.0.0 minimist: 1.2.7 multiparty: 4.2.3 - netlify: 13.0.0 - netlify-headers-parser: 7.0.0 + netlify: 13.1.0 + netlify-headers-parser: 7.1.0 netlify-onegraph-internal: 0.10.1 - netlify-redirect-parser: 14.0.0 + netlify-redirect-parser: 14.1.0 netlify-redirector: 0.3.1 node-fetch: 2.6.7 node-version-alias: 1.0.1 - omit.js: 2.0.2 ora: 5.4.1 p-filter: 2.1.0 p-map: 4.0.0 @@ -11190,7 +11606,7 @@ packages: pump: 3.0.0 raw-body: 2.5.1 read-pkg-up: 7.0.1 - semver: 7.3.7 + semver: 7.3.8 source-map-support: 0.5.21 static-server: 2.2.1 string-similarity: 4.0.4 @@ -11203,7 +11619,7 @@ packages: to-readable-stream: 2.1.0 toml: 3.0.0 unixify: 1.0.0 - update-notifier: 5.1.0 + update-notifier: 6.0.2 uuid: 9.0.0 wait-port: 1.0.3 winston: 3.8.1 @@ -11219,11 +11635,12 @@ packages: - zenObservable dev: false - /netlify-headers-parser/7.0.0: - resolution: {integrity: sha512-pTZFMII81vmomcedriYJbc4V4dOnxMOI++zTpiRpELvpsz704BFS0y8Hzkajep2qfNTdf5zOCWnuj0FZtFDN5w==} + /netlify-headers-parser/7.1.0: + resolution: {integrity: sha512-KX+YETETcibTx/yNyzFJ+78GbXTG1kmEgORAPeKJFHQhRQWeix8Mfnu0a/NK4hJt7seOdQQOCAA6FaZer+LEBw==} engines: {node: ^14.16.0 || >=16.0.0} dependencies: escape-string-regexp: 5.0.0 + fast-safe-stringify: 2.1.1 is-plain-obj: 4.1.0 map-obj: 5.0.2 path-exists: 5.0.0 @@ -11241,10 +11658,11 @@ packages: - encoding dev: false - /netlify-redirect-parser/14.0.0: - resolution: {integrity: sha512-MEqZ6fwVp0CBhOeM5QNOTrUel3U3kDKBRM9MTXMLEgHCb96YuGfMPiCGmNzk98mzVsa2iG7nyp1IGItV203iJQ==} + /netlify-redirect-parser/14.1.0: + resolution: {integrity: sha512-shyZ9eg4984c7prN67/vQAcYu1Sco2iRfP+ne9pjcWFEVigREzGGitGvOQCChxVyT16TT0n1CrJW+aKlBqwPlA==} engines: {node: ^14.16.0 || >=16.0.0} dependencies: + fast-safe-stringify: 2.1.1 filter-obj: 3.0.0 is-plain-obj: 4.1.0 path-exists: 5.0.0 @@ -11255,8 +11673,8 @@ packages: resolution: {integrity: sha512-+8x07Ukx8vgKkGqTDq1GrkuCRR0DqheZ9fF5PXk6VbIChp9Qi8+psmwBV3hjocoyUvUGH7CIHLUk05aVwLN3wA==} dev: false - /netlify/13.0.0: - resolution: {integrity: sha512-+ZWEwbf95PSHRD5N2ROUjJHRlcZAjO2LPFiPQwg0xNxLj60/gRrjJlUDUnAIOSuZ7wqUUNL+syrLqnT79TTMIw==} + /netlify/13.1.0: + resolution: {integrity: sha512-FkMXk0h7QuR1iR3MeSQFxadarHXWgXzYFoHvF3m7edsFUpJ2WdRH3xiOVEyJciQUGYwEAHycUyi8CkT/2aKzLA==} engines: {node: ^14.16.0 || >=16.0.0} dependencies: '@netlify/open-api': 2.12.0 @@ -11272,7 +11690,7 @@ packages: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} dependencies: lower-case: 2.0.2 - tslib: 2.4.0 + tslib: 2.4.1 dev: false /node-domexception/1.0.0: @@ -11311,9 +11729,9 @@ packages: hasBin: true dev: false - /node-gyp/9.3.0: - resolution: {integrity: sha512-A6rJWfXFz7TQNjpldJ915WFb1LnhO4lIve3ANPbWreuEoLoKlFT3sxIepPBkLhM27crW8YmN+pjlgbasH6cH/Q==} - engines: {node: ^12.22 || ^14.13 || >=16} + /node-gyp/9.3.1: + resolution: {integrity: sha512-4Q16ZCqq3g8awk6UplT7AuxQ35XN4R/yf/+wSAwcBUAjg7l58RTactWaP8fIDTi0FzI7YcVLujwExakZlfWkXg==} + engines: {node: ^12.13 || ^14.13 || >=16} hasBin: true dependencies: env-paths: 2.2.1 @@ -11323,8 +11741,8 @@ packages: nopt: 6.0.0 npmlog: 6.0.2 rimraf: 3.0.2 - semver: 7.3.7 - tar: 6.1.11 + semver: 7.3.8 + tar: 6.1.13 which: 2.0.2 transitivePeerDependencies: - bluebird @@ -11363,7 +11781,11 @@ packages: jest-validate: 25.5.0 normalize-node-version: 10.0.0 path-exists: 4.0.0 - semver: 7.3.7 + semver: 7.3.8 + dev: false + + /non-layered-tidy-tree-layout/2.0.2: + resolution: {integrity: sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==} dev: false /noop2/2.0.0: @@ -11386,6 +11808,14 @@ packages: abbrev: 1.1.1 dev: true + /nopt/7.0.0: + resolution: {integrity: sha512-e6Qw1rcrGoSxEH0hQ4GBSdUjkMOtXGhGFXdNT/3ZR0S37eR9DMj5za3dEDWE6o1T3/DP8ZOsPP4MIiky0c3QeA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + dependencies: + abbrev: 2.0.0 + dev: true + /normalize-node-version/10.0.0: resolution: {integrity: sha512-/gVbS/qAnowVxr2fJy3F0MxmCvx8QdXJDl8XUE7HT3vsDeDjQfZkX9OiPahF+51Hgy93cKG1hP6uyBjQsMCvWQ==} engines: {node: '>=10.17.0'} @@ -11393,7 +11823,7 @@ packages: all-node-versions: 8.0.0 filter-obj: 2.0.2 jest-validate: 25.5.0 - semver: 7.3.7 + semver: 7.3.8 dev: false /normalize-package-data/2.5.0: @@ -11409,17 +11839,17 @@ packages: engines: {node: '>=10'} dependencies: hosted-git-info: 4.1.0 - is-core-module: 2.9.0 - semver: 7.3.7 + is-core-module: 2.11.0 + semver: 7.3.8 validate-npm-package-license: 3.0.4 /normalize-package-data/4.0.1: resolution: {integrity: sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: - hosted-git-info: 5.1.0 - is-core-module: 2.9.0 - semver: 7.3.7 + hosted-git-info: 5.2.1 + is-core-module: 2.11.0 + semver: 7.3.8 validate-npm-package-license: 3.0.4 dev: true @@ -11458,6 +11888,11 @@ packages: engines: {node: '>=10'} dev: false + /normalize-url/8.0.0: + resolution: {integrity: sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==} + engines: {node: '>=14.16'} + dev: false + /npm-bundled/1.1.2: resolution: {integrity: sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==} dependencies: @@ -11475,24 +11910,30 @@ packages: resolution: {integrity: sha512-65lUsMI8ztHCxFz5ckCEC44DRvEGdZX5usQFriauxHEwt7upv1FKaQEmAtU0YnOAdwuNWCmk64xYiQABNrEyLA==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: - semver: 7.3.7 + semver: 7.3.8 dev: true /npm-normalize-package-bin/1.0.1: resolution: {integrity: sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==} + dev: true /npm-normalize-package-bin/2.0.0: resolution: {integrity: sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dev: true + /npm-normalize-package-bin/3.0.0: + resolution: {integrity: sha512-g+DPQSkusnk7HYXr75NtzkIP4+N81i3RPsGFidF3DzHd9MT9wWngmqoeg/fnHFz5MNdtG4w03s+QnhewSLTT2Q==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + /npm-package-arg/9.1.2: resolution: {integrity: sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: - hosted-git-info: 5.1.0 + hosted-git-info: 5.2.1 proc-log: 2.0.1 - semver: 7.3.7 + semver: 7.3.8 validate-npm-package-name: 4.0.0 dev: true @@ -11514,7 +11955,7 @@ packages: npm-install-checks: 5.0.0 npm-normalize-package-bin: 2.0.0 npm-package-arg: 9.1.2 - semver: 7.3.7 + semver: 7.3.8 dev: true /npm-registry-fetch/13.3.1: @@ -11522,7 +11963,7 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: make-fetch-happen: 10.2.1 - minipass: 3.3.4 + minipass: 3.3.6 minipass-fetch: 2.1.2 minipass-json-stream: 1.0.1 minizlib: 2.1.2 @@ -11603,8 +12044,8 @@ packages: isobject: 3.0.1 dev: false - /object.assign/4.1.2: - resolution: {integrity: sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==} + /object.assign/4.1.4: + resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 @@ -11620,13 +12061,13 @@ packages: isobject: 3.0.1 dev: false - /object.values/1.1.5: - resolution: {integrity: sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==} + /object.values/1.1.6: + resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 define-properties: 1.1.4 - es-abstract: 1.20.1 + es-abstract: 1.20.5 dev: true /obuf/1.1.2: @@ -11748,12 +12189,12 @@ packages: resolution: {integrity: sha512-EJQ3NiP5Xo94wJXIzAyOtSb0QEIAUu7m8t6UZ9krbz0vAJqr92JpcK/lEXg91q6B9pEGqrykkd2EQplnifDSBw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: - bl: 5.0.0 - chalk: 5.1.2 + bl: 5.1.0 + chalk: 5.2.0 cli-cursor: 4.0.0 cli-spinners: 2.7.0 is-interactive: 2.0.0 - is-unicode-supported: 1.2.0 + is-unicode-supported: 1.3.0 log-symbols: 5.1.0 strip-ansi: 7.0.1 wcwidth: 1.0.1 @@ -11799,6 +12240,11 @@ packages: engines: {node: '>=8'} dev: false + /p-cancelable/3.0.0: + resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} + engines: {node: '>=12.20'} + dev: false + /p-event/2.3.1: resolution: {integrity: sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==} engines: {node: '>=6'} @@ -11884,13 +12330,6 @@ packages: p-limit: 1.3.0 dev: true - /p-locate/3.0.0: - resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} - engines: {node: '>=6'} - dependencies: - p-limit: 2.3.0 - dev: true - /p-locate/4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} @@ -12008,6 +12447,16 @@ packages: semver: 6.3.0 dev: false + /package-json/8.1.0: + resolution: {integrity: sha512-hySwcV8RAWeAfPsXb9/HGSPn8lwDnv6fabH+obUZKX169QknRkRhPxd1yMubpKDskLFATkl3jHpNtVtDPFA0Wg==} + engines: {node: '>=14.16'} + dependencies: + got: 12.5.3 + registry-auth-token: 5.0.1 + registry-url: 6.0.1 + semver: 7.3.8 + dev: false + /pacote/13.6.2: resolution: {integrity: sha512-Gu8fU3GsvOPkak2CkbojR7vjs3k3P9cA6uazKTHdsdV0gpCEQq2opelnEv30KRQWgVzP5Vd/5umjcedma3MKtg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -12021,7 +12470,7 @@ packages: chownr: 2.0.0 fs-minipass: 2.1.0 infer-owner: 1.0.4 - minipass: 3.3.4 + minipass: 3.3.6 mkdirp: 1.0.4 npm-package-arg: 9.1.2 npm-packlist: 5.1.3 @@ -12033,7 +12482,7 @@ packages: read-package-json-fast: 2.0.3 rimraf: 3.0.2 ssri: 9.0.1 - tar: 6.1.11 + tar: 6.1.13 transitivePeerDependencies: - bluebird - supports-color @@ -12051,7 +12500,7 @@ packages: resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} dependencies: dot-case: 3.0.4 - tslib: 2.4.0 + tslib: 2.4.1 dev: false /parent-module/1.0.1: @@ -12098,14 +12547,17 @@ packages: engines: {node: '>=0.10.0'} dev: true - /parse5-htmlparser2-tree-adapter/6.0.1: - resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==} + /parse5-htmlparser2-tree-adapter/7.0.0: + resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==} dependencies: - parse5: 6.0.1 + domhandler: 5.0.3 + parse5: 7.1.2 dev: false - /parse5/6.0.1: - resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + /parse5/7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + dependencies: + entities: 4.4.0 dev: false /parseurl/1.3.3: @@ -12117,7 +12569,7 @@ packages: resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} dependencies: no-case: 3.0.4 - tslib: 2.4.0 + tslib: 2.4.1 dev: false /pascalcase/0.1.1: @@ -12159,7 +12611,7 @@ packages: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} /path-to-regexp/0.1.7: - resolution: {integrity: sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=} + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} dev: false /path-type/3.0.0: @@ -12230,8 +12682,8 @@ packages: find-up: 6.3.0 dev: false - /pnpm/7.13.4: - resolution: {integrity: sha512-ZaP5+PRzXI0g4KijU7zx4hi7RUJcSYBJIb90e+lyTeQyRw91+peJoFAzWa63+4fjJIz6CqY0cNkP7trZXh5l8w==} + /pnpm/7.21.0: + resolution: {integrity: sha512-zDsRciscnXmp8AVD0u9eSoJrGfXywepuwMmFstsd+Vfl/wDZUxgaSaZ/6Nkx3bBftC+oBpWFkAGBRyjy58jvZg==} engines: {node: '>=14.6'} hasBin: true dev: true @@ -12252,7 +12704,7 @@ packages: engines: {node: '>=0.10.0'} dev: false - /postcss-csso/6.0.1_postcss@8.4.18: + /postcss-csso/6.0.1_postcss@8.4.20: resolution: {integrity: sha512-ZV4yEziMrx6CEiqabGLrDva0pMD7Fbw7yP+LzJvaynM4OJgTssGN6dHiMsJMJdpmNaLJltXVLsrb/5sxbFa8sA==} engines: {node: ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} peerDependencies: @@ -12262,11 +12714,28 @@ packages: optional: true dependencies: csso: 5.0.5 - postcss: 8.4.18 + postcss: 8.4.20 dev: false - /postcss-loader/7.0.1_igyeriywjd4lwzfk4socqbj2qi: - resolution: {integrity: sha512-VRviFEyYlLjctSM93gAZtcJJ/iSkPZ79zWbN/1fSH+NisBByEiVLqpdVDrPLVSi8DX0oJo12kL/GppTBdKVXiQ==} + /postcss-load-config/4.0.1_postcss@8.4.20: + resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 2.0.6 + postcss: 8.4.20 + yaml: 2.2.0 + dev: false + + /postcss-loader/7.0.2_qxxfhhrl3yknjjmta266mo3u64: + resolution: {integrity: sha512-fUJzV/QH7NXUAqV8dWJ9Lg4aTkDCezpTS5HgJ2DvqznexTbSTxgi/dTECvTZ15BwKTtk8G/bqI/QTu2HPd3ZCg==} engines: {node: '>= 14.15.0'} peerDependencies: postcss: ^7.0.0 || ^8.0.1 @@ -12277,14 +12746,14 @@ packages: webpack: optional: true dependencies: - cosmiconfig: 7.0.1 + cosmiconfig: 7.1.0 klona: 2.0.5 - postcss: 8.4.18 - semver: 7.3.7 - webpack: 5.74.0 + postcss: 8.4.20 + semver: 7.3.8 + webpack: 5.75.0 dev: false - /postcss-modules-extract-imports/3.0.0_postcss@8.4.18: + /postcss-modules-extract-imports/3.0.0_postcss@8.4.20: resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: @@ -12293,10 +12762,10 @@ packages: postcss: optional: true dependencies: - postcss: 8.4.18 + postcss: 8.4.20 dev: false - /postcss-modules-local-by-default/4.0.0_postcss@8.4.18: + /postcss-modules-local-by-default/4.0.0_postcss@8.4.20: resolution: {integrity: sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: @@ -12305,13 +12774,13 @@ packages: postcss: optional: true dependencies: - icss-utils: 5.1.0_postcss@8.4.18 - postcss: 8.4.18 - postcss-selector-parser: 6.0.10 + icss-utils: 5.1.0_postcss@8.4.20 + postcss: 8.4.20 + postcss-selector-parser: 6.0.11 postcss-value-parser: 4.2.0 dev: false - /postcss-modules-scope/3.0.0_postcss@8.4.18: + /postcss-modules-scope/3.0.0_postcss@8.4.20: resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: @@ -12320,11 +12789,11 @@ packages: postcss: optional: true dependencies: - postcss: 8.4.18 - postcss-selector-parser: 6.0.10 + postcss: 8.4.20 + postcss-selector-parser: 6.0.11 dev: false - /postcss-modules-values/4.0.0_postcss@8.4.18: + /postcss-modules-values/4.0.0_postcss@8.4.20: resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: @@ -12333,12 +12802,12 @@ packages: postcss: optional: true dependencies: - icss-utils: 5.1.0_postcss@8.4.18 - postcss: 8.4.18 + icss-utils: 5.1.0_postcss@8.4.20 + postcss: 8.4.20 dev: false - /postcss-selector-parser/6.0.10: - resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} + /postcss-selector-parser/6.0.11: + resolution: {integrity: sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==} engines: {node: '>=4'} dependencies: cssesc: 3.0.0 @@ -12348,7 +12817,7 @@ packages: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} dev: false - /postcss-values-parser/6.0.2_postcss@8.4.18: + /postcss-values-parser/6.0.2_postcss@8.4.20: resolution: {integrity: sha512-YLJpK0N1brcNJrs9WatuJFtHaV9q5aAOj+S4DI5S7jgHlRfm0PIbDCAFRYMQD5SHq7Fy6xsDhyutgS0QOAs0qw==} engines: {node: '>=10'} peerDependencies: @@ -12359,12 +12828,12 @@ packages: dependencies: color-name: 1.1.4 is-url-superb: 4.0.0 - postcss: 8.4.18 + postcss: 8.4.20 quote-unquote: 1.0.0 dev: false - /postcss/8.4.18: - resolution: {integrity: sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==} + /postcss/8.4.20: + resolution: {integrity: sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g==} engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.4 @@ -12380,7 +12849,7 @@ packages: engines: {node: ^12.20.0 || ^14.14.0 || >=16.0.0} hasBin: true dependencies: - commander: 9.4.0 + commander: 9.4.1 detective-amd: 4.0.1 detective-cjs: 4.0.0 detective-es6: 3.0.0 @@ -12401,7 +12870,7 @@ packages: engines: {node: ^12.20.0 || ^14.14.0 || >=16.0.0} hasBin: true dependencies: - commander: 9.4.0 + commander: 9.4.1 detective-amd: 4.0.1 detective-cjs: 4.0.0 detective-es6: 3.0.0 @@ -12448,8 +12917,8 @@ packages: fast-diff: 1.2.0 dev: true - /prettier/2.7.1: - resolution: {integrity: sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==} + /prettier/2.8.1: + resolution: {integrity: sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==} engines: {node: '>=10.13.0'} hasBin: true dev: true @@ -12495,8 +12964,8 @@ packages: minimist: 1.2.7 dev: false - /prismjs/1.28.0: - resolution: {integrity: sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw==} + /prismjs/1.29.0: + resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} engines: {node: '>=6'} dev: false @@ -12505,9 +12974,19 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dev: true + /proc-log/3.0.0: + resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + /process-nextick-args/2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + /process/0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + dev: false + /promise-inflight/1.0.1: resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} peerDependencies: @@ -12537,6 +13016,10 @@ packages: sisteransi: 1.0.5 dev: true + /proto-list/1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + dev: false + /protobufjs/5.0.3: resolution: {integrity: sha512-55Kcx1MhPZX0zTbVosMQEO5R6/rikNXd9b6RQK4KSPcrSIIwoXTtebIczUrXlwaSrbz4x8XUVThGPob1n8I4QA==} engines: {node: '>=0.8'} @@ -12575,6 +13058,10 @@ packages: once: 1.4.0 dev: false + /punycode/1.3.2: + resolution: {integrity: sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==} + dev: false + /punycode/2.1.1: resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} engines: {node: '>=6'} @@ -12586,6 +13073,13 @@ packages: escape-goat: 2.1.1 dev: false + /pupa/3.1.0: + resolution: {integrity: sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==} + engines: {node: '>=12.20'} + dependencies: + escape-goat: 4.0.0 + dev: false + /q/1.5.1: resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} engines: {node: '>=0.6.0', teleport: '>=0.2.0'} @@ -12614,6 +13108,12 @@ packages: strict-uri-encode: 1.1.0 dev: false + /querystring/0.2.0: + resolution: {integrity: sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=} + engines: {node: '>=0.4.x'} + deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead. + dev: false + /queue-microtask/1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -12622,6 +13122,11 @@ packages: engines: {node: '>=8'} dev: true + /quick-lru/5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + dev: false + /quote-unquote/1.0.0: resolution: {integrity: sha512-twwRO/ilhlG/FIgYeKGFqyHhoEhqgnKVkcmqMKi2r524gz3ZbDTcyFt38E9xjJI2vT+KbRNHVbnJ/e0I25Azwg==} dev: false @@ -12682,6 +13187,15 @@ packages: dependencies: json-parse-even-better-errors: 2.3.1 npm-normalize-package-bin: 1.0.1 + dev: true + + /read-package-json-fast/3.0.2: + resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + json-parse-even-better-errors: 3.0.0 + npm-normalize-package-bin: 3.0.0 + dev: true /read-package-json/5.0.2: resolution: {integrity: sha512-BSzugrt4kQ/Z0krro8zhTwV1Kd79ue25IhNN/VtHFy1mG/6Tluyi+msc0UpwaoQzxSHa28mntAjIZY6kEgfR9Q==} @@ -12768,7 +13282,7 @@ packages: /readdir-glob/1.1.2: resolution: {integrity: sha512-6RLVvwJtVwEDfPdn6X6Ille4/lxGl0ATOY4FN/B9nxQcgOazvvI0nodiD19ScKq0PvA/29VpaOQML36o5IzZWA==} dependencies: - minimatch: 5.1.0 + minimatch: 5.1.2 dev: false /readdirp/2.2.1: @@ -12830,6 +13344,13 @@ packages: rc: 1.2.8 dev: false + /registry-auth-token/5.0.1: + resolution: {integrity: sha512-UfxVOj8seK1yaIOiieV4FIP01vfBDLsY0H9sQzi9EbbUdJiuuBjJgLa1DpImXMNPnVkBD4eVxTEXcrZA6kfpJA==} + engines: {node: '>=14'} + dependencies: + '@pnpm/npm-conf': 1.0.5 + dev: false + /registry-url/5.1.0: resolution: {integrity: sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==} engines: {node: '>=8'} @@ -12837,15 +13358,18 @@ packages: rc: 1.2.8 dev: false + /registry-url/6.0.1: + resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==} + engines: {node: '>=12'} + dependencies: + rc: 1.2.8 + dev: false + /relateurl/0.2.7: resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} engines: {node: '>= 0.10'} dev: false - /remedial/1.0.8: - resolution: {integrity: sha512-/62tYiOe6DzS5BqVsNpH/nkGlX45C/Sp6V+NtiN6JQNS1Viay7cWkazmRkrQrdFj2eshDe96SIQNIoMxqhzBOg==} - dev: false - /remove-trailing-separator/1.1.0: resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} dev: false @@ -12886,6 +13410,10 @@ packages: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} dev: false + /resolve-alpn/1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + dev: false + /resolve-dir/1.0.1: resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} engines: {node: '>=0.10.0'} @@ -12918,7 +13446,7 @@ packages: resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} hasBin: true dependencies: - is-core-module: 2.9.0 + is-core-module: 2.11.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -12926,7 +13454,7 @@ packages: resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==} hasBin: true dependencies: - is-core-module: 2.9.0 + is-core-module: 2.11.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 dev: false @@ -12943,6 +13471,13 @@ packages: lowercase-keys: 2.0.0 dev: false + /responselike/3.0.0: + resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} + engines: {node: '>=14.16'} + dependencies: + lowercase-keys: 3.0.0 + dev: false + /restore-cursor/2.0.0: resolution: {integrity: sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==} engines: {node: '>=4'} @@ -12984,8 +13519,8 @@ packages: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - /reveal.js/4.3.1: - resolution: {integrity: sha512-1kyEnWeUkaCdBdX//XXq9dtBK95ppvIlSwlHelrP8/wrX6LcsYp4HT9WTFoFEOUBfVqkm8C2aHQ367o+UKfcxw==} + /reveal.js/4.4.0: + resolution: {integrity: sha512-jIV6C9V2NEUjGzU8L6dUFGpk1KJmq7/EzP2fOW67ggc2c0Cp/PdprWxZ9Qgp46F0T2ZWDCjQ1p3Ytzy5jA6a2w==} engines: {node: '>=10.0.0'} dev: false @@ -13008,17 +13543,9 @@ packages: estree-walker: 0.6.1 dev: false - /rollup/2.77.2: - resolution: {integrity: sha512-m/4YzYgLcpMQbxX3NmAqDvwLATZzxt8bIegO78FZLl+lAgKJBd1DRAOeEiZcKOIOPjxE6ewHWHNgGEalFXuz1g==} - engines: {node: '>=10.0.0'} - hasBin: true - optionalDependencies: - fsevents: 2.3.2 - dev: false - - /rollup/2.78.1: - resolution: {integrity: sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==} - engines: {node: '>=10.0.0'} + /rollup/3.9.0: + resolution: {integrity: sha512-nGGylpmblyjTpF4lEUPgmOw6OVxRvnI6Iuuh6Lz4O/X66cVOX1XJSsqP1YamxQ+mPuFE7qJxLFDSCk8rNv5dDw==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true optionalDependencies: fsevents: 2.3.2 @@ -13047,10 +13574,10 @@ packages: tslib: 1.14.1 dev: false - /rxjs/7.5.6: - resolution: {integrity: sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw==} + /rxjs/7.8.0: + resolution: {integrity: sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==} dependencies: - tslib: 2.4.0 + tslib: 2.4.1 dev: true /safe-buffer/5.1.2: @@ -13063,6 +13590,14 @@ packages: resolution: {integrity: sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==} dev: false + /safe-regex-test/1.0.0: + resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.1.3 + is-regex: 1.1.4 + dev: true + /safe-regex/1.1.0: resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} dependencies: @@ -13077,12 +13612,12 @@ packages: /safer-buffer/2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - /sass-loader/13.1.0_sass@1.55.0: - resolution: {integrity: sha512-tZS1RJQ2n2+QNyf3CCAo1H562WjL/5AM6Gi8YcPVVoNxQX8d19mx8E+8fRrMWsyc93ZL6Q8vZDSM0FHVTJaVnQ==} + /sass-loader/13.2.0_sass@1.57.1: + resolution: {integrity: sha512-JWEp48djQA4nbZxmgC02/Wh0eroSUutulROUusYJO9P9zltRbNN80JCBHqRGzjd4cmZCa/r88xgfkjGD0TXsHg==} engines: {node: '>= 14.15.0'} peerDependencies: fibers: '>= 3.1.0' - node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 sass: ^1.3.0 sass-embedded: '*' webpack: ^5.0.0 @@ -13100,11 +13635,11 @@ packages: dependencies: klona: 2.0.5 neo-async: 2.6.2 - sass: 1.55.0 + sass: 1.57.1 dev: false - /sass/1.55.0: - resolution: {integrity: sha512-Pk+PMy7OGLs9WaxZGJMn7S96dvlyVBwwtToX895WmCpAOr5YiJYEUJfiJidMuKb613z2xNWcXCHEuOvjZbqC6A==} + /sass/1.57.1: + resolution: {integrity: sha512-O2+LwLS79op7GI0xZ8fqzF7X2m/m8WFfI02dHOdsK5R2ECeS5F62zrwg/relM1rjSLy7Vd/DiMNIvPrQGsA0jw==} engines: {node: '>=12.0.0'} hasBin: true dependencies: @@ -13131,9 +13666,9 @@ packages: engines: {node: '>= 12.13.0'} dependencies: '@types/json-schema': 7.0.11 - ajv: 8.11.0 + ajv: 8.11.2 ajv-formats: 2.1.1 - ajv-keywords: 5.1.0_ajv@8.11.0 + ajv-keywords: 5.1.0_ajv@8.11.2 dev: false /section-matter/1.0.0: @@ -13169,6 +13704,13 @@ packages: semver: 6.3.0 dev: false + /semver-diff/4.0.0: + resolution: {integrity: sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==} + engines: {node: '>=12'} + dependencies: + semver: 7.3.8 + dev: false + /semver/5.7.1: resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} hasBin: true @@ -13183,6 +13725,14 @@ packages: hasBin: true dependencies: lru-cache: 6.0.0 + dev: true + + /semver/7.3.8: + resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 /send/0.18.0: resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} @@ -13276,14 +13826,14 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - /shell-quote/1.7.3: - resolution: {integrity: sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==} + /shell-quote/1.7.4: + resolution: {integrity: sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw==} /side-channel/1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: call-bind: 1.0.2 - get-intrinsic: 1.1.2 + get-intrinsic: 1.1.3 object-inspect: 1.12.2 /signal-exit/3.0.7: @@ -13350,13 +13900,9 @@ packages: resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} engines: {node: '>=12'} dependencies: - ansi-styles: 6.1.0 + ansi-styles: 6.2.1 is-fullwidth-code-point: 4.0.0 - /slick/1.12.2: - resolution: {integrity: sha512-4qdtOGcBjral6YIBCWJ0ljFSKNLz9KkhbWtuGvUyRowl1kxfuE1x/Z/aJcaiilpb3do9bl5K7/1h9XC5wWpY/A==} - dev: false - /smart-buffer/4.2.0: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} @@ -13462,14 +14008,14 @@ packages: resolution: {integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==} dev: true - /sort-package-json/2.0.0: - resolution: {integrity: sha512-71AZsHsf33oC8Pa0/4/6eo1IufgLfibqxTXTA3bfeicx8gba7kDc5Cofy2YHWrH/cV8nfXSQeMNpGliR07oEHA==} + /sort-package-json/2.1.0: + resolution: {integrity: sha512-M5ctkdnn7znAkoVQJ0Y+PHDUieyXMhydPyW7r2J9ZM0Iwc3BTyEf5cmoSRfHNo07FEvzWwnphcP7GlrAX164UQ==} hasBin: true dependencies: detect-indent: 7.0.1 detect-newline: 4.0.0 git-hooks-list: 3.0.0 - globby: 13.1.2 + globby: 13.1.3 is-plain-obj: 4.1.0 sort-object-keys: 1.1.3 dev: true @@ -13516,6 +14062,7 @@ packages: /sourcemap-codec/1.4.8: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead dev: false /spawn-command/0.0.2-1: @@ -13526,7 +14073,7 @@ packages: resolution: {integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==} dependencies: spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.11 + spdx-license-ids: 3.0.12 /spdx-exceptions/2.3.0: resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} @@ -13535,10 +14082,10 @@ packages: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} dependencies: spdx-exceptions: 2.3.0 - spdx-license-ids: 3.0.11 + spdx-license-ids: 3.0.12 - /spdx-license-ids/3.0.11: - resolution: {integrity: sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==} + /spdx-license-ids/3.0.12: + resolution: {integrity: sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==} /spdy-transport/3.0.0: resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} @@ -13608,7 +14155,7 @@ packages: resolution: {integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: - minipass: 3.3.4 + minipass: 3.3.6 dev: true /stack-generator/2.0.10: @@ -13707,20 +14254,20 @@ packages: emoji-regex: 9.2.2 strip-ansi: 7.0.1 - /string.prototype.trimend/1.0.5: - resolution: {integrity: sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==} + /string.prototype.trimend/1.0.6: + resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} dependencies: call-bind: 1.0.2 define-properties: 1.1.4 - es-abstract: 1.20.1 + es-abstract: 1.20.5 dev: true - /string.prototype.trimstart/1.0.5: - resolution: {integrity: sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==} + /string.prototype.trimstart/1.0.6: + resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} dependencies: call-bind: 1.0.2 define-properties: 1.1.4 - es-abstract: 1.20.1 + es-abstract: 1.20.5 dev: true /string_decoder/1.1.1: @@ -13831,7 +14378,11 @@ packages: escape-string-regexp: 1.0.5 dev: false - /style-loader/3.3.1_webpack@5.74.0: + /striptags/3.2.0: + resolution: {integrity: sha512-g45ZOGzHDMe2bdYMdIvdAfCQkCTDMGBazSw1ypMowwGIee7ZQ5dU0rBJ8Jqgl+jAKIv4dbeE1jscZq9wid1Tkw==} + dev: false + + /style-loader/3.3.1_webpack@5.75.0: resolution: {integrity: sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -13840,11 +14391,11 @@ packages: webpack: optional: true dependencies: - webpack: 5.74.0 + webpack: 5.75.0 dev: false - /stylis/4.1.1: - resolution: {integrity: sha512-lVrM/bNdhVX2OgBFNa2YJ9Lxj7kPzylieHd3TNjuGE0Re9JB7joL5VUKOVH1kdNNJTgGPpT8hmwIAPLaSyEVFQ==} + /stylis/4.1.3: + resolution: {integrity: sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==} dev: false /subarg/1.0.0: @@ -13867,7 +14418,7 @@ packages: mime: 2.6.0 qs: 6.11.0 readable-stream: 3.6.0 - semver: 7.3.7 + semver: 7.3.8 transitivePeerDependencies: - supports-color dev: false @@ -13965,29 +14516,29 @@ packages: readable-stream: 3.6.0 dev: false - /tar/6.1.11: - resolution: {integrity: sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==} - engines: {node: '>= 10'} + /tar/6.1.13: + resolution: {integrity: sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==} + engines: {node: '>=10'} dependencies: chownr: 2.0.0 fs-minipass: 2.1.0 - minipass: 3.3.4 + minipass: 4.0.0 minizlib: 2.1.2 mkdirp: 1.0.4 yallist: 4.0.0 - /taze/0.8.2: - resolution: {integrity: sha512-ADay3jM3XYgyhu8zEcv64ETpGZ3Oi2uiyxfrDfMi4sTf5znu4Zn+ytK67YLMtvRNzwn9palM7TT5xYBQxJdvwA==} + /taze/0.8.5: + resolution: {integrity: sha512-4aB/BEfBah5iJJUDY3vW7xjJl7AzV6bsQx0PHC1DxIVlCE+JUFfpE7dDPZv/4Z+ft4Eg3I69NWnMnaAUL++rDQ==} hasBin: true dependencies: - '@antfu/ni': 0.18.2 + '@antfu/ni': 0.18.8 + '@npmcli/config': 6.1.0 detect-indent: 7.0.1 - libnpmconfig: 1.2.1 pacote: 13.6.2 prompts: 2.4.2 - semver: 7.3.7 + semver: 7.3.8 unconfig: 0.3.7 - yargs: 17.5.1 + yargs: 17.6.2 transitivePeerDependencies: - bluebird - supports-color @@ -14024,7 +14575,15 @@ packages: supports-hyperlinks: 2.2.0 dev: false - /terser-webpack-plugin/5.3.3_webpack@5.74.0: + /terminal-link/3.0.0: + resolution: {integrity: sha512-flFL3m4wuixmf6IfhFJd1YPiLiMuxEc8uHRM1buzIeZPm22Au2pDqBJQgdo7n1WfPU1ONFGv7YDwpFBmHGF6lg==} + engines: {node: '>=12'} + dependencies: + ansi-escapes: 5.0.0 + supports-hyperlinks: 2.2.0 + dev: false + + /terser-webpack-plugin/5.3.3_webpack@5.75.0: resolution: {integrity: sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -14047,7 +14606,7 @@ packages: schema-utils: 3.1.1 serialize-javascript: 6.0.0 terser: 5.14.2 - webpack: 5.74.0 + webpack: 5.75.0 dev: false /terser/5.14.2: @@ -14056,7 +14615,7 @@ packages: hasBin: true dependencies: '@jridgewell/source-map': 0.3.2 - acorn: 8.8.0 + acorn: 8.8.1 commander: 2.20.3 source-map-support: 0.5.21 dev: false @@ -14228,7 +14787,7 @@ packages: resolution: {integrity: sha512-+1iDGY6NmOGidq7i7xZGA4cm8DAa6fqdYcvO5Z6yBevH++Bdo9Qt/mN0TzHUgcCcKv1gmh9+W5dHqz8pMWbCbg==} dev: false - /ts-node/10.9.1_5ra3kupzwcghzakkfdrtyjk72u: + /ts-node/10.9.1_awa2wsr5thmg3i7jqycphctjfq: resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -14247,80 +14806,48 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.3 - '@types/node': 18.8.0 - acorn: 8.8.0 + '@types/node': 18.11.18 + acorn: 8.8.1 acorn-walk: 8.2.0 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 4.8.4 + typescript: 4.9.4 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + + /ts-node/10.9.1_ocil65wecyuhsmrrocoajouipe: + resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.3 + '@types/node': 14.18.36 + acorn: 8.8.1 + acorn-walk: 8.2.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 4.9.4 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 dev: true - /ts-node/10.9.1_jcmx33t3olsvcxopqdljsohpme: - resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.9 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.3 - '@types/node': 14.18.32 - acorn: 8.8.0 - acorn-walk: 8.2.0 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 4.8.4 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - dev: true - - /ts-node/10.9.1_ptpocrdt7oaz4ni5mlvucph5pa: - resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.9 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.3 - '@types/node': 18.8.5 - acorn: 8.8.0 - acorn-walk: 8.2.0 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 4.8.4 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - dev: false - /tsconfig-paths/3.14.1: resolution: {integrity: sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==} dependencies: @@ -14330,8 +14857,8 @@ packages: strip-bom: 3.0.0 dev: true - /tsconfig-vuepress/4.0.0: - resolution: {integrity: sha512-bhujOtmpGdclg92bBrc+Y4L+emxN7jldlmogfT0ks9TmBzcEmzCAiphYRZ+J4idyDyLL+O7Kd9w4nOkUFtOoZA==} + /tsconfig-vuepress/4.0.4: + resolution: {integrity: sha512-nK1NrYC1T0csgp0AM9qwcGSCRnmoapjrP4FrnnTaaTpaBzqJXbRrtrwHinOKHH2qKoHilurB/z1n0XBX4BlMcQ==} dev: true /tslib/1.14.1: @@ -14341,20 +14868,20 @@ packages: resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==} dev: false - /tslib/2.4.0: - resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} + /tslib/2.4.1: + resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==} - /tsutils/3.21.0_typescript@4.8.4: + /tsutils/3.21.0_typescript@4.9.4: resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' dependencies: tslib: 1.14.1 - typescript: 4.8.4 + typescript: 4.9.4 - /twikoo/1.6.7: - resolution: {integrity: sha512-jFSKkdpwke0kO8XZIXUJrvq+YpyQ5iAP7L6OOz8zeW4TqGYbzJCfHBpBNiKd59rix21InIpDfmk610mmNyOtHA==} + /twikoo/1.6.8: + resolution: {integrity: sha512-SkwO647kK2Ss+L2myp+7JmzmXAGsLt1e7zwTZdKuifDywgFfnaArPWkfp7ruvVBLb+13KQUsCneBUR5XzkV4Bg==} dev: false /type-check/0.3.2: @@ -14431,8 +14958,8 @@ packages: is-typedarray: 1.0.0 dev: false - /typescript/4.8.4: - resolution: {integrity: sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==} + /typescript/4.9.4: + resolution: {integrity: sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==} engines: {node: '>=4.2.0'} hasBin: true @@ -14440,8 +14967,8 @@ packages: resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} dev: false - /uglify-js/3.16.3: - resolution: {integrity: sha512-uVbFqx9vvLhQg0iBaau9Z75AxWJ8tqM9AV890dIZCLApF4rTcyHwmAvLeEdYRs+BzYWu8Iw81F79ah0EfTXbaw==} + /uglify-js/3.17.4: + resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} engines: {node: '>=0.8.0'} hasBin: true requiresBuild: true @@ -14475,7 +15002,7 @@ packages: resolution: {integrity: sha512-1589b7oGa8ILBYpta7TndM5mLHLzHUqBfhszeZxuUBrjO/RoQ52VGVWsS3w0C0GLNxO9RPmqkf6BmIvBApaRdA==} dependencies: '@antfu/utils': 0.5.2 - defu: 6.1.0 + defu: 6.1.1 jiti: 1.16.0 dev: true @@ -14514,6 +15041,13 @@ packages: crypto-random-string: 2.0.0 dev: false + /unique-string/3.0.0: + resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} + engines: {node: '>=12'} + dependencies: + crypto-random-string: 4.0.0 + dev: false + /universal-user-agent/6.0.0: resolution: {integrity: sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==} dev: false @@ -14552,6 +15086,17 @@ packages: engines: {node: '>=4'} dev: false + /update-browserslist-db/1.0.10_browserslist@4.21.4: + resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.21.4 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: false + /update-browserslist-db/1.0.5_browserslist@4.21.3: resolution: {integrity: sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==} hasBin: true @@ -14578,11 +15123,31 @@ packages: is-yarn-global: 0.3.0 latest-version: 5.1.0 pupa: 2.1.1 - semver: 7.3.7 + semver: 7.3.8 semver-diff: 3.1.1 xdg-basedir: 4.0.0 dev: false + /update-notifier/6.0.2: + resolution: {integrity: sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==} + engines: {node: '>=14.16'} + dependencies: + boxen: 7.0.1 + chalk: 5.2.0 + configstore: 6.0.0 + has-yarn: 3.0.0 + import-lazy: 4.0.0 + is-ci: 3.0.1 + is-installed-globally: 0.4.0 + is-npm: 6.0.0 + is-yarn-global: 0.4.1 + latest-version: 7.0.0 + pupa: 3.1.0 + semver: 7.3.8 + semver-diff: 4.0.0 + xdg-basedir: 5.1.0 + dev: false + /uri-js/4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: @@ -14605,6 +15170,13 @@ packages: engines: {node: '>= 4'} dev: false + /url/0.11.0: + resolution: {integrity: sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==} + dependencies: + punycode: 1.3.2 + querystring: 0.2.0 + dev: false + /use/3.1.1: resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} engines: {node: '>=0.10.0'} @@ -14644,11 +15216,6 @@ packages: /v8-compile-cache-lib/3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - /valid-data-url/3.0.1: - resolution: {integrity: sha512-jOWVmzVceKlVVdwjNSenT4PbGghU0SBIizAev8ofZVgivk/TVHXSbNL8LP6M3spZvkR9/QolkyJavGSX5Cs0UA==} - engines: {node: '>=10'} - dev: false - /validate-npm-package-license/3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} dependencies: @@ -14666,75 +15233,88 @@ packages: engines: {node: '>= 0.8'} dev: false - /vite-plugin-windicss/1.8.8: - resolution: {integrity: sha512-iyu+ZX0NmhNEUaLPv7xtC+EFRBpWMmw0nhd9a9upayfuNG/thwslKiQKmRB7U/dG0k/2oWLvPDvN/B9i7oRgSA==} + /vite-plugin-windicss/1.8.10: + resolution: {integrity: sha512-scywsuzo46lcTBohspmF0WiwhWEte6p+OUVrX4yr7VMRvLHMHVfLtJReyD5pppjijG7YOwVsZn7XBWWZtF658Q==} peerDependencies: - vite: ^2.0.1 || ^3.0.0 + vite: ^2.0.1 || ^3.0.0 || ^4.0.0 dependencies: - '@windicss/plugin-utils': 1.8.8 + '@windicss/plugin-utils': 1.8.10 debug: 4.3.4 - kolorist: 1.5.1 + kolorist: 1.6.0 windicss: 3.5.6 transitivePeerDependencies: - supports-color dev: false - /vite/3.0.9_sass@1.55.0: - resolution: {integrity: sha512-waYABTM+G6DBTCpYAxvevpG50UOlZuynR0ckTK5PawNVt7ebX6X7wNXHaGIO6wYYFXSM7/WcuFuO2QzhBB6aMw==} + /vite/4.0.3_@types+node@18.11.18: + resolution: {integrity: sha512-HvuNv1RdE7deIfQb8mPk51UKjqptO/4RXZ5yXSAvurd5xOckwS/gg8h9Tky3uSbnjYTgUm0hVCet1cyhKd73ZA==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true peerDependencies: + '@types/node': '>= 14' less: '*' sass: '*' stylus: '*' + sugarss: '*' terser: ^5.4.0 peerDependenciesMeta: + '@types/node': + optional: true less: optional: true sass: optional: true stylus: optional: true - terser: - optional: true - dependencies: - esbuild: 0.14.53 - postcss: 8.4.18 - resolve: 1.22.1 - rollup: 2.77.2 - sass: 1.55.0 - optionalDependencies: - fsevents: 2.3.2 - dev: false - - /vite/3.1.8: - resolution: {integrity: sha512-m7jJe3nufUbuOfotkntGFupinL/fmuTNuQmiVE7cH2IZMuf4UbfbGYMUT3jVWgGYuRVLY9j8NnrRqgw5rr5QTg==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - less: '*' - sass: '*' - stylus: '*' - terser: ^5.4.0 - peerDependenciesMeta: - less: - optional: true - sass: - optional: true - stylus: + sugarss: optional: true terser: optional: true dependencies: - esbuild: 0.15.11 - postcss: 8.4.18 + '@types/node': 18.11.18 + esbuild: 0.16.12 + postcss: 8.4.20 resolve: 1.22.1 - rollup: 2.78.1 + rollup: 3.9.0 optionalDependencies: fsevents: 2.3.2 dev: true - /vue-demi/0.13.6_vue@3.2.41: + /vite/4.0.3_sass@1.57.1: + resolution: {integrity: sha512-HvuNv1RdE7deIfQb8mPk51UKjqptO/4RXZ5yXSAvurd5xOckwS/gg8h9Tky3uSbnjYTgUm0hVCet1cyhKd73ZA==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.16.12 + postcss: 8.4.20 + resolve: 1.22.1 + rollup: 3.9.0 + sass: 1.57.1 + optionalDependencies: + fsevents: 2.3.2 + dev: false + + /vue-demi/0.13.6_vue@3.2.45: resolution: {integrity: sha512-02NYpxgyGE2kKGegRPYlNQSL1UWfA/+JqvzhGCOYjhfbLWXU5QQX0+9pAm/R2sCOPKr5NBxVIab7fvFU0B1RxQ==} engines: {node: '>=12'} hasBin: true @@ -14746,248 +15326,245 @@ packages: '@vue/composition-api': optional: true dependencies: - vue: 3.2.41 + vue: 3.2.45 dev: false - /vue-eslint-parser/9.0.3_eslint@8.25.0: - resolution: {integrity: sha512-yL+ZDb+9T0ELG4VIFo/2anAOz8SvBdlqEnQnvJ3M7Scq56DvtjY0VY88bByRZB0D4J0u8olBcfrXTVONXsh4og==} + /vue-eslint-parser/9.1.0_eslint@8.30.0: + resolution: {integrity: sha512-NGn/iQy8/Wb7RrRa4aRkokyCZfOUWk19OP5HP6JEozQFX5AoS/t+Z0ZN7FY4LlmWc4FNI922V7cvX28zctN8dQ==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: '>=6.0.0' dependencies: debug: 4.3.4 - eslint: 8.25.0 + eslint: 8.30.0 eslint-scope: 7.1.1 eslint-visitor-keys: 3.3.0 - espree: 9.4.0 + espree: 9.4.1 esquery: 1.4.0 lodash: 4.17.21 - semver: 7.3.7 + semver: 7.3.8 transitivePeerDependencies: - supports-color dev: true - /vue-loader/17.0.0_webpack@5.74.0: - resolution: {integrity: sha512-OWSXjrzIvbF2LtOUmxT3HYgwwubbfFelN8PAP9R9dwpIkj48TVioHhWWSx7W7fk+iF5cgg3CBJRxwTdtLU4Ecg==} + /vue-loader/17.0.1_vue@3.2.45+webpack@5.75.0: + resolution: {integrity: sha512-/OOyugJnImKCkAKrAvdsWMuwoCqGxWT5USLsjohzWbMgOwpA5wQmzQiLMzZd7DjhIfunzAGIApTOgIylz/kwcg==} peerDependencies: + '@vue/compiler-sfc': '*' + vue: '*' webpack: ^4.1.0 || ^5.0.0-0 peerDependenciesMeta: + '@vue/compiler-sfc': + optional: true + vue: + optional: true webpack: optional: true dependencies: chalk: 4.1.2 hash-sum: 2.0.0 loader-utils: 2.0.2 - webpack: 5.74.0 + vue: 3.2.45 + webpack: 5.75.0 dev: false - /vue-router/4.1.5_vue@3.2.41: - resolution: {integrity: sha512-IsvoF5D2GQ/EGTs/Th4NQms9gd2NSqV+yylxIyp/OYp8xOwxmU8Kj/74E9DTSYAyH5LX7idVUngN3JSj1X4xcQ==} + /vue-router/4.1.6_vue@3.2.45: + resolution: {integrity: sha512-DYWYwsG6xNPmLq/FmZn8Ip+qrhFEzA14EI12MsMgVxvHFDYvlr4NXpVF5hrRH1wVcDP8fGi5F4rxuJSl8/r+EQ==} peerDependencies: vue: ^3.2.0 dependencies: '@vue/devtools-api': 6.4.5 - vue: 3.2.41 + vue: 3.2.45 dev: false - /vue/3.2.41: - resolution: {integrity: sha512-uuuvnrDXEeZ9VUPljgHkqB5IaVO8SxhPpqF2eWOukVrBnRBx2THPSGQBnVRt0GrIG1gvCmFXMGbd7FqcT1ixNQ==} + /vue/3.2.45: + resolution: {integrity: sha512-9Nx/Mg2b2xWlXykmCwiTUCWHbWIj53bnkizBxKai1g61f2Xit700A1ljowpTIM11e3uipOeiPcSqnmBg6gyiaA==} dependencies: - '@vue/compiler-dom': 3.2.41 - '@vue/compiler-sfc': 3.2.41 - '@vue/runtime-dom': 3.2.41 - '@vue/server-renderer': 3.2.41_vue@3.2.41 - '@vue/shared': 3.2.41 + '@vue/compiler-dom': 3.2.45 + '@vue/compiler-sfc': 3.2.45 + '@vue/runtime-dom': 3.2.45 + '@vue/server-renderer': 3.2.45_vue@3.2.45 + '@vue/shared': 3.2.45 dev: false - /vuepress-plugin-comment2/2.0.0-beta.110: - resolution: {integrity: sha512-P9WqGjoKfssFm1JodDahryzCPg94+9qamfrK2xnhe9X9uOaQsgtnH90eb6BsSXyu+apkTV8gPwEfrg3dbPhR4A==} + /vuepress-plugin-comment2/2.0.0-beta.146: + resolution: {integrity: sha512-pGmD5HutR9I/fQ7p4tphqUpehzZl1GQ0W2aYdCbn+fZVTrgm+m6hIkhlQBTR2hREgoOzFOm/0BLN7TM4V5/0cA==} + engines: {node: ^14.18.0 || >=16.0.0, npm: '>=8', pnpm: '>=7'} peerDependencies: - sass-loader: ^13.0.0 + sass-loader: ^13.2.0 + vuepress: 2.0.0-beta.60 + vuepress-vite: 2.0.0-beta.60 + vuepress-webpack: 2.0.0-beta.60 peerDependenciesMeta: sass-loader: optional: true + vuepress: + optional: true + vuepress-vite: + optional: true + vuepress-webpack: + optional: true dependencies: - '@vuepress/client': 2.0.0-beta.51 - '@vuepress/utils': 2.0.0-beta.51 - '@waline/client': 2.13.0 - giscus: 1.2.0 - twikoo: 1.6.7 - vue: 3.2.41 - vue-router: 4.1.5_vue@3.2.41 - vuepress-plugin-sass-palette: 2.0.0-beta.110 - vuepress-shared: 2.0.0-beta.110 + '@vuepress/client': 2.0.0-beta.60 + '@vuepress/utils': 2.0.0-beta.60 + '@waline/client': 2.14.4 + giscus: 1.2.6 + twikoo: 1.6.8 + vue: 3.2.45 + vue-router: 4.1.6_vue@3.2.45 + vuepress-plugin-sass-palette: 2.0.0-beta.146 + vuepress-shared: 2.0.0-beta.146 transitivePeerDependencies: - '@vue/composition-api' - supports-color dev: false - /vuepress-plugin-comment2/2.0.0-beta.110_sass-loader@13.1.0: - resolution: {integrity: sha512-P9WqGjoKfssFm1JodDahryzCPg94+9qamfrK2xnhe9X9uOaQsgtnH90eb6BsSXyu+apkTV8gPwEfrg3dbPhR4A==} + /vuepress-plugin-md-enhance/2.0.0-beta.146: + resolution: {integrity: sha512-e5j5ce48K5m6Zs5YIpXmDXDHzoxs5fY9dXNN9sEu0k3sFDVcTJJyx3mh5A3cOLOpJDESzG+y8LpdKCRewYdgHA==} + engines: {node: ^14.18.0 || >=16.0.0, npm: '>=8', pnpm: '>=7'} peerDependencies: - sass-loader: ^13.0.0 + sass-loader: ^13.2.0 + vuepress: 2.0.0-beta.60 + vuepress-vite: 2.0.0-beta.60 + vuepress-webpack: 2.0.0-beta.60 peerDependenciesMeta: sass-loader: optional: true - dependencies: - '@vuepress/client': 2.0.0-beta.51 - '@vuepress/utils': 2.0.0-beta.51 - '@waline/client': 2.13.0 - giscus: 1.2.0 - sass-loader: 13.1.0_sass@1.55.0 - twikoo: 1.6.7 - vue: 3.2.41 - vue-router: 4.1.5_vue@3.2.41 - vuepress-plugin-sass-palette: 2.0.0-beta.110_sass-loader@13.1.0 - vuepress-shared: 2.0.0-beta.110 - transitivePeerDependencies: - - '@vue/composition-api' - - supports-color - dev: false - - /vuepress-plugin-md-enhance/2.0.0-beta.110: - resolution: {integrity: sha512-e1AQQeyERo5SiZiEsPqtkjZ0e9Fy8kWdYx+VOUGUBoFGqIaokC/YWOtiUn4ItM+iC2l4e/VFbrJJjeye73UWHw==} - peerDependencies: - sass-loader: ^13.0.0 - peerDependenciesMeta: - sass-loader: + vuepress: + optional: true + vuepress-vite: + optional: true + vuepress-webpack: optional: true dependencies: - '@babel/core': 7.18.10 - '@types/katex': 0.14.0 + '@babel/core': 7.20.7 + '@mdit/plugin-align': 0.1.0 + '@mdit/plugin-attrs': 0.1.0 + '@mdit/plugin-container': 0.1.0 + '@mdit/plugin-figure': 0.1.0 + '@mdit/plugin-footnote': 0.1.0 + '@mdit/plugin-img-lazyload': 0.1.0 + '@mdit/plugin-img-mark': 0.1.0 + '@mdit/plugin-img-size': 0.1.0 + '@mdit/plugin-include': 0.1.0 + '@mdit/plugin-katex': 0.1.0 + '@mdit/plugin-mark': 0.1.0 + '@mdit/plugin-mathjax': 0.1.0 + '@mdit/plugin-stylize': 0.1.0 + '@mdit/plugin-sub': 0.1.0 + '@mdit/plugin-sup': 0.1.0 + '@mdit/plugin-tasklist': 0.1.0 + '@mdit/plugin-tex': 0.1.0 + '@mdit/plugin-uml': 0.1.0 + '@mermaid-js/mermaid-mindmap': 9.3.0 '@types/markdown-it': 12.2.3 - '@types/mermaid': 9.1.0 - '@vue/repl': 1.3.2_vue@3.2.41 - '@vuepress/client': 2.0.0-beta.51 - '@vuepress/shared': 2.0.0-beta.51 - '@vuepress/utils': 2.0.0-beta.51 - '@vueuse/core': 9.3.0_vue@3.2.41 + '@vue/repl': 1.3.2_vue@3.2.45 + '@vuepress/client': 2.0.0-beta.60 + '@vuepress/shared': 2.0.0-beta.60 + '@vuepress/utils': 2.0.0-beta.60 + '@vueuse/core': 9.9.0_vue@3.2.45 balloon-css: 1.2.0 - chart.js: 3.9.1 - echarts: 5.4.0 + chart.js: 4.1.1 + echarts: 5.4.1 flowchart.js: 1.17.1 - juice: 8.1.0 - katex: 0.16.2 + katex: 0.16.4 markdown-it: 13.0.1 - mathjax-full: 3.2.2 - mermaid: 9.1.7 - reveal.js: 4.3.1 - vue: 3.2.41 - vue-router: 4.1.5_vue@3.2.41 - vuepress-plugin-sass-palette: 2.0.0-beta.110 - vuepress-shared: 2.0.0-beta.110 + mermaid: 9.3.0 + reveal.js: 4.4.0 + vue: 3.2.45 + vue-router: 4.1.6_vue@3.2.45 + vuepress-plugin-sass-palette: 2.0.0-beta.146 + vuepress-shared: 2.0.0-beta.146 transitivePeerDependencies: - '@vue/composition-api' - - encoding - supports-color dev: false - /vuepress-plugin-md-enhance/2.0.0-beta.110_sass-loader@13.1.0: - resolution: {integrity: sha512-e1AQQeyERo5SiZiEsPqtkjZ0e9Fy8kWdYx+VOUGUBoFGqIaokC/YWOtiUn4ItM+iC2l4e/VFbrJJjeye73UWHw==} + /vuepress-plugin-sass-palette/2.0.0-beta.146: + resolution: {integrity: sha512-/I3c9fu03aPt6gsf9QdLsBZzqgWQiZpIv7m2HujxPZS4N1imZn/6I5X8irygW++incM2WKci4kd4jGxX1PdsJg==} + engines: {node: ^14.18.0 || >=16.0.0, npm: '>=8', pnpm: '>=7'} peerDependencies: - sass-loader: ^13.0.0 + sass-loader: ^13.2.0 + vuepress: 2.0.0-beta.60 + vuepress-vite: 2.0.0-beta.60 + vuepress-webpack: 2.0.0-beta.60 peerDependenciesMeta: sass-loader: optional: true - dependencies: - '@babel/core': 7.18.10 - '@types/katex': 0.14.0 - '@types/markdown-it': 12.2.3 - '@types/mermaid': 9.1.0 - '@vue/repl': 1.3.2_vue@3.2.41 - '@vuepress/client': 2.0.0-beta.51 - '@vuepress/shared': 2.0.0-beta.51 - '@vuepress/utils': 2.0.0-beta.51 - '@vueuse/core': 9.3.0_vue@3.2.41 - balloon-css: 1.2.0 - chart.js: 3.9.1 - echarts: 5.4.0 - flowchart.js: 1.17.1 - juice: 8.1.0 - katex: 0.16.2 - markdown-it: 13.0.1 - mathjax-full: 3.2.2 - mermaid: 9.1.7 - reveal.js: 4.3.1 - sass-loader: 13.1.0_sass@1.55.0 - vue: 3.2.41 - vue-router: 4.1.5_vue@3.2.41 - vuepress-plugin-sass-palette: 2.0.0-beta.110_sass-loader@13.1.0 - vuepress-shared: 2.0.0-beta.110 - transitivePeerDependencies: - - '@vue/composition-api' - - encoding - - supports-color - dev: false - - /vuepress-plugin-sass-palette/2.0.0-beta.110: - resolution: {integrity: sha512-GKBdDQ4vo4NvUrf0+SKkcnUcAFZ9i0u4PGBpmsW+moVcSRZLHHS2uC+Am27X9r05em9XYmtd+0q62Zg1xXZznA==} - peerDependencies: - sass-loader: ^13.0.0 - peerDependenciesMeta: - sass-loader: + vuepress: + optional: true + vuepress-vite: + optional: true + vuepress-webpack: optional: true dependencies: - '@vuepress/utils': 2.0.0-beta.51 + '@vuepress/utils': 2.0.0-beta.60 chokidar: 3.5.3 - sass: 1.55.0 - vuepress-shared: 2.0.0-beta.110 + sass: 1.57.1 + vuepress-shared: 2.0.0-beta.146 transitivePeerDependencies: - supports-color dev: false - /vuepress-plugin-sass-palette/2.0.0-beta.110_sass-loader@13.1.0: - resolution: {integrity: sha512-GKBdDQ4vo4NvUrf0+SKkcnUcAFZ9i0u4PGBpmsW+moVcSRZLHHS2uC+Am27X9r05em9XYmtd+0q62Zg1xXZznA==} + /vuepress-plugin-seo2/2.0.0-beta.146: + resolution: {integrity: sha512-d2ZhRTaRp89X+E4KODrIi/RuHvbXSFKwdJPUMkNfVK000ZrRGQA1HY6YUP7R+UYUbgCNzvPGDeQXIpUS+ljt2Q==} + engines: {node: ^14.18.0 || >=16.0.0, npm: '>=8', pnpm: '>=7'} peerDependencies: - sass-loader: ^13.0.0 + vuepress: 2.0.0-beta.60 + vuepress-vite: 2.0.0-beta.60 + vuepress-webpack: 2.0.0-beta.60 peerDependenciesMeta: - sass-loader: + vuepress: + optional: true + vuepress-vite: + optional: true + vuepress-webpack: optional: true dependencies: - '@vuepress/utils': 2.0.0-beta.51 - chokidar: 3.5.3 - sass: 1.55.0 - sass-loader: 13.1.0_sass@1.55.0 - vuepress-shared: 2.0.0-beta.110 + '@vuepress/shared': 2.0.0-beta.60 + '@vuepress/utils': 2.0.0-beta.60 + vuepress-shared: 2.0.0-beta.146 transitivePeerDependencies: - supports-color dev: false - /vuepress-plugin-seo2/2.0.0-beta.110: - resolution: {integrity: sha512-Ffd/HKEDTRZ2CW6Vo2Vi0+2kp401HI05xmwO/opWI9LzIdtoEBt9lOAWvcq33uycVy7dgggMAjyKyHU3KWszuQ==} + /vuepress-plugin-sitemap2/2.0.0-beta.146: + resolution: {integrity: sha512-sbdo5MsYcQ+rQiZbjuJDOX4Kn4oYd6TC8+e0MpSssowC2rVXNg2z+Fu/bmNbCEIifB+iST7qaxwpLtZlSZSFuA==} + engines: {node: ^14.18.0 || >=16.0.0, npm: '>=8', pnpm: '>=7'} + peerDependencies: + vuepress: 2.0.0-beta.60 + vuepress-vite: 2.0.0-beta.60 + vuepress-webpack: 2.0.0-beta.60 + peerDependenciesMeta: + vuepress: + optional: true + vuepress-vite: + optional: true + vuepress-webpack: + optional: true dependencies: - '@vuepress/shared': 2.0.0-beta.51 - '@vuepress/utils': 2.0.0-beta.51 - gray-matter: 4.0.3 - vuepress-shared: 2.0.0-beta.110 - transitivePeerDependencies: - - supports-color - dev: false - - /vuepress-plugin-sitemap2/2.0.0-beta.110: - resolution: {integrity: sha512-F7diM66NKZk4pNr2EpUgrS6X9G4/+/+7KGHcspZdFnY7cexE1ZwFqQbcXiVRnsgdqLXKnDk2hCSN5eNeMafAPg==} - dependencies: - '@vuepress/shared': 2.0.0-beta.51 - '@vuepress/utils': 2.0.0-beta.51 + '@vuepress/shared': 2.0.0-beta.60 + '@vuepress/utils': 2.0.0-beta.60 sitemap: 7.1.1 - vuepress-shared: 2.0.0-beta.110 + vuepress-shared: 2.0.0-beta.146 transitivePeerDependencies: - supports-color dev: false - /vuepress-shared/2.0.0-beta.110: - resolution: {integrity: sha512-3nqPOH4lLd1Vfl9EHs9m7u4XZRRwFGopfyANwdpt5Fl+llVYOQzG/zLbGSjKKcWkem4hjgGWY1olpyARjWGjlg==} + /vuepress-shared/2.0.0-beta.146: + resolution: {integrity: sha512-yCv4qe2gv6p0mYGyXENJWjaWmOXZ1Dn/UeGcosIxqP53xf7hMGvNJgPnhdykiWjs6Cba9vM/bHR1R9aae1BVVg==} dependencies: - '@vuepress/client': 2.0.0-beta.51 - '@vuepress/plugin-git': 2.0.0-beta.51 - '@vuepress/shared': 2.0.0-beta.51 - '@vuepress/utils': 2.0.0-beta.51 - dayjs: 1.11.5 + '@vuepress/client': 2.0.0-beta.60 + '@vuepress/shared': 2.0.0-beta.60 + '@vuepress/utils': 2.0.0-beta.60 + cheerio: 1.0.0-rc.12 + dayjs: 1.11.7 execa: 6.1.0 fflate: 0.7.4 - ora: 6.1.2 - vue: 3.2.41 - vue-router: 4.1.5_vue@3.2.41 + gray-matter: 4.0.3 + striptags: 3.2.0 + vue: 3.2.45 + vue-router: 4.1.6_vue@3.2.45 transitivePeerDependencies: - supports-color dev: false @@ -14998,12 +15575,16 @@ packages: hasBin: true dependencies: chalk: 4.1.2 - commander: 9.4.0 + commander: 9.4.1 debug: 4.3.4 transitivePeerDependencies: - supports-color dev: false + /walk-up-path/1.0.0: + resolution: {integrity: sha512-hwj/qMDUEjCU5h0xr90KGCf0tg0/LgJbmOWgrWKYlcJZM7XvquvUJZ0G/HMGr7F7OQMOUuPHWP9JpriinkAlkg==} + dev: true + /watchpack/2.4.0: resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} engines: {node: '>=10.13.0'} @@ -15021,21 +15602,7 @@ packages: /wcwidth/1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} dependencies: - defaults: 1.0.3 - - /web-resource-inliner/6.0.1: - resolution: {integrity: sha512-kfqDxt5dTB1JhqsCUQVFDj0rmY+4HLwGQIsLPbyrsN9y9WV/1oFDSx3BQ4GfCv9X+jVeQ7rouTqwK53rA/7t8A==} - engines: {node: '>=10.0.0'} - dependencies: - ansi-colors: 4.1.3 - escape-goat: 3.0.0 - htmlparser2: 5.0.1 - mime: 2.6.0 - node-fetch: 2.6.7 - valid-data-url: 3.0.1 - transitivePeerDependencies: - - encoding - dev: false + defaults: 1.0.4 /web-streams-polyfill/3.2.1: resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} @@ -15054,7 +15621,7 @@ packages: javascript-stringify: 2.1.0 dev: false - /webpack-dev-middleware/5.3.3_webpack@5.74.0: + /webpack-dev-middleware/5.3.3_webpack@5.75.0: resolution: {integrity: sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -15068,10 +15635,10 @@ packages: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.0.0 - webpack: 5.74.0 + webpack: 5.75.0 dev: false - /webpack-dev-server/4.11.1_webpack@5.74.0: + /webpack-dev-server/4.11.1_webpack@5.75.0: resolution: {integrity: sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==} engines: {node: '>= 12.13.0'} hasBin: true @@ -15086,7 +15653,7 @@ packages: dependencies: '@types/bonjour': 3.5.10 '@types/connect-history-api-fallback': 1.3.5 - '@types/express': 4.17.13 + '@types/express': 4.17.15 '@types/serve-index': 1.9.1 '@types/serve-static': 1.15.0 '@types/sockjs': 0.3.33 @@ -15098,10 +15665,10 @@ packages: compression: 1.7.4 connect-history-api-fallback: 2.0.0 default-gateway: 6.0.3 - express: 4.18.1 + express: 4.18.2 graceful-fs: 4.2.10 html-entities: 2.3.3 - http-proxy-middleware: 2.0.6_@types+express@4.17.13 + http-proxy-middleware: 2.0.6_@types+express@4.17.15 ipaddr.js: 2.0.1 open: 8.4.0 p-retry: 4.6.2 @@ -15111,8 +15678,8 @@ packages: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack: 5.74.0 - webpack-dev-middleware: 5.3.3_webpack@5.74.0 + webpack: 5.75.0 + webpack-dev-middleware: 5.3.3_webpack@5.75.0 ws: 8.8.1 transitivePeerDependencies: - bufferutil @@ -15146,8 +15713,8 @@ packages: resolution: {integrity: sha512-h9atBP/bsZohWpHnr+2sic8Iecb60GxftXsWNLLLSqewgIsGzByd2gcIID4nXcG+3tNe4GQG3dLcff3kXupdRA==} dev: false - /webpack/5.74.0: - resolution: {integrity: sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==} + /webpack/5.75.0: + resolution: {integrity: sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -15161,9 +15728,9 @@ packages: '@webassemblyjs/ast': 1.11.1 '@webassemblyjs/wasm-edit': 1.11.1 '@webassemblyjs/wasm-parser': 1.11.1 - acorn: 8.8.0 - acorn-import-assertions: 1.8.0_acorn@8.8.0 - browserslist: 4.21.3 + acorn: 8.8.1 + acorn-import-assertions: 1.8.0_acorn@8.8.1 + browserslist: 4.21.4 chrome-trace-event: 1.0.3 enhanced-resolve: 5.10.0 es-module-lexer: 0.9.3 @@ -15177,7 +15744,7 @@ packages: neo-async: 2.6.2 schema-utils: 3.1.1 tapable: 2.2.1 - terser-webpack-plugin: 5.3.3_webpack@5.74.0 + terser-webpack-plugin: 5.3.3_webpack@5.75.0 watchpack: 2.4.0 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -15252,14 +15819,21 @@ packages: string-width: 4.2.3 dev: false + /widest-line/4.0.1: + resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + dev: false + /wildcard/2.0.0: resolution: {integrity: sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==} dev: false - /windicss-webpack-plugin/1.7.6: - resolution: {integrity: sha512-EKeTtauncsHJoie+derI1pxW6i+iBT4/boU+eGCCkzZYgY3T0H3U6I+y35GHjRmM4VETImR5b/tRpOFkG2a89g==} + /windicss-webpack-plugin/1.7.7: + resolution: {integrity: sha512-a5I6xm57PC5mFqjHn+CxcmPI6Hueg1pQlzzQWxq1ynvz/9SZ6rTN3HAsHuw3n/OTq83ogXdgM+v5Htc+vThjFg==} dependencies: - '@windicss/plugin-utils': 1.8.7 + '@windicss/plugin-utils': 1.8.8 debug: 4.3.4 get-port: 6.1.2 loader-utils: 2.0.2 @@ -15360,7 +15934,7 @@ packages: resolution: {integrity: sha512-QFF+ufAqhoYHvoHdajT/Po7KoXVBPXS2bgjIam5isfWJPfIOnQZ50JtUiVvCv/sjgacf3yRrt2ZKUZ/V4itN4g==} engines: {node: '>=12'} dependencies: - ansi-styles: 6.1.0 + ansi-styles: 6.2.1 string-width: 5.1.2 strip-ansi: 7.0.1 dev: false @@ -15417,6 +15991,11 @@ packages: engines: {node: '>=8'} dev: false + /xdg-basedir/5.1.0: + resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} + engines: {node: '>=12'} + dev: false + /xml-name-validator/4.0.0: resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} engines: {node: '>=12'} @@ -15439,6 +16018,10 @@ packages: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} + /yallist/3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: false + /yallist/4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} @@ -15446,18 +16029,17 @@ packages: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} - /yaml/2.1.3: - resolution: {integrity: sha512-AacA8nRULjKMX2DvWvOAdBZMOfQlypSFkjcOcu9FalllIDJ1kvlREzcdIZmidQUqqeMv7jorHjq2HlLv/+c2lg==} + /yaml/2.2.0: + resolution: {integrity: sha512-auf7Gi6QwO7HW//GA9seGvTXVGWl1CM/ADWh1+RxtXr6XOxnT65ovDl9fTi4e0monEyJxCHqDpF6QnFDXmJE4g==} engines: {node: '>= 14'} - dev: true /yargs-parser/20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} dev: true - /yargs-parser/21.0.1: - resolution: {integrity: sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==} + /yargs-parser/21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} /yargs/16.2.0: @@ -15473,17 +16055,17 @@ packages: yargs-parser: 20.2.9 dev: true - /yargs/17.5.1: - resolution: {integrity: sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==} + /yargs/17.6.2: + resolution: {integrity: sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==} engines: {node: '>=12'} dependencies: - cliui: 7.0.4 + cliui: 8.0.1 escalade: 3.1.1 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 y18n: 5.0.8 - yargs-parser: 21.0.1 + yargs-parser: 21.1.1 /yargs/3.32.0: resolution: {integrity: sha512-ONJZiimStfZzhKamYvR/xvmgW3uEkAUFSP91y2caTEPhzF6uP2JfPiVZcq66b/YR0C3uitxSV7+T1x8p5bkmMg==} @@ -15526,8 +16108,8 @@ packages: readable-stream: 3.6.0 dev: false - /zrender/5.4.0: - resolution: {integrity: sha512-rOS09Z2HSVGFs2dn/TuYk5BlCaZcVe8UDLLjj1ySYF828LATKKdxuakSZMvrDz54yiKPDYVfjdKqcX8Jky3BIA==} + /zrender/5.4.1: + resolution: {integrity: sha512-M4Z05BHWtajY2241EmMPHglDQAJ1UyHQcYsxDNzD9XLSkPDqMq4bB28v9Pb4mvHnVQ0GxyTklZ/69xCFP6RXBA==} dependencies: tslib: 2.3.0 dev: false diff --git a/scripts/autoInstall.js b/scripts/autoInstall.js index 44ab8014..4b8f2738 100644 --- a/scripts/autoInstall.js +++ b/scripts/autoInstall.js @@ -13,7 +13,7 @@ const _dirname = const packages = [ ...fs .readdirSync(path.join(_dirname, '../packages')) - .filter((file) => file !== '.DS_Store') + .filter((file) => file !== '.DS_Store' && file !== 'tsconfig.build.json') .map((dir) => path.join('../packages', dir)), '../docs', ] diff --git a/tsconfig.json b/tsconfig.json index ef8ff890..146ba7e4 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -17,9 +17,6 @@ }, "types": ["webpack-env", "vite/client"] }, - "vueCompilerOptions": { - "experimentalDisableTemplateSupport": true - }, "include": ["packages/**/*", "docs/.vuepress/**/*", "scripts/**/*"], "exclude": ["node_modules", ".temp", "lib", "dist"], "ts-node": { From 57e225e0d93e5a13e2a030c2faffb6ce576abb01 Mon Sep 17 00:00:00 2001 From: pengzhanbo Date: Sun, 15 Jan 2023 20:37:06 +0800 Subject: [PATCH 05/29] build: update deps --- package.json | 14 +- .../plugin-netlify-functions/package.json | 6 +- packages/plugin-page-collection/package.json | 2 +- packages/theme/package.json | 10 +- pnpm-lock.yaml | 1540 +++++++++-------- 5 files changed, 803 insertions(+), 769 deletions(-) diff --git a/package.json b/package.json index 8046853c..2c5e710a 100644 --- a/package.json +++ b/package.json @@ -48,8 +48,8 @@ }, "prettier": "prettier-config-vuepress", "devDependencies": { - "@commitlint/cli": "^17.3.0", - "@commitlint/config-conventional": "^17.3.0", + "@commitlint/cli": "^17.4.2", + "@commitlint/config-conventional": "^17.4.2", "@types/minimist": "^1.2.2", "@types/node": "18.11.18", "@types/webpack-env": "^1.18.0", @@ -61,17 +61,17 @@ "cpx2": "^4.2.0", "cross-env": "^7.0.3", "cz-conventional-changelog": "^3.3.0", - "eslint": "^8.30.0", + "eslint": "^8.32.0", "eslint-config-vuepress": "^4.0.4", "eslint-config-vuepress-typescript": "^4.0.4", "execa": "^6.1.0", "handlebars": "^4.7.7", - "husky": "^8.0.2", + "husky": "^8.0.3", "lint-staged": "^13.1.0", "minimist": "^1.2.7", "ora": "^6.1.2", - "pnpm": "^7.21.0", - "prettier": "^2.8.1", + "pnpm": "^7.25.0", + "prettier": "^2.8.3", "prettier-config-vuepress": "^4.0.0", "rimraf": "^3.0.2", "sort-package-json": "^2.1.0", @@ -79,7 +79,7 @@ "ts-node": "^10.9.1", "tsconfig-vuepress": "^4.0.4", "typescript": "^4.9.4", - "vite": "^4.0.3" + "vite": "^4.0.4" }, "packageManager": "pnpm@7.13.4", "engines": { diff --git a/packages/plugin-netlify-functions/package.json b/packages/plugin-netlify-functions/package.json index d680670a..8cdb4f84 100644 --- a/packages/plugin-netlify-functions/package.json +++ b/packages/plugin-netlify-functions/package.json @@ -38,7 +38,7 @@ }, "dependencies": { "@iarna/toml": "^2.2.5", - "@netlify/functions": "^1.3.0", + "@netlify/functions": "^1.4.0", "@vuepress/core": "2.0.0-beta.60", "@vuepress/shared": "2.0.0-beta.60", "@vuepress/utils": "2.0.0-beta.60", @@ -46,9 +46,9 @@ "chokidar": "^3.5.3", "cpx2": "^4.2.0", "dotenv": "^16.0.3", - "esbuild": "^0.16.12", + "esbuild": "^0.16.17", "execa": "^6.1.0", - "netlify-cli": "^12.5.0", + "netlify-cli": "^12.7.2", "portfinder": "^1.0.32" }, "devDependencies": { diff --git a/packages/plugin-page-collection/package.json b/packages/plugin-page-collection/package.json index 2e2ced07..812a22e5 100644 --- a/packages/plugin-page-collection/package.json +++ b/packages/plugin-page-collection/package.json @@ -31,7 +31,7 @@ "ts": "tsc -b tsconfig.build.json" }, "dependencies": { - "@netlify/functions": "^1.3.0", + "@netlify/functions": "^1.4.0", "@vuepress-plume/vuepress-plugin-netlify-functions": "workspace:*", "@vuepress/client": "2.0.0-beta.60", "@vuepress/core": "2.0.0-beta.60", diff --git a/packages/theme/package.json b/packages/theme/package.json index e733b31f..4ccbe96e 100644 --- a/packages/theme/package.json +++ b/packages/theme/package.json @@ -56,16 +56,16 @@ "@vuepress/plugin-toc": "2.0.0-beta.60", "@vuepress/shared": "2.0.0-beta.60", "@vuepress/utils": "2.0.0-beta.60", - "@vueuse/core": "^9.9.0", + "@vueuse/core": "^9.10.0", "date-fns": "^2.29.3", "nanoid": "^4.0.0", "ts-debounce": "^4.0.0", "vue": "^3.2.45", "vue-router": "4.1.6", - "vuepress-plugin-comment2": "2.0.0-beta.146", - "vuepress-plugin-md-enhance": "2.0.0-beta.146", - "vuepress-plugin-seo2": "2.0.0-beta.146", - "vuepress-plugin-sitemap2": "2.0.0-beta.146", + "vuepress-plugin-comment2": "2.0.0-beta.158", + "vuepress-plugin-md-enhance": "2.0.0-beta.158", + "vuepress-plugin-seo2": "2.0.0-beta.158", + "vuepress-plugin-sitemap2": "2.0.0-beta.158", "windicss": "^3.5.6" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f08b1d0d..fd258a67 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,8 +4,8 @@ importers: .: specifiers: - '@commitlint/cli': ^17.3.0 - '@commitlint/config-conventional': ^17.3.0 + '@commitlint/cli': ^17.4.2 + '@commitlint/config-conventional': ^17.4.2 '@types/minimist': ^1.2.2 '@types/node': 18.11.18 '@types/webpack-env': ^1.18.0 @@ -17,17 +17,17 @@ importers: cpx2: ^4.2.0 cross-env: ^7.0.3 cz-conventional-changelog: ^3.3.0 - eslint: ^8.30.0 + eslint: ^8.32.0 eslint-config-vuepress: ^4.0.4 eslint-config-vuepress-typescript: ^4.0.4 execa: ^6.1.0 handlebars: ^4.7.7 - husky: ^8.0.2 + husky: ^8.0.3 lint-staged: ^13.1.0 minimist: ^1.2.7 ora: ^6.1.2 - pnpm: ^7.21.0 - prettier: ^2.8.1 + pnpm: ^7.25.0 + prettier: ^2.8.3 prettier-config-vuepress: ^4.0.0 rimraf: ^3.0.2 sort-package-json: ^2.1.0 @@ -35,10 +35,10 @@ importers: ts-node: ^10.9.1 tsconfig-vuepress: ^4.0.4 typescript: ^4.9.4 - vite: ^4.0.3 + vite: ^4.0.4 devDependencies: - '@commitlint/cli': 17.3.0 - '@commitlint/config-conventional': 17.3.0 + '@commitlint/cli': 17.4.2 + '@commitlint/config-conventional': 17.4.2 '@types/minimist': 1.2.2 '@types/node': 18.11.18 '@types/webpack-env': 1.18.0 @@ -50,17 +50,17 @@ importers: cpx2: 4.2.0 cross-env: 7.0.3 cz-conventional-changelog: 3.3.0 - eslint: 8.30.0 - eslint-config-vuepress: 4.0.4_nveednhrtxclom63fsgwztxh4a - eslint-config-vuepress-typescript: 4.0.4_5c545irdft4vuty3gxgtfdqu3e + eslint: 8.32.0 + eslint-config-vuepress: 4.0.4_udtwlmtl3kiiub6agmjl3rmgge + eslint-config-vuepress-typescript: 4.0.4_otjudfky5iceznjpbxpmgilubi execa: 6.1.0 handlebars: 4.7.7 - husky: 8.0.2 + husky: 8.0.3 lint-staged: 13.1.0 minimist: 1.2.7 ora: 6.1.2 - pnpm: 7.21.0 - prettier: 2.8.1 + pnpm: 7.25.0 + prettier: 2.8.3 prettier-config-vuepress: 4.0.0 rimraf: 3.0.2 sort-package-json: 2.1.0 @@ -68,7 +68,7 @@ importers: ts-node: 10.9.1_awa2wsr5thmg3i7jqycphctjfq tsconfig-vuepress: 4.0.4 typescript: 4.9.4 - vite: 4.0.3_@types+node@18.11.18 + vite: 4.0.4_@types+node@18.11.18 docs: specifiers: @@ -179,7 +179,7 @@ importers: packages/plugin-netlify-functions: specifiers: '@iarna/toml': ^2.2.5 - '@netlify/functions': ^1.3.0 + '@netlify/functions': ^1.4.0 '@types/node': ^18.11.18 '@vuepress/core': 2.0.0-beta.60 '@vuepress/shared': 2.0.0-beta.60 @@ -188,13 +188,13 @@ importers: chokidar: ^3.5.3 cpx2: ^4.2.0 dotenv: ^16.0.3 - esbuild: ^0.16.12 + esbuild: ^0.16.17 execa: ^6.1.0 - netlify-cli: ^12.5.0 + netlify-cli: ^12.7.2 portfinder: ^1.0.32 dependencies: '@iarna/toml': 2.2.5 - '@netlify/functions': 1.3.0 + '@netlify/functions': 1.4.0 '@vuepress/core': 2.0.0-beta.60 '@vuepress/shared': 2.0.0-beta.60 '@vuepress/utils': 2.0.0-beta.60 @@ -202,16 +202,19 @@ importers: chokidar: 3.5.3 cpx2: 4.2.0 dotenv: 16.0.3 - esbuild: 0.16.12 + esbuild: 0.16.17 execa: 6.1.0 - netlify-cli: 12.5.0_@types+node@18.11.18 + netlify-cli: 12.7.2_@types+node@18.11.18 portfinder: 1.0.32 devDependencies: '@types/node': 18.11.18 + packages/plugin-notes-data: + specifiers: {} + packages/plugin-page-collection: specifiers: - '@netlify/functions': ^1.3.0 + '@netlify/functions': ^1.4.0 '@vuepress-plume/vuepress-plugin-netlify-functions': workspace:* '@vuepress/client': 2.0.0-beta.60 '@vuepress/core': 2.0.0-beta.60 @@ -221,7 +224,7 @@ importers: vue: ^3.2.45 vue-router: 4.1.6 dependencies: - '@netlify/functions': 1.3.0 + '@netlify/functions': 1.4.0 '@vuepress-plume/vuepress-plugin-netlify-functions': link:../plugin-netlify-functions '@vuepress/client': 2.0.0-beta.60 '@vuepress/core': 2.0.0-beta.60 @@ -274,16 +277,16 @@ importers: '@vuepress/plugin-toc': 2.0.0-beta.60 '@vuepress/shared': 2.0.0-beta.60 '@vuepress/utils': 2.0.0-beta.60 - '@vueuse/core': ^9.9.0 + '@vueuse/core': ^9.10.0 date-fns: ^2.29.3 nanoid: ^4.0.0 ts-debounce: ^4.0.0 vue: ^3.2.45 vue-router: 4.1.6 - vuepress-plugin-comment2: 2.0.0-beta.146 - vuepress-plugin-md-enhance: 2.0.0-beta.146 - vuepress-plugin-seo2: 2.0.0-beta.146 - vuepress-plugin-sitemap2: 2.0.0-beta.146 + vuepress-plugin-comment2: 2.0.0-beta.158 + vuepress-plugin-md-enhance: 2.0.0-beta.158 + vuepress-plugin-seo2: 2.0.0-beta.158 + vuepress-plugin-sitemap2: 2.0.0-beta.158 windicss: ^3.5.6 dependencies: '@types/lodash.merge': 4.6.7 @@ -309,16 +312,16 @@ importers: '@vuepress/plugin-toc': 2.0.0-beta.60 '@vuepress/shared': 2.0.0-beta.60 '@vuepress/utils': 2.0.0-beta.60 - '@vueuse/core': 9.9.0_vue@3.2.45 + '@vueuse/core': 9.10.0_vue@3.2.45 date-fns: 2.29.3 nanoid: 4.0.0 ts-debounce: 4.0.0 vue: 3.2.45 vue-router: 4.1.6_vue@3.2.45 - vuepress-plugin-comment2: 2.0.0-beta.146 - vuepress-plugin-md-enhance: 2.0.0-beta.146 - vuepress-plugin-seo2: 2.0.0-beta.146 - vuepress-plugin-sitemap2: 2.0.0-beta.146 + vuepress-plugin-comment2: 2.0.0-beta.158_aknydt7aotgymh3yxf7whaz6ti + vuepress-plugin-md-enhance: 2.0.0-beta.158_aknydt7aotgymh3yxf7whaz6ti + vuepress-plugin-seo2: 2.0.0-beta.158_aknydt7aotgymh3yxf7whaz6ti + vuepress-plugin-sitemap2: 2.0.0-beta.158_aknydt7aotgymh3yxf7whaz6ti windicss: 3.5.6 packages: @@ -467,24 +470,24 @@ packages: engines: {node: '>=6.9.0'} dev: false - /@babel/core/7.20.7: - resolution: {integrity: sha512-t1ZjCluspe5DW24bn2Rr1CDb2v9rn/hROtg9a2tmd0+QYf4bsloYfLQzjG4qHPNMhWtKdGC33R5AxGR2Af2cBw==} + /@babel/core/7.20.12: + resolution: {integrity: sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.0 '@babel/code-frame': 7.18.6 '@babel/generator': 7.20.7 - '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.7 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.20.12 '@babel/helper-module-transforms': 7.20.11 '@babel/helpers': 7.20.7 '@babel/parser': 7.20.7 '@babel/template': 7.20.7 - '@babel/traverse': 7.20.10 + '@babel/traverse': 7.20.12 '@babel/types': 7.20.7 convert-source-map: 1.8.0 debug: 4.3.4 gensync: 1.0.0-beta.2 - json5: 2.2.1 + json5: 2.2.3 semver: 6.3.0 transitivePeerDependencies: - supports-color @@ -499,16 +502,16 @@ packages: jsesc: 2.5.2 dev: false - /@babel/helper-compilation-targets/7.20.7_@babel+core@7.20.7: + /@babel/helper-compilation-targets/7.20.7_@babel+core@7.20.12: resolution: {integrity: sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: '@babel/compat-data': 7.20.10 - '@babel/core': 7.20.7 + '@babel/core': 7.20.12 '@babel/helper-validator-option': 7.18.6 - browserslist: 4.21.3 + browserslist: 4.21.4 lru-cache: 5.1.1 semver: 6.3.0 dev: false @@ -550,7 +553,7 @@ packages: '@babel/helper-split-export-declaration': 7.18.6 '@babel/helper-validator-identifier': 7.19.1 '@babel/template': 7.20.7 - '@babel/traverse': 7.20.10 + '@babel/traverse': 7.20.12 '@babel/types': 7.20.7 transitivePeerDependencies: - supports-color @@ -570,11 +573,6 @@ packages: '@babel/types': 7.20.7 dev: false - /@babel/helper-string-parser/7.18.10: - resolution: {integrity: sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==} - engines: {node: '>=6.9.0'} - dev: false - /@babel/helper-string-parser/7.19.4: resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} engines: {node: '>=6.9.0'} @@ -594,7 +592,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.20.7 - '@babel/traverse': 7.20.10 + '@babel/traverse': 7.20.12 '@babel/types': 7.20.7 transitivePeerDependencies: - supports-color @@ -612,14 +610,6 @@ packages: resolution: {integrity: sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw==} engines: {node: '>=6.0.0'} hasBin: true - dependencies: - '@babel/types': 7.18.10 - dev: false - - /@babel/parser/7.18.10: - resolution: {integrity: sha512-TYk3OA0HKL6qNryUayb5UUEhM/rkOQozIBEA5ITXh5DWrSp0TlUQXMyZmnWxG/DizSWBeeQ0Zbc5z8UGaaqoeg==} - engines: {node: '>=6.0.0'} - hasBin: true dependencies: '@babel/types': 7.20.7 dev: false @@ -656,8 +646,8 @@ packages: '@babel/types': 7.20.7 dev: false - /@babel/traverse/7.20.10: - resolution: {integrity: sha512-oSf1juCgymrSez8NI4A2sr4+uB/mFd9MXplYGPEBnfAuWmmyeVcHa6xLPiaRBcXkcb/28bgxmQLTVwFKE1yfsg==} + /@babel/traverse/7.20.12: + resolution: {integrity: sha512-MsIbFN0u+raeja38qboyF8TIT7K0BFzz/Yd/77ta4MsUsmP2RAnidIlwq7d5HFQrH/OZJecGV6B71C4zAgpoSQ==} engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.18.6 @@ -674,15 +664,6 @@ packages: - supports-color dev: false - /@babel/types/7.18.10: - resolution: {integrity: sha512-MJvnbEiiNkpjo+LknnmRrqbY1GPUUggjv+wQVjetM/AONoupqRALB7I6jGqNUAZsKcRIEu2J6FRFvsczljjsaQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.18.10 - '@babel/helper-validator-identifier': 7.19.1 - to-fast-properties: 2.0.0 - dev: false - /@babel/types/7.20.7: resolution: {integrity: sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==} engines: {node: '>=6.9.0'} @@ -743,16 +724,16 @@ packages: engines: {node: '>=0.1.90'} dev: false - /@commitlint/cli/17.3.0: - resolution: {integrity: sha512-/H0md7TsKflKzVPz226VfXzVafJFO1f9+r2KcFvmBu08V0T56lZU1s8WL7/xlxqLMqBTVaBf7Ixtc4bskdEEZg==} + /@commitlint/cli/17.4.2: + resolution: {integrity: sha512-0rPGJ2O1owhpxMIXL9YJ2CgPkdrFLKZElIZHXDN8L8+qWK1DGH7Q7IelBT1pchXTYTuDlqkOTdh//aTvT3bSUA==} engines: {node: '>=v14'} hasBin: true dependencies: - '@commitlint/format': 17.0.0 - '@commitlint/lint': 17.3.0 - '@commitlint/load': 17.3.0 - '@commitlint/read': 17.2.0 - '@commitlint/types': 17.0.0 + '@commitlint/format': 17.4.0 + '@commitlint/lint': 17.4.2 + '@commitlint/load': 17.4.2 + '@commitlint/read': 17.4.2 + '@commitlint/types': 17.4.0 execa: 5.1.1 lodash.isfunction: 3.0.9 resolve-from: 5.0.0 @@ -763,26 +744,26 @@ packages: - '@swc/wasm' dev: true - /@commitlint/config-conventional/17.3.0: - resolution: {integrity: sha512-hgI+fN5xF8nhS9uG/V06xyT0nlcyvHHMkq0kwRSr96vl5BFlRGaL2C0/YY4kQagfU087tmj01bJkG9Ek98Wllw==} + /@commitlint/config-conventional/17.4.2: + resolution: {integrity: sha512-JVo1moSj5eDMoql159q8zKCU8lkOhQ+b23Vl3LVVrS6PXDLQIELnJ34ChQmFVbBdSSRNAbbXnRDhosFU+wnuHw==} engines: {node: '>=v14'} dependencies: conventional-changelog-conventionalcommits: 5.0.0 dev: true - /@commitlint/config-validator/17.1.0: - resolution: {integrity: sha512-Q1rRRSU09ngrTgeTXHq6ePJs2KrI+axPTgkNYDWSJIuS1Op4w3J30vUfSXjwn5YEJHklK3fSqWNHmBhmTR7Vdg==} + /@commitlint/config-validator/17.4.0: + resolution: {integrity: sha512-Sa/+8KNpDXz4zT4bVbz2fpFjvgkPO6u2V2fP4TKgt6FjmOw2z3eEX859vtfeaTav/ukBw0/0jr+5ZTZp9zCBhA==} engines: {node: '>=v14'} dependencies: - '@commitlint/types': 17.0.0 + '@commitlint/types': 17.4.0 ajv: 8.11.2 dev: true - /@commitlint/ensure/17.3.0: - resolution: {integrity: sha512-kWbrQHDoW5veIUQx30gXoLOCjWvwC6OOEofhPCLl5ytRPBDAQObMbxTha1Bt2aSyNE/IrJ0s0xkdZ1Gi3wJwQg==} + /@commitlint/ensure/17.4.0: + resolution: {integrity: sha512-7oAxt25je0jeQ/E0O/M8L3ADb1Cvweu/5lc/kYF8g/kXatI0wxGE5La52onnAUAWeWlsuvBNar15WcrmDmr5Mw==} engines: {node: '>=v14'} dependencies: - '@commitlint/types': 17.0.0 + '@commitlint/types': 17.4.0 lodash.camelcase: 4.3.0 lodash.kebabcase: 4.1.1 lodash.snakecase: 4.1.1 @@ -790,122 +771,122 @@ packages: lodash.upperfirst: 4.3.1 dev: true - /@commitlint/execute-rule/17.0.0: - resolution: {integrity: sha512-nVjL/w/zuqjCqSJm8UfpNaw66V9WzuJtQvEnCrK4jDw6qKTmZB+1JQ8m6BQVZbNBcwfYdDNKnhIhqI0Rk7lgpQ==} + /@commitlint/execute-rule/17.4.0: + resolution: {integrity: sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA==} engines: {node: '>=v14'} dev: true - /@commitlint/format/17.0.0: - resolution: {integrity: sha512-MZzJv7rBp/r6ZQJDEodoZvdRM0vXu1PfQvMTNWFb8jFraxnISMTnPBWMMjr2G/puoMashwaNM//fl7j8gGV5lA==} + /@commitlint/format/17.4.0: + resolution: {integrity: sha512-Z2bWAU5+f1YZh9W76c84J8iLIWIvvm+mzqogTz0Nsc1x6EHW0Z2gI38g5HAjB0r0I3ZjR15IDEJKhsxyblcyhA==} engines: {node: '>=v14'} dependencies: - '@commitlint/types': 17.0.0 + '@commitlint/types': 17.4.0 chalk: 4.1.2 dev: true - /@commitlint/is-ignored/17.2.0: - resolution: {integrity: sha512-rgUPUQraHxoMLxiE8GK430HA7/R2vXyLcOT4fQooNrZq9ERutNrP6dw3gdKLkq22Nede3+gEHQYUzL4Wu75ndg==} + /@commitlint/is-ignored/17.4.2: + resolution: {integrity: sha512-1b2Y2qJ6n7bHG9K6h8S4lBGUl6kc7mMhJN9gy1SQfUZqe92ToDjUTtgNWb6LbzR1X8Cq4SEus4VU8Z/riEa94Q==} engines: {node: '>=v14'} dependencies: - '@commitlint/types': 17.0.0 - semver: 7.3.7 + '@commitlint/types': 17.4.0 + semver: 7.3.8 dev: true - /@commitlint/lint/17.3.0: - resolution: {integrity: sha512-VilOTPg0i9A7CCWM49E9bl5jytfTvfTxf9iwbWAWNjxJ/A5mhPKbm3sHuAdwJ87tDk1k4j8vomYfH23iaY+1Rw==} + /@commitlint/lint/17.4.2: + resolution: {integrity: sha512-HcymabrdBhsDMNzIv146+ZPNBPBK5gMNsVH+el2lCagnYgCi/4ixrHooeVyS64Fgce2K26+MC7OQ4vVH8wQWVw==} engines: {node: '>=v14'} dependencies: - '@commitlint/is-ignored': 17.2.0 - '@commitlint/parse': 17.2.0 - '@commitlint/rules': 17.3.0 - '@commitlint/types': 17.0.0 + '@commitlint/is-ignored': 17.4.2 + '@commitlint/parse': 17.4.2 + '@commitlint/rules': 17.4.2 + '@commitlint/types': 17.4.0 dev: true - /@commitlint/load/17.3.0: - resolution: {integrity: sha512-u/pV6rCAJrCUN+HylBHLzZ4qj1Ew3+eN9GBPhNi9otGxtOfA8b+8nJSxaNbcC23Ins/kcpjGf9zPSVW7628Umw==} + /@commitlint/load/17.4.2: + resolution: {integrity: sha512-Si++F85rJ9t4hw6JcOw1i2h0fdpdFQt0YKwjuK4bk9KhFjyFkRxvR3SB2dPaMs+EwWlDrDBGL+ygip1QD6gmPw==} engines: {node: '>=v14'} dependencies: - '@commitlint/config-validator': 17.1.0 - '@commitlint/execute-rule': 17.0.0 - '@commitlint/resolve-extends': 17.3.0 - '@commitlint/types': 17.0.0 - '@types/node': 14.18.36 + '@commitlint/config-validator': 17.4.0 + '@commitlint/execute-rule': 17.4.0 + '@commitlint/resolve-extends': 17.4.0 + '@commitlint/types': 17.4.0 + '@types/node': 18.11.18 chalk: 4.1.2 - cosmiconfig: 7.1.0 - cosmiconfig-typescript-loader: 4.3.0_k32j2iwrrwkbro5edqflmrijke + cosmiconfig: 8.0.0 + cosmiconfig-typescript-loader: 4.3.0_bxtyj3et3xbsdyxhh3oblnfbj4 lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 resolve-from: 5.0.0 - ts-node: 10.9.1_ocil65wecyuhsmrrocoajouipe + ts-node: 10.9.1_awa2wsr5thmg3i7jqycphctjfq typescript: 4.9.4 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' dev: true - /@commitlint/message/17.2.0: - resolution: {integrity: sha512-/4l2KFKxBOuoEn1YAuuNNlAU05Zt7sNsC9H0mPdPm3chOrT4rcX0pOqrQcLtdMrMkJz0gC7b3SF80q2+LtdL9Q==} + /@commitlint/message/17.4.2: + resolution: {integrity: sha512-3XMNbzB+3bhKA1hSAWPCQA3lNxR4zaeQAQcHj0Hx5sVdO6ryXtgUBGGv+1ZCLMgAPRixuc6en+iNAzZ4NzAa8Q==} engines: {node: '>=v14'} dev: true - /@commitlint/parse/17.2.0: - resolution: {integrity: sha512-vLzLznK9Y21zQ6F9hf8D6kcIJRb2haAK5T/Vt1uW2CbHYOIfNsR/hJs0XnF/J9ctM20Tfsqv4zBitbYvVw7F6Q==} + /@commitlint/parse/17.4.2: + resolution: {integrity: sha512-DK4EwqhxfXpyCA+UH8TBRIAXAfmmX4q9QRBz/2h9F9sI91yt6mltTrL6TKURMcjUVmgaB80wgS9QybNIyVBIJA==} engines: {node: '>=v14'} dependencies: - '@commitlint/types': 17.0.0 + '@commitlint/types': 17.4.0 conventional-changelog-angular: 5.0.13 conventional-commits-parser: 3.2.4 dev: true - /@commitlint/read/17.2.0: - resolution: {integrity: sha512-bbblBhrHkjxra3ptJNm0abxu7yeAaxumQ8ZtD6GIVqzURCETCP7Dm0tlVvGRDyXBuqX6lIJxh3W7oyKqllDsHQ==} + /@commitlint/read/17.4.2: + resolution: {integrity: sha512-hasYOdbhEg+W4hi0InmXHxtD/1favB4WdwyFxs1eOy/DvMw6+2IZBmATgGOlqhahsypk4kChhxjAFJAZ2F+JBg==} engines: {node: '>=v14'} dependencies: - '@commitlint/top-level': 17.0.0 - '@commitlint/types': 17.0.0 - fs-extra: 10.1.0 + '@commitlint/top-level': 17.4.0 + '@commitlint/types': 17.4.0 + fs-extra: 11.1.0 git-raw-commits: 2.0.11 minimist: 1.2.7 dev: true - /@commitlint/resolve-extends/17.3.0: - resolution: {integrity: sha512-Lf3JufJlc5yVEtJWC8o4IAZaB8FQAUaVlhlAHRACd0TTFizV2Lk2VH70et23KgvbQNf7kQzHs/2B4QZalBv6Cg==} + /@commitlint/resolve-extends/17.4.0: + resolution: {integrity: sha512-3JsmwkrCzoK8sO22AzLBvNEvC1Pmdn/65RKXzEtQMy6oYMl0Snrq97a5bQQEFETF0VsvbtUuKttLqqgn99OXRQ==} engines: {node: '>=v14'} dependencies: - '@commitlint/config-validator': 17.1.0 - '@commitlint/types': 17.0.0 + '@commitlint/config-validator': 17.4.0 + '@commitlint/types': 17.4.0 import-fresh: 3.3.0 lodash.mergewith: 4.6.2 resolve-from: 5.0.0 resolve-global: 1.0.0 dev: true - /@commitlint/rules/17.3.0: - resolution: {integrity: sha512-s2UhDjC5yP2utx3WWqsnZRzjgzAX8BMwr1nltC0u0p8T/nzpkx4TojEfhlsOUj1t7efxzZRjUAV0NxNwdJyk+g==} + /@commitlint/rules/17.4.2: + resolution: {integrity: sha512-OGrPsMb9Fx3/bZ64/EzJehY9YDSGWzp81Pj+zJiY+r/NSgJI3nUYdlS37jykNIugzazdEXfMtQ10kmA+Kx2pZQ==} engines: {node: '>=v14'} dependencies: - '@commitlint/ensure': 17.3.0 - '@commitlint/message': 17.2.0 - '@commitlint/to-lines': 17.0.0 - '@commitlint/types': 17.0.0 + '@commitlint/ensure': 17.4.0 + '@commitlint/message': 17.4.2 + '@commitlint/to-lines': 17.4.0 + '@commitlint/types': 17.4.0 execa: 5.1.1 dev: true - /@commitlint/to-lines/17.0.0: - resolution: {integrity: sha512-nEi4YEz04Rf2upFbpnEorG8iymyH7o9jYIVFBG1QdzebbIFET3ir+8kQvCZuBE5pKCtViE4XBUsRZz139uFrRQ==} + /@commitlint/to-lines/17.4.0: + resolution: {integrity: sha512-LcIy/6ZZolsfwDUWfN1mJ+co09soSuNASfKEU5sCmgFCvX5iHwRYLiIuoqXzOVDYOy7E7IcHilr/KS0e5T+0Hg==} engines: {node: '>=v14'} dev: true - /@commitlint/top-level/17.0.0: - resolution: {integrity: sha512-dZrEP1PBJvodNWYPOYiLWf6XZergdksKQaT6i1KSROLdjf5Ai0brLOv5/P+CPxBeoj3vBxK4Ax8H1Pg9t7sHIQ==} + /@commitlint/top-level/17.4.0: + resolution: {integrity: sha512-/1loE/g+dTTQgHnjoCy0AexKAEFyHsR2zRB4NWrZ6lZSMIxAhBJnmCqwao7b4H8888PsfoTBCLBYIw8vGnej8g==} engines: {node: '>=v14'} dependencies: find-up: 5.0.0 dev: true - /@commitlint/types/17.0.0: - resolution: {integrity: sha512-hBAw6U+SkAT5h47zDMeOu3HSiD0SODw4Aq7rRNh1ceUmL7GyLKYhPbUvlRWqZ65XjBLPHZhFyQlRaPNz8qvUyQ==} + /@commitlint/types/17.4.0: + resolution: {integrity: sha512-2NjAnq5IcxY9kXtUeO2Ac0aPpvkuOmwbH/BxIm36XXK5LtWFObWJWjXOA+kcaABMrthjWu6la+FUpyYFMHRvbA==} engines: {node: '>=v14'} dependencies: chalk: 4.1.2 @@ -972,80 +953,80 @@ packages: dev: false optional: true - /@esbuild/android-arm/0.16.12: - resolution: {integrity: sha512-CTWgMJtpCyCltrvipZrrcjjRu+rzm6pf9V8muCsJqtKujR3kPmU4ffbckvugNNaRmhxAF1ZI3J+0FUIFLFg8KA==} + /@esbuild/android-arm/0.16.17: + resolution: {integrity: sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==} engines: {node: '>=12'} cpu: [arm] os: [android] requiresBuild: true optional: true - /@esbuild/android-arm64/0.16.12: - resolution: {integrity: sha512-0LacmiIW+X0/LOLMZqYtZ7d4uY9fxYABAYhSSOu+OGQVBqH4N5eIYgkT7bBFnR4Nm3qo6qS3RpHKVrDASqj/uQ==} + /@esbuild/android-arm64/0.16.17: + resolution: {integrity: sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==} engines: {node: '>=12'} cpu: [arm64] os: [android] requiresBuild: true optional: true - /@esbuild/android-x64/0.16.12: - resolution: {integrity: sha512-sS5CR3XBKQXYpSGMM28VuiUnbX83Z+aWPZzClW+OB2JquKqxoiwdqucJ5qvXS8pM6Up3RtJfDnRQZkz3en2z5g==} + /@esbuild/android-x64/0.16.17: + resolution: {integrity: sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==} engines: {node: '>=12'} cpu: [x64] os: [android] requiresBuild: true optional: true - /@esbuild/darwin-arm64/0.16.12: - resolution: {integrity: sha512-Dpe5hOAQiQRH20YkFAg+wOpcd4PEuXud+aGgKBQa/VriPJA8zuVlgCOSTwna1CgYl05lf6o5els4dtuyk1qJxQ==} + /@esbuild/darwin-arm64/0.16.17: + resolution: {integrity: sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] requiresBuild: true optional: true - /@esbuild/darwin-x64/0.16.12: - resolution: {integrity: sha512-ApGRA6X5txIcxV0095X4e4KKv87HAEXfuDRcGTniDWUUN+qPia8sl/BqG/0IomytQWajnUn4C7TOwHduk/FXBQ==} + /@esbuild/darwin-x64/0.16.17: + resolution: {integrity: sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==} engines: {node: '>=12'} cpu: [x64] os: [darwin] requiresBuild: true optional: true - /@esbuild/freebsd-arm64/0.16.12: - resolution: {integrity: sha512-AMdK2gA9EU83ccXCWS1B/KcWYZCj4P3vDofZZkl/F/sBv/fphi2oUqUTox/g5GMcIxk8CF1CVYTC82+iBSyiUg==} + /@esbuild/freebsd-arm64/0.16.17: + resolution: {integrity: sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] requiresBuild: true optional: true - /@esbuild/freebsd-x64/0.16.12: - resolution: {integrity: sha512-KUKB9w8G/xaAbD39t6gnRBuhQ8vIYYlxGT2I+mT6UGRnCGRr1+ePFIGBQmf5V16nxylgUuuWVW1zU2ktKkf6WQ==} + /@esbuild/freebsd-x64/0.16.17: + resolution: {integrity: sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] requiresBuild: true optional: true - /@esbuild/linux-arm/0.16.12: - resolution: {integrity: sha512-vhDdIv6z4eL0FJyNVfdr3C/vdd/Wc6h1683GJsFoJzfKb92dU/v88FhWdigg0i6+3TsbSDeWbsPUXb4dif2abg==} + /@esbuild/linux-arm/0.16.17: + resolution: {integrity: sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==} engines: {node: '>=12'} cpu: [arm] os: [linux] requiresBuild: true optional: true - /@esbuild/linux-arm64/0.16.12: - resolution: {integrity: sha512-29HXMLpLklDfmw7T2buGqq3HImSUaZ1ArmrPOMaNiZZQptOSZs32SQtOHEl8xWX5vfdwZqrBfNf8Te4nArVzKQ==} + /@esbuild/linux-arm64/0.16.17: + resolution: {integrity: sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==} engines: {node: '>=12'} cpu: [arm64] os: [linux] requiresBuild: true optional: true - /@esbuild/linux-ia32/0.16.12: - resolution: {integrity: sha512-JFDuNDTTfgD1LJg7wHA42o2uAO/9VzHYK0leAVnCQE/FdMB599YMH73ux+nS0xGr79pv/BK+hrmdRin3iLgQjg==} + /@esbuild/linux-ia32/0.16.17: + resolution: {integrity: sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -1061,104 +1042,104 @@ packages: dev: false optional: true - /@esbuild/linux-loong64/0.16.12: - resolution: {integrity: sha512-xTGzVPqm6WKfCC0iuj1fryIWr1NWEM8DMhAIo+4rFgUtwy/lfHl+Obvus4oddzRDbBetLLmojfVZGmt/g/g+Rw==} + /@esbuild/linux-loong64/0.16.17: + resolution: {integrity: sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==} engines: {node: '>=12'} cpu: [loong64] os: [linux] requiresBuild: true optional: true - /@esbuild/linux-mips64el/0.16.12: - resolution: {integrity: sha512-zI1cNgHa3Gol+vPYjIYHzKhU6qMyOQrvZ82REr5Fv7rlh5PG6SkkuCoH7IryPqR+BK2c/7oISGsvPJPGnO2bHQ==} + /@esbuild/linux-mips64el/0.16.17: + resolution: {integrity: sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] requiresBuild: true optional: true - /@esbuild/linux-ppc64/0.16.12: - resolution: {integrity: sha512-/C8OFXExoMmvTDIOAM54AhtmmuDHKoedUd0Otpfw3+AuuVGemA1nQK99oN909uZbLEU6Bi+7JheFMG3xGfZluQ==} + /@esbuild/linux-ppc64/0.16.17: + resolution: {integrity: sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] requiresBuild: true optional: true - /@esbuild/linux-riscv64/0.16.12: - resolution: {integrity: sha512-qeouyyc8kAGV6Ni6Isz8hUsKMr00EHgVwUKWNp1r4l88fHEoNTDB8mmestvykW6MrstoGI7g2EAsgr0nxmuGYg==} + /@esbuild/linux-riscv64/0.16.17: + resolution: {integrity: sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] requiresBuild: true optional: true - /@esbuild/linux-s390x/0.16.12: - resolution: {integrity: sha512-s9AyI/5vz1U4NNqnacEGFElqwnHusWa81pskAf8JNDM2eb6b2E6PpBmT8RzeZv6/TxE6/TADn2g9bb0jOUmXwQ==} + /@esbuild/linux-s390x/0.16.17: + resolution: {integrity: sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==} engines: {node: '>=12'} cpu: [s390x] os: [linux] requiresBuild: true optional: true - /@esbuild/linux-x64/0.16.12: - resolution: {integrity: sha512-e8YA7GQGLWhvakBecLptUiKxOk4E/EPtSckS1i0MGYctW8ouvNUoh7xnU15PGO2jz7BYl8q1R6g0gE5HFtzpqQ==} + /@esbuild/linux-x64/0.16.17: + resolution: {integrity: sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==} engines: {node: '>=12'} cpu: [x64] os: [linux] requiresBuild: true optional: true - /@esbuild/netbsd-x64/0.16.12: - resolution: {integrity: sha512-z2+kUxmOqBS+6SRVd57iOLIHE8oGOoEnGVAmwjm2aENSP35HPS+5cK+FL1l+rhrsJOFIPrNHqDUNechpuG96Sg==} + /@esbuild/netbsd-x64/0.16.17: + resolution: {integrity: sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] requiresBuild: true optional: true - /@esbuild/openbsd-x64/0.16.12: - resolution: {integrity: sha512-PAonw4LqIybwn2/vJujhbg1N9W2W8lw9RtXIvvZoyzoA/4rA4CpiuahVbASmQohiytRsixbNoIOUSjRygKXpyA==} + /@esbuild/openbsd-x64/0.16.17: + resolution: {integrity: sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] requiresBuild: true optional: true - /@esbuild/sunos-x64/0.16.12: - resolution: {integrity: sha512-+wr1tkt1RERi+Zi/iQtkzmMH4nS8+7UIRxjcyRz7lur84wCkAITT50Olq/HiT4JN2X2bjtlOV6vt7ptW5Gw60Q==} + /@esbuild/sunos-x64/0.16.17: + resolution: {integrity: sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==} engines: {node: '>=12'} cpu: [x64] os: [sunos] requiresBuild: true optional: true - /@esbuild/win32-arm64/0.16.12: - resolution: {integrity: sha512-XEjeUSHmjsAOJk8+pXJu9pFY2O5KKQbHXZWQylJzQuIBeiGrpMeq9sTVrHefHxMOyxUgoKQTcaTS+VK/K5SviA==} + /@esbuild/win32-arm64/0.16.17: + resolution: {integrity: sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==} engines: {node: '>=12'} cpu: [arm64] os: [win32] requiresBuild: true optional: true - /@esbuild/win32-ia32/0.16.12: - resolution: {integrity: sha512-eRKPM7e0IecUAUYr2alW7JGDejrFJXmpjt4MlfonmQ5Rz9HWpKFGCjuuIRgKO7W9C/CWVFXdJ2GjddsBXqQI4A==} + /@esbuild/win32-ia32/0.16.17: + resolution: {integrity: sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==} engines: {node: '>=12'} cpu: [ia32] os: [win32] requiresBuild: true optional: true - /@esbuild/win32-x64/0.16.12: - resolution: {integrity: sha512-iPYKN78t3op2+erv2frW568j1q0RpqX6JOLZ7oPPaAV1VaF7dDstOrNw37PVOYoTWE11pV4A1XUitpdEFNIsPg==} + /@esbuild/win32-x64/0.16.17: + resolution: {integrity: sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==} engines: {node: '>=12'} cpu: [x64] os: [win32] requiresBuild: true optional: true - /@eslint/eslintrc/1.4.0: - resolution: {integrity: sha512-7yfvXy6MWLgWSFsLhz5yH3iQ52St8cdUY6FoGieKkRDVxuxmrNuUetIuu6cmjNWwniUHiWXjxCr5tTXDrbYS5A==} + /@eslint/eslintrc/1.4.1: + resolution: {integrity: sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 @@ -1174,6 +1155,68 @@ packages: - supports-color dev: true + /@fastify/accept-negotiator/1.1.0: + resolution: {integrity: sha512-OIHZrb2ImZ7XG85HXOONLcJWGosv7sIvM2ifAPQVhg9Lv7qdmMBNVaai4QTdyuaqbKM5eO6sLSQOYI7wEQeCJQ==} + engines: {node: '>=14'} + dev: false + + /@fastify/ajv-compiler/3.5.0: + resolution: {integrity: sha512-ebbEtlI7dxXF5ziNdr05mOY8NnDiPB1XvAlLHctRt/Rc+C3LCOVW5imUVX+mhvUhnNzmPBHewUkOFgGlCxgdAA==} + dependencies: + ajv: 8.11.2 + ajv-formats: 2.1.1 + fast-uri: 2.2.0 + dev: false + + /@fastify/deepmerge/1.3.0: + resolution: {integrity: sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==} + dev: false + + /@fastify/error/3.2.0: + resolution: {integrity: sha512-KAfcLa+CnknwVi5fWogrLXgidLic+GXnLjijXdpl8pvkvbXU5BGa37iZO9FGvsh9ZL4y+oFi5cbHBm5UOG+dmQ==} + dev: false + + /@fastify/fast-json-stringify-compiler/4.2.0: + resolution: {integrity: sha512-ypZynRvXA3dibfPykQN3RB5wBdEUgSGgny8Qc6k163wYPLD4mEGEDkACp+00YmqkGvIm8D/xYoHajwyEdWD/eg==} + dependencies: + fast-json-stringify: 5.5.0 + dev: false + + /@fastify/send/1.0.0: + resolution: {integrity: sha512-jnj8ONIXiOLv4kPn5O7T4oSD5+ymhOg4dKHW3rnYkB/1PJ1942UH1/trvMUIr+fn1dJ20oatpWycZDkPiLcWfg==} + engines: {node: '>= 0.8.0'} + dependencies: + debug: 4.3.4 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@fastify/static/6.6.1: + resolution: {integrity: sha512-sylhlmhclqwkyZy/SD5wzd4yjmMuqW8cRmfnuPXPhftZuEwJ8G2apm0kECQRnHJnk+W3Ksx2fpIHHcthzxNRTA==} + dependencies: + '@fastify/accept-negotiator': 1.1.0 + '@fastify/send': 1.0.0 + content-disposition: 0.5.4 + fastify-plugin: 4.5.0 + glob: 8.0.3 + p-limit: 3.1.0 + readable-stream: 4.3.0 + transitivePeerDependencies: + - supports-color + dev: false + /@gar/promisify/1.1.3: resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} dev: true @@ -1462,151 +1505,158 @@ packages: resolution: {integrity: sha512-ygCGP7vFpqS02hpZwEe1uz8cfImWX06+zRs08J+tCZRKb6k+easIaIHFtY9ZSxt7j9L/gAPLDo/5RmOT6z0DPQ==} dev: false - /@mdit/plugin-align/0.1.0: - resolution: {integrity: sha512-zSWWRgeufXCfIMfNRCl3vWHGCPtr8USBOYnApTYVa1WURbTi9pyUx9BESDEVF2urYo3RppeSuZ8/wXg4P5mJfA==} + /@mdit/plugin-align/0.2.3: + resolution: {integrity: sha512-TR4bR8qIg7tYSa62XspVzJKfUCCBJBiwTIAfKWtmeQALtDBClCZa26bL2EJnmdY5EdQVzU9sTHXWcR/p3AnVaw==} engines: {node: '>= 14'} dependencies: - '@mdit/plugin-container': 0.1.0 + '@mdit/plugin-container': 0.2.3 '@types/markdown-it': 12.2.3 markdown-it: 13.0.1 dev: false - /@mdit/plugin-attrs/0.1.0: - resolution: {integrity: sha512-3kKuKofMJY7hPPU+65612Ni6rHIRUcbwKHSDKzuErSoC+jtsaf3anlFI3O8EoKrNEpYbmnHoDgR4jG6d3ZJSxw==} + /@mdit/plugin-attrs/0.2.3: + resolution: {integrity: sha512-iTqwXOAscDXL20Lt4do3wI6+MQz/iqvSqETpR57M20yl2L/rM02RdVex5BWbxdhqFtDylh+/qtI4X2H6JFv/OQ==} engines: {node: '>= 14'} dependencies: '@types/markdown-it': 12.2.3 markdown-it: 13.0.1 dev: false - /@mdit/plugin-container/0.1.0: - resolution: {integrity: sha512-YpSiQGWsfRGciYaLP1TR75PS7wdPSL/OEcMYskO0LUAgGKQ9oNjonpxJ5DvBfwnw3yWYgymdoLBiciWNeE3m5Q==} + /@mdit/plugin-container/0.2.3: + resolution: {integrity: sha512-psgaYyBX6Pq56R5S+NOIWhk8nz73LBaoputKq2NjQadIUgYlN7CmwOJeUjyg4ZK0wwBg1HzFFD5JaJ+C2jVssA==} engines: {node: '>= 14'} dependencies: '@types/markdown-it': 12.2.3 markdown-it: 13.0.1 dev: false - /@mdit/plugin-figure/0.1.0: - resolution: {integrity: sha512-57Nd3LvscdvVjt7b4YAr2D/gLfQ2DaSpH2lAnFYaprQfQhSNSVjOIxKjrkGoYXSSharvwbhy2UXGNtN5A6ShhA==} + /@mdit/plugin-figure/0.2.3: + resolution: {integrity: sha512-d1KMMkQq9+0SxVMssnm28KDm1JVxozA8lh9fecKRlMnvN7B7NCnLbQZEe/l8Tj2yesOEgzSGL98+gfu/wdJimA==} engines: {node: '>= 14'} dependencies: '@types/markdown-it': 12.2.3 markdown-it: 13.0.1 dev: false - /@mdit/plugin-footnote/0.1.0: - resolution: {integrity: sha512-pLeEmc0/JM20P2Encf0uFDtH4UDcdginViS/6jRwHsxbBzHbb30ISl22Iw8oLAs1T068m01iZFPQOwt1dXJ1zQ==} + /@mdit/plugin-footnote/0.2.3: + resolution: {integrity: sha512-LiSxbIu5PJTEj+qUcULQViLvyLyDjmnyM/iRdN4Y2biZ2Is/iVsHfhrrOFoqfTIRUqMwZwvbNJdyFPNheTCQfg==} engines: {node: '>= 14'} dependencies: '@types/markdown-it': 12.2.3 markdown-it: 13.0.1 dev: false - /@mdit/plugin-img-lazyload/0.1.0: - resolution: {integrity: sha512-RVky+MMtand7nfzv/oYakLDOCCCUIRQeJMBLQjIO0rpj/th+RyEHRbsGvojB513PdsXOw2wiSsqlTAQP3EP4wA==} + /@mdit/plugin-img-lazyload/0.2.3: + resolution: {integrity: sha512-LQJ+mEDiRVyyUYIv4V5NXb3H8Mxp58OLEGJAyM5GV30ZnlsNQV/eyqLvrkaI/zzr0AULaI4RnwtZrUthsxmQZA==} engines: {node: '>= 14'} dependencies: '@types/markdown-it': 12.2.3 markdown-it: 13.0.1 dev: false - /@mdit/plugin-img-mark/0.1.0: - resolution: {integrity: sha512-FNjZLFHXXoIut9lk/Zi3V5a6nJpAexQMhWCI4IwXes1xDrpEIrCo+mF1zpA9vj/F1SxUwYYldbRzPDdbo76qxg==} + /@mdit/plugin-img-mark/0.2.3: + resolution: {integrity: sha512-bQyCeF1DH06MTb+bpjja5As/mkDMShoEWaZ2inc9knphkLA3EHYuHo+DU72RlhXvYv9AaUmlFl870Wu5OeNvZw==} engines: {node: '>= 14'} dependencies: '@types/markdown-it': 12.2.3 markdown-it: 13.0.1 dev: false - /@mdit/plugin-img-size/0.1.0: - resolution: {integrity: sha512-QA1xCiCp1u+RpJLU/dFQUWlSsWr1/a03tqvcGya/Xr0Xn+8eY4qX9E1v8jCMJ2DzrxG+3g1eUj6jQfhLq0aTxw==} + /@mdit/plugin-img-size/0.2.3: + resolution: {integrity: sha512-oIBWHMIqlMRp4ns/AQC9DwluV2x/aG+vnu1QhIBaUeuLcwZKp4IdmdDDMTqzASpvMpwqe+wRt4aVnyOmOzRF+w==} engines: {node: '>= 14'} dependencies: '@types/markdown-it': 12.2.3 markdown-it: 13.0.1 dev: false - /@mdit/plugin-include/0.1.0: - resolution: {integrity: sha512-HyLSAarXlvoCVsh72I1MbgjQ6Od+x9KMnXDwuYzyshbA5L0G/yuYjDGc272Oy2Isdl4FmT/eFDlaIkfe3s7mWw==} + /@mdit/plugin-include/0.2.3: + resolution: {integrity: sha512-ZCNKi5w+FYkwXXoaFyRqfohBz1uxkwCOWjuF8iHtI8PCXJrquoQz4ynXpLCtMXkg2ohgrcHcQriTOwoGM7xusA==} dependencies: '@types/markdown-it': 12.2.3 markdown-it: 13.0.1 upath: 2.0.1 dev: false - /@mdit/plugin-katex/0.1.0: - resolution: {integrity: sha512-TNSAdUbNgAcc3VVtC6dV/ahmWmziagN2Hs0KdmFVWu3BLhY7NxcbAIIi2Zm3VehKDyxCL/PH66thqan8xM7wEA==} + /@mdit/plugin-katex/0.2.3: + resolution: {integrity: sha512-BBeLtivXoGsxHLXqM6h0G661E3amnFBqGX3OuUO3pgVL/IU+yVkn1tFu6D0eFZkyN4juHHrqa1RP2MLQSlziug==} engines: {node: '>= 14'} dependencies: - '@mdit/plugin-tex': 0.1.0 + '@mdit/plugin-tex': 0.2.3 '@types/katex': 0.16.0 '@types/markdown-it': 12.2.3 katex: 0.16.4 markdown-it: 13.0.1 dev: false - /@mdit/plugin-mark/0.1.0: - resolution: {integrity: sha512-qL9J9hl1gyBI4kByZ4ReDYCJN++HRfXL6fuPDM6oBvUHR496GbrUVnKQI9jSe9ZD0uRhGUIXS1xtbDG1AqdrXA==} + /@mdit/plugin-mark/0.2.3: + resolution: {integrity: sha512-ppGqi3hCV0yeswAK8K4mmTXrzLU/skBjzDQx8q02Ixt7ppE+T8Sh6A9Pir7pPDqhDTE5MHKWxl//KlUfyPQPMw==} engines: {node: '>= 14'} dependencies: '@types/markdown-it': 12.2.3 markdown-it: 13.0.1 dev: false - /@mdit/plugin-mathjax/0.1.0: - resolution: {integrity: sha512-dClH14tH894fhwy55KgzwfiuN7iI9CkZiaNBXoSZCTDtO8FllvsJdZIO5Dr/0y778YQn46D6hPnLTJ0TA/kRUg==} + /@mdit/plugin-mathjax/0.2.3: + resolution: {integrity: sha512-8P5SqRQuyEQ2JBzIGG+Cl93eZU0rx+i1asELRDnz7t1NCTyIkyLCA57utZx5kC3UcuBo7Nog4N2L04zKup2AxQ==} engines: {node: '>= 14'} dependencies: - '@mdit/plugin-tex': 0.1.0 + '@mdit/plugin-tex': 0.2.3 '@types/markdown-it': 12.2.3 markdown-it: 13.0.1 mathjax-full: 3.2.2 upath: 2.0.1 dev: false - /@mdit/plugin-stylize/0.1.0: - resolution: {integrity: sha512-Z44GBVGhnV4Z+FLqYnGC+HFWivg4IEJQiFndcZp9BEJjHsp+BVwk7TgekK+MLam45W3HcKYRgqe8L+G5YYLwcw==} + /@mdit/plugin-stylize/0.2.3: + resolution: {integrity: sha512-EeRLwmEDwxB7NaF91OAqIJ5uUKHoPyZie4zFLbA3gKwqVXa6OC1XG1k3S8w9GuRnep/K7+e/5gPGFM68tI7v8g==} engines: {node: '>= 14'} dependencies: '@types/markdown-it': 12.2.3 markdown-it: 13.0.1 dev: false - /@mdit/plugin-sub/0.1.0: - resolution: {integrity: sha512-MOBMaUeUxwrtOF6vo0u2ET83+epWdethX2/jfHkM+esKtEUuH80mRQ7MzfCu/F4PT0uMG1kmsc0EpmBzPNaYew==} + /@mdit/plugin-sub/0.2.3: + resolution: {integrity: sha512-eWCOxASIU/Y1efzhJkb1y0XWa0yGVdtYm4SKfUd73rF4dNEYIYJiNKkQfefrGtMuQdeM7iBqBZfYtcq/nipkzg==} engines: {node: '>= 14'} dependencies: '@types/markdown-it': 12.2.3 markdown-it: 13.0.1 dev: false - /@mdit/plugin-sup/0.1.0: - resolution: {integrity: sha512-eUoUdAwKvW9H0uic2FiPBBZ5Bua3SkJHl/MiXVZGoJcJfvoNk3zKuIUNZyU+L7yHg8Rf5Xs1zrmLuZQtdRY9YQ==} + /@mdit/plugin-sup/0.2.3: + resolution: {integrity: sha512-gqOOQo6lE2e8SFHpXhKCKiFGoVIO1JUDA97Ol5iIFZtXJ4lbObWKxtYa63KH+kOVwDUUGSojQ6s8+oGMxmtIDA==} engines: {node: '>= 14'} dependencies: '@types/markdown-it': 12.2.3 markdown-it: 13.0.1 dev: false - /@mdit/plugin-tasklist/0.1.0: - resolution: {integrity: sha512-fnNKpVLCDe4UHZfG2zq6DVBt6U3Tyx6trKGglt7NVqC9i3Wik/DRG+l1I+hIrr7Dh5nM2hLN4JsqB0bxybRxew==} + /@mdit/plugin-tab/0.2.3: + resolution: {integrity: sha512-J0LkcQ2Kb2fm+8Gnd1Ke8rKfJXMQPqwx3ZDa2AtLCcBEf5hWAKbLoc/cWjDVXiHjsdOklIs5AtCyNUkR5YbyOA==} + dependencies: + '@types/markdown-it': 12.2.3 + markdown-it: 13.0.1 + dev: false + + /@mdit/plugin-tasklist/0.2.3: + resolution: {integrity: sha512-szYn7pyaozAPhilrNeC5PNLR+Rm9qlPvRQsxMK88Sa4seSdDhQnPkDb+407QYtYdYpyrn0ZKCvnmuXc9CLlhmQ==} engines: {node: '>= 14'} dependencies: '@types/markdown-it': 12.2.3 markdown-it: 13.0.1 dev: false - /@mdit/plugin-tex/0.1.0: - resolution: {integrity: sha512-wcYKqSwtLmN6ZFY4QySsZ6niMNyWTWDz0UFf2HJ8gQyJfYVsG4IddxQbI+e7cshWaaw6gYLW8MkSeNpr1b1HCg==} + /@mdit/plugin-tex/0.2.3: + resolution: {integrity: sha512-sD7dILLqwdPA3B89W5Ezj2vMjrYZKBFICLvPmp49crdAW51tcLUtjKK5nF86fUY7VULlsDG9h5+lQV9wc/HNYA==} engines: {node: '>= 14'} dependencies: '@types/markdown-it': 12.2.3 markdown-it: 13.0.1 dev: false - /@mdit/plugin-uml/0.1.0: - resolution: {integrity: sha512-i8Axd91uhspuXTxvF6k8LNNS4r/6LpK6psYC0uBycjf1VV71WUJ8DCJGlF21aGQqUcVCSomprJXQjfg78mj8Sg==} + /@mdit/plugin-uml/0.2.3: + resolution: {integrity: sha512-bLo1R4f6xaXtToLLP4+7+x/i9p815NnuS+l63RkhE2juEagQYKaB2Ytw/91K0/sprWrrvOL3ESRlgFK14MAmHQ==} engines: {node: '>= 14'} dependencies: '@types/markdown-it': 12.2.3 @@ -1620,7 +1670,7 @@ packages: cytoscape: 3.23.0 cytoscape-cose-bilkent: 4.1.0_cytoscape@3.23.0 cytoscape-fcose: 2.1.0_cytoscape@3.23.0 - d3: 7.6.1 + d3: 7.8.0 khroma: 2.0.0 non-layered-tidy-tree-layout: 2.0.2 dev: false @@ -1637,20 +1687,20 @@ packages: resolution: {integrity: sha512-4wMPu9iN3/HL97QblBsBay3E1etIciR84izI3U+4iALY+JHCrI+a2jO0qbAZ/nxKoegypYEaiiqWXylm+/zfrw==} dev: false - /@netlify/build/29.3.0_@types+node@18.11.18: - resolution: {integrity: sha512-ukQlZNOYPnnhfcDWBaX5i5FLN5dUENyPgS/ng2E/g5jW0kuVWf83Fz608nOmO9MACzujDDj87rq1GTdX7ym6tA==} + /@netlify/build/29.4.5_@types+node@18.11.18: + resolution: {integrity: sha512-nPMVSBsJ62tO91TvD8UjsKyp8dPLxEH3mAI2I5FHztYBT8d43ISAtAc2FYaSVpm0ZMoUyRDGx+kQmOHfZAWOPQ==} engines: {node: ^14.16.0 || >=16.0.0} hasBin: true dependencies: '@bugsnag/js': 7.17.0 '@netlify/cache-utils': 5.1.0_supports-color@9.2.2 - '@netlify/config': 20.2.0 - '@netlify/edge-bundler': 8.0.0 - '@netlify/functions-utils': 5.1.1_supports-color@9.2.2 + '@netlify/config': 20.3.0 + '@netlify/edge-bundler': 8.1.2 + '@netlify/functions-utils': 5.1.4_supports-color@9.2.2 '@netlify/git-utils': 5.1.0 '@netlify/plugins-list': 6.61.0 '@netlify/run-utils': 5.1.0 - '@netlify/zip-it-and-ship-it': 8.2.0_supports-color@9.2.2 + '@netlify/zip-it-and-ship-it': 8.4.0_supports-color@9.2.2 '@sindresorhus/slugify': 2.1.0 ansi-escapes: 5.0.0 chalk: 5.2.0 @@ -1659,6 +1709,7 @@ packages: figures: 4.0.1 filter-obj: 3.0.0 got: 10.7.0 + hot-shots: 9.3.0 indent-string: 5.0.0 is-plain-obj: 4.1.0 js-yaml: 4.1.0 @@ -1684,7 +1735,6 @@ packages: rfdc: 1.3.0 safe-json-stringify: 1.2.0 semver: 7.3.8 - statsd-client: 0.4.7 string-width: 5.1.2 strip-ansi: 7.0.1 supports-color: 9.2.2 @@ -1719,8 +1769,8 @@ packages: - supports-color dev: false - /@netlify/config/20.2.0: - resolution: {integrity: sha512-G8VnQ7JZPP07+Pii10JIHLDCqwDIyfc0Jf6WRKK/LnSmtZzsx5Q0kEBxcJ8pYoyA5kGoGfT3bczbTr9FDCMKrw==} + /@netlify/config/20.3.0: + resolution: {integrity: sha512-XZJuvxcvYEq6ozZOpNs95HQO9cJ9/FBeWHyw+Fc8+EF5iPc4krjhAm7AqxmxKvqjVe02fxWTz0Vc8gjbbZIMeg==} engines: {node: ^14.16.0 || >=16.0.0} hasBin: true dependencies: @@ -1750,8 +1800,8 @@ packages: yargs: 17.6.2 dev: false - /@netlify/edge-bundler/8.0.0: - resolution: {integrity: sha512-th0HKJ0oqsSVq+kyElP2e1goVZtElz+1b0dK+ddRj6BYAZfGjskoiN1LZo58QPHtZ8Vim3EYQwhDCaLddqGIQw==} + /@netlify/edge-bundler/8.1.2: + resolution: {integrity: sha512-ODaWypy/vIEm8bDAUIT9P4x4EeK6M+P0/M+D4aHuxenrCBk1v37fIiz251jVnte8z2Obqrb+PG4et98oX+gOPw==} engines: {node: ^14.16.0 || >=16.0.0} dependencies: '@import-maps/resolve': 1.0.1 @@ -2002,11 +2052,11 @@ packages: url: 0.11.0 dev: false - /@netlify/functions-utils/5.1.1_supports-color@9.2.2: - resolution: {integrity: sha512-e++/c7r1lM1CBQwBHXrELaLl06gtvvmlSmSNkzafsYgPGkLwPk7yaUOkjqnhi9xiDZAJiohm0ItglCR8YjP5Rw==} + /@netlify/functions-utils/5.1.4_supports-color@9.2.2: + resolution: {integrity: sha512-iRg0wXWB/SUhirW20FZ0COP6WkoXfCcPKZb2AUKzkeduUE4WF1zUeX7gw/SYXFU9OkMHehD9NN5y7csp2oNUNg==} engines: {node: ^14.16.0 || >=16.0.0} dependencies: - '@netlify/zip-it-and-ship-it': 8.2.0_supports-color@9.2.2 + '@netlify/zip-it-and-ship-it': 8.4.0_supports-color@9.2.2 cpy: 8.1.2_supports-color@9.2.2 path-exists: 5.0.0 transitivePeerDependencies: @@ -2014,8 +2064,8 @@ packages: - supports-color dev: false - /@netlify/functions/1.3.0: - resolution: {integrity: sha512-hN/Fgpz8XIOBfsBPLYUMxVKBlCopgeqGB0popayicnmkFLnvKByTTMYgF01wcF9DBtBQdV0H2h1kPFpMl34I8w==} + /@netlify/functions/1.4.0: + resolution: {integrity: sha512-gy7ULTIRroc2/jyFVGx1djCmmBMVisIwrvkqggq5B6iDcInRSy2Tpkm+V5C63hKJVkNRskKWtLQKm9ecCaQTjA==} engines: {node: '>=8.3.0'} dependencies: is-promise: 4.0.0 @@ -2214,8 +2264,8 @@ packages: - supports-color dev: false - /@netlify/zip-it-and-ship-it/8.2.0_supports-color@9.2.2: - resolution: {integrity: sha512-gaq+SnQB/VNCLPT1HfYbW1XmCRPG21d3ecOTyOf8ikDsGoypI4VaGVzjINVo8mu0uQWtRY+wWHcYeiQdN54GuQ==} + /@netlify/zip-it-and-ship-it/8.4.0_supports-color@9.2.2: + resolution: {integrity: sha512-5ctiK9p7+VgE89ZeYD9cMCU53IQNv+Bj0K9O9gkQBD40HIuJgFIU0Pb8LOh+eGbefICUC/wD73l7WgjN1Eu2RQ==} engines: {node: ^14.16.0 || >=16.0.0} hasBin: true dependencies: @@ -2752,10 +2802,6 @@ packages: '@types/istanbul-lib-report': 3.0.0 dev: false - /@types/json-buffer/3.0.0: - resolution: {integrity: sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ==} - dev: false - /@types/json-schema/7.0.11: resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} @@ -2827,10 +2873,6 @@ packages: form-data: 3.0.1 dev: false - /@types/node/14.18.36: - resolution: {integrity: sha512-FXKWbsJ6a1hIrRxv+FoukuHnGTgEzKYGi7kilfMae96AL9UNkPFNWJEEYWzdRI9ooIkbr4AKldyuSTLql06vLQ==} - dev: true - /@types/node/17.0.45: resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} dev: false @@ -2843,6 +2885,7 @@ packages: /@types/parse-json/4.0.0: resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} + dev: false /@types/qs/6.9.7: resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} @@ -2940,7 +2983,15 @@ packages: '@types/yargs-parser': 21.0.0 dev: false - /@typescript-eslint/eslint-plugin/5.47.1_txmweb6yn7coi7nfrp22gpyqmy: + /@types/yauzl/2.10.0: + resolution: {integrity: sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==} + requiresBuild: true + dependencies: + '@types/node': 18.11.18 + dev: false + optional: true + + /@typescript-eslint/eslint-plugin/5.47.1_lxxchmivucqcmhzvhnmnywabcq: resolution: {integrity: sha512-r4RZ2Jl9kcQN7K/dcOT+J7NAimbiis4sSM9spvWimsBvDegMhKLA5vri2jG19PmIPbDjPeWzfUPQ2hjEzA4Nmg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -2951,12 +3002,12 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.47.1_lzzuuodtsqwxnvqeq4g4likcqa + '@typescript-eslint/parser': 5.47.1_7uibuqfxkfaozanbtbziikiqje '@typescript-eslint/scope-manager': 5.47.1 - '@typescript-eslint/type-utils': 5.47.1_lzzuuodtsqwxnvqeq4g4likcqa - '@typescript-eslint/utils': 5.47.1_lzzuuodtsqwxnvqeq4g4likcqa + '@typescript-eslint/type-utils': 5.47.1_7uibuqfxkfaozanbtbziikiqje + '@typescript-eslint/utils': 5.47.1_7uibuqfxkfaozanbtbziikiqje debug: 4.3.4 - eslint: 8.30.0 + eslint: 8.32.0 ignore: 5.2.4 natural-compare-lite: 1.4.0 regexpp: 3.2.0 @@ -2967,7 +3018,7 @@ packages: - supports-color dev: true - /@typescript-eslint/parser/5.47.1_lzzuuodtsqwxnvqeq4g4likcqa: + /@typescript-eslint/parser/5.47.1_7uibuqfxkfaozanbtbziikiqje: resolution: {integrity: sha512-9Vb+KIv29r6GPu4EboWOnQM7T+UjpjXvjCPhNORlgm40a9Ia9bvaPJswvtae1gip2QEeVeGh6YquqAzEgoRAlw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -2981,7 +3032,7 @@ packages: '@typescript-eslint/types': 5.47.1 '@typescript-eslint/typescript-estree': 5.47.1_typescript@4.9.4 debug: 4.3.4 - eslint: 8.30.0 + eslint: 8.32.0 typescript: 4.9.4 transitivePeerDependencies: - supports-color @@ -2995,7 +3046,7 @@ packages: '@typescript-eslint/visitor-keys': 5.47.1 dev: true - /@typescript-eslint/type-utils/5.47.1_lzzuuodtsqwxnvqeq4g4likcqa: + /@typescript-eslint/type-utils/5.47.1_7uibuqfxkfaozanbtbziikiqje: resolution: {integrity: sha512-/UKOeo8ee80A7/GJA427oIrBi/Gd4osk/3auBUg4Rn9EahFpevVV1mUK8hjyQD5lHPqX397x6CwOk5WGh1E/1w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3006,9 +3057,9 @@ packages: optional: true dependencies: '@typescript-eslint/typescript-estree': 5.47.1_typescript@4.9.4 - '@typescript-eslint/utils': 5.47.1_lzzuuodtsqwxnvqeq4g4likcqa + '@typescript-eslint/utils': 5.47.1_7uibuqfxkfaozanbtbziikiqje debug: 4.3.4 - eslint: 8.30.0 + eslint: 8.32.0 tsutils: 3.21.0_typescript@4.9.4 typescript: 4.9.4 transitivePeerDependencies: @@ -3060,7 +3111,7 @@ packages: - supports-color dev: false - /@typescript-eslint/utils/5.47.1_lzzuuodtsqwxnvqeq4g4likcqa: + /@typescript-eslint/utils/5.47.1_7uibuqfxkfaozanbtbziikiqje: resolution: {integrity: sha512-l90SdwqfmkuIVaREZ2ykEfCezepCLxzWMo5gVfcJsJCaT4jHT+QjgSkYhs5BMQmWqE9k3AtIfk4g211z/sTMVw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -3071,9 +3122,9 @@ packages: '@typescript-eslint/scope-manager': 5.47.1 '@typescript-eslint/types': 5.47.1 '@typescript-eslint/typescript-estree': 5.47.1_typescript@4.9.4 - eslint: 8.30.0 + eslint: 8.32.0 eslint-scope: 5.1.1 - eslint-utils: 3.0.0_eslint@8.30.0 + eslint-utils: 3.0.0_eslint@8.32.0 semver: 7.3.8 transitivePeerDependencies: - supports-color @@ -3127,14 +3178,14 @@ packages: - supports-color dev: false - /@vitejs/plugin-vue/4.0.0_vite@4.0.3+vue@3.2.45: + /@vitejs/plugin-vue/4.0.0_vite@4.0.4+vue@3.2.45: resolution: {integrity: sha512-e0X4jErIxAB5oLtDqbHvHpJe/uWNkdpYV83AOG2xo2tEVSzCzewgJMtREZM30wXnM5ls90hxiOtAuVU6H5JgbA==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: vite: ^4.0.0 vue: ^3.2.25 dependencies: - vite: 4.0.3_sass@1.57.1 + vite: 4.0.4_sass@1.57.1 vue: 3.2.45 dev: false @@ -3236,7 +3287,7 @@ packages: /@vuepress/bundler-vite/2.0.0-beta.60_sass@1.57.1: resolution: {integrity: sha512-nf+UAKNlAEZXZqu2Ztvr8Hg/5CtevWxvQGfYKV4lhw8UmoDjKKHoHPpPhF1QTUbnZ8W+jPLzIVz+hjunzsxl/A==} dependencies: - '@vitejs/plugin-vue': 4.0.0_vite@4.0.3+vue@3.2.45 + '@vitejs/plugin-vue': 4.0.0_vite@4.0.4+vue@3.2.45 '@vuepress/client': 2.0.0-beta.60 '@vuepress/core': 2.0.0-beta.60 '@vuepress/shared': 2.0.0-beta.60 @@ -3246,7 +3297,7 @@ packages: postcss: 8.4.20 postcss-load-config: 4.0.1_postcss@8.4.20 rollup: 3.9.0 - vite: 4.0.3_sass@1.57.1 + vite: 4.0.4_sass@1.57.1 vue: 3.2.45 vue-router: 4.1.6_vue@3.2.45 transitivePeerDependencies: @@ -3310,7 +3361,7 @@ packages: cac: 6.7.14 chokidar: 3.5.3 envinfo: 7.8.1 - esbuild: 0.16.12 + esbuild: 0.16.17 transitivePeerDependencies: - supports-color dev: false @@ -3537,24 +3588,24 @@ packages: - supports-color dev: false - /@vueuse/core/9.9.0_vue@3.2.45: - resolution: {integrity: sha512-JdDb7TrE0imZnwBhMF4+0PCJqGD3AxzH8S2sfk54P0rqvklK+EAtAR/mPb1HwV/JPujQFQJhghQ190Yq03YpVw==} + /@vueuse/core/9.10.0_vue@3.2.45: + resolution: {integrity: sha512-CxMewME07qeuzuT/AOIQGv0EhhDoojniqU6pC3F8m5VC76L47UT18DcX88kWlP3I7d3qMJ4u/PD8iSRsy3bmNA==} dependencies: '@types/web-bluetooth': 0.0.16 - '@vueuse/metadata': 9.9.0 - '@vueuse/shared': 9.9.0_vue@3.2.45 + '@vueuse/metadata': 9.10.0 + '@vueuse/shared': 9.10.0_vue@3.2.45 vue-demi: 0.13.6_vue@3.2.45 transitivePeerDependencies: - '@vue/composition-api' - vue dev: false - /@vueuse/metadata/9.9.0: - resolution: {integrity: sha512-pgxsUJv/d7IjKpLeB6TthggEsaBwM3ffc5jPrr5TmxAm/fup0mGR5VTzrdA/PSx85tpb+CIvP92D+55qBNc8ag==} + /@vueuse/metadata/9.10.0: + resolution: {integrity: sha512-G5VZhgTCapzU9rv0Iq2HBrVOSGzOKb+OE668NxhXNcTjUjwYxULkEhAw70FtRLMZc+hxcFAzDZlKYA0xcwNMuw==} dev: false - /@vueuse/shared/9.9.0_vue@3.2.45: - resolution: {integrity: sha512-+D0XFwHG0T+uaIbCSlROBwm1wzs71B7n3KyDOxnvfEMMHDOzl09rYKwaE2AENmYwYPXfHPbSBRDD2gBVHbvTcg==} + /@vueuse/shared/9.10.0_vue@3.2.45: + resolution: {integrity: sha512-vakHJ2ZRklAzqmcVBL38RS7BxdBA4+5poG9NsSyqJxrt9kz0zX3P5CXMy0Hm6LFbZXUgvKdqAS3pUH1zX/5qTQ==} dependencies: vue-demi: 0.13.6_vue@3.2.45 transitivePeerDependencies: @@ -3562,11 +3613,11 @@ packages: - vue dev: false - /@waline/client/2.14.4: - resolution: {integrity: sha512-GaZ66drHHcHFD1gswhOQcv+FiiWzIjkzEfL9OW3bUTxi1EHQwXzLGd2QXKgtVocgiZxaxlGRMdaiOvls8Z32qg==} + /@waline/client/2.14.7: + resolution: {integrity: sha512-hTfh2AbWQCX/oS4Hgr0W9cf79pHYf7X6Km5AcBDAmOL6AI7a5kP9qo9y2mcEzdfn9LK06P5Uuk8HY8vxQbgcrA==} engines: {node: '>=14'} dependencies: - '@vueuse/core': 9.9.0_vue@3.2.45 + '@vueuse/core': 9.10.0_vue@3.2.45 autosize: 5.0.2 marked: 4.2.5 vue: 3.2.45 @@ -3752,6 +3803,17 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dev: true + /abort-controller/3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + dependencies: + event-target-shim: 5.0.1 + dev: false + + /abstract-logging/2.0.1: + resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} + dev: false + /accepts/1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} @@ -3945,11 +4007,6 @@ packages: hasBin: true dev: false - /ansi-regex/0.2.1: - resolution: {integrity: sha512-sGwIGMjhYdW26/IhwK2gkWWI8DRCVO6uj3hYgHT+zD+QL1pa37tM3ujhyfcJIYSbsxp7Gxhy7zrRW/1AHm4BmA==} - engines: {node: '>=0.10.0'} - dev: false - /ansi-regex/2.1.1: resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} engines: {node: '>=0.10.0'} @@ -3973,11 +4030,6 @@ packages: resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} engines: {node: '>=12'} - /ansi-styles/1.1.0: - resolution: {integrity: sha512-f2PKUkN5QngiSemowa6Mrk9MPCdtFiOSmibjZ+j1qhLGHHYsqZwmBMRF3IRMVXo8sybDqx2fJl2d/8OphBoWkA==} - engines: {node: '>=0.10.0'} - dev: false - /ansi-styles/2.2.1: resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} engines: {node: '>=0.10.0'} @@ -4089,6 +4141,10 @@ packages: zip-stream: 4.1.0 dev: false + /archy/1.0.0: + resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} + dev: false + /are-we-there-yet/2.0.0: resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} engines: {node: '>=10'} @@ -4263,6 +4319,11 @@ packages: hasBin: true dev: false + /atomic-sleep/1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + dev: false + /autoprefixer/10.4.13_postcss@8.4.20: resolution: {integrity: sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==} engines: {node: ^10 || ^12 || >=14} @@ -4286,6 +4347,16 @@ packages: resolution: {integrity: sha512-FPVt5ynkqUAA9gcMZnJHka1XfQgr1WNd/yRfIjmj5WGmjua+u5Hl9hn8M2nU5CNy2bEIcj1ZUwXq7IOHsfZG9w==} dev: false + /avvio/8.2.0: + resolution: {integrity: sha512-bbCQdg7bpEv6kGH41RO/3B2/GMMmJSo2iBK+X8AWN9mujtfUipMDfIjsgHCfpnKqoGEQrrmCDKSa5OQ19+fDmg==} + dependencies: + archy: 1.0.0 + debug: 4.3.4 + fastq: 1.14.0 + transitivePeerDependencies: + - supports-color + dev: false + /backoff/2.5.0: resolution: {integrity: sha512-wC5ihrnUXmR2douXmXLCe5O3zg3GKIyvRi/hi58a/XyRxVI+3/yM0PYueQOZXPXQ9pxBislYkw+sF9b7C/RuMA==} engines: {node: '>= 0.6'} @@ -4390,26 +4461,6 @@ packages: resolution: {integrity: sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==} dev: false - /body-parser/1.20.0: - resolution: {integrity: sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - dependencies: - bytes: 3.1.2 - content-type: 1.0.4 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.10.3 - raw-body: 2.5.1 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - dev: false - /body-parser/1.20.1: resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -4523,17 +4574,6 @@ packages: dependencies: fill-range: 7.0.1 - /browserslist/4.21.3: - resolution: {integrity: sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - dependencies: - caniuse-lite: 1.0.30001373 - electron-to-chromium: 1.4.210 - node-releases: 2.0.6 - update-browserslist-db: 1.0.5_browserslist@4.21.3 - dev: false - /browserslist/4.21.4: resolution: {integrity: sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -4679,7 +4719,7 @@ packages: engines: {node: '>=10'} dependencies: '@types/keyv': 3.1.4 - keyv: 4.3.3 + keyv: 4.5.2 dev: false /cacheable-lookup/7.0.0: @@ -4731,7 +4771,7 @@ packages: clone-response: 1.0.3 get-stream: 5.2.0 http-cache-semantics: 4.1.0 - keyv: 4.3.3 + keyv: 4.5.2 lowercase-keys: 2.0.0 normalize-url: 6.1.0 responselike: 2.0.1 @@ -4793,25 +4833,10 @@ packages: engines: {node: '>=14.16'} dev: false - /caniuse-lite/1.0.30001373: - resolution: {integrity: sha512-pJYArGHrPp3TUqQzFYRmP/lwJlj8RCbVe3Gd3eJQkAV8SAC6b19XS9BjMvRdvaS8RMkaTN8ZhoHP6S1y8zzwEQ==} - dev: false - /caniuse-lite/1.0.30001441: resolution: {integrity: sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg==} dev: false - /chalk/0.5.1: - resolution: {integrity: sha512-bIKA54hP8iZhyDT81TOsJiQvR1gW+ZYSXFaZUAvoD4wCHdbHY2actmpTE4x344ZlFqHbvoxKOaESULTZN2gstg==} - engines: {node: '>=0.10.0'} - dependencies: - ansi-styles: 1.1.0 - escape-string-regexp: 1.0.5 - has-ansi: 0.1.0 - strip-ansi: 0.3.0 - supports-color: 0.2.0 - dev: false - /chalk/1.1.3: resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} engines: {node: '>=0.10.0'} @@ -4857,8 +4882,8 @@ packages: resolution: {integrity: sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=} dev: false - /chart.js/4.1.1: - resolution: {integrity: sha512-P0pCosNXp+LR8zO/QTkZKT6Hb7p0DPFtypEeVOf+6x06hX13NIb75R0DXUA4Ksx/+48chDQKtCCmRCviQRTqsA==} + /chart.js/4.1.2: + resolution: {integrity: sha512-9L1w6WLPq6ztiWVVOYtDtpo0CUsBKDWPrUEdwChAyzczaikqeSwNKEv3QpJ7EO4ICcLSi6UDVhgvcnUhRJidRA==} engines: {pnpm: ^7.0.0} dependencies: '@kurkle/color': 0.3.1 @@ -5226,14 +5251,6 @@ packages: resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==} dev: false - /compress-brotli/1.3.8: - resolution: {integrity: sha512-lVcQsjhxhIXsuupfy9fmZUFtAIdBmXA7EGY6GBdgZ++qkM9zG4YFT8iU7FoBxzryNDMOpD1HIFHUSX4D87oqhQ==} - engines: {node: '>= 12'} - dependencies: - '@types/json-buffer': 3.0.0 - json-buffer: 3.0.1 - dev: false - /compress-commons/4.1.1: resolution: {integrity: sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==} engines: {node: '>= 10'} @@ -5615,7 +5632,7 @@ packages: layout-base: 2.0.1 dev: false - /cosmiconfig-typescript-loader/4.3.0_k32j2iwrrwkbro5edqflmrijke: + /cosmiconfig-typescript-loader/4.3.0_bxtyj3et3xbsdyxhh3oblnfbj4: resolution: {integrity: sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q==} engines: {node: '>=12', npm: '>=6'} peerDependencies: @@ -5624,9 +5641,9 @@ packages: ts-node: '>=10' typescript: '>=3' dependencies: - '@types/node': 14.18.36 - cosmiconfig: 7.1.0 - ts-node: 10.9.1_ocil65wecyuhsmrrocoajouipe + '@types/node': 18.11.18 + cosmiconfig: 8.0.0 + ts-node: 10.9.1_awa2wsr5thmg3i7jqycphctjfq typescript: 4.9.4 dev: true @@ -5639,6 +5656,17 @@ packages: parse-json: 5.2.0 path-type: 4.0.0 yaml: 1.10.2 + dev: false + + /cosmiconfig/8.0.0: + resolution: {integrity: sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==} + engines: {node: '>=14'} + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + dev: true /cp-file/10.0.0: resolution: {integrity: sha512-vy2Vi1r2epK5WqxOLnskeKeZkdZvTKfFZQCplE3XWsP+SUJyd5XAUFC9lFgTjjXJF2GMne/UML14iEmkAaDfFg==} @@ -5863,7 +5891,7 @@ packages: longest: 2.0.1 word-wrap: 1.2.3 optionalDependencies: - '@commitlint/load': 17.3.0 + '@commitlint/load': 17.4.2 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' @@ -6081,42 +6109,6 @@ packages: d3-transition: 3.0.1_d3-selection@3.0.0 dev: false - /d3/7.6.1: - resolution: {integrity: sha512-txMTdIHFbcpLx+8a0IFhZsbp+PfBBPt8yfbmukZTQFroKuFqIwqswF0qE5JXWefylaAVpSXFoKm3yP+jpNLFLw==} - engines: {node: '>=12'} - dependencies: - d3-array: 3.2.0 - d3-axis: 3.0.0 - d3-brush: 3.0.0 - d3-chord: 3.0.1 - d3-color: 3.1.0 - d3-contour: 4.0.0 - d3-delaunay: 6.0.2 - d3-dispatch: 3.0.1 - d3-drag: 3.0.0 - d3-dsv: 3.0.1 - d3-ease: 3.0.1 - d3-fetch: 3.0.1 - d3-force: 3.0.0 - d3-format: 3.1.0 - d3-geo: 3.0.1 - d3-hierarchy: 3.1.2 - d3-interpolate: 3.0.1 - d3-path: 3.0.1 - d3-polygon: 3.0.1 - d3-quadtree: 3.0.1 - d3-random: 3.0.1 - d3-scale: 4.0.2 - d3-scale-chromatic: 3.0.0 - d3-selection: 3.0.0 - d3-shape: 3.1.0 - d3-time: 3.0.0 - d3-time-format: 4.1.0 - d3-timer: 3.0.1 - d3-transition: 3.0.1_d3-selection@3.0.0 - d3-zoom: 3.0.0 - dev: false - /d3/7.8.0: resolution: {integrity: sha512-a5rNemRadWkEfqnY5NsD4RdCP9vn8EIJ4I5Rl14U0uKH1SXqcNmk/h9aGaAF1O98lz6L9M0IeUcuPa9GUYbI5A==} engines: {node: '>=12'} @@ -6800,10 +6792,6 @@ packages: resolution: {integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=} dev: false - /electron-to-chromium/1.4.210: - resolution: {integrity: sha512-kSiX4tuyZijV7Cz0MWVmGT8K2siqaOA4Z66K5dCttPPRh0HicOcOAEj1KlC8O8J1aOS/1M8rGofOzksLKaHWcQ==} - dev: false - /electron-to-chromium/1.4.284: resolution: {integrity: sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==} dev: false @@ -7093,7 +7081,7 @@ packages: dependencies: esbuild: 0.15.11 joycon: 3.1.1 - json5: 2.2.1 + json5: 2.2.3 loader-utils: 2.0.2 tapable: 2.2.1 webpack: 5.75.0 @@ -7184,34 +7172,34 @@ packages: esbuild-windows-arm64: 0.15.11 dev: false - /esbuild/0.16.12: - resolution: {integrity: sha512-eq5KcuXajf2OmivCl4e89AD3j8fbV+UTE9vczEzq5haA07U9oOTzBWlh3+6ZdjJR7Rz2QfWZ2uxZyhZxBgJ4+g==} + /esbuild/0.16.17: + resolution: {integrity: sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - '@esbuild/android-arm': 0.16.12 - '@esbuild/android-arm64': 0.16.12 - '@esbuild/android-x64': 0.16.12 - '@esbuild/darwin-arm64': 0.16.12 - '@esbuild/darwin-x64': 0.16.12 - '@esbuild/freebsd-arm64': 0.16.12 - '@esbuild/freebsd-x64': 0.16.12 - '@esbuild/linux-arm': 0.16.12 - '@esbuild/linux-arm64': 0.16.12 - '@esbuild/linux-ia32': 0.16.12 - '@esbuild/linux-loong64': 0.16.12 - '@esbuild/linux-mips64el': 0.16.12 - '@esbuild/linux-ppc64': 0.16.12 - '@esbuild/linux-riscv64': 0.16.12 - '@esbuild/linux-s390x': 0.16.12 - '@esbuild/linux-x64': 0.16.12 - '@esbuild/netbsd-x64': 0.16.12 - '@esbuild/openbsd-x64': 0.16.12 - '@esbuild/sunos-x64': 0.16.12 - '@esbuild/win32-arm64': 0.16.12 - '@esbuild/win32-ia32': 0.16.12 - '@esbuild/win32-x64': 0.16.12 + '@esbuild/android-arm': 0.16.17 + '@esbuild/android-arm64': 0.16.17 + '@esbuild/android-x64': 0.16.17 + '@esbuild/darwin-arm64': 0.16.17 + '@esbuild/darwin-x64': 0.16.17 + '@esbuild/freebsd-arm64': 0.16.17 + '@esbuild/freebsd-x64': 0.16.17 + '@esbuild/linux-arm': 0.16.17 + '@esbuild/linux-arm64': 0.16.17 + '@esbuild/linux-ia32': 0.16.17 + '@esbuild/linux-loong64': 0.16.17 + '@esbuild/linux-mips64el': 0.16.17 + '@esbuild/linux-ppc64': 0.16.17 + '@esbuild/linux-riscv64': 0.16.17 + '@esbuild/linux-s390x': 0.16.17 + '@esbuild/linux-x64': 0.16.17 + '@esbuild/netbsd-x64': 0.16.17 + '@esbuild/openbsd-x64': 0.16.17 + '@esbuild/sunos-x64': 0.16.17 + '@esbuild/win32-arm64': 0.16.17 + '@esbuild/win32-ia32': 0.16.17 + '@esbuild/win32-x64': 0.16.17 /escalade/3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} @@ -7258,16 +7246,16 @@ packages: source-map: 0.6.1 dev: false - /eslint-config-prettier/8.5.0_eslint@8.30.0: + /eslint-config-prettier/8.5.0_eslint@8.32.0: resolution: {integrity: sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 8.30.0 + eslint: 8.32.0 dev: true - /eslint-config-standard/17.0.0_eslint@8.30.0: + /eslint-config-standard/17.0.0_aknt3kx5mck5jnsactbk5g4gdy: resolution: {integrity: sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg==} peerDependencies: eslint: ^8.0.1 @@ -7282,10 +7270,13 @@ packages: eslint-plugin-promise: optional: true dependencies: - eslint: 8.30.0 + eslint: 8.32.0 + eslint-plugin-import: 2.26.0_eslint@8.32.0 + eslint-plugin-n: 15.6.0_eslint@8.32.0 + eslint-plugin-promise: 6.1.1_eslint@8.32.0 dev: true - /eslint-config-standard/17.0.0_snpl5wgzq3nl6iwyoqvj6sxsdi: + /eslint-config-standard/17.0.0_eslint@8.32.0: resolution: {integrity: sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg==} peerDependencies: eslint: ^8.0.1 @@ -7300,20 +7291,17 @@ packages: eslint-plugin-promise: optional: true dependencies: - eslint: 8.30.0 - eslint-plugin-import: 2.26.0_eslint@8.30.0 - eslint-plugin-n: 15.6.0_eslint@8.30.0 - eslint-plugin-promise: 6.1.1_eslint@8.30.0 + eslint: 8.32.0 dev: true - /eslint-config-vuepress-typescript/4.0.4_5c545irdft4vuty3gxgtfdqu3e: + /eslint-config-vuepress-typescript/4.0.4_otjudfky5iceznjpbxpmgilubi: resolution: {integrity: sha512-nFotoEouFD/ok8GIyZChTASK1e0TVZFLwHnR16MXaIWCRdL2tjWJcud53323aEJ/8PcYrY/GgRLwhTJR4rMZ7Q==} dependencies: - '@typescript-eslint/eslint-plugin': 5.47.1_txmweb6yn7coi7nfrp22gpyqmy - '@typescript-eslint/parser': 5.47.1_lzzuuodtsqwxnvqeq4g4likcqa - eslint-config-standard: 17.0.0_eslint@8.30.0 - eslint-config-vuepress: 4.0.4_277hnodg54nckvpj57x34abizy - eslint-plugin-vue: 9.8.0_eslint@8.30.0 + '@typescript-eslint/eslint-plugin': 5.47.1_lxxchmivucqcmhzvhnmnywabcq + '@typescript-eslint/parser': 5.47.1_7uibuqfxkfaozanbtbziikiqje + eslint-config-standard: 17.0.0_eslint@8.32.0 + eslint-config-vuepress: 4.0.4_kqi3nn3ekdmkwzfbevnojmb4b4 + eslint-plugin-vue: 9.8.0_eslint@8.32.0 transitivePeerDependencies: - eslint - eslint-import-resolver-typescript @@ -7327,7 +7315,7 @@ packages: - typescript dev: true - /eslint-config-vuepress/4.0.4_277hnodg54nckvpj57x34abizy: + /eslint-config-vuepress/4.0.4_kqi3nn3ekdmkwzfbevnojmb4b4: resolution: {integrity: sha512-MUd3IYOTVQfzuL/lAvSJPGMrJEus2/PVbQHs01N5AQw5MXc7kdhbaTJU3melExmgRe08meH88On9lNBmzbw/SQ==} peerDependencies: prettier: ^2.8.0 @@ -7338,13 +7326,13 @@ packages: prettier-config-vuepress: optional: true dependencies: - eslint-config-prettier: 8.5.0_eslint@8.30.0 - eslint-config-standard: 17.0.0_snpl5wgzq3nl6iwyoqvj6sxsdi - eslint-plugin-import: 2.26.0_smw3o7qjeokkcohbvp7rylsoqq - eslint-plugin-n: 15.6.0_eslint@8.30.0 - eslint-plugin-prettier: 4.2.1_kl4pe43v5b43npmso5hoplpbyi - eslint-plugin-promise: 6.1.1_eslint@8.30.0 - prettier: 2.8.1 + eslint-config-prettier: 8.5.0_eslint@8.32.0 + eslint-config-standard: 17.0.0_aknt3kx5mck5jnsactbk5g4gdy + eslint-plugin-import: 2.26.0_xr5b6h7hlz4fzi2dbv6u6mr45e + eslint-plugin-n: 15.6.0_eslint@8.32.0 + eslint-plugin-prettier: 4.2.1_uzdlkkftb3f76fa4on6dnxrnyi + eslint-plugin-promise: 6.1.1_eslint@8.32.0 + prettier: 2.8.3 prettier-config-vuepress: 4.0.0 transitivePeerDependencies: - '@typescript-eslint/parser' @@ -7354,7 +7342,7 @@ packages: - supports-color dev: true - /eslint-config-vuepress/4.0.4_nveednhrtxclom63fsgwztxh4a: + /eslint-config-vuepress/4.0.4_udtwlmtl3kiiub6agmjl3rmgge: resolution: {integrity: sha512-MUd3IYOTVQfzuL/lAvSJPGMrJEus2/PVbQHs01N5AQw5MXc7kdhbaTJU3melExmgRe08meH88On9lNBmzbw/SQ==} peerDependencies: prettier: ^2.8.0 @@ -7365,13 +7353,13 @@ packages: prettier-config-vuepress: optional: true dependencies: - eslint-config-prettier: 8.5.0_eslint@8.30.0 - eslint-config-standard: 17.0.0_snpl5wgzq3nl6iwyoqvj6sxsdi - eslint-plugin-import: 2.26.0_eslint@8.30.0 - eslint-plugin-n: 15.6.0_eslint@8.30.0 - eslint-plugin-prettier: 4.2.1_kl4pe43v5b43npmso5hoplpbyi - eslint-plugin-promise: 6.1.1_eslint@8.30.0 - prettier: 2.8.1 + eslint-config-prettier: 8.5.0_eslint@8.32.0 + eslint-config-standard: 17.0.0_aknt3kx5mck5jnsactbk5g4gdy + eslint-plugin-import: 2.26.0_eslint@8.32.0 + eslint-plugin-n: 15.6.0_eslint@8.32.0 + eslint-plugin-prettier: 4.2.1_uzdlkkftb3f76fa4on6dnxrnyi + eslint-plugin-promise: 6.1.1_eslint@8.32.0 + prettier: 2.8.3 prettier-config-vuepress: 4.0.0 transitivePeerDependencies: - '@typescript-eslint/parser' @@ -7390,7 +7378,7 @@ packages: - supports-color dev: true - /eslint-module-utils/2.7.4_dc7heojkjdjw5ttc65wer4jauy: + /eslint-module-utils/2.7.4_7gr2yud7moko5ggdmscvhh4rd4: resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} engines: {node: '>=4'} peerDependencies: @@ -7412,13 +7400,13 @@ packages: optional: true dependencies: debug: 3.2.7 - eslint: 8.30.0 + eslint: 8.32.0 eslint-import-resolver-node: 0.3.6 transitivePeerDependencies: - supports-color dev: true - /eslint-module-utils/2.7.4_ehosaqfug4in6rsga5hlj3hmya: + /eslint-module-utils/2.7.4_gus4c32aq4cur7bb6tlulemjma: resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} engines: {node: '>=4'} peerDependencies: @@ -7439,26 +7427,26 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 5.47.1_lzzuuodtsqwxnvqeq4g4likcqa + '@typescript-eslint/parser': 5.47.1_7uibuqfxkfaozanbtbziikiqje debug: 3.2.7 - eslint: 8.30.0 + eslint: 8.32.0 eslint-import-resolver-node: 0.3.6 transitivePeerDependencies: - supports-color dev: true - /eslint-plugin-es/4.1.0_eslint@8.30.0: + /eslint-plugin-es/4.1.0_eslint@8.32.0: resolution: {integrity: sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==} engines: {node: '>=8.10.0'} peerDependencies: eslint: '>=4.19.1' dependencies: - eslint: 8.30.0 + eslint: 8.32.0 eslint-utils: 2.1.0 regexpp: 3.2.0 dev: true - /eslint-plugin-import/2.26.0_eslint@8.30.0: + /eslint-plugin-import/2.26.0_eslint@8.32.0: resolution: {integrity: sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==} engines: {node: '>=4'} peerDependencies: @@ -7472,9 +7460,9 @@ packages: array.prototype.flat: 1.3.1 debug: 2.6.9 doctrine: 2.1.0 - eslint: 8.30.0 + eslint: 8.32.0 eslint-import-resolver-node: 0.3.6 - eslint-module-utils: 2.7.4_dc7heojkjdjw5ttc65wer4jauy + eslint-module-utils: 2.7.4_7gr2yud7moko5ggdmscvhh4rd4 has: 1.0.3 is-core-module: 2.11.0 is-glob: 4.0.3 @@ -7488,7 +7476,7 @@ packages: - supports-color dev: true - /eslint-plugin-import/2.26.0_smw3o7qjeokkcohbvp7rylsoqq: + /eslint-plugin-import/2.26.0_xr5b6h7hlz4fzi2dbv6u6mr45e: resolution: {integrity: sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==} engines: {node: '>=4'} peerDependencies: @@ -7498,14 +7486,14 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 5.47.1_lzzuuodtsqwxnvqeq4g4likcqa + '@typescript-eslint/parser': 5.47.1_7uibuqfxkfaozanbtbziikiqje array-includes: 3.1.6 array.prototype.flat: 1.3.1 debug: 2.6.9 doctrine: 2.1.0 - eslint: 8.30.0 + eslint: 8.32.0 eslint-import-resolver-node: 0.3.6 - eslint-module-utils: 2.7.4_ehosaqfug4in6rsga5hlj3hmya + eslint-module-utils: 2.7.4_gus4c32aq4cur7bb6tlulemjma has: 1.0.3 is-core-module: 2.11.0 is-glob: 4.0.3 @@ -7519,16 +7507,16 @@ packages: - supports-color dev: true - /eslint-plugin-n/15.6.0_eslint@8.30.0: + /eslint-plugin-n/15.6.0_eslint@8.32.0: resolution: {integrity: sha512-Hd/F7wz4Mj44Jp0H6Jtty13NcE69GNTY0rVlgTIj1XBnGGVI6UTdDrpE6vqu3AHo07bygq/N+7OH/lgz1emUJw==} engines: {node: '>=12.22.0'} peerDependencies: eslint: '>=7.0.0' dependencies: builtins: 5.0.1 - eslint: 8.30.0 - eslint-plugin-es: 4.1.0_eslint@8.30.0 - eslint-utils: 3.0.0_eslint@8.30.0 + eslint: 8.32.0 + eslint-plugin-es: 4.1.0_eslint@8.32.0 + eslint-utils: 3.0.0_eslint@8.32.0 ignore: 5.2.4 is-core-module: 2.11.0 minimatch: 3.1.2 @@ -7536,7 +7524,7 @@ packages: semver: 7.3.8 dev: true - /eslint-plugin-prettier/4.2.1_kl4pe43v5b43npmso5hoplpbyi: + /eslint-plugin-prettier/4.2.1_uzdlkkftb3f76fa4on6dnxrnyi: resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} engines: {node: '>=12.0.0'} peerDependencies: @@ -7547,34 +7535,34 @@ packages: eslint-config-prettier: optional: true dependencies: - eslint: 8.30.0 - eslint-config-prettier: 8.5.0_eslint@8.30.0 - prettier: 2.8.1 + eslint: 8.32.0 + eslint-config-prettier: 8.5.0_eslint@8.32.0 + prettier: 2.8.3 prettier-linter-helpers: 1.0.0 dev: true - /eslint-plugin-promise/6.1.1_eslint@8.30.0: + /eslint-plugin-promise/6.1.1_eslint@8.32.0: resolution: {integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: - eslint: 8.30.0 + eslint: 8.32.0 dev: true - /eslint-plugin-vue/9.8.0_eslint@8.30.0: + /eslint-plugin-vue/9.8.0_eslint@8.32.0: resolution: {integrity: sha512-E/AXwcTzunyzM83C2QqDHxepMzvI2y6x+mmeYHbVDQlKFqmKYvRrhaVixEeeG27uI44p9oKDFiyCRw4XxgtfHA==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 dependencies: - eslint: 8.30.0 - eslint-utils: 3.0.0_eslint@8.30.0 + eslint: 8.32.0 + eslint-utils: 3.0.0_eslint@8.32.0 natural-compare: 1.4.0 nth-check: 2.1.1 postcss-selector-parser: 6.0.11 semver: 7.3.8 - vue-eslint-parser: 9.1.0_eslint@8.30.0 + vue-eslint-parser: 9.1.0_eslint@8.32.0 xml-name-validator: 4.0.0 transitivePeerDependencies: - supports-color @@ -7602,13 +7590,13 @@ packages: eslint-visitor-keys: 1.3.0 dev: true - /eslint-utils/3.0.0_eslint@8.30.0: + /eslint-utils/3.0.0_eslint@8.32.0: resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} peerDependencies: eslint: '>=5' dependencies: - eslint: 8.30.0 + eslint: 8.32.0 eslint-visitor-keys: 2.1.0 dev: true @@ -7626,12 +7614,12 @@ packages: resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - /eslint/8.30.0: - resolution: {integrity: sha512-MGADB39QqYuzEGov+F/qb18r4i7DohCDOfatHaxI2iGlPuC65bwG2gxgO+7DkyL38dRFaRH7RaRAgU6JKL9rMQ==} + /eslint/8.32.0: + resolution: {integrity: sha512-nETVXpnthqKPFyuY2FNjz/bEd6nbosRgKbkgS/y1C7LJop96gYHWpiguLecMHQ2XCPxn77DS0P+68WzG6vkZSQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint/eslintrc': 1.4.0 + '@eslint/eslintrc': 1.4.1 '@humanwhocodes/config-array': 0.11.8 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 @@ -7642,7 +7630,7 @@ packages: doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.1.1 - eslint-utils: 3.0.0_eslint@8.30.0 + eslint-utils: 3.0.0_eslint@8.32.0 eslint-visitor-keys: 3.3.0 espree: 9.4.1 esquery: 1.4.0 @@ -7830,45 +7818,6 @@ packages: on-headers: 1.0.2 dev: false - /express/4.18.1: - resolution: {integrity: sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==} - engines: {node: '>= 0.10.0'} - dependencies: - accepts: 1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.0 - content-disposition: 0.5.4 - content-type: 1.0.4 - cookie: 0.5.0 - cookie-signature: 1.0.6 - debug: 2.6.9 - depd: 2.0.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 1.2.0 - fresh: 0.5.2 - http-errors: 2.0.0 - merge-descriptors: 1.0.1 - methods: 1.1.2 - on-finished: 2.4.1 - parseurl: 1.3.3 - path-to-regexp: 0.1.7 - proxy-addr: 2.0.7 - qs: 6.10.3 - range-parser: 1.2.1 - safe-buffer: 5.2.1 - send: 0.18.0 - serve-static: 1.15.0 - setprototypeof: 1.2.0 - statuses: 2.0.1 - type-is: 1.6.18 - utils-merge: 1.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - dev: false - /express/4.18.2: resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} engines: {node: '>= 0.10.0'} @@ -7978,6 +7927,24 @@ packages: - supports-color dev: false + /extract-zip/2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + dependencies: + debug: 4.3.4 + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.0 + transitivePeerDependencies: + - supports-color + dev: false + + /fast-decode-uri-component/1.0.1: + resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} + dev: false + /fast-deep-equal/3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -8015,13 +7982,65 @@ packages: /fast-json-stable-stringify/2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + /fast-json-stringify/5.5.0: + resolution: {integrity: sha512-rmw2Z8/mLkND8zI+3KTYIkNPEoF5v6GqDP/o+g7H3vjdWjBwuKpgAYFHIzL6ORRB+iqDjjtJnLIW9Mzxn5szOA==} + dependencies: + '@fastify/deepmerge': 1.3.0 + ajv: 8.11.2 + ajv-formats: 2.1.1 + fast-deep-equal: 3.1.3 + fast-uri: 2.2.0 + rfdc: 1.3.0 + dev: false + /fast-levenshtein/2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + /fast-querystring/1.1.0: + resolution: {integrity: sha512-LWkjBCZlxjnSanuPpZ6mHswjy8hQv3VcPJsQB3ltUF2zjvrycr0leP3TSTEEfvQ1WEMSRl5YNsGqaft9bjLqEw==} + dependencies: + fast-decode-uri-component: 1.0.1 + dev: false + + /fast-redact/3.1.2: + resolution: {integrity: sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw==} + engines: {node: '>=6'} + dev: false + /fast-safe-stringify/2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} dev: false + /fast-uri/2.2.0: + resolution: {integrity: sha512-cIusKBIt/R/oI6z/1nyfe2FvGKVTohVRfvkOhvx0nCEW+xf5NoCXjAHcWp93uOUBchzYcsvPlrapAdX1uW+YGg==} + dev: false + + /fastify-plugin/4.5.0: + resolution: {integrity: sha512-79ak0JxddO0utAXAQ5ccKhvs6vX2MGyHHMMsmZkBANrq3hXc1CHzvNPHOcvTsVMEPl5I+NT+RO4YKMGehOfSIg==} + dev: false + + /fastify/4.11.0: + resolution: {integrity: sha512-JteZ8pjEqd+6n+azQnQfSJV8MUMxAmxbvC2Dx/Mybj039Lf/u3kda9Kq84uy/huCpqCzZoyHIZS5JFGF3wLztw==} + dependencies: + '@fastify/ajv-compiler': 3.5.0 + '@fastify/error': 3.2.0 + '@fastify/fast-json-stringify-compiler': 4.2.0 + abstract-logging: 2.0.1 + avvio: 8.2.0 + content-type: 1.0.4 + find-my-way: 7.4.0 + light-my-request: 5.8.0 + pino: 8.8.0 + process-warning: 2.1.0 + proxy-addr: 2.0.7 + rfdc: 1.3.0 + secure-json-parse: 2.7.0 + semver: 7.3.8 + tiny-lru: 10.0.1 + transitivePeerDependencies: + - supports-color + dev: false + /fastq/1.14.0: resolution: {integrity: sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==} dependencies: @@ -8104,10 +8123,6 @@ packages: flat-cache: 3.0.4 dev: true - /file-size/0.0.5: - resolution: {integrity: sha1-BX1Dw6Ptc12j+Q1gUqs4Dx5tXjs=} - dev: false - /file-type/11.1.0: resolution: {integrity: sha512-rM0UO7Qm9K7TWTtA6AShI/t7H5BPjDeGVDaNyg9BjHAj3PysKy7+8C8D137R88jnR3rFJZQB/tFgydl5sN5m7g==} engines: {node: '>=6'} @@ -8215,6 +8230,15 @@ packages: /find-index/0.1.1: resolution: {integrity: sha512-uJ5vWrfBKMcE6y2Z8834dwEZj9mNGxYa3t3I53OwFeuZ8D9oc2E5zcsrkuhX6h4iYrjhiv0T3szQmxlAV9uxDg==} + /find-my-way/7.4.0: + resolution: {integrity: sha512-JFT7eURLU5FumlZ3VBGnveId82cZz7UR7OUu+THQJOwdQXxmS/g8v0KLoFhv97HreycOrmAbqjXD/4VG2j0uMQ==} + engines: {node: '>=14'} + dependencies: + fast-deep-equal: 3.1.3 + fast-querystring: 1.1.0 + safe-regex2: 2.0.0 + dev: false + /find-node-modules/2.1.3: resolution: {integrity: sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==} dependencies: @@ -8419,7 +8443,6 @@ packages: graceful-fs: 4.2.10 jsonfile: 6.1.0 universalify: 2.0.0 - dev: false /fs-extra/9.1.0: resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} @@ -8958,14 +8981,6 @@ packages: engines: {node: '>=6'} dev: true - /has-ansi/0.1.0: - resolution: {integrity: sha512-1YsTg1fk2/6JToQhtZkArMkurq8UoWU1Qe0aR3VUHjgij4nOylSWLWAtBXoZ4/dXOmugfLGm1c+QhuD0JyedFA==} - engines: {node: '>=0.10.0'} - hasBin: true - dependencies: - ansi-regex: 0.2.1 - dev: false - /has-ansi/2.0.0: resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} engines: {node: '>=0.10.0'} @@ -9120,6 +9135,13 @@ packages: lru-cache: 7.14.1 dev: true + /hot-shots/9.3.0: + resolution: {integrity: sha512-e4tgWptiBvlIMnAX0ORe+dNEt0HznD+T2ckzXDUwCBsU7uWr2mwq5UtoT+Df5r9hD5S/DuP8rTxJUQvqAFSFKA==} + engines: {node: '>=6.0.0'} + optionalDependencies: + unix-dgram: 2.0.6 + dev: false + /hpack.js/2.1.6: resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} dependencies: @@ -9364,8 +9386,8 @@ packages: ms: 2.1.3 dev: true - /husky/8.0.2: - resolution: {integrity: sha512-Tkv80jtvbnkK3mYWxPZePGFpQ/tT3HNSs/sasF9P2YfkMezDl3ON37YN6jUUI4eTg5LcyVynlb6r4eyvOmspvg==} + /husky/8.0.3: + resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} engines: {node: '>=14'} hasBin: true dev: true @@ -9965,11 +9987,6 @@ packages: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} - /is-wsl/1.1.0: - resolution: {integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==} - engines: {node: '>=4'} - dev: false - /is-wsl/2.2.0: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} @@ -10149,8 +10166,8 @@ packages: minimist: 1.2.7 dev: true - /json5/2.2.1: - resolution: {integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==} + /json5/2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} hasBin: true dev: false @@ -10176,20 +10193,14 @@ packages: engines: {node: '>=0.10.0'} dev: false - /jsonwebtoken/8.5.1: - resolution: {integrity: sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==} - engines: {node: '>=4', npm: '>=1.4.28'} + /jsonwebtoken/9.0.0: + resolution: {integrity: sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==} + engines: {node: '>=12', npm: '>=6'} dependencies: jws: 3.2.2 - lodash.includes: 4.3.0 - lodash.isboolean: 3.0.3 - lodash.isinteger: 4.0.4 - lodash.isnumber: 3.0.3 - lodash.isplainobject: 4.0.6 - lodash.isstring: 4.0.1 - lodash.once: 4.1.1 + lodash: 4.17.21 ms: 2.1.3 - semver: 5.7.1 + semver: 7.3.8 dev: false /junk/3.1.0: @@ -10247,13 +10258,6 @@ packages: json-buffer: 3.0.0 dev: false - /keyv/4.3.3: - resolution: {integrity: sha512-AcysI17RvakTh8ir03+a3zJr5r0ovnAH/XTXei/4HIv3bL2K/jzvgivLK9UuI/JbU1aJjM3NSAnVvVVd3n+4DQ==} - dependencies: - compress-brotli: 1.3.8 - json-buffer: 3.0.1 - dev: false - /keyv/4.5.2: resolution: {integrity: sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==} dependencies: @@ -10429,6 +10433,14 @@ packages: type-check: 0.4.0 dev: true + /light-my-request/5.8.0: + resolution: {integrity: sha512-4BtD5C+VmyTpzlDPCZbsatZMJVgUIciSOwYhJDCbLffPZ35KoDkDj4zubLeHDEb35b4kkPeEv5imbh+RJxK/Pg==} + dependencies: + cookie: 0.5.0 + process-warning: 2.1.0 + set-cookie-parser: 2.5.1 + dev: false + /lilconfig/2.0.6: resolution: {integrity: sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==} engines: {node: '>=10'} @@ -10576,7 +10588,7 @@ packages: dependencies: big.js: 5.2.2 emojis-list: 3.0.0 - json5: 2.2.1 + json5: 2.2.3 dev: false /localstorage-memory/1.0.3: @@ -10633,14 +10645,6 @@ packages: resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==} dev: false - /lodash.includes/4.3.0: - resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} - dev: false - - /lodash.isboolean/3.0.3: - resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} - dev: false - /lodash.isempty/4.4.0: resolution: {integrity: sha512-oKMuF3xEeqDltrGMfDxAPGIVMSSRv8tbRSODbrs4KGsRRLEhrW8N8Rd4DRgB2+621hY8A8XwwrTVhXWpxFvMzg==} dev: false @@ -10649,25 +10653,13 @@ packages: resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==} dev: true - /lodash.isinteger/4.0.4: - resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} - dev: false - /lodash.ismatch/4.4.0: resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} dev: true - /lodash.isnumber/3.0.3: - resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} - dev: false - /lodash.isplainobject/4.0.6: resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} - /lodash.isstring/4.0.1: - resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} - dev: false - /lodash.kebabcase/4.1.1: resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} dev: true @@ -10684,10 +10676,6 @@ packages: resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} dev: true - /lodash.once/4.1.1: - resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} - dev: false - /lodash.snakecase/4.1.1: resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} dev: true @@ -10723,7 +10711,7 @@ packages: filter-obj: 3.0.0 jest-validate: 27.5.1 map-obj: 5.0.2 - moize: 6.1.1 + moize: 6.1.4 semver: 7.3.8 dev: false @@ -11095,7 +11083,7 @@ packages: resolution: {integrity: sha512-mGl0BM19TD/HbU/LmlaZbjBi//tojelg8P/mxD6pPZTAYaI+VawcyBdqRsoUHSc7j71PrMdJ3HBadoQNdvP5cg==} dependencies: '@braintree/sanitize-url': 6.0.0 - d3: 7.6.1 + d3: 7.8.0 dagre-d3-es: 7.0.6 dompurify: 2.4.1 khroma: 2.0.0 @@ -11119,10 +11107,6 @@ packages: resolution: {integrity: sha512-y0y6CUB9RLVsy3kfgayU28746QrNMpSm9O/AYGNsBgOkJr/X/Jk0VLGoO8Ude7Bpa8adywzF+MzXNZRFRsNPhg==} dev: false - /micro-memoize/4.0.10: - resolution: {integrity: sha512-rk0OlvEQkShjbr2EvGn1+GdCsgLDgABQyM9ZV6VoHNU7hiNM+eSOkjGWhiNabU/XWiEalWbjNQrNO+zcqd+pEA==} - dev: false - /micro-memoize/4.0.14: resolution: {integrity: sha512-2tzWP1w2Hh+r7kCYa4f//jpBEA6dAueiuLco38NxfjF9Py3KCCI7wVOTdCvOhmTC043t+ulclVBdl3v+s+UJIQ==} dev: false @@ -11389,13 +11373,6 @@ packages: node-source-walk: 5.0.0 dev: false - /moize/6.1.1: - resolution: {integrity: sha512-6bryLehIBVByDdAkXhoaPP1fknkoq1hNPmVCDYIb/w5zwfidT02zLSto1uGbmnv1GKu02ysgAEaJ5Ic7QQaGQA==} - dependencies: - fast-equals: 3.0.3 - micro-memoize: 4.0.10 - dev: false - /moize/6.1.4: resolution: {integrity: sha512-Ga8V0iu7XHDz6GR50pAaGjc3hJ5CVmWUgQRyWFAn4pYrBzITx9dMlXOGhURP2qmO3WTeOC9Yu17MlFV6PY2m/g==} dependencies: @@ -11448,6 +11425,11 @@ packages: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} dev: true + /nan/2.17.0: + resolution: {integrity: sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==} + dev: false + optional: true + /nanoid/3.3.4: resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -11516,15 +11498,16 @@ packages: resolution: {integrity: sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==} dev: false - /netlify-cli/12.5.0_@types+node@18.11.18: - resolution: {integrity: sha512-W8e+k7q0GOCHiVgq4LiV/FVtwcnbAy6G9u8tMdpjY0By7/lhnUzyxnntLaTFJ+40On4qflkin0DGYpzlnWtqEw==} + /netlify-cli/12.7.2_@types+node@18.11.18: + resolution: {integrity: sha512-6quAaycsIYKVA68upfUoSK1pkRUguR2oAED2vsZhXWNH1j3+O+1v6yYBgyCGewTPf/Z1ANlDh7c6pupW8/75iw==} engines: {node: ^14.16.0 || >=16.0.0} hasBin: true requiresBuild: true dependencies: - '@netlify/build': 29.3.0_@types+node@18.11.18 - '@netlify/config': 20.2.0 - '@netlify/edge-bundler': 8.0.0 + '@fastify/static': 6.6.1 + '@netlify/build': 29.4.5_@types+node@18.11.18 + '@netlify/config': 20.3.0 + '@netlify/edge-bundler': 8.1.2 '@netlify/framework-info': 9.5.3 '@netlify/local-functions-proxy': 1.1.1 '@netlify/zip-it-and-ship-it': 8.2.0 @@ -11555,8 +11538,10 @@ packages: envinfo: 7.8.1 etag: 1.8.1 execa: 5.1.1 - express: 4.18.1 + express: 4.18.2 express-logging: 1.1.1 + extract-zip: 2.0.1 + fastify: 4.11.0 find-up: 5.0.0 flush-write-stream: 2.0.0 folder-walker: 3.2.0 @@ -11577,7 +11562,7 @@ packages: is-plain-obj: 3.0.0 is-wsl: 2.2.0 isexe: 2.0.0 - jsonwebtoken: 8.5.1 + jsonwebtoken: 9.0.0 jwt-decode: 3.1.2 lambda-local: 2.0.2 listr: 0.14.3 @@ -11608,7 +11593,6 @@ packages: read-pkg-up: 7.0.1 semver: 7.3.8 source-map-support: 0.5.21 - static-server: 2.2.1 string-similarity: 4.0.4 strip-ansi-control-characters: 2.0.0 tabtab: 3.0.2 @@ -11757,14 +11741,14 @@ packages: resolution: {integrity: sha512-8Q1hXew6ETzqKRAs3jjLioSxNfT1cx74ooiF8RlAONwVMcfq+UdzLC2eB5qcPldUxaE5w3ytLkrmV1TGddhZTA==} engines: {node: '>=6.0'} dependencies: - '@babel/parser': 7.18.10 + '@babel/parser': 7.20.7 dev: false /node-source-walk/5.0.0: resolution: {integrity: sha512-58APXoMXpmmU+oVBJFajhTCoD8d/OGtngnVAWzIo2A8yn0IXwBzvIVIsTzoie/SrA37u+1hnpNz2HMWx/VIqlw==} engines: {node: '>=12'} dependencies: - '@babel/parser': 7.18.10 + '@babel/parser': 7.20.7 dev: false /node-stream-zip/1.15.0: @@ -12078,6 +12062,10 @@ packages: resolution: {integrity: sha512-hJmu9D+bNB40YpL9jYebQl4lsTW6yEHRTroJzNLqQJYHm7c+NQnJGfZmIWh8S3q3KoaxV1aLhV6B3+0N0/kyJg==} dev: false + /on-exit-leak-free/2.1.0: + resolution: {integrity: sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w==} + dev: false + /on-finished/2.3.0: resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} engines: {node: '>= 0.8'} @@ -12136,13 +12124,6 @@ packages: is-wsl: 2.2.0 dev: false - /opn/5.5.0: - resolution: {integrity: sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==} - engines: {node: '>=4'} - dependencies: - is-wsl: 1.1.0 - dev: false - /optionator/0.8.3: resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} engines: {node: '>= 0.8.0'} @@ -12675,6 +12656,34 @@ packages: engines: {node: '>=0.10.0'} dev: false + /pino-abstract-transport/1.0.0: + resolution: {integrity: sha512-c7vo5OpW4wIS42hUVcT5REsL8ZljsUfBjqV/e2sFxmFEFZiq1XLUp5EYLtuDH6PEHq9W1egWqRbnLUP5FuZmOA==} + dependencies: + readable-stream: 4.3.0 + split2: 4.1.0 + dev: false + + /pino-std-serializers/6.1.0: + resolution: {integrity: sha512-KO0m2f1HkrPe9S0ldjx7za9BJjeHqBku5Ch8JyxETxT8dEFGz1PwgrHaOQupVYitpzbFSYm7nnljxD8dik2c+g==} + dev: false + + /pino/8.8.0: + resolution: {integrity: sha512-cF8iGYeu2ODg2gIwgAHcPrtR63ILJz3f7gkogaHC/TXVVXxZgInmNYiIpDYEwgEkxZti2Se6P2W2DxlBIZe6eQ==} + hasBin: true + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.1.2 + on-exit-leak-free: 2.1.0 + pino-abstract-transport: 1.0.0 + pino-std-serializers: 6.1.0 + process-warning: 2.1.0 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.3.1 + sonic-boom: 3.2.1 + thread-stream: 2.3.0 + dev: false + /pkg-dir/6.0.1: resolution: {integrity: sha512-C9R+PTCKGA32HG0n5I4JMYkdLL58ZpayVuncQHQrGeKa8o26A4o2x0u6BKekHG+Au0jv5ZW7Xfq1Cj6lm9Ag4w==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -12682,8 +12691,8 @@ packages: find-up: 6.3.0 dev: false - /pnpm/7.21.0: - resolution: {integrity: sha512-zDsRciscnXmp8AVD0u9eSoJrGfXywepuwMmFstsd+Vfl/wDZUxgaSaZ/6Nkx3bBftC+oBpWFkAGBRyjy58jvZg==} + /pnpm/7.25.0: + resolution: {integrity: sha512-FGFQUON8kJ6ma39elJ8lyD8wPIfgp3opGJD9sX0TgIJk4zSr556qCgC8AN+3BFHe4yuRkEauf4JVLW2RKyyEcA==} engines: {node: '>=14.6'} hasBin: true dev: true @@ -12917,8 +12926,8 @@ packages: fast-diff: 1.2.0 dev: true - /prettier/2.8.1: - resolution: {integrity: sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==} + /prettier/2.8.3: + resolution: {integrity: sha512-tJ/oJ4amDihPoufT5sM0Z1SKEuKay8LfVAMlbbhnnkvt6BUserZylqo2PN+p9KeljLr0OHa2rXHU1T8reeoTrw==} engines: {node: '>=10.13.0'} hasBin: true dev: true @@ -12982,6 +12991,10 @@ packages: /process-nextick-args/2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + /process-warning/2.1.0: + resolution: {integrity: sha512-9C20RLxrZU/rFnxWncDkuF6O999NdIf3E1ws4B0ZeY3sRVPzWBMsYDE2lxjxhiXxg464cQTgKUGm8/i6y2YGXg==} + dev: false + /process/0.11.10: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} @@ -13085,13 +13098,6 @@ packages: engines: {node: '>=0.6.0', teleport: '>=0.2.0'} dev: true - /qs/6.10.3: - resolution: {integrity: sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==} - engines: {node: '>=0.6'} - dependencies: - side-channel: 1.0.4 - dev: false - /qs/6.11.0: resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} engines: {node: '>=0.6'} @@ -13117,6 +13123,10 @@ packages: /queue-microtask/1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + /quick-format-unescaped/4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + dev: false + /quick-lru/4.0.1: resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} engines: {node: '>=8'} @@ -13279,6 +13289,16 @@ packages: string_decoder: 1.3.0 util-deprecate: 1.0.2 + /readable-stream/4.3.0: + resolution: {integrity: sha512-MuEnA0lbSi7JS8XM+WNJlWZkHAAdm7gETHdFK//Q/mChGyj2akEFtdLZh32jSdkWGbRwCW9pn6g3LWDdDeZnBQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + dev: false + /readdir-glob/1.1.2: resolution: {integrity: sha512-6RLVvwJtVwEDfPdn6X6Ille4/lxGl0ATOY4FN/B9nxQcgOazvvI0nodiD19ScKq0PvA/29VpaOQML36o5IzZWA==} dependencies: @@ -13303,6 +13323,11 @@ packages: picomatch: 2.3.1 dev: false + /real-require/0.2.0: + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} + dev: false + /redent/3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} @@ -13505,6 +13530,11 @@ packages: engines: {node: '>=0.12'} dev: false + /ret/0.2.2: + resolution: {integrity: sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==} + engines: {node: '>=4'} + dev: false + /retry/0.12.0: resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} engines: {node: '>= 4'} @@ -13604,6 +13634,12 @@ packages: ret: 0.1.15 dev: false + /safe-regex2/2.0.0: + resolution: {integrity: sha512-PaUSFsUaNNuKwkBijoAPHAK6/eM6VirvyPWlZ7BAQy4D+hCvh4B6lIG+nPdhbFfIbP+gTGBcrdsOaUs0F+ZBOQ==} + dependencies: + ret: 0.2.2 + dev: false + /safe-stable-stringify/2.3.1: resolution: {integrity: sha512-kYBSfT+troD9cDA85VDnHZ1rpHC50O0g1e6WlGHVCz/g+JS+9WKLj+XwFYyR8UbrZN8ll9HUpDAAddY58MGisg==} engines: {node: '>=10'} @@ -13679,6 +13715,10 @@ packages: kind-of: 6.0.3 dev: false + /secure-json-parse/2.7.0: + resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} + dev: false + /seek-bzip/1.0.6: resolution: {integrity: sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==} hasBin: true @@ -13719,14 +13759,6 @@ packages: resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} hasBin: true - /semver/7.3.7: - resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - /semver/7.3.8: resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} engines: {node: '>=10'} @@ -13791,6 +13823,10 @@ packages: /set-blocking/2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + /set-cookie-parser/2.5.1: + resolution: {integrity: sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ==} + dev: false + /set-value/2.0.1: resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} engines: {node: '>=0.10.0'} @@ -13983,6 +14019,12 @@ packages: smart-buffer: 4.2.0 dev: true + /sonic-boom/3.2.1: + resolution: {integrity: sha512-iITeTHxy3B9FGu8aVdiDXUVAcHMF9Ss0cCsAOo2HfCrmVGT3/DT5oYaeu0M/YKZDlKTvChEyPq0zI9Hf33EX6A==} + dependencies: + atomic-sleep: 1.0.0 + dev: false + /sort-keys-length/1.0.1: resolution: {integrity: sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==} engines: {node: '>=0.10.0'} @@ -14147,6 +14189,11 @@ packages: readable-stream: 3.6.0 dev: true + /split2/4.1.0: + resolution: {integrity: sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==} + engines: {node: '>= 10.x'} + dev: false + /sprintf-js/1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} dev: false @@ -14180,23 +14227,6 @@ packages: object-copy: 0.1.0 dev: false - /static-server/2.2.1: - resolution: {integrity: sha512-j5eeW6higxYNmXMIT8iHjsdiViTpQDthg7o+SHsRtqdbxscdHqBHXwrXjHC8hL3F0Tsu34ApUpDkwzMBPBsrLw==} - engines: {node: '>=4'} - hasBin: true - dependencies: - chalk: 0.5.1 - commander: 2.20.3 - file-size: 0.0.5 - mime: 1.6.0 - opn: 5.5.0 - dev: false - - /statsd-client/0.4.7: - resolution: {integrity: sha512-+sGCE6FednJ/vI7vywErOg/mhVqmf6Zlktz7cdGRnF/cQWXD9ifMgtqU1CIIXmhSwm11SCk4zDN+bwNCvIR/Kg==} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - dev: false - /statuses/1.5.0: resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} engines: {node: '>= 0.6'} @@ -14284,14 +14314,6 @@ packages: resolution: {integrity: sha512-Q0/k5orrVGeaOlIOUn1gybGU0IcAbgHQT1faLo5hik4DqClKVSaka5xOhNNoRgtfztHVxCYxi7j71mrWom0bIw==} dev: false - /strip-ansi/0.3.0: - resolution: {integrity: sha512-DerhZL7j6i6/nEnVG0qViKXI0OKouvvpsAiaj7c+LfqZZZxdwZtv8+UiA/w4VUJpT8UzX0pR1dcHOii1GbmruQ==} - engines: {node: '>=0.10.0'} - hasBin: true - dependencies: - ansi-regex: 0.2.1 - dev: false - /strip-ansi/3.0.1: resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} engines: {node: '>=0.10.0'} @@ -14423,12 +14445,6 @@ packages: - supports-color dev: false - /supports-color/0.2.0: - resolution: {integrity: sha512-tdCZ28MnM7k7cJDJc7Eq80A9CsRFAAOZUy41npOZCs++qSjfIy7o5Rh46CBk+Dk5FbKJ33X3Tqg4YrV07N5RaA==} - engines: {node: '>=0.10.0'} - hasBin: true - dev: false - /supports-color/2.0.0: resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} engines: {node: '>=0.8.0'} @@ -14633,6 +14649,12 @@ packages: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true + /thread-stream/2.3.0: + resolution: {integrity: sha512-kaDqm1DET9pp3NXwR8382WHbnpXnRkN9xGN9dQt3B2+dmXiW8X1SOwmFOxAErEQ47ObhZ96J6yhZNXuyCOL7KA==} + dependencies: + real-require: 0.2.0 + dev: false + /through/2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} @@ -14676,6 +14698,11 @@ packages: engines: {node: '>=0.10.0'} dev: false + /tiny-lru/10.0.1: + resolution: {integrity: sha512-Vst+6kEsWvb17Zpz14sRJV/f8bUWKhqm6Dc+v08iShmIJ/WxqWytHzCTd6m88pS33rE2zpX34TRmOpAJPloNCA==} + engines: {node: '>=6'} + dev: false + /tmp-promise/3.0.3: resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==} dependencies: @@ -14817,37 +14844,6 @@ packages: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - /ts-node/10.9.1_ocil65wecyuhsmrrocoajouipe: - resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.9 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.3 - '@types/node': 14.18.36 - acorn: 8.8.1 - acorn-walk: 8.2.0 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 4.9.4 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - dev: true - /tsconfig-paths/3.14.1: resolution: {integrity: sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==} dependencies: @@ -15056,6 +15052,16 @@ packages: resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} engines: {node: '>= 10.0.0'} + /unix-dgram/2.0.6: + resolution: {integrity: sha512-AURroAsb73BZ6CdAyMrTk/hYKNj3DuYYEuOaB8bYMOHGKupRNScw90Q5C71tWJc3uE7dIeXRyuwN0xLLq3vDTg==} + engines: {node: '>=0.10.48'} + requiresBuild: true + dependencies: + bindings: 1.5.0 + nan: 2.17.0 + dev: false + optional: true + /unixify/1.0.0: resolution: {integrity: sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==} engines: {node: '>=0.10.0'} @@ -15097,17 +15103,6 @@ packages: picocolors: 1.0.0 dev: false - /update-browserslist-db/1.0.5_browserslist@4.21.3: - resolution: {integrity: sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - dependencies: - browserslist: 4.21.3 - escalade: 3.1.1 - picocolors: 1.0.0 - dev: false - /update-notifier/5.1.0: resolution: {integrity: sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==} engines: {node: '>=10'} @@ -15246,8 +15241,8 @@ packages: - supports-color dev: false - /vite/4.0.3_@types+node@18.11.18: - resolution: {integrity: sha512-HvuNv1RdE7deIfQb8mPk51UKjqptO/4RXZ5yXSAvurd5xOckwS/gg8h9Tky3uSbnjYTgUm0hVCet1cyhKd73ZA==} + /vite/4.0.4_@types+node@18.11.18: + resolution: {integrity: sha512-xevPU7M8FU0i/80DMR+YhgrzR5KS2ORy1B4xcX/cXLsvnUWvfHuqMmVU6N0YiJ4JWGRJJsLCgjEzKjG9/GKoSw==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true peerDependencies: @@ -15272,7 +15267,7 @@ packages: optional: true dependencies: '@types/node': 18.11.18 - esbuild: 0.16.12 + esbuild: 0.16.17 postcss: 8.4.20 resolve: 1.22.1 rollup: 3.9.0 @@ -15280,8 +15275,8 @@ packages: fsevents: 2.3.2 dev: true - /vite/4.0.3_sass@1.57.1: - resolution: {integrity: sha512-HvuNv1RdE7deIfQb8mPk51UKjqptO/4RXZ5yXSAvurd5xOckwS/gg8h9Tky3uSbnjYTgUm0hVCet1cyhKd73ZA==} + /vite/4.0.4_sass@1.57.1: + resolution: {integrity: sha512-xevPU7M8FU0i/80DMR+YhgrzR5KS2ORy1B4xcX/cXLsvnUWvfHuqMmVU6N0YiJ4JWGRJJsLCgjEzKjG9/GKoSw==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true peerDependencies: @@ -15305,7 +15300,7 @@ packages: terser: optional: true dependencies: - esbuild: 0.16.12 + esbuild: 0.16.17 postcss: 8.4.20 resolve: 1.22.1 rollup: 3.9.0 @@ -15329,14 +15324,14 @@ packages: vue: 3.2.45 dev: false - /vue-eslint-parser/9.1.0_eslint@8.30.0: + /vue-eslint-parser/9.1.0_eslint@8.32.0: resolution: {integrity: sha512-NGn/iQy8/Wb7RrRa4aRkokyCZfOUWk19OP5HP6JEozQFX5AoS/t+Z0ZN7FY4LlmWc4FNI922V7cvX28zctN8dQ==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: '>=6.0.0' dependencies: debug: 4.3.4 - eslint: 8.30.0 + eslint: 8.32.0 eslint-scope: 7.1.1 eslint-visitor-keys: 3.3.0 espree: 9.4.1 @@ -15387,19 +15382,26 @@ packages: '@vue/shared': 3.2.45 dev: false - /vuepress-plugin-comment2/2.0.0-beta.146: - resolution: {integrity: sha512-pGmD5HutR9I/fQ7p4tphqUpehzZl1GQ0W2aYdCbn+fZVTrgm+m6hIkhlQBTR2hREgoOzFOm/0BLN7TM4V5/0cA==} + /vuepress-plugin-comment2/2.0.0-beta.158_aknydt7aotgymh3yxf7whaz6ti: + resolution: {integrity: sha512-4jV/eIx+GnARyusTN/D/I7/Oh6hQ3wOKQqj9Dsivs5ECCFvfQ4DGNl7xz86z3GhpOctBAo+5PmoAUAg3r+zDCQ==} engines: {node: ^14.18.0 || >=16.0.0, npm: '>=8', pnpm: '>=7'} peerDependencies: + '@vuepress/client': 2.0.0-beta.60 sass-loader: ^13.2.0 vuepress: 2.0.0-beta.60 vuepress-vite: 2.0.0-beta.60 vuepress-webpack: 2.0.0-beta.60 peerDependenciesMeta: + '@vuepress/client': + optional: true sass-loader: optional: true vuepress: optional: true + vuepress-plugin-sass-palette: + optional: true + vuepress-shared: + optional: true vuepress-vite: optional: true vuepress-webpack: @@ -15407,64 +15409,72 @@ packages: dependencies: '@vuepress/client': 2.0.0-beta.60 '@vuepress/utils': 2.0.0-beta.60 - '@waline/client': 2.14.4 + '@waline/client': 2.14.7 giscus: 1.2.6 twikoo: 1.6.8 vue: 3.2.45 vue-router: 4.1.6_vue@3.2.45 - vuepress-plugin-sass-palette: 2.0.0-beta.146 - vuepress-shared: 2.0.0-beta.146 + vuepress-plugin-sass-palette: 2.0.0-beta.158_aknydt7aotgymh3yxf7whaz6ti + vuepress-shared: 2.0.0-beta.158_aknydt7aotgymh3yxf7whaz6ti transitivePeerDependencies: - '@vue/composition-api' - supports-color dev: false - /vuepress-plugin-md-enhance/2.0.0-beta.146: - resolution: {integrity: sha512-e5j5ce48K5m6Zs5YIpXmDXDHzoxs5fY9dXNN9sEu0k3sFDVcTJJyx3mh5A3cOLOpJDESzG+y8LpdKCRewYdgHA==} + /vuepress-plugin-md-enhance/2.0.0-beta.158_aknydt7aotgymh3yxf7whaz6ti: + resolution: {integrity: sha512-DRXHZiNoMTW2sHoQQlyWjaE6GEm7SU1QYjUOyaEsfYlm0bNpAJ1TL0JaajqFCQX84KyaltgW/T3eJx9PoShHGw==} engines: {node: ^14.18.0 || >=16.0.0, npm: '>=8', pnpm: '>=7'} peerDependencies: + '@vuepress/client': 2.0.0-beta.60 sass-loader: ^13.2.0 vuepress: 2.0.0-beta.60 vuepress-vite: 2.0.0-beta.60 vuepress-webpack: 2.0.0-beta.60 peerDependenciesMeta: + '@vuepress/client': + optional: true sass-loader: optional: true vuepress: optional: true + vuepress-plugin-sass-palette: + optional: true + vuepress-shared: + optional: true vuepress-vite: optional: true vuepress-webpack: optional: true dependencies: - '@babel/core': 7.20.7 - '@mdit/plugin-align': 0.1.0 - '@mdit/plugin-attrs': 0.1.0 - '@mdit/plugin-container': 0.1.0 - '@mdit/plugin-figure': 0.1.0 - '@mdit/plugin-footnote': 0.1.0 - '@mdit/plugin-img-lazyload': 0.1.0 - '@mdit/plugin-img-mark': 0.1.0 - '@mdit/plugin-img-size': 0.1.0 - '@mdit/plugin-include': 0.1.0 - '@mdit/plugin-katex': 0.1.0 - '@mdit/plugin-mark': 0.1.0 - '@mdit/plugin-mathjax': 0.1.0 - '@mdit/plugin-stylize': 0.1.0 - '@mdit/plugin-sub': 0.1.0 - '@mdit/plugin-sup': 0.1.0 - '@mdit/plugin-tasklist': 0.1.0 - '@mdit/plugin-tex': 0.1.0 - '@mdit/plugin-uml': 0.1.0 + '@babel/core': 7.20.12 + '@mdit/plugin-align': 0.2.3 + '@mdit/plugin-attrs': 0.2.3 + '@mdit/plugin-container': 0.2.3 + '@mdit/plugin-figure': 0.2.3 + '@mdit/plugin-footnote': 0.2.3 + '@mdit/plugin-img-lazyload': 0.2.3 + '@mdit/plugin-img-mark': 0.2.3 + '@mdit/plugin-img-size': 0.2.3 + '@mdit/plugin-include': 0.2.3 + '@mdit/plugin-katex': 0.2.3 + '@mdit/plugin-mark': 0.2.3 + '@mdit/plugin-mathjax': 0.2.3 + '@mdit/plugin-stylize': 0.2.3 + '@mdit/plugin-sub': 0.2.3 + '@mdit/plugin-sup': 0.2.3 + '@mdit/plugin-tab': 0.2.3 + '@mdit/plugin-tasklist': 0.2.3 + '@mdit/plugin-tex': 0.2.3 + '@mdit/plugin-uml': 0.2.3 '@mermaid-js/mermaid-mindmap': 9.3.0 '@types/markdown-it': 12.2.3 '@vue/repl': 1.3.2_vue@3.2.45 '@vuepress/client': 2.0.0-beta.60 '@vuepress/shared': 2.0.0-beta.60 '@vuepress/utils': 2.0.0-beta.60 - '@vueuse/core': 9.9.0_vue@3.2.45 + '@vueuse/core': 9.10.0_vue@3.2.45 balloon-css: 1.2.0 - chart.js: 4.1.1 + chart.js: 4.1.2 echarts: 5.4.1 flowchart.js: 1.17.1 katex: 0.16.4 @@ -15473,15 +15483,15 @@ packages: reveal.js: 4.4.0 vue: 3.2.45 vue-router: 4.1.6_vue@3.2.45 - vuepress-plugin-sass-palette: 2.0.0-beta.146 - vuepress-shared: 2.0.0-beta.146 + vuepress-plugin-sass-palette: 2.0.0-beta.158_aknydt7aotgymh3yxf7whaz6ti + vuepress-shared: 2.0.0-beta.158_aknydt7aotgymh3yxf7whaz6ti transitivePeerDependencies: - '@vue/composition-api' - supports-color dev: false - /vuepress-plugin-sass-palette/2.0.0-beta.146: - resolution: {integrity: sha512-/I3c9fu03aPt6gsf9QdLsBZzqgWQiZpIv7m2HujxPZS4N1imZn/6I5X8irygW++incM2WKci4kd4jGxX1PdsJg==} + /vuepress-plugin-sass-palette/2.0.0-beta.158_aknydt7aotgymh3yxf7whaz6ti: + resolution: {integrity: sha512-yUhWAV+JVAtQ62dubWeebHFHQ6qyNtwNrU6/X/3qo/SR9XTOJ4SUjGzMVsuaYBS7IFwR5IwIl/olHHUMdrj/3g==} engines: {node: ^14.18.0 || >=16.0.0, npm: '>=8', pnpm: '>=7'} peerDependencies: sass-loader: ^13.2.0 @@ -15493,21 +15503,25 @@ packages: optional: true vuepress: optional: true + vuepress-shared: + optional: true vuepress-vite: optional: true vuepress-webpack: optional: true dependencies: + '@vuepress/shared': 2.0.0-beta.60 '@vuepress/utils': 2.0.0-beta.60 chokidar: 3.5.3 sass: 1.57.1 - vuepress-shared: 2.0.0-beta.146 + vuepress-shared: 2.0.0-beta.158_aknydt7aotgymh3yxf7whaz6ti transitivePeerDependencies: + - '@vuepress/client' - supports-color dev: false - /vuepress-plugin-seo2/2.0.0-beta.146: - resolution: {integrity: sha512-d2ZhRTaRp89X+E4KODrIi/RuHvbXSFKwdJPUMkNfVK000ZrRGQA1HY6YUP7R+UYUbgCNzvPGDeQXIpUS+ljt2Q==} + /vuepress-plugin-seo2/2.0.0-beta.158_aknydt7aotgymh3yxf7whaz6ti: + resolution: {integrity: sha512-3DK5D4xTia+LVJVd1pxwBwFQa+Uej6VYgE6nVlV4iQ0DINaaIkZfSILNvHKF5SGM/UirS2Y8wPcgnODOTOGDfg==} engines: {node: ^14.18.0 || >=16.0.0, npm: '>=8', pnpm: '>=7'} peerDependencies: vuepress: 2.0.0-beta.60 @@ -15523,13 +15537,14 @@ packages: dependencies: '@vuepress/shared': 2.0.0-beta.60 '@vuepress/utils': 2.0.0-beta.60 - vuepress-shared: 2.0.0-beta.146 + vuepress-shared: 2.0.0-beta.158_aknydt7aotgymh3yxf7whaz6ti transitivePeerDependencies: + - '@vuepress/client' - supports-color dev: false - /vuepress-plugin-sitemap2/2.0.0-beta.146: - resolution: {integrity: sha512-sbdo5MsYcQ+rQiZbjuJDOX4Kn4oYd6TC8+e0MpSssowC2rVXNg2z+Fu/bmNbCEIifB+iST7qaxwpLtZlSZSFuA==} + /vuepress-plugin-sitemap2/2.0.0-beta.158_aknydt7aotgymh3yxf7whaz6ti: + resolution: {integrity: sha512-ZW1rNUq5l2Ni39N7t9uqIQdhHC7AGgoJyiGa4FwuXbJsnLLvuzecZMQ/vWtZESw/brNutk4fWTzOVdng2xfiaQ==} engines: {node: ^14.18.0 || >=16.0.0, npm: '>=8', pnpm: '>=7'} peerDependencies: vuepress: 2.0.0-beta.60 @@ -15538,6 +15553,8 @@ packages: peerDependenciesMeta: vuepress: optional: true + vuepress-shared: + optional: true vuepress-vite: optional: true vuepress-webpack: @@ -15546,13 +15563,29 @@ packages: '@vuepress/shared': 2.0.0-beta.60 '@vuepress/utils': 2.0.0-beta.60 sitemap: 7.1.1 - vuepress-shared: 2.0.0-beta.146 + vuepress-shared: 2.0.0-beta.158_aknydt7aotgymh3yxf7whaz6ti transitivePeerDependencies: + - '@vuepress/client' - supports-color dev: false - /vuepress-shared/2.0.0-beta.146: - resolution: {integrity: sha512-yCv4qe2gv6p0mYGyXENJWjaWmOXZ1Dn/UeGcosIxqP53xf7hMGvNJgPnhdykiWjs6Cba9vM/bHR1R9aae1BVVg==} + /vuepress-shared/2.0.0-beta.158_aknydt7aotgymh3yxf7whaz6ti: + resolution: {integrity: sha512-AH8VPIq4Hhb08f1Z9ndaToPwfaCH2j9sdaNbyOUMpSdPHtHYjJco3ks7KdJwFcwJhQKOe6liK9k66T4cmlIp/g==} + engines: {node: ^14.18.0 || >=16.0.0, npm: '>=8', pnpm: '>=7'} + peerDependencies: + '@vuepress/client': 2.0.0-beta.60 + vuepress: 2.0.0-beta.60 + vuepress-vite: 2.0.0-beta.60 + vuepress-webpack: 2.0.0-beta.60 + peerDependenciesMeta: + '@vuepress/client': + optional: true + vuepress: + optional: true + vuepress-vite: + optional: true + vuepress-webpack: + optional: true dependencies: '@vuepress/client': 2.0.0-beta.60 '@vuepress/shared': 2.0.0-beta.60 @@ -16028,6 +16061,7 @@ packages: /yaml/1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} + dev: false /yaml/2.2.0: resolution: {integrity: sha512-auf7Gi6QwO7HW//GA9seGvTXVGWl1CM/ADWh1+RxtXr6XOxnT65ovDl9fTi4e0monEyJxCHqDpF6QnFDXmJE4g==} From e5aa0596783b8cea6f71a8a809ee004d5ca3512b Mon Sep 17 00:00:00 2001 From: pengzhanbo Date: Tue, 7 Feb 2023 20:30:29 +0800 Subject: [PATCH 06/29] chore: update dependencies --- docs/package.json | 2 +- packages/plugin-blog-data/package.json | 2 +- packages/plugin-copy-code/package.json | 2 +- packages/plugin-page-collection/package.json | 2 +- packages/theme/package.json | 10 +- pnpm-lock.yaml | 319 ++++++++++--------- 6 files changed, 184 insertions(+), 153 deletions(-) diff --git a/docs/package.json b/docs/package.json index a7b1f29c..70718ebb 100644 --- a/docs/package.json +++ b/docs/package.json @@ -19,6 +19,6 @@ "leancloud-storage": "^4.14.0", "sass": "^1.57.1", "sass-loader": "^13.2.0", - "vue": "^3.2.45" + "vue": "^3.2.47" } } diff --git a/packages/plugin-blog-data/package.json b/packages/plugin-blog-data/package.json index 460fcb6a..2f1fef86 100644 --- a/packages/plugin-blog-data/package.json +++ b/packages/plugin-blog-data/package.json @@ -37,7 +37,7 @@ "@vuepress/utils": "2.0.0-beta.60", "chokidar": "^3.5.3", "glob-to-regexp": "^0.4.1", - "vue": "^3.2.45" + "vue": "^3.2.47" }, "publishConfig": { "access": "public" diff --git a/packages/plugin-copy-code/package.json b/packages/plugin-copy-code/package.json index 6a97f7f0..700ca3b7 100644 --- a/packages/plugin-copy-code/package.json +++ b/packages/plugin-copy-code/package.json @@ -34,7 +34,7 @@ "@vuepress/core": "2.0.0-beta.60", "@vuepress/shared": "2.0.0-beta.60", "@vuepress/utils": "2.0.0-beta.60", - "vue": "^3.2.45", + "vue": "^3.2.47", "vue-router": "4.1.6" }, "publishConfig": { diff --git a/packages/plugin-page-collection/package.json b/packages/plugin-page-collection/package.json index 812a22e5..c39b5ae5 100644 --- a/packages/plugin-page-collection/package.json +++ b/packages/plugin-page-collection/package.json @@ -38,7 +38,7 @@ "@vuepress/shared": "2.0.0-beta.60", "@vuepress/utils": "2.0.0-beta.60", "leancloud-storage": "^4.14.0", - "vue": "^3.2.45", + "vue": "^3.2.47", "vue-router": "4.1.6" }, "publishConfig": { diff --git a/packages/theme/package.json b/packages/theme/package.json index 4ccbe96e..b497263c 100644 --- a/packages/theme/package.json +++ b/packages/theme/package.json @@ -60,12 +60,12 @@ "date-fns": "^2.29.3", "nanoid": "^4.0.0", "ts-debounce": "^4.0.0", - "vue": "^3.2.45", + "vue": "^3.2.47", "vue-router": "4.1.6", - "vuepress-plugin-comment2": "2.0.0-beta.158", - "vuepress-plugin-md-enhance": "2.0.0-beta.158", - "vuepress-plugin-seo2": "2.0.0-beta.158", - "vuepress-plugin-sitemap2": "2.0.0-beta.158", + "vuepress-plugin-comment2": "2.0.0-beta.166", + "vuepress-plugin-md-enhance": "2.0.0-beta.166", + "vuepress-plugin-seo2": "2.0.0-beta.166", + "vuepress-plugin-sitemap2": "2.0.0-beta.166", "windicss": "^3.5.6" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fd258a67..e27316e1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -82,7 +82,7 @@ importers: leancloud-storage: ^4.14.0 sass: ^1.57.1 sass-loader: ^13.2.0 - vue: ^3.2.45 + vue: ^3.2.47 dependencies: '@vuepress-plume/vuepress-theme-plume': link:../packages/theme '@vuepress/bundler-vite': 2.0.0-beta.60_sass@1.57.1 @@ -94,7 +94,7 @@ importers: leancloud-storage: 4.14.0 sass: 1.57.1 sass-loader: 13.2.0_sass@1.57.1 - vue: 3.2.45 + vue: 3.2.47 packages/plugin-auto-frontmatter: specifiers: @@ -133,7 +133,7 @@ importers: '@vuepress/utils': 2.0.0-beta.60 chokidar: ^3.5.3 glob-to-regexp: ^0.4.1 - vue: ^3.2.45 + vue: ^3.2.47 dependencies: '@vue/devtools-api': 6.4.5 '@vuepress/client': 2.0.0-beta.60 @@ -142,7 +142,7 @@ importers: '@vuepress/utils': 2.0.0-beta.60 chokidar: 3.5.3 glob-to-regexp: 0.4.1 - vue: 3.2.45 + vue: 3.2.47 packages/plugin-caniuse: specifiers: @@ -166,15 +166,15 @@ importers: '@vuepress/core': 2.0.0-beta.60 '@vuepress/shared': 2.0.0-beta.60 '@vuepress/utils': 2.0.0-beta.60 - vue: ^3.2.45 + vue: ^3.2.47 vue-router: 4.1.6 dependencies: '@vuepress/client': 2.0.0-beta.60 '@vuepress/core': 2.0.0-beta.60 '@vuepress/shared': 2.0.0-beta.60 '@vuepress/utils': 2.0.0-beta.60 - vue: 3.2.45 - vue-router: 4.1.6_vue@3.2.45 + vue: 3.2.47 + vue-router: 4.1.6_vue@3.2.47 packages/plugin-netlify-functions: specifiers: @@ -221,7 +221,7 @@ importers: '@vuepress/shared': 2.0.0-beta.60 '@vuepress/utils': 2.0.0-beta.60 leancloud-storage: ^4.14.0 - vue: ^3.2.45 + vue: ^3.2.47 vue-router: 4.1.6 dependencies: '@netlify/functions': 1.4.0 @@ -231,8 +231,8 @@ importers: '@vuepress/shared': 2.0.0-beta.60 '@vuepress/utils': 2.0.0-beta.60 leancloud-storage: 4.14.0 - vue: 3.2.45 - vue-router: 4.1.6_vue@3.2.45 + vue: 3.2.47 + vue-router: 4.1.6_vue@3.2.47 packages/plugin-windicss: specifiers: @@ -281,12 +281,12 @@ importers: date-fns: ^2.29.3 nanoid: ^4.0.0 ts-debounce: ^4.0.0 - vue: ^3.2.45 + vue: ^3.2.47 vue-router: 4.1.6 - vuepress-plugin-comment2: 2.0.0-beta.158 - vuepress-plugin-md-enhance: 2.0.0-beta.158 - vuepress-plugin-seo2: 2.0.0-beta.158 - vuepress-plugin-sitemap2: 2.0.0-beta.158 + vuepress-plugin-comment2: 2.0.0-beta.166 + vuepress-plugin-md-enhance: 2.0.0-beta.166 + vuepress-plugin-seo2: 2.0.0-beta.166 + vuepress-plugin-sitemap2: 2.0.0-beta.166 windicss: ^3.5.6 dependencies: '@types/lodash.merge': 4.6.7 @@ -312,16 +312,16 @@ importers: '@vuepress/plugin-toc': 2.0.0-beta.60 '@vuepress/shared': 2.0.0-beta.60 '@vuepress/utils': 2.0.0-beta.60 - '@vueuse/core': 9.10.0_vue@3.2.45 + '@vueuse/core': 9.10.0_vue@3.2.47 date-fns: 2.29.3 nanoid: 4.0.0 ts-debounce: 4.0.0 - vue: 3.2.45 - vue-router: 4.1.6_vue@3.2.45 - vuepress-plugin-comment2: 2.0.0-beta.158_aknydt7aotgymh3yxf7whaz6ti - vuepress-plugin-md-enhance: 2.0.0-beta.158_aknydt7aotgymh3yxf7whaz6ti - vuepress-plugin-seo2: 2.0.0-beta.158_aknydt7aotgymh3yxf7whaz6ti - vuepress-plugin-sitemap2: 2.0.0-beta.158_aknydt7aotgymh3yxf7whaz6ti + vue: 3.2.47 + vue-router: 4.1.6_vue@3.2.47 + vuepress-plugin-comment2: 2.0.0-beta.166_aknydt7aotgymh3yxf7whaz6ti + vuepress-plugin-md-enhance: 2.0.0-beta.166_aknydt7aotgymh3yxf7whaz6ti + vuepress-plugin-seo2: 2.0.0-beta.166_aknydt7aotgymh3yxf7whaz6ti + vuepress-plugin-sitemap2: 2.0.0-beta.166_aknydt7aotgymh3yxf7whaz6ti windicss: 3.5.6 packages: @@ -2895,6 +2895,10 @@ packages: resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} dev: false + /@types/raphael/2.3.3: + resolution: {integrity: sha512-Rhvq0q6wzyvipejki/9w87/pgapyE+s3gO66tdl1oD3qDrow+ek+4vVYAbRkeL58HCCK9EOZKwyjqYJ/TFkmtQ==} + dev: false + /@types/responselike/1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} dependencies: @@ -3178,7 +3182,7 @@ packages: - supports-color dev: false - /@vitejs/plugin-vue/4.0.0_vite@4.0.4+vue@3.2.45: + /@vitejs/plugin-vue/4.0.0_vite@4.0.4+vue@3.2.47: resolution: {integrity: sha512-e0X4jErIxAB5oLtDqbHvHpJe/uWNkdpYV83AOG2xo2tEVSzCzewgJMtREZM30wXnM5ls90hxiOtAuVU6H5JgbA==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -3186,108 +3190,108 @@ packages: vue: ^3.2.25 dependencies: vite: 4.0.4_sass@1.57.1 - vue: 3.2.45 + vue: 3.2.47 dev: false - /@vue/compiler-core/3.2.45: - resolution: {integrity: sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A==} + /@vue/compiler-core/3.2.47: + resolution: {integrity: sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==} dependencies: '@babel/parser': 7.20.7 - '@vue/shared': 3.2.45 + '@vue/shared': 3.2.47 estree-walker: 2.0.2 source-map: 0.6.1 dev: false - /@vue/compiler-dom/3.2.45: - resolution: {integrity: sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw==} + /@vue/compiler-dom/3.2.47: + resolution: {integrity: sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==} dependencies: - '@vue/compiler-core': 3.2.45 - '@vue/shared': 3.2.45 + '@vue/compiler-core': 3.2.47 + '@vue/shared': 3.2.47 dev: false - /@vue/compiler-sfc/3.2.45: - resolution: {integrity: sha512-1jXDuWah1ggsnSAOGsec8cFjT/K6TMZ0sPL3o3d84Ft2AYZi2jWJgRMjw4iaK0rBfA89L5gw427H4n1RZQBu6Q==} + /@vue/compiler-sfc/3.2.47: + resolution: {integrity: sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==} dependencies: '@babel/parser': 7.20.7 - '@vue/compiler-core': 3.2.45 - '@vue/compiler-dom': 3.2.45 - '@vue/compiler-ssr': 3.2.45 - '@vue/reactivity-transform': 3.2.45 - '@vue/shared': 3.2.45 + '@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 estree-walker: 2.0.2 magic-string: 0.25.9 postcss: 8.4.20 source-map: 0.6.1 dev: false - /@vue/compiler-ssr/3.2.45: - resolution: {integrity: sha512-6BRaggEGqhWht3lt24CrIbQSRD5O07MTmd+LjAn5fJj568+R9eUD2F7wMQJjX859seSlrYog7sUtrZSd7feqrQ==} + /@vue/compiler-ssr/3.2.47: + resolution: {integrity: sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==} dependencies: - '@vue/compiler-dom': 3.2.45 - '@vue/shared': 3.2.45 + '@vue/compiler-dom': 3.2.47 + '@vue/shared': 3.2.47 dev: false /@vue/devtools-api/6.4.5: resolution: {integrity: sha512-JD5fcdIuFxU4fQyXUu3w2KpAJHzTVdN+p4iOX2lMWSHMOoQdMAcpFLZzm9Z/2nmsoZ1a96QEhZ26e50xLBsgOQ==} dev: false - /@vue/reactivity-transform/3.2.45: - resolution: {integrity: sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ==} + /@vue/reactivity-transform/3.2.47: + resolution: {integrity: sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==} dependencies: '@babel/parser': 7.20.7 - '@vue/compiler-core': 3.2.45 - '@vue/shared': 3.2.45 + '@vue/compiler-core': 3.2.47 + '@vue/shared': 3.2.47 estree-walker: 2.0.2 magic-string: 0.25.9 dev: false - /@vue/reactivity/3.2.45: - resolution: {integrity: sha512-PRvhCcQcyEVohW0P8iQ7HDcIOXRjZfAsOds3N99X/Dzewy8TVhTCT4uXpAHfoKjVTJRA0O0K+6QNkDIZAxNi3A==} + /@vue/reactivity/3.2.47: + resolution: {integrity: sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==} dependencies: - '@vue/shared': 3.2.45 + '@vue/shared': 3.2.47 dev: false - /@vue/repl/1.3.2_vue@3.2.45: + /@vue/repl/1.3.2_vue@3.2.47: resolution: {integrity: sha512-5joGOuTFmjaugG3E1h/oP1EXSMcVXRUwLIoo8xvYQnqDrCT6g1SfsH1pfei5PpC5DUxMX1584CekZu6REgGYkQ==} peerDependencies: vue: ^3.2.13 dependencies: - vue: 3.2.45 + vue: 3.2.47 dev: false - /@vue/runtime-core/3.2.45: - resolution: {integrity: sha512-gzJiTA3f74cgARptqzYswmoQx0fIA+gGYBfokYVhF8YSXjWTUA2SngRzZRku2HbGbjzB6LBYSbKGIaK8IW+s0A==} + /@vue/runtime-core/3.2.47: + resolution: {integrity: sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==} dependencies: - '@vue/reactivity': 3.2.45 - '@vue/shared': 3.2.45 + '@vue/reactivity': 3.2.47 + '@vue/shared': 3.2.47 dev: false - /@vue/runtime-dom/3.2.45: - resolution: {integrity: sha512-cy88YpfP5Ue2bDBbj75Cb4bIEZUMM/mAkDMfqDTpUYVgTf/kuQ2VQ8LebuZ8k6EudgH8pYhsGWHlY0lcxlvTwA==} + /@vue/runtime-dom/3.2.47: + resolution: {integrity: sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==} dependencies: - '@vue/runtime-core': 3.2.45 - '@vue/shared': 3.2.45 + '@vue/runtime-core': 3.2.47 + '@vue/shared': 3.2.47 csstype: 2.6.20 dev: false - /@vue/server-renderer/3.2.45_vue@3.2.45: - resolution: {integrity: sha512-ebiMq7q24WBU1D6uhPK//2OTR1iRIyxjF5iVq/1a5I1SDMDyDu4Ts6fJaMnjrvD3MqnaiFkKQj+LKAgz5WIK3g==} + /@vue/server-renderer/3.2.47_vue@3.2.47: + resolution: {integrity: sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==} peerDependencies: - vue: 3.2.45 + vue: 3.2.47 dependencies: - '@vue/compiler-ssr': 3.2.45 - '@vue/shared': 3.2.45 - vue: 3.2.45 + '@vue/compiler-ssr': 3.2.47 + '@vue/shared': 3.2.47 + vue: 3.2.47 dev: false - /@vue/shared/3.2.45: - resolution: {integrity: sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==} + /@vue/shared/3.2.47: + resolution: {integrity: sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==} dev: false /@vuepress/bundler-vite/2.0.0-beta.60_sass@1.57.1: resolution: {integrity: sha512-nf+UAKNlAEZXZqu2Ztvr8Hg/5CtevWxvQGfYKV4lhw8UmoDjKKHoHPpPhF1QTUbnZ8W+jPLzIVz+hjunzsxl/A==} dependencies: - '@vitejs/plugin-vue': 4.0.0_vite@4.0.4+vue@3.2.45 + '@vitejs/plugin-vue': 4.0.0_vite@4.0.4+vue@3.2.47 '@vuepress/client': 2.0.0-beta.60 '@vuepress/core': 2.0.0-beta.60 '@vuepress/shared': 2.0.0-beta.60 @@ -3298,8 +3302,8 @@ packages: postcss-load-config: 4.0.1_postcss@8.4.20 rollup: 3.9.0 vite: 4.0.4_sass@1.57.1 - vue: 3.2.45 - vue-router: 4.1.6_vue@3.2.45 + vue: 3.2.47 + vue-router: 4.1.6_vue@3.2.47 transitivePeerDependencies: - '@types/node' - less @@ -3332,9 +3336,9 @@ packages: postcss-csso: 6.0.1_postcss@8.4.20 postcss-loader: 7.0.2_qxxfhhrl3yknjjmta266mo3u64 style-loader: 3.3.1_webpack@5.75.0 - vue: 3.2.45 - vue-loader: 17.0.1_vue@3.2.45+webpack@5.75.0 - vue-router: 4.1.6_vue@3.2.45 + vue: 3.2.47 + vue-loader: 17.0.1_vue@3.2.47+webpack@5.75.0 + vue-router: 4.1.6_vue@3.2.47 webpack: 5.75.0 webpack-chain: 6.5.1 webpack-dev-server: 4.11.1_webpack@5.75.0 @@ -3371,8 +3375,8 @@ packages: dependencies: '@vue/devtools-api': 6.4.5 '@vuepress/shared': 2.0.0-beta.60 - vue: 3.2.45 - vue-router: 4.1.6_vue@3.2.45 + vue: 3.2.47 + vue-router: 4.1.6_vue@3.2.47 dev: false /@vuepress/core/2.0.0-beta.60: @@ -3382,7 +3386,7 @@ packages: '@vuepress/markdown': 2.0.0-beta.60 '@vuepress/shared': 2.0.0-beta.60 '@vuepress/utils': 2.0.0-beta.60 - vue: 3.2.45 + vue: 3.2.47 transitivePeerDependencies: - supports-color dev: false @@ -3417,8 +3421,8 @@ packages: '@vuepress/core': 2.0.0-beta.60 '@vuepress/utils': 2.0.0-beta.60 ts-debounce: 4.0.0 - vue: 3.2.45 - vue-router: 4.1.6_vue@3.2.45 + vue: 3.2.47 + vue-router: 4.1.6_vue@3.2.47 transitivePeerDependencies: - supports-color dev: false @@ -3448,8 +3452,8 @@ packages: '@vuepress/shared': 2.0.0-beta.60 '@vuepress/utils': 2.0.0-beta.60 ts-debounce: 4.0.0 - vue: 3.2.45 - vue-router: 4.1.6_vue@3.2.45 + vue: 3.2.47 + vue-router: 4.1.6_vue@3.2.47 transitivePeerDependencies: - '@algolia/client-search' - '@types/react' @@ -3466,7 +3470,7 @@ packages: '@vuepress/markdown': 2.0.0-beta.60 '@vuepress/shared': 2.0.0-beta.60 '@vuepress/utils': 2.0.0-beta.60 - vue: 3.2.45 + vue: 3.2.47 transitivePeerDependencies: - supports-color dev: false @@ -3488,7 +3492,7 @@ packages: '@vuepress/core': 2.0.0-beta.60 '@vuepress/utils': 2.0.0-beta.60 medium-zoom: 1.0.8 - vue: 3.2.45 + vue: 3.2.47 transitivePeerDependencies: - supports-color dev: false @@ -3499,8 +3503,8 @@ packages: '@vuepress/client': 2.0.0-beta.60 '@vuepress/core': 2.0.0-beta.60 '@vuepress/utils': 2.0.0-beta.60 - vue: 3.2.45 - vue-router: 4.1.6_vue@3.2.45 + vue: 3.2.47 + vue-router: 4.1.6_vue@3.2.47 transitivePeerDependencies: - supports-color dev: false @@ -3532,8 +3536,8 @@ packages: '@vuepress/shared': 2.0.0-beta.60 '@vuepress/utils': 2.0.0-beta.60 chokidar: 3.5.3 - vue: 3.2.45 - vue-router: 4.1.6_vue@3.2.45 + vue: 3.2.47 + vue-router: 4.1.6_vue@3.2.47 transitivePeerDependencies: - supports-color dev: false @@ -3546,7 +3550,7 @@ packages: '@vuepress/core': 2.0.0-beta.60 '@vuepress/shared': 2.0.0-beta.60 '@vuepress/utils': 2.0.0-beta.60 - vue: 3.2.45 + vue: 3.2.47 transitivePeerDependencies: - supports-color dev: false @@ -3557,8 +3561,8 @@ packages: '@vuepress/client': 2.0.0-beta.60 '@vuepress/core': 2.0.0-beta.60 '@vuepress/utils': 2.0.0-beta.60 - vue: 3.2.45 - vue-router: 4.1.6_vue@3.2.45 + vue: 3.2.47 + vue-router: 4.1.6_vue@3.2.47 transitivePeerDependencies: - supports-color dev: false @@ -3567,7 +3571,7 @@ packages: resolution: {integrity: sha512-bwFksEtSQpbyAGJZkvRK9Z2zGmS144nv759vOzbRUZPPlGffeauzrPw9w7wxqp3gTJvIE/4Ufqt0AZTuSP/F/g==} dependencies: '@mdit-vue/types': 0.11.0 - '@vue/shared': 3.2.45 + '@vue/shared': 3.2.47 dev: false /@vuepress/utils/2.0.0-beta.60: @@ -3588,13 +3592,25 @@ packages: - supports-color dev: false - /@vueuse/core/9.10.0_vue@3.2.45: + /@vueuse/core/9.10.0_vue@3.2.47: resolution: {integrity: sha512-CxMewME07qeuzuT/AOIQGv0EhhDoojniqU6pC3F8m5VC76L47UT18DcX88kWlP3I7d3qMJ4u/PD8iSRsy3bmNA==} dependencies: '@types/web-bluetooth': 0.0.16 '@vueuse/metadata': 9.10.0 - '@vueuse/shared': 9.10.0_vue@3.2.45 - vue-demi: 0.13.6_vue@3.2.45 + '@vueuse/shared': 9.10.0_vue@3.2.47 + vue-demi: 0.13.6_vue@3.2.47 + transitivePeerDependencies: + - '@vue/composition-api' + - vue + dev: false + + /@vueuse/core/9.12.0_vue@3.2.47: + resolution: {integrity: sha512-h/Di8Bvf6xRcvS/PvUVheiMYYz3U0tH3X25YxONSaAUBa841ayMwxkuzx/DGUMCW/wHWzD8tRy2zYmOC36r4sg==} + dependencies: + '@types/web-bluetooth': 0.0.16 + '@vueuse/metadata': 9.12.0 + '@vueuse/shared': 9.12.0_vue@3.2.47 + vue-demi: 0.13.6_vue@3.2.47 transitivePeerDependencies: - '@vue/composition-api' - vue @@ -3604,10 +3620,23 @@ packages: resolution: {integrity: sha512-G5VZhgTCapzU9rv0Iq2HBrVOSGzOKb+OE668NxhXNcTjUjwYxULkEhAw70FtRLMZc+hxcFAzDZlKYA0xcwNMuw==} dev: false - /@vueuse/shared/9.10.0_vue@3.2.45: + /@vueuse/metadata/9.12.0: + resolution: {integrity: sha512-9oJ9MM9lFLlmvxXUqsR1wLt1uF7EVbP5iYaHJYqk+G2PbMjY6EXvZeTjbdO89HgoF5cI6z49o2zT/jD9SVoNpQ==} + dev: false + + /@vueuse/shared/9.10.0_vue@3.2.47: resolution: {integrity: sha512-vakHJ2ZRklAzqmcVBL38RS7BxdBA4+5poG9NsSyqJxrt9kz0zX3P5CXMy0Hm6LFbZXUgvKdqAS3pUH1zX/5qTQ==} dependencies: - vue-demi: 0.13.6_vue@3.2.45 + vue-demi: 0.13.6_vue@3.2.47 + transitivePeerDependencies: + - '@vue/composition-api' + - vue + dev: false + + /@vueuse/shared/9.12.0_vue@3.2.47: + resolution: {integrity: sha512-TWuJLACQ0BVithVTRbex4Wf1a1VaRuSpVeyEd4vMUWl54PzlE0ciFUshKCXnlLuD0lxIaLK4Ypj3NXYzZh4+SQ==} + dependencies: + vue-demi: 0.13.6_vue@3.2.47 transitivePeerDependencies: - '@vue/composition-api' - vue @@ -3617,10 +3646,10 @@ packages: resolution: {integrity: sha512-hTfh2AbWQCX/oS4Hgr0W9cf79pHYf7X6Km5AcBDAmOL6AI7a5kP9qo9y2mcEzdfn9LK06P5Uuk8HY8vxQbgcrA==} engines: {node: '>=14'} dependencies: - '@vueuse/core': 9.10.0_vue@3.2.45 + '@vueuse/core': 9.12.0_vue@3.2.47 autosize: 5.0.2 marked: 4.2.5 - vue: 3.2.45 + vue: 3.2.47 transitivePeerDependencies: - '@vue/composition-api' dev: false @@ -4882,8 +4911,8 @@ packages: resolution: {integrity: sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=} dev: false - /chart.js/4.1.2: - resolution: {integrity: sha512-9L1w6WLPq6ztiWVVOYtDtpo0CUsBKDWPrUEdwChAyzczaikqeSwNKEv3QpJ7EO4ICcLSi6UDVhgvcnUhRJidRA==} + /chart.js/4.2.0: + resolution: {integrity: sha512-wbtcV+QKeH0F7gQZaCJEIpsNriFheacouJQTVIjITi3eQA8bTlIBoknz0+dgV79aeKLNMAX+nDslIVE/nJ3rzA==} engines: {pnpm: ^7.0.0} dependencies: '@kurkle/color': 0.3.1 @@ -8301,11 +8330,12 @@ packages: resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} dev: true - /flowchart.js/1.17.1: - resolution: {integrity: sha512-zphTaxdyqvHHu+8Cdf6HvamhArXpq9SyNe1zQ61maCIfTenaj3cMvjS1e/0gfPj7QTLTx3HroSzVqDXpL8naoQ==} - engines: {node: '>=4.0.0'} + /flowchart.ts/0.1.2: + resolution: {integrity: sha512-4N8U2gXTkWUYh57SkCYwnSBM2B9Djia+JjClx/rLA13m0xz2S5BZht/9DvTZH5yXGZkmk7NGxGB15tnbUSI6mg==} dependencies: + '@types/raphael': 2.3.3 raphael: 2.3.0 + tslib: 2.4.1 dev: false /flush-write-stream/2.0.0: @@ -15309,7 +15339,7 @@ packages: fsevents: 2.3.2 dev: false - /vue-demi/0.13.6_vue@3.2.45: + /vue-demi/0.13.6_vue@3.2.47: resolution: {integrity: sha512-02NYpxgyGE2kKGegRPYlNQSL1UWfA/+JqvzhGCOYjhfbLWXU5QQX0+9pAm/R2sCOPKr5NBxVIab7fvFU0B1RxQ==} engines: {node: '>=12'} hasBin: true @@ -15321,7 +15351,7 @@ packages: '@vue/composition-api': optional: true dependencies: - vue: 3.2.45 + vue: 3.2.47 dev: false /vue-eslint-parser/9.1.0_eslint@8.32.0: @@ -15342,7 +15372,7 @@ packages: - supports-color dev: true - /vue-loader/17.0.1_vue@3.2.45+webpack@5.75.0: + /vue-loader/17.0.1_vue@3.2.47+webpack@5.75.0: resolution: {integrity: sha512-/OOyugJnImKCkAKrAvdsWMuwoCqGxWT5USLsjohzWbMgOwpA5wQmzQiLMzZd7DjhIfunzAGIApTOgIylz/kwcg==} peerDependencies: '@vue/compiler-sfc': '*' @@ -15359,31 +15389,31 @@ packages: chalk: 4.1.2 hash-sum: 2.0.0 loader-utils: 2.0.2 - vue: 3.2.45 + vue: 3.2.47 webpack: 5.75.0 dev: false - /vue-router/4.1.6_vue@3.2.45: + /vue-router/4.1.6_vue@3.2.47: resolution: {integrity: sha512-DYWYwsG6xNPmLq/FmZn8Ip+qrhFEzA14EI12MsMgVxvHFDYvlr4NXpVF5hrRH1wVcDP8fGi5F4rxuJSl8/r+EQ==} peerDependencies: vue: ^3.2.0 dependencies: '@vue/devtools-api': 6.4.5 - vue: 3.2.45 + vue: 3.2.47 dev: false - /vue/3.2.45: - resolution: {integrity: sha512-9Nx/Mg2b2xWlXykmCwiTUCWHbWIj53bnkizBxKai1g61f2Xit700A1ljowpTIM11e3uipOeiPcSqnmBg6gyiaA==} + /vue/3.2.47: + resolution: {integrity: sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==} dependencies: - '@vue/compiler-dom': 3.2.45 - '@vue/compiler-sfc': 3.2.45 - '@vue/runtime-dom': 3.2.45 - '@vue/server-renderer': 3.2.45_vue@3.2.45 - '@vue/shared': 3.2.45 + '@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 dev: false - /vuepress-plugin-comment2/2.0.0-beta.158_aknydt7aotgymh3yxf7whaz6ti: - resolution: {integrity: sha512-4jV/eIx+GnARyusTN/D/I7/Oh6hQ3wOKQqj9Dsivs5ECCFvfQ4DGNl7xz86z3GhpOctBAo+5PmoAUAg3r+zDCQ==} + /vuepress-plugin-comment2/2.0.0-beta.166_aknydt7aotgymh3yxf7whaz6ti: + resolution: {integrity: sha512-EWWlRbD6a2hJcoI0Pf/Vyea6wqBHRvHS8RRi+jtly5WhxutmxhQA0Byy2qfrTb6sKpuQ0HqK9eIgTdn3KJBZRA==} engines: {node: ^14.18.0 || >=16.0.0, npm: '>=8', pnpm: '>=7'} peerDependencies: '@vuepress/client': 2.0.0-beta.60 @@ -15408,21 +15438,22 @@ packages: optional: true dependencies: '@vuepress/client': 2.0.0-beta.60 + '@vuepress/shared': 2.0.0-beta.60 '@vuepress/utils': 2.0.0-beta.60 '@waline/client': 2.14.7 giscus: 1.2.6 twikoo: 1.6.8 - vue: 3.2.45 - vue-router: 4.1.6_vue@3.2.45 - vuepress-plugin-sass-palette: 2.0.0-beta.158_aknydt7aotgymh3yxf7whaz6ti - vuepress-shared: 2.0.0-beta.158_aknydt7aotgymh3yxf7whaz6ti + vue: 3.2.47 + vue-router: 4.1.6_vue@3.2.47 + vuepress-plugin-sass-palette: 2.0.0-beta.166_aknydt7aotgymh3yxf7whaz6ti + vuepress-shared: 2.0.0-beta.166_aknydt7aotgymh3yxf7whaz6ti transitivePeerDependencies: - '@vue/composition-api' - supports-color dev: false - /vuepress-plugin-md-enhance/2.0.0-beta.158_aknydt7aotgymh3yxf7whaz6ti: - resolution: {integrity: sha512-DRXHZiNoMTW2sHoQQlyWjaE6GEm7SU1QYjUOyaEsfYlm0bNpAJ1TL0JaajqFCQX84KyaltgW/T3eJx9PoShHGw==} + /vuepress-plugin-md-enhance/2.0.0-beta.166_aknydt7aotgymh3yxf7whaz6ti: + resolution: {integrity: sha512-t9tKfLR8c83y11CeUOjiSpl82ZdLgspDQKENHU0StHSsbNloG2VcvuO9zerebgYbA+59aCKlJS870qG+ajkNFg==} engines: {node: ^14.18.0 || >=16.0.0, npm: '>=8', pnpm: '>=7'} peerDependencies: '@vuepress/client': 2.0.0-beta.60 @@ -15468,30 +15499,30 @@ packages: '@mdit/plugin-uml': 0.2.3 '@mermaid-js/mermaid-mindmap': 9.3.0 '@types/markdown-it': 12.2.3 - '@vue/repl': 1.3.2_vue@3.2.45 + '@vue/repl': 1.3.2_vue@3.2.47 '@vuepress/client': 2.0.0-beta.60 '@vuepress/shared': 2.0.0-beta.60 '@vuepress/utils': 2.0.0-beta.60 - '@vueuse/core': 9.10.0_vue@3.2.45 + '@vueuse/core': 9.12.0_vue@3.2.47 balloon-css: 1.2.0 - chart.js: 4.1.2 + chart.js: 4.2.0 echarts: 5.4.1 - flowchart.js: 1.17.1 + flowchart.ts: 0.1.2 katex: 0.16.4 markdown-it: 13.0.1 mermaid: 9.3.0 reveal.js: 4.4.0 - vue: 3.2.45 - vue-router: 4.1.6_vue@3.2.45 - vuepress-plugin-sass-palette: 2.0.0-beta.158_aknydt7aotgymh3yxf7whaz6ti - vuepress-shared: 2.0.0-beta.158_aknydt7aotgymh3yxf7whaz6ti + vue: 3.2.47 + vue-router: 4.1.6_vue@3.2.47 + vuepress-plugin-sass-palette: 2.0.0-beta.166_aknydt7aotgymh3yxf7whaz6ti + vuepress-shared: 2.0.0-beta.166_aknydt7aotgymh3yxf7whaz6ti transitivePeerDependencies: - '@vue/composition-api' - supports-color dev: false - /vuepress-plugin-sass-palette/2.0.0-beta.158_aknydt7aotgymh3yxf7whaz6ti: - resolution: {integrity: sha512-yUhWAV+JVAtQ62dubWeebHFHQ6qyNtwNrU6/X/3qo/SR9XTOJ4SUjGzMVsuaYBS7IFwR5IwIl/olHHUMdrj/3g==} + /vuepress-plugin-sass-palette/2.0.0-beta.166_aknydt7aotgymh3yxf7whaz6ti: + resolution: {integrity: sha512-sO8s0tbGMFHIKzeblDX29Ba/qHzyNbWtJqoKu+aTcMObc4uc1yVqmjrNTnvFDAmFaM4LmgxZ51iQqm0SZnfvSw==} engines: {node: ^14.18.0 || >=16.0.0, npm: '>=8', pnpm: '>=7'} peerDependencies: sass-loader: ^13.2.0 @@ -15514,14 +15545,14 @@ packages: '@vuepress/utils': 2.0.0-beta.60 chokidar: 3.5.3 sass: 1.57.1 - vuepress-shared: 2.0.0-beta.158_aknydt7aotgymh3yxf7whaz6ti + vuepress-shared: 2.0.0-beta.166_aknydt7aotgymh3yxf7whaz6ti transitivePeerDependencies: - '@vuepress/client' - supports-color dev: false - /vuepress-plugin-seo2/2.0.0-beta.158_aknydt7aotgymh3yxf7whaz6ti: - resolution: {integrity: sha512-3DK5D4xTia+LVJVd1pxwBwFQa+Uej6VYgE6nVlV4iQ0DINaaIkZfSILNvHKF5SGM/UirS2Y8wPcgnODOTOGDfg==} + /vuepress-plugin-seo2/2.0.0-beta.166_aknydt7aotgymh3yxf7whaz6ti: + resolution: {integrity: sha512-+jC17xWqyEBMgbvWmGud6mzDmAHE7IaOY/S34izeq3ZTVm4hhW1KxjFRyv6tIhA/GMXq/yBWSqEx9NUI9oVg0g==} engines: {node: ^14.18.0 || >=16.0.0, npm: '>=8', pnpm: '>=7'} peerDependencies: vuepress: 2.0.0-beta.60 @@ -15537,14 +15568,14 @@ packages: dependencies: '@vuepress/shared': 2.0.0-beta.60 '@vuepress/utils': 2.0.0-beta.60 - vuepress-shared: 2.0.0-beta.158_aknydt7aotgymh3yxf7whaz6ti + vuepress-shared: 2.0.0-beta.166_aknydt7aotgymh3yxf7whaz6ti transitivePeerDependencies: - '@vuepress/client' - supports-color dev: false - /vuepress-plugin-sitemap2/2.0.0-beta.158_aknydt7aotgymh3yxf7whaz6ti: - resolution: {integrity: sha512-ZW1rNUq5l2Ni39N7t9uqIQdhHC7AGgoJyiGa4FwuXbJsnLLvuzecZMQ/vWtZESw/brNutk4fWTzOVdng2xfiaQ==} + /vuepress-plugin-sitemap2/2.0.0-beta.166_aknydt7aotgymh3yxf7whaz6ti: + resolution: {integrity: sha512-mVruZNQYPuIA95C9AC73MCBoOqG4A87XbhpEA6hXgIDrPeJ8B5P8xD2OPbQ4yZx93o0hMyD8/L4huwpPSPFdAA==} engines: {node: ^14.18.0 || >=16.0.0, npm: '>=8', pnpm: '>=7'} peerDependencies: vuepress: 2.0.0-beta.60 @@ -15563,14 +15594,14 @@ packages: '@vuepress/shared': 2.0.0-beta.60 '@vuepress/utils': 2.0.0-beta.60 sitemap: 7.1.1 - vuepress-shared: 2.0.0-beta.158_aknydt7aotgymh3yxf7whaz6ti + vuepress-shared: 2.0.0-beta.166_aknydt7aotgymh3yxf7whaz6ti transitivePeerDependencies: - '@vuepress/client' - supports-color dev: false - /vuepress-shared/2.0.0-beta.158_aknydt7aotgymh3yxf7whaz6ti: - resolution: {integrity: sha512-AH8VPIq4Hhb08f1Z9ndaToPwfaCH2j9sdaNbyOUMpSdPHtHYjJco3ks7KdJwFcwJhQKOe6liK9k66T4cmlIp/g==} + /vuepress-shared/2.0.0-beta.166_aknydt7aotgymh3yxf7whaz6ti: + resolution: {integrity: sha512-lfDVG2I5RbXrBGIVeF6WjcAzR8IT3nyWFMPtsmQVoO88v3ygQu4UxLla+apB0Wr4csR4M8PaBzhTVReJmeaAjQ==} engines: {node: ^14.18.0 || >=16.0.0, npm: '>=8', pnpm: '>=7'} peerDependencies: '@vuepress/client': 2.0.0-beta.60 @@ -15596,8 +15627,8 @@ packages: fflate: 0.7.4 gray-matter: 4.0.3 striptags: 3.2.0 - vue: 3.2.45 - vue-router: 4.1.6_vue@3.2.45 + vue: 3.2.47 + vue-router: 4.1.6_vue@3.2.47 transitivePeerDependencies: - supports-color dev: false From 0ca612eca4564ded8b1bb01fe3f68d8d39204e26 Mon Sep 17 00:00:00 2001 From: pengzhanbo Date: Tue, 7 Feb 2023 22:06:08 +0800 Subject: [PATCH 07/29] =?UTF-8?q?fix(plugin-blog-data):=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=20page=E7=B1=BB=E5=9E=8B=E6=A3=80=E6=9F=A5=E9=94=99?= =?UTF-8?q?=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/plugin-blog-data/src/node/prepareBlogData.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/plugin-blog-data/src/node/prepareBlogData.ts b/packages/plugin-blog-data/src/node/prepareBlogData.ts index 57d332ec..aaf6a76a 100644 --- a/packages/plugin-blog-data/src/node/prepareBlogData.ts +++ b/packages/plugin-blog-data/src/node/prepareBlogData.ts @@ -59,7 +59,7 @@ export const preparedBlogData = async ( ...extended, } - if (options.excerpt) data.excerpt = page.excerpt + if (options.excerpt) data.excerpt = (page as any).excerpt return data as BlogPostDataItem }) From b28b4c8acd1376f107554596adf391b9a4582459 Mon Sep 17 00:00:00 2001 From: pengzhanbo Date: Tue, 7 Feb 2023 22:18:29 +0800 Subject: [PATCH 08/29] fix(plugin-windicss): fix windicss-webpack-plugin --- packages/plugin-windicss/src/node/plugin.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/plugin-windicss/src/node/plugin.ts b/packages/plugin-windicss/src/node/plugin.ts index eaa87e17..35185eb2 100644 --- a/packages/plugin-windicss/src/node/plugin.ts +++ b/packages/plugin-windicss/src/node/plugin.ts @@ -42,7 +42,9 @@ export const windiCSSPlugin = (options?: WindiCSSOptions | string): Plugin => { if (app.options.bundler.name === '@vuepress/bundler-webpack') { bundlerOptions.configureWebpack && bundlerOptions.configureWebpack((config: any) => { - config.plugins.push(new WebpackWindiCSSPlugin(userOptions)) + config.plugins.push( + new (WebpackWindiCSSPlugin as any)(userOptions) + ) }) } }, From e1141bcea093679ea013e3e4b2b3f78d979a049f Mon Sep 17 00:00:00 2001 From: pengzhanbo Date: Wed, 8 Feb 2023 23:05:46 +0800 Subject: [PATCH 09/29] feat(plugin-blog-data): replace `glob-to-regexp` to `create-filter` --- packages/plugin-blog-data/package.json | 2 +- packages/plugin-blog-data/src/node/env.d.ts | 16 ---- packages/plugin-blog-data/src/node/plugin.ts | 54 ++++------- .../src/node/prepareBlogData.ts | 7 +- pnpm-lock.yaml | 92 ++----------------- 5 files changed, 33 insertions(+), 138 deletions(-) delete mode 100644 packages/plugin-blog-data/src/node/env.d.ts diff --git a/packages/plugin-blog-data/package.json b/packages/plugin-blog-data/package.json index 2f1fef86..d50c2cf3 100644 --- a/packages/plugin-blog-data/package.json +++ b/packages/plugin-blog-data/package.json @@ -36,7 +36,7 @@ "@vuepress/shared": "2.0.0-beta.60", "@vuepress/utils": "2.0.0-beta.60", "chokidar": "^3.5.3", - "glob-to-regexp": "^0.4.1", + "create-filter": "^1.0.0", "vue": "^3.2.47" }, "publishConfig": { diff --git a/packages/plugin-blog-data/src/node/env.d.ts b/packages/plugin-blog-data/src/node/env.d.ts deleted file mode 100644 index 643357e3..00000000 --- a/packages/plugin-blog-data/src/node/env.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -declare module 'glob-to-regexp' { - interface GlobToRegexp { - ( - glob: string, - options?: { - globstar?: boolean - extended?: boolean - flags?: string - } - ): RegExp - } - - const globToRegexp: GlobToRegexp - - export default globToRegexp -} diff --git a/packages/plugin-blog-data/src/node/plugin.ts b/packages/plugin-blog-data/src/node/plugin.ts index 38d1694c..e7ed341f 100644 --- a/packages/plugin-blog-data/src/node/plugin.ts +++ b/packages/plugin-blog-data/src/node/plugin.ts @@ -1,65 +1,51 @@ import type { Plugin } from '@vuepress/core' import { getDirname, path } from '@vuepress/utils' import chokidar from 'chokidar' -import globToRegexp from 'glob-to-regexp' +import { createFilter } from 'create-filter' import { preparedBlogData } from './prepareBlogData.js' import type { BlogDataPluginOptions } from './index.js' const __dirname = getDirname(import.meta.url) -export interface PluginOption - extends Omit { - include: { - (filepath: string): boolean - }[] - exclude: { - (filepath: string): boolean - }[] -} - -const globOptions = { - globstar: true, - extended: true, -} +export type PluginOption = Omit export const blogDataPlugin = ({ include, exclude, ...pluginOptions }: BlogDataPluginOptions = {}): Plugin => { - const options: PluginOption = { - include: toArray(include) - .map((str) => globToRegexp(str, globOptions)) - .map((regexp) => (filepath: string) => regexp.test(filepath)), - - exclude: toArray(exclude) - .map((str) => globToRegexp(str, globOptions)) - .map((regexp) => (filepath: string) => !regexp.test(filepath)), - ...pluginOptions, - } + const pageFilter = createFilter(toArray(include), toArray(exclude), { + resolve: false, + }) return { name: '@vuepress-plume/vuepress-plugin-blog-data', clientConfigFile: path.resolve(__dirname, '../client/config.js'), extendsPage(page) { - if ( - page.filePathRelative && - options.exclude.every((filter) => filter(page.filePathRelative!)) && - options.include.some((filter) => filter(page.filePathRelative!)) - ) { + if (page.filePathRelative && pageFilter(page.filePathRelative)) { ;(page.data as any).isBlogPost = true } }, - onPrepared: async (app) => await preparedBlogData(app, options), + onPrepared: async (app) => + await preparedBlogData(app, pageFilter, pluginOptions), onWatched(app, watchers) { const watcher = chokidar.watch('pages/**/*', { cwd: app.dir.temp(), ignoreInitial: true, }) - watcher.on('add', async () => await preparedBlogData(app, options)) - watcher.on('change', async () => await preparedBlogData(app, options)) - watcher.on('unlink', async () => await preparedBlogData(app, options)) + watcher.on( + 'add', + async () => await preparedBlogData(app, pageFilter, pluginOptions) + ) + watcher.on( + 'change', + async () => await preparedBlogData(app, pageFilter, pluginOptions) + ) + watcher.on( + 'unlink', + async () => await preparedBlogData(app, pageFilter, pluginOptions) + ) watchers.push(watcher) }, diff --git a/packages/plugin-blog-data/src/node/prepareBlogData.ts b/packages/plugin-blog-data/src/node/prepareBlogData.ts index aaf6a76a..a01ec840 100644 --- a/packages/plugin-blog-data/src/node/prepareBlogData.ts +++ b/packages/plugin-blog-data/src/node/prepareBlogData.ts @@ -23,14 +23,11 @@ const getTimestamp = (time: Date): number => { export const preparedBlogData = async ( app: App, + pageFilter: (id: string) => boolean, options: PluginOption ): Promise => { let pages = app.pages.filter((page) => { - return ( - page.filePathRelative && - options.exclude.every((filter) => filter(page.filePathRelative!)) && - options.include.some((filter) => filter(page.filePathRelative!)) - ) + return page.filePathRelative && pageFilter(page.filePathRelative) }) if (options.sortBy) { pages = pages.sort((prev, next) => { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e27316e1..68e98a33 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -132,7 +132,7 @@ importers: '@vuepress/shared': 2.0.0-beta.60 '@vuepress/utils': 2.0.0-beta.60 chokidar: ^3.5.3 - glob-to-regexp: ^0.4.1 + create-filter: ^1.0.0 vue: ^3.2.47 dependencies: '@vue/devtools-api': 6.4.5 @@ -141,7 +141,7 @@ importers: '@vuepress/shared': 2.0.0-beta.60 '@vuepress/utils': 2.0.0-beta.60 chokidar: 3.5.3 - glob-to-regexp: 0.4.1 + create-filter: 1.0.0 vue: 3.2.47 packages/plugin-caniuse: @@ -1249,7 +1249,6 @@ packages: /@hutson/parse-repository-url/3.0.2: resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} engines: {node: '>=6.9.0'} - dev: true /@iarna/toml/2.2.5: resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==} @@ -1337,7 +1336,6 @@ packages: cross-spawn: 7.0.3 string-argv: 0.3.1 type-detect: 4.0.8 - dev: true /@kurkle/color/0.3.1: resolution: {integrity: sha512-hW0GwZj06z/ZFUW2Espl7toVDjghJN+EKqyXzPSV8NV89d5BYp5rRMBJoc+aUN0x5OXDMeRQHazejr2Xmqj2tw==} @@ -2860,7 +2858,6 @@ packages: /@types/minimist/1.2.2: resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} - dev: true /@types/ms/0.7.31: resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} @@ -3822,7 +3819,6 @@ packages: dependencies: jsonparse: 1.3.1 through: 2.3.8 - dev: true /abbrev/1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} @@ -3878,7 +3874,6 @@ packages: /add-stream/1.0.0: resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} - dev: true /agent-base/6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} @@ -4231,7 +4226,6 @@ packages: /array-ify/1.0.0: resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} - dev: true /array-includes/3.1.6: resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} @@ -4278,7 +4272,6 @@ packages: /arrify/1.0.1: resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} engines: {node: '>=0.10.0'} - dev: true /arrify/2.0.1: resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} @@ -4674,7 +4667,6 @@ packages: kleur: 4.1.5 prompts: 2.4.2 semver: 7.3.8 - dev: true /byline/5.0.0: resolution: {integrity: sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==} @@ -4841,7 +4833,6 @@ packages: camelcase: 5.3.1 map-obj: 4.3.0 quick-lru: 4.0.1 - dev: true /camelcase/2.1.1: resolution: {integrity: sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==} @@ -5098,7 +5089,6 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - dev: true /cliui/8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} @@ -5274,7 +5264,6 @@ packages: dependencies: array-ify: 1.0.0 dot-prop: 5.3.0 - dev: true /component-emitter/1.3.0: resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==} @@ -5418,14 +5407,12 @@ packages: dependencies: compare-func: 2.0.0 q: 1.5.1 - dev: true /conventional-changelog-atom/2.0.8: resolution: {integrity: sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==} engines: {node: '>=10'} dependencies: q: 1.5.1 - dev: true /conventional-changelog-cli/2.2.2: resolution: {integrity: sha512-8grMV5Jo8S0kP3yoMeJxV2P5R6VJOqK72IiSV9t/4H5r/HiRqEBQ83bYGuz4Yzfdj4bjaAEhZN/FFbsFXr5bOA==} @@ -5437,14 +5424,12 @@ packages: lodash: 4.17.21 meow: 8.1.2 tempfile: 3.0.0 - dev: true /conventional-changelog-codemirror/2.0.8: resolution: {integrity: sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==} engines: {node: '>=10'} dependencies: q: 1.5.1 - dev: true /conventional-changelog-conventionalcommits/4.6.3: resolution: {integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==} @@ -5453,7 +5438,6 @@ packages: compare-func: 2.0.0 lodash: 4.17.21 q: 1.5.1 - dev: true /conventional-changelog-conventionalcommits/5.0.0: resolution: {integrity: sha512-lCDbA+ZqVFQGUj7h9QBKoIpLhl8iihkO0nCTyRNzuXtcd7ubODpYB04IFy31JloiJgG0Uovu8ot8oxRzn7Nwtw==} @@ -5482,35 +5466,30 @@ packages: read-pkg: 3.0.0 read-pkg-up: 3.0.0 through2: 4.0.2 - dev: true /conventional-changelog-ember/2.0.9: resolution: {integrity: sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==} engines: {node: '>=10'} dependencies: q: 1.5.1 - dev: true /conventional-changelog-eslint/3.0.9: resolution: {integrity: sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==} engines: {node: '>=10'} dependencies: q: 1.5.1 - dev: true /conventional-changelog-express/2.0.6: resolution: {integrity: sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==} engines: {node: '>=10'} dependencies: q: 1.5.1 - dev: true /conventional-changelog-jquery/3.0.11: resolution: {integrity: sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==} engines: {node: '>=10'} dependencies: q: 1.5.1 - dev: true /conventional-changelog-jshint/2.0.9: resolution: {integrity: sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==} @@ -5518,12 +5497,10 @@ packages: dependencies: compare-func: 2.0.0 q: 1.5.1 - dev: true /conventional-changelog-preset-loader/2.3.4: resolution: {integrity: sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==} engines: {node: '>=10'} - dev: true /conventional-changelog-writer/5.0.1: resolution: {integrity: sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==} @@ -5539,7 +5516,6 @@ packages: semver: 6.3.0 split: 1.0.1 through2: 4.0.2 - dev: true /conventional-changelog/3.1.25: resolution: {integrity: sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==} @@ -5556,7 +5532,6 @@ packages: conventional-changelog-jquery: 3.0.11 conventional-changelog-jshint: 2.0.9 conventional-changelog-preset-loader: 2.3.4 - dev: true /conventional-commit-types/3.0.0: resolution: {integrity: sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==} @@ -5568,7 +5543,6 @@ packages: dependencies: lodash.ismatch: 4.4.0 modify-values: 1.0.1 - dev: true /conventional-commits-parser/3.2.4: resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==} @@ -5581,7 +5555,6 @@ packages: meow: 8.1.2 split2: 3.2.2 through2: 4.0.2 - dev: true /convert-source-map/1.8.0: resolution: {integrity: sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==} @@ -5768,6 +5741,14 @@ packages: readable-stream: 3.6.0 dev: false + /create-filter/1.0.0: + resolution: {integrity: sha512-GILntrcuvYbSs9LYP3dc5muWQFG/fBdrl/fUVr1Wexug94FwSQ+Ua5HCqp+ikTTi1+aaUgjQby3eXEHYauwNIQ==} + dependencies: + bumpp: 8.2.1 + conventional-changelog-cli: 2.2.2 + picomatch: 2.3.1 + dev: false + /create-require/1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} @@ -6184,7 +6165,6 @@ packages: /dargs/7.0.0: resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} engines: {node: '>=8'} - dev: true /data-uri-to-buffer/4.0.0: resolution: {integrity: sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==} @@ -6208,7 +6188,6 @@ packages: /dateformat/3.0.3: resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} - dev: true /dayjs/1.11.7: resolution: {integrity: sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==} @@ -6285,7 +6264,6 @@ packages: dependencies: decamelize: 1.2.0 map-obj: 1.0.1 - dev: true /decamelize/1.2.0: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} @@ -8284,7 +8262,6 @@ packages: engines: {node: '>=4'} dependencies: locate-path: 2.0.0 - dev: true /find-up/4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} @@ -8588,7 +8565,6 @@ packages: hosted-git-info: 4.1.0 through2: 2.0.5 yargs: 16.2.0 - dev: true /get-port/5.1.1: resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} @@ -8678,7 +8654,6 @@ packages: meow: 8.1.2 split2: 3.2.2 through2: 4.0.2 - dev: true /git-remote-origin-url/2.0.0: resolution: {integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==} @@ -8686,7 +8661,6 @@ packages: dependencies: gitconfiglocal: 1.0.0 pify: 2.3.0 - dev: true /git-repo-info/2.1.1: resolution: {integrity: sha512-8aCohiDo4jwjOwma4FmYFd3i97urZulL8XL24nIPxuE+GZnfsAyy/g2Shqx6OjUiFKUXZM+Yy+KHnOmmA3FVcg==} @@ -8700,13 +8674,11 @@ packages: dependencies: meow: 8.1.2 semver: 6.3.0 - dev: true /gitconfiglocal/1.0.0: resolution: {integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==} dependencies: ini: 1.3.8 - dev: true /gitconfiglocal/2.1.0: resolution: {integrity: sha512-qoerOEliJn3z+Zyn1HW2F6eoYJqKwS6MgC9cztTLUB/xLWX8gD/6T60pKn4+t/d6tP7JlybI7Z3z+I572CR/Vg==} @@ -9004,12 +8976,10 @@ packages: wordwrap: 1.0.0 optionalDependencies: uglify-js: 3.17.4 - dev: true /hard-rejection/2.1.0: resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} engines: {node: '>=6'} - dev: true /has-ansi/2.0.0: resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} @@ -9980,7 +9950,6 @@ packages: engines: {node: '>=0.10.0'} dependencies: text-extensions: 1.9.0 - dev: true /is-typedarray/1.0.0: resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} @@ -10165,7 +10134,6 @@ packages: /json-parse-better-errors/1.0.2: resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} - dev: true /json-parse-even-better-errors/2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} @@ -10187,7 +10155,6 @@ packages: /json-stringify-safe/5.0.1: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - dev: true /json5/1.0.1: resolution: {integrity: sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==} @@ -10216,7 +10183,6 @@ packages: /jsonparse/1.3.1: resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} engines: {'0': node >= 0.2.0} - dev: true /jsonpointer/5.0.1: resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} @@ -10324,12 +10290,10 @@ packages: /kleur/3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} - dev: true /kleur/4.1.5: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} - dev: true /klona/2.0.5: resolution: {integrity: sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==} @@ -10605,7 +10569,6 @@ packages: parse-json: 4.0.0 pify: 3.0.0 strip-bom: 3.0.0 - dev: true /loader-runner/4.3.0: resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} @@ -10631,7 +10594,6 @@ packages: dependencies: p-locate: 2.0.0 path-exists: 3.0.0 - dev: true /locate-path/5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} @@ -10685,7 +10647,6 @@ packages: /lodash.ismatch/4.4.0: resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} - dev: true /lodash.isplainobject/4.0.6: resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} @@ -10951,12 +10912,10 @@ packages: /map-obj/1.0.1: resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} engines: {node: '>=0.10.0'} - dev: true /map-obj/4.3.0: resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} engines: {node: '>=8'} - dev: true /map-obj/5.0.2: resolution: {integrity: sha512-K6K2NgKnTXimT3779/4KxSvobxOtMmx1LBZ3NwRxT/MDIR3Br/fQ4Q+WCX5QxjyUR8zg5+RV9Tbf2c5pAWTD2A==} @@ -11085,7 +11044,6 @@ packages: trim-newlines: 3.0.1 type-fest: 0.18.1 yargs-parser: 20.2.9 - dev: true /merge-descriptors/1.0.1: resolution: {integrity: sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=} @@ -11250,7 +11208,6 @@ packages: /min-indent/1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} - dev: true /mini-css-extract-plugin/2.7.2_webpack@5.75.0: resolution: {integrity: sha512-EdlUizq13o0Pd+uCp+WO/JpkLvHRVGt97RqfeGhXqAcorYo1ypJSpkV+WDT0vY/kmh/p7wRdJNJtuyK540PXDw==} @@ -11287,7 +11244,6 @@ packages: arrify: 1.0.1 is-plain-obj: 1.1.0 kind-of: 6.0.3 - dev: true /minimist/1.2.6: resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} @@ -11392,7 +11348,6 @@ packages: /modify-values/1.0.1: resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} engines: {node: '>=0.10.0'} - dev: true /module-definition/4.0.0: resolution: {integrity: sha512-wntiAHV4lDn24BQn2kX6LKq0y85phHLHiv3aOPDF+lIs06kVjEMTe/ZTdrbVLnQV5FQsjik21taknvMhKY1Cug==} @@ -12313,7 +12268,6 @@ packages: engines: {node: '>=4'} dependencies: p-try: 1.0.0 - dev: true /p-limit/2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} @@ -12339,7 +12293,6 @@ packages: engines: {node: '>=4'} dependencies: p-limit: 1.3.0 - dev: true /p-locate/4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} @@ -12428,7 +12381,6 @@ packages: /p-try/1.0.0: resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} engines: {node: '>=4'} - dev: true /p-try/2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} @@ -12537,7 +12489,6 @@ packages: dependencies: error-ex: 1.3.2 json-parse-better-errors: 1.0.2 - dev: true /parse-json/5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} @@ -12595,7 +12546,6 @@ packages: /path-exists/3.0.0: resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} engines: {node: '>=4'} - dev: true /path-exists/4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} @@ -13057,7 +13007,6 @@ packages: dependencies: kleur: 3.0.3 sisteransi: 1.0.5 - dev: true /proto-list/1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} @@ -13126,7 +13075,6 @@ packages: /q/1.5.1: resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} engines: {node: '>=0.6.0', teleport: '>=0.2.0'} - dev: true /qs/6.11.0: resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} @@ -13160,7 +13108,6 @@ packages: /quick-lru/4.0.1: resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} engines: {node: '>=8'} - dev: true /quick-lru/5.1.1: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} @@ -13253,7 +13200,6 @@ packages: dependencies: find-up: 2.1.0 read-pkg: 3.0.0 - dev: true /read-pkg-up/7.0.1: resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} @@ -13279,7 +13225,6 @@ packages: load-json-file: 4.0.0 normalize-package-data: 2.5.0 path-type: 3.0.0 - dev: true /read-pkg/5.2.0: resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} @@ -13364,7 +13309,6 @@ packages: dependencies: indent-string: 4.0.0 strip-indent: 3.0.0 - dev: true /regenerator-runtime/0.13.9: resolution: {integrity: sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==} @@ -13913,7 +13857,6 @@ packages: /sisteransi/1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - dev: true /sitemap/7.1.1: resolution: {integrity: sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==} @@ -14205,7 +14148,6 @@ packages: resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} dependencies: through: 2.3.8 - dev: true /split2/1.1.1: resolution: {integrity: sha512-cfurE2q8LamExY+lJ9Ex3ZfBwqAPduzOKVscPDXNCLLMvyaeD3DTz1yk7fVIs6Chco+12XeD0BB6HEoYzPYbXA==} @@ -14217,7 +14159,6 @@ packages: resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} dependencies: readable-stream: 3.6.0 - dev: true /split2/4.1.0: resolution: {integrity: sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==} @@ -14275,7 +14216,6 @@ packages: /string-argv/0.3.1: resolution: {integrity: sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==} engines: {node: '>=0.6.19'} - dev: true /string-similarity/4.0.4: resolution: {integrity: sha512-/q/8Q4Bl4ZKAPjj8WerIBJWALKkaPRfrvhfF8k/B23i4nzrlRj2/go1m90In7nG/3XDSbOo0+pu6RvCTM9RGMQ==} @@ -14385,7 +14325,6 @@ packages: /strip-bom/3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} - dev: true /strip-bom/4.0.0: resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} @@ -14411,7 +14350,6 @@ packages: engines: {node: '>=8'} dependencies: min-indent: 1.0.1 - dev: true /strip-json-comments/2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} @@ -14600,7 +14538,6 @@ packages: dependencies: temp-dir: 2.0.0 uuid: 3.4.0 - dev: true /tempy/1.0.1: resolution: {integrity: sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==} @@ -14669,7 +14606,6 @@ packages: /text-extensions/1.9.0: resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} engines: {node: '>=0.10'} - dev: true /text-hex/1.0.0: resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} @@ -14712,7 +14648,6 @@ packages: resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} dependencies: readable-stream: 3.6.0 - dev: true /thunky/1.1.0: resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} @@ -14827,7 +14762,6 @@ packages: /trim-newlines/3.0.1: resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} engines: {node: '>=8'} - dev: true /trim-repeated/1.0.0: resolution: {integrity: sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==} @@ -14927,7 +14861,6 @@ packages: /type-detect/4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} - dev: true /type-fest/0.10.0: resolution: {integrity: sha512-EUV9jo4sffrwlg8s0zDhP0T2WD3pru5Xi0+HTE3zTUmBaZNhfkite9PdSJwdXLwPVW0jnAHT56pZHIOYckPEiw==} @@ -14942,7 +14875,6 @@ packages: /type-fest/0.18.1: resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} engines: {node: '>=10'} - dev: true /type-fest/0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} @@ -14998,7 +14930,6 @@ packages: engines: {node: '>=0.8.0'} hasBin: true requiresBuild: true - dev: true optional: true /uid-safe/2.1.5: @@ -15959,7 +15890,6 @@ packages: /wordwrap/1.0.0: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - dev: true /wrap-ansi/2.1.0: resolution: {integrity: sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==} @@ -16101,7 +16031,6 @@ packages: /yargs-parser/20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} - dev: true /yargs-parser/21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} @@ -16118,7 +16047,6 @@ packages: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 20.2.9 - dev: true /yargs/17.6.2: resolution: {integrity: sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==} From fa5f758b540b736e0b339e93e5813df87442e8d2 Mon Sep 17 00:00:00 2001 From: pengzhanbo Date: Thu, 9 Feb 2023 23:04:33 +0800 Subject: [PATCH 10/29] =?UTF-8?q?refactor(plugin-auto-frontmatter):=20?= =?UTF-8?q?=E9=87=8D=E6=9E=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/plugin-auto-frontmatter/README.md | 22 ++++---- packages/plugin-auto-frontmatter/package.json | 7 +-- .../plugin-auto-frontmatter/src/node/env.d.ts | 17 ++----- .../src/node/plugin.ts | 50 ++++++++++--------- .../src/node/readFiles.ts | 14 ++++-- .../plugin-auto-frontmatter/src/node/utils.ts | 5 ++ .../src/shared/index.ts | 8 +-- pnpm-lock.yaml | 20 +++++++- 8 files changed, 82 insertions(+), 61 deletions(-) create mode 100644 packages/plugin-auto-frontmatter/src/node/utils.ts diff --git a/packages/plugin-auto-frontmatter/README.md b/packages/plugin-auto-frontmatter/README.md index 89b1925c..8002176c 100644 --- a/packages/plugin-auto-frontmatter/README.md +++ b/packages/plugin-auto-frontmatter/README.md @@ -30,13 +30,15 @@ export default { ### options -`{ glob?: string | string[]; formatter: Formatter }` +`{ include?: string | string[]; exclude?: string | string[]; formatter: Formatter }` -- `glob` - glob 匹配字符串或数组,匹配需要自动生成 `frontmatter` 的 md文件。 - 默认预设为 `['**/*.md', '!.vuepress/', '!node_modules/']`。 - 自定义匹配将被合并到预设配置中 - example: `['blog/**']` +- `include` + include 匹配字符串或数组,匹配需要自动生成 `frontmatter` 的 md文件。 + 默认预设为 `['**/*.md']`。 + +- `exclude` + exclude 排除不需要的文件 + 默认预设为: `['!.vuepress/', '!node_modules/']` - `formatter` 配置`frontmatter`每个字段的生成规则。 @@ -58,7 +60,7 @@ export default { > type FormatterArray = { - glob: string + include: string formatter: FormatterObject }[] @@ -82,7 +84,7 @@ export default { const formatterArr: Formatter = [ { // 更精细化的匹配某个 md文件,支持glob 匹配字符串 - glob: '**/{README,index}.md', + include: '**/{README,index}.md', // formatter 仅对 glob命中的文件有效 formatter: { home(value, matter, file) { @@ -92,8 +94,8 @@ export default { { // 通配,如果文件没有被其他精细glob命中, // 则使用 通配 formatter - // 如果是数组,必须有且用一个 glob为 * 的 项 - glob: '*', + // 如果是数组,必须有且用一个 include 为 * 的 项 + include: '*', formatter: { title(title) { return title || '默认标题' diff --git a/packages/plugin-auto-frontmatter/package.json b/packages/plugin-auto-frontmatter/package.json index 07514ce8..75993e93 100644 --- a/packages/plugin-auto-frontmatter/package.json +++ b/packages/plugin-auto-frontmatter/package.json @@ -31,10 +31,11 @@ "dependencies": { "@vuepress/core": "2.0.0-beta.60", "@vuepress/shared": "2.0.0-beta.60", - "@vuepress/utils": "2.0.0-beta.60", "chokidar": "^3.5.3", - "glob-to-regexp": "^0.4.1", - "gray-matter": "^4.0.3" + "create-filter": "^1.0.0", + "fast-glob": "^3.2.12", + "gray-matter": "^4.0.3", + "json2yaml": "^1.1.0" }, "publishConfig": { "access": "public" diff --git a/packages/plugin-auto-frontmatter/src/node/env.d.ts b/packages/plugin-auto-frontmatter/src/node/env.d.ts index 643357e3..5591cb30 100644 --- a/packages/plugin-auto-frontmatter/src/node/env.d.ts +++ b/packages/plugin-auto-frontmatter/src/node/env.d.ts @@ -1,16 +1,5 @@ -declare module 'glob-to-regexp' { - interface GlobToRegexp { - ( - glob: string, - options?: { - globstar?: boolean - extended?: boolean - flags?: string - } - ): RegExp - } +declare module 'json2yaml' { + const result: any - const globToRegexp: GlobToRegexp - - export default globToRegexp + export default result } diff --git a/packages/plugin-auto-frontmatter/src/node/plugin.ts b/packages/plugin-auto-frontmatter/src/node/plugin.ts index a00e9058..3857b6b8 100644 --- a/packages/plugin-auto-frontmatter/src/node/plugin.ts +++ b/packages/plugin-auto-frontmatter/src/node/plugin.ts @@ -1,8 +1,9 @@ +import fs from 'node:fs' import type { Plugin } from '@vuepress/core' -import { fs } from '@vuepress/utils' import chokidar from 'chokidar' -import globToRegexp from 'glob-to-regexp' +import { createFilter } from 'create-filter' import grayMatter from 'gray-matter' +import jsonToYaml from 'json2yaml' import type { AutoFrontmatterOptions, FormatterArray, @@ -10,30 +11,31 @@ import type { MarkdownFile, } from '../shared/index.js' import { readMarkdown, readMarkdownList } from './readFiles.js' +import { ensureArray } from './utils.js' export const autoFrontmatterPlugin = ({ - glob = '', + include = ['**/*.{md,MD}'], + exclude = ['.vuepress/**/*', 'node_modules'], formatter = {}, }: AutoFrontmatterOptions = {}): Plugin => { - glob = glob ? (Array.isArray(glob) ? glob : [glob]) : [] - glob = ['**/*.{md,MD}', '!.vuepress/', '!node_modules/', ...glob] + include = ensureArray(include) + exclude = ensureArray(exclude) + + const globFilter = createFilter(include, exclude, { resolve: false }) const matterFormatter: FormatterArray = Array.isArray(formatter) ? formatter - : [{ glob: '*', formatter }] + : [{ include: '*', formatter }] const globFormatter: FormatterObject = - matterFormatter.find(({ glob }) => glob === '*')?.formatter || {} + matterFormatter.find(({ include }) => include === '*')?.formatter || {} const otherFormatters = matterFormatter - .filter(({ glob }) => glob !== '*') - .map(({ glob, formatter }) => { + .filter(({ include }) => include !== '*') + .map(({ include, formatter }) => { return { - glob, - regexp: globToRegexp(glob, { - globstar: true, - extended: true, - }), + include, + filter: createFilter(include), formatter, } }) @@ -42,26 +44,27 @@ export const autoFrontmatterPlugin = ({ const { filepath, relativePath } = file const formatter = - otherFormatters.find(({ regexp }) => regexp.test(relativePath)) - ?.formatter || globFormatter + otherFormatters.find(({ filter }) => filter(relativePath))?.formatter || + globFormatter const { data, content } = grayMatter(file.content) Object.keys(formatter).forEach((key) => { const value = formatter[key](data[key], data, file) data[key] = value ?? data[key] }) - const newContent = grayMatter.stringify({ content }, data) + const yaml = jsonToYaml + .stringify(data) + .replace(/\n\s{2}/g, '\n') + .replace(/"/g, '') + const newContent = `${yaml}---\n${content}` - fs.writeFileSync(filepath, newContent) + fs.writeFileSync(filepath, newContent, 'utf-8') } return { name: '@vuepress-plume/vuepress-plugin-auto-frontmatter', onInitialized: async (app) => { - const markdownList = await readMarkdownList( - app.dir.source(), - glob as string[] - ) + const markdownList = await readMarkdownList(app.dir.source(), globFilter) markdownList.forEach((file) => formatMarkdown(file)) }, onWatched: async (app, watchers) => { @@ -72,8 +75,7 @@ export const autoFrontmatterPlugin = ({ }) watcher.on('add', (relativePath) => { - if ((glob as string[]).some((_) => !globToRegexp(_).test(relativePath))) - return + if (!globFilter(relativePath)) return formatMarkdown(readMarkdown(app.dir.source(), relativePath)) }) diff --git a/packages/plugin-auto-frontmatter/src/node/readFiles.ts b/packages/plugin-auto-frontmatter/src/node/readFiles.ts index 48c17505..69e730c2 100644 --- a/packages/plugin-auto-frontmatter/src/node/readFiles.ts +++ b/packages/plugin-auto-frontmatter/src/node/readFiles.ts @@ -1,18 +1,22 @@ -import { fs, globby, path } from '@vuepress/utils' +import fs from 'node:fs' +import path from 'node:path' +import fg from 'fast-glob' import type { MarkdownFile } from '../shared/index.js' type MarkdownFileList = MarkdownFile[] export const readMarkdownList = async ( sourceDir: string, - glob: string[] + filter: (id: string) => boolean ): Promise => { - const files: string[] = await globby(glob, { + const files: string[] = await fg(['**/*.md'], { cwd: sourceDir, - gitignore: true, + ignore: ['node_modules/', '.vuepress/'], }) - return files.map((file) => readMarkdown(sourceDir, file)) + return files + .filter((file) => filter(file)) + .map((file) => readMarkdown(sourceDir, file)) } export const readMarkdown = ( diff --git a/packages/plugin-auto-frontmatter/src/node/utils.ts b/packages/plugin-auto-frontmatter/src/node/utils.ts new file mode 100644 index 00000000..981a3c67 --- /dev/null +++ b/packages/plugin-auto-frontmatter/src/node/utils.ts @@ -0,0 +1,5 @@ +export function ensureArray(thing: T | T[] | null | undefined): T[] { + if (Array.isArray(thing)) return thing + if (thing === null || thing === undefined) return [] + return [thing] +} diff --git a/packages/plugin-auto-frontmatter/src/shared/index.ts b/packages/plugin-auto-frontmatter/src/shared/index.ts index a99a7560..c02c2680 100644 --- a/packages/plugin-auto-frontmatter/src/shared/index.ts +++ b/packages/plugin-auto-frontmatter/src/shared/index.ts @@ -15,15 +15,17 @@ export type FormatterObject = Record< > export type FormatterArray = { - glob: string + include: string formatter: FormatterObject }[] export interface AutoFrontmatterOptions { /** - * glob string + * FilterPattern */ - glob?: string | string[] + include?: string | string[] + + exclude?: string | string[] /** * { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 68e98a33..da4335b3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -102,15 +102,19 @@ importers: '@vuepress/shared': 2.0.0-beta.60 '@vuepress/utils': 2.0.0-beta.60 chokidar: ^3.5.3 - glob-to-regexp: ^0.4.1 + create-filter: ^1.0.0 + fast-glob: ^3.2.12 gray-matter: ^4.0.3 + json2yaml: ^1.1.0 dependencies: '@vuepress/core': 2.0.0-beta.60 '@vuepress/shared': 2.0.0-beta.60 '@vuepress/utils': 2.0.0-beta.60 chokidar: 3.5.3 - glob-to-regexp: 0.4.1 + create-filter: 1.0.0 + fast-glob: 3.2.12 gray-matter: 4.0.3 + json2yaml: 1.1.0 packages/plugin-baidu-tongji: specifiers: @@ -10156,6 +10160,14 @@ packages: /json-stringify-safe/5.0.1: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + /json2yaml/1.1.0: + resolution: {integrity: sha512-/xse+m0SlllfZahQrNOelmLrFNfeZv4QG0QKlvg7VsPSGIxpB3X+ggLkdffwmI1DdQ3o9XjZX+K+EOI1epdKgg==} + engines: {node: '>= 0.2.0'} + hasBin: true + dependencies: + remedial: 1.0.8 + dev: false + /json5/1.0.1: resolution: {integrity: sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==} hasBin: true @@ -13369,6 +13381,10 @@ packages: engines: {node: '>= 0.10'} dev: false + /remedial/1.0.8: + resolution: {integrity: sha512-/62tYiOe6DzS5BqVsNpH/nkGlX45C/Sp6V+NtiN6JQNS1Viay7cWkazmRkrQrdFj2eshDe96SIQNIoMxqhzBOg==} + dev: false + /remove-trailing-separator/1.1.0: resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} dev: false From cc605597eddcca0c4f4b15cdf45fe482c569366d Mon Sep 17 00:00:00 2001 From: pengzhanbo Date: Thu, 9 Feb 2023 23:38:45 +0800 Subject: [PATCH 11/29] docs: add post --- docs/1.前端/1.基础/BFC 块级格式化上下文.md | 10 +- docs/1.前端/1.基础/CSS at-rule.md | 8 +- docs/1.前端/1.基础/CSS media媒体查询.md | 8 +- docs/1.前端/1.基础/CSS选择器.md | 8 +- docs/1.前端/1.基础/DOCTYPE 文档类型声明.md | 8 +- docs/1.前端/1.基础/HTML5新特性.md | 8 +- docs/1.前端/1.基础/WebComponent-template.md | 10 +- docs/1.前端/1.基础/WebComponent自定义元素.md | 10 +- docs/1.前端/1.基础/javascript模块化.md | 239 +++++++++++++ docs/1.前端/1.基础/meta 标签说明.md | 8 +- docs/1.前端/1.基础/原型链与继承.md | 174 ++++++++- docs/1.前端/1.基础/正则表达式使用手册.md | 8 +- docs/1.前端/1.基础/浏览器端的事件循环.md | 188 +++++++++- docs/1.前端/1.基础/详解Promise.md | 166 ++++++++- docs/1.前端/10.开发/1px解决方案.md | 7 +- docs/1.前端/10.开发/lerna使用.md | 10 +- docs/1.前端/10.开发/pnpm.md | 280 +++++++++++++++ docs/1.前端/10.开发/前端路由.md | 135 +++++++ docs/1.前端/10.开发/微前端.md | 285 +++++++++++++++ docs/1.前端/10.开发/浅谈前端低代码.md | 60 ++++ docs/1.前端/10.开发/移动端适配方案.md | 8 +- docs/1.前端/10.开发/表单配置化生成.md | 143 ++++++++ docs/1.前端/2.工具/Jenkinss使用.md | 8 +- docs/1.前端/2.工具/NPMBinary镜像配置.md | 35 ++ docs/1.前端/2.工具/caniuse.md | 7 +- docs/1.前端/2.工具/git工作流实践.md | 136 +++++++ docs/1.前端/2.工具/vsCode插件推荐.md | 10 +- docs/1.前端/2.工具/小徽章制作.md | 36 ++ docs/1.前端/2.工具/有用的工具列表.md | 108 ++++++ docs/1.前端/3.Vue/Vue组件间通信.md | 8 +- docs/1.前端/5.Node/单仓库导出ES和CJS.md | 211 +++++++++++ docs/1.前端/5.Node/在node项目中使用esm.md | 149 ++++++++ .../6.JavaScript/2.进阶/函数参数按值传递.md | 108 ++++++ .../6.JavaScript/2.进阶/原型到原型链.md | 159 +++++++++ docs/1.前端/6.JavaScript/2.进阶/执行上下文.md | 227 ++++++++++++ .../6.JavaScript/2.进阶/执行上下文栈.md | 138 ++++++++ docs/1.前端/6.JavaScript/2.进阶/词法作用域.md | 38 ++ docs/1.前端/7.构建工具/webpack-HMR.md | 94 +++++ docs/1.前端/7.构建工具/webpack原理.md | 176 ++++++++++ docs/1.前端/8.HTTP/CORS.md | 332 ++++++++++++++++++ docs/1.前端/8.HTTP/CSP.md | 256 ++++++++++++++ docs/1.前端/8.HTTP/HSTS.md | 90 +++++ docs/1.前端/8.HTTP/浏览器HTTP缓存机制.md | 331 +++++++++++++++++ .../1.前端/9.框架/一些好玩的库或者框架汇总.md | 165 +++++++++ docs/10.面试/面试2.md | 2 +- docs/10.面试/面试题-JS篇.md | 4 +- docs/10.面试/面试题—css篇.md | 4 +- docs/README.md | 3 +- docs/notes/README.md | 3 +- docs/notes/vuepress-plugin/caniuse/README.md | 2 +- .../vuepress-plugin/netlify-functions/API.md | 3 +- .../netlify-functions/README.md | 2 +- .../netlify-functions/functions开发指南.md | 2 +- .../vuepress-plugin/netlify-functions/介绍.md | 2 +- .../vuepress-plugin/netlify-functions/使用.md | 2 +- .../vuepress-plugin/netlify-functions/功能.md | 2 +- docs/notes/vuepress-theme-plume/README.md | 2 +- .../vuepress-theme-plume/markdown增强.md | 2 +- docs/notes/vuepress-theme-plume/notes配置.md | 2 +- .../vuepress-theme-plume/主题插件配置.md | 2 +- docs/notes/vuepress-theme-plume/主题配置.md | 2 +- docs/notes/vuepress-theme-plume/基础功能.md | 2 +- docs/notes/vuepress-theme-plume/快速开始.md | 2 +- docs/notes/vuepress-theme-plume/编写文章.md | 2 +- docs/notes/vuepress-theme-plume/页面配置.md | 2 +- .../src/node/readFiles.ts | 2 +- packages/theme/src/node/autoFrontmatter.ts | 6 +- packages/tsconfig.build.json | 4 +- 68 files changed, 4533 insertions(+), 131 deletions(-) create mode 100644 docs/1.前端/1.基础/javascript模块化.md create mode 100644 docs/1.前端/10.开发/pnpm.md create mode 100644 docs/1.前端/10.开发/前端路由.md create mode 100644 docs/1.前端/10.开发/微前端.md create mode 100644 docs/1.前端/10.开发/浅谈前端低代码.md create mode 100644 docs/1.前端/10.开发/表单配置化生成.md create mode 100644 docs/1.前端/2.工具/NPMBinary镜像配置.md create mode 100644 docs/1.前端/2.工具/git工作流实践.md create mode 100644 docs/1.前端/2.工具/小徽章制作.md create mode 100644 docs/1.前端/2.工具/有用的工具列表.md create mode 100644 docs/1.前端/5.Node/单仓库导出ES和CJS.md create mode 100644 docs/1.前端/5.Node/在node项目中使用esm.md create mode 100644 docs/1.前端/6.JavaScript/2.进阶/函数参数按值传递.md create mode 100644 docs/1.前端/6.JavaScript/2.进阶/原型到原型链.md create mode 100644 docs/1.前端/6.JavaScript/2.进阶/执行上下文.md create mode 100644 docs/1.前端/6.JavaScript/2.进阶/执行上下文栈.md create mode 100644 docs/1.前端/6.JavaScript/2.进阶/词法作用域.md create mode 100644 docs/1.前端/7.构建工具/webpack-HMR.md create mode 100644 docs/1.前端/7.构建工具/webpack原理.md create mode 100644 docs/1.前端/8.HTTP/CORS.md create mode 100644 docs/1.前端/8.HTTP/CSP.md create mode 100644 docs/1.前端/8.HTTP/HSTS.md create mode 100644 docs/1.前端/8.HTTP/浏览器HTTP缓存机制.md create mode 100644 docs/1.前端/9.框架/一些好玩的库或者框架汇总.md diff --git a/docs/1.前端/1.基础/BFC 块级格式化上下文.md b/docs/1.前端/1.基础/BFC 块级格式化上下文.md index 56313fa1..53d0f2d0 100644 --- a/docs/1.前端/1.基础/BFC 块级格式化上下文.md +++ b/docs/1.前端/1.基础/BFC 块级格式化上下文.md @@ -1,16 +1,14 @@ --- title: BFC 块级格式化上下文 -createTime: 2022-03-26T11:46:50.024Z -permalink: /article/o5g7ggvf +createTime: 2018/05/17 12:28:33 +permalink: /article/o5g7ggvf/ author: pengzhanbo -top: false -tags: +tags: - html -type: null --- ## 概念 -BFC, Block Formating Context。是 W3C CSS2.1规范中的一个概念。 是页面中的一块块级渲染区域,并且有一套渲染规则,它决定了其子元素将如何定位,以及和其他元素的关系和作用。 +BFC, Block Formatting Context。是 W3C CSS2.1规范中的一个概念。 是页面中的一块块级渲染区域,并且有一套渲染规则,它决定了其子元素将如何定位,以及和其他元素的关系和作用。 具有BFC特性的元素,可以看做是一个被隔离了的独立容器,容器内的元素不会在布局上影响到外面的元素,并且BFC具有普通容器所没有的一些特性。 diff --git a/docs/1.前端/1.基础/CSS at-rule.md b/docs/1.前端/1.基础/CSS at-rule.md index 02c6be7b..dbc6c1db 100644 --- a/docs/1.前端/1.基础/CSS at-rule.md +++ b/docs/1.前端/1.基础/CSS at-rule.md @@ -1,12 +1,10 @@ --- title: CSS At-Rules -createTime: 2022-03-26T11:46:50.024Z -permalink: /article/btkqop1a +createTime: 2018/10/06 08:16:38 +permalink: /article/btkqop1a/ author: pengzhanbo -tags: +tags: - css -top: false -type: null --- ## @charset diff --git a/docs/1.前端/1.基础/CSS media媒体查询.md b/docs/1.前端/1.基础/CSS media媒体查询.md index 55eb4e63..a489c01c 100644 --- a/docs/1.前端/1.基础/CSS media媒体查询.md +++ b/docs/1.前端/1.基础/CSS media媒体查询.md @@ -1,12 +1,10 @@ --- title: CSS 媒体查询 -createTime: 2022-03-26T11:46:50.024Z -permalink: /article/fe5ruia1 +createTime: 2018/08/18 08:43:02 +permalink: /article/fe5ruia1/ author: pengzhanbo -tags: +tags: - css -top: false -type: null --- 开发响应式网站时,常常需要使用到 media 媒体查询。这里总结下媒体查询的使用方法。 diff --git a/docs/1.前端/1.基础/CSS选择器.md b/docs/1.前端/1.基础/CSS选择器.md index 1eb5d687..c8d129ad 100644 --- a/docs/1.前端/1.基础/CSS选择器.md +++ b/docs/1.前端/1.基础/CSS选择器.md @@ -1,12 +1,10 @@ --- title: CSS选择器 -createTime: 2022-03-26T11:46:50.024Z -permalink: /article/8vev8ixl +createTime: 2018/09/20 03:29:20 +permalink: /article/8vev8ixl/ author: pengzhanbo -tags: +tags: - css -top: false -type: null --- ## Basic Selectors 基础选择器 diff --git a/docs/1.前端/1.基础/DOCTYPE 文档类型声明.md b/docs/1.前端/1.基础/DOCTYPE 文档类型声明.md index 282a12ea..46d81447 100644 --- a/docs/1.前端/1.基础/DOCTYPE 文档类型声明.md +++ b/docs/1.前端/1.基础/DOCTYPE 文档类型声明.md @@ -1,12 +1,10 @@ --- title: 文档类型声明 -createTime: 2022-03-26T11:46:50.025Z -permalink: /article/s8udp6vp +createTime: 2018/03/14 01:06:52 +permalink: /article/s8udp6vp/ author: pengzhanbo -tags: +tags: - html -top: false -type: null --- Web世界中,随着历史的发展,技术的迭代,发展出了许多不同的文档,只有了解文档的类型,浏览器才能正确的解析渲染文档。 diff --git a/docs/1.前端/1.基础/HTML5新特性.md b/docs/1.前端/1.基础/HTML5新特性.md index 7d2b1be1..93f6c32f 100644 --- a/docs/1.前端/1.基础/HTML5新特性.md +++ b/docs/1.前端/1.基础/HTML5新特性.md @@ -1,12 +1,10 @@ --- title: HTML5新特性 -createTime: 2022-03-26T11:46:50.025Z -permalink: /article/8rv45yuy +createTime: 2018/02/17 12:49:58 +permalink: /article/8rv45yuy/ author: pengzhanbo -tags: +tags: - html -top: false -type: null --- ## 语义标签 diff --git a/docs/1.前端/1.基础/WebComponent-template.md b/docs/1.前端/1.基础/WebComponent-template.md index 29fff30f..2df5e385 100644 --- a/docs/1.前端/1.基础/WebComponent-template.md +++ b/docs/1.前端/1.基础/WebComponent-template.md @@ -1,14 +1,12 @@ --- title: WebComponent——template lang: zh-CN -tags: - - html +tags: + - WebComponent - javascript -createTime: 2022-03-26T11:46:50.025Z -permalink: /article/5fmy4kla +createTime: 2018/8/2 11:15:27 +permalink: /article/5fmy4kla/ author: pengzhanbo -top: false -type: null --- 在web开发领域中,模板并不少见。从服务器端的模板语言,如`Django`、`jsp`等,应用十分广泛,存在了很长时间。又如前端,早期例如`art(artTemplate)`,以及近年来,大多数的MV*框架涌现,绝大多数在展现层使用了同样的渲染机制:模板。 diff --git a/docs/1.前端/1.基础/WebComponent自定义元素.md b/docs/1.前端/1.基础/WebComponent自定义元素.md index e122af64..26937359 100644 --- a/docs/1.前端/1.基础/WebComponent自定义元素.md +++ b/docs/1.前端/1.基础/WebComponent自定义元素.md @@ -1,13 +1,11 @@ --- title: WebComponent——custom elements -tags: - - html +tags: + - WebComponent - javascript -createTime: 2022-03-26T11:46:50.025Z -permalink: /article/m63fd7lf +createTime: 2018/08/01 11:15:27 +permalink: /article/m63fd7lf/ author: pengzhanbo -top: false -type: null --- diff --git a/docs/1.前端/1.基础/javascript模块化.md b/docs/1.前端/1.基础/javascript模块化.md new file mode 100644 index 00000000..9c9dc4dd --- /dev/null +++ b/docs/1.前端/1.基础/javascript模块化.md @@ -0,0 +1,239 @@ +--- +title: javascript模块化 发展历程 +createTime: 2022/04/10 03:00:41 +author: pengzhanbo +permalink: /article/javascript-modules/ +--- + +javascript模块化的发展,距今已有10个年头左右。 + +## 无模块化 + +在早期,javascript作为一门脚本语言,仅为协助表单校验等界面辅助增强,那时候的前端也比较简单, javascript不需要模块化。 + +## 命名空间 + +后来随着 javascript 需要承担更多的功能,代码量开始上升,为了避免全局命名冲突等问题,提出了使用命名空间的方案,将符合某种规则或者约定的代码,放到同一个命名空间下。 这算是 javascript模块化最早期的雏形。 + +``` js +YAHOO.util.Event.stopPropagation(e); +``` + +## 基本的模块化 + +在这个时期,出现了比较清晰的模块定义,通过闭包来做模块运行空间 +``` js +// 定义模块 +YUI.add('hello', function(Y) { + Y.sayHello = function() { + Y.DOM.set(el, 'innerHTML', 'hello!'); + } +}, '1.0.0', + requires: ['dom']); + +... +// 使用模块 +YUI().use('hello', function(Y) { + Y.sayHello('entry'); //
hello!
+}) +``` + +## CommonJs + +CommonJs 其实是一个项目,其目标是为 JavaScript 在网页浏览器之外创建模块约定, 在当年 javascript 的模块化思想还在官方的讨论中, 缺乏普遍可接受形式的javascript脚本模块单元。 + +CommonJs规范和当时出现的NodeJs相得益彰,共同走入了开发者的实现。 + +但 CommonJs 其实是面向网页浏览器之外的(如NodeJs,即面向服务端的模块化规范),并不适用于浏览器端。 + +### CommonJs 规范简介 + +在CommonJs 规范中, 每个文件都是一个模块,有自己的作用域,在文件中定义的变量、函数、类等,都是私有的,对其他文件不可见。 + +在每个模块中,有两个内部变量可以使用, `require` 和 `module` + +- `require` 用于加载某个模块。 +- `module` 表示当前模块,是一个对象。这个对象中保存了当前模块的信息。`exports` 是 `module` 上的一个属性,保存了当前模块要导出的接口或者变量,使用 `require` 加载的某个模块获取到的值就是那个模块使用 `exports` 导出的值。 + +::: code-tabs + +@tab a.js +``` js +var name = 'Mark'; +var age = 18; + +module.exports.name = name; +module.exports.getAge = function () { + return age; +} +``` + +@tab:active b.js +``` js +var moduleA = require('./a.js') +console.log(moduleA.a); // Mark +// 使用了未导出的变量,获取不到值 +console.log(moduleA.age) // undefined +console.log(moduleA.getAge()); // 18 +``` +::: + + +在NodeJs环境中,CommonJs的模块由于在服务器环境下,可以从本地进行加载,即 同步加载。 + +## AMD、CMD + +::: note 注释 +在我的印象中, CommonJs规范 和 AMD规范 出现的时间点 相差不远。 + +*AMD 早于 CommonJs* + +按我个人理解,CMD 在当年算是从 AMD 衍生出来的一个方案。 +::: +::: warning 注意 +CommonJs 和 CMD 是两种方案!不是一样的! +::: + +### AMD规范 +AMD规范,即 异步模块定义([Asynchronous Module Definition](https://github.com/amdjs/amdjs-api/wiki/AMD))。 + +AMD 采用 __异步加载模块__ 的方式。 + +AMD规范仅定义了一个 `define` 函数,它是一个全局变量: +``` +define(id?, dependencies?, factory); +``` +- `id` 描述的是当前模块的标识符; +- `dependencies` 则是当前模块的依赖数组, 它们会在 factory工厂方法被调用前被加载并执行, + 并且执行的结果必须以依赖数组定义的顺序,依此顺序作为参数传入 factory工厂方法。 +- `factory`为模块初始化要执行的函数或者对象。如果函数返回一个值,则该值应该设置为该模块的输出值。 + +### CMD规范 + +CMD规范,即 公共模块定义([Common Module Definition](https://github.com/cmdjs/specification/blob/master/draft/module.md)) + +CMD规范 定义了 一个 `define` 函数,它是一个全局变量: + +``` +define(id?, dependencies?, factory); +``` + +- `id` 描述的是当前模块的标识符; +- `dependencies` 是当前模块的依赖数组, 他们会在 factory 工厂方法被调用前完成加载,但并不立即执行。 +- `factory`为模块初始化要执行的函数或者对象。 + - 如果是一个函数,则函数接受三个参数: + ``` js + define(function (require, exports, module)) + ``` + `require` 用于同步加载并执行已经定义好的其他模块;获取模块的输出值, + `exports`是`module.exports`的别名,用于导出当前模块的输出值;`module`存储了当前模块的信息。 + - 如果是一个对象,则直接作为当前模块的输出值。 + +::: tip 两者的差异 + +AMD规范 和 CMD规范 从规范定义上来看,主要的差异为: + +- AMD 的模块在加载后是立即执行的,并且会按照依赖顺序依次传入 factory, + 而 CMD的模块在加载后并不立即执行,而是在 factory方法中,通过 `require` 方法调用执行模块获取结果; +::: + +### 规范的实现 + +- AMD流行的实现库是 [require.js](https://github.com/requirejs/requirejs); +- CMD流行的实现库是 [sea.js](https://github.com/seajs/seajs); + +::: warning 提示 +由于在当下已经越来越少会去选择使用 `require.js` 以及 `sea.js`, 这里就不多对这两个库做介绍说明。 +::: + +## NodeJs前端工具链 + +得益于 NodeJs 的能力,开源社区在模块化方面又再次向前继续迈进。 特别是在推出了 `NPM` 包管理工具后,前端的工具、模块化出现了井喷式发展。 + +### grunt gulp + +既然 CommonJs 不适用于 浏览器端的一个主要原因是同步加载和异步加载之间的问题,那么借助于 `grunt` 或 `gulp` 提供的前端工具,在开发时,还是以文件一模块,然后构建时,将模块文件打包在一起,那么由于都是在同一个文件中,则模块之间的加载则可以是同步的。 + +在这个时期,`grunt`、`gulp` 并没有提供直接的模块化打包能力,但是在其基础上,通过插件实现了文件合并,从而能够在开发时,以 某种模块规范进行项目架构和管理,再进行打包构建。 + +### webpack NPM + +真正让 前端模块化得到质的飞跃的,是 NPM的推出,内置到了 NodeJS 中。 + +而 webpack 的出现,这块 真正意义上的 模块打包工具,配合 NPM, 让模块化越来越得以更方便的运用于应用开发中。 + +webpack 作为一个 模块打包器, 在内部根据 CommonJs规范实现了 模块加载器,使得应用于浏览器端的javascript代码,也能够像 Node端的 javascript代码,拥有类似甚至相同的文件组织结构。 + +实现了一文件一模块,模块之间通过 `require` 函数进行 访问。 + +而 NPM的推出与流行,在前端引入了 `package` 包的概念,模块以包的形式进行管理, 让越来越多的开发者,能够共享各自开发的模块,开发者可以通过 NPM 安装其他开发者已开发好的模块,然后通过 `webpack` 实现开发时加载这些模块。 + +webpack 内部实现了 不同的 模块化规范,包括 匿名函数闭包`iife`, `AMD`, `CMD`,`CommonJs`等。 + +`webpack` 不仅将 javascript 作为模块,而是将一切资源都作为模块进行处理。 + +### 其他的模块打包工具 + +- [rollup](https://github.com/rollup/rollup) 轻量且快速的模块打包工具 +- [parcel](https://github.com/parcel-bundler/parcel) 零配置的开箱即用的模块打包工具 +- [vite](https://github.com/vitejs/vite) 基于rollup的前端工具 +- more... + +### 其他包管理工具 + +- [yarn](https://classic.yarnpkg.com/lang/en/) +- [pnpm](https://pnpm.io/) +- more... + +::: info 说明 +与`npm` 对比,都是社区对于 包管理 的不同理念、不同实践 下所产生的工具。 +三者互相发展,并都有各自的特色。 +::: + +## ES Modules + +[ES Modules](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Modules) + +随着 javascript的发展,ECMAScript将模块加载添加到了标准之中,浏览器也开始支持 模块加载。 + +使用 Javascript 模块依赖于 `import` 和 `export` 进行导入和导出。 + +在 `html` 导入 javascript模块脚本是,需要在 ` +``` +::: code-tabs + +@tab moduleA.js +``` js +import { name, getAge } from './moduleB.js'; + +console.log(name); +console.log(getAge()); +``` + +@tab moduleB.js +``` js +export const name = 'Mark'; + +const age = 18; + +export function getAge() { + return age; +} +``` +::: + + + +## Deno模块加载 + +Deno与 Node在模块加载上最大的差别, 就是 放弃了 项目中的`node_modules` 作为第三方包的存放目录,也抛弃了 类似于 NPM 的中心化管理的 模块管理工具。 + +Deno 推荐使用的是 去中心化的模块加载管理,支持直接从远程的任意站点加载提供的模块。 + +如从 官方的 [deno.lang](https://deno.land/),或者从 [unpkg.com](https://unpkg.com/) 加载第三方模块。 + +::: info 说明 +这种去中心化模块管理的模块加载方案,相对来说会比较依赖于网络环境,虽然远程的模块首次加载后也会被缓存,但进行生产部署时,往往生产服务器跟公网是隔离的,在这种情况下,就需要自建一个内部服务器作为代理,托管第三方的模块包。 +::: diff --git a/docs/1.前端/1.基础/meta 标签说明.md b/docs/1.前端/1.基础/meta 标签说明.md index eb14ea54..e5b9ce6c 100644 --- a/docs/1.前端/1.基础/meta 标签说明.md +++ b/docs/1.前端/1.基础/meta 标签说明.md @@ -1,12 +1,10 @@ --- title: meta 标签说明 -createTime: 2022-03-26T11:46:50.025Z -permalink: /article/bp1nxjs6 +createTime: 2018/03/15 01:21:48 +permalink: /article/bp1nxjs6/ author: pengzhanbo -tags: +tags: - html -top: false -type: null --- 标签提供关于 HTML 文档的元数据。它不会显示在页面上,但是对于机器是可读的。可用于浏览器(如何显示内容或重新加载页面),搜索引擎(关键词),或其他 web 服务。 diff --git a/docs/1.前端/1.基础/原型链与继承.md b/docs/1.前端/1.基础/原型链与继承.md index a89dcaf8..575ccaf8 100644 --- a/docs/1.前端/1.基础/原型链与继承.md +++ b/docs/1.前端/1.基础/原型链与继承.md @@ -1,17 +1,15 @@ --- title: 继承与原型链 -createTime: 2022-03-26T13:40:54.727Z -permalink: /article/extends-prototype +createTime: 2018/07/06 09:40:54 +permalink: /article/extends-prototype/ author: pengzhanbo -tags: +tags: - javascript -top: false -type: null --- 当谈到继承时,javascript只有一种结构:对象。 -每个实例对象(object)都有一个私有属性(\_\_proto\_\_)指向它的构造函数的原型对象(__prototype__)。 -该原型对象也有自己的原型对象((\_\_proto\_\_),层层向上,直到有一个的原型对象为null。根据定义,null没有原型,并作为这个原型链的最后一个环节。 +每个实例对象(object)都有一个私有属性`__proto__`指向它的构造函数的原型对象 __prototype__。 +该原型对象也有自己的原型对象`__proto__`,层层向上,直到有一个的原型对象为null。根据定义,null没有原型,并作为这个原型链的最后一个环节。 @@ -20,3 +18,165 @@ type: null ## 基于原型链的继承 ### 继承属性 + +`javascript` 对象是动态的属性"包裹"(指自身的属性)。同时,对象还有一个指向一个原型对象的链。 +当访问一个对象的属性时,不仅会在该对象上查找,也会在该对象的原型上查找,进而在该对象的原型的原型上查找, +依次层层向上查找,直到找到匹配的属性,或者到达原型链的末尾。 + +::: info ECMAScript标准 +`obj.[[Prototype]]`符号用于指向`obj`的原型。从`ES6`开始`[[Prototype]]` +可以通过`Object.getPrototypeof()`和 `Object.setPrototypeof()` 访问器进行访问。 +等同于许多浏览器实现的属性`__proto__`。 +::: + +从代码示例来分析继承属性: + +在这个示例中,定义了一个函数`Foo`, 它拥有自身属性 `a`和`b`。 + +然后创建一个 `Foo` 的示例 `foo`。 +``` js +function Foo() { + this.a = 1 + this.b = 2 +} +let foo = new Foo() + +Foo.prototype.c = 3 +Foo.prototype.d = 4 + +// 输出自身的所有属性 +console.log(foo) // { a: 1, b: 2 } + +// 自身拥有属性 a +console.log(foo.a) // 1 +// 自身拥有属性 b +console.log(foo.b) // 2 +// 自身没有属性 c, 但其原型上有属性 c +console.log(foo.c) // 3 +// 自身没有属性 d,但其原型上有属性 d +console.log(foo.d) // 4 + +``` +在这个示例中, 整个原型链如下 +``` js +// { a: 1, b: 2 } => { c: 3, d: 4 } => Object.prototype => null +``` + +### 继承方法 + +在`Javascript` 中,并没有其他基于类的语言所定义的 方法。 +任何函数都可以添加到对象上做为对象的属性。 +函数属性的继承与其他属性的继承没有差别。 + +当继承的函数被调用时,`this`指向的是当前继承的对象,而不是继承的函数所在的原型对象。 + +``` js +var o = { + a: 1, + f: function() { + return this.a + 1 + } +} + +// 此时 函数f 中的 this 指向了 o +console.log(o.f()) // 2 + +var p = Object.create(0) +p.a = 3 + +// p从o上继承了函数f, 此时函数f中的 this 指向了 p +console.log(p.f()) // 4 +``` + +## 创建对象和生成原型链 + +### 使用语法结构创建的对象 +``` js +var o = { a: 1 } +// 原型链: o => Object.prototype => null + +var arr = ['a', 'b'] +// 原型链: arr => Array.prototype => Object.prototype => null + +function f() {} +// 原型链: f => Function.prototype => Object.prototype => null +``` + +### 使用构造器创建对象 +``` js +function Person() { + this.a = 1 +} +Person.prototype = { + f: function () { + return this.a + } +} +var p = new Person() +// 原型链: p => Person.prototype => Object.prototype => null +``` + +### 使用`Object.create`创建的对象 +``` js +var a = { a: 1 } +var b = Object.create(a) +// 原型链 b => a => Object.prototype => null + +var c = Object.create(null) +// 原型链 c => null +``` + + +## 扩展原型链的方法 + +### 构造器创建对象,原型赋值给另一个构造函数原型 +``` js +function foo() {} +foo.prototype = { + a: 'foo' +} + +function bar() {} + +var proto = new foo() +proto.b = 'bar' +bar.prototype = proto + +var p = new bar() +console.log(p.a) // foo +console.log(p.b) // bar +``` + +### Object.create +``` js +function foo() {} +foo.prototype = { + a: 'foo' +} +function bar() {} + +var proto = Object.create(foo.prototype) +proto.b = 'bar' +bar.prototype = proto + +var p = new bar() +console.log(p.a) // foo +console.log(p.b) // bar + +``` + +``` js +function foo() {} +foo.prototype = { + a: 'foo' +} + +function bar() {} + +var proto = Object.create(foo.prototype, { b: 'bar' }) +bar.prototype = proto + +var p = new bar() +console.log(p.a) // foo +console.log(p.b) // bar +``` diff --git a/docs/1.前端/1.基础/正则表达式使用手册.md b/docs/1.前端/1.基础/正则表达式使用手册.md index 3fb9556b..b09884f3 100644 --- a/docs/1.前端/1.基础/正则表达式使用手册.md +++ b/docs/1.前端/1.基础/正则表达式使用手册.md @@ -1,10 +1,10 @@ --- title: 正则表达式 lang: zh-CN -createTime: 2022-03-26T11:46:50.025Z -permalink: /article/e8qbp0dh +createTime: 2018/11/26 11:15:27 +permalink: /article/e8qbp0dh/ author: pengzhanbo -tags: +tags: - javascript top: false type: null @@ -56,7 +56,7 @@ _以下讨论以正则表达式字面量来创建正则表达式_ 元字符也叫特殊字符,是正则表达式规定的,对符合特定的单一的规则的字符的描述。 | 字符 | 含义 | |:----:|-----| -|\\|在非特殊字符的前面加反斜杠,表示这个字符是特殊的,不能从字面上解释。比如在`\d`描述的不是一个普通的字符`d`,而是正则表达式中的数值`0-9`。
如果在特殊字符前面加反斜杠,这表示将这个字符转义为普通字符,比如`?`在正则中有其特殊含义,前面加反斜杠\?,这可以将其转为普通的`?`。| +| \\ |在非特殊字符的前面加反斜杠,表示这个字符是特殊的,不能从字面上解释。比如在`\d`描述的不是一个普通的字符`d`,而是正则表达式中的数值`0-9`。
如果在特殊字符前面加反斜杠,这表示将这个字符转义为普通字符,比如`?`在正则中有其特殊含义,前面加反斜杠\?,这可以将其转为普通的`?`。| |^|匹配文本开始的位置,如果开启了多行标志,也会匹配换行符后紧跟的位置。
比如`^a`会匹配`abc`,但不会匹配到`bac`。| |$|匹配文本结束的位置,如果开启了多行标志,也会匹配换行符前紧跟的位置。
比如`b$`会匹配`acb`,但不会匹配到`abc`。| |*|匹配前一个表达式0次到多次。
比如,`ab*`会匹配到`abbbbbbc`中的`abbbbbb`,以及`acbbbbb`中的`a`。| diff --git a/docs/1.前端/1.基础/浏览器端的事件循环.md b/docs/1.前端/1.基础/浏览器端的事件循环.md index 8cc786e5..e9cd6d59 100644 --- a/docs/1.前端/1.基础/浏览器端的事件循环.md +++ b/docs/1.前端/1.基础/浏览器端的事件循环.md @@ -1,9 +1,189 @@ --- title: Event Loop 浏览器端的事件循环 -createTime: 2022-03-26T11:46:50.000Z -permalink: /article/browser-event-loop +createTime: 2021/06/03 01:53:17 +permalink: /article/browser-event-loop/ author: pengzhanbo -top: false -type: null +tags: + - javascript --- +事件循环,即 Event-Loop。 + +## 什么是 Event-Loop ? + +Event-Loop 是一个执行模型,在 [html5规范](https://html.spec.whatwg.org/multipage/webappapis.html#event-loops) 中进行了浏览器端的 Event-Loop 的明确定义。 + +## 宏任务与微任务 + +javascript 有两种异步任务,分别是`宏任务`和`微任务` + +### 宏任务 + +宏任务,`macro task`,也叫 `tasks`,一些异步任务的回调会依次进入 `macro task queue`,等待后续被调用。 + +这些异步任务包括: +- setTimeout +- setInterval +- setImmediate (Node独有) +- requestAnimationFrame (浏览器独有) +- I/O +- UI rendering + +### 微任务 + +微任务, `micro task`, 也叫 `jobs`,另一些异步任务的回调会依次进入`micro task queue`,等待后续被调用。 + +这些异步任务包括: +- process.nextTick(Node独有) +- Promise +- Object.observe +- MutationObserver + +## 事件循环 Event Loop + +1. 执行全局 `script` 代码,这些代码有一些是同步语句,有一些是异步语句(如: setTimeout); +2. 全局`script`同步代码执行完毕后,调用栈Stack会清空; +3. 从微任务`micro task queue` 中取出位于队首的任务,放入调用栈Stack中执行,执行完后`micro task queue`长度减一; +4. 继续取出微任务`micro task queue`位于队首的任务,放入调用栈Stack中执行, + 以此类推,直到把`micro task queue`中的所有任务都执行完毕。__注意,如果在执行micro task的过程中,产生了`micro task`那么会加入到队列的末尾,也会在这个周期被调用执行__; +5. `micro task`中的所有无人都执行完毕,此时 `micro task queue` 为空队列,调用栈Stack也为空; +6. 取出宏队列 `macro task queue` 中位于队首的任务,放入Stack中执行; +7. 执行完毕后,调用栈Stack为空; +8. 重复第3-7个步骤; +9. 以此继续循环重复; + +::: tip 重点 +1. 宏任务`marco task` 一次只从队列中取出一个任务执行,执行后就去执行微任务队列中的任务; +2. 微任务队列中所有的任务都会依次取出来执行,直到`micro task queue`为空, + 且当前微任务执行过程中产生新的`micro task`,也会加入到当前`micro task queue`; +3. `UI Rendering`由浏览器自定判断决定执行节点。但是只要执行`UI Rendering`,它的节点是在执行完所有 + `micro task`之后,下一个`macro task`之前,紧跟着执行`UI Rendering` +::: + +尝试从代码层面来分析 event-loop: + +::: note 抖个机灵 +代码人看代码应该比看流程图要来得好理解了吧(bushi) +::: + +``` js +// 执行器 +// 接收一段javascript代码 +class Execution { + constructor(code) { + this.code = code + this.macroTaskQueue = [] + this.microTaskQueue = [] + } + + // 启动执行 + exec() { + // 首次运行,将 传入的 code 推入到 Track中执行 + // 并获取其中的 宏任务和 微任务 + const { macroTaskQueue, microTaskQueue } = this.run(this.code) + // 将宏任务和微任务 推入到 各自的 队列中 + this.macroTaskQueue.push(...macroTaskQueue) + this.microTaskQueue.push(...microTaskQueue) + // 开始执行微任务 + this.runMicroTaskQueue() + } + + // 执行微任务队列 + runMicroTaskQueue() { + // 遍历 微任务队列中的所有任务 + // 当当前的 微任务队列清空时,遍历才结束 + while (this.microTaskQueue.length) { + // 取出 队首的微任务 + const task = this.microTaskQueue.shift() + // 将 当前微任务 推入到 执行栈中执行 + // 并将返回的 宏任务和微任务 继续 推入到 各自的队列中 + const { macroTaskQueue, microTaskQueue } = this.run(task) + this.macroTaskQueue.push(...macroTaskQueue) + this.microTaskQueue.push(...microTaskQueue) + } + // 当前微任务执行完毕,继续执行宏任务 + this.runMacroTaskQueue() + } + + // 执行宏任务队列 + runMacroTaskQueue() { + // 从 宏任务队列队首 取出一个 宏任务 + const task = this.macroTaskQueue.shift() + // 将当前 宏任务 推入到 执行栈中执行 + // 并将返回的 宏任务和微任务 继续 推入到 各自的队列中 + const { macroTaskQueue, microTaskQueue } = this.run(task) + this.macroTaskQueue.push(...macroTaskQueue) + this.microTaskQueue.push(...microTaskQueue) + // 再一次执行 微任务队列中的任务 + this.runMicroTaskQueue() + } + + // 执行栈调用 + run(task) { + // track 函数表示 执行栈 + // 执行完毕返回 产生的 微任务队列 和 宏任务队列 + const { macroTaskQueue, microTaskQueue } = track(task) + return { macroTaskQueue, microTaskQueue } + } +} +const execute = new Execution(scriptCode) +execute.exec() +``` + +`event-loop` 概念性的内容大体就这么多,接下来从示例中来实际执行情况。 + +## 示例 + +::: warning 注意 +以下示例是在 `Chrome` 中执行后获得的结果,在其他浏览器的表现并不一定完全相同。 +::: + + +可以尝试自己心中执行这段代码后的打印顺序,再切换到`Console`中看实际的运行结果,是否符合你的预期结果。 + +::: code-tabs + +@tab javascript +``` js +console.log('script') + +setTimeout(() => { + console.log('timeout 1') + Promise.resolve().then(() => { + console.log('promise 1') + }) +}) + +new Promise((resolve) => { + console.log('promise resolver') + + Promise.resolve().then(() => { + console.log('promise 3') + }) + + resolve('promise 2') +}).then((data) => { + console.log(data) +}) + +setTimeout(() => { + console.log('timeout 2') +}) + +console.log('end') +``` + + +@tab Console +``` txt +script +promise resolver +end +promise 3 +promise 2 +timeout 1 +promise 1 +timeout 2 +``` +::: + diff --git a/docs/1.前端/1.基础/详解Promise.md b/docs/1.前端/1.基础/详解Promise.md index cf8b94ed..3ccec921 100644 --- a/docs/1.前端/1.基础/详解Promise.md +++ b/docs/1.前端/1.基础/详解Promise.md @@ -1,10 +1,10 @@ --- title: 详解 Promise -createTime: 2022-03-26T11:46:50.026Z -permalink: /article/q40nq4hv +createTime: 2020/11/22 12:58:28 +permalink: /article/q40nq4hv/ author: pengzhanbo -sticky: true -type: null +tags: + - javascript --- ## 概述 @@ -47,6 +47,8 @@ Promise 创建后,必然处于以下几种状态 *then()* 接收两个函数参数(也可以仅接收一个函数参数 onFulfilled)。 - onFulfilled 函数参数,表示当 promise的状态从 `pending` 更新为`fulfilled` 时触发,并将成功的结果 value 作为`onFulfilled`函数的参数。 - onRejected 函数参数,表示当promise的状态从 `pending` 更新为`rejected` 时触发,并将失败的原因 reason 作为 `onRejected`函数的参数。 + + *then()* 方法返回的结果会被包装为一个新的promise实例。 #### `.catch(onRejected)` *catch()* 可以相当于 *.then(null, onRejected)*,即仅处理当promise的状态从 `pending` 更新为`rejected` 时触发。 @@ -90,6 +92,162 @@ promise }) ``` +## Promise代码实现 +```js +const PENDING = "pending"; +const FULFILLED = "fulfilled"; +const REJECTED = "rejected"; +const microtask = globalThis.queueMicrotask || ((cb) => setTimeout(cb, 0)); + +function LikePromise(resolver) { + if (typeof resolver !== "function") { + throw new TypeError(`Promise resolver ${resolver} is not a function`); + } + this.state = PENDING; + this.value = undefined; + this.reason = undefined; + this.fulfillQueue = []; + this.rejectQueue = []; + + const that = this; + + function reject(reason) { + if (that.state === PENDING) { + that.state = REJECTED; + that.reason = reason; + that.rejectQueue.forEach((cb) => cb(reason)); + } + } + + function resolve(value) { + if (that.state === PENDING) { + that.state = FULFILLED; + that.value = value; + that.fulfillQueue.forEach((cb) => cb(value)); + } + } + + try { + resolver(resolve, reject); + } catch (e) { + reject(e); + } +} + +function resolvePromise(promise, x, resolve, reject) { + if (promise === x) { + reject(new TypeError("chaining cycle")); + } else if (x !== null && (typeof x === "object" || typeof x === "function")) { + let used = false; + try { + const then = x.then; + if (typeof then === "function") { + then.call( + x, + (y) => { + if (used) return; + used = true; + resolvePromise(promise, y, resolve, reject); + }, + (r) => { + if (used) return; + used = true; + reject(r); + } + ); + } else { + if (used) return; + used = true; + resolve(x); + } + } catch (e) { + if (used) return; + used = true; + reject(e); + } + } else { + resolve(x); + } +} + +LikePromise.prototype.then = function (onFulfilled, onRejected) { + onFulfilled = + typeof onFulfilled === "function" ? onFulfilled : (value) => value; + onRejected = + typeof onRejected === "function" + ? onRejected + : (reason) => { + throw reason; + }; + const that = this; + const promise = new LikePromise((resolve, reject) => { + if (that.state === FULFILLED) { + microtask(() => { + try { + const x = onFulfilled(that.value); + resolvePromise(promise, x, resolve, reject); + } catch (e) { + reject(e); + } + }); + } else if (that.state === REJECTED) { + microtask(() => { + try { + const x = onRejected(that.reason); + resolvePromise(promise, x, resolve, reject); + } catch (e) { + reject(e); + } + }); + } else { + that.fulfillQueue.push(() => { + microtask(() => { + try { + const x = onFulfilled(that.value); + resolvePromise(promise, x, resolve, reject); + } catch (e) { + reject(e); + } + }); + }); + that.rejectQueue.push(() => { + microtask(() => { + try { + const x = onRejected(that.reason); + resolvePromise(promise, x, resolve, reject); + } catch (e) { + reject(e); + } + }); + }); + } + }); + return promise; +}; + +LikePromise.prototype.catch = function (onRejected) { + return this.then(null, onRejected); +}; + +LikePromise.prototype.finally = function (onFinally) { + return this.then( + (value) => LikePromise.resolve(onFinally()).then(() => value), + (reason) => + LikePromise.resolve(onFinally()).then(() => { + throw reason; + }) + ); +}; + +LikePromise.resolve = function (value) { + return new LikePromise((resolve) => resolve(value)); +}; + +LikePromise.reject = function (reason) { + return new LikePromise((_, reject) => reject(reason)); +}; +``` + ## `Promise` 静态方法 diff --git a/docs/1.前端/10.开发/1px解决方案.md b/docs/1.前端/10.开发/1px解决方案.md index 668648aa..5191ff4b 100644 --- a/docs/1.前端/10.开发/1px解决方案.md +++ b/docs/1.前端/10.开发/1px解决方案.md @@ -1,13 +1,12 @@ --- title: 1px解决方案 -createTime: 2022-03-26T11:46:50.026Z -permalink: /article/tz7ncicn +createTime: 2019/05/15 10:41:32 +permalink: /article/tz7ncicn/ author: pengzhanbo -tags: +tags: - html - css - develop -banner: /images/big-banner.jpg --- 在日常移动端前端应用开发中,经常遇到一个问题就是 1px的线在移动端 Retina屏下的渲染并未达到预期。以下总几种不同场景下的 1px解决方案。 diff --git a/docs/1.前端/10.开发/lerna使用.md b/docs/1.前端/10.开发/lerna使用.md index 60c7ec73..532ccf7b 100644 --- a/docs/1.前端/10.开发/lerna使用.md +++ b/docs/1.前端/10.开发/lerna使用.md @@ -1,13 +1,13 @@ --- title: lerna使用 -createTime: 2022-03-26T11:46:50.027Z -permalink: /article/i1wc1uld +createTime: 2021/11/26 06:28:37 +permalink: /article/i1wc1uld/ author: pengzhanbo -top: false -type: null --- -![lerna](https://user-images.githubusercontent.com/645641/79596653-38f81200-80e1-11ea-98cd-1c6a3bb5de51.png) +::: center +![lerna](https://user-images.githubusercontent.com/645641/79596653-38f81200-80e1-11ea-98cd-1c6a3bb5de51.png){ style="width: 50%" } +::: ## 概述 diff --git a/docs/1.前端/10.开发/pnpm.md b/docs/1.前端/10.开发/pnpm.md new file mode 100644 index 00000000..1feac4f0 --- /dev/null +++ b/docs/1.前端/10.开发/pnpm.md @@ -0,0 +1,280 @@ +--- +title: pnpm 包管理器 +createTime: 2022/05/10 03:50:47 +author: pengzhanbo +permalink: /article/84nu27cz/ +--- + +`pnpm` 是一款新兴不久的包管理器,相比于 `npm` 和 `yarn`,`pnpm` 拥有更快的安装速度,同时节约磁盘空间。 + + + +## 介绍 + +![pnpm](https://pnpm.io/zh/img/pnpm-no-name-with-frame.svg) + +`pnpm` 是一个类似于 `npm` 、`yarn` 的包管理器。 + +`pnpm` 安装的包都会被存储在硬盘的某个相同位置,软甲包通过硬链接到这个位置,实现共享同一版本的依赖, +对于同一依赖的不同版本,`pnpm update` 时,只会向存储中心添加新版本更新的文件,而不是仅仅应为一个文件的改变而复制整个新版本包的内容。 + +`pnpm` 内置支持 `monorepo`,即单仓库多包。 + +## 比较 + +### pnpm/yarn/npm + +| 功能 | pnpm | yarn | npm | +| -- | :--: | :--: | :--: | +| 工作空间支持(monorepo)| ✔️ | ✔️ | ✔️ | +| 隔离的`node_modules` | ✔️ - 默认 | ✔️ | ❌ | +| 提升的`node_modules` | ✔️ | ✔️ | ✔️ -默认 | +| 自动安装peers | ✔️ - `auto-install-peers=true` | ❌ | ✔️ | +| Plug'n'Play | ✔️ | ✔️ - 默认 | ❌ | +| 零安装 | ❌ | ✔️ | ❌ | +| 修复依赖项 | ✔️ | ✔️ | ❌ | +| 管理nodejs版本 | ✔️ | ❌ | ❌ | +| 有锁文件 | ✔️ - `pnpm-lock.yaml` | ✔️ - `yarn.lock` | ✔️ - `package-lock.json` | +| 支持覆盖 | ✔️ | ✔️ - `resolutions` | ✔️ | +| 内容可寻址存储 | ✔️ | ❌ | ❌ | +| 动态包执行 | ✔️ - `pnpm dlx` | ✔️ - `yarn dlx` | ✔️ - `npx` | +| Side-effects cache | ✔️ | ❌ | ❌ | + +### 区别 + +与 `yarn/npm` 不同的是,`pnpm` 并非采用 *扁平的`node_modules`* 来管理依赖项, +而是基于符号链接的`node_modules` 结构。 + +`node_modules` 中每个包的每个文件都是来自内容可寻址存储的硬链接。 假设安装了依赖于 `bar@1.0.0` 的 `foo@1.0.0`。 `pnpm` 会将两个包硬链接到 `node_modules` 如下所示: + +```sh +node_modules +└── .pnpm + ├── bar@1.0.0 + │ └── node_modules + │ └── bar -> /bar + │ ├── index.js + │ └── package.json + └── foo@1.0.0 + └── node_modules + └── foo -> /foo + ├── index.js + └── package.json +``` +这是 `node_modules` 中的唯一的“真实”文件。 一旦所有包都硬链接到 `node_modules`, +就会创建符号链接来构建嵌套的依赖关系图结构。 + +`bar` 将被符号链接到 `foo@1.0.0/node_modules` 文件夹,然后处理依赖关系,`foo` 将被符号链接至根目录的 `node_modules` 文件夹: + +```sh +node_modules +├── foo -> ./.pnpm/foo@1.0.0/node_modules/foo +└── .pnpm + ├── bar@1.0.0 + │ └── node_modules + │ └── bar -> /bar + └── foo@1.0.0 + └── node_modules + ├── foo -> /foo + └── bar -> ../../bar@1.0.0/node_modules/bar +``` + +这种布局的好处在于,只有真正在依赖项中的包才能访问。 +如果是平铺的 `node_modules` 结构,所有被提升的包都可以访问。 + +### 优势 + +- 节约磁盘空间 + + 包存储在全局存储中,pnpm 创建从全局存储到项目下 `node_modules` 文件夹的 硬链接,硬链接指向磁盘上原始文件所在的同一位置。不同软件包可以共享相同依赖项所占用的空间。 + + 如果是单个依赖的不同版本,如版本更新,`pnpm` 仅安装版本更新的文件,而不是全量安装整个新版本的包。 + +- 安装速度快 + + 软件包中安装依赖时,如果检索到在本地的全局存储中已安装过该依赖,那么不会从网络下重新安装,而是直接创建硬链接到软件包中。 + +- 内置支持 monorepo + + 支持 单仓库多包,通过 `pnpm-workspace.yaml` 配置工作空间,通过 `workspace:*` 协议引用工作空间的依赖包。 + +## 安装 + +### 通过 npm 安装 + +```sh +npm install -g pnpm +``` + +### 通过 Corepack 安装 + +从 v16.13 开始,Node.js 发布了 `Corepack` 来管理包管理器。 这是一项实验性功能,因此需要通过运行如下脚本来启用它: + +```sh +corpack enabled +``` + +这将自动在系统上安装 pnpm。 但是,它可能不是最新版本的 pnpm。 +若要升级,请检查 [最新的 pnpm 版本](https://github.com/pnpm/pnpm/releases/tag/v7.9.1) 并运行: + +```sh +corepack prepare pnpm@ --activate +``` +### 使用独立脚本安装 + +在 POSIX 系统上,即使没有安装 Node.js,也可以使用以下脚本安装 pnpm: + +```sh +curl -fsSL https://get.pnpm.io/install.sh | sh - +``` + +如果没有安装 `curl` ,也可以使用 `wget`: + +```sh +wget -qO- https://get.pnpm.io/install.sh | sh - +``` + +在 Windows 系统中,如果使用 Powershell: + +```sh +iwr https://get.pnpm.io/install.ps1 -useb | iex +``` + +### 使用 Homebrew 安装 + +```sh +brew install pnpm +``` + +### 使用 Scoop 安装 + +```sh +scoop install nodejs-lts pnpm +``` + +## 使用 + +`pnpm` 在使用上 与 `npm` 、`yarn` 的使用上差别不大,但需要注意的区别,`pnpm` 会严格校验所有参数, +比如,`pnpm install --target_arch x64` 会执行失败,因为 `--target_arch x64` 不是 `pnpm install` 的有效参数。 + +### 常用命令 + +#### `pnpm install` + +别名 `pnpm i` + +等效于 `npm install` / `yarn` + +用于安装项目所有依赖。 + +[pnpm install 官方文档](https://pnpm.io/zh/cli/install) + +#### `pnpm add ` + +安装软件包及其依赖的任何软件包。 默认情况下,任何新软件包都安装为生产依赖项。 + +[pnpm add 官方文档](https://pnpm.io/zh/cli/add) + +#### `pnpm remove` + +别名: `rm` `uninstall` `un` + +从 `node_modules` 和项目的 `package.json` 中删除相关 packages。 + +[pnpm remove 官方文档](https://pnpm.io/zh/cli/remove) + +#### `pnpm update` + +别名: `up` `upgrade` + +`pnpm update` 根据指定的范围更新软件包的最新版本。 + +在不带参数的情况下使用时,将更新所有依赖关系。 您可以使用一些模式来更新特定的依赖项。 + +[pnpm update 官方文档](https://pnpm.io/zh/cli/update) + +更多命令请查阅[官方文档](https://pnpm.io/zh/cli/add) + +### 配置 + +#### `.npmrc` + +`pnpm` 从命令行、环境变量和 `.npmrc` 文件中获取其配置。 + +`pnpm config` 命令可用于更新和编辑 用户和全局 .npmrc 文件的内容。 + +四个相关文件分别为: + +- 每个项目的配置文件(`/path/to/my/project/.npmrc`) +- 每个工作区的配置文件(包含 `pnpm-workspace.yaml` 文件的目录) +- 每位用户的配置文件( `~/.npmrc` ) +- 全局配置文件( `/etc/.npmrc` ) + +#### `pnpm-workspace.yaml` + +`pnpm-workspace.yaml` 定义了 工作空间 的根目录,并能够使工作空间中包含 / 排除目录 。 默认情况下,包含所有子目录。 + +``` yaml +packages: + # 定义 packages 目录下的所有子目录都为一个 package + - 'packages/*' + # 定义 components 目录下的所有子目录都为一个 package + - 'components/**' + # 排除任何目录中的 test 目录下的所有目录 + - '!**/test/**' +``` + +## 工作空间 + +pnpm 内置了对单一存储库(也称为多包存储库、多项目存储库或单体存储库)的支持, 你可以创建一个 workspace 以将多个项目合并到一个仓库中。 + +一个 workspace 的根目录下必须有 `pnpm-workspace.yaml` 文件, 也可能会有 `.npmrc` 文件。 + +### Workspace 协议 (workspace:) + +默认情况下,如果可用的 packages 与已声明的可用范围相匹配,pnpm 将从工作区链接这些 packages。 例如,如果 `bar` 中有 `"foo":"^1.0.0"` 的这个依赖项,则 `foo@1.0.0` 链接到 `bar。` 但是,如果 `bar` 的依赖项中有 `"foo": "2.0.0"`,而 `foo@2.0.0` 在工作空间中并不存在,则将从 `npm registry` 安装 `foo@2.0.0` 。 这种行为带来了一些不确定性。 + +幸运的是,pnpm 支持 workspace 协议 `workspace:` 。 当使用此协议时,pnpm 将拒绝解析除本地 workspace 包含的 package 之外的任何内容。 因此,如果设置为 `"foo": "workspace:2.0.0"` 时,安装将会失败,因为 `"foo@2.0.0"` 不存在于此 workspace 中。 + +使用示例: + +工作空间中存在以下项目: +```sh ++ packages/ + + foo/ + + bar/ + + qar/ + + zoo/ +``` + +如果各个项目以其目录名作为其 package name,那么可以在其他项目中如下引入依赖: + +``` json +{ + "dependencies": { + "foo": "workspace:*", + "bar": "workspace:~", + "qar": "workspace:^", + "zoo": "workspace:^1.5.0" + } +} +``` + +::: tip +引入依赖的包名,是由包的 `package.json name` 确定,而不是 workspace 目录下的目录名确定。 +::: + +### 发布 Workspace + +当以上示例进行发布时,会被转换为 +```json +{ + "dependencies": { + "foo": "1.5.0", + "bar": "~1.5.0", + "qar": "^1.5.0", + "zoo": "^1.5.0" + } +} +``` +这个功能允许你发布转化之后的包到远端,并且可以正常使用本地 workspace 中的 packages,而不需要其它中间步骤。包的使用者也可以像常规的包那样正常使用,且仍然可以受益于语义化版本。 diff --git a/docs/1.前端/10.开发/前端路由.md b/docs/1.前端/10.开发/前端路由.md new file mode 100644 index 00000000..7bbdd88b --- /dev/null +++ b/docs/1.前端/10.开发/前端路由.md @@ -0,0 +1,135 @@ +--- +title: 前端路由 +createTime: 2019/09/13 04:13:56 +author: pengzhanbo +permalink: /article/xhb2iacu/ +--- + +在现代前端中,SPA应用是一种主流的前端应用交互方案,其中,前端路由是实现SPA应用的关键技术之一。 + + + +## 路由 + +**路由(Router)** 一般指的是 URI 中 pathname + basename + hash + query 所组成的 路径。 + +在前端中, **路由** 一般指的是 **随着浏览器中的地址栏的变化,呈现不同的内容给用户**。 +浏览器地址栏的变化,即是 访问链接的变化,具体指的就是 pathname + basename + hash + query 部分的变化。 + +示例: + +``` +/a/b +/a/b/#/hash +/a/b/#/hash?c=1 +``` + +对于前端路由,一般会选择 监听 hash 部分的变化, 或者监听 pathname 部分的变化,从而一般有两种路由模式: + + +### hash 模式 + +通过监听 地址栏中 hash 部分的变化,从而呈现不同的内容。 + +::: center +**https://example.com/index.html ==#/a/b/==** +::: + +在浏览器中,通过注册 **hashchange** 事件,监听 **hash** 变化。 + +``` js +window.addEventListener('hashchange', () => { + const hash = window.location.hash; + console.log(hash) // #/a/b/ +}) +``` + +通过 hash 实现路由的优势在于, hash 仅依赖于浏览器,且hash的变化不会直接导致页面刷新,天然适合于实现 前端路由。 + +### history 模式 + +通过监听 地址栏中 pathname 部分的变化,从而呈现不同的内容。 + +history模式是依赖于 浏览器端的 History API 而实现。 +History API 允许我们对浏览器会话历史记录进行访问并操作。 + +::: center +**https://example.com ==/a/b/==** +::: + +History API 通过 history.pushState() 和 history.replaceState() 方法,新增或者替换历史记录, +通过 popState 事件监听历史记录的变化。 + + +直接操作历史记录的变化,结果会改变浏览器地址栏的显示内容,但不会引起浏览器刷新页面。 +但是由于变化的部分一般是 `pathname + basename` 的部分,如果手动刷新页面,可能会导致浏览器通过当前路径 +向服务器发起请求找不到对应的资源而返回404,所以一般需要在服务器端的HTTP服务器进行配置,将相关的路径请求资源, +都指向同一个html资源文件。 + +> [History API](https://developer.mozilla.org/zh-CN/docs/Web/API/History_API) + +### 其他模式 + +除了上述两种一般用于浏览器端中的路由模式,为了满足其他的场景,比如 在SSR场景下,需要在服务端模拟路由在生成页面内容, +或者在 electron 桌面应用中。一般会基于 memory 实现一种 仅通过 memory 的变化的路由的模式。 + +在这个模式中,通过一个普通的 JavaScript 字符串或者对象,来实现模拟 路由路径地址以及相关功能。 + +## Router解析 + +前端路由在不同的库或者框架中实现,一般会采用一套通用的解析规则,在实现细节上有所差异。 + +一个路由地址,一般包含如下几个部分: + +- **path** 表示路由的路径 +- **params** 表示路由的路径动态匹配结果 +- **query** 表示路由携带的参数,未解析前为 queryString, 解析后为 queryObject + +如一个 路由地址: `/a/b/?c=1` 中, `/a/b/` 部分一般称为 **path** , `?c=1` 部分一般被称为 `query`。 + +### 具名路由 + +具名路由,也称 静态路由 指在声明一个路由时,对地址栏路径地址使用 全等匹配,仅当声明的路由与路径地址全等时,才命中路由。 + +``` js +// 浏览器地址栏: https://example.com/a/b/ +// 声明路由: +const routes = [ + { + path: '/a/b', // 命中当前路由 + }, + { + path: '/a/c', // 不一致,未命中 + }, + { + path: '/a', // 不一致,未命中 + }, + { + path: '/a/b/c', // 不一致,未命中 + } +] +``` + +### 路由匹配 + +路由匹配,指通过 一套匹配规则,对地址栏路径地址 进行 规则匹配,当命中匹配规则时,则命中路由。 +一般场景下, 通过 `/:pathname` 的格式来表示路由路径中的动态部分。 + +如 `/user/:id`, 则可以匹配 `/user/123`,`/user/456` 等满足规则的地址栏路径。 + +`/:pathname` 部分会被解析到 `params` 对象中,如上述的 通过`/user/:id`规则解析 `/user/123`,表示为: + +```js +const currentRoute = { + path: '/user/123', + params: { id: 123 } +} +``` + +### 其他 + +在不同的框架或库中, 对路由解析会在基于上述的规则的基础上,进行补充和扩展,提供更加丰富的功能,以满足更多的场景。 + +比如, **Vue-Router** 使用了 `path-to-regexp` 库作为其路由解析的依赖,该库提供了非常丰富且灵活的路径匹配功能, +能够适配非常多的从简单到复杂的场景。**React-Router** 则在其内部实现了和扩展了相关的规则。 + diff --git a/docs/1.前端/10.开发/微前端.md b/docs/1.前端/10.开发/微前端.md new file mode 100644 index 00000000..142587f2 --- /dev/null +++ b/docs/1.前端/10.开发/微前端.md @@ -0,0 +1,285 @@ +--- +title: 谈谈微前端 +createTime: 2019/08/31 05:13:33 +author: pengzhanbo +permalink: /article/vpqgx0t7/ +--- + +微前端 是最近比较新兴的一个话题,它不具体指某个库某个框架,而是一个思想,一种概念,运用这种思想, +根据自身的需求,从而实现适用于自身的 微前端 。 + + + +> 本文根据最近我在公司内部举行的 微前端技术解决方案 分享而写。 +> 提供的 微前端方案 也应用于公司内部的项目,并取得了良好的反馈,获得广泛好评。 +> 本文不具体谈如何实现微前端,仅讲述微前端的概念,期望能够通过本文理解微前端。 + +## 前言 + +微前端 目前在行业内是一个新兴的思想。 + +诞生这个思想的背景是,在公司内部,常常会有一类项目,这类项目很大、很重, +涉及的业务内容多而杂,还涉及了跨部门共同维护,积累的庞大的技术债 等各种问题。 +这类项目在维护成本上、部署成本上等,都会花费巨大的开销,前端开发人员对于维护这类项目,苦不堪言, +急需找到解决这类问题的方案。 + +基于这样的背景下,开始探讨 解决方案的可行性, 微前端 正是基于此 开始慢慢 出现在人们的视野中。 + +## 现状 + +### 发展历程 + +在 Web 的发展初期,还没有所谓的前端的概念,网页的内容也相对简单,大多仅涉及文字图片信息的展示和表单内容, +这些工作可能网站负责人自己就包办了。 +然后微软推出了 **Ajax** 技术,引起了网页的技术变革,从此网站开始具备了动态交互性, +能够在网页发起请求动态获取服务器的内容,这丰富了网页的可交互性,网页的开发也从UI界面和表单交互,进一步增加了 +数据和逻辑的开发,前端也慢慢的被划分一个相对独立的职能。 + +而伴随着 nodejs 的出现,以及 angular 的出现,还包括 vue/react 等库,以及建立在 nodejs 上的生态, +包括grunt、gulp、webpack 等工具的诞生,前端进入了一个喷井式爆发的时期,也是我们所处的时期。前端越来越专业化, +包含的技术内容越来越丰富,依托于nodejs 以及众多的技术框架等,向着工程化进一步的发展,前端项目也越来越大。 + +### 浮现的问题 + +你是否维护过一个可能有着四五年以上历史的项目?是否维护过一个糅杂了各种各样的库的项目? +是否维护过一个多个公司部门参与的跨团队联合开发的项目? + +对于很多人来说,入职的某个公司,最怕被安排去维护一个这样的项目。因为每一次维护迭代,就如同开盲盒一样, +永远不知道有什么惊喜在等着自己。 + +对于这类项目,可能存在的问题包括: + +- 跨部门,夸团队联合开发,如何沟通?如何协作? +- 业务线多,页面多,如何管理? +- 如何进行代码管理? +- 如何进行分支管理? +- 多部门进行迭代,如何把控版本? +- 存在发布冲突,如何解决? +- 如何进行测试? +- 如何管理公共代码? +- ... + +可能改动某一行代码,都会带来意想不到的结果,种种问题的积累,技术债的、业务债的,使得项目越来越臃肿,越来越难以维护。 + +亟需寻找一种方案,能够解决这些问题。 + +### iframe嵌入 + +于是,在大多数时候,我们不得不去选择通过 iframe嵌入 的方式,先把臃肿的项目一点一点的拆开给回各个部门或者团队自行维护, +再提供一个 系统门户应用,用 iframe嵌入 的方式,加上维护一个菜单列表与其他项目入口链接的映射,来糅合成一个 网站应用。 + +![iframe嵌入](//assets.processon.com/chart_image/630f92445653bb0c5d1040ab.png) + +通过 iframe嵌入,在一定程度上,满足了 各部门各团队各业务线 独立开发独立部署的需求,只需要提供对应的页面链接就可以接入到 +整个系统中。但也存在着一些问题 + +**安全问题** + +然而,我们知道, iframe是存在安全问题的,如果攻击者使用 iframe访问一个 未知来源的链接,有可能被注入恶意脚本,从而盗取 +系统的隐私信息,这需要我们去严格配置 SCP,以及配置 sandbox,尽可能的保证 iframe 的安全性。 + +**资源加载过多** + +而由于仅需要提供链接就可以嵌入,那么对于各自的项目来说,灵活度就很高,各个项目可以随意的选择各种技术框架来实现自己的业务, +又或者即使使用了相同的技术框架,但各项目的资源相对独立,对于整个系统而言,需要加载的资源量会十分庞大, +从而导致了页面访问速度变慢,经常会出现页面部分区域白屏等待时间过长等,这也带来了体验问题。 + +**访问地图丢失** + +由于 iframe 嵌入的站点,独享访问历史记录,与外部的历史记录是相互独立的,即通过浏览器的 前进/回退 按钮来访问历史记录并 +不能得到预期的结果,这在一定程度上影响了用户的操作。 + +## 寻找解决方案 + +有没有什么其他的方案,来进一步解决这些问题呢? + + +首先我们明确的知道,单项目管理目前来看不是一个可行的方案,需要在多项目管理上寻求解决方案。 + +### 多项目公共业务组件 + +对于多数的大型系统项目而言,大体上都采用以下布局结构: + +![微前端-2](//assets.processon.com/chart_image/6311781d079129320755bec5.png) + +主体布局结构包括: + +- 导航栏 (可选) +- 左侧菜单栏 (可选) +- 内容区域 +- 页脚 (可选) + +在这种布局结构下,各个业务板块通常通过 导航栏 或者 左侧菜单栏 进行 导航切换,在 内容区域 展示 业务板块。 +即,总体上看,对于业务来说,导航栏、左侧菜单栏、页脚,这几个都是可能 共同的,主要的不同点在于 内容区域。 + +那么我们可以把 共同的部分,如 导航栏、左侧菜单栏、页脚 这几个部分,抽离为公共业务组件, +对于每个业务板块,独立为单独的项目进行开发维护,并在项目中引入这些 公共业务组件。 +公共业务组件其中主要负责之一是提供 链接到各个业务板块。 + +![微前端-3](//assets.processon.com/chart_image/631301e65653bb40f833b613.png) + +这种方案具有如下的优点: + +- 整体系统根据业务板块拆分为了多个项目; +- 实现了项目的独立性,可独立进行开发、发布; +- 通过在主项目重载渲染,实现类似 **SPA应用** 的访问体验; + +但同样也带来了新的问题: + +- 公共业务组件 + + - 公共业务组件 如何进行管理; + - 公共业务组件 如何在业务板块项目之间保持同步更新; + +以及没有解决的问题: + +- 资源加载过多; + +  各个业务板块项目重复加载公共业务组件,重复加载各种库资源。 + +- 项目无法实现统一管理; + +### 主项目重载业务项目资源 + +在上一个方案中,公共业务组件的引入解决了一部分问题,也带来了一部分问题,如何把公共业务组件进行统一管理,并保持一致性? + +我们回到 iframe方案,在这个 iframe方案中,有一个主项目用于管理这些 菜单栏、导航栏等。 同样的,可以借鉴这个思路, +也抽象一个主项目,用于管理这些 公共业务组件,然后寻找另一种方式来加载渲染其他的业务板块项目。 + +我们知道,业务板块的项目,也是通过链接去访问的,而每个链接都对应着一个 html 资源文件,通过加载这个资源,以及HTML内的 css资源、js资源等来渲染页面。那么,我们可以通过解析这个 html资源,然后将得到的 html内容、css文件、js文件,在主项目中加载后渲染到特定的区域, +那么就可以做到在主项目中加载业务板块项目。 + +![微前端-4](//assets.processon.com/chart_image/6314ea9cf346fb55d89d4e77.png) + +在主项目中,实现一个 资源加载器与解析器,通过业务板块项目的访问链接,获取 html资源文件,并解析 html 的内容,包括: + +- `` 标签中的 ``, `<link>`, `<script>` 等; +- `<body>` 标签中的 html 内容,`<script>` 等 + +然后加载 解析得到的 CSS资源、JS资源,将 html内容 插入到 特定的区域中,并进行渲染。 +从而呈现完整的网页内容。 + +这种方案,进一步解决了如下的问题: + +- 公共业务组件交由 主项目进行统一管理,直接避免了同步问题; +- 业务板块均在主项目中渲染,提高了用户体验; + +然而,也引入了新的问题: + +- 业务板块都运行在同一个环境中,多个板块之间切换,加载的资源容易对环境产生污染, + 如污染了某个全局变量、polyfill相互污染等。 +- 可能存在 加载资源跨域问题。 + +但是也拥有了如下的优点: + +- 拆分项目,可独立开发和部署; +- 主项目统一管理 公共业务组件,更易于维护; +- 项目间的切换得到体验优化; + +当方案思考到了这里,发现,主项目是通过 解析 **链接** 来加载业务板块项目, +而 **链接** 对于现代前端来说,更多的意义是可能是 **路由**。那么我们顺着这个思路,继续优化, + + +## 新的方案 + + +说起路由,我们很容易想到,像如今的 `react`, `vue`, `angular` 等主流的库/框架, 通过 路由 来实现 `SPA` 应用, +或者说, 通过 **路由分发页面**。 + +那么,我们可以进一步的扩展这个思路,是否可以通过 **路由分发应用** ? + +### 路由 + +在前端的范畴中,路由指 随着浏览器的地址栏变化,而呈现不同的内容给用户。 + +通常使用 **hash** 或者 **history API** 实现前端路由。 + +``` js +// hash +`https://pengzhanbo.com/#route` + +// history API +`https://pengzhanbo.com/route` +``` +路由进一步细化,通过 `/` ,又可以 划分为 一级路由、二级路由、三级路由... 等多级路由。 + +在现代的前端框架如 `React` / `Vue` / `Angular` 等,均有通过 路由 实现 SPA应用 的技术方案。 +而 SPA应用 就是 **路由分发页面** 。 + +### 路由分发应用 + +与 **路由分发页面** 类似,我们也可以通过 **路由分发应用** 。 + +类似于 主项目重载业务项目资源,通过 实现 路由与业务板块项目的映射关系, +在主项目中通过路由寻找业务板块项目,加载相关资源并渲染在相关区域。 + +### 主应用与子应用 + +从这里开始, 我们将 主项目 定位为 主应用, 将各个 业务板块项目 定义为 子应用。 +在主应用中实现 子应用加载器,加载器通过 解析路由来获取加载对应的子应用。 + +**主应用:** 作为独立的项目,整个系统的入口应用,负责统一管理公共业务组件(如 菜单栏、导航栏、页脚等),负责实现子应用加载器,负责实现渲染子应用的容器。 + +**子应用:** 作为独立的项目,系统的各个业务板块分别独立为单独的项目,单独开发维护与部署。 + +### 注册子应用 + +主应用需要通过路由发现子应用,需要建议起 路由与子应用的映射关系,所以需要有一套机制,用于向主应用注册子应用, +并关联相关资源文件等。 +``` json +[ + { + "AppName": "Sub Application", + "route": "/sub-app-route", + "resource": { + "js": [ + "https://example.com/index.js" + ], + "css": [ + "https://example.com/style.css" + ] + } + }, + // more ... +] +``` + +## 微前端 + +通过将整个系统拆分为一个个小型的项目,小型项目即为子应用,通过细化,将整个系统细化为一个个微小的应用, +从而实现了降低整个系统的复杂性。 +一个小型项目可以是某个部门的业务项目,可以是某个业务项目中的某个板块,也可以是一个单独的页面。 + +这也是为什么将新的方案称之为 **微前端**。 + +微前端是指,通过将一个系统,拆分为一个个 微小的独立的子应用,通过主应用聚合为一个完整的系统。 +微前端是一个与框架无强关联的概念,可以类比于服务端的微服务,是浏览器端的微服务。 + +![](//assets.processon.com/chart_image/6318b7297d9c0833ec81b2cd.png) + +由于子应用是独立的,理论上是支持使用任意的技术框架进行开发,无论是使用 jQuery开发,还是使用 Vue、React、Angular等。 +然而在实际中,对于整个系统而言,技术框架的选择应该保持统一性,以保证整个系统的可维护性。 + + +## 微前端的局限性 + +微前端的技术方案,更适合于 中大型的项目中使用,而对于小型项目而言,由于本身体量不大,没有必要对整个系统进行进一步的细化, +细化反而增加了项目的复杂度。 + +而对于中大型项目而言,如果是老系统迁移到微前端的方案,那么不可避免的,还需考虑新旧方案之间的迁移过渡的方案以及规划。 +如果老系统中存在应用了多种不同的技术框架,或者同框架的不同版本,由于主应用、所有子应用均运行在同一个浏览器环境中, +不可避免的存在环境污染问题,如全局环境污染,polyfill对于原生对象的多次污染等,还包括CSS的命名污染等问题。 +所以如何保证子应用的正确渲染,如何避免环境污染问题,也是亟需解决的问题。 + +## 微前端的未来 + +目前来看,微前端主要分为 主应用 和 子应用,在 **微** 上,也仅细化到页面级别,然而,对于微前端而已,还可以进一步的细化, +如,细化到页面的某一个区块,细化到某一个逻辑功能,均可以通过微前端的技术方案,共享到主应用以及子应用中使用。 +整个系统愈加化整为零,将复杂度进一步的拆解,细化,令每一块功能、逻辑等都能使用通过某个项目提供,甚至独立的项目进行维护和部署。 + +微前端是一个与框架无关的概念,但在实现微前端时,如果允许多技术框架共存,所带来的问题的,反而比不使用微前端时所存在的问题,要更难以预料,难以解决。在实际的场景中,最好还是限定在统一的技术框架范畴中,避免由于共存不同的技术框架,而引入更为复杂的问题, + +## 结语 + +微前端是一个相对新兴的技术概念,适用于一些前端场景,但最好是你已经考虑清楚了,微前端是解决你的场景问题的最好方案,否则,除非必要, +无需选择微前端方案。 diff --git a/docs/1.前端/10.开发/浅谈前端低代码.md b/docs/1.前端/10.开发/浅谈前端低代码.md new file mode 100644 index 00000000..03ef65c6 --- /dev/null +++ b/docs/1.前端/10.开发/浅谈前端低代码.md @@ -0,0 +1,60 @@ +--- +title: 浅谈前端低代码 +createTime: 2022/09/13 08:15:38 +author: pengzhanbo +permalink: /article/ecdgrife/ +article: false +--- + +前端低代码在最近的这两年,不少的公司或技术团队都对此青睐有佳,并各自实现了各自的低代码平台。 + +<!-- more --> + +## 前言 + +前端低代码,是指 无需代码或者仅需少量的代码,即可生成可交互的应用。 + +这个概念的兴起,期望于能够更快的去构建、部署新的应用,并降低门槛,让非技术开发人员也能够构建新的应用。 + +## 为什么做低代码 + +传统的应用开发从启动到发布的过程,大致的流程如下: +::: center +![low-code-1](//assets.processon.com/chart_image/6320a2fb637689341d579d34.png) +::: + +在这个过程中,我们需要花费大量的时间用于 代码开发 -> 测试 这个过程,在这个过程,还需要根据项目大小,组织多个开发人员、测试人员等参与到项目中,包括制定开发规范、测试规范等。 + +而对于某些场景的应用,可能整个应用的生命周期相对较短,多个应用之间存在着类似的功能、需求、设计等等,然而在传统的项目开发中, +我们仍然需要按照上述的流程,完整的走一遍,才能正式发布上线,这无疑会花费大量的时间。一般我们会通过抽离重复的功能、需求、UI等为 +独立的库、组件等,在新项目中实现复用,从而减少开发时间,然而这并不能对项目的发布速度有质的提升。 + +而对于一些小型企业,或者个体经营户,期望做一个线上应用,但并没有多余的资金资源去组建一个开发团队,对购买服务器、上线应用等更是一知半解,成为了制约他们发展的一道坎。 + +对于这些场景、存在的问题,需要需要一种方案,能够实现快速的实现从创建项目到发布部署为可访问的项目,并且能够面向更广泛的用户群体。 +这成为了一个非常具有市场潜力的需求。 + +## 如何做低代码 + +对于一个前端应用,通常由多个页面组成,在现代前端开发中,我们将页面拆分为一个个组件来进行组合: + +![](//assets.processon.com/chart_image/6320ccbf1efad46b0aa9d631.png) + +在 前端低代码 中,我们同样的,可以通过 组件来组装页面,通过可视化的交互方式,将组件拖拽到 页面容器中, +这种交互方式相对来说更加适用于更多的群体。 + +![](//assets.processon.com/chart_image/6320d1830e3e743f58315ed7.png) + +同时,需要提供能够对组件进行编辑状态的能力,以支持应用的个性化配置。 + +![](//assets.processon.com/chart_image/6321b4420e3e743f5833bbc8.png) + +在初步确定好 基础的功能、交互方式后,就可以围绕它们,来完善 实现低代码平台的技术方案。 + +---- + +初步明确的,我们需要 通过 **组件** 来组装 应用,围绕这一块,需要实现: + +- 低代码组件的规范:开发规范、接入规范; +- 用于承载组件、组装组件并渲染的应用容器; +- 组件的状态的更新与保存; diff --git a/docs/1.前端/10.开发/移动端适配方案.md b/docs/1.前端/10.开发/移动端适配方案.md index 2e51ef4e..54b1c77e 100644 --- a/docs/1.前端/10.开发/移动端适配方案.md +++ b/docs/1.前端/10.开发/移动端适配方案.md @@ -1,12 +1,10 @@ --- title: 移动端适配方案 -createTime: 2022-03-26T11:46:50.027Z -permalink: /article/vhpmovsm +createTime: 2020/08/14 01:54:29 +permalink: /article/vhpmovsm/ author: pengzhanbo -tags: +tags: - develop -top: false -type: null --- ## 背景 diff --git a/docs/1.前端/10.开发/表单配置化生成.md b/docs/1.前端/10.开发/表单配置化生成.md new file mode 100644 index 00000000..ac0ce4e6 --- /dev/null +++ b/docs/1.前端/10.开发/表单配置化生成.md @@ -0,0 +1,143 @@ +--- +title: 表单配置化生成方案 +createTime: 2022/03/17 10:10:04 +author: pengzhanbo +permalink: /article/y979pp8x/ +--- + +一个简单的基于 vue3 的表单配置化生成方案,可以作为思路参考。 + +<!-- more --> + +## 前言 + +本方案是个人在做某个项目时,需要实现一个简单的表单配置化生成,而做的一个方案。 +最终结果是通过一份表单配置,渲染为一个表单,并支持: + +- 支持多种表单字段类型 (单行文本/多行文本/数字/下拉/多选/单选 等),并支持嵌套字段(对象/数组) +- 支持字段校验 +- 支持条件判断显示/隐藏 表单字段 +- 支持字段分组展示 + + +::: tip +完整代码仓库地址: [formative](https://github.com/pengzhanbo/formative) +::: + +## 效果展示 + +**通过配置生成表单:** +![](/images/formative-demo-1.png) + +**配置的字段为对象或者数组时:** +![](/images/formative-demo-2.png) + +**对配置的字段进行分组展示:** +![](/images/formative-demo-3.png) + +## 方案说明 + +通过配置生成表单,需要明确如何实现 **表单字段** 与对应的表单组件进行关联,并实现**数据绑定**。 + +### 协议配置 + +约定一个协议,通过一个对象来表示 表单中某一个字段: + +**FieldSchema:** +```json +{ + "type": "表示字段的类型,比如单选、多选、单行文本、多行文本等", + "field": "表示字段的名", + "label": "表示字段显示的标签", + "default": "字段默认值", + "description": "字段描述信息,作为提示信息使用" +} +``` + +对于完整的表单,则使用 `FieldSchema[]` 的数组形式进行配置。 + +### 表单字段与组件关联 + +在 vue 中, 组件可以通过 `h(component, attrs[, children])` 渲染函数 进行渲染, +通过 `h()` 函数,可以实现动态渲染不同的组件。 + +我们可以利用这一特性,首先 字段类型与对应的组件进行映射,通过映射关系,用 字段类型获取对应的组件, +然后调用 `h()` 进行渲染。 + +``` ts +// 字段类型 与 组件 映射 +const componentMap = { + radio: RadioField, + checkbox: CheckboxField, + text: TextField, + select: SelectField, +} +``` +``` tsx +{ + name: 'Field', + props: ['fieldType'], + setup(props) { + return () => h(componentMap[props.fieldType]) + } +} +``` + +### 表单数据绑定 + +对于表单数据,需要实现 数据初始化,以及 对应的 Field组件对数据的可读写。 + +在vue中,我们可以使用 `provide/inject` API, 在 表单组件的根组件,通过 `provide()` 进行注入,在内部的 +`FieldComponent` 中通过 `inject()` 获取对应的数据,进行读写。 + +``` ts +/** + * 通过 provide 输入数据 + */ +const useFormDataProvide = (formData: FormData): FormInjectKey => { + const key: FormInjectKey = Symbol('formData') + provide(key, formData) + + return key +} + +/** + * 通过 inject 获取数据 + */ +const useFormData = (key: FormInjectKey): FormData => inject<FormData>(key)! +``` + +由于需要支持 字段为对象/数组时产生的 多层级数据结构,还需要考虑 `FieldComponent` 对 `FormData.a.b` 的 +深层数据的读写。 + +可以通过实现 `dotPath`, 通过 `FormData['a.b']` 的形式来读写 `FormData.a.b`,这样 `FieldComponent` +只需要知道 `a.b` 的 `dotPath` 字段路径即可配合 `inject()` 获取的表单数据进行读写。 + +``` ts +const useDotPath = <T = any>(model: FormData, dotKey: ComputedRef<string>) => { + const binding = computed<T>({ + set(data) { + setDotPath(model.value, dotKey.value, data) + }, + get() { + return getDotPath(model.value, dotKey.value) + }, + }) + + return binding +} +``` + +## 技术实现 + +在 [formative](https://github.com/pengzhanbo/formative) 仓库中, 通过本方案实现了一个 配置化生成表单的库。 + +- `src/components/Formative.tsx` 文件作为表单根组件。 +- `src/components/Field.tsx` 文件作为根据表单字段动态选择对应组件进行表单字段渲染。 +- `src/components/Group.tsx` 文件实现了对表单字段进行分组。 +- `src/components/[other].tsx` 其他文件实现了 各种表单字段组件。 + +有兴趣了解细节的,可以阅读 [formative 源码](https://github.com/pengzhanbo/formative), +我在关键位置进行了相关的代码注释说明。 + +同时,你可以直接拉取 源码,在本地进行运行。并授权代码使用。 diff --git a/docs/1.前端/2.工具/Jenkinss使用.md b/docs/1.前端/2.工具/Jenkinss使用.md index 477a7864..bf7bd8f7 100644 --- a/docs/1.前端/2.工具/Jenkinss使用.md +++ b/docs/1.前端/2.工具/Jenkinss使用.md @@ -1,13 +1,11 @@ --- title: Jenkins 使用 lang: zh-CN -createTime: 2022-03-26T11:46:50.027Z -permalink: /article/bmtl5ah4 +createTime: 2018/09/16 11:15:27 +permalink: /article/bmtl5ah4/ author: pengzhanbo -tags: +tags: - 工具 -top: false -type: null --- [Jenkins](https://jenkins.io/) 是一款功能强大的应用程序,允许持续集成和持续交付项目。这里记录一些 Jenkins 使用的方法。 diff --git a/docs/1.前端/2.工具/NPMBinary镜像配置.md b/docs/1.前端/2.工具/NPMBinary镜像配置.md new file mode 100644 index 00000000..5c15240b --- /dev/null +++ b/docs/1.前端/2.工具/NPMBinary镜像配置.md @@ -0,0 +1,35 @@ +--- +title: NPM Binary 镜像配置 +createTime: 2021/03/15 08:54:32 +author: pengzhanbo +tags: + - 工具 +permalink: /article/hsgdhlah/ +--- + +在 NPM 安装 Electron, Puppeteer 等包时,他们会通过 `postinstall` 脚本下载对应的二进制文件。因为一些不得而知的原因这个过程在某些网络下可能会很慢或不可用。你可以复制以下配置至 `.bashrc` 或 `.zshrc` 中,使用 [npmmirror.com](https://npmmirror.com) 提供的二进制镜像。 + +<!-- more --> + +数据来源于 `binary-mirror-config`。 + +```sh +# === NPM BINRAY CHINA === +# https://github.com/cnpm/binary-mirror-config/blob/main/package.json#L48 +export NODEJS_ORG_MIRROR="https://cdn.npmmirror.com/binaries/node" +export NVM_NODEJS_ORG_MIRROR="https://cdn.npmmirror.com/binaries/node" +export PHANTOMJS_CDNURL="https://cdn.npmmirror.com/binaries/phantomjs" +export CHROMEDRIVER_CDNURL="https://cdn.npmmirror.com/binaries/chromedriver" +export OPERADRIVER_CDNURL="https://cdn.npmmirror.com/binaries/operadriver" +export ELECTRON_MIRROR="https://cdn.npmmirror.com/binaries/electron/" +export ELECTRON_BUILDER_BINARIES_MIRROR="https://cdn.npmmirror.com/binaries/electron-builder-binaries/" +export SASS_BINARY_SITE="https://cdn.npmmirror.com/binaries/node-sass" +export SWC_BINARY_SITE="https://cdn.npmmirror.com/binaries/node-swc" +export NWJS_URLBASE="https://cdn.npmmirror.com/binaries/nwjs/v" +export PUPPETEER_DOWNLOAD_HOST="https://cdn.npmmirror.com/binaries" +export SENTRYCLI_CDNURL="https://cdn.npmmirror.com/binaries/sentry-cli" +export SAUCECTL_INSTALL_BINARY_MIRROR="https://cdn.npmmirror.com/binaries/saucectl" +export npm_config_sharp_binary_host="https://cdn.npmmirror.com/binaries/sharp" +export npm_config_sharp_libvips_binary_host="https://cdn.npmmirror.com/binaries/sharp-libvips" +export npm_config_robotjs_binary_host="https://cdn.npmmirror.com/binaries/robotj" +``` diff --git a/docs/1.前端/2.工具/caniuse.md b/docs/1.前端/2.工具/caniuse.md index 92f103e5..48ff7083 100644 --- a/docs/1.前端/2.工具/caniuse.md +++ b/docs/1.前端/2.工具/caniuse.md @@ -1,10 +1,9 @@ --- title: caniuse -createTime: 2022-03-26T11:46:50.027Z -permalink: /article/h4z91gyz +createTime: 2020/11/01 06:41:12 +permalink: /article/h4z91gyz/ author: pengzhanbo -top: false -type: null +article: false --- ### 工具 diff --git a/docs/1.前端/2.工具/git工作流实践.md b/docs/1.前端/2.工具/git工作流实践.md new file mode 100644 index 00000000..121b2693 --- /dev/null +++ b/docs/1.前端/2.工具/git工作流实践.md @@ -0,0 +1,136 @@ +--- +title: git工作流实践 +createTime: 2022/04/18 12:26:46 +author: pengzhanbo +permalink: /article/cjeo0sia/ +tags: + - 工具 +banner: https://assets.processon.com/chart_image/6251bfce1efad407891be6c8.png +--- + +这是一篇在我个人工作实践中,在我参与的,负责的项目、团队协作中,逐步调整,适合于一些实际场景的 git 工作流实践。 + +众所周知,在软件开发中, git 是目前使用最广泛的 软件版本管理工具,它足够高效,足够安全,也足够灵活, +对于团队协作和软件管理提供了很大的帮助。 + +而一个良好的合适的 分支管理方案,可以更好的帮助我们通过 git 进行 软件版本管理。 + +在过去, git-flow 是一个很流行的 分支管理方案。对于多人协作,中大型项目,提供了一个较为满意的解决方案。 + +但在我过去的实践中,逐渐感受到 git-flow 对于我来说还是太过于繁杂了,虽然在事实上满足了 我对于项目的软件版本管理, +但认为还是可以做一些简化,调整 分支管理策略,以更好的适配实际的开发工作。 + +## 场景 + +试想一下,在我们实际的软件开发过程中,迭代一个软件的版本,正常来说是: + +``` +需求评审 -> 需求确认 -> 开发阶段 -> +测试环境测试 -> 预生产发布验证 -> 生产环境发布验证 -> 发布完成 +``` + +### 从开发到发布 + +在这个过程中,如果在 测试环境发现了 bug,需要重新回归到 开发阶段进行修复, +同样的,在预生产发布验证环节发现了问题,也需要重新回归到 开发阶段修复后,重新测试和发布预生产。 + +而如果 生产环境发布验证 出现了问题, 需要紧急回滚到上一个版本,并重新回到开发阶段修复,测试,预生产验证,再生产发布。 + +### 需求明确 or 变更 + +虽然我们一直强调,版本迭代进入开发后,这个版本的需求应该是明确的。 + +然而,这仅仅只是理想情况下,实际过程中经常会遇到 需求变更,甚至是 添加新的功能,删除功能等。 +这种变更,还很难控制会发生在开发阶段还是测试阶段。 + +也许我们会吐槽甚至抱怨这样的容易变更需求的项目管理很糟糕,很不专业。但是,这也是确确实实存在的场景, +即使再成熟的团队,也会不可避免的遇到这种问题。 + +然而需求变更也不代表着一定是上面这种场景。 + +### 周期性版本发布,需求池 + +有些项目可能相对来说比较成熟,或者采用了不同的版本迭代方式。 + +周期性版本发布指,采用某个固定的周期内,仅会也一定会发布一个版本,如 每两周发布一个版本。 +那么在这种模式下,每个版本上线哪些功能,上线多少功能,实际上是以各个功能的开发进度,和进入到当前周期后, +明确下来的版本计划再决定的。 + +将产品 明确划分为一个个需求,建立一个需求池,并指定了每个需求的按时间的线性迭代预期计划, +在预期的未来的周期性的版本发布中,会上线哪些需求功能。 + +在这种场景下,我们不可能把需求都集中在某个分支上进行开发,仅有的一个 develop分支也很难满足所有的 +开发合并和测试。 + + +### 开发人员对于 git的掌握 + +很多时候,对于工具能够使用到什么程度,对于项目能够有多少帮助,其实不在于 工具有多优秀,而是在于团队成员 +对于工具的平均掌握程度,已经是否有成熟的规范化的操作流程。 + +早期我认为 成员对于 git 的掌握是大差不差的,只要说明一些操作流程即可,未加以限制和规范 + +然而,这会也给项目带来了潜在的风险:主要分支可能会被误操作污染,多个功能直接在同一个分支开发等等。 + +而为了解决这些问题,需要建立一套足够完善,同时低复杂度的操作规范,并对人员和分支加以权限控制。 + + +## 分支管理实践 + +在以上的场景中,逐渐摸索出了一套合适的分支管理方案: + +- `master` 分支: 主分支,正式版本的代码提交记录。 + + 永远不会在上面做任何改动提交,也仅接受来自 `release` 分支的合并请求,合并后打上版本tag。 + +- `release` 分支:发布分支,用于发布版本到预生产和生产环境,发布完成后合并到 master分支。 + + 永远不会咋上面做任何改动提交,也仅接受来自 prerelease 分支的合并请求。 + +- `prerelease/*` 分支组: 预发布分支,根据版本号创建新的分支。 + + 仅合并当前版本关联的 `feature/*` 分支,用于合并开发完成的需求,进入到版本测试阶段,发布到测试环境。 + 不会或者尽可能少的在上面做任何改动提交。 + +- `feature/*` 分支组: 功能开发分支(包括hotfix),从 master 分支拉取创建的分支, + + 每个分支仅针对某一个单一的业务或者功能,所有的改动都应该在 feature 分支上进行。 + 仅能合并到 prerelease 分支。 master有更新后需要及时拉取合并同步。 + + +流程图: +![git-work-flow](https://assets.processon.com/chart_image/6251bfce1efad407891be6c8.png) + +可以看出,整个方案只有四条主要的分支,且不同功能分支到其他分支都是单向的。 + +这样的好处是足够的简单,足够的好理解,也保证了一定的灵活性。 + +删除了 develop分支的原因是,单一的develop分支并不能很好的满足 需求变更后导致的 develop分支无效, +选择使用 prerelease 分支组作为替代,可以灵活的根据版本规划创建分支,即使发生需求变更,也可以灵活的直接抛弃 +当前已创建的分支,重新新建一条 prerelease分支再次从feature分支合并代码。 + +从 develop 改名为 prerelease 也是因为,功能分支开发完后并不是马上合并的,而是根据迭代计划再合并的,理解起来就是 +预期上线的功能,即 prerelease。 + +从分支的行为上看, master分支和 release分支 似乎可以在简化仅保留一条。但这里是考虑到 如果有发布回滚操作,如果 +都在 master 分支上进行,那么master分支的操作记录看起来就不够的干净,简洁,而把发布、回滚等策略都放到了 release分支 +,而 master仅保留干净的版本历史,那么会更加的友好,便于维护。 + +在这个方案中,最好是配合上 git分支的权限控制,对 master分支、release分支进行保护,确保这两个分支仅接受来自对应 +分支的合并请求。 + +分支合并,选择 `merge` 还是 `rebase`,这个需要对 commit记录有何要求去考量。 +如果需要保证所有提交记录都可追踪,建议使用 merge,如果希望 提交记录线性、整洁,建议使用 rebase。 + +同时,feature分支 合并到 prerelease 分支,最好是通过 pull requests 的操作模式,在进入测试阶段前,接受来自其他 +有用审查权限的开发人员的code review。 + +::: warning 说明 +该实践方案仅是我过去在我的工作实践中总结的,并在团队内部经历过超过2年的验证和调整所得出的,适合于当时团队的实践方案。 + +是否与您的团队或所在的团队契合,还需要重新考量。 + +分支管理方案 需要从实际的情况触发考虑,包括团队人数,产品规模等等。 + +没有最好的方案,只有合适自己的方案。 +::: diff --git a/docs/1.前端/2.工具/vsCode插件推荐.md b/docs/1.前端/2.工具/vsCode插件推荐.md index 9dd50a33..c5c75a20 100644 --- a/docs/1.前端/2.工具/vsCode插件推荐.md +++ b/docs/1.前端/2.工具/vsCode插件推荐.md @@ -1,13 +1,11 @@ --- title: VSCode 常用插件推荐 lang: zh-CN -createTime: 2022-03-26T11:46:50.027Z -permalink: /article/ofp08jd8 +createTime: 2018/12/29 11:15:27 +permalink: /article/ofp08jd8/ author: pengzhanbo -tags: +tags: - VSCode -top: false -type: null --- `VS Code` 作为我现在工作中最常用的编辑器,也是我十分喜欢的编辑器。它强大的功能和插件系统,对我的工作提供了很多帮助和支持。将我在工作中经常使用的插件,推荐给大家。 @@ -126,3 +124,5 @@ type: null 2. [minapp](https://github.com/wx-minapp/minapp-vscode) 微信小程序 支持。 + + diff --git a/docs/1.前端/2.工具/小徽章制作.md b/docs/1.前端/2.工具/小徽章制作.md new file mode 100644 index 00000000..2099625b --- /dev/null +++ b/docs/1.前端/2.工具/小徽章制作.md @@ -0,0 +1,36 @@ +--- +title: 小徽章制作 +createTime: 2021/07/20 04:37:25 +author: pengzhanbo +permalink: /article/qrfeqp1q/ +--- + +用于制作 小徽章的在线网站 或项目 + +- [https://shields.io/](https://shields.io/) +- [https://badgen.net/](https://badgen.net/) +- [https://forthebadge.com/](https://forthebadge.com/) +- [https://badge.fury.io/](https://badge.fury.io/) +- [https://github.com/boennemann/badges](https://github.com/boennemann/badges) + +## example + +``` md +![npm version](https://badge.fury.io/js/@vuepress-plume%2Fvuepress-theme-plume.svg) + +![npm version](https://badge.fury.io/js/@vuepress-plume%2Fvuepress-theme-plume.svg) + +![github version](https://badge.fury.io/gh/pengzhanbo%2Fvuepress-theme-plume.svg) + +![release](https://badgen.net/github/release/pengzhanbo/vuepress-theme-plume/) + +![npm](https://img.shields.io/npm/dw/@vuepress-plume/vuepress-theme-plume?style=plastic) + +``` +![npm version](https://badge.fury.io/js/@vuepress-plume%2Fvuepress-theme-plume.svg) + +![github version](https://badge.fury.io/gh/pengzhanbo%2Fvuepress-theme-plume.svg) + +![release](https://badgen.net/github/release/pengzhanbo/vuepress-theme-plume/) + +![npm](https://img.shields.io/npm/dw/@vuepress-plume/vuepress-theme-plume?style=plastic) diff --git a/docs/1.前端/2.工具/有用的工具列表.md b/docs/1.前端/2.工具/有用的工具列表.md new file mode 100644 index 00000000..200b76ce --- /dev/null +++ b/docs/1.前端/2.工具/有用的工具列表.md @@ -0,0 +1,108 @@ +--- +title: 有用的工具列表 +createTime: 2021/02/10 09:55:09 +author: pengzhanbo +permalink: /article/xb4woxjg/ +sticky: 10 +--- + +## 浏览器插件 + +- [Vue.js devtools](https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd?) 顾名思义,非常有用的浏览器 vue开发调试插件 +- [React Developer Tools](https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi) React 开发调试插件 +- [Octotree - GitHub code tree](https://chrome.google.com/webstore/detail/octotree-github-code-tree/bkhaagjahfmjljalopjnoealnfndnagc) 对github仓库的文件tree生成侧边栏,方便在线查阅浏览/跳转 +- [XPath Helper](https://chrome.google.com/webstore/detail/xpath-helper/hgimnogjllphhhkhlmebbmlgjoejdpjl) 提取当前网站选中的 DOM 元素的 XPath,做埋点测试之类时有用 + + +## cli开发 + +- [commander](https://www.npmjs.com/package/commander) 完整的命令行解决方案 +- [cac](https://www.npmjs.com/package/cac) 轻量级的用于构建cli工具的解决方案 +---- +- [minimist](https://www.npmjs.com/package/minimist) 命令行参数解析工具 +- [yargs](https://www.npmjs.com/package/yargs) 命令行参数解析工具 +---- +- [Inquirer](https://www.npmjs.com/package/inquirer) 交互式命令行工具 +- [prompt](https://www.npmjs.com/package/prompt) 命令行 对话工具 +---- +- [shelljs](https://www.npmjs.com/package/shelljs) shell调用工具 +- [execa](https://www.npmjs.com/package/execa) shell 调用工具 +- [chalk](https://www.npmjs.com/package/chalk) node终端输出美化工具 +- [ora](https://www.npmjs.com/package/ora) 终端 loading 工具 +- [chokidar](https://www.npmjs.com/package/chokidar) 文件监听工具 + +- [is-ci](https://www.npmjs.com/package/is-ci) 检查当前环境是否是集成环境 + +## Http server + +- [express](http://expressjs.com/) +- [connect](https://github.com/senchalabs/connect) +- [koa](https://koajs.com/) +- [fastify](https://www.fastify.io/) + +## Server Framework + +- [Nestjs](https://nestjs.com/) 类Spring boot的 Node端开发框架 +- [Next.js](https://nextjs.org/) React 应用开发框架 +- [Nuxt.js](https://nuxtjs.org/) Vue 应用开发框架 +- [Think.js](https://thinkjs.org/) Node端开发框架 + +- [Egg.js](https://www.eggjs.org/index) 阿里开源的Node端开发框架 + +## VSCode 插件 + +### 皮肤 + +- [One Dark Pro](https://marketplace.visualstudio.com/items?itemName=zhuangtongfa.Material-theme) 个人觉得非常耐看,好用,舒服的一个皮肤。 +- [Material Icon Theme](https://marketplace.visualstudio.com/items?itemName=PKief.material-icon-theme) 非常全面又好看的文件图标主题 + +### 辅助开发 +- [IntelliCode](https://marketplace.visualstudio.com/items?itemName=VisualStudioExptTeam.vscodeintellicode) 辅助代码提示 +- [Code Spell Checker](https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker) 拼写检查插件 +- [Error Lens](https://marketplace.visualstudio.com/items?itemName=usernamehw.errorlens) 用更友好更直观的方式,将错误信息显示出来 +- [Better Comments](https://marketplace.visualstudio.com/items?itemName=aaron-bond.better-comments) 更加友好的注释高亮 +- [Bracket Pair Colorizer](https://marketplace.visualstudio.com/items?itemName=CoenraadS.bracket-pair-colorizer) 代码缩进高亮 +- [Import Cost](https://marketplace.visualstudio.com/items?itemName=wix.vscode-import-cost) 显示包体积 +- [Todo Tree](https://marketplace.visualstudio.com/items?itemName=Gruntfuggly.todo-tree) TODO注释高亮 +- [indent-rainbow](https://marketplace.visualstudio.com/items?itemName=oderwat.indent-rainbow) 缩进高亮标识 +- [Path Intellisense](https://marketplace.visualstudio.com/items?itemName=christian-kohler.path-intellisense) 文件路径提示 +- [TypeScript Hero](https://marketplace.visualstudio.com/items?itemName=rbbit.typescript-hero) typescript 辅助开发工具 +--- +- [any-rule](https://marketplace.visualstudio.com/items?itemName=russell.any-rule) 正则表达式大全 +--- +- [Rest Client](https://marketplace.visualstudio.com/items?itemName=humao.rest-client) 类 Postman 的 Rest工具 + + +## 测试工具 + +### assertion +- [chai](https://www.npmjs.com/package/chai) +- [should](https://www.npmjs.com/package/should) + +### unit +- [jest](https://www.npmjs.com/package/jest) +- [ava](https://www.npmjs.com/package/ava) +- [mocha](https://www.npmjs.com/package/mocha) +- [karma](https://www.npmjs.com/package/karma) +- [tape](https://www.npmjs.com/package/tape) +- [@vue/test-utils](https://www.npmjs.com/package/@vue/test-utils) + +### 2e2 +- [nightwatch](https://www.npmjs.com/package/nightwatch) +- [cypress](https://www.npmjs.com/package/cypress) + + +## GIT相关 + +- [@commitlint/cli](https://www.npmjs.com/package/@commitlint/cli) +- [@commitlint/config-conventional](https://www.npmjs.com/package/@commitlint/config-conventional) +- [commitizen](https://www.npmjs.com/package/commitizen) +- [conventional-changelog-cli](https://www.npmjs.com/package/conventional-changelog-cli) +- [cz-conventional-changelog](https://www.npmjs.com/package/cz-conventional-changelog) +- [husky](https://www.npmjs.com/package/husky) +- [lint-staged](https://www.npmjs.com/package/lint-staged) + +## 其他 + +- [Slidev](https://github.com/slidevjs/slidev) 为开发者打造的演示文稿工具 +- [loupe](http://latentflip.com/loupe/) 代码执行流程可视化 diff --git a/docs/1.前端/3.Vue/Vue组件间通信.md b/docs/1.前端/3.Vue/Vue组件间通信.md index 990a45a7..dd8865cf 100644 --- a/docs/1.前端/3.Vue/Vue组件间通信.md +++ b/docs/1.前端/3.Vue/Vue组件间通信.md @@ -1,13 +1,11 @@ --- title: Vue组件间通信 lang: zh-CN -tags: +tags: - vue -createTime: 2022-03-26T11:46:50.028Z -permalink: /article/iezlvhvg +createTime: 2018/07/20 11:15:27 +permalink: /article/iezlvhvg/ author: pengzhanbo -top: false -type: null --- 在我们在进行基于[Vue](https://cn.vuejs.org/)的项目开发时,组件间的数据通信,是我们必须考虑的。 diff --git a/docs/1.前端/5.Node/单仓库导出ES和CJS.md b/docs/1.前端/5.Node/单仓库导出ES和CJS.md new file mode 100644 index 00000000..6e6dbb88 --- /dev/null +++ b/docs/1.前端/5.Node/单仓库导出ES和CJS.md @@ -0,0 +1,211 @@ +--- +title: 单仓库实现同时导出esm、cjs +createTime: 2022/04/06 08:33:04 +author: pengzhanbo +permalink: /article/exports-esm-and-cjs/ +--- + +在开发一些公共模块作为一个独立仓库时,有时候可能会在一个使用 es 的项目中通过 `import` 导入, +有可能在一个 cjs 项目中通过 `require` 导入。 + +如何实现单个仓库能够同时被 cjs 和 esm 项目导入呢? + +<!-- more --> + +## 为什么这么做? + +在过去的时间里,JavaScript 并没有一套标准的模块化系统,并且在过去的时间里,逐渐发展出了各种模块化解决方案, +其中最主流的有两种模块化方案: + +- `CommonJs`: 即`cjs`,通过 `require('package')` 导出,`module.exports` 导入。 + 这套模块化系统应用与在`NodeJs` 和 `NPM packages`。 + + ```js + // in cjs + const _ = require('lodash') + console.log(`assignIn: ` _.assignIn({ b: '2'}, { a: '1' })) + // { a: '1', b: '2' } + ``` + +- `Ecmascript modules`: 即`esm`,在2015年,`esm` 最终确定为标准模块化系统,浏览器以及各个社区开始逐渐 + 迁移并支持`esm`。 + + ```js + import { assignIn } from 'lodash' + console.log(`assignIn: ` assignIn({ b: '2'}, { a: '1' })) + // { a: '1', b: '2' } + ``` + + `ESM`使用 `named exports`,能够更好的支持静态分析,对各种打包工具有利于做`tree-shaking`, + 而且浏览器原生支持,作为一个标准,代表的是JavaScript的未来。 + + 同时,在`NodeJs` 的 `v12.22.0`、`v14.17.0`版本,开始实验性的支持`ESM`,并在`16.0.0`版本开始正式支持`ESM`。 + + +::: note +- ESM - [ECMAScrip modules](https://nodejs.org/api/esm.html) +- CJS - [CommonJs](https://nodejs.org/api/modules.html#modules-commonjs-modules) +::: + +目前有很多包仅支持 `CJS` 或者 `ESM` 格式。 但同时,也有越来越多的包推荐并仅支持导出 `ESM` 格式。 + +但是相对来说,就目前而言,作为一个库,仅支持`ESM` 格式还是过于激进了。即使在 `NodeJs v16`已开始正式支持`ESM`, +但是整个社区的迁移还是需要大量的时间成本和人力成本的,如果某个版本破坏性的从`CJS`支持迁移到`ESM`, +那么可能导致一系列问题。 + +所以,如果一个库,能够同时支持`ESM`以及`CJS`,是一种相对来说更为安全的迁移方案。 + +## 共存问题 + +我们知道,`Nodejs` 能够很好的同时支持 `ESM` 和 `CJS` 进行工作,但是,有一个最主要的问题是,不能在一个 `CJS` 中 +导入`ESM`,这时候会抛出一个错误: +```js +// cjs package +const pkg = require('esm-only-package') +``` +``` +Error [ERR_REQUIRE_ESM]: require() of ES Module esm-only-package not supported. +``` + +因为`ESM` 模块本质上是一个异步模块,所以不能用 `require()` 方法同步的导入一个异步的模块。 +但是这并不意味着完全不能在 `CJS` 模块中使用`ESM` 模块,我们可以使用 动态 `import()` 的方式,来异步的导入`ESM` 模块。 +`import()` 会返回一个 `Promise`: + +```js +// CJS +const { default: pkg } = await import ('esm-only-package') +``` + +但是,这并不是一个令人满意的解决方案,它与我们日常使用的模块导入方式来说,显得有点笨拙,不符合一般使用习惯, +我们还是更期望能够符合一般习惯的导入方式: + +```js +// ESM +import { named } from 'esm-package' +import cjs from 'cjs-package' +``` + +## 如何做? + +### package.json + +在现在的稳定版本的`NodeJs` 中,已经支持同时在一个包中导出两种不同的格式。 +在`package.json` 文件中,有一个`exports` 字段,提供给我们有条件的导出不同格式。 + +``` js +{ + "name": "package", + "exports": { + ".": { + "require": "./index.js", + "import": "./index.mjs" + } + } +} +``` + +这一段声明描述了, 当进行导入包的默认模块时,如果是通过 `require('package')` 进行导入,那么引入的是 `./index.js` 文件,如果是通过`import pkg from 'package'`进行导入,那么引入的是 `./index.mjs` 文件。 + +`Nodejs` 会根据当前运行环境,选择合适的导入方式将包进行导入。 + +所以我们可以借助这一特性,来完成我们单仓库支持两个格式的第一步。 + +然后,下一个要解决的,就是如何构建两个格式的导出文件。 + +### Building + +我们当然不可能为了同时支持`CJS`和 `ESM`,而编写两份代码。 + +但我们可以借助一些构建打包工具,来生成`ESM`和`CJS`代码。 + +通常情况下,我们可能会使用 `rollup` 来构建打包我们的模块。 +或者也可以使用 `tsup` 来构建。 + +#### rollup + +当我们会选择 `rollup` 来构建一个库时,可能配置如下: + +```js +// rollup.config.js +export default { + input: 'src/index.js', + output: { + file: './dist/index.js', + } +} +``` + +由于`rollup` 是支持多配置打包的,所以我们可以使用多配置的方式,同时打包输出两种格式的文件: +```js +// rollup.config.js +export default [ + { + input: 'src/index.js', + output: { + file: './dist/index.js', + format: 'cjs', + } + }, + { + input: 'src/index.js', + output: { + file: './dist/index.mjs', + format: 'es', + } + } +] +``` + + +#### tsup + +`tsup` 是一个面向 `TypeScript` 的打包工具,基于 `esbuild`, 可以很方便的将我们的库打包成多种模式进行输出: + +`tsup` 可以支持零配置,直接使用命令行即可输出两种格式 + +``` sh +tsup src/index.ts --format esm,cjs +``` + +执行完成后,将会得到两个文件:`cjs` 格式文件`dist/index.js` 和 `esm`格式文件`dist/index.mjs` 。 + + +使用构建工具构建完成后,接下来就是完善 `package.json`, + +建议在使用 `type` 字段声明为 `module`, 来声明当前库时一个标准的 esm 库,以及添加 `main`,`module`,`exports`字段, +以便向下兼容: + +```json +{ + "name": "my-package", + "type": "module", + "main": "./dist/index.js", + "module": "./dist/index.mjs", + "exports": { + ".": { + "require": "./dist/index.js", + "import": "./dist/index.mjs" + } + }, + "types": "./dist/index.d.ts", + "files": ["dist"] +} +``` + +最后,你的 `CJS` 项目中,或者 `ESM` 项目中,均可以根据环境要求,导入这个包。 + +```js +// cjs +const pkg = require('my-package') +``` + +```js +// esm +import pkg from 'my-package' +``` + +## 总结 + +虽然 `Nodejs` 从 `v14.22.0` 版本开始试验性的支持 `esm` ,并且到 `v16` 版本,正式支持 `esm`。 +但将库升级到仅支持`esm` 还是一个比较激进的做法,建议从相对安全的 双格式支持 开始迁移,在合适的时机,过渡到仅支持`esm`。 + diff --git a/docs/1.前端/5.Node/在node项目中使用esm.md b/docs/1.前端/5.Node/在node项目中使用esm.md new file mode 100644 index 00000000..48676167 --- /dev/null +++ b/docs/1.前端/5.Node/在node项目中使用esm.md @@ -0,0 +1,149 @@ +--- +title: 在NodeJs项目中使用ECMAScript module +createTime: 2022/06/17 02:04:57 +author: pengzhanbo +permalink: /article/7jzjudus/ +--- + +随着 `Nodejs v16` 成为长期稳定支持的版本,`ESM` 也随之成为 `NodeJs` 正式支持的标准化模块系统,这允许我们通过 +`ESM` 来开发我们的 `NodeJs` 项目,并在项目中通过`ESM` 来导入其他的`ESM`包。 + +<!-- more --> + +## 创建项目 + +我们以新建一个 NodeJs 项目为例, 它有如下的结构: +```sh +./my-esm-package +├── lib +│ ├── resolve.js +│ └── index.js +└── package.json +``` + +这个项目的功能是导出一个 resolve 方法,是 `path.resolve` 的封装实现。 + +::: code-tabs +@tab lib/index.js +```js +export * from './resolve.js' + +``` + +@tab lib/resolve.js +```js +import path from 'path' + +export const resolve = (...arg) => path.resolve(...arg) +``` +::: + +## package.json + +在 `package.json` 中,我们需要进行以下声明: + +- 声明 `type` 字段值为 `module` + + 这个字段声明了你的包将作为一个 `ECMAScript module` 被`NodeJs` 加载并解析,并允许使用`.mjs`格式的文件。 + +- 声明 `exports` 字段 + + 该字段描述了 项目如何导出模块给到其他包使用。 + + - 默认导出 + + ::: code-tabs + @tab package.json + ```json + { + "exports": "./lib/index.js" + } + ``` + ::: + + 即当使用`import { resolve } from 'my-esm-package'`时,默认引入的文件是 `lib/index.js`。 + + - 导出多个模块 + + ::: code-tabs + @tab package.json + ```json + { + "exports": { + ".": "./lib/index.js", + "resolve": "./lib/resolve.js" + } + } + ``` + ::: + + 声明了导出了两种模块:一个是默认导出,使用`"."` 作为key;一个是具名导出。 + + 当使用`import { resolve } from 'my-esm-package'`时,默认引入的文件是 `lib/index.js`。 + + 当使用`import { resolve } from 'my-esm-package/resolve'` 时,引入的文件是 `lib/resolve.js`。 + + - `exports` 还支持其他形式的值,这里暂不赘述。 + +- 声明 `engines` 字段 + + 由于 `Nodejs` 并不是全版本支持`esm`的,而是从`v14.16.0`版本开始试验性的支持,并到了`v16`版本才作为正式支持, + 且当前`v16`版本作为目前的长期稳定支持的版本。这个项目运行环境的`NodeJs` 版本,最低应该推荐使用 `v16` 以上的版本。 + 即它的值应该为 `{ "node": ">=16" }` + +到这里,这个项目的`package.json` 文件,包含以下内容: + +::: code-tabs +@tab package.json +```json +{ + "name": "my-esm-package", + "description": "My first esm package.", + "type": "module", + "exports": { + ".": "./lib/index.js", + "resolve": "./lib/resolve.js" + }, + "engines": { + "node": ">=16" + } +} +``` +::: + +## 编写项目代码 + +1. 由于是一个 `esm` 项目,所以理所当然的不能项目中使用 `require()`/`module.exports` 来导入导出模块。 +而是应该全部使用`import`/`export` 的方式来导入导出模块。 + +2. 不需要在项目代码中 使用 `use strict`。 + +3. 由于 `esm` 项目中,`NodeJs` 不再支持 `__dirname`/`__filename`,所以有相关场景需要使用时,需要使用其他的方式来实现相同功能: + ```js + import { dirname, basename } from 'path' + import { fileURLToPath } from 'url' + + const _dirname = typeof __dirname !== 'undefined' + ? __dirname + : dirname(fileURLToPath(import.meta.url)) + + const _filename = typeof __filename !== 'undefined' + ? __filename + : basename(fileURLToPath(import.meta.url)) + ``` +## TypeScript + +如果在项目中使用了 `TypeScript`,那么除了需要遵循以上的内容,还需要在 `tsconfig.json` 配置文件中补充以下配置: + +```json +{ + "module": "node16", + "moduleResolution": "node16" +} +``` + +并且,应该将 `.ts` 文件,编译为 `.js` 文件,`package.json` 配置的 `exports` 导出的,是编译后的 `.js` 文件。 + +## 最后 + +当完成了以上步骤,就可以得到一个`NodeJs ESM` 项目。它也只能在另一个支持 `esm` 的项目中使用。 diff --git a/docs/1.前端/6.JavaScript/2.进阶/函数参数按值传递.md b/docs/1.前端/6.JavaScript/2.进阶/函数参数按值传递.md new file mode 100644 index 00000000..0523006c --- /dev/null +++ b/docs/1.前端/6.JavaScript/2.进阶/函数参数按值传递.md @@ -0,0 +1,108 @@ +--- +title: JavaScript进阶(五)— 函数参数按值传递 +createTime: 2020/02/12 11:27:54 +author: pengzhanbo +permalink: /article/m4a92nl5/ +--- + +我们知道,在 `ECMAScrip` 中, 函数的参数是 **按值传递** 的。 + +那么怎么理解 **按值传递** ? + +简单来说, **把函数外部的值复制给函数内部的参数**,即 **把值从一个变量复制到另一个变量**。 + +那么也就是说,在函数内部,修改函数参数的值,不会改变外部变量的值。 + +我们来看一个例子:2 + +**示例1** +```js + +var a = 1 +function foo(arg) { + arg = 2 + console.log(arg) +} +foo(a) // 2 +console.log(a) // 1 +``` + +可以看出,外部变量`a`作为 函数 `foo` 的执行时参数值, 在函数内部修改传入的参数值进行修改, +函数执行后,并不会对外部变量`a` 发生修改。 + +这个例子确实说明了函数参数是按值传递的。 + +但是再来看另一个例子: + +**示例2** +```js +var obj1 = { + a: 1 +} +function foo(arg) { + arg.a = 2 + console.log(arg) +} +foo(obj1) // { a: 2 } +console.log(obj1) // { a: 2 } + +var obj2 = { + a: 1 +} +function bar(arg) { + arg = 2 + console.log(arg) +} +bar(obj2) // 2 +console.log(obj2) // { a: 1 } +``` + +在这个例子中, 函数`foo` 执行完后, 打印的 `obj1` 值发生了变化,说明函数`foo` 内部修改了外部变量`obj1`, +为什么会发生修改?而在 函数`bar` 执行后,`obj2` 值保持不变,这又是为什么? 函数参数是否真的是 **按值传递**? + +那么该如何理解 `函数参数是按值传递的`? + +在理解这个之前,我们首先需要知道,`JavaScript` 的数据类型,以及不同数据类型的存储方式。 + +## 数据类型及其存储方式 + +我们知道, 在 `JavaScript` 中, 有两种 数据类型,分别是:**(1)基本数据类型**和 **(2)引用数据类型**, + +- 基本数据类型:值 直接保存在 **栈(stack)** 中。 + ```js + let a = 1 + let b = a + a = 2 + console.log(a, b) // 2 1 + ``` + 基本类型在 **栈** 中的赋值变动如下: + ::: center + ![function-value-stack](/images/func-value-stack.png){ style=width:500px; } + ::: + +- 引用数据类型:值 保存在 **堆(heap)** 中, 并在 **栈(stack)** 中保存 值 在 **堆(heap)** 中的内存地址。 + + ```js + let a = { name: 'Mark' } + let b = a + b.name = 'John' + console.log(a) // { name: 'John' } + ``` + 引用类型在 **栈** 和 **堆** 中的复制变动如下: + ::: center + ![function-value-stack](/images/func-value-heap.png){ style=width:680px; } + ::: + +## 按值传递 + +我们从 数据类型来理解 `按值传递`, 那么可以发现, **传递** 的值, 是指在 **栈(stack)** 中保存的值。 + +即, 无论 **参数值** 是 基本数据类型还是引用数据类型, **传递** 的是 **栈(stack)** 中的值。 + +- 对于基本数据类型, 函数内部修改参数的值,实际上是修改的是 函数参数重新在 **栈(stack)** 中的内存片段保存的值。 + +- 对于引用数据类型, 函数参数 传递是的 引用类型在 **栈(stack)** 中的内存地址: + - 如果直接修改参数的值,函数参数在 **栈(stack)** 中的内存片段保存的内存地址被覆盖。 + - 如果修改 参数对象的属性值,修改的是根据 函数参数在 **栈(stack)** 中的内存片段保存的内存地址对应的在 **堆(heap)** 中的值。 + +所以回头重新看 **示例1** 和 **示例2**, 均正确表述了 函数的参数是 **按值传递** 的。 diff --git a/docs/1.前端/6.JavaScript/2.进阶/原型到原型链.md b/docs/1.前端/6.JavaScript/2.进阶/原型到原型链.md new file mode 100644 index 00000000..500d5504 --- /dev/null +++ b/docs/1.前端/6.JavaScript/2.进阶/原型到原型链.md @@ -0,0 +1,159 @@ +--- +title: JavaScript进阶(一)— 原型到原型链 +createTime: 2020/02/09 09:27:29 +author: pengzhanbo +permalink: /article/hx3h2vvj/ +--- + +在 `JavaScript` 的世界中,我们常常会通过 构造函数 来创建一个 **实例对象**: + +```js +function Person(name) { + this.name = name +} +const person = new Person('Mark') +console.log(person.name) // Mark +``` + +我们使用构造函数`Person`,通过 `new` 创建了一个实例对象 `person`。 + +在实例对象 `person` 上, 有一个私有属性 `__proto__` 指向了它的构造函数的原型对象`prototype`, + +那么,什么是 `prototype`, 什么是 `__proto__` ? + +接下来,我们开始进入正题。 + +## prototype + +在 `JavaScript` 中,每个函数都有一个 `prototype` 属性,这个属性指向了该函数的原型对象。 + +```js +function Person(name) { + this.name = name +} +Person.prototype.age = 18 + +const person1 = new Person('Mark') +const person2 = new Person('John') +console.log(person1.name, person1.age) // Mark 18 +console.log(person2.name, person2.age) // John 18 +``` +可以看到,当 `person1` 和 `person2` 均打印 `age` 属性值为 `18`。 + +这是因为 `Person.prototype` 正是 实例对象 `person1` 和 `person2` 的原型。 + +既然 `prototype` 指向的是原型, 那么,**原型** 又是什么? + +简单的理解,在 `JavaScript` 中,每一个对象在创建时,都有一个与之关联的另一个对象,这个关联的对象就是指原型。 + +::: warning 注意 +`null` 是没有原型的。 +::: + +对象会从其原型对象,**继承** 属性。这也是为什么 `person1` 和 `person2` 均打印 `age` 属性值为 `18`。 + +## \_\_proto\_\_ + +在 `JavaScript` 中,每个对象(`null` 除外)都有一个 私有属性 `__proto__`, +这个属性指向了该对象的构造函数的原型`prototype`。 + +```js +function Person(name) { + this.name = name +} +const person = new Person('Mark') +console.log(person.__proto__ === Person.prototype) // true +``` + +到这里就会发现,既然构造函数有原型 `prototype`,原型也是一个对象,而对象有 `__proto__` 指向它的构造函数的原型对象, +那么 构造函数的原型对象,是否也有其原型对象呢? + +## constructor + +在说明 原型的原型前,需要了解原型上的一个属性 `constructor`, 它指向了原型对象关联的构造函数: + +``` js +function Person(name) { + this.name = name +} +const person = new Person('Mark') +console.log(person.prototype.constructor === Person) // true +``` + +它有助于帮我们理解 找到原型的原型的构造函数。 + +## 原型的原型 + +当我们在控制台打印并输出 `Person.prototype.__proto__` 时,发现打印了一个对象: + +```js +function Person(name) { + this.name = name +} +console.log(Person.prototype.__proto__) +``` + +`output`: + +![Person.prototype.__proto__](/images/js-prototype-1.png) + +既然 `Person` 的原型也有原型, 那么 这个原型的原型对象,它的构造函数又是什么呢? + +我们可以使用 `constructor` 来获取 它的构造函数: + +```js +function Person(name) { + this.name = name +} +console.log(Person.prototype.__proto__.constructor) +``` + +`output`: +![Person.prototype.__proto__.constructor](/images/js-prototype-2.png) + +可以发现 `Person` 的原型对象的原型对象,指向的构造函数是 `Object`。 + +即 `Person.prototype` 的原型,指向的是 `Object.prototype`。 + +那么, `Object.prototype` 有没有自己的原型呢? + +![Object.prototype.__proto__](/images/js-prototype-3.png) + +可以发现,`Object.prototype` 的原型,指向的是 `null`。 + +而`null` 是表示 **没有对象**,它没有原型。 + +## 原型链 + +`Person.prototype` -> `Object.prototype` -> `null` + +(通过 `__proto__` 进行关联) + +这种 对象有一个原型对象,它的原型对象又有它的原型对象,一层层如同链式一样,向上关联,称为 `原型链`。 + +几乎所有 `JavaScript` 中的对象都是位于原型链顶端的 `Object` 的实例。 + +::: tip +`__proto__` 是一个非标准的属性,但绝大部分浏览器都支持通过这个属性来访问原型。 + +`__proto__` 在实现上是`Object` 上的一个 `getter/setter`访问器 ,使用 `obj.__proto__` 时,可以理解成返回了 `Object.getPrototypeOf(obj)`。 +::: + +## 基于原型链的继承 + +`JavaScript` 对象是动态的属性“包”(指其自己的属性)。`JavaScript` 对象有一个指向一个原型对象的链。当试图访问一个对象的属性时,它不仅仅在该对象上搜寻,还会搜寻该对象的原型,以及该对象的原型的原型,依次层层向上搜索,直到找到一个名字匹配的属性或到达原型链的末尾。 + +```js +function Person(name) { + this.name = name +} +Person.prototype.age = 18 + +const person1 = new Person('Mark') +const person2 = new Person('John') +console.log(person1.name, person1.age) // Mark 18 +console.log(person2.name, person2.age) // John 18 +``` + +在这个示例中, 虽然`Person` 的实例对象自身并没有`age` 属性,但由于它的原型对象上有 `age` 属性, +实例对象从它的原型对象 **继承** 了属性 `age` 。 从而其 `age` 属性的值为 `18`。 diff --git a/docs/1.前端/6.JavaScript/2.进阶/执行上下文.md b/docs/1.前端/6.JavaScript/2.进阶/执行上下文.md new file mode 100644 index 00000000..4d6b4c47 --- /dev/null +++ b/docs/1.前端/6.JavaScript/2.进阶/执行上下文.md @@ -0,0 +1,227 @@ +--- +title: JavaScript进阶(四)— 执行上下文 +createTime: 2020/02/12 04:35:52 +author: pengzhanbo +permalink: /article/d12xkizf/ +--- + +## 执行上下文 + +执行上下文是, `JavaScript` 代码被 **解析** 和 **执行** 时 **所在环境** 的抽象概念。 +`JavaScript` 的任何代码都是在执行上下文中执行的。 + +### 类型 + +`JavaScript` 有三种 执行上下文 类型: + +- **全局执行上下文** + + 默认的执行上下文,或者说基础执行上下文。 任何不在函数内部的代码,都是在 全局执行上下文中。 + 全局上下文执行两个事情: + - 创建一个全局的 `window`对象(在浏览器环境中)。 + - 设置 `this` 的值等于 全局的 `window` 对象。 + + 一个程序只会有一个全局执行上下文。 + +- **函数执行上下文** + + 每当函数被执行时,都会为该函数创建一个新的执行上下文。 + 每个函数都有它自己的执行上下文,且是在函数执行的时候进行创建。 + 函数上下文可以有任意多个,每当一个函数执行上下文被创建,它会按照定义的顺序,执行一系列步骤。 + +- **eval函数执行上下文** + + 执行在 `eval` 函数内部的代码也会有它属于自己的执行上下文。 + +### 创建执行上下文 + +创建执行上下文主要分为两个阶段: **创建阶段** 和 **执行阶段**。 + +## 创建阶段 + +在创建阶段,会做三件事: +- this 值的决定,即 This绑定 +- 创建词法环境组件 +- 创建变量环境组件 + +### This绑定 + +- 全局执行上下文 + + 在全局执行上下文中, `this` 的值指向全局对象。(在浏览器中, `this` 引用 `Window` 对象)。 + + +- 函数执行上下文 + + 在函数执行上下文中, `this` 的值取决于该函数是如何被调用的。如果它被一个引用对象调用,那么 `this` 会被设置成那个对象,否则 `this` 的值被设置为全局对象或者 `undefined` (在严格模式下)。 + + ```js + let foo = { + bar: function() { + console.log(this); + } + } + + // 'this' 引用 'foo', 因为 'baz' 被对象 'foo' 调用 + foo.bar(); + + let bar = foo.baz; + + // 'this' 指向全局 window 对象,因为没有指定引用对象 + bar(); + ``` + +### 词法环境 + +> [ECMAScript 标准](https://262.ecma-international.org/6.0/) +> +> 词法环境是一种规范类型,基于 ECMAScript 代码的词法嵌套结构来定义标识符和具体变量和函数的关联。 +> 一个词法环境由环境记录器和一个可能的引用外部词法环境的空值组成。 + +词法环境是一种 **持有标识符—变量映射** 的结构。 + +::: tip +这里的标识符指的是变量/函数的名字,而变量是对实际对象[包含函数类型对象]或原始数据的引用。 +::: + +在词法环境的内部有两个组件:**(1) 环境记录器**和 **(2) 一个外部环境的引用**。 + +- **环境记录器**是存储变量和函数声明的实际位置。 +- **外部环境的引用**意味着它可以访问其父级词法环境(作用域)。 + +词法环境有两种类型: + +- **全局环境**(在全局执行上下文中)是没有外部环境引用的词法环境。全局环境的外部环境引用是 `null`。它拥有内建的 Object/Array/等、在环境记录器内的原型函数(关联全局对象,比如 `window` 对象)还有任何用户定义的全局变量,并且 `this` 的值指向全局对象。 +- 在**函数环境**中,函数内部用户定义的变量存储在环境记录器中。并且引用的外部环境可能是全局环境,或者任何包含此内部函数的外部函数。 + +环境记录器也有两种类型: + +- **声明式环境记录器**: 存储变量、函数和参数。 +- **对象环境记录器**: 用来定义出现在全局上下文中的变量和函数的关系。 + +可以看出: + +- 在**全局环境**中,环境记录器是对象环境记录器。 +- 在**函数环境**中,环境记录器是声明式环境记录器。 + +::: tip 注意 +对于**函数环境**,**声明式环境记录器**还包含了一个传递给函数的 `arguments` 对象(此对象存储索引和参数的映射)和传递给函数的参数的 `length`。 +::: + +使用伪代码描述 词法环境,大致如下: +```js +GlobalExecutionContext = { + LexicalEnvironment: { + EnvironmentRecord: { + Type: "Object", + // 在这里绑定标识符 + } + outer: <null> + } +} + +FunctionExecutionContext = { + LexicalEnvironment: { + EnvironmentRecord: { + Type: "Declarative", + // 在这里绑定标识符 + } + outer: <Global or outer function environment reference> + } +} +``` + +### 变量环境 + +**变量环境** 同样是一个 **词法环境**,其环境记录器持有变量声明语句在执行上下文中创建的绑定关系。 + +**变量环境** 有着上面定义的词法环境的所有属性。 + +在 `ES6` 中,**词法环境**和**变量环境**的一个不同就是前者被用来存储函数声明和变量(`let` 和 `const`)绑定, +而后者只用来存储 `var` 变量绑定。 + +示例代码: +```js +let a = 20 +const b = 30 +var c + +function multiply(e, f) { + var g = 20 + return e * f * g +} + +c = multiply(20, 30) +``` + +示例代码 执行上下文伪代码: +```js +GlobalExectionContext = { + + ThisBinding: <Global Object>, + + LexicalEnvironment: { + EnvironmentRecord: { + Type: "Object", + // 在这里绑定标识符 + a: < uninitialized >, + b: < uninitialized >, + multiply: < func > + } + outer: <null> + }, + + VariableEnvironment: { + EnvironmentRecord: { + Type: "Object", + // 在这里绑定标识符 + c: undefined, + } + outer: <null> + } +} + +FunctionExectionContext = { + ThisBinding: <Global Object>, + + LexicalEnvironment: { + EnvironmentRecord: { + Type: "Declarative", + // 在这里绑定标识符 + Arguments: {0: 20, 1: 30, length: 2}, + }, + outer: <GlobalLexicalEnvironment> + }, + + VariableEnvironment: { + EnvironmentRecord: { + Type: "Declarative", + // 在这里绑定标识符 + g: undefined + }, + outer: <GlobalLexicalEnvironment> + } +} +``` + +::: warning +只有遇到调用函数 `multiply` 时,函数执行上下文才会被创建。 +::: + +**说明:** + +可能你已经注意到 `let` 和 `const` 定义的变量并没有关联任何值,但 `var` 定义的变量被设成了 `undefined。` + +这是因为在创建阶段时,引擎检查代码找出变量和函数声明,虽然函数声明完全存储在环境中,但是变量最初设置为 `undefined`(`var` 情况下),或者未初始化(`let` 和 `const` 情况下)。 + +这就是为什么你可以在声明之前访问 `var` 定义的变量(虽然是 `undefined`),但是在声明之前访问 `let` 和 `const` 的变量会得到一个引用错误。 + +这就是我们说的变量声明提升。 + +## 执行阶段 + +在此阶段,完成对所有这些变量的分配,最后执行代码。 + +::: warning +在执行阶段,如果 `JavaScript` 引擎不能在源码中声明的实际位置找到 `let` 变量的值,它会被赋值为 `undefined`。 +::: diff --git a/docs/1.前端/6.JavaScript/2.进阶/执行上下文栈.md b/docs/1.前端/6.JavaScript/2.进阶/执行上下文栈.md new file mode 100644 index 00000000..f0e3d2d2 --- /dev/null +++ b/docs/1.前端/6.JavaScript/2.进阶/执行上下文栈.md @@ -0,0 +1,138 @@ +--- +title: JavaScript进阶(三)— 执行上下文栈 +createTime: 2020/02/11 11:53:33 +author: pengzhanbo +permalink: /article/6snk1b6c/ +--- + +关于 执行上下文,请点击查看[这篇文章](/article/d12xkizf/)。 + +## 执行上下文栈 + +`JavaScript` 引擎 创建了 执行上下文栈 来存储并管理 代码执行时创建的所有 执行上下文。 + +执行上下文栈(Execution context stack,ECS) 是一个种拥有 LIFO(后进先出) 的栈。 + +我们使用一个数组 模拟 执行上下文栈: + +```js +const ECSStack = [] +``` + +当 `JavaScript` 执行时,首先遇到的是 全局代码,初始化时,会首先向 执行上下文栈中压入 全局执行上下文 +(global execution context)。它只有在整个程序结束时,才会被清空,所以在程序结束前, `ECSStack` 底部 +都会有一个 `globalExecutionContext` + +```js +const ECSStack = [ + globalExecutionContext +] +``` + +当 `JavaScript` 开始执行以下代码时: +``` js +function foo() { + console.log('foo') +} +function bar() { + foo() +} +function run() { + bar() +} + +run() +``` +在这段代码中,`JavaScript` 进行以下处理: +``` ts +// 伪代码: + +// run(), 创建 函数执行上下文,并压入 执行上下文栈 +ECSStack.push(functionExecutionContext<run>) + +// run() 中发现需要执行 bar(), 继续创建 函数执行上下文,并压入执行上下文栈 +ECSStack.push(functionExecutionContext<bar>) + +// bar() 中发现需要执行 foo(), 继续创建 函数执行上下文,并压入执行上下文栈 +ECSStack.push(functionExecutionContext<foo>) + +/** 此时, ECSStack 的结构,如下: + * [ + * globalExecutionContext, + * functionExecutionContext<run>, + * functionExecutionContext<bar>, + * functionExecutionContext<foo> + * ] + */ + +// 当 foo() 执行完毕,从执行上下文栈中移除 functionExecutionContext<foo> +ECSStack.pop() + +// 当 bar() 执行完毕,从执行上下文栈中移除 functionExecutionContext<bar> +ECSStack.pop() + +// 当 run() 执行完毕,从执行上下文栈中移除 functionExecutionContext<run> +ECSStack.pop() + +// 在程序未结束时, ECSStack 底部永远有一个 globalExecutionContext +``` + +再看下一个例子: + +```js +var scope = "global scope"; +function checkScope(){ + var scope = "local scope"; + function f(){ + return scope; + } + return f(); +} +checkScope(); +``` + +```js +var scope = "global scope"; +function checkScope(){ + var scope = "local scope"; + function f(){ + return scope; + } + return f; +} +checkScope()(); +``` + +这两段代码,虽然在执行结果是一样的,都是输出 `local scope`, 但是在 执行上下文栈 中的变化不同。 + +第一段代码, 在 执行上下文栈,模拟处理如下: + +```ts +// 执行checkScope() +ECSStack.push(functionExecutionContext<checkScope>) +// 在checkScope执行阶段中执行 f() +ECSStack.push(functionExecutionContext<f>) + +ECSStack.pop() +ECSStack.pop() +``` + +第二段代码, 在执行上下文栈,模拟处理如下: + +```ts +// 执行checkScope() +ECSStack.push(functionExecutionContext<checkScope>) +ECSStack.pop() +// 在checkScope 完成后,再执行 f() +ECSStack.push(functionExecutionContext<f>) +ECSStack.pop() +``` + +可以看出, 函数执行的时机不同,虽然最终结果一致,但是在 执行上下文栈 中的过程是不同的。 + +## 总结 + +1. 执行上下文栈,是用于存储和管理所有执行上下文。 +2. 在程序没有结束前,执行栈中永远有一个全局执行上下文。 +3. 函数执行时,会创建一个新的函数执行上下文,并按顺序压入到执行栈中。 +4. 函数执行完成后,对应的函数执行上下文会从执行栈中移除。 diff --git a/docs/1.前端/6.JavaScript/2.进阶/词法作用域.md b/docs/1.前端/6.JavaScript/2.进阶/词法作用域.md new file mode 100644 index 00000000..79cb5122 --- /dev/null +++ b/docs/1.前端/6.JavaScript/2.进阶/词法作用域.md @@ -0,0 +1,38 @@ +--- +title: JavaScript进阶(二)— 词法作用域 +createTime: 2020/02/10 11:37:25 +author: pengzhanbo +permalink: /article/fpcpgpod/ +--- + +## 作用域 + +作用域是指 程序源代码中,定义变量的区域。 + +作用域规定了如何查找变量,也就是确定当前执行代码对变量的访问权限。 + +## 词法作用域 + +在 `JavaScript` 中,采用的是 词法作用域, 即静态作用域。 + +词法作用域规定了,函数的作用域是在 **函数定义的时候就确定** 了。 + +### 示例 + +```js +var a = 1 +function foo() { + console.log(a) +} +function bar() { + var a = 2 + foo() +} +bar() +``` + +这个示例的执行结果为 `1`。 + +在这个例子中, 由于 函数`foo` 的作用域在 定义的时候就确定了,即使在 函数`bar` 中也有相同的变量名`a`的定义, +但是由于两个函数在定义时,作用域是相互独立的,函数`foo`在其作用域查找局部变量`a`,没有找到, +继续从它书写位置往上查找上一层的代码,所以输出的结果为 `1`。 diff --git a/docs/1.前端/7.构建工具/webpack-HMR.md b/docs/1.前端/7.构建工具/webpack-HMR.md new file mode 100644 index 00000000..27733b59 --- /dev/null +++ b/docs/1.前端/7.构建工具/webpack-HMR.md @@ -0,0 +1,94 @@ +--- +title: webpack模块热替换(HMR) +createTime: 2021/03/24 05:14:18 +author: pengzhanbo +permalink: /article/knagbtgd/ +--- + +**模块热替换(Hot Module Replacement)** 是 webpack 的一个 十分有用且强大的 特性。 +当我们对 文件代码进行修改并保存后,webpack 会重新编译打包文件代码,并将新的模块代码发送给客户端, +浏览器通过将旧模块替换为新模块,实现在浏览器不刷新的情况下,对应用进行更新。 + +<!-- more --> + +## 前言 + +在还没有 HMR 之前,我们对文件代码进行更新保存后,想要查看更新后的内容,常常需要手动刷新浏览器。 + +但还好的是,也有一些 **live reload** 的工具库,这些库能够监听文件的变化,通知浏览器刷新页面, +从而帮助我们减少了重复的操作。 + +但是为什么还需要 HMR 呢? + +当浏览器刷新,也意味着当前页面的状态丢失了。 +比如,我们打开了一个弹窗,然后我们对弹窗的代码逻辑进行了修改并保存,浏览器刷新后,弹窗被关闭了, +我们需要重新进行交互打开弹窗。 +这无疑会增加非常多的重复且无意义工作量、时间。 + +HMR 的作用,就是不仅帮助我们在无刷新的情况下更新了应用代码,同时还保留了应用的状态,让我们能避免了 +大量重复操作,从而提高开发效率。 + +## 模块热替换 + +模块热替换(HMR - Hot Module Replacement)功能会在应用程序运行过程中替换、添加或删除模块,而无需重新加载整个页面。 + +### 启用 +启用 HMR 的方式很简单,[查看官方文档](https://www.webpackjs.com/guides/hot-module-replacement/) + +### 特性 + +HMR有几个特性: + +- 保留在完全重新加载页面时丢失的应用程序状态。 +- 只更新变更内容,以节省宝贵的开发时间。 +- 调整样式更加快速 - 几乎相当于在浏览器调试器中更改样式。 + + +## HMR基本流程 + +- **Step 1:** + + webpack watch 模式下,监听文件系统中的某个文件是否发生修改。当监听到文件发生变更时, + 根据配置文件**对模块进行重新编译打包**,并将打包后的代码 通过 JavaScript 对象保存在内存中。 + +- **Step 2:** + + webpack-dev-middleware 调用 webpack 的API 对代码的变化进行监控,并通知webpack,将代码打包到内存中。 + +- **Step 3:** + + webpack-dev-server 监听文件变化,不同于第一步的是,这一步不监听代码变化进行重新编译打包。 + 当配置文件中配置了 `devServer.watchContentBase` 为 `true` 时, + Server会监听配置的文件夹中静态文件的变化,如果发生变化,通知浏览器进行 `live reload`,即刷新页面。 + +- **Step 4:** + + webpack-dev-server 通过 sockjs 在浏览器和服务器端之间建立一个 websocket 长连接, + 将webpack编译打包的各个阶段的状态信息告知浏览器端,也包括第三步中 Server 监听静态文件变化的信息。 + 浏览器端根据这些socket消息进行不同的操作。 + 其中,服务器传递的最主要的信息,是新模块的 hash 值,后续步骤根据 hash值 进行模块的替换。 + +- **Step 5:** + + webpack-dev-server 虽然会告知浏览器打包状态,但在 webpack-dev-server/client 端并不会去请求更新的代码, + 也不会执行热模块替换的操作,这些工作会交回给 webpack/hot/dev-server。 + webpack/hot/dev-server 根据 webpack-dev-server/client 传给它的信息,以及 dev-server 的配置信息, + 来决定是刷新浏览器,还是执行 热模块替换。 + +- **Step 6:** + + 在客户端中,HotModuleReplacement.runtime 接受到 上一步传递给它的新模块的 hash 值, + 通过 JsonpMainTemplate.runtime 向 server 端发送 Ajax 请求,server 端返回一个 json。 + 该 json 包含了所有要更新的模块的 hash 值,获取到需要更新的模块列表后,再发送一个 jsonp 请求, + 获取最新的模块代码。 + +- **Step 7:** + + HotModulePlugin 会对新旧模块进行对比,决定是否更新模块。 + 在决定更新模块后,检查模块之间的依赖关系,更新模块的同时,也更新模块间的依赖引用。 + 这个步骤也决定了 HMR 是否成功。 + +- **Step 8:** + + 如果 HMR 失败,则回退到 live reload 操作,通过刷新浏览器来获取最新打包的代码。 + diff --git a/docs/1.前端/7.构建工具/webpack原理.md b/docs/1.前端/7.构建工具/webpack原理.md new file mode 100644 index 00000000..899a632b --- /dev/null +++ b/docs/1.前端/7.构建工具/webpack原理.md @@ -0,0 +1,176 @@ +--- +title: webpack原理的简单入门 +createTime: 2021/03/21 06:13:07 +author: pengzhanbo +permalink: /article/gq88mn6a/ +--- + +::: center +![webpack](https://www.webpackjs.com/32dc115fbfd1340f919f0234725c6fb4.png){width="100px"} +::: + +## 前言 + +我们知道, `webpack` 作为前端工程化中,主流的模块打包工具之一,应用于各种各样的前端工程化项目中。 + +虽然大多数项目都或多或少会使用到 `webpack`, 但是可能对于大多数的 前端开发人员来说, +可能只是改改 `webpack` 的配置, 或者甚至从未动过 `webpack` 的相关文件, +或多或少对 `webpack` 的配置以及功能感到陌生。 + +还有类似于 `vue-cli`、`create-react-app` 、 `umi.js` 等各种基于 `webpack` 封装的 脚手架, +提供了各种开箱即用的功能,这使得 `webpack` 离我们好像越来越远。 + +但是当我们的某个项目面临了不得不去 深入 `webpack` 才能解决的问题,或者 面试时,被问起 `webpack` 相关的问题, +就难以解决或者回答。 + +所以我们需要对 `webpack` 至少有基本的了解,了解它的原理、如何编写 `loader` 、 `plugin` 等。 + +## webpack是什么 + +> 引用 [webpack官网](https://webpack.js.org/concepts/) : +> +> At its core, webpack is a static module bundler for modern JavaScript applications. When webpack processes your application, it internally builds a dependency graph from one or more entry points and then combines every module your project needs into one or more bundles, which are static assets to serve your content from. +> +> 本质上,webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle。 + +从作用上讲,webpack 的功能就是将不同模块的文件,打包整合到一起,并且保证它们之间引用的正确,且有序执行。 +这使得我们在做项目架构时,能够从模块的角度去做文件拆分,然后交给 webpack 打包整合。 + +而一个项目中的文件,不仅有 html文件、CSS文件、JavaScript文件、图片资源、Vue特有的`.vue`文件,typescript的`.ts` 文件等,以及项目的中的代码还需要进行压缩混淆、浏览器兼容、等等必要的处理,启动一个本地的开发服务器、模块的热更新替换等, 可以通过`webpack` 提供的各种机制,来一一实现。 + +对于 `webpack` 来说, 它自身只能识别 JavaScript 文件, 而对于其他的资源,可以通过 webpack提供的 `Loader` 特性来实现 +识别。 通过 `Loader`,可以把其它类型的资源文件,转换为 webpack能够处理的有效模块。 + +而对于 代码混淆、本地开发服务器、模块热更新,则可以通过 webpack 提供的 `Plugin` 特性来实现功能上的扩展。 + +## 模块打包原理 + +在 webpack 中,有四个基础且核心的概念: + +- **入口(entry)** +- **输出(output)** +- **加载器(Loader)** +- **插件(Plugin)** + +### 入口(entry) + + 指示 webpack 应该使用哪个模块,来作为构建其内部依赖图的开始。 + +### 输出(output) + + 告诉 webpack 在哪里输出它所创建的 bundles,以及如何命名这些文件 + +### 加载器(Loader) + + webpack 自身只能理解 JavaScript 文件 和 json 文件, loader 可以将其他类型的资源文件转换为 webpack能够处理的有效模块。 + + 本质上,webpack loader 将所有类型的文件,转换为应用程序的依赖图(和最终的 bundle)可以直接引用的模块。 + +### 插件(Plugin) + + 用于执行范围更广的任务。插件的范围包括,从打包优化和压缩,一直到重新定义环境中的变量。 + 插件接口功能极其强大,可以用来处理各种各样的任务。 + + +### 模块(modules) + +在模块化编程中,开发者将程序分解成离散功能块(discrete chunks of functionality),并称之为模块。 + +对于 webpack ,任何文件都可以是一个模块。 + +### 模块打包运行原理 + +在说 webpack 的 **模块打包运行原理** 之前, 先看下 我们是如何使用 webpack的, +一般情况下, 我们通过编写一个 配置文件`webpack.config.js`, 对 webpack 进行本地化的配置, +大致的配置如下: +``` js +module.exports = { + // 声明模块的入口文件 + entry: './src/entry.js', + output: { + path: path.resolve(__dirname, 'dist'), // 输出目录 + filename: 'bundle.js', // 文件名称 + }, + module: { + rules: [ + // 配置 使用 babel-loader 对 .js 资源进行转换 + { + test: /\.js$/, + loader: 'babel-loader', + }, + // ...more loader + ], + }, + // 插件配置 + plugins: [ + new EslintWebpackPlugin(), + new webpack.NoEmitOnErrorsPlugin(), + // ...more plugin + ], + // ...more config +} +``` + +`webpack` 读取了 配置文件后,运行的流程大致如下: + +1. 读取 `webpack` 的配置参数; +2. 启动 `webpack` , 创建 `compiler` 对象,开始解析项目; +3. 从入口文件 `entry` 开始解析,并找到其导入的**依赖模块**,递归遍历分析,形成**依赖关系树**; +4. 对不同的文件类型资源的依赖模块文件,使用对应的 `Loader` 进行转换,最终转为 webpack的有效模块; +5. 在编译过程中, `webpack` 通过 发布订阅模式,向外抛出一些 `hooks` ,`webpack` 的 `Plugin` 通过监听各个 `hooks` , + 执行插件任务,扩展 `webpack` 的功能,干预输出结果。 +6. 根据 输出配置 `output` ,将打包构建好的资源文件 输出。 + +`compiler` 对象是一个全局单例,负责控制整个 webpack 构建流程。 + +在构建过程中,还会产生一个当前构建的上下文对象 `compilation`, 它包含了当前构建的所有信息,在每个热更新或重新构建时, `compiler` 都会产生一个新的`compilation` 对象,负责当前构建过程。 + +每个模块间的依赖关系,则依赖于`AST`语法树。每个模块文件在通过`Loader`解析完成之后, +会通过`acorn`库生成模块代码的`AST`语法树,通过语法树就可以分析这个模块是否还有依赖的模块, +进而继续循环执行下一个模块的编译解析。 + +最终, webpack 打包构建出来的 bundle 文件,是一个 IIFE 执行函数。 + +```js +// webpack5下进行的最小化打包输出文件 +(() => { + // webpack 模块文件内容 + var __webpack_modules__ = ({ + "entry.js": ((modules) => { /* ... */ }), + "other.js": ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { /* ... */ }) + }); + + // 模块缓存 + var __webpack_module_cache__ = {}; + + // The require function + function __webpack_require__(moduleId) { + // Check if module is in cache + var cachedModule = __webpack_module_cache__[moduleId]; + if (cachedModule !== undefined) { + return cachedModule.exports; + } + // Create a new module (and put it into the cache) + var module = __webpack_module_cache__[moduleId] = { + // no module.id needed + // no module.loaded needed + exports: {} + }; + + // Execute the module function + __webpack_modules__[moduleId](module, module.exports, __webpack_require__); + + // Return the exports of the module + return module.exports; + } + + // startup + // Load entry module and return exports + // This entry module can't be inlined because the eval devtool is used. + var __webpack_exports__ = __webpack_require__("entry.js"); + +})(); +``` +在上面的打包demo中,整个立即执行函数里边只有三个变量和一个函数方法,`__webpack_modules__`存放了编译后的各个文件模块的JS内容,`__webpack_module_cache__` 用来做模块缓存,`__webpack_require__` 是Webpack内部实现的一套依赖引入函数。最后一句则是代码运行的起点,从入口文件开始,启动整个项目。 + +`__webpack_require__`模块引入函数,我们在模块化开发的时候,通常会使用`ES Module`或者`CommonJS`规范导出/引入依赖模块,webpack打包编译的时候,会统一替换成自己的`__webpack_require__`来实现模块的引入和导出,从而实现模块缓存机制,以及抹平不同模块规范之间的一些差异性。 diff --git a/docs/1.前端/8.HTTP/CORS.md b/docs/1.前端/8.HTTP/CORS.md new file mode 100644 index 00000000..ea5f2b5a --- /dev/null +++ b/docs/1.前端/8.HTTP/CORS.md @@ -0,0 +1,332 @@ +--- +title: 跨域资源共享(CORS) +createTime: 2020/08/29 07:40:31 +author: pengzhanbo +tags: + - http +permalink: /article/2f45bq9x/ +--- + +**跨域资源共享(CORS)** 是一种基于 **HTTP Header** 的机制。 +该机制通过允许服务器标示除了它自己的 origin(域,协议和端口),使这些 origin 有权限访问加载服务器上的资源。 + +<!-- more --> + +跨域资源共享 通过 **预检请求** 的机制,检查服务器是否允许要发送的真实请求。 +浏览器向服务器发送一个到服务器托管的跨域资源 **预检请求**, +在预检请求中,浏览器发送的头部中标示有HTTP方法和真实请求会用到的头。 + +## 前言 + +浏览器出于安全性的原因,会限制脚本内发起的跨域资源请求, +比如 **XMLHttpRequest** 和 **Fetch API** 遵循 **同源策略**,默认情况下不允许发起非同源的资源请求。 +使用这些API的Web应用,只能加载从应用程序的同一个域的请求HTTP资源, +**除非响应报文中包含了正确的CORS响应头** + +## 概述 + +跨域资源共享 新增了一组 HTTP首部字段,允许服务器声明哪些源站通过浏览器有权限访问哪些资源。 +同时,对于可能对服务器数据产生副作用的 HTTP 请求方法,浏览器必须首先使用 `OPTIONS` 方法发起一个预检请求, +从而获取服务器是否允许跨域请求,服务器确认允许之后,才发起实际的HTTP请求。 + +CORS 请求失败会产生错误,但是为了安全,在 JavaScript 代码中,是无法获取具体是哪里出了问题。 +我们只能通过查看浏览器的控制台来获取具体出现的错误。 + +若要开启 CORS ,我们需要配置 CORS 相关的 HTTP首部字段。 + +## HTTP 响应首部字段 + +在 CORS 中,HTTP 响应首部字段主要有以下几个: + +- **Access-Control-Allow-Origin** +- **Access-Control-Allow-Methods** +- **Access-Control-Allow-Headers** +- **Access-Control-Max-Age** +- **Access-Control-Expose-Headers** +- **Access-Control-Allow-Credentials** + +### Access-Control-Allow-Origin + +**Access-Control-Allow-Origin** 响应首部字段,用于 **指定允许访问该资源的外域URI**。 + +对于不需要携带身份凭证的请求,服务器可以指定改字段的值为通配符(`*`),表示允许来自所有域的请求。 + +语法: +``` +Access-Control-Allow-Origin: <origin> +Access-Control-Allow-Origin: * +``` + +如果服务器 指定了具体的域名而非 `*`,那么响应首部中的 **Vary** 字段的值必须包含 `Origin`。 +用于告诉客户端:服务器对不同的源站返回不同的内容。 + +::: info 注意 +当响应的是附带身份凭证的请求时,服务端 必须 明确 **Access-Control-Allow-Origin** 的值,而不能使用通配符`“*”`。 +::: + +**示例1:** + +允许所有域访问 +``` +Access-Control-Allow-Origin: * +``` + +**示例2:** + +允许来自 https://pengzhanbo.cn 的请求 +``` +Access-Control-Allow-Origin: https://pengzhanbo.cn +Vary: Origin +``` + +### Access-Control-Allow-Methods + +**Access-Control-Allow-Methods** 响应首部字段用于 预检请求的响应。 +**指明了实际请求所允许使用的HTTP方法或方法列表**。 + +语法: +``` +Access-Control-Allow-Methods: <method>[, <method>]* +``` + +示例: + +``` +Access-Control-Allow-Methods: POST, GET, OPTIONS +``` + +### Access-Control-Allow-Headers + +**Access-Control-Allow-Headers** 响应首部字段用于 预检请求的响应。 +**指明了实际请求中允许携带的首部字段**。 + +语法: +``` +Access-Control-Allow-Headers: <header-name>[, header-name]* +Access-Control-Allow-Headers: * +``` + +以下特定的首部是一直允许的,无需特意声明他们: +- Accept +- Accept-Language +- Content-Language +- Content-Type,但只在其值属于MIME类型 `application/x-www-form-urlencoded`,`multipart/form-data`,`text/pain` 中的一种。 + +**示例1:** + +自定义请求头。 除了 CORS 安全清单列出的请求头外,支持 自定义请求头 X-Custom-Header + +``` +Access-Control-Allow-Headers: X-Custom-Header +``` + +**示例2:** + +多个自定义请求头。 + +``` +Access-Control-Allow-Headers: X-Custom-Header, X-My-Header +``` + +### Access-Control-Max-Age + +**Access-Control-Max-Age** 响应首部字段表示 **预检请求的返回结果可以被缓存多久**。 + +返回结果是指: **Access-Control-Allow-Methods** 和 **Access-Control-Allow-Headers** 提供的信息。 + +语法: +``` +Access-Control-Max-Age: <delta-seconds> +``` + +**delta-seconds** 表示返回结果可以被缓存的最长时间(秒)。 +在 Firefox 中, 上限是 **24小时(86400秒)**。 +在 Chromium 中,上限是 **2小时(7200秒)**,同时 Chromium 还规定了默认值是 **5秒**。 +如果值为 **-1** , 表示禁用缓存,则每次请求前都需要使用 OPTIONS 预检请求。 + +**示例** + +将预检请求缓存 10分钟: +``` +Access-Control-Max-Age: 600 +``` + +### Access-Control-Expose-Headers + +**Access-Control-Expose-Headers** 响应首部字段,列出了 哪些首部可以作为响应的一部分暴露给外部。 + +在 跨源访问时,XMLHttpRequest 对象的 `getResponseHeader()` 方法默认只能拿到一些最基本的响应头。 + +默认情况下,只有七种 简单响应首部 可以暴露给外部: + +- Cache-Control +- Content-Language +- Content-Length +- Content-Type +- Expires +- Last-Modified +- Pragma + +如果期望让客户端可以访问到其他的首部信息,可以将它们 该字段受列出来。 + +语法: +``` +Access-Control-Expose-Headers: <header-name>[, <header-name>]* +``` + +**示例** + +暴露一个非简单响应首部: +``` +Access-Control-Expose-Headers: X-My-Header +``` + +暴露多个非简单响应首部: +``` +Access-Control-Expose-Headers: X-My-Header, X-Custom-Header +``` + +### Access-Control-Allow-Credentials + +**Access-Control-Allow-Credentials** 响应首部字段 用于在 请求包含 Credentials 时, +告知浏览器是否可以将对请求的响应暴露给前端 JavaScript 代码。 + +当请求的 Credentials 模式 (Request.credentials)为 `include` 时,浏览器尽在相应头 **Access-Control-Allow-Credentials** 的值为 `true` 时将响应暴露给前端的 JavaScript 代码。 + +Credentials 可以是 `cookies`、 `authorization headers` 或 `TLS client certificates`。 + +语法: +``` +Access-Control-Allow-Credentials: true +``` + +**Access-Control-Allow-Credentials** 需要与 `XMLHttpRequest.withCredentials` +或 **Fetch API** 的 `Request()` 构造函数中的 `credentials` 选项结合使用。 +Credentials 必须在前后端都被配置,才能使带 credentials 的 CORS 请求成功。 + +**示例:** + +允许 credentials + +``` +Access-Control-Allow-Credentials: true +``` + +使用带 credentials 的 XHR: + +``` js +const xhr = new XMLHttpRequest() +xhr.open('GET', 'https://pengzhanbo.cn', true) +xhr.withCredentials = true +xhr.send(null) +``` + +使用带 credentials 的 Fetch: + +``` js +fetch('https://pengzhanbo.cn', { + credentials: 'include' +}) +``` + +## HTTP 请求首部字段 + +在 CORS 中,可用于发起跨域请求的首部字段,如下: + +- Origin +- Access-Control-Request-Method +- Access-Control-Request-Headers + +这些首部字段无需手动设置。 + +当开发者使用 XMLHttpRequest 发起跨域请求时,它们已经被设置就绪。 + +### Origin + +**Origin** 请求首部字段表明预检请求或实际请求的源站。 + +语法: + +``` +Origin: <origin> +``` + +origin 参数的值为源站的URI。不包含任何路径信息,仅表示服务器名称。 + +### Access-Control-Request-Method + +**Access-Control-Request-Method** 请求首部字段用于预检请求。作用是 将实际情况所使用的HTTP方法告诉服务器。 + +语法: + +``` +Access-Control-Request-Method: <method> +``` + +### Access-Control-Request-Headers + +**Access-Control-Request-Headers** 请求首部字段用于预检请求。作用是 将实际请求所携带的首部字段告诉服务器。 + +语法: + +``` +Access-Control-Request-Headers: <header-name>[, <header-name>]* +``` + +## 预检请求 + +一个 CORS 预检请求时用于 检查服务器使用支持 CORS, 即 跨域资源共享。 + +预检请求 通过 发送一个 OPTIONS 请求,请求头部包含了以下字段: + +- Access-Control-Request-Method +- Access-Control-Request-Headers +- Origin + +浏览器会在有必要的时候,自动发出一个预检请求。 + +所以在正常情况下,前端开发者不需要自己去发送这样的请求。 + +### 预检请求与凭据 + +CORS 预检请求不能包含凭据。预检请求的响应必须指定 Access-Control-Allow-Credentials: true 来表明可以携带凭据进行实际的请求。 + +## 简单请求 + +某些情况下,不会触发 CORS预检请求,这样的请求,可表述为 _简单请求_。 + +若请求满足以下所有条件,则可视为 简单请求: + +- 使用 GET, HEAD POST 请求方法 +- 除了被用户代理自动设置的首部字段(Connection,User-Agent等), + 以及在 Fetch 规范中定义为 [禁用首部名称](https://fetch.spec.whatwg.org/#forbidden-header-name) 的其他首部, + 允许人为设置的字段为 Fetch 规范定义的 对 [CORS 安全的首部字段集合](https://fetch.spec.whatwg.org/#cors-safelisted-request-header) +- 请求中任意的 XMLHttpRequest 对象均没有注册任何监听事件, + XMLHttpRequest 对象可以使用 XMLHttpRequest.upload 属性访问。 +- 请求中没有使用 ReadableStream 对象。 + +## 附带身份的请求与通配符 + +在响应附带身份凭证的请求时: + +- 服务器不能将 **Access-Control-Allow-Origin** 的值设为通配符 `*`,而应将其设置为特定的域,如:Access-Control-Allow-Origin: https://pengzhanbo.cn。 + +- 服务器不能将 **Access-Control-Allow-Headers** 的值设为通配符 `*`,而应将其设置为首部名称的列表,如:Access-Control-Allow-Headers: X-Custom-Header, Content-Type + +- 服务器不能将 **Access-Control-Allow-Methods** 的值设为通配符 `*`,而应将其设置为特定请求方法名称的列表,如:Access-Control-Allow-Methods: POST, GET + + +## 需要CORS的场景 + +1. 使用 **XMLHttpRequest** 发起的 HTTP请求 +2. 使用 **Fetch API** 发起的 HTTP 请求 +3. Web字体,CSS通过 `@font-face` 使用的跨域字体资源 +4. WebGL 贴图 +5. 使用 drawImage 将 Images/video 画面绘制到 canvas +6. 来自图像的 CSS 图形 + + +## 安全 + +在实际的使用场景中,尽可能的少使用 通配符 `*`,来允许所有域访问,或允许所有自定义首部字段, +这可能在 web 安全上来带风险。 diff --git a/docs/1.前端/8.HTTP/CSP.md b/docs/1.前端/8.HTTP/CSP.md new file mode 100644 index 00000000..f38912b4 --- /dev/null +++ b/docs/1.前端/8.HTTP/CSP.md @@ -0,0 +1,256 @@ +--- +title: 内容安全策略(CSP) +createTime: 2020/08/28 03:25:32 +author: pengzhanbo +tags: + - http + - 安全 +permalink: /article/snkdmwsz/ +--- + + +内容安全策略(`Content-Security-Policy`),简称 `CSP`。是一种 计算机安全标准。 + +主要目标是 减少和报告XSS攻击、数据注入攻击等。这些攻击手段的主要目的是盗取网站数据、网站内容污染、散发恶意软件等。 + +几乎所有现在浏览器都支持 `CSP`, 对于不支持的浏览器,则会忽略 `CSP`。 + +<!-- more --> + +## XSS攻击 + +XSS攻击是一种常见的、危害极大的网络攻击手段。它利用浏览器对从服务器获取的内容的信任, +通过站点的 `script` 脚本、内联脚本、外部导入资源等方式进行注入攻击。 +恶意脚本在受害者浏览器中执行,以达成其目的。 + +## CSP + +`CSP` 通过 **有效域名**,即 **浏览器认可的可执行脚本的有效来源** ,使 服务器管理者有能力消除或减少 XSS 攻击所以来的载体。 +支持 `CSP` 的浏览器,仅会执行从白名单域名加载的脚本文件,忽略其他所有脚本,包括内联脚本和 HTML 事件处理属性。 + + +## 制定策略 + +`CSP` 通过 声明 HTTP 头部字段 `Content-Security-Policy` 来启用和配置策略: +``` +Content-Security-Policy: policy; +Content-Security-Policy: policy; policy; +``` + +参数 `[policy]` 是一个包含了描述 各种CSP策略指令的字符串。 + +## 策略指令 + +### default-src + +为其他CSP指令提供备选项,如果其他指令不存在,用户代理会查找并应用该值,如果其他指令有配置值,那么则不会应用 default-src的值。 + +default-src 策略允许指定一个或多个值: +``` +Content-Security-Policy: default-src <source>; +Content-Security-Policy: default-src <source> <source>; +``` + +### script-src + +脚本内容安全策略指令,包括限制 外部资源、内联脚本、eval函数。 + +``` +Content-Security-Policy: script-src <source> +``` + +### style-src + +CSS文件内容安全策略指令,包括限制 内联样式表、通过`<link>` 引入的css文件、样式中通过 `@import` 导入的css文件、 +元素的 `style` 属性、 `style.cssText` 属性、以及 `el.setAttribute('style', '')` + +``` +Content-Security-Policy: style-src <source> +``` + +### img-src + +图片资源内容安全策略指令, 限制通过 `<img>` 加载的图片资源 + +``` +Content-Security-Policy: img-src <source> +``` + +### media-src + +媒体资源内容安全策略指令,限制通过 `<audio>`、`<video>`、`<track>` 加载的媒体资源 + +``` +Content-Security-Policy: media-src <source> +``` + +### frame-src + +iframe内容安全策略指令,限制`<iframe>` 加载的页面资源 + +### 其他指令 + +- `manifest-src` 限制 manifest 资源(通过`<link>`引入的 manifest文件) +- `worker-src` 限制 `worker`资源,包括 `Worker`、`SharedWorker` 、`ServiceWorker` +- `child-src` 限制 `web worker`、`<frame>` 、`<iframe>` +- `connect-src` 限制允许通过脚本接口加载的链接地址,包括:`<a>`、`Fetch`、`XMLHttpRequest`、`WebSocket`、`EventSource` +- `font-src` 限制 `@font-face` 加载字体的有效源规则。 +- `object-src` 限制 `<object>`、`<embed>`、`<applet>` + + +### 指令`<source>`有效值 + +- `<host-source>` + + 以域名或者 IP 地址表示的主机名,外加可选的 URL 协议名(URL scheme)以及端口号。 + 支持前置通配符(星号 '*'),可以将通配符应用于站点地址、端口中,如应用于端口,则表示允许使用该域名下的所有端口。 + + - **example.com:443** 匹配 example.com 上 443 端口访问 + - **https://example.com** 匹配使用了 http: 的 example.com 的访问 + - ***.example.com** 匹配 example.com 下的所有子域名的访问 + +- `<scheme-source>` + + 协议名如'http:' 或者 'https:'。必须带有冒号,不要有单引号。 + +- `'self'` + + 指向与要保护的文件所在的源,包括相同的 URL scheme 与端口号。必须有单引号。 + +- `'unsafe-inline'` + + 允许使用内联资源,例如内联 `<script>` 元素(javascript: URL)、内联事件处理器以及内联 `<style>` 元素。必须有单引号。 + +- `'unsafe-eval'` + + 允许使用 eval() 以及相似的函数来从字符串创建代码。必须有单引号。 + +- `'none'` + + 不允许任何内容。 必须有单引号。 + +- `'nonce-<base64 值>'` + + 特定使用一次性加密内联脚本的白名单。服务器必须在每一次传输政策时生成唯一的一次性值。否则将存在绕过资源政策的可能。 + +- `<hash-source>` + + 使用 sha256、sha384 或 sha512 编码过的内联脚本或样式。其由用短划线分隔的两部分组成:用于创建哈希的加密算法,以及脚本或样式 base64 编码的哈希值。当生成哈希值的时候,不要包含 `<script>` 或 `<style>` 标签,同时注意字母大小写与空格——包括首尾空格——都是会影响生成的结果的。 + + ``` + Content-Security-Policy: default-src sha256-abcdef; + ``` +- `'strict-dynamic'` + + strict-dynamic 指定对于含有标记脚本 (通过附加一个随机数或散列) 的信任,应该传播到由该脚本加载的所有脚本。与此同时,任何白名单以及源表达式例如 'self' 或者 'unsafe-inline' 都会被忽略。 + +## 启用CSP + +启用CSP,可以在 HTTP服务器中,新增 Header 字段: +如,在nginx中: +``` nginx +http { + # ...more + server { + # ...more + location / { + index index.html; + Content-Security-Policy default-src 'self'; + # ...more + } + } +} +``` + +也可以在 html 文件中 添加 `<meta>` 标签 +``` html +<meta http-equiv="Content-Security-Policy" content="default-src 'self';" /> +``` + +## 示例 + +### 示例1 + +默认只允许加载本站资源 + +``` +Content-Security-Policy: default-src 'self'; +``` + +### 示例2 + +默认只允许加载本站资源,但允许任意来源图片资源 + +``` +Content-Security-Policy: default-src 'self'; img-src *; +``` + +### 示例3 + +默认只允许加载本站资源,允许 script资源、css资源、图片资源从指定cdn域名加载 +``` +Content-Security-Policy: default-src 'self'; script-src 'self' https://cdn.example.com; style-src 'self' https://cdn.example.com; img-src 'self' https://cdn.example.com; +``` + +### 示例4 + +阻止所有 iframe 窗口,允许本站加载其他资源 + +``` +Content-Security-Policy: default-src 'self'; frame-src 'none'; +``` + +### 示例5 + +执行特定 nonce 的内联脚本: + +``` +Content-Security-Policy: script-src 'nonce-abcdef' 'self'; +``` + +只有在`<script>`标签内带有特定 `nonce` 值的脚本才允许执行: + +``` html +<script nonce="abcdef" src="example.js"></script> +``` + +### 示例6 + +Hash 值相符的脚本才能执行: + +``` +Content-Security-Policy: script-src 'sha256-qznLcsROx4GACP2dm0UCKCzCG+HiZ1guq6ZZDob/Tng=' +``` +该hash值必须是 script 标签内容的 sha256 值,代码才能执行: +``` html +<script> + alert("Hello, world."); +</script> +``` + +## 违例报告 + +启用 CSP 后,默认情况下,违例报告不会发送。我们可以通过配置 `report-uri` 策略指令,并提供至少一个URI地址去递交报告。 + +``` +Content-Security-Policy: default-src 'self'; report-uri http://report.example.com/csp; +``` + +### 违例报告示例 + +违例报告将以 JSON 对象的数据结构进行递交: + +``` json +{ + "csp-report": { + "document-uri": "http://example.com/index.html", // 发生违规的文档的 URI + "referrer": "", // 违规发生处的文档引用(地址) + "blocked-uri": "http://example.com/css/style.css", // 被 CSP 阻止的资源 URI。 + "violated-directive": "style-src cdn.example.com", // 违反的策略名称。 + // 在 Content-Security-Policy HTTP 头部中指明的原始策略。 + "original-policy": "default-src 'none'; style-src cdn.example.com; report-uri /_/csp-reports" + } +} +``` + +当服务器接收到 违例报告,可以通过分析报告内容,来进行自定义的处理。 diff --git a/docs/1.前端/8.HTTP/HSTS.md b/docs/1.前端/8.HTTP/HSTS.md new file mode 100644 index 00000000..fe8ad940 --- /dev/null +++ b/docs/1.前端/8.HTTP/HSTS.md @@ -0,0 +1,90 @@ +--- +title: 为你的站点开启HSTS +createTime: 2020/11/12 07:08:12 +author: pengzhanbo +tags: + - http + - 安全 +permalink: /article/1w4onzn1/ +--- + +`HTTP-Strict-Transport-Security` 简称为 `HSTS`,是一个 HTTP 响应头。 +用于通知浏览器应该只通过 HTTPS 访问该站点,并且以后使用 HTTP 访问该站点的所有尝试都应自动转换为 HTTPS。 + +<!-- more --> + +## 中间人劫持 + +当用户在未知风险的网络环境中访问 某个网站的时候,如访问 `http://example.com`,在这个未知风险的网络环境中, +可能会被其他人拦截到用户发出的网络请求,然后跳转到一个一模一样的钓鱼网站,或者在请求内容中,注入有危害的代码、广告等, +这种攻击行为,被称为 **中间人劫持**。 + +当 `example.com` 也支持 `https` 协议进行访问后,如果用户直接通过 `https` 协议访问,那么在一定程度上可以有效防止 +`中间人劫持`。 + +如果用户依然通过 `http` 协议访问,虽然服务器可以重定向到 `https` 请求,然而在这个过程中,中间人依然可以 +通过拦截 `http` 请求,然后向服务器发起 `https` 请求获取内容,再注入新的内容 返回给用户。 + +用户在浏览器地址栏中 输入 `example.com`, 浏览器默认发起的是 `http` 请求,这导致了我们很难要求用户在通过域名访问 +网站时,一定要输入 `https://example.com`。 + +为了限制 `中间人劫持` 这种潜在的攻击手段,一种处理方式就是 强制浏览器使用 `https` 协议访问网站。 +为此,我们需要给网站开启 `HSTS`。 + +## HSTS + +`HSTS` 通过声明 `HTTP` 头部字段 `HTTP-Strict-Transport-Security` 来启用和配置策略: + +``` +Strict-Transport-Security: max-age=<expire-time> +Strict-Transport-Security: max-age=<expire-time>; includeSubDomains +Strict-Transport-Security: max-age=<expire-time>; preload +``` + +### 指令 + +#### `max-age=<expire-time>` + +设置在浏览器收到这个请求后的`<expire-time>`秒的时间内凡是访问这个域名下的请求都使用 HTTPS 请求。 + +#### `includeSubDomains` <Badge>可选</Badge> + +如果这个可选的参数被指定,那么说明此规则也适用于该网站的所有子域名。 + +#### `preload` <Badge>可选</Badge> + +查看 [预加载 HSTS](https://www.chromium.org/hsts/) 获得详情。不是标准的一部分。 + +### 浏览器处理 + +> 当网站已开启 `HSTS` + +用户在第一次通过 `https` 协议访问网站时,服务器响应`Strict-Transport-Security` 头,浏览器记录下信息, +在以后重新访问访问网站时,会把访问这个网站的 `http` 请求自动替换为 `https`。 + +当 `HSTS` 头设置的过期时间到了,后面通过 `HTTP` 的访问恢复到正常模式,不会再自动跳转到 `HTTPS。` + +每次浏览器接收到 `Strict-Transport-Security` 头,它都会更新这个网站的过期时间,所以网站可以刷新这些信息,防止过期发生。 + +Chrome、Firefox 等浏览器里,当尝试访问该域名下的内容时,会产生一个 307 Internal Redirect(内部跳转),自动跳转到 HTTPS 请求。 + + +## 预加载 + +如果用户首次访问网站时,依然使用的是 `http` 协议,浏览器会忽略`Strict-Transport-Security`,而且中间人依然可以劫持请求内容,删除 `Strict-Transport-Security`。 + +为了进一步处理这个问题, `Google`、`Firefox` 等浏览器厂商,维护了一个 `HSTS` 预加载服务。 + +你可以将你已开启了 `HSTS` 的 站点域名,提交到 预加载服务中,浏览器将会永不使用非安全的方式连接到你的域名。 + +但是,这不是 HSTS 标准的一部分,也不该被当作正式的内容。 + +[`HSTS`预加载服务](https://hstspreload.org/) + + +## 示例 + +当前域名,以及所有子域名,开启 `HSTS`, 过期时间为 一年。 +``` +Strict-Transport-Security: max-age=31536000; includeSubDomains +``` diff --git a/docs/1.前端/8.HTTP/浏览器HTTP缓存机制.md b/docs/1.前端/8.HTTP/浏览器HTTP缓存机制.md new file mode 100644 index 00000000..223272f3 --- /dev/null +++ b/docs/1.前端/8.HTTP/浏览器HTTP缓存机制.md @@ -0,0 +1,331 @@ +--- +title: HTTP缓存机制 +createTime: 2019/08/24 12:18:39 +author: pengzhanbo +permalink: /article/c3ez957l/ +--- + +::: note +老生常谈!老生常谈!老生常谈啊! +::: + +## 什么是HTTP缓存 + +当客户端向服务器发起资源请求时,会先抵达浏览器缓存,如果浏览器有要请求的资源的副本, +那么就可以直接从浏览器缓存中提取而不是从原始服务器中获取这个资源。 + +http缓存都是从对同一资源的第二次请求开始的。 +- 第一次请求时,服务器返回资源,并在`response header`中回传资源的缓存参数; +- 第二次请求时,浏览器会根据这些缓存参数,判断是否使用浏览器缓存的资源副本还是从服务器获取资源。 + +## HTTP缓存分类 + +HTTP缓存,根据是否需要重新向服务器发起请求,可分为两大类: +- 强缓存: 强制缓存,在缓存有效时间内,不再向服务器发起资源请求,直接使用浏览器缓存的资源副本 +- 协商缓存:在缓存有效时间内,需要向服务器询问资源是否需要更新,如果需要更新,则从服务器获取新的资源, + 如果不需要更新,则继续使用浏览器缓存的资源副本; + +::: tip 另一种缓存分类 +根据资源是否可以被单个用户或多个用户使用来分类,还可以分为 私有缓存和共享缓存。 + +这种一般是对于 代理服务器的,即 浏览器发起请求 -> 代理服务器 -> 原始服务器。 + +- 私有缓存: 在代理服务器中,仅针对单个用户使用的资源缓存,其他用户发起的对同一个资源的首次请求,仍然需要从原始服务器获取资源 + 并为该用户建立新的缓存资源。 + +- 共享缓存:只要有一个用户发起的对同一个资源的首次到达代理服务器的请求,代理服务器对该资源缓存后,其他用户请求代理服务器上的资源, + 在缓存有效时间内,代理服务器不再向原始服务器获取新的资源,返回代理服务为缓存的资源副本。 +::: + + +## 主要的HTTP Headers + +- 通用首部字段 + + | 字段 | 说明 | + | -- | -- | + | Cache-Control | 控制缓存行为 | + | Pragma | http1.0时代的产物,值为 no-cache 时禁用缓存 | + +- 请求头部字段 Request Headers + + | 字段 | 说明 | + | -- | -- | + | If-Match | 比较 ETag 是否一致 | + | If-None-Match | 比较 ETag 是否不一致 | + | If-Modified-Since | 比较资源最后更新时间是否一致 | + | If-Unmodified-Since | 比较资源最后更新时间是否不一致 | + +- 响应头部字段 Response Headers + + | 字段 | 说明 | + | -- | -- | + | ETag | 资源匹配信息 | + +- 实体头部字段 + + | 字段 | 说明 | + | -- | -- | + | Expires | http1.0时代的产物,实体主体过期时间 | + | Last-Modified | 资源的最后一次更新时间 | + + + +::: warning 提醒 +`Pragma`、`Expires` 这两个header是 http1.0中的内容,在 http1.1及往后的版本中逐步被弃用。 + +但为了能够对浏览器向下兼容,大多数网站在设置 缓存机制时,仍然在 response headers 中保留这两个字段的声明。 + +本文同样也会对这两个字段进行说明,以及为什么http1.1后会使用 `Cache-Control` 代替。 +::: + +::: warning 提醒 +在某些技术文章分享中,常常会直接把这些headers字段各自分类到 强缓存 或 协商缓存中, +个人认为这种简单粗暴的划分方式是有待商榷,就比如`Cache-Control`的不同取值,其行为会根据值表现为强缓存或协商缓存。 +::: + +### Pragma + +`Pragma` 字段仅有一个 `no-cache`的可选值,会告知客户端不要对该资源进行缓存读取,应该每次都向服务器发送资源请求。 + +在客户端使用时,通常做法是在 HTML中加上一个 meta 标签: +``` html +<meta http-equiv="Pragma" content="no-cache"> +``` +::: danger 警告 +- 这个标签声明仅有 IE才能识别含义,其他主流浏览器不兼容。 +- 在IE浏览器中,虽然能够识别含义,但并不一定会在请求Request Header中加上Pragma,但确实会让当前页面每次都发起新请求。 + (仅限页面html文件,页面内使用的其他资源不受影响。) +::: + +在服务端配置为 Response Header 时,浏览器读取到该字段,会禁用缓存行为,后续的对同一资源的请求会重新发起请求而不使用缓存。 + +::: warning 提醒 +由于`Pragma` 在浏览器端的兼容问题,在服务器端又有其他字段能更好的控制缓存行为,Pragma 字段基本已经被抛弃,不再使用, + +*除了部分网站出于兼容性考虑,还会带上该字段。* +::: + + +### Expires + +在 http1.0中,Pragma 用于禁用缓存,也需要有一个字段用于启用缓存和定义缓存时间。Expires 就是用于这个目的。 + +Expires 的值是一个 GMT时间, 如:`Thu Jun 07 2018 14:26:45 GMT`,用于告诉浏览器资源的缓存过期时间,如果还没有超过该时间 +则不发起新的资源请求。 + +在客户端,可以使用 meta标签来告知浏览器缓存时间 +``` html +<meta http-equiv="expires" content="Thu Jun 07 2018 14:26:45 GMT"> +``` +如果希望不走缓存,每次页面请求都发起新的请求,可以把 content 设置为 -1 或 0。 + +::: danger 提醒 +跟 Pragma 字段一样, 该 meta 标签只有 IE 能够正确识别。 +而且该方式仅是告知 IE 缓存时间的标记,并不能在 Request Header 中找到该字段。 +::: + +服务端在 Response Headers 中设置 Expires 字段,则在任何浏览器中都能正确设置资源缓存时间; + +::: info 说明 +如果同时使用 Pragma 和 Expires 字段, 则 Pragma 优先级会更好,页面会发起新的请求 +::: + +::: warning 提醒 +Expires 字段虽然能够定义缓存有效时间,但是这个时间的设置是相对于本地时间的。 +如果在服务端定义,则这个时间是相对于服务端时间的, +这个时间返回到客户端, 客户端是拿着客户端的本地时间与返回的服务端时间做对比。 +那么就会导致一种情况,当用户更改了客户端的时间,如超过了 Expires定义的缓存时间,那么缓存就立即失效了。 + +也正是应该存在着这样的问题,Expires并不能保证缓存能够达到预期的表现,所以也被逐步弃用。 +::: + +### Cache-Control + +`Cache-Control` 是从 `http1.1` 开始支持的 header 属性,该属性的值描述了使用缓存的行为以及缓存的有效时间。 + +`Cache-Control` 可以在 发起请求时,在`Request Headers` 中声明该属性,(如果资源请求是通过代理服务器再到原始服务器,) +通知代理服务器对资源的缓存方式,以及是否向原始服务器请求最新的资源。 + +`Cache-Control` 做为 `Response Headers` 属性返回时,通知浏览器对该资源的缓存方式和有效时间。 + +Cache-Control 语法如下: +``` +Cache-Control: <cache-directive> +``` + +- 作为 `Request Headers` 时, `cache-directive` 支持以下可选值 + +| 字段名称 | 说明 | +| -- | -- | +| no-cache | 告知(代理)服务器不直接使用缓存,要求从原始服务器发起请求 | +| no-store | 所有内容都不会被保存到缓存或 Internet临时文件中 | +| max-age=delta-seconds | 告知服务器 客户端希望接收一个存在时间(age)不大于 delta-seconds 秒的资源| +| max-stale\[=delta-seconds] | 告知(代理)服务器 客户端愿意接收一个超过缓存时间的资源,若有定义delta-seconds,则为delta-seconds秒,若没有则为超过任意时间 | +| min-fresh=delta-seconds | 告知(代理)服务器 客户端希望接收一个在delta-seconds秒内被更新过的资源 | +| no-transform | 告知(代理)服务器 客户端希望获取一个实体数据没有被转换(如压缩)过的资源 | +| only-if-cached | 告知(代理)服务器 客户端希望获取缓存的资源(若有),而不用向原服务器发起请求 | + +- 作为 `Response Headers`时,`cache-directive` 支持以下可选值 + +| 字段名称 | 说明 | +| -- | -- | +| public | 表明任何情况下都需要缓存该资源 | +| private[="file-name"] | 表明返回报文中全部或部分(若指定了*file-name*的字段数据)仅开放给某些用户(服务器指定的*share-use*)做缓存使用,其他用户则不能缓存这些数据 | +| no-cache | 不直接使用缓存,要求向服务器发起(新鲜度校验)请求 | +| no-store | 所有内容都不会被保存到缓存或 Internet临时文件中 | +| max-age=delta-seconds | 告知客户端该资源在*delta-seconds*秒内是新鲜的,无需向服务器发起请求 | +| s-max-age=delta-seconds| 同 max-age,但仅应用于 共享缓存 | +| no-transform | 告知客户端缓存文件时不得对实体数据做任何改变 | +| must-revalidate | 当前资源一定是向原始服务器发去验证请求的,若请求失败会返回504(而非代理服务器上的缓存) | +| proxy-revalidate | 和 must-revalidate类似,但仅应用于 共享缓存 | + + +- 可以直接在 HTML页面的`<head>` 中通过 meta标签来给请求头加上 `Cache-Control` 字段: + + ``` html + <meta http-equiv="Cache-Control" content="no-cache"> + ``` + +- `Cache-Control` 允许自由组合可选值: + ``` + Cache-Control: max-age=3600, must-revalidate + ``` + 这段声明表示,该资源必须从原始服务器获取,且其缓存有效时间为一个小时,在后续的一个小时内,用户重新访问该资源都无需发送请求。 + +### 缓存校验 + +`Pragma`、`Expires`、`Cache-Control` 字段能够让客户端决定是否向服务器发送请求,缓存未过期的从本地缓存获取资源,缓存过期的从服务器端获取资源。 + +但是,客户端向服务器发送了请求,是否以为着一定要读取并返回该资源的实体内容? + +- 如果一个资源在客户端的缓存时间过期了,但服务器并没有更新过这个资源,那服务端是否一定要重新把资源的实体内容返回? + +- 如果这个资源过大,虽然缓存过期,但又没有更新过,返回实体内容是否会浪费带宽和时间? + +对于这些问题,其实只要采取某种策略,让服务器知道客户端现在保存的缓存文件跟服务端的资源文件是一致的, +然后通知客户端该资源可以继续使用缓存文件,不需要重新返回资源实体内容。 +那么就可以解决上述的问题,同时为HTTP请求带来优化和加速。 + +http1.1 新增了 `Last-Modified`、`ETag`、 `If-Match`、`If-None-Match`、`If-Modified-Since`、 +`If-Unmodified-Since` 这些字段,用于对缓存资源的校验,提高缓存的复用率。 + +### Last-Modified + +服务器将资源发送给客户端时,会将资源的最后更新时间以如下格式加载实体首部,一起返回给客户端。 + +客户端会为该资源标记上该信息,下次在请求时,会把该信息添加在请求报文中发送给服务端去做检查。 +如果客户端上报字段时间值和服务端的对应资源的最后修改时间一致,则说明改资源没有被修改过,直接返回 304状态码。 + +客户端在上报 Last-Modified 时,可以使用的 Request Headers 字段有两个: + +- `If-Modified-Since`: 该字段格式如下 + ``` + If-Modified-Since: <Last-Modified-Value> + ``` + 字段告诉服务端,如果客户端上报的最后修改时间和服务器上的最后修改时间一致,则直接返回304和响应报头即可。 + + 当前各浏览器默认使用该字段用来向服务端上报保存的 Last-Modified 值。 + +- `If-Unmodified-Since`: 该字段格式如下 + ``` + If-Unmodified-Since: <Last-Modified-Value> + ``` + 字段告诉服务端,如果客户端上报的最后修改时间和服务端上的最后修改时间不一致, + 则应当返回 412(Precondition Failed)状态码给客户端。 + +Last-Modified 由于是使用的资源最后修改时间来确定资源是否有被修改, +但是在实际情况中,往往存在着一个资源被修改了但实际内容没有发生改变, +而由于资源最后修改时间已经发生改变,依然会返回整个实体内容给客户端,而其实内容跟客户端缓存内容一致。 + +### ETag + +为了解决 `Last-Modified` 可能存在的不准确的问题,http1.1 还推出了 ETag 实体首部字段。 + +服务器会通过某种算法,给资源计算得出一个唯一标识符,在把资源响应给客户端的时候,会在实体首部加上该字段一起返回给客户端。 +``` +ETag: ETag-Value +``` + +客户端为资源标记上该信息,下次在请求时,会把该信息添加在请求报文中发送给服务端去做检查。 +服务端只需要比较客户端传来的ETag和对应的该资源的ETag是否一致,就可以判断资源相对于客户端资源是否被修改过。 +如果ETag是一致的,那么就直接返回304状态码,否则就返回新的资源实体内容给客户端。 + +客户端在上报 ETag 时,可以使用的 Request Headers 字段有两个: + +- `If-None-Match` 该字段格式如下 + ``` + If-None-Match: <ETag-Value> + ``` + 字段告诉服务端,如果ETag没有匹配上,需要重新返回新的资源实体内容,否则直接返回 304 状态码。 + + 当前各浏览器默认使用该字段用来向服务端上报保存的 ETag 值。 + +- `If-Match` 该字段格式如下 + ``` + If-Match: <ETag-Value> + ``` + 字段告诉服务端,如果ETag没匹配到,或者收到了`"*"`值而当前没有该资源实体, + 则应当返回412(Precondition Failed)状态码给客户端。否则服务器直接忽略该字段。 + +::: tip 提醒 +如果 `Last-Modified` 和 `ETag` 同时被使用,则要求它们的验证必须同时通过才返回 304, +若其中一个没有通过,则服务器会按照常规返回资源的实体以及200状态码。 +::: + +## 次要的 HTTP Headers + +以下的字段虽然跟缓存有关系,但没有那么重要。 + +### Vary + +`Vary` 表示 服务端会以什么基准字段来区分、筛选缓存版本。 + +首先考虑一个问题,服务端有一个请求地址,如果是IE用户则返回针对IE开发的内容,否则返回另一个主流浏览器版本的内容。 + +一般来说,服务端获取到请求的 `User-Agent` 字段做处理即可。 +但是如果用户请求的是代理服务器而非原始服务器,且代理服务器如果直接把缓存的IE版本资源发给了非IE的客户端,那就出问题了。 + +而 Vary 则是用于处理这类问题的头部字段,只需要在响应报文加上: +``` +Vary: User-Agent +``` +字段告知代理服务器需要以 User-Agent 这个请求头部字段来区别缓存版本,确定传递给客户端的版本。 + +Vary 字段也接受条件组合的形式 +``` +Vary: User-Agent, Accept-Encoding +``` +字段告知代理服务器需要以 User-Agent 和 Accept-Encoding 两个请求头部字段来区别缓存版本。 + +### Date、Age + +Date 字段表示原始服务器发送该资源的响应报文时间(GMT时间)。 +该字段的作用可以帮助我们判断该资源命中的是原始服务器还是代理服务器。 + +- 如果`Date`的时间与当前时间差别较大,或者连续F5刷新发现Date值没有变化,那么说明当前请求命中的是代理服务器的缓存。 +- 如果每次刷新页面,浏览器每次都会重新发起这条请求,那么其Date的值会不断变化,说明该资源是直接从原始服务器返回的。 + +Age 字段表示某个文件在代理服务器中存在的时间(秒),如果文件被修改或替换,Age会重新从0开始累计。 + + +## 浏览器表现 + +### 强缓存 + +对于强缓存的资源: + +- 当用户第一次访问该资源时,服务器返回 200状态码,以及资源实体内容。 + +- 如果用户访问完第一次后,在没有关闭浏览器的前提下,进行了第二次或更多次资源访问,那么浏览器不再请求服务器, + 而是从 浏览器的内存缓存区取出资源,并且 状态码 标记为 `200 (memory cache)` + +- 如果用户访问完第一次后,关闭浏览器后,重新打开浏览器,进行第二次或更多次资源访问,那么浏览器也不会请求服务器, +- 而是从 浏览器的磁盘缓存区取出资源,并且 状态码 标记为 `200(disk cache)` + +### 协商缓存 + +- 当用户第一次访问该资源时,服务器返回 200状态码,以及资源实体内容。 + +- 如果用户进行第二次访问时,进行缓存校验。 或在缓存时间内,或 资源未被修改,那么 直接返回 304状态码 +- 如果用户进行第二次访问时,服务器资源已被更新,则返回 状态码 200 ,以及新的资源实体内容。 diff --git a/docs/1.前端/9.框架/一些好玩的库或者框架汇总.md b/docs/1.前端/9.框架/一些好玩的库或者框架汇总.md new file mode 100644 index 00000000..6e5f3e3c --- /dev/null +++ b/docs/1.前端/9.框架/一些好玩的库或者框架汇总.md @@ -0,0 +1,165 @@ +--- +title: 一些好玩的库或者框架汇总 +createTime: 2022/05/27 09:16:16 +author: pengzhanbo +permalink: /article/ci39ae1o/ +--- + +这里收集了一些各种类型的好玩的库或者框架。 + +<!-- more --> + +---- + +## Client Framework + +### Lit + +[![](https://lit.dev/images/logo.svg){style="width:40px"}](https://lit.dev/) + +**lit** 是一个简单的、高效的、用于构建 web component 的轻量级库。 + +它替代了 [polymer](https://github.com/Polymer/polymer) 成为 WebComponent/customElement开发的首选库。 + +::: code-tabs +@tab my-element.ts +```ts +import { LitElement, html, css } from 'lit'; +import { customElement, property } from 'lit/decorators.js'; + +@customElement("my-element") +export class MyTimer extends LitElement { + static styles = css`...`; + + @property() count = 0; + + render() { + return html`<div>${this.count}</div>`; + } +} +``` +@tab index.html +```html +<!doctype html> +<head>...</head> +<body> + <my-timer count="7"></my-timer> +</body> +``` +::: + + +### solid-js + +[solid-js](https://www.solidjs.com/) + +一个用于构建用户界面,简单高效、性能卓越的JavaScript库。 + +Solid 站在 React, Knockout 等巨人的肩膀上。如果你之前用 React Hooks 开发过,Solid 应该看起来很自然。事实上,Solid 模型更简单,没有 Hook 规则。每个组件执行一次,随着依赖项的更新,钩子和绑定会多次执行。 + +Solid 遵循与 React 相同的理念,具有单向数据流、读/写隔离和不可变接口。但是放弃了使用虚拟 DOM,使用了完全不同的实现。 + +> 号称比 react 还 react 的库 + +```ts +import { render } from "solid-js/web"; +import { onCleanup, createSignal } from "solid-js"; + +const CountingComponent = () => { + const [count, setCount] = createSignal(0); + const interval = setInterval( + () => setCount(count => count + 1), + 1000 + ); + onCleanup(() => clearInterval(interval)); + return <div>Count value is {count()}</div>; +}; + +render(() => <CountingComponent />, document.getElementById("app")); +``` + +### inferno + +[inferno](https://www.infernojs.org/) 是一个快速的、类似于 React 的库,用于在客户端和服务器上构建高性能用户界面。 + +```tsx +import { render, Component } from 'inferno'; + +class MyComponent extends Component { + constructor(props) { + super(props); + this.state = { + counter: 0 + }; + } + render() { + return ( + <div> + <h1>Header!</h1> + <span>Counter is at: { this.state.counter }</span> + </div> + ); + } +} + +render( + <MyComponent />, + document.getElementById("app") +); +``` + +### cycle-js + +[cycle.js](https://cycle.js.org/) + +Cycle.js是一个极简的JavaScript框架,提供了一种函数式,响应式的人机交互接口。 + +Cycle.js 有别于其他如 React/Vue 等框架,它提供的是一套完整的开发范式,需要在其范式基础上进行开发,相对来说并不 +容易入门,但其函数式、响应式的思想,会带来非常好的启示和学习。 + +```js +import {run} from '@cycle/run' +import {div, label, input, hr, h1, makeDOMDriver} from '@cycle/dom' + +function main(sources) { + const input$ = sources.DOM.select('.field').events('input') + + const name$ = input$.map(ev => ev.target.value).startWith('') + + const vdom$ = name$.map(name => + div([ + label('Name:'), + input('.field', {attrs: {type: 'text'}}), + hr(), + h1('Hello ' + name), + ]) + ) + + return { DOM: vdom$ } +} + +run(main, { DOM: makeDOMDriver('#app-container') }) +``` + + +### svelte + +[svelte](https://svelte.dev/) + +Svelte 是一种全新的构建用户界面的方法。传统框架如 React 和 Vue 在浏览器中需要做大量的工作,而 Svelte 将这些工作放到构建应用程序的编译阶段来处理。 + +与使用虚拟(virtual)DOM 差异对比不同。Svelte 编写的代码在应用程序的状态更改时就能像做外科手术一样更新 DOM。 + +```html +<script> + let count = 0; + + function handleClick() { + count += 1; + } +</script> + +<button on:click={handleClick}> + Clicked {count} {count === 1 ? 'time' : 'times'} +</button> +``` diff --git a/docs/10.面试/面试2.md b/docs/10.面试/面试2.md index 9d88785a..06aabfef 100644 --- a/docs/10.面试/面试2.md +++ b/docs/10.面试/面试2.md @@ -1,6 +1,6 @@ --- title: 面试2 -createTime: 2022-04-03T17:48:00.400Z +createTime: 2022/04/03 17:48:00 author: pengzhanbo permalink: /article/exavsmm1 --- diff --git a/docs/10.面试/面试题-JS篇.md b/docs/10.面试/面试题-JS篇.md index 7f208078..571bc330 100644 --- a/docs/10.面试/面试题-JS篇.md +++ b/docs/10.面试/面试题-JS篇.md @@ -1,8 +1,8 @@ --- title: 面试题以及个人答案 JS篇 -tags: +tags: - 面试 -createTime: 2022-03-26T11:46:50.028Z +createTime: 2022/03/26 11:46:50 permalink: /article/4ml7z17g author: pengzhanbo top: false diff --git a/docs/10.面试/面试题—css篇.md b/docs/10.面试/面试题—css篇.md index fcbdc997..5a8bdc91 100644 --- a/docs/10.面试/面试题—css篇.md +++ b/docs/10.面试/面试题—css篇.md @@ -1,8 +1,8 @@ --- title: 面试题以及个人答案 CSS篇 -tags: +tags: - 面试 -createTime: 2022-03-26T11:46:50.028Z +createTime: 2022/03/26 11:46:50 permalink: /article/565o1wn0 author: pengzhanbo top: false diff --git a/docs/README.md b/docs/README.md index 45bbc3fd..fee6a896 100644 --- a/docs/README.md +++ b/docs/README.md @@ -3,6 +3,5 @@ home: true banner: /images/big-banner.jpg motto: 世间的美好总是不期而遇,恬静而自然。 author: pengzhanbo -createTime: '2022/03/26 07:46:50' +createTime: 2022/03/26 07:46:50 --- - diff --git a/docs/notes/README.md b/docs/notes/README.md index 111b5538..f8c8781d 100644 --- a/docs/notes/README.md +++ b/docs/notes/README.md @@ -1,7 +1,6 @@ --- title: README -createTime: '2022/04/04 11:13:30' +createTime: 2022/04/04 11:13:30 author: pengzhanbo permalink: /note/ --- - diff --git a/docs/notes/vuepress-plugin/caniuse/README.md b/docs/notes/vuepress-plugin/caniuse/README.md index fa7666ae..8efb2716 100644 --- a/docs/notes/vuepress-plugin/caniuse/README.md +++ b/docs/notes/vuepress-plugin/caniuse/README.md @@ -1,6 +1,6 @@ --- title: plugin-caniuse -createTime: '2022/05/13 01:02:51' +createTime: 2022/05/13 01:02:51 author: pengzhanbo permalink: /note/vuepress-plugin/caniuse/ --- diff --git a/docs/notes/vuepress-plugin/netlify-functions/API.md b/docs/notes/vuepress-plugin/netlify-functions/API.md index 86c3a54d..6943f8d1 100644 --- a/docs/notes/vuepress-plugin/netlify-functions/API.md +++ b/docs/notes/vuepress-plugin/netlify-functions/API.md @@ -1,6 +1,6 @@ --- title: API -createTime: 2022-05-14T10:43:53.200Z +createTime: 2022/05/14 10:43:53 author: pengzhanbo permalink: /note/vuepress-plugin/netlify-functions/api/ --- @@ -83,4 +83,3 @@ __类型:__ `{ directory: string }` 一般来说,它的值都设置为 `path.resolve(__dirname, 'functions')` - diff --git a/docs/notes/vuepress-plugin/netlify-functions/README.md b/docs/notes/vuepress-plugin/netlify-functions/README.md index 3f5052d0..ea7df1bb 100644 --- a/docs/notes/vuepress-plugin/netlify-functions/README.md +++ b/docs/notes/vuepress-plugin/netlify-functions/README.md @@ -1,6 +1,6 @@ --- title: 指南 -createTime: '2022/05/13 01:28:38' +createTime: 2022/05/13 01:28:38 author: pengzhanbo permalink: /note/vuepress-plugin/netlify-functions/ --- diff --git a/docs/notes/vuepress-plugin/netlify-functions/functions开发指南.md b/docs/notes/vuepress-plugin/netlify-functions/functions开发指南.md index 87d4a4fa..5b15a64e 100644 --- a/docs/notes/vuepress-plugin/netlify-functions/functions开发指南.md +++ b/docs/notes/vuepress-plugin/netlify-functions/functions开发指南.md @@ -1,6 +1,6 @@ --- title: functions开发指南 -createTime: 2022-05-14T10:43:53.201Z +createTime: 2022/05/14 10:43:53 author: pengzhanbo permalink: /note/vuepress-plugin/netlify-functions/develop-functions/ --- diff --git a/docs/notes/vuepress-plugin/netlify-functions/介绍.md b/docs/notes/vuepress-plugin/netlify-functions/介绍.md index 9de4ad9c..6f6ea714 100644 --- a/docs/notes/vuepress-plugin/netlify-functions/介绍.md +++ b/docs/notes/vuepress-plugin/netlify-functions/介绍.md @@ -1,6 +1,6 @@ --- title: 介绍 -createTime: 2022-05-14T10:43:53.202Z +createTime: 2022/05/14 10:43:53 author: pengzhanbo permalink: /note/vuepress-plugin/netlify-functions/intro/ --- diff --git a/docs/notes/vuepress-plugin/netlify-functions/使用.md b/docs/notes/vuepress-plugin/netlify-functions/使用.md index 158e05d0..274204c7 100644 --- a/docs/notes/vuepress-plugin/netlify-functions/使用.md +++ b/docs/notes/vuepress-plugin/netlify-functions/使用.md @@ -1,6 +1,6 @@ --- title: 使用 -createTime: 2022-05-14T10:43:53.203Z +createTime: 2022/05/14 10:43:53 author: pengzhanbo permalink: /note/vuepress-plugin/netlify-functions/usage/ --- diff --git a/docs/notes/vuepress-plugin/netlify-functions/功能.md b/docs/notes/vuepress-plugin/netlify-functions/功能.md index fbd035cc..5d248cfa 100644 --- a/docs/notes/vuepress-plugin/netlify-functions/功能.md +++ b/docs/notes/vuepress-plugin/netlify-functions/功能.md @@ -1,6 +1,6 @@ --- title: 功能 -createTime: 2022-05-14T10:43:53.204Z +createTime: 2022/05/14 10:43:53 author: pengzhanbo permalink: /note/vuepress-plugin/netlify-functions/feature/ --- diff --git a/docs/notes/vuepress-theme-plume/README.md b/docs/notes/vuepress-theme-plume/README.md index 0dfb6a9d..e1727a2c 100644 --- a/docs/notes/vuepress-theme-plume/README.md +++ b/docs/notes/vuepress-theme-plume/README.md @@ -1,6 +1,6 @@ --- title: vuepress-theme-plume -createTime: '2022/04/08 08:52:12' +createTime: 2022/04/08 08:52:12 author: pengzhanbo permalink: /note/vuepress-theme-plume/ article: true diff --git a/docs/notes/vuepress-theme-plume/markdown增强.md b/docs/notes/vuepress-theme-plume/markdown增强.md index e56591d7..3f4199e7 100644 --- a/docs/notes/vuepress-theme-plume/markdown增强.md +++ b/docs/notes/vuepress-theme-plume/markdown增强.md @@ -1,6 +1,6 @@ --- title: markdown增强 -createTime: 2022-05-14T10:43:53.216Z +createTime: 2022/05/14 10:43:53 author: pengzhanbo permalink: /note/vuepress-theme-plume/markdown-enhance/ --- diff --git a/docs/notes/vuepress-theme-plume/notes配置.md b/docs/notes/vuepress-theme-plume/notes配置.md index f0dd24ff..9185eb46 100644 --- a/docs/notes/vuepress-theme-plume/notes配置.md +++ b/docs/notes/vuepress-theme-plume/notes配置.md @@ -1,6 +1,6 @@ --- title: notes配置 -createTime: 2022-05-14T10:43:53.218Z +createTime: 2022/05/14 10:43:53 author: pengzhanbo permalink: /note/vuepress-theme-plume/notes-config/ --- diff --git a/docs/notes/vuepress-theme-plume/主题插件配置.md b/docs/notes/vuepress-theme-plume/主题插件配置.md index f5b92eca..f8789b44 100644 --- a/docs/notes/vuepress-theme-plume/主题插件配置.md +++ b/docs/notes/vuepress-theme-plume/主题插件配置.md @@ -1,6 +1,6 @@ --- title: 主题插件配置 -createTime: 2022-05-14T10:43:53.219Z +createTime: 2022/05/14 10:43:53 author: pengzhanbo permalink: /note/vuepress-theme-plume/plugins-config/ --- diff --git a/docs/notes/vuepress-theme-plume/主题配置.md b/docs/notes/vuepress-theme-plume/主题配置.md index 5f1f701a..0ba8d031 100644 --- a/docs/notes/vuepress-theme-plume/主题配置.md +++ b/docs/notes/vuepress-theme-plume/主题配置.md @@ -1,6 +1,6 @@ --- title: 主题配置 -createTime: 2022-05-14T10:43:53.219Z +createTime: 2022/05/14 10:43:53 author: pengzhanbo permalink: /note/vuepress-theme-plume/theme-config/ --- diff --git a/docs/notes/vuepress-theme-plume/基础功能.md b/docs/notes/vuepress-theme-plume/基础功能.md index 3dc9e537..c567f5ee 100644 --- a/docs/notes/vuepress-theme-plume/基础功能.md +++ b/docs/notes/vuepress-theme-plume/基础功能.md @@ -1,6 +1,6 @@ --- title: 基础功能 -createTime: 2022-05-14T10:43:53.220Z +createTime: 2022/05/14 10:43:53 author: pengzhanbo permalink: /note/vuepress-theme-plume/basis-power/ --- diff --git a/docs/notes/vuepress-theme-plume/快速开始.md b/docs/notes/vuepress-theme-plume/快速开始.md index f9d08c91..367ee0d2 100644 --- a/docs/notes/vuepress-theme-plume/快速开始.md +++ b/docs/notes/vuepress-theme-plume/快速开始.md @@ -1,6 +1,6 @@ --- title: 快速开始 -createTime: 2022-05-14T10:43:53.221Z +createTime: 2022/05/14 10:43:53 author: pengzhanbo permalink: /note/vuepress-theme-plume/quick-start/ --- diff --git a/docs/notes/vuepress-theme-plume/编写文章.md b/docs/notes/vuepress-theme-plume/编写文章.md index b4e11e0d..873b1a61 100644 --- a/docs/notes/vuepress-theme-plume/编写文章.md +++ b/docs/notes/vuepress-theme-plume/编写文章.md @@ -1,6 +1,6 @@ --- title: 编写文章 -createTime: 2022-05-14T10:43:53.221Z +createTime: 2022/05/14 10:43:53 author: pengzhanbo permalink: /note/vuepress-theme-plume/write-article/ --- diff --git a/docs/notes/vuepress-theme-plume/页面配置.md b/docs/notes/vuepress-theme-plume/页面配置.md index 0cd85e8c..4713a448 100644 --- a/docs/notes/vuepress-theme-plume/页面配置.md +++ b/docs/notes/vuepress-theme-plume/页面配置.md @@ -1,6 +1,6 @@ --- title: 页面配置 -createTime: 2022-05-14T10:43:53.222Z +createTime: 2022/05/14 10:43:53 author: pengzhanbo permalink: /note/vuepress-theme-plume/page-config/ --- diff --git a/packages/plugin-auto-frontmatter/src/node/readFiles.ts b/packages/plugin-auto-frontmatter/src/node/readFiles.ts index 69e730c2..fa9e227a 100644 --- a/packages/plugin-auto-frontmatter/src/node/readFiles.ts +++ b/packages/plugin-auto-frontmatter/src/node/readFiles.ts @@ -11,7 +11,7 @@ export const readMarkdownList = async ( ): Promise<MarkdownFileList> => { const files: string[] = await fg(['**/*.md'], { cwd: sourceDir, - ignore: ['node_modules/', '.vuepress/'], + ignore: ['node_modules', '.vuepress'], }) return files diff --git a/packages/theme/src/node/autoFrontmatter.ts b/packages/theme/src/node/autoFrontmatter.ts index dd8dc3d0..9fd601ae 100644 --- a/packages/theme/src/node/autoFrontmatter.ts +++ b/packages/theme/src/node/autoFrontmatter.ts @@ -12,14 +12,14 @@ export default function ( const pkg = require('./package.json') || {} return { - glob: [], + include: [], formatter: [ { - glob: '**/{readme,README,index}.md', + include: '**/{readme,README,index}.md', formatter: {}, }, { - glob: '*', + include: '*', formatter: { author(author: string) { if (author) return author diff --git a/packages/tsconfig.build.json b/packages/tsconfig.build.json index 11966cdf..6c7a7811 100644 --- a/packages/tsconfig.build.json +++ b/packages/tsconfig.build.json @@ -5,12 +5,14 @@ }, "files": [], "references": [ + { "path": "./plugin-auto-frontmatter/tsconfig.build.json" }, { "path": "./plugin-baidu-tongji/tsconfig.build.json" }, + { "path": "./plugin-blog-data/tsconfig.build.json" }, { "path": "./plugin-caniuse/tsconfig.build.json" }, { "path": "./plugin-copy-code/tsconfig.build.json" }, { "path": "./plugin-netlify-functions/tsconfig.build.json" }, { "path": "./plugin-page-collection/tsconfig.build.json" }, { "path": "./plugin-windicss/tsconfig.build.json" }, - { "path": "./plugin-blog-data/tsconfig.build.json" } + { "path": "./theme/tsconfig.build.json" } ] } From 12bcd2c0bcd3f38acdf2976447cca7620faa1831 Mon Sep 17 00:00:00 2001 From: pengzhanbo <volodymyr@foxmail.com> Date: Fri, 10 Feb 2023 04:31:00 +0800 Subject: [PATCH 12/29] style: off `explicit-function-return-type` --- .eslintrc.cjs | 1 + 1 file changed, 1 insertion(+) diff --git a/.eslintrc.cjs b/.eslintrc.cjs index e4b256c2..59254bc9 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -21,6 +21,7 @@ module.exports = { '@typescript-eslint/no-explicit-any': 'off', '@typescript-eslint/no-non-null-assertion': 'off', '@typescript-eslint/no-var-requires': 'off', + '@typescript-eslint/explicit-function-return-type': 'off', 'vue/component-tags-order': [ 'error', { From 8d45712f49e1244aff93f0b10a67d11bce2d1a16 Mon Sep 17 00:00:00 2001 From: pengzhanbo <volodymyr@foxmail.com> Date: Fri, 10 Feb 2023 04:32:10 +0800 Subject: [PATCH 13/29] refactor(plugin-auto-frontmatter): matter filter --- packages/plugin-auto-frontmatter/src/node/plugin.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/plugin-auto-frontmatter/src/node/plugin.ts b/packages/plugin-auto-frontmatter/src/node/plugin.ts index 3857b6b8..193a36ce 100644 --- a/packages/plugin-auto-frontmatter/src/node/plugin.ts +++ b/packages/plugin-auto-frontmatter/src/node/plugin.ts @@ -35,7 +35,7 @@ export const autoFrontmatterPlugin = ({ .map(({ include, formatter }) => { return { include, - filter: createFilter(include), + filter: createFilter(ensureArray(include)), formatter, } }) From a2296e9dc9145a84cb29a77ffe558bd7d65ce6fd Mon Sep 17 00:00:00 2001 From: pengzhanbo <volodymyr@foxmail.com> Date: Fri, 10 Feb 2023 04:33:09 +0800 Subject: [PATCH 14/29] feat: add plugin-notes-data --- packages/plugin-notes-data/LICENSE | 21 ++++++++ packages/plugin-notes-data/README.md | 18 +++++++ packages/plugin-notes-data/package.json | 48 ++++++++++++++++++- .../src/client/clientConfig.ts | 7 +++ .../plugin-notes-data/src/client/index.ts | 1 + packages/plugin-notes-data/src/node/index.ts | 6 +++ packages/plugin-notes-data/src/node/plugin.ts | 12 +++++ .../plugin-notes-data/src/shared/index.ts | 3 ++ .../plugin-notes-data/tsconfig.build.json | 8 ++++ 9 files changed, 123 insertions(+), 1 deletion(-) create mode 100644 packages/plugin-notes-data/LICENSE create mode 100644 packages/plugin-notes-data/README.md create mode 100644 packages/plugin-notes-data/src/client/clientConfig.ts create mode 100644 packages/plugin-notes-data/src/client/index.ts create mode 100644 packages/plugin-notes-data/src/node/index.ts create mode 100644 packages/plugin-notes-data/src/node/plugin.ts create mode 100644 packages/plugin-notes-data/src/shared/index.ts create mode 100644 packages/plugin-notes-data/tsconfig.build.json diff --git a/packages/plugin-notes-data/LICENSE b/packages/plugin-notes-data/LICENSE new file mode 100644 index 00000000..9f677c90 --- /dev/null +++ b/packages/plugin-notes-data/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (C) 2021 - PRESENT by pengzhanbo + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/packages/plugin-notes-data/README.md b/packages/plugin-notes-data/README.md new file mode 100644 index 00000000..f13efb9e --- /dev/null +++ b/packages/plugin-notes-data/README.md @@ -0,0 +1,18 @@ +# `@vuepress-plume/vuepress-plugin-notes-data` + +## Install +``` +yarn add @vuepress-plume/vuepress-plugin-notes-data +``` +## Usage +``` js +// .vuepress/config.js +const notesDataPlugin = require('@vuepress-plume/vuepress-plugin-notes-data') +module.exports = { + //... + plugins: [ + notesDataPlugin() + ] + // ... +} +``` diff --git a/packages/plugin-notes-data/package.json b/packages/plugin-notes-data/package.json index 0967ef42..9ecc79ba 100644 --- a/packages/plugin-notes-data/package.json +++ b/packages/plugin-notes-data/package.json @@ -1 +1,47 @@ -{} +{ + "name": "@vuepress-plume/vuepress-plugin-notes-data", + "version": "1.0.0-beta.45", + "description": "The Plugin for VuePres 2", + "homepage": "https://github.com/pengzhanbo/vuepress-theme-plume#readme", + "bugs": { + "url": "https://github.com/pengzhanbo/vuepress-theme-plume/issues" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/pengzhanbo/vuepress-theme-plume.git" + }, + "license": "MIT", + "author": "pengzhanbo <volodymyr@foxmail.com>", + "type": "module", + "exports": { + ".": "./lib/node/index.js", + "./client": "./lib/client/index.js", + "./package.json": "./package.json" + }, + "main": "lib/node/index.js", + "types": "./lib/node/index.d.ts", + "scripts": { + "build": "pnpm run clean && pnpm run copy && pnpm run ts", + "clean": "rimraf lib *.tsbuildinfo", + "copy": "cpx \"src/**/*.{d.ts,vue,css,scss,jpg,png}\" lib", + "copy:watch": "cpx \"src/**/*.{d.ts,vue,css,scss,jpg,png}\" lib -w", + "dev": "concurrently \"pnpm copy:watch\" \"pnpm ts:watch\"", + "ts": "tsc -b tsconfig.build.json", + "ts:watch": "tsc -b tsconfig.build.json --watch" + }, + "dependencies": { + "@vuepress/client": "2.0.0-beta.60", + "@vuepress/core": "2.0.0-beta.60", + "@vuepress/shared": "2.0.0-beta.60", + "@vuepress/utils": "2.0.0-beta.60" + }, + "publishConfig": { + "access": "public" + }, + "keyword": [ + "VuePress", + "vuepress plugin", + "notesData", + "vuepress-plugin-plugin-notes-data" + ] +} diff --git a/packages/plugin-notes-data/src/client/clientConfig.ts b/packages/plugin-notes-data/src/client/clientConfig.ts new file mode 100644 index 00000000..a726b269 --- /dev/null +++ b/packages/plugin-notes-data/src/client/clientConfig.ts @@ -0,0 +1,7 @@ +import { defineClientConfig } from '@vuepress/client' + +export default defineClientConfig({ + setup() { + // do something + }, +}) diff --git a/packages/plugin-notes-data/src/client/index.ts b/packages/plugin-notes-data/src/client/index.ts new file mode 100644 index 00000000..72593733 --- /dev/null +++ b/packages/plugin-notes-data/src/client/index.ts @@ -0,0 +1 @@ +export * from '../shared/index.js' diff --git a/packages/plugin-notes-data/src/node/index.ts b/packages/plugin-notes-data/src/node/index.ts new file mode 100644 index 00000000..69e663e0 --- /dev/null +++ b/packages/plugin-notes-data/src/node/index.ts @@ -0,0 +1,6 @@ +import { notesDataPlugin } from './plugin.js' + +export * from './plugin.js' +export * from '../shared/index.js' + +export default notesDataPlugin diff --git a/packages/plugin-notes-data/src/node/plugin.ts b/packages/plugin-notes-data/src/node/plugin.ts new file mode 100644 index 00000000..2665ebb8 --- /dev/null +++ b/packages/plugin-notes-data/src/node/plugin.ts @@ -0,0 +1,12 @@ +import type { App, Plugin } from '@vuepress/core' +import { path } from '@vuepress/utils' +import type { NotesDataOptions } from '../shared/index.js' + +export const notesDataPlugin = (options: NotesDataOptions): Plugin => { + return (app: App) => { + return { + name: '@vuepress-plume/vuepress-plugin-notes-data', + clientConfigFile: path.resolve(__dirname, '../client/clientConfig.js'), + } + } +} diff --git a/packages/plugin-notes-data/src/shared/index.ts b/packages/plugin-notes-data/src/shared/index.ts new file mode 100644 index 00000000..fc318a9b --- /dev/null +++ b/packages/plugin-notes-data/src/shared/index.ts @@ -0,0 +1,3 @@ +export interface NotesDataOptions { + a?: string +} diff --git a/packages/plugin-notes-data/tsconfig.build.json b/packages/plugin-notes-data/tsconfig.build.json new file mode 100644 index 00000000..6bf67375 --- /dev/null +++ b/packages/plugin-notes-data/tsconfig.build.json @@ -0,0 +1,8 @@ +{ + "extends": "../tsconfig.build.json", + "compilerOptions": { + "rootDir": "./src", + "outDir": "./lib" + }, + "include": ["./src"] +} From 7b88251c7b09a2a79c6e2ffe104cad61df6154bc Mon Sep 17 00:00:00 2001 From: pengzhanbo <volodymyr@foxmail.com> Date: Fri, 10 Feb 2023 04:33:40 +0800 Subject: [PATCH 15/29] build: update dependencies --- packages/theme/package.json | 5 ++--- pnpm-lock.yaml | 15 ++++++++++----- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/packages/theme/package.json b/packages/theme/package.json index b497263c..22235f40 100644 --- a/packages/theme/package.json +++ b/packages/theme/package.json @@ -26,8 +26,8 @@ "scripts": { "build": "pnpm run clean && pnpm run copy && pnpm run ts", "clean": "rimraf lib *.tsbuildinfo", - "copy": "cpx \"src/**/*.{d.ts,vue,css,scss,jpg,png}\" lib", - "copy:watch": "cpx \"src/**/*.{d.ts,vue,css,scss,jpg,png}\" lib -w", + "copy": "cpx \"src/**/*.{d.ts,vue,css,scss,jpg,png,woff2}\" lib", + "copy:watch": "cpx \"src/**/*.{d.ts,vue,css,scss,jpg,png,woff2}\" lib -w", "dev": "concurrently \"pnpm copy:watch\" \"pnpm ts:watch\"", "ts": "tsc -b tsconfig.build.json", "ts:watch": "tsc -b tsconfig.build.json --watch" @@ -39,7 +39,6 @@ "@vuepress-plume/vuepress-plugin-blog-data": "workspace:*", "@vuepress-plume/vuepress-plugin-caniuse": "workspace:*", "@vuepress-plume/vuepress-plugin-copy-code": "workspace:*", - "@vuepress-plume/vuepress-plugin-windicss": "workspace:*", "@vuepress/client": "2.0.0-beta.60", "@vuepress/core": "2.0.0-beta.60", "@vuepress/plugin-active-header-links": "2.0.0-beta.60", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index da4335b3..17881d15 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -100,7 +100,6 @@ importers: specifiers: '@vuepress/core': 2.0.0-beta.60 '@vuepress/shared': 2.0.0-beta.60 - '@vuepress/utils': 2.0.0-beta.60 chokidar: ^3.5.3 create-filter: ^1.0.0 fast-glob: ^3.2.12 @@ -109,7 +108,6 @@ importers: dependencies: '@vuepress/core': 2.0.0-beta.60 '@vuepress/shared': 2.0.0-beta.60 - '@vuepress/utils': 2.0.0-beta.60 chokidar: 3.5.3 create-filter: 1.0.0 fast-glob: 3.2.12 @@ -214,7 +212,16 @@ importers: '@types/node': 18.11.18 packages/plugin-notes-data: - specifiers: {} + specifiers: + '@vuepress/client': 2.0.0-beta.60 + '@vuepress/core': 2.0.0-beta.60 + '@vuepress/shared': 2.0.0-beta.60 + '@vuepress/utils': 2.0.0-beta.60 + dependencies: + '@vuepress/client': 2.0.0-beta.60 + '@vuepress/core': 2.0.0-beta.60 + '@vuepress/shared': 2.0.0-beta.60 + '@vuepress/utils': 2.0.0-beta.60 packages/plugin-page-collection: specifiers: @@ -264,7 +271,6 @@ importers: '@vuepress-plume/vuepress-plugin-blog-data': workspace:* '@vuepress-plume/vuepress-plugin-caniuse': workspace:* '@vuepress-plume/vuepress-plugin-copy-code': workspace:* - '@vuepress-plume/vuepress-plugin-windicss': workspace:* '@vuepress/client': 2.0.0-beta.60 '@vuepress/core': 2.0.0-beta.60 '@vuepress/plugin-active-header-links': 2.0.0-beta.60 @@ -299,7 +305,6 @@ importers: '@vuepress-plume/vuepress-plugin-blog-data': link:../plugin-blog-data '@vuepress-plume/vuepress-plugin-caniuse': link:../plugin-caniuse '@vuepress-plume/vuepress-plugin-copy-code': link:../plugin-copy-code - '@vuepress-plume/vuepress-plugin-windicss': link:../plugin-windicss '@vuepress/client': 2.0.0-beta.60 '@vuepress/core': 2.0.0-beta.60 '@vuepress/plugin-active-header-links': 2.0.0-beta.60 From e1e845a470315aa0f41078e645094d524111baed Mon Sep 17 00:00:00 2001 From: pengzhanbo <volodymyr@foxmail.com> Date: Fri, 10 Feb 2023 04:34:41 +0800 Subject: [PATCH 16/29] build: update create package template --- scripts/create/generator.js | 2 +- scripts/create/template/package.json.tpl | 12 +++++++++--- .../src/client/clientAppEnhance.ts.tpl | 5 ----- .../template/src/client/clientConfig.ts.tpl | 8 ++++++++ .../create/template/src/client/index.ts.tpl | 1 + scripts/create/template/src/node/index.ts.tpl | 6 +++--- scripts/create/template/src/node/plugin.ts.tpl | 7 ++----- .../create/template/tsconfig.build.json.tpl | 18 ++++++------------ scripts/create/template/tsconfig.cjs.json.tpl | 14 -------------- scripts/create/template/tsconfig.esm.json.tpl | 17 ----------------- 10 files changed, 30 insertions(+), 60 deletions(-) delete mode 100644 scripts/create/template/src/client/clientAppEnhance.ts.tpl create mode 100644 scripts/create/template/src/client/clientConfig.ts.tpl create mode 100644 scripts/create/template/src/client/index.ts.tpl delete mode 100644 scripts/create/template/tsconfig.cjs.json.tpl delete mode 100644 scripts/create/template/tsconfig.esm.json.tpl diff --git a/scripts/create/generator.js b/scripts/create/generator.js index 2f559d71..2c5e2325 100644 --- a/scripts/create/generator.js +++ b/scripts/create/generator.js @@ -39,8 +39,8 @@ const generatorFile = async (config) => { } const include = [ !client && 'client', - !client && 'tsconfig.esm.json', !shared && 'shared', + !shared && 'client/index.js' ] .filter(Boolean) .join('|') diff --git a/scripts/create/template/package.json.tpl b/scripts/create/template/package.json.tpl index 90bda795..d7beed33 100644 --- a/scripts/create/template/package.json.tpl +++ b/scripts/create/template/package.json.tpl @@ -18,10 +18,16 @@ }, "license": "MIT", "author": "pengzhanbo <volodymyr@foxmail.com>", + "type": "module", + "exports": { + ".": "./lib/node/index.js", + {{#if shared }} + "./client": "./lib/client/index.js", + {{/if}} + "./package.json": "./package.json" + }, "main": "lib/node/index.js", - "files": [ - "lib" - ], + "types": "./lib/node/index.d.ts", "scripts": { "build": "pnpm run clean && pnpm run copy && pnpm run ts", "clean": "rimraf lib *.tsbuildinfo", diff --git a/scripts/create/template/src/client/clientAppEnhance.ts.tpl b/scripts/create/template/src/client/clientAppEnhance.ts.tpl deleted file mode 100644 index 1f8efeb1..00000000 --- a/scripts/create/template/src/client/clientAppEnhance.ts.tpl +++ /dev/null @@ -1,5 +0,0 @@ -import { defineClientAppEnhance } from '@vuepress/client' - -export default defineClientAppEnhance(({ router }) => { - // do something -}) diff --git a/scripts/create/template/src/client/clientConfig.ts.tpl b/scripts/create/template/src/client/clientConfig.ts.tpl new file mode 100644 index 00000000..e5214719 --- /dev/null +++ b/scripts/create/template/src/client/clientConfig.ts.tpl @@ -0,0 +1,8 @@ +import { defineClientConfig } from '@vuepress/client' + + +export default defineClientConfig({ + setup() { + // do something + }, +}) diff --git a/scripts/create/template/src/client/index.ts.tpl b/scripts/create/template/src/client/index.ts.tpl new file mode 100644 index 00000000..72593733 --- /dev/null +++ b/scripts/create/template/src/client/index.ts.tpl @@ -0,0 +1 @@ +export * from '../shared/index.js' diff --git a/scripts/create/template/src/node/index.ts.tpl b/scripts/create/template/src/node/index.ts.tpl index 3cc41374..cecc69ed 100644 --- a/scripts/create/template/src/node/index.ts.tpl +++ b/scripts/create/template/src/node/index.ts.tpl @@ -1,8 +1,8 @@ -import { {{ lowerName }}Plugin } from './plugin' +import { {{ lowerName }}Plugin } from './plugin.js' -export * from './plugin' +export * from './plugin.js' {{#if shared }} -export * from '../shared' +export * from '../shared/index.js' {{/if}} export default {{ lowerName }}Plugin diff --git a/scripts/create/template/src/node/plugin.ts.tpl b/scripts/create/template/src/node/plugin.ts.tpl index 49cc2a53..7c533057 100644 --- a/scripts/create/template/src/node/plugin.ts.tpl +++ b/scripts/create/template/src/node/plugin.ts.tpl @@ -3,7 +3,7 @@ import type { App, Plugin } from '@vuepress/core' import { path } from '@vuepress/utils' {{/if}} {{#if shared}} -import type { {{ upperName }}Options } from '../shared' +import type { {{ upperName }}Options } from '../shared/index.js' {{else}} export interface {{ upperName }}Options { @@ -16,10 +16,7 @@ export const {{ lowerName }}Plugin = (options: {{ upperName }}Options): Plugin = return { name: '@vuepress-plume/vuepress-{{ pkgName }}', {{#if client}} - clientAppEnhanceFiles: path.resolve( - __dirname, - '../client/clientAppEnhance.js' - ), + clientConfigFile: path.resolve(__dirname, '../client/clientConfig.js'), {{/if}} } } diff --git a/scripts/create/template/tsconfig.build.json.tpl b/scripts/create/template/tsconfig.build.json.tpl index ed748a05..66824ada 100644 --- a/scripts/create/template/tsconfig.build.json.tpl +++ b/scripts/create/template/tsconfig.build.json.tpl @@ -1,14 +1,8 @@ { - "extends": "../../tsconfig.base.json", - "references": [ - {{#if client}} - { - "path": "./tsconfig.esm.json" - }, - {{/if}} - { - "path": "./tsconfig.cjs.json" - } - ], - "files": [] +"extends": "../tsconfig.build.json", +"compilerOptions": { +"rootDir": "./src", +"outDir": "./lib" +}, +"include": ["./src"] } diff --git a/scripts/create/template/tsconfig.cjs.json.tpl b/scripts/create/template/tsconfig.cjs.json.tpl deleted file mode 100644 index c0c6d891..00000000 --- a/scripts/create/template/tsconfig.cjs.json.tpl +++ /dev/null @@ -1,14 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "module": "CommonJS", - "rootDir": "./src", - "outDir": "./lib" - }, - "include": [ - {{#if shared}} - "./src/shared", - {{/if}} - "./src/node" - ] -} diff --git a/scripts/create/template/tsconfig.esm.json.tpl b/scripts/create/template/tsconfig.esm.json.tpl deleted file mode 100644 index eb18f932..00000000 --- a/scripts/create/template/tsconfig.esm.json.tpl +++ /dev/null @@ -1,17 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "module": "ES2020", - "rootDir": "./src", - "outDir": "./lib", - "types": [ - "@vuepress/client/types" - ] - }, - "include": [ - {{#if shared}} - "./src/shared", - {{/if}} - "./src/client" - ] -} From cb89ffdcf387c0300b77462c6af491b5faf7fb41 Mon Sep 17 00:00:00 2001 From: pengzhanbo <volodymyr@foxmail.com> Date: Fri, 10 Feb 2023 04:35:42 +0800 Subject: [PATCH 17/29] refactor(theme): remove windicss --- packages/theme/src/client/windi.config.ts | 73 ----------------------- packages/theme/src/node/plugins.ts | 5 -- 2 files changed, 78 deletions(-) delete mode 100644 packages/theme/src/client/windi.config.ts diff --git a/packages/theme/src/client/windi.config.ts b/packages/theme/src/client/windi.config.ts deleted file mode 100644 index 58a7b703..00000000 --- a/packages/theme/src/client/windi.config.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { getDirname, path } from '@vuepress/utils' -import { defineConfig } from 'windicss/helpers' -import typography from 'windicss/plugin/typography' - -const __dirname = getDirname(import.meta.url) - -export default defineConfig({ - darkMode: 'class', - // attributify: true, - plugins: [(typography as any)()], - theme: { - extend: { - textColor: '#2c3e50', - fontFamily: { - sans: [ - 'ui-sans-serif', - '-apple-system', - 'BlinkMackSystemFont', - '"Segoe UI"', - 'Roboto', - 'Oxygen', - 'Ubuntu', - 'Cantarell', - '"Fira Sans"', - '"Droid Sans"', - '"Helvetica Neue"', - 'sans-serif', - '"Apple Color Emoji"', - '"Segoe UI Emoji"', - '"Segoe UI Symbol"', - '"Noto Color Emoji"', - ], - mono: [ - 'Consolas', - 'Monaco', - 'ui-monospace', - 'SFMono-Regular', - 'Menlo', - '"Andale Mono"', - '"Ubuntu Mono"', - 'monospace', - ], - }, - typography: { - DEFAULT: { - css: { - color: '#2c3e50', - a: { - color: 'red', - }, - h1: { color: 'inherit' }, - h2: { color: 'inherit' }, - h3: { color: 'inherit' }, - h4: { color: 'inherit' }, - h5: { color: 'inherit' }, - h6: { color: 'inherit' }, - b: { color: 'inherit' }, - em: { color: 'inherit' }, - strong: { color: 'inherit' }, - blockquote: { color: 'inherit' }, - }, - }, - }, - }, - }, - extract: { - include: [ - path.resolve(__dirname, '{components,layouts}/**/*'), - path.resolve(process.cwd(), '**/.vuepress/{components,layouts}/*'), - path.resolve(process.cwd(), '**/*.md'), - ], - }, -}) diff --git a/packages/theme/src/node/plugins.ts b/packages/theme/src/node/plugins.ts index dcdcf661..4ce3adb9 100644 --- a/packages/theme/src/node/plugins.ts +++ b/packages/theme/src/node/plugins.ts @@ -3,7 +3,6 @@ import { baiduTongjiPlugin } from '@vuepress-plume/vuepress-plugin-baidu-tongji' import { blogDataPlugin } from '@vuepress-plume/vuepress-plugin-blog-data' import { caniusePlugin } from '@vuepress-plume/vuepress-plugin-caniuse' import { copyCodePlugin } from '@vuepress-plume/vuepress-plugin-copy-code' -import { windiCSSPlugin } from '@vuepress-plume/vuepress-plugin-windicss' import type { App, PluginConfig } from '@vuepress/core' import { activeHeaderLinksPlugin } from '@vuepress/plugin-active-header-links' import { docsearchPlugin } from '@vuepress/plugin-docsearch' @@ -15,7 +14,6 @@ import { palettePlugin } from '@vuepress/plugin-palette' import { prismjsPlugin } from '@vuepress/plugin-prismjs' import { searchPlugin } from '@vuepress/plugin-search' import { themeDataPlugin } from '@vuepress/plugin-theme-data' -import { getDirname, path } from '@vuepress/utils' import { commentPlugin } from 'vuepress-plugin-comment2' import { mdEnhancePlugin } from 'vuepress-plugin-md-enhance' import { seoPlugin } from 'vuepress-plugin-seo2' @@ -26,8 +24,6 @@ import type { } from '../shared/index.js' import autoFrontmatter from './autoFrontmatter.js' -const __dirname = getDirname(import.meta.url) - export const setupPlugins = ( app: App, options: PlumeThemePluginOptions, @@ -37,7 +33,6 @@ export const setupPlugins = ( return [ palettePlugin({ preset: 'sass' }), - windiCSSPlugin(path.resolve(__dirname, '../client/windi.config.js')), themeDataPlugin({ themeData: localeOptions }), autoFrontmatterPlugin(autoFrontmatter(app, localeOptions)), blogDataPlugin({ From 82051c239894299982a09f58022d356ecc488376 Mon Sep 17 00:00:00 2001 From: pengzhanbo <volodymyr@foxmail.com> Date: Fri, 10 Feb 2023 04:36:25 +0800 Subject: [PATCH 18/29] feat(theme): add icon components --- .../components/icons/IconAlignJustify.vue | 21 +++++++++++ .../client/components/icons/IconAlignLeft.vue | 21 +++++++++++ .../components/icons/IconAlignRight.vue | 21 +++++++++++ .../client/components/icons/IconArrowLeft.vue | 7 ++++ .../components/icons/IconArrowRight.vue | 7 ++++ .../components/icons/IconChevronDown.vue | 12 +++++++ .../components/icons/IconChevronLeft.vue | 12 +++++++ .../components/icons/IconChevronRight.vue | 12 +++++++ .../client/components/icons/IconChevronUp.vue | 12 +++++++ .../src/client/components/icons/IconEdit.vue | 10 ++++++ .../components/icons/IconExternalLink.vue | 13 +++++++ .../src/client/components/icons/IconHeart.vue | 7 ++++ .../client/components/icons/IconLanguages.vue | 14 ++++++++ .../src/client/components/icons/IconMinus.vue | 5 +++ .../components/icons/IconMinusSquare.vue | 14 ++++++++ .../src/client/components/icons/IconMoon.vue | 12 +++++++ .../components/icons/IconMoreHorizontal.vue | 12 +++++++ .../src/client/components/icons/IconPlus.vue | 12 +++++++ .../components/icons/IconPlusSquare.vue | 10 ++++++ .../src/client/components/icons/IconSun.vue | 36 +++++++++++++++++++ 20 files changed, 270 insertions(+) create mode 100644 packages/theme/src/client/components/icons/IconAlignJustify.vue create mode 100644 packages/theme/src/client/components/icons/IconAlignLeft.vue create mode 100644 packages/theme/src/client/components/icons/IconAlignRight.vue create mode 100644 packages/theme/src/client/components/icons/IconArrowLeft.vue create mode 100644 packages/theme/src/client/components/icons/IconArrowRight.vue create mode 100644 packages/theme/src/client/components/icons/IconChevronDown.vue create mode 100644 packages/theme/src/client/components/icons/IconChevronLeft.vue create mode 100644 packages/theme/src/client/components/icons/IconChevronRight.vue create mode 100644 packages/theme/src/client/components/icons/IconChevronUp.vue create mode 100644 packages/theme/src/client/components/icons/IconEdit.vue create mode 100644 packages/theme/src/client/components/icons/IconExternalLink.vue create mode 100644 packages/theme/src/client/components/icons/IconHeart.vue create mode 100644 packages/theme/src/client/components/icons/IconLanguages.vue create mode 100644 packages/theme/src/client/components/icons/IconMinus.vue create mode 100644 packages/theme/src/client/components/icons/IconMinusSquare.vue create mode 100644 packages/theme/src/client/components/icons/IconMoon.vue create mode 100644 packages/theme/src/client/components/icons/IconMoreHorizontal.vue create mode 100644 packages/theme/src/client/components/icons/IconPlus.vue create mode 100644 packages/theme/src/client/components/icons/IconPlusSquare.vue create mode 100644 packages/theme/src/client/components/icons/IconSun.vue diff --git a/packages/theme/src/client/components/icons/IconAlignJustify.vue b/packages/theme/src/client/components/icons/IconAlignJustify.vue new file mode 100644 index 00000000..b213f61b --- /dev/null +++ b/packages/theme/src/client/components/icons/IconAlignJustify.vue @@ -0,0 +1,21 @@ +<template> + <svg + xmlns="http://www.w3.org/2000/svg" + aria-hidden="true" + focusable="false" + viewBox="0 0 24 24" + > + <path + d="M21,11H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,11,21,11z" + /> + <path + d="M21,7H3C2.4,7,2,6.6,2,6s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,7,21,7z" + /> + <path + d="M21,15H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,15,21,15z" + /> + <path + d="M21,19H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,19,21,19z" + /> + </svg> +</template> diff --git a/packages/theme/src/client/components/icons/IconAlignLeft.vue b/packages/theme/src/client/components/icons/IconAlignLeft.vue new file mode 100644 index 00000000..bd3510d9 --- /dev/null +++ b/packages/theme/src/client/components/icons/IconAlignLeft.vue @@ -0,0 +1,21 @@ +<template> + <svg + xmlns="http://www.w3.org/2000/svg" + aria-hidden="true" + focusable="false" + viewBox="0 0 24 24" + > + <path + d="M17,11H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,11,17,11z" + /> + <path + d="M21,7H3C2.4,7,2,6.6,2,6s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,7,21,7z" + /> + <path + d="M21,15H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,15,21,15z" + /> + <path + d="M17,19H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,19,17,19z" + /> + </svg> +</template> diff --git a/packages/theme/src/client/components/icons/IconAlignRight.vue b/packages/theme/src/client/components/icons/IconAlignRight.vue new file mode 100644 index 00000000..4434f6c0 --- /dev/null +++ b/packages/theme/src/client/components/icons/IconAlignRight.vue @@ -0,0 +1,21 @@ +<template> + <svg + xmlns="http://www.w3.org/2000/svg" + aria-hidden="true" + focusable="false" + viewBox="0 0 24 24" + > + <path + d="M21,11H7c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S21.6,11,21,11z" + /> + <path + d="M21,7H3C2.4,7,2,6.6,2,6s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,7,21,7z" + /> + <path + d="M21,15H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,15,21,15z" + /> + <path + d="M21,19H7c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S21.6,19,21,19z" + /> + </svg> +</template> diff --git a/packages/theme/src/client/components/icons/IconArrowLeft.vue b/packages/theme/src/client/components/icons/IconArrowLeft.vue new file mode 100644 index 00000000..3f65b866 --- /dev/null +++ b/packages/theme/src/client/components/icons/IconArrowLeft.vue @@ -0,0 +1,7 @@ +<template> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> + <path + d="M19,11H7.4l5.3-5.3c0.4-0.4,0.4-1,0-1.4s-1-0.4-1.4,0l-7,7c-0.1,0.1-0.2,0.2-0.2,0.3c-0.1,0.2-0.1,0.5,0,0.8c0.1,0.1,0.1,0.2,0.2,0.3l7,7c0.2,0.2,0.5,0.3,0.7,0.3s0.5-0.1,0.7-0.3c0.4-0.4,0.4-1,0-1.4L7.4,13H19c0.6,0,1-0.4,1-1S19.6,11,19,11z" + /> + </svg> +</template> diff --git a/packages/theme/src/client/components/icons/IconArrowRight.vue b/packages/theme/src/client/components/icons/IconArrowRight.vue new file mode 100644 index 00000000..ed89263f --- /dev/null +++ b/packages/theme/src/client/components/icons/IconArrowRight.vue @@ -0,0 +1,7 @@ +<template> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> + <path + d="M19.9,12.4c0.1-0.2,0.1-0.5,0-0.8c-0.1-0.1-0.1-0.2-0.2-0.3l-7-7c-0.4-0.4-1-0.4-1.4,0s-0.4,1,0,1.4l5.3,5.3H5c-0.6,0-1,0.4-1,1s0.4,1,1,1h11.6l-5.3,5.3c-0.4,0.4-0.4,1,0,1.4c0.2,0.2,0.5,0.3,0.7,0.3s0.5-0.1,0.7-0.3l7-7C19.8,12.6,19.9,12.5,19.9,12.4z" + /> + </svg> +</template> diff --git a/packages/theme/src/client/components/icons/IconChevronDown.vue b/packages/theme/src/client/components/icons/IconChevronDown.vue new file mode 100644 index 00000000..7d5904f0 --- /dev/null +++ b/packages/theme/src/client/components/icons/IconChevronDown.vue @@ -0,0 +1,12 @@ +<template> + <svg + xmlns="http://www.w3.org/2000/svg" + aria-hidden="true" + focusable="false" + viewBox="0 0 24 24" + > + <path + d="M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z" + /> + </svg> +</template> diff --git a/packages/theme/src/client/components/icons/IconChevronLeft.vue b/packages/theme/src/client/components/icons/IconChevronLeft.vue new file mode 100644 index 00000000..16234040 --- /dev/null +++ b/packages/theme/src/client/components/icons/IconChevronLeft.vue @@ -0,0 +1,12 @@ +<template> + <svg + xmlns="http://www.w3.org/2000/svg" + aria-hidden="true" + focusable="false" + viewBox="0 0 24 24" + > + <path + d="M15,19c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4l6-6c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4L10.4,12l5.3,5.3c0.4,0.4,0.4,1,0,1.4C15.5,18.9,15.3,19,15,19z" + /> + </svg> +</template> diff --git a/packages/theme/src/client/components/icons/IconChevronRight.vue b/packages/theme/src/client/components/icons/IconChevronRight.vue new file mode 100644 index 00000000..72f7cfdc --- /dev/null +++ b/packages/theme/src/client/components/icons/IconChevronRight.vue @@ -0,0 +1,12 @@ +<template> + <svg + xmlns="http://www.w3.org/2000/svg" + aria-hidden="true" + focusable="false" + viewBox="0 0 24 24" + > + <path + d="M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z" + /> + </svg> +</template> diff --git a/packages/theme/src/client/components/icons/IconChevronUp.vue b/packages/theme/src/client/components/icons/IconChevronUp.vue new file mode 100644 index 00000000..25cca7c0 --- /dev/null +++ b/packages/theme/src/client/components/icons/IconChevronUp.vue @@ -0,0 +1,12 @@ +<template> + <svg + xmlns="http://www.w3.org/2000/svg" + aria-hidden="true" + focusable="false" + viewBox="0 0 24 24" + > + <path + d="M18,16c-0.3,0-0.5-0.1-0.7-0.3L12,10.4l-5.3,5.3c-0.4,0.4-1,0.4-1.4,0s-0.4-1,0-1.4l6-6c0.4-0.4,1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4C18.5,15.9,18.3,16,18,16z" + /> + </svg> +</template> diff --git a/packages/theme/src/client/components/icons/IconEdit.vue b/packages/theme/src/client/components/icons/IconEdit.vue new file mode 100644 index 00000000..ae60f486 --- /dev/null +++ b/packages/theme/src/client/components/icons/IconEdit.vue @@ -0,0 +1,10 @@ +<template> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> + <path + d="M18,23H4c-1.7,0-3-1.3-3-3V6c0-1.7,1.3-3,3-3h7c0.6,0,1,0.4,1,1s-0.4,1-1,1H4C3.4,5,3,5.4,3,6v14c0,0.6,0.4,1,1,1h14c0.6,0,1-0.4,1-1v-7c0-0.6,0.4-1,1-1s1,0.4,1,1v7C21,21.7,19.7,23,18,23z" + /> + <path + d="M8,17c-0.3,0-0.5-0.1-0.7-0.3C7,16.5,6.9,16.1,7,15.8l1-4c0-0.2,0.1-0.3,0.3-0.5l9.5-9.5c1.2-1.2,3.2-1.2,4.4,0c1.2,1.2,1.2,3.2,0,4.4l-9.5,9.5c-0.1,0.1-0.3,0.2-0.5,0.3l-4,1C8.2,17,8.1,17,8,17zM9.9,12.5l-0.5,2.1l2.1-0.5l9.3-9.3c0.4-0.4,0.4-1.1,0-1.6c-0.4-0.4-1.2-0.4-1.6,0l0,0L9.9,12.5z M18.5,2.5L18.5,2.5L18.5,2.5z" + /> + </svg> +</template> diff --git a/packages/theme/src/client/components/icons/IconExternalLink.vue b/packages/theme/src/client/components/icons/IconExternalLink.vue new file mode 100644 index 00000000..72459909 --- /dev/null +++ b/packages/theme/src/client/components/icons/IconExternalLink.vue @@ -0,0 +1,13 @@ +<template> + <svg + xmlns="http://www.w3.org/2000/svg" + aria-hidden="true" + focusable="false" + height="24px" + viewBox="0 0 24 24" + width="24px" + > + <path d="M0 0h24v24H0V0z" fill="none" /> + <path d="M9 5v2h6.59L4 18.59 5.41 20 17 8.41V15h2V5H9z" /> + </svg> +</template> diff --git a/packages/theme/src/client/components/icons/IconHeart.vue b/packages/theme/src/client/components/icons/IconHeart.vue new file mode 100644 index 00000000..61ec6ff6 --- /dev/null +++ b/packages/theme/src/client/components/icons/IconHeart.vue @@ -0,0 +1,7 @@ +<template> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> + <path + d="M12,22.2c-0.3,0-0.5-0.1-0.7-0.3l-8.8-8.8c-2.5-2.5-2.5-6.7,0-9.2c2.5-2.5,6.7-2.5,9.2,0L12,4.3l0.4-0.4c0,0,0,0,0,0C13.6,2.7,15.2,2,16.9,2c0,0,0,0,0,0c1.7,0,3.4,0.7,4.6,1.9l0,0c1.2,1.2,1.9,2.9,1.9,4.6c0,1.7-0.7,3.4-1.9,4.6l-8.8,8.8C12.5,22.1,12.3,22.2,12,22.2zM7,4C5.9,4,4.7,4.4,3.9,5.3c-1.8,1.8-1.8,4.6,0,6.4l8.1,8.1l8.1-8.1c0.9-0.9,1.3-2,1.3-3.2c0-1.2-0.5-2.3-1.3-3.2l0,0C19.3,4.5,18.2,4,17,4c0,0,0,0,0,0c-1.2,0-2.3,0.5-3.2,1.3c0,0,0,0,0,0l-1.1,1.1c-0.4,0.4-1,0.4-1.4,0l-1.1-1.1C9.4,4.4,8.2,4,7,4z" + /> + </svg> +</template> diff --git a/packages/theme/src/client/components/icons/IconLanguages.vue b/packages/theme/src/client/components/icons/IconLanguages.vue new file mode 100644 index 00000000..126c58d3 --- /dev/null +++ b/packages/theme/src/client/components/icons/IconLanguages.vue @@ -0,0 +1,14 @@ +<template> + <svg + xmlns="http://www.w3.org/2000/svg" + aria-hidden="true" + focusable="false" + viewBox="0 0 24 24" + > + <path d="M0 0h24v24H0z" fill="none"></path> + <path + d=" M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z " + class="css-c4d79v" + ></path> + </svg> +</template> diff --git a/packages/theme/src/client/components/icons/IconMinus.vue b/packages/theme/src/client/components/icons/IconMinus.vue new file mode 100644 index 00000000..e0229195 --- /dev/null +++ b/packages/theme/src/client/components/icons/IconMinus.vue @@ -0,0 +1,5 @@ +<template> + <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> + <path d="M22,13H2a1,1,0,0,1,0-2H22a1,1,0,0,1,0,2Z" /> + </svg> +</template> diff --git a/packages/theme/src/client/components/icons/IconMinusSquare.vue b/packages/theme/src/client/components/icons/IconMinusSquare.vue new file mode 100644 index 00000000..0c7c82f6 --- /dev/null +++ b/packages/theme/src/client/components/icons/IconMinusSquare.vue @@ -0,0 +1,14 @@ +<template> + <svg + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + viewBox="0 0 24 24" + > + <path + d="M19,2H5C3.3,2,2,3.3,2,5v14c0,1.7,1.3,3,3,3h14c1.7,0,3-1.3,3-3V5C22,3.3,20.7,2,19,2zM20,19c0,0.6-0.4,1-1,1H5c-0.6,0-1-0.4-1-1V5c0-0.6,0.4-1,1-1h14c0.6,0,1,0.4,1,1V19z" + /> + <path + d="M16,11H8c-0.6,0-1,0.4-1,1s0.4,1,1,1h8c0.6,0,1-0.4,1-1S16.6,11,16,11z" + /> + </svg> +</template> diff --git a/packages/theme/src/client/components/icons/IconMoon.vue b/packages/theme/src/client/components/icons/IconMoon.vue new file mode 100644 index 00000000..b74a8dad --- /dev/null +++ b/packages/theme/src/client/components/icons/IconMoon.vue @@ -0,0 +1,12 @@ +<template> + <svg + xmlns="http://www.w3.org/2000/svg" + aria-hidden="true" + focusable="false" + viewBox="0 0 24 24" + > + <path + d="M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z" + /> + </svg> +</template> diff --git a/packages/theme/src/client/components/icons/IconMoreHorizontal.vue b/packages/theme/src/client/components/icons/IconMoreHorizontal.vue new file mode 100644 index 00000000..1d89acd4 --- /dev/null +++ b/packages/theme/src/client/components/icons/IconMoreHorizontal.vue @@ -0,0 +1,12 @@ +<template> + <svg + xmlns="http://www.w3.org/2000/svg" + aria-hidden="true" + focusable="false" + viewBox="0 0 24 24" + > + <circle cx="12" cy="12" r="2" /> + <circle cx="19" cy="12" r="2" /> + <circle cx="5" cy="12" r="2" /> + </svg> +</template> diff --git a/packages/theme/src/client/components/icons/IconPlus.vue b/packages/theme/src/client/components/icons/IconPlus.vue new file mode 100644 index 00000000..cac062d2 --- /dev/null +++ b/packages/theme/src/client/components/icons/IconPlus.vue @@ -0,0 +1,12 @@ +<template> + <svg + xmlns="http://www.w3.org/2000/svg" + aria-hidden="true" + focusable="false" + viewBox="0 0 24 24" + > + <path + d="M18.9,10.9h-6v-6c0-0.6-0.4-1-1-1s-1,0.4-1,1v6h-6c-0.6,0-1,0.4-1,1s0.4,1,1,1h6v6c0,0.6,0.4,1,1,1s1-0.4,1-1v-6h6c0.6,0,1-0.4,1-1S19.5,10.9,18.9,10.9z" + /> + </svg> +</template> diff --git a/packages/theme/src/client/components/icons/IconPlusSquare.vue b/packages/theme/src/client/components/icons/IconPlusSquare.vue new file mode 100644 index 00000000..6a739ac8 --- /dev/null +++ b/packages/theme/src/client/components/icons/IconPlusSquare.vue @@ -0,0 +1,10 @@ +<template> + <svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> + <path + d="M19,2H5C3.3,2,2,3.3,2,5v14c0,1.7,1.3,3,3,3h14c1.7,0,3-1.3,3-3V5C22,3.3,20.7,2,19,2z M20,19c0,0.6-0.4,1-1,1H5c-0.6,0-1-0.4-1-1V5c0-0.6,0.4-1,1-1h14c0.6,0,1,0.4,1,1V19z" + /> + <path + d="M16,11h-3V8c0-0.6-0.4-1-1-1s-1,0.4-1,1v3H8c-0.6,0-1,0.4-1,1s0.4,1,1,1h3v3c0,0.6,0.4,1,1,1s1-0.4,1-1v-3h3c0.6,0,1-0.4,1-1S16.6,11,16,11z" + /> + </svg> +</template> diff --git a/packages/theme/src/client/components/icons/IconSun.vue b/packages/theme/src/client/components/icons/IconSun.vue new file mode 100644 index 00000000..d846bad3 --- /dev/null +++ b/packages/theme/src/client/components/icons/IconSun.vue @@ -0,0 +1,36 @@ +<template> + <svg + xmlns="http://www.w3.org/2000/svg" + aria-hidden="true" + focusable="false" + viewBox="0 0 24 24" + > + <path + d="M12,18c-3.3,0-6-2.7-6-6s2.7-6,6-6s6,2.7,6,6S15.3,18,12,18zM12,8c-2.2,0-4,1.8-4,4c0,2.2,1.8,4,4,4c2.2,0,4-1.8,4-4C16,9.8,14.2,8,12,8z" + /> + <path + d="M12,4c-0.6,0-1-0.4-1-1V1c0-0.6,0.4-1,1-1s1,0.4,1,1v2C13,3.6,12.6,4,12,4z" + /> + <path + d="M12,24c-0.6,0-1-0.4-1-1v-2c0-0.6,0.4-1,1-1s1,0.4,1,1v2C13,23.6,12.6,24,12,24z" + /> + <path + d="M5.6,6.6c-0.3,0-0.5-0.1-0.7-0.3L3.5,4.9c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l1.4,1.4c0.4,0.4,0.4,1,0,1.4C6.2,6.5,5.9,6.6,5.6,6.6z" + /> + <path + d="M19.8,20.8c-0.3,0-0.5-0.1-0.7-0.3l-1.4-1.4c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l1.4,1.4c0.4,0.4,0.4,1,0,1.4C20.3,20.7,20,20.8,19.8,20.8z" + /> + <path + d="M3,13H1c-0.6,0-1-0.4-1-1s0.4-1,1-1h2c0.6,0,1,0.4,1,1S3.6,13,3,13z" + /> + <path + d="M23,13h-2c-0.6,0-1-0.4-1-1s0.4-1,1-1h2c0.6,0,1,0.4,1,1S23.6,13,23,13z" + /> + <path + d="M4.2,20.8c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l1.4-1.4c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-1.4,1.4C4.7,20.7,4.5,20.8,4.2,20.8z" + /> + <path + d="M18.4,6.6c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l1.4-1.4c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-1.4,1.4C18.9,6.5,18.6,6.6,18.4,6.6z" + /> + </svg> +</template> From 20340f735f30399e10b1089f8e207010e8af35b5 Mon Sep 17 00:00:00 2001 From: pengzhanbo <volodymyr@foxmail.com> Date: Fri, 10 Feb 2023 04:37:08 +0800 Subject: [PATCH 19/29] feat(theme): add global component `NavbarSearch` --- packages/theme/src/client/config.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/packages/theme/src/client/config.ts b/packages/theme/src/client/config.ts index a3fc2b3e..fa41a927 100644 --- a/packages/theme/src/client/config.ts +++ b/packages/theme/src/client/config.ts @@ -1,4 +1,5 @@ import { defineClientConfig } from '@vuepress/client' +import { h } from 'vue' import { setupDarkMode } from './composables/index.js' import Layout from './layouts/Layout.vue' import NotFound from './layouts/NotFound.vue' @@ -6,6 +7,17 @@ import NotFound from './layouts/NotFound.vue' import './styles/index.scss' export default defineClientConfig({ + enhance({ app }) { + // eslint-disable-next-line vue/match-component-file-name + app.component('NavbarSearch', () => { + const SearchComponent = + app.component('Docsearch') || app.component('SearchBox') + if (SearchComponent) { + return h(SearchComponent) + } + return null + }) + }, setup() { setupDarkMode() }, From b859801a1b48472fd0ff28a439aa98ff4681ad8c Mon Sep 17 00:00:00 2001 From: pengzhanbo <volodymyr@foxmail.com> Date: Fri, 10 Feb 2023 04:37:54 +0800 Subject: [PATCH 20/29] feat(theme): add fonts styles --- .../fonts/inter-italic-cyrillic-ext.woff2 | Bin 0 -> 28332 bytes .../client/fonts/inter-italic-cyrillic.woff2 | Bin 0 -> 17824 bytes .../client/fonts/inter-italic-greek-ext.woff2 | Bin 0 -> 12188 bytes .../src/client/fonts/inter-italic-greek.woff2 | Bin 0 -> 23264 bytes .../client/fonts/inter-italic-latin-ext.woff2 | Bin 0 -> 63552 bytes .../src/client/fonts/inter-italic-latin.woff2 | Bin 0 -> 46048 bytes .../fonts/inter-italic-vietnamese.woff2 | Bin 0 -> 8784 bytes .../fonts/inter-roman-cyrillic-ext.woff2 | Bin 0 -> 26600 bytes .../client/fonts/inter-roman-cyrillic.woff2 | Bin 0 -> 16780 bytes .../client/fonts/inter-roman-greek-ext.woff2 | Bin 0 -> 11808 bytes .../src/client/fonts/inter-roman-greek.woff2 | Bin 0 -> 21776 bytes .../client/fonts/inter-roman-latin-ext.woff2 | Bin 0 -> 59608 bytes .../src/client/fonts/inter-roman-latin.woff2 | Bin 0 -> 42464 bytes .../client/fonts/inter-roman-vietnamese.woff2 | Bin 0 -> 8492 bytes packages/theme/src/client/styles/fonts.scss | 157 ++++++++++++++++++ 15 files changed, 157 insertions(+) create mode 100644 packages/theme/src/client/fonts/inter-italic-cyrillic-ext.woff2 create mode 100644 packages/theme/src/client/fonts/inter-italic-cyrillic.woff2 create mode 100644 packages/theme/src/client/fonts/inter-italic-greek-ext.woff2 create mode 100644 packages/theme/src/client/fonts/inter-italic-greek.woff2 create mode 100644 packages/theme/src/client/fonts/inter-italic-latin-ext.woff2 create mode 100644 packages/theme/src/client/fonts/inter-italic-latin.woff2 create mode 100644 packages/theme/src/client/fonts/inter-italic-vietnamese.woff2 create mode 100644 packages/theme/src/client/fonts/inter-roman-cyrillic-ext.woff2 create mode 100644 packages/theme/src/client/fonts/inter-roman-cyrillic.woff2 create mode 100644 packages/theme/src/client/fonts/inter-roman-greek-ext.woff2 create mode 100644 packages/theme/src/client/fonts/inter-roman-greek.woff2 create mode 100644 packages/theme/src/client/fonts/inter-roman-latin-ext.woff2 create mode 100644 packages/theme/src/client/fonts/inter-roman-latin.woff2 create mode 100644 packages/theme/src/client/fonts/inter-roman-vietnamese.woff2 create mode 100644 packages/theme/src/client/styles/fonts.scss diff --git a/packages/theme/src/client/fonts/inter-italic-cyrillic-ext.woff2 b/packages/theme/src/client/fonts/inter-italic-cyrillic-ext.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..2a687296748f6b8bc8076cd11bde49cd27e4442b GIT binary patch literal 28332 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 lkKL(qGBcDXXZHb~GE<tk`x zLWyq#3pGB&C1Mo{x6>NV%oa5o3p`t5VO%nZMDK^_*W?ZTf^ae0dT}7-GX0Etc~C)9 zsCkr)Nr(B$S=a_?mf$3rHl-+o8B&r%!4Rd^%5v-6aOc*ak>|>lE!rrvtXH~a4^BQI zNUQkeRMGHIDqsA-KrS<XrB~^n+BFv5dH+Pr71|kT8wPOGJCbc9Qd{m=<s%i$-Oi!V zE;j`=Yu!xo|0)SO3hEd$a<tQ8SA8SfThfbIRPKcPddI0H$dq8`yU+?V6D`@rf*EG+ zq&yBD<>mu=(JHzSr65^ubmoSLIi`$ghfGqN&&Fu-Ji#tvmz|xPv@1Z^&ckpgFqS<! zHQX8YmBIxB@}Hc48{s-n`RAIP%&aL_NGY%O(ek6JGA^)>`X<{=f8fK~0*KrgVT<N9 z1~c0Lc_fpHZYf-b$kRLx`jVd3VSyQW5sp3{qN~A+Bf!L@D>wAYS&CTC<A>kK9!48~ zOFFh~+PM4#=Fwe-mXB~0-u)QKjgN14sKzci7+|sG))q+{Q1xTbO`J8t8<6HsD!E19 zez6Q*T9CTuD&4hZ^c}*x^m7rb7d=bPJ==8tF<beVbbGM3)#0x@uV*4YqDXy2Xw<SI z2p{MhNd?J4D!|s+B=t32MMiu((gD>VcOH_^Qr>h~kved2>FZn-!f1d1*XLbr3}dt| zgdy86sMDv{14IA2K$2-ZIRkTNioOIH4}LNAa4EQLr`_Yqk$kKVZ`5Xq-q?NdStte! z*`4&W-e5F;X^JvlC36bQcN?&D_p##<fbXs#vMhvUQJ%MifW$gYN7RE*S*^^lb%}S8 zG8bVT4rMxj#GICQ#2u@|4hRZ|%W(La=7s1yrxf$5>8li#aA?Aj^e=X4EUo#$Y0N?f zn#MG>H*$B)q3|`<l!$Oz8D5PCTM$v}ilc7~mU&l$3@fTC7DGa+@zClJGxYXF>ua3! zroTVz&%n40J4^g<8)h<bd{))*mSx$%!B`PN(Ilzq(!<67#P}hNxoiAZK{fBb(<L@i z&?JN;4UMpu8RrjE&S`WNlE_6VJ}CH^lv&Ft&^!n$DilW}(>$l%aKVpdW|F36V0nrs z=dV02gde$&2uz95%Q)FXl@9oEG4JNrV~#z(_A&kZE|e0PKW{LbO)pF*Zi??r+8Sfk z#yrktKAlg_j%)QK6``x-OBB^G2f-Og=Wqm-Agc_=lc6Hv{~}N#A%KGVh<{oW9hTS0 z7qsYC*a>u2R|d52nqy5`@vyb-JDh@{@wCBlyz80vR~BG8-fTKE>wTn_G)_P0FHFxG zm#A7`9=l)DnKe90pSmu93v2<PPXIX8dVr(`6U%WI<pA=_qS!iM=@p3<6d!cn>EIrM zwJ!?r{A1}8hP62#jPL-)ZnnVR98^>;CH09<tvKnbB)}UAQmMjrTnWiX^ThaD1jv%g z{SJ$CYAA^9F$%uzHuNP~9j`8xa1eR*O2mDm-q>S}su7!p;u{;^w&^}qm}GeE3j-Si zGo6{6KjC62pF7>rKLC}n1#{JyP_9i`SSsM0&39C2D}b;0*R7-r>tLGY6BsYZ+h(I+ zi?Ah*%jBU2iJFf7SUXqqs=Rx=WDB^9%F-K32>(q+258W=kvjw-=3pDY`xkn+dvh^w zR7Jjy=BG#R5~lNZ!$jLfnSeO~c=Cv5x!uU|K(t1(rc#ZeXqh&46Ov_(LiC+m9jTsZ zSueGS$825q0^4=q!`9V5oa;ZK+OVS%g91fW(@71<PToN|kFwg^Klbja{isq{#$Z}l zj**~O#uoIi%XS4Rvo5pxMpXA*__W^jcCC3aA!C?wh>~G4bS1X6pMq2ZltLx$VgLZ# zMUl^KawI^>7Rd44N!y3rm2^h{O9Yevf?f%f^x;5Z1OV~`VA6*N<TUvMOp}p*)Ue|w z{6BO+<DOcKjd)C}lobk_2M#>bipHHJU!?eGo<Y%0Wi>apzbZFyn|5+Jz9Rl_PqO{> zZH-Z`Pgz$m!tWC9H0}$TFy>@2d*X3SZV%C)J5P>ail~_c_rI|1`ibFqAL`+{%qosD z@rtvle_tLk#M$b9N=>x=AKtTPbSizxso|2jGWTy{a6NmnS0+y|*`AVHymGAU1tp7C z$mnrdAI>cHtJBYkRCk&;GfEmej|$j3G$YD^wVhQKM;_zp6?4xS*)o3A5n?P+*iBXU z7%18F0K@F3)XAuW%5Rn5uZH^EpZU5C37?ms!)qI>kF6HhKp8!(i&n_1WheaV%rerr zZW8svI}4O-FwcI@9!UsN`C$3g@U~q~r$2XUxMZfDQZ|CTBX5h(E=b2QF0gLzdo>zV z>ECIxBGr_J!yd4P#b}{eB4Z0A8K0>(Y3s+YivP~^2JBG`e@23V4Y96>Ct8xn0*h{f zN9;M)z2qpBFUlWYA8;L-nq%HiiB|ch{Qixf^U(Ng<ENGiBE5!IsR!+-J=eJ2R!)`+ zPAOf`Db9M7G1iW@7I|?)*^~PFF+=AU2r0I(l*@o!J;RY2@`q%3=5JKLF*o8fhk{Pu zmAVrZtokJ!tXCmccZVt(g6y()Qc*$;{HQsj#~9UJQC#stT#8{d(Ho55T~((`mr9GF zfKvdFN%KjhxGkHBgms&BBZY1K&;*p3?b<Jm@}G8*$t5L6n<ZJKQLMoaePoKHDwx8U zynA7BxTgB5J=;;0e{XJ{mf`A%MD;~9%Fqy<pIH>GjeagFjY}It5)8ime`(*!zK^^Q zUVXK`qj96izzWx*H@`I6d9C!Up-rri8HNXY+SRx%IgD?{H5Fb3!ixYQl%Flo7ilnt z=QL=;CnRcoo6^u0E+~k2OgjIBt%mRf&;iT|rGk>L)P_w|pl3<<-a~n>ea?20Q;CsI zEq4#pv~w55hbMgtTgmZq<#l}>(GMNVN~I63E7Z+@H7q)R=Vxscpq0zFzkFY>jT_)} z%CYY-dY=5TIR;#ZIv^@cLx)Q3(V?Z7vuJ6{2pfU0>WwPDilZR_bOE5s3NycVd?tXN zHFFnv!uW2}RMijjt~UKM?8Pyn!uCxK64a2OyRZeXUarJIm}_h$@N+~DHv?nUm0h{* zO^0JlHF3hFWdnby@e3o=wy<a)mj3t}B#2^{ya8AW$<6M^`f!Dzx|(YryVKeCk-7sD z!NJMGH<yYwQF{>mJN=I|jR%WC*aYA%x`IPK%Z6G$4V+d=RX@1r#)7HR<4g|I_sD?) z3P|F*=x1EIZ(57oYH?Mx3Pl?#_a%fcQY@i0;ezKFhf;{juRQK{=k)^iqwyHn$Pyfk zpG$W84mGdp8FZ}+#1u5!F40O7q*xbi?LDH+*(Ja(2M={(E<XPfF_?Dh*4$&;Ljq$* z6a@<0xr>hbI@g;8(E01D|MlWWd#u=l+!gNZKFeqQ=c}GZmEBW63G{|vX?vZ2_tR=E zr+EjR`+-BC8w=lk`mWrYp#=^PjU*mQ*#CTMessrnQ-AK0F%QmocjwEy9-iFiW*Lf; z!v}a$>8BQe*RPYkns{}}_Kg=O%-`Ks{Tw~fQo&;NsnZlEL#@8v>Yei+d~c`tz${1Q zeKAYq-CmHrMk_ZBQ(kTKPQ4AJkIXE~S5;m*%bt|l<n!NbV0>pziq!E&4x02Ir<0%k z<7Wc3AE8yd4gvPKe#Q>18SmAPHsQJ^Mh?0>oU42^)Hqp}F}-o#<UR)ocuc(nqUga6 z7A0v1OQEm(U-<Xc%UNPgI-|>P2yo|nGw5w*#Id@I_Y_7i>{XnkB+<{w%B3v5$-WYF zL9uLy2YdQa)t<Mypl~ZYVL`?HwyC*`p5>jCEOLzP;Nz6r&D`<eFj5G2ae&cx<_t+F zHRoT_Y`Q?rVf4Htd59lgVdhkQ0m~|)kUQf~>IBLw9CxQkgAl{k@X>QXl>s?GKmdS; zmnxG!(2-gW_Lp2iflL9Aq)jTn&7?pNHNG?Ny+V*Vj`fwggBxZHP~CrN$+u!hF!R#! z^xET!-&Vr%f1pAxm8WVe8|F_*WG6}`z<CUC7bozeN)i$R01sqlu$QFUcUwkkVAKv6 zZuOg7c}Z?mi3CVyV7ZlV3d1<&nez0wa!Ge%NY5w-I}3lI!_Gw=FJ4Nf=2H?&PMkn- zXHh4rbBO+=(5%eDg7I{j1DkRg7j9#s>%VUPedsbZue&Zm(ab|CK1idM=r4Qx>O)$5 zN7JXs)Y~A(*F@AzA|ZeTCulYiG*e$4!22FST($U2wf5=?8^+W=UN{$32=Lp1yO{g8 zR?RUQ`!cQa!Y_1Z4V^I@Mej>bX~z4qdOy8bEHBJD)kv65YRW1saJ_mpDQ<-(WRg@1 zXSyIV@XRF?AGZW{nZ-Oc9kFx);K~DSC2MRIV(5I#c2jlecpK9S<42YBlej7aK?((T zZUp9n-4^Crf}!P|1z<>S3@kY=j9hMS4c^3H-*7Z{(RnUtD@WvBBdA3PK++G)VmU?R zE&xz6RNl#cf2_twRvXRR`XQuU5(=ql$pb}%m8!;%Dv@Q^CjN+$gohlUqPD`|U`dNf za!Fe&pA~I1k7CP+ZZb)kBNM4b+BR5I_4zeF1kNO5uiF_&%r<6p#(4F-8}PRV#4#Z0 zBB3pE7u{Jc8ohGi2rONb?({*TqL5B8J5y{IQ2EOc>=Fr3Fw_zp9ol&Vc^1tS&RrvX zB6A+mj<zi0Mg1b<F0Sh2)G2Z@_3*i>W7n+mH*2MK7@s3^heLsbY>XWGDP<-EV22n` z6&v=0=)1bP!ss0_b^_;}a`JIbYsBEpt2axYyCpmZvj=<?C({(~KlZbkoo$m;ME@sO zwTAb!J6-JO4GO?~%klrH*=aI)hMTobJMMB9>!Ap!)(zi=jt|*wd8+I|dQBf1f3c2E znU0`e%1Z4b`f~=CzD;cx2Kb%bHNS3va_{TaR4Q{PaSlFr#J66ZtfX^ibJ$nXqnn9= zGDpIOry~juLhCKe8i-qlN)TW^r3X)?=t*ac@(SYutLqHv`RSsfjz&{iRu7|3`Q^8e zsE5y{@bgg#%5RBr?CYH>-#bgWi<bEbA;U6<5<OtF*x-BWvWquQcLPQp<0`9X-&3#s zr>Ep=-Fl3U0wk{z?1d+p@eHt1DlGqQbJck!at#XdsU0;UUZ502R#mbmHy<I*n-&J< z`;>l&WrOIj8krz5hef+H3Qivr2s9mtUHtj{ZY4EGa{^D$yAGz1=2r)ssRcNh!WxP4 zsn;~*mxA|)b|kq(RL}E^gL1F}azfeBtJA(ifV+513CnmB8N((xD*uXq0X}Px>JeV~ zKikh{e*xB+n%r1$zVUqltqRAuF!n|_7N{3gWwfFC+M-q4;Bjq0GYpJWkFsv~8lA`$ z1=!>5dthLJ0!#7@&<8`eZa%nszJ%M$Pl<?#NdeW!5w_D_Y-}VonVS2#ahg*7SH1~W zU_<<+lYjy`V>7>}RobQ(FrbFrG)NWXau>bK!4T0A2-v(vIyV%=UNj25;c)X~j5-?6 zDJcej^G4{1QFm<N|611c*2cy*+ou{4y>(6v_<DT9`MX<)YN*ex?#Lf$7hexH220m` zg1hp{a6y#K+u)y3`?JB)XC({z9VJ?vF{X^jdvq|m@SLQgnxb%<e};9%fi@^MOq*x! zH$1>>2la!}`S}w0I(p5ck2b=o2}aw<;?gj!M6R;>;&8pq{DiX|NgczwK8M(I?6x2> z%o8iX+L#9U?Xfu7=b~J3*twUI#_VNuKQT_f?wis^PGDUbzCAZ0A6hZ~nelmu-IG?N znZ^dwY~twhruLBUsp&{LIook(r@Y$9j=a2;p0Ngpf77$-k4**`1o;Gg4>(!Bl6CMm zh~K#u*R@8aisR-JH{Fp<1HQ3A8Zb{?M9fyTa{2m{YM1>Q?m&o6HfCJim3~>L*ep%Q z)XdKuYi~4=L#rMuIqOoSbIhzo$KEU0!P`7IpC(+R9k29^j`zM^$6Zaib(=GRf{{2A zX?IgfpLDQ#{P}PE`Ru_Pze!p3_3w&8sN6?+Pww;(Rr;8v`C3h7<GW))QN=X#=(f11 zv3?~h`1fqexI0!)RmaKn+jk2!ILie*?`ikas-r2@6YL9{l$<r<k>%3ae8vd3$%aOe zxFhA{T*qy;ChK=5^~i7ejl~OD`;~7doao5QTZ;&Am~Q_YJ5|v3)Yq+Bo-Q-^huH>Z z&NLJ%%k8ye_4(H<6I<z(0SGvE)tI|Vf_v);ysb?_M*7KbMwrbZ4*tE0N+bHg6Ig*U zlifj*AcVW<0_AcnU+jkURZxKG_P>!+WhKhb2@H+$a$C{xi`qvE?RsXt%G(*nQ?lfN zUUWE+Ue(_**-PUAywF_r!_=<xx5?R{>Vs*Rx$5foa<X7Zj-%?yS;*Kjqk2K8&b}H? z(*d3@dKomEd5Mu5_mLF(v6>|^%IKw>KStUmPe@Gz(_8GDL@%4Rum-ce!>T)+oGOe? zVIA0mfU=l0DS?OpXY5xWh0zA*4jR>gK%qN#@mlxcMGP%VP~o+W;{U{?)ten&{-FhG zcIV%;`!V6FAC%v&2K(Hb`L+$|AMm}?=5G$Fb^iF*LqAu>Xd3(3Y>@q<>8?-Zky6YK zI61<kp};pFf3PkUP*0_ivlQ2h#Eg__D$xLboviQu6?*tGC6#jM+GSqwzy!T%q-8pd z6hREA2&t=2csa3K@5Z)=GNS%DcE(k~xZD}}>ifaR`)cgPAE^b*3)rh~cb&d{NIHp< z+>v>Agxu12?=#)&LjeT8io3``cy=B8OC2qH^!A@)*ZOl8`8n+Q=uW5XGS?C5<Q+T+ zK_0Zd#KJie<v}}j{6s*?{S$X~%8QFm#6|Rw(b4njcU*=0F||<lm(Kq0{6)nN;(T8L zenGn17IiO$jmk~B4Et+FZZt7i^`q+N_XmAOXTHn_d&9=R55~y4W^3OzoJ7*k(#{&7 zFErKGt~Q-SqX7rm5ZT)R4z$3zi^cady?!d(v?yoa>iq9}y|{QX&gT`Q!@z9Gz>Ib( z|3peaUn{HEqMX@txWmYNiMtrk+W`hJq(o`00V!8bl$dA@4FQ{9eT^$EzL(+gAN$tW zmBP)ApI@2O%|Hk5J;C`h;YD@CBW$6=F4k4^^vgOY%?|18GTR@LbV>B8v0_c3&e55` z8fn}e8^SWWens6}!U)$H9j&jv#uXdD;2I+wm8a8A1)q>0$7GVFGuPDfU)%qz)+Lq+ z@h9RU8m|Vx(&pN(xGOq!W>q>aXHS>WD*FbEur>m|*{-8HO=hDy>E?iJOQKNxeWU6a zgD9}mn)5<oBr!<!gYt*9aPRvwLyrm-?vsCcs`-;0M%e7!Q*ta0WF=9Lo<|1&JCS$P z=dces7ot9xU0pBX27kzSn!{p6tHQpxU^6HwSDyx7*aeW|I0>WcyPnNDt$ZB}6<%9n zUtPBj);VC7qZ4eFWlpd+8t9`IysPhzF4j3{=B)#?5Hn(GY+q@iNK|@9QguYz#n!>W z{hv!>a>Dtt!oq^GE`Yd5$JN2s+BJVIDvrHeDk{t`g<#?%nl27jdtK-hXns^^%BTrm z9=5joJPgUVwf%BgDNPJu_5hK+H{0`3ebCyaVjp|F%hujK=#SD}st}2avh%M)pxug_ z{dZb)Vde9Vs6xuiSqFb4tbNj-J($zg#%rcdR#z9w<qZk~-3zz@VL*MwXcyl*l$b)j z-=?#JR=CxhcE}h$=sU<YLST;KXi$!8*v$85Z1f8(Hz%rB+_6rK@`<i9TnBePh2PZ9 zZ(7_y@sIa6MYR*-<g2bU-dH}{E@EBrj8iCbxT$sMvP*<M^)OIInOB-6li;A9vC+S; zlWj0uUE2fso(ytAYG?0(NPCfyeFEO2o@cMSYmb+KK^WF9ql-u;%*J4kmD_HDMLjuf zs@mO#R(L|x)<ppR#|2j&+qh%c0&jV0$DjQdKHwWC&)aXby9-N&O6#L2c(iaKLhr7~ zm|R(2RlL+X);4L|Z+xFWHT`_wsb`h%_rT=^E?0rNEir~F82>)}RjNhtY0q^VcMV(M zJ%{(u!&G?6Z8u^sq~)y_hLRYAg|=g`k~J?u&X1uPo5!N>tGwOSpI+X~k4?hY9(le9 z-Mzp|f5?}i^7^-GIUor{3SN0yZw`~Ld)mWmld@}<b|dhY-(Lt37oU<jCS-MiSO6#q zj-{CaC`V90_W>zGkqDDjX7Ev8WFK^KwZlU1pr)K<-I9hg=8krzW&`f6qe-&?tQ4vG zy03!0zRDP{SmlT=0S@-~GaQ>YrfJ=*rY|feEU3p6*;4wD>PEj1C1{8U(w2*d7mR~i zA+hwh6yaT?)|G-33B}Zkf_kHxFBHziNsJv<Keh@wCfv-i$%S_nrG~VpZG)-MVfDhz zv;uOR_^8%pmFIe0{=ZuUs?(Gf-7?xWG%DNdoK|ssF}o9AN{h{Ew_u31X$azLX_fR} z2OM7?E!t)iOVXmXe^gFQ(e$6b&{%I*_>ID#MsH4~qGuXy$hvX7dFzyQG1-AF^~Cy3 zNM(VhH69lD^<p={1Opm3=vpS*0Qviz57%kUHp!w5+imS=3BlHO1_$NW$2zZ?E^L}Y z@=~u1|7iU3x92rE!Y#q#3&#`kGA299Hdff@^=kOmXvL;_YV-l<lx5_1jv<!cM;HqQ ztD8IjT$g$QqZaRKblQ{3pq6*Yy`RL@r=u5`E6K%|d2*+Msg%Ij&nrj1bbHn<#{U~^ z=a7lXUesPzRBI!9PtfsL%iVyVS{SvE+|658bSJObHJpX;n%n^apKDll)|k<B>JQ!@ z&j2E)g81#>5(tl@K9Z(j0It&btzo{egx)#sb)+ydt0}qAHVY&Wrol?kDC#~o<BP}Q zlmG`0_gSM^Ee(L=d;7LP*&p{uQ@UWH{=v`T>J@(-<2IiFNhHUE7(aKxZ*Kma?zKB; z-@?0FzDY;~KuHL-fku{BO+y+$A|ckeH}CCXD^v!P?dKsCmY?O(Wod5nV4X3;3I5L~ z=F|b=6IV11^8uJ}N2rlw_+&UT)fTkKi;*1Zc3K`FY&bnf#8+j~!vFpcb8IYDe-`%T ze}Zu;gd{y-Vm!a4nmy-6_}Kqia-o`WKT<iJKyZPeEZvIv0)YYR6*>&-AhTA{)xM6c zl$M{2f~hc|8XzT2B|zu@+Cy_~fSGY>e;tstKN~;^p%;Dd2y)d2Nu-R*RAn~Jk-wSX zs>(f>kNBy|mjy)80PtX$4{r6tV3T~w_Gw{X|DSQ7n*+eKe-6km6l1Mt{2$JIkmH>P z;BOBAxWi~{%-@IK?{gY2lMmd)90{pRQ(Q`20UKQp{?8YJr}76TS*m10eAmzIL5a`B zt^Vs?6A<*O6czwb6I!)90iXa7{hQBbk=R4&lKSCGf1xB7KKt=|{Dn2je#*RL>doiO z&4$_O44J3$c6fUfhw{0aWxuHYU;P0JWr`AiOT3%-SK!mY&m4VHncS4z8ax}k9GsuF zI`y|ybK{Z5j<AuXF_*E5SWWD1>;(2-WG8MA55rUNY`hkJ7v3JfAD@grjsKa$B<K+0 z3AscfaX0Z0@c{`#N+aDQ{UBSB-N_foTeh?GsPwG#Dn(3Hp*G3L%lOIU%KVTe$(qPI z%AS>Nr>W7LXo0j++8XUYIYYTPxgNP&au4M;=u&i5x)D8uevy8M{#M>u-d|oU-!1>0 zVZk`d_`-~2US$zj(+W6+vuqOEn}g%%aD<$B&R0bx#lIAD6iXEA6whz7+2*<J;I^b~ z!fl_p^-2m#XO$nT<f#;^)Tnf++*FxRd8#5&&F5+IVt6CGS>6io3vX-k*dDSyX}fT{ zc>BB>R82w6K&@YGSnaXeE444`Ks`c(qVbnTghsl?znV!}HJp#DRg1{0_g#JHYWFoF ziBwX)_=&~jHHWUb^w3DLtXLVTjBJa%5iwu4|GLkvU-pRSdjBK6kHi|a#eaRfq-5XZ zPbRx2e>eGO6aZ@g2ULLtGy$kA2(A?Bln(tP5+Q`9{WCzQuXc{3lot*gJM&a(XjenE zp;l`_E(`_|QYADraXU945O7d&3gyTEF^@+gd3<|h7oC-@7&rdQ!k*k-g(Q@-tvelc zLDXOkFvxWgOfD2bz0ugO;uK9Cg!6~xIM&OriXDHb?FY(#V0=E-CgOWaVtH|31<_PO zOpam3$NE*IoAHX>F%B3rAB<dPXk`;g{JFb$2${dxwF8nD-Ff3bTN9!J4Rl#O{jw_) zxJ5BmNCyH4OT2fOa-U$r0{hmP$E}{|aw!nzv}Tctb;l_ZK&VYM;i&??;v6P2^-k~R z%|@_w{oXH|V*HP0%!9jKv85CYidvq+5uyXua)bU7mP-jzs>s4~Bjk#6L!PM{XHK;^ zmbQ5K*<(@(I5=6Ma;3O-;MWYYX$^lIj#uC__Uz0pO8v1>lX2N!H<qI_HqPt}ADSA4 z?nd5Bn_rkagGqJBdh9H4V#_9$Znxo~PPh|MIHbD)$`9Vlu&`z2X{4IbqCWg2%|KVk z3V%9FoHlIBv-sPiNVpTfBHhuRzTv2elXW)Ot<NwBoOTWiQjrJI6v`{#Yv@95@Lr)= zM1^<(9f^#7IzKC0qR4}#O;W{|>T?d{BBXkc=`5H@GOBmE@KA!<XK|pa-c@Zky%kQ9 zcGnotOX9Qtozi6eZFdZsChX@3Y-H2RFX=3;0|}(zEEFqJ?GN=C@Uv;4LwQIRtEy+3 zZKtoxKXv_58=N@7PA`G#S}!(PHvnkU2sRQqtEf!?Hn>*A7-tHatZZP5xX-R5p1RI; zi<>7GmOl1eUAAI#wzk6aZ|`9n{lTk$F_6T}D|J<pZg);=w|8%AB*X8AIawb%nr)xH zDK3vWO;8|se7ZRWTh{YfBH=v^36XWZ3Cj0kU>%ZUB-o`_8@v#vH84PT?xktvEo7K9 zMzzpr`Mph2Wim#fb^s~ESeS~WfV>?Pq3vvID|f$Rg?6HrC`G=o->y7%dM3f7{sJej zGty+~MJS%|bU7_c15A@O**L=+(7<(&u-mcq=rx6JBG8*G*gBd{fFATNB$8ta%TUJ# zILWnwfc9A3FJ5X5Ov*VcaKny6dFrE1PlEi6dE-X0$$Bv#B;2aFh=7D*eFV>-OHjpY z7`v@iA~E%s*#xZvMNm``3)9cC9WgHCXV<KNr9+GC95|_Z5<NY+$7Y2fSFGxvdW9dh z#*j*KJHQWKLWJ>GkDGybTVZm9cIsL!s_C{Kjry=mVK}8V!Efrc4L3L+0zHjJiUP%I zDG9yvwPfx#MvNJ%;5kvfPg73lR8pxjS?A36BQe&?&PNGt%8OW=n}N7P2@dAO5ERM^ zH4bplGrR=^9{8?CD>Kk}OV_w{_1IfQ0Wk=aqdUs4WGs<bRbN4_Dm_*2>N#Y+?09PT z8VKw=xFfXt-NnIWebMXFgoSyzfPUtp`?0e%E8#1j>bSV7Yu0yX6>N9}y%^e)L#mlt zf9eP6Pi9cuS_={DEN`qv|LR_^x7feU%E3j?hMJyxFMKaD!WER(+7MGoP{}w}7A2n? z@`!XxsHqEIlbV?>6H5-<BGtQe`@D8inP$T88BR8T#3216!YTjB&uulT_oiwwemE0r zwn$4!o}V6`_Uk|#-_y6ZKm6~A6;}iuaul3}C3`b1d&|q?o5YX#!=*~_E^mdt=GdYw za~U?Lf9G}!PTHRKx~dM`Ypc2dd0;J-QqXyLx;NwRK-f@5r+UlQSqfxN?_h`hgJhV_ zaRkv$ls{w1+9zfaPZU0DpR>1bvPimO77eu~p;&n8))_br)}tO;BPo3%C-PkV!5qm> zn^p|;#dCxG1g<@uZrj{ukwA#9l`BQC_)#t<5+jLlaMzpg${YNl;6Y?LN4Y(iQ0U06 zPTh5T!0#&6AJ<o~b(4+&i-cf-vlLd|*OYZg)}=MXBA7;v{?ye4onz%lNCK_5XW}G7 z3s-5v+TFbEj_DjyI-N7hvJsLg`UAYU)Xpt&wH0CC0Gk{P_Wm17BZ)M_A*B+v)`C)G z3?BR>4v46X1up;rqWkRMdvMnPDG&sxl%SO{uWZa>X+kQY3>9znk|^nN&-quScB0GV z76Bny5<?*ifqjnt0`{YlsTDJ0ApxS#q{0dftjJ<gfJIDL(IG;|RdMhuc>WsEytuTM zJHi$fWviITldm!@yx)QU_O-7Qwzxu0Or{364SZH4CyG=Jt=@ZWg3DC$0Dw9gvI`@h z_H->=6F%Rcq?9LZC=e%)h9USK)a4$&lvNe0`l-k?sPXTY$EV@y%evZ|8|%{Z0R7uY z$PspC7W5bUduB{eTZW8tTGW<u-*}nBAZ@n0!+ah)V~0b5#2gXd?7n_AT?Q{z2lv(J zA`m$C@0uf!D`{7zF?DRPwT?!@*2u3f)f~JR%@c6ZlbV3(MVrS(T{iJa={vboWKrSZ z(IlcM!ctsq$)udCmkbS;Mk>RCDh;JLOg`ye{*S`_z<FzTZ|^S3y*@ZprU{L{r!?S2 z-7sgg#;D*#HkG@81M&WxOW?m8ui*3@Efja9^EL63ab-i}^TV@OY_%XnwYI0V)5M-r zgN|^@2=Jwz2V14csQ^h^$?Knvth9ilpSTO)_|3_b8M}Hd8uRA<HbZ#4SVS0KLXxi< z;~m~X-dfMSv~S~>_r#dS_xHEMm1Qg)e$XEi4<-*LPZ5CFAAlR%V|XIJ0YUbmpNGU6 z?=fZk**RzkGF~?B7VM;E5k4yWp?*7mI17||(<;uWp8fC5|M#hG)1#==R?`Jpn|+x% zk9My9&fN^wrXgS@^`KDElEXdi+t(OE@L{;l|4W{yxrn!KmmNK8K=V~ce@D)&NNR(| zxaQ9)`n5sk(Q%1v?w_S{BHH5}fpRg(et@(>v-xmi{9G^@3Q47@56WsFvmH4@d*M%S z%~OE8OFG7yhG@Dzs9H3)a(S|e>1)b_myq^<7_qSmH>nIa#9UhKpG}{Cq;SF9?9`>5 z{$m#xa_^of+eEqd-HX=zwd{qu``%f)0n}qViIcJmX&<tF7@l65br$^*%;1vsa0|y) z3*NogmKP->U4H*%ws;dAjv=S1|7$&}i82z1kZ#>ZEt-Le;2{lYMm{eJ1+O4v-5<-b z4PYNl+SCQ2jGH0Q*h&`-bdwaIs+m?pLPBH!Ql`<qBU!?HkC&4C{5Ur;x6odZoZ+ud z+PH49l_UBo$`!WFK@4roD;n;91d_ZwGF}?>XR?}ZD+)9_TRlnG;v&M4HfHaPj4u3U zx@P1Y=JRW?Zu$i@lN<g0jp!3mK(YuWv7+C`+anM5^*h=UrPZBnz5L>x(L9sSPE?1F zWPEWFanprLIybFZYkf+-lH+=TA4b^Q<6hVLm8{7U!cBIxciPDo!XB2?-Q55Rn%^0t zJtpQJB8yRVYCYnxH?9(#8V8SmBPN~ZG)D;wE~+b~RKk<X?8H<Cmbnp3fpTHN;7yYK zc>}Tld+&l>aOg{IuhA(H0Q9UjO~(#frC!1MTe91mvmifTfQ<C*TioCO-%9_$%nhkv z85rMxau(O;^usj(OE$y7JoU$i>>;K-F9R$}>FvgQ6-N4&Vd}k8?jQbuIzJlonio!V zosCRiak@=J!uHGV#Z;{Tzf%=6A)W0%R4y`^2k3yOv|JkmwbdyHQ@<)n0EO9(Y-m&} zOpJB@{wp&ym2>I)zQjruv{A)|cyAGl@xwu7&VoUs&QA?xU5*as*>bxhy&pw%&Dba8 zu*@uMb6d%lS4S+bKx3jmas(Fd_BYK?j~{mEVcfsJCXqVY3({(qg~MNnZI5La6?XI) zM7t@cqD%Kwi+4tIGFly0jrI$R=5$f@Xvp{#P#KiE)(9yG(T>JMI#Z^;A2@K<riJ20 zt>YXuZ+N%++_OplW{%JHN}EqvR$7?hO1%D=^(*%a#8OcX`1IpWSdJqT87aFfE|G8- zKO3@k?}*Ahnnd>T_Qts}rhgEXN-V=(WeSZq?dS{EK+8{<XUwlv5CSi1oLmsCDajck z5)4q7feH0PGynp?e%M-*YTD>Ox<wdN$!@gLP_VGU=PiVi7)IbVyhI|0+n6LMLc@0v zBz!U18MVMh1C9wYsaCAey_E4#X0|b9LKQ0BWy|r+X=MW85(mM*7Zp0BN6Ub{1mp_b zSiMoO)<&4o|78niq)HK&m!V9T4G{n+YzcyX28w{fZtRIA9ly^?v=?fl!^0(nc<Ihx zC;Q-*YHt|>Y)NE?wBPP?RyDC^_sj;1b;oF1(NO&#j>VvBXHp(fZJM!@4fK?uWPyI% z2)ra_=SG<V9ceH2dRJ@VaAjL}&qGTTEl?^S-?tWRGDL-TyH4QW`Tk50B3!v2SkdK; z+LU!p8w51L<QEMK3Xr22Mf$q=^1|_+8xdCi*08;0ea$jBr{lP-HX)*{{=6-Lar%M) zO!&*!iIkLM$R@Jm9p4(ImQTqh;<?B=KCMxpbqk~|oKCybE23xZ;_6MWv}BhZL0yU* z7*N=dCFvkTW?C|oJVv+L913^t_o23=fF5|YT{}>lMbJSWOiP8jSXhWR8*%6zjliCY zpB)v)X2+Z6)PkCL9H5kQyy3{Y1-uaywVu5bLC{e*&!3HTY?`%PqB>KPLcr>7v3r-S z2!|D7M5mdT1B7fzlAMmL4lDb`|G50RA?w(XCa#8!ZWDPA4@Q)hdW^ilqri3bm!sL7 zr6W+CL`7Y;6hW>&%in57VPGbeQUq2>jvzj^)yS*X5GT|PiJ8;kkWVU=a0I{i2Ns|} z@X%mu!!OMCj#_>sA`6=MZ~+v?W7S!_!JXNB<>t4n=0Q*p++0fnrw+WKep3wKT0tpe zVB_ro3}I4KX)6ZBcV>!bFct1$)sk!}3|-1{xGC}WNE`*TCM*>C{T5h^b=^h1dWC`k z;tDqS$w-B&l8YB{<76JzAcr;((<G=}MtqE6+Hs@geSg6_0*CAw-B_BNnURI^IM^_S zJuEE~W=->_<JCL!WOC(%>spn5%*t1L>6xkCwg0ky_voyV`01~Ev)N8<7|gr6e_*BD z5dg3HnSP9s{hAoW&;83IEZKM`cg<LLkGr<zxhWb}S};9D9(ij-b2(73_x`{9w3}2( z>+~v5!*q^3-l<JFhYPa)e7}mtkvo+i4>?oUB1@(XY5ZtR=03pJI3xhFVY{NAa)?l= zPT1G9YA&e=PU`H8(QSg2ctBm}s{SZvBvw0@^2dhdS;i@DcV_%U<fPHaDbF|zg+1B4 z8Oj5fQ3q!VUwJrSBLCbAExH_3K1mR&$jt{SYP!K@a^oe6Xa~gU4i&X%SEXRyL~z2U ziG4RCMI`R2=@ONDX0kl4ki+e^JHKXZU`jcEzOMZ+hC&wjro>%0^m4+uUO#@S#gUYw z{(@E*5~Q^LP612W2rn){B4ZYD4hAcDy0{k0a3O$KoGVtqui6&Pu<U^^F=*ZiYm-yY z#MYl_{ZRE_>roq|BJitZGWj6PKj8`Qw&I8UR}DD)36n|7Pg{D9LgM4S*D#rM+Le!b z7Zx}v)%X^x6@l!=y3ovc1Yv_fk<uOtg<{EogG<pNDbazMp_`hwsGT^(SU#bLot=l= z{fU=jXs*bax%=|jnx>Uo?H}(1Rta4QHKnjxiMqRfTC1~ccZkNg>C~TZ_ev;~v<V%R zWft2v4*^Yy2r9@liGf{sMX1V%dmX;Q5Ap4jdnkE070_s(;E7we-V)UKzz`U$wxB~B z?Hw%sTctR>0W+BPi10V0y&dRZo20qxB!M<x9neg>+Vf*?yW<pwX&8`cnQ-JKWhz$E z{`G5iHz?0>Q^}aSCjOK{6`nyHC(-F?rm2?7DWa%J^&u$&>0P%xlGX2;qG0I2sM<^A ztm<oHmLYb}%Z(2-$1jinV$-#~fEu@Hw4QMXJKpk=*84}{Hrq}KI=Ook&DJ#{5Sk8b ziVgH~nYZe+N+bq}L8AHad!O)dSxMz|A<9;jK6H$pTJ{G!cMYf4yEb_b7339K$Us@B z=90&wsgrYb$;@#V`?oJFUnY?(Tk$aZ9yr@dfRG{(y;CzNvU{U8o)ML-eAA$c_oBV@ zzV_7Wk%zBD(HT)Xu@ERJa;iJy(%kTxu%BKE7rh7J+i}MrnTFA^7k>0XK8ZBBwg@CX zI)wgGJf~nDLEe7}ve!?9;+z%5G^d*iWm?-T72YRh*|ng!ba6)b%EkXXCRyC=WBonH z+z!nurWpClqt^Mcl6qj>j4s*cV3T`OY2}4b=t6fd^<IRv_Z0iqj3h@q*%*Z&GaRws z-c}P;*ksKyBY>i!64cq8k=BSM2m;yaw-4Q?_B%_(R))kQ{J~u55y-#h-Y51Iyfsro zIE6eS@I(sbOii1f+nmilbQrrrjrcl?$9}$P)3v}=+zyOol*jKqBHZHBw~W#O7g@@m zQ33%49s-m2!J;`2n9bc~ol#1Z28{p#EFFQ#BzxWXDy~h(0DfS+^K)ZjIYbyz-R!De zcL9PfebIEE@esrX-~U@!J6*mtSrMNMMt@w=XMZFreKaTP|9qBXnr|%ce`uKyoTy+> zpL@=Xwd!J!v->A|1y4B;dduv_5M4GEMUpvWAUoF=GbvKvylid7RTxE@v4Hf!<k7hE zXKq#6Svg-*X^}9kZiDCVtgMd_!6^^{CBk@T%oLzPAuDM7NanS5(j69%?S6S@gEUw) zEVa0wjj6G(RI1!01N6Wt8J}YXU&0~Q<1Id>K^hk^2*5?BC$9xh%9s_f*2+X@fCg}F z9=@Rieg8y8<;9Wn*Xx3P(H{<_WW*fB1W8o-wR?1MC`+)sXxW2<6N&CaQn#WAS-k8X zSQ-6uWW2+DSA)zIrya4!FlomoNfxPn$V|RDb>gGk*&L1^C6l2*_!b%Zy(fyy@6CWl zRZ!5?H$>5-;UWM##{J_e_53{fe>S`O%4dfhu1P!e(jpVBLyKW12s%n3uqKkt8iXh* zL#R9IL>!fKw3Ewj5b1Q*rC*h!m>PpjM2;tx<M7n}-ysz;oiViNG4e9nIsuDN7g4cT z=^YmwbR}<}nm?Tkjm7V2mZ1z&E)_Z2$JJlHsicF(>WaO7?7h8unVnBLL*NG&;!2bl zvT%$(Y}aVntECbJx2Fcb;9^`}=C$*mYi2;1(=q2Kh}U`Ju%RWxFlRBy&WJ^XY1Vbs z3DJ_xgT1|5kC_EQ;gUX>V;UjlWH$T8Ot#*B&ekif_!oY4BZsn9R63F{b~e<%cEi-{ zWPgYtwtJ>?c!3!kyCX)@ge9dkU`*X6hAv=r8_6ewJUR3!p#u8<st-gdX~eFLC|4*i zx3J8*ynDALJbvd>{Ula8P4!Dj98T0-<Pe&@a$raOi_ve-Ik<CQ16w$L&tX9_4qX+a zmOH05^%nY;-Q(uXUtEkADQ(F>uJXnOn)TQXHgQp1!uy(?+2)>HDzQrwZ!f7*GJyKA zobj=wF#8zQeWkm1hXd@oI+G{;%rUWh)`8&&5blsYqU{ER+$3=J8Mcef|ADn~Z=P(8 zkDmxeJ1wI^UV0<`CUd1*-jguhbaIM2dZo)o;;nJfk8^>tWI(*jzi!oSl4W!j6%dHt zp36@tNfuMqu`sTwtKCuW)C0R^IPGkT2j&Ql7$iGXB%8VeEuO8p4bw#Hq|;82G%)qJ zFO)9nb>v#*giSy;c&OUx<9EXY>3N{DBn~w9AH?TR57UdDX;sx{Tj0XxS5<5uOWeFO zDYWG@5XsDfdWWZRT|~a1ANh^4%o*dFpBfsIj(;OIz+~nDI+fC82Hn9?v$+5c07|&f zI1`0&k_8iw_g%;4{x@n-uled>N4m4f@Hr9*xR>rnz^{fDP3GTWCw5nR4O_lTHp$(g zeP6*}Lx?`Xr^%d0HK2trr>gbIfM0p&yxEd1+y_{n*{336K1D!U3tPWIX+zg{Wu@1w zsf|h)lcb$~GHhYadnFH_H>>`E0ghdzvS8;x^>vx9=z5Iexp;wZmq~#5fW~jJQJIbJ z_9U#&Gl-mttSCrDcnPw%lwJJStzJpL_wDtONc6_&c#{*N&KMOohI5>VZC%%Si!h!- zY<BQOXfAo9qMR%RqPyKW$aP+LzqROr4|Hc;P6)Yu_d9!aCH?h7Qd|hxStvXLm7SsJ z$LrZ`ElEpCS1O#iLdYRuH5I5?Pbr8-5X)097j}&+6o3Fo0-yoM5)+bgNFe#FT^o+o znE7+EEg??NdZlNk=a6h{_}hE5$*U*YtY68P>dg}YX7~7T>sXl#MJVqHe}aJ88_&&G z%BCWIFnn^h0-`tNujOnmXxJPk5Zw}3U<1`V9OzRCxYB&prcfZvj*NsgY}6XkEJn+m z>HypRaCJY>I8)9gNM*aWE}@Ev^%=CVIXG%{rp?jM^hbxf#^Tls!mVMi;2HI!dWGU5 zkawm~6JaUcuP^}+u8H_XghJ~?J&xf<iB*#?lsTLk)|%<2j-!A*jZ;TF3LF~nFE6Fi zM;~wHZ)@%hcD5!{UPJ5lRXJDwNwP1brG*cST{&19u7>-5JUKK}+IX9W<_&^)Nl*#v zu(w}E=5Fx)hd?BOtRIDhTMk;7;WZ{@+Qrrn+(z>U9*I+17mQnMwgWr;n$yLFA4wWC z#7?<z;@Gzzh=;`)<}9C?e>y^$XLH*%*VT_cJanixY{;Od^Sa}lpQ=ASD0DGZb^CyY zaN036^_GaFd^E5)XVHx>YvE*??98Jx(@f^t&zPs35B`O^3B{mgVb^}cduRq?gz#1x z?4npH6@F{95GRI0%?5H4;_(Tshg_$sXDO_~0+WLa56Zm<P?gmoVCLG(&$VLjpajhU zNytW;MAz;z=|Qz`Fy2KLplU0Q-jam17SvAkh66iyfHgHEA;5{a`wWa+PCdewG7VSR zi~%HR{8ilX_Ha)tKi(H+eCq6UZe7O04br=W>LwfBE1dHblA!m47G&!<?R}-v=85dg zwvE-tvfg2CSvt)H-GBL6G^Jc7;-m#N7cFZ-$pf(}b@AHIS>hk~t^C>4oQYwP;1!en zV8nlA@T7Ul+|1v6|K^hBS+dVT87DQ$MQZ7~plD2>o(7@ej+2EBV+s~eT_FtJc4b}H zA}^1kkL)ZHwB;^N=BQq6Bq)RNdzG6<kAG|Kf-lclsPMCt?mL(~-YE)GiR6t6m13Q# z5am-Xvw#+ix|<3Nl+BjQ?PmA>G8rHzG!<W~UBWCP`CoJvdw?jkmOH&DwE*y&843&s za`87zV@J(q`n+u%+Ji23Eq_;2D(cNY0>k94eB1S#%*6Z^gHcc`;Tu$K=H6KZ%F6WE z_1ojS;}D)@uHOrIimh<C*{HrT-F?~E^87ZBKnVi{=J-gT9k&MV^t=D`nm=R5U{6#x zmdXK&py^-lpWa-{zNi#ZB4sA nYKO?&hiVf^6Ti%NWJvVJ9l;o$(wbPK*$$o~sJ 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 HNCp4^t1hY; literal 0 HcmV?d00001 diff --git a/packages/theme/src/client/fonts/inter-italic-cyrillic.woff2 b/packages/theme/src/client/fonts/inter-italic-cyrillic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..f64035158d7e4c01654e3f23dcd6e8299928a28c GIT binary patch literal 17824 zcmV(|K+(T<Pew8T0RR9107akx5dZ)H0D}Yo07W$b0|eaw00000000000000000000 z0000Qf;JnTejI@~KS)+VQiTErU_Vn-K~#Yn0D>GZYzoV0yihRy3;{L*Bm;yv3xXa1 z1Rw>42nQe=C3zL>7I?P<pu4zz@FFTxbtFRAICz%9L&^Ui59E-M0lfgF?<RuF-Ljfs z(G=5iLOAYHqgt9iQ;m*%D*AN1S6)&`Z8qV>UshK)MG!ta^L3b^d$O{#w!;WOi#caU z9epdi^~z}FXC1zMc;nw||B-~iJKZ7-`H(Kn3lKjZ5N5RqaHof~Lr#JsXW1jml58&> zQGi~|<S@Pf@P$OLR6IY=zgu>0cnL4zB|P8}0t5&U@c|JdMvNGlmzMw!d_sgsBSwh~ z<3uKERMdzOA;C{wc9u@*KWk~1ZrQFoOIvrA?XoRxnU;2`Lr2EaDbuDiOouv|*;F%- z#gKPJ>8fl=HUf*mFq&P*op#SR<BRkD-VMi|_rf<<EeWIL9DCXe;*Q&OTsY!(e{RBY zvHKGn-BQa4(>B5uMwrI5O=D|BV|t7*jYszMn6_y=vT5wbG)8zDBN(kmfH1<NF#`X< z&#fmpVDwn90{?K>b)al)=7_Xti<YY4Mo24tOrmXQgOkCCk~TjkNE}n9aJuUNfFYYC zXAn|M`uo09@_$)z6i0DvXWn&;Nnl?II>K52#|ESncdAW0QK2HvRY`_;WiO>pz_-Xk zH!T)&YR`MAJa7J@pNA;Ve=XlUuY2Z4Y1bh`Bcza^p&9I}QLUiMj74g|4NyqjXq$hi zG1}j&v`P|}Bqr@5l@eV;qy>fq`v}S<dPVQvQ9?+^T=IKj8~};;Xs-OXGrPf(EX%U6 z6>gHrfA#@*v!mV~$a+B6D&Jh-sRueXL+`%jr?vt30*Vq&Bs(79VL�!Z1%E;0yxE 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 DQ<h`1 literal 0 HcmV?d00001 diff --git a/packages/theme/src/client/fonts/inter-italic-greek-ext.woff2 b/packages/theme/src/client/fonts/inter-italic-greek-ext.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..00218960325a4636092b66a46e701c2bf4bb0466 GIT binary patch literal 12188 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 literal 0 HcmV?d00001 diff --git a/packages/theme/src/client/fonts/inter-italic-greek.woff2 b/packages/theme/src/client/fonts/inter-italic-greek.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..71c265f85c9b45b6a3f2df9a0c6aa39547501b98 GIT binary patch literal 23264 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 literal 0 HcmV?d00001 diff --git a/packages/theme/src/client/fonts/inter-italic-latin-ext.woff2 b/packages/theme/src/client/fonts/inter-italic-latin-ext.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..9c1b9440ed419d4a71ba46b0db3951164f9e10df GIT binary patch literal 63552 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 literal 0 HcmV?d00001 diff --git a/packages/theme/src/client/fonts/inter-italic-latin.woff2 b/packages/theme/src/client/fonts/inter-italic-latin.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..01fcf20724f915f68a974ef2fb85f86f3039b1d8 GIT binary patch literal 46048 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 literal 0 HcmV?d00001 diff --git a/packages/theme/src/client/fonts/inter-italic-vietnamese.woff2 b/packages/theme/src/client/fonts/inter-italic-vietnamese.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..e4f788ee02bb687bc1d5045483ff0d381e7654e0 GIT binary patch literal 8784 zcmV-WBCp+dPew8T0RR9103uKT5dZ)H07v)$03qf80|eaw00000000000000000000 z0000Qfg~G@2plRuNLE2of^r66KT}jeRDl`*f;ca13aUh<5HP?}0X7081B4(8f)W4( zAO(d82Ot{>Lo)-x#sL^4@1Z66za(%|6q8eQ+Z$6!gJ(^}bq0;sONFdCj08apl<j-F zr+oIT#f`tT7ONwXC~l|$TY1P|PNt!td(d50l2aojnKgKFv!A!Sz=A6-1a)K3+ayE@ zqCrK1eL*xtxg0T^a)wK=13}&6P_eYbyML|tuT+2US4#1h?$z#fuenpSt(81l-U^Ir zv@rv#d8`aRjPJ(8XsnM)f1LXGpYP}F&M+n;jtQnTvNjJ+q+O1O)5FPfl<sEjK&Xx9 z&>r^jN?-K#&i3_{-NOKRw33LCqts3fdRWZHY0E~MB`M9Kq3P73JDO>nrZmz>DYaut z$W&>Z5Q1t|%c{QrGvW>qa(4M0P9mpnR$H7Pu&<he|M=^7?(W<9g0EpnnPhpQp@zL7 zLeKlAX^KM~@Bl}$WT4(J0D}LWOUmdcJ>;>Po03^G;;MVIS)*nTgdU*W^Am>Pm(3j$ zgtL}x(jNb#P?F!;gr2f^EZ*!;G#1;7(a>Lb@PomSO$MW2$o=N;Rn_%BJb(h}Mu3(n zcQSVjl`bn~HY05*rH=M4fPg^?z(u6wJ5jb=YX5>Om0pxyr{-2FmDb9f%%x5lhAmS! zTQiq{rG~);EK%=uo9QaDw=_!VULzEpP>k_tg6aFZ+X4X%qiOpD3VLWuU?6lt5wlRj zCfGRzmpY-rA>ptNA>f$MEiCjJ7Gh)}Wg@%~fs75{Q2>g7QGy*(GqAw=crIKQvSLwU z!Nk)ke{5&J;H8y-4i?oYUwa?~eX=h-20a)6s9>#54W-7|A|RN)7Az>}U_?Lx;Fs+r zI=Gt;P$<#Xo@u*8jQp!h{SGQ5NQ?@UDhLXdDr2>ujh#c4YBiiZd=5K9w;o|<OByw1 z9EBcHKzKB5f>`|k^e~VC#s+tw3G=Z43sJybXx3Z#^dL|IH%6nI9L6ZhfwG28fewbC zDvV+jqZq{~Mlp&}*_(v*V~3)7d_YI&`%&RAJ@JgdI_`Ca1r%ckZj=zE4y{f_wZxhO zoI@{hW-TG`TfyNlj#;xSBp6-%w4HlPm=0TxbS~xd+JPIZq6LNN8h)eh;G8%pw>J{F zA#0}Sd-E6MzP|Yp#Sdl(=yED~R8qAp`MC=jhMjtv5s3yAxN3^PT+BxS_hF@8T}QD6 z4`B!Pw2z{|^PvjVt|Ga>Ov_G-3J0)oaME&P4ieBb=%%kwF&%ni_jx#O7$t)=aHvNH zNn;&$T>^BP8(Cdd{gKis0n8y<&7nH1aWQ%c0?Gx@s6wDxXK)B0Isp?z&?uLJ{g$%Y zgrbj~-voFAh+v@sC)7hL1Rw!36S^5ZpzbFLz{SZRWMyt{t*jT)hz<Y+fZX}KcYA+; z3kp6VAVfu<q!%6sC<vmz?JbLvegYd>Q3BxhtATYh)T{w(4Tjf{%{2`F1CkrC2^8tu zpTN!Ay;$82pl3UZ;cXFu3a8cK{Zc8lri3G?JQ0i{hX9QW<FRRZw{!coQf;j(=wgD- zI!_(rVG@DWq{?=X>8@CFw1znv>**QlWMI11iUT<FIwr#X4h)X;M~C}DU^JDw5+tB0 zwHxPoW|vblME{Q@JuN^%MFXI~h=6-n-4mkgIsF)x2_=3`e)|6_p!@0ZQvkUQ0I0zN zfQSPD0Sf}aL<_)-ni`3vNge>BLEF1{9WkJu!uAZpGYIQ$1CP6nvb%TaO1DX$y7P~) zyWqInU3iLuaIPrn09|N8t6bL%u>ctHXi$VE2JKgzd{4i<e-?ky3WOrOtcsB}{pJpZ z>FGFMybT^0nG_Iehgl-_*P+3J!-{mP5L2R;T^x;e3=UDjLycA%_^@cBg_jPEa?p%J zi(E+bXkrjxbh;gmFgZiMpaMq~>LNI1mmX$er#Vg(vD?}9IAO1oETZ=5Q>tH?0ak<d z8)7r8Qo;eJI3!gWRc%a-aZWOql!MOYmR4utmQW`}&1MVAV^A(h8G1#?BfK0YhA18{ zUKG6Nksa6wF$sK1^6gYOT)=QQDYVm~De!p#;6fd&q@Jg?dDXB-bv1xirhAT3uGjzx zt8ZCv_Z;X04p8d570_`j;Zq^sH33VA6RnId3Pwj*HY7y|Baz5-$Vma(FGbUl<&9)! z3Ta3u2q80>P=tjDypd3Pij+=dDnlq!+Bq{p#(6BvgjVkc!tpy065(dsTX%acQ-YEr z%BhO;$aeHStd7I#dJ3#D@VA0tS8MjY<KSt2t>yL~HLp$U-9S;d$3)$c*d`L))?q=% z7poD=+QJTGkiIw@&LJjWJEv(3Qi7`1Y+E=ge>a&Qb?o~w<a(K94OtrErmh7%BkFaZ zFP_lxtJsXARqeFE3A)H;D|C;(<BNO{<c>nFjOxAi<8dAnQODjQgk^Alh|^>Zu@&;E zRDE>xLbzaLU}%WlLv4Sd=(f6-`x$&WMRMz`FtCIzz!uc(10nx&UQq)(8H%k!I|l_z z!b&~Yq#2Wz{5Usnb!lkFYE#=t1Fu8cpc@ILd+BAH`87lsvi}t1D%x$Xpda}rh^bBa z)&_C^IvkP9lw~v`b9DuWTl6@1c={&Y2r?#J7J)Ffl*lheWe=Ipu_}X}Fn#}QOFLF8 zT`=Qt12#JX7Y0U^RsGE{x{G|h1uTfKpRbD}qWpu{Mq3&HB6EN-*|T|7;4ER;$HHLe zH%<1zzm(Zmsmgzqw<1F&**}QGIm4@z?FPB}R=TDtQxAR#&VhUy*hyW8Bg`l_QhWsD zR6?89CQs6@uqcI<e&b6cV5fb}1t^05(5Gsz-r7U4X~f}Y`VIl_ojnXny(ei!Rb*-m z`o{H9@A01*s)Xhn1gL^KzNit*<gpY^|Ah&Z?l#x#q|AXWA~GPewoj{M|6I0XH_}R} zI@uk<TO*;)kPpu)&YZzjocw^%g66q`4;0P-R-|Tge@|&R6%=&kA(}oX<T+p#;jo3( zZP?-_Q&%C5%TDS82+6iRPGYRz`tu}MUOvnYeWa0qZzNyhqpNpALT!b^gC}3M>w9zE zJ?meyc6Vnu-I5t(dOei5jxGN!%5w2P%Tj0Dtu`9g6HCsK!esB08R8ZE1w@|^+)2H( zcmkb2???gYrA#0v4@N6)DgAsA<uEbXbvV+YK#{+2>x%#lyixotj>#+<kECxjz3AwK z#LtPJF^64fY3+R6Q;QHC5FOIRo@9ahl&6%b)JTQT3ZLJ{(-*ioPu&MDQ{`pvk)n=L z7B32x+Af~VEUkRo)cfE-ve*TQQMZ@Vk)2^j^a>BExZkH5q|cm(!a)Ep3cQCjxn&5u z$PjC5({5S&eT!g?vMDj2!BqGu|M^v@*Z9(=_(Eoa!j}BUH^Cm`vm1loj&+bk4hePY z!cHCT8~kyioh*FtjYkKZW`XFLj3)}Ow{W{+C!!NQ4ciT>bojcZm1SVc8@?#}kwz8H z>yW`Sc)n$!$Olk3Sew-^Sor;-C;DgG1E%PGw?Klu?W$0B>e7SQYhpu%X=bWrGMspZ z&D=^g3p@aYaXke}cry~H=~mf%_F$VZwZyAvyM#4)_slBqQ2z}lP$2u*0|42_ph97l z%H=QTf;!ad`-}|z;cR|)b3o{?&<jfSkq7@TDL|&`<`uM1&&p(}v8RHAwwr>1aY#VZ z1(Hzz%8gPxPlYu*1!LpD0AK}y4bcJE^7zP|Wzm5rcvqWD1|u;O$jqFblD!{~3{h{c z%+d~&?dINYCTEjlT0%T<pv7wE2#(gWdh-Q;;r;-JGd;i`mKRO5-~<LE7!}GPy&#bg z&Uc{~Aj*l}eBk{#FmikJx%!~VJ~%cuI@mgpEp{Oi79>$cPnQm)q|aYVAo}54Yiyk$ zAUSM4;V;>ajE``R^OrnnatLQIV#0^llVyo9eXX%hp4txDX6lZ%W!Yln$bMF=x~;@} z8wpi)S6e`6XKyf{1Tm#J8}N;xt#w1rI}W(l;16F+V;krVDK2wt%fnoH&ID9QiOSr0 zzpuN$bA#D`=A_sSZ=|18Ls+z;C#C%AKrT6kNYD4Mg@AVspX|Q#c|&z$=e~P;7?VQu z=&1_VwG>ANE30@@z2n4i9^G}}DxcHuD5`jy0zzxW$??@;qIZA*pn=&qga-Wc2NHmP z?$Ac*{Mist#=qjhZ1A5SE~MbQAaEpoC(2+t22p<hV)#)QbqUVD96ku2cg^YbGR+ht z@Uq8#gV)X<h+4omqnwZvK^Mm(#__0U`7)v$&+XLvM}<4#8v(?Oo#OnStOdODdocjE zxXNKSa5cXeXN$|EohwF;D@KVc#%{LQk*LOxC7q`tkHWb#VN|6xD4dB@oMJM|0Y|xV z(XPCv0v<K(l9=Y~W_^H0)4YLpqn65JG+%Z8AO|WFnz&jdvA)EtN#I@-)63!t<H%3o zY)gvaL{V(LBuV<tSu)J;|Fp3ZYFL>WI-f7xg{b?2=chHAYEs8DK!1nt45b1BWl<(w zcqfHhZ+3FvYg{M1pturhnE4*{X9K{9E4v0&AC9n{@J@n~8jNc)WpHNanKe+bfOl@M z9||j(KIX;-mR=uK1&Tf_GU=M|083}OI6B^D>5Mf;=jN~q0~=3)v#tdSne8`CRCE3r zPzOLg9wRPWM#j1lWmD*)m<&1WVj0E@Uldm33}hIoG;`F;(JJWC|7?{7?b%e~wZv-V z0n~rRxBkE1fBye$>&U<Vv0(rJ{AU3cR{yk^-?$l}Xme17y}r$5)xT}2d86$Z!%Zny zv3QK*9yYJU#()g$Yr#X=<{ag0!Ad#ikOD0=mv;aRH#MbVB%P<akTP5J8%;nsEcI{z zZrxU~1z{FmdCk#WVG=oBg~HC902pqHqheQ(cHNqjexZ2c<hNC6*j470Oki1#|5nUn z0nr=|4kvRJ(qchM7Df}@#0)eW6%u~4c>$sNO}Nx1q-L&2&^eDMlVzp6>hNJPmHy_Q zNV9W&KVl-E4OLyK4K!rajHz!Xj<IuyHR~_2P~;u(Ifx^ohIr!58Ys@eI$L@&8)CXS zlw6|?7;frfu`#d!BZQkU&?zlHo13NX4IfTPih8%1_+}l+we*YG;Lx0`&4A&iI3jih zu8%b*{X+4?$sfEHOJh}e&j_+wP0gth)p9Q40Y`%t3sSPshxwGN|6~<uQI^Z9QC7=I z*8ib6KyzyV1ONdAkWwxL0Ei6$sN!){pK~mu6$7{e4rXx$D?~+(lZ$kneyl(0A<b%0 z%M_tv8DY{eZ5S0c1eb<u!l`gqcrcs^&x1F@S@1LPJMabgLj(m;hG;<?Mw~;i5sQe& zh);-Jq&!j|X@~Sh#-Lzo9wmuVN136VPywiTR1T^J)rA^HT}Dl!&Ct&15cCTA3Hl3q z55lklqzD;6_E0|52(h5E&>ai~(~miYxrLd<+{3)Z{Kg`5JFqfX9jq1B1KW)~j>G2c z#3|#9agI1Tj)BX?jo_AWPjFvw`*<>59&d~f$FuM&1Z1v*U`EIz+$56pY2pzgmn2Ba zC%KLTWJ#_B4$6Q)1prcqsv4dS^EHeU1X3paMIbvodn`$$@ejW1n<d9i%FOqKk-q|i zB`z);CLRPCj^!Q;9$#_XqWJhW5zvCR;Zn?Z+0cb_5)=%m$Dq@KLJ-uV$bkTRe-MBz z#{#i+Q8n<yGyXye4<LYdB6>UD?k5BbirzMWC5xdsn673jK!yx*%n4Fv{44<+(e;BR z^AmaWvqi59jrOCMULIzXh)guT)*pBaI04!xqG2K#2uu;tGNF^5)*09d0n)XWq0VMf zxi!m-2QGa#vLxcIqpfdvo=fw7f5!=Nl8%0mYFZ7p>3csb8E3qpSKBLAtuiSQufp)h zm?4W9UQ_vBv56`n;FTY{xI_W!b~!X{v)zKE<l&{`2tDzHo}${5VJySBgUz*zVVVj5 zV6s#!{p@W;XLQq6U;*3GvK{{0xe;%arAe8_q(CUQB^o`VQTydlIOltX&)5BGM-b2J zL5u=_J_DOMhgs6JF8NZQrJS+j2MuW2EoBr08(v@rY<4ZfLIL6y%ve>LjV7~rZ3M8a zx`_oxy1P*;NYQ4~%A`a2kKfbDVxvYdN_fH-mqWlf*&>XMP|F`3t-T8OF1l&L_JWph zQK$+m-O~Gx4H-FLFIAMBTAu*r_X4?=yW=QC4J;hXD`UaT9DvBqGL_DP9YSO{;V6jx z_mjEIw;L^Da~*8``aI@*_t&vs4Y!+<Htw92=HRyvLnu^LSmVYvz~;}AyRRuW)d?>~ z+Vp#W-_Kt=Y!!aA)dOF8EcNR>dm$j%zTgF+q!xER*9u?TI88=Q<88xO)F2H+k9WD# zF8+!X9N;WeT=>C_{ZuB33~t3nlo+=Woq>UBgBHmHlU6PK)Pt6UBxK({@WF;x+w;TQ zw#)gn$k5vkj^F3Ol)%2Kt~SMwcj)?psFNl!V!~cb`Qwi)UT8GxvxtZ+Uhg{xKpPgE zS`XPTGUFr*dvL?a5+_Y3|0GtT;Sx$*85U@`XcBO~v4eXoJJ}=Uc_-vxuDyP(DFx+a zfJWW9VF>G@wjd2d7cQbMD^4L;nKfId&Rvahnt>GqOsH0~3PTZiRO*eOj<l^2NcwNr zxeJ$;YYrSb?Dt<e*msP}%hp8+y)$SicNL21ST-o!sF?CtMP3sgo|Nbzu}5v*7K@xe zAK5?TYcDD73#YPEKW){km}vl86mBr#1VP|xJB4&C`oIU%NL+u>pC<@2QTgiO-j1wq ztCB&hs-o^ok(8dOR(#ltX(Da}Mo!f3?_1r4clbK$P1>E?L3zI#3T2q1RvDI?*L*&j zNrbLaVjYC!9I&)WQ#cKguf)$H)>7sAG-a+7ZWgqRCKe_5bD7(f0u7C@wLrnbLJ_!h zQuz0P##R?6$H1v!J*eEKfqkTOEPy~NzF<Pyx-vJiNT{tKwLB?=<0vxMe9jjrd>S*> z(4CcoV2F;AcpyV#<h$ph+;GyS%c0Xkn#jrk4ErBg-0F#QWN6J$<8qN*cA}vr0unYK ztR(Jd05uZ6+oo^M#m}ifMy*!!Zdq73Nt+5TCsRLOdC%i_85&7(b1^zzyt9$4@ee11 z8*jQ)EyH9CL9%KwY^@}YA32%k&(DiRTYoD8ZDJ3dyx?SSU<|f6TOC=(o{3d!F^eLT zPluIHq|X^kj0}d$vGs!_Z%UdzF%}y;eqbQzvze2^&a=K4ELabm!uLsUI4edQCVhxi z@HSB+>DR<srS+SMj<1H_rOBcq{lM3^iETFQlg7&$n89AP1W_qTOE+uGf@+&qt(ve3 z`BXI=wTOOKmFTNtZX%;!#&A3*5*`Eu&O7xI{d;Qi<HXd=k~ShCunYmQ1jz$D5B3y1 ziM)44-hN{$Q)8nP45405IX?+@t2%rpg{ITo<Y6KZt{5RsT8T*5q;y5lYDwqoVFk`( zFBc@18y-zpNs=Yr>6<MVzJ7o5T(Q$5@*LqwE`uC-gKUum5Of~dAWmACTlBi$C&M0) zT%WT5`uuY3zCF#v^5Uo8))y#SJj$fWi=x&&*0;|wr%PMSEw?F3-+pivu?(XY;$4_3 zYGch7Z2ra=3{6=iCAV@n&%0^Z)Nc>Y%i5S1!M5wYF55SppS(GGoStCW^o2`_A&W7L zv3lKmO`0j=#`%eraiMM_(*3pSX9nD)Ogr?QVWJI}LXXswCQ=P|&tR=8g7|3(vx;to zT3;x5FcmKr2`{p;!nqrdelW}quVO4XXtm&otnC~+t+NjI2J>3txOIFNX@>KvqhN~U z#-li14{x~;pMeFUPn8LPLaDlVpKg2O266Qo&+@`Z;I;qBa{k7|t3}B(ugi0SM_h-b z)njL`fmqa*+&Z?hhB4STpI<cugAb=xAIMN2`_Ci%?fy?|klV-i^3Ir_$ycussxM|w zr#=zZ8oFi|XC$~r_x+rUbZ*->t2)|-WM~iq-c#}A{;b<DcOqad=0gW_FKktXVX}<t zHn=zDK1+)nXL3pdZ-ULZ`oHR>-`?)SL9yobJQ`gA3BGh%n4wu12k~LV+E%WV_lnJq zj4~axmLR^>VjyNy3ufiLvq4;M;*l0JQ4k|7W|XYjayy6tR;YjjE1W}0s{#JzZzP{K z^P$xQSu#!lUmi?t$|m-o?pAZ_X9RT?iN!1x6%Y1&!7WOA)2#@ZHs*NT4^p^1n`nBr z+#J%9r)|yBe@lQqTP4;C`08WIo_CAicY*J^z$4!P1a3%dQG%R)7Ox4OAmVX1c~z1D z9#-RqAAKIGT?_JUds|wxL}@Pm!PwY`GxH0#9_fy{@YVn6K8ppZc9aLMsLePo7q4Rs zc2gz_^n-irz8Tpxz12S?jvq+W#%-Ve|IC?bVN?CdR`eJ$<iK9HzZd=Q`FS<#j*-<r zw&7glB6Xx5+n5;~W}PCkDoLyE1tZi(C1wR1)4N8~)>l1Nz6rF!6^+Y+H?bbZn0dmz z#bu)}e=&>YAFF!yaYh%~VBSSyaPNt4whFaLevE^2gP?<#do0#p*-!TQV~mWhTAm;E z`vZaD$=(+^IK@%m4mb@C*P!)_%yT^UIJ(#OSm_XVDC>LN>kxg-?eUUB3^sQbGmha` zRsD0|^h)J2(3Ta?0u5D2(+GBz-C><HcQev71A8^;4%)G!0cog*_I1y<Ier*+T%k}~ zsH4SYH2Yknne~*|(7YQq3cL$iEM9Y?)g_if;(>ONw)8V)a6tslG6X^>#bR-JKJ)q1 zL@ahs#Q;&lQ$hxE*Xuw^78pFJRz%(Ct%6Jy=LZ~;X)gR@U5|xg5i;PkC7~OJzR%+6 ztwwb^ZZAy74i2YG{+sEJBM@i`cn?<Ujb4k4)N(SXcI^bIxv4A`s~nvjZ{!PND!(7^ z9Xs(MJ;+}P0soP;8aA?*<T94g5RI-Z%WL_<rL&(TllLSCht%WW7;k6$M?gk^QZ|^& zGYlgL*NDCr^}<GRk7dEdgpI19#r^bOzQ8gZ*fBt3Y-O&?0$lyLkO3AFwn8Reu#E)# z9-2sVX+W3z8F_2ueST$0=OC4th%v2RMHVyFf++|Ug`k8@NjoWS(OfCiUxvSmCOVTX zdyii5f6MI<uq#u8QL=mngBRNp!b@yqJ06+I`inx8+q}4l^PhZ7xSO&R7B2MR-tv`9 zi#Z5^E#rQV)mlBDV@UQWY;c5V_yCJxXYc|6B;+kY9ssI@p#BCX%Vmj1?>2OW-olWs z$(PuX_IThXgTV>jNC_T=YO|=K6pnU&u3yY%iyrK5h*^@9ObH)`iN1D13A4wpTYu<6 zuCz!>ZyWSMsPICiP{_vP*@DNKXek(^!Q76~_&wo~f4ImgQUg+@kaZSWA-KS~_&a0z z%4)HUK*3sl>#6Tm`E^QJy8JPe>pm0`o>u4SQzM=T!z`Jcci$IY{N60Ce_ANYTlU>v zM-kuT$eTbYO5%0gVD)Tep~cZS+YZ`C^GhSC`7W3HaSd-wbv1xW*gv=U^@h=|ICyop z2Zs$FmP*TWAH8p(_HdUKzP8O>6t*tPJg#TUU$+ok)OTX%X3`yxuJG}*Dqfq-dTX@^ zPqo#$%Vs#U1qYzI6yfebLfn+I&g12sF}DADQ?vD0bG9~<nfY`PbnU+Pepo?sDrgqy zugh1$8A)boaV9cZNv~_K$LM442BD3rB_#$?NK!VdbA_56hFfYVg}qBfj6Gf)MhhK0 z={8(Qvx+QcbjZR<E4f__EzC;B>;|K1p@{bQ;P$=?lA<15Hu-$hg<79$kyn`ZF@p+J z122<mPl28)9W+DL>TX-7vT0kpeIUhkyE+otOO52s%0lH#WrA8s4rXkS8=YGi>=%;r z>|`)WUS>(>HtRgly#eps*_<!;9IxB^Ye!<1GkGwg|7xxYg<VeIZR;`xRc@?`Wf;~Y zUuTt^8OjK3yXSZ=It=TtU60H%ob88R-pTWQDwX;^qQue=^3V;PQ*Z4^rYbY*>Z|+W zo%X=~efRv|!sB|_4kD4mfuTSo9K1(6JzgFg`yf}O8nsB0z@^enOei;$Z&Z}|xiy~l z`iTnm9ofES{!~VzJt^U>tK_GtG@rikbxt(SXJ+IWNWlXXN~z~ErKVNWuWB&oa^DFH zJWp^Nr8QYr48z#{D45Lo%Gc|(U1;S`U4I^XZ)lGxDQV4Woo(Ty_pQN0`}eue%nbJq zylFFMR6<f>kV>cS^Xr@I;n{rsdcKr4e{}NVN~wgGcvLm3`N@PZ?+gs?f7jEVOU4&G zPyU?KtoAhXA7hKA<f&LP5p=uTI|B?TwQg>9m~^**G|2L?MHZe#s-{ZgQRulkj>lvV zb)*$FLgRM5I%L5LyGx6d=PY!26}jDOV<Yh9OWXZ}+`z2HGy;Y_!Qd3&9vqi2P6RFZ zCV0b~wLX=q+v6&pRjuufP>!G+tflW?d-Ey9nQ|qfOP3OrF|`Wh`rI;V615~;2U^jj z(djgvjsikl{9=N<+F&U=*b~8cm07d9Xm)1>mK8pr16(h4-#TBJTQ890t+@s3R@UDV zz2|7?#Ibv2Bz3T{tFRwCNc^l9FszNiG`y;`Qg0<kVwSzzbghj|o~^9mCGDJ}vD@;^ z`tIDsP2#<o%<S|WNKDn=uHyYFJ}ya#|0(9*G@VXgV6#`Ud4xgzEJaIjy>ezfUW6^u z5%-^kv}zaDrIY2`?x{JMv8o-?#-Z^xTDlAeZ2icC+}_#b%yt);Nia5=bTl3PQ<>?w zWS1;W;%irK%JZ48iXI6oR8ovexSbjFI|he+Sj8|-gM}(GHRr>{;2;Gb>a{0=9X+FS znV|!atS{f$A~oY*T4KOC5)OGzjwHsT&R9HQe3o0#L*YECgmvi~jxH-2zf*15_=fl3 zA4t}Zwm`dadt5=<j|TwFJpZ`0dLyj1@yG6J0Kmq_ALTF4YxE0F?l!NU0Tk4r000E| z&#QbCe+GW##`VTqL@>SoU#QzeStBd#ylxdB)T`w1<E>`%CB3#RVVjyA#jWg0W}_Lc zc&t33^-9oS547IH)i{Xx=r<=)#eeZkT^iYvh*uvs6JS8l*KFFAFxU0S?3Ec^?;6A^ z{6|~2g8dceomy5|S>Ml4f1A6XULa$tC8e27@?F5UJn;2k`J^NB5(hVVuDLeB+ldn_ zk=2Fw1_Z!`=l~uv4G5;X3T9;RHz+_DEr1ZL`v`Oh`6zHW;iFM0F*1Ymso-+`Na|Qm zBo7>(bv~W~|MMBJ*z_3@VlsEg$>1|l6uU1UG3~wr3Nq{~WKZUnL_o-`*cd09mJ&B2 zCQbCS<f`U~i9#1J6gzCpAPh-`gVg=Fgdqc@n8yUiV#a0UbJ5|$Xxk?#K5LPI)a%x+ zUM5zhp1pl)Ri$+q;?S=<$QO$n@4i@~8kHQX)M+pxF0Fz{dbCtz?RuO}DG}Oa!l|Ri zq5z)84PET@I^B>#aT7-0;TVjz6?u&x#~H*>BTGF)NtGD-;+-13VKkszf8AIy;(km4 G0002QVTgqQ literal 0 HcmV?d00001 diff --git a/packages/theme/src/client/fonts/inter-roman-cyrillic-ext.woff2 b/packages/theme/src/client/fonts/inter-roman-cyrillic-ext.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..28593ccb8a4d849a746f2b970678fe426cb136e8 GIT binary patch literal 26600 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 literal 0 HcmV?d00001 diff --git a/packages/theme/src/client/fonts/inter-roman-cyrillic.woff2 b/packages/theme/src/client/fonts/inter-roman-cyrillic.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..a20adc161f433a7c4e3d92306301b9228bcf9fb4 GIT binary patch literal 16780 zcmV(?K-a%_Pew8T0RR9106~lZ5dZ)H0DY_g06`%D0|eaw00000000000000000000 z0000Qf;JnTejI@~KS)+VQiTZyU_Vn-K~#Yn0D>GZYzoFWxhOFCMgcYgBm;yv3xXa1 z1Rw>38V4X7&~ydchCS#Gz^U?2)GLZ$;~)fx9VPq!mcYpnq1!@L^>;{*F0jecR$FUZ z6iO)D+m7xk=GG~2u%_f@f_0A}M3f5QA!I8ybSlL6sOEWg@rZ{%r-XO@6}qY6-9rwk z7S=XGl3Aagf2VfteNWPp^bim65V8@r49{4$6<ZM5kwJEzK7eo(EMvvN3AQmI2FHqn zKXnPlt|XwQt=d&PY(p}%rJ0}7VKa2AndY|*+p;O`uqm4_O=v<hY@((ll~Wn3iNYJy zsYK)wI|cNL?&`S;JB`c%)m7MWhV%oUc)a_1oJ0I~4*vgJ^S^zny1F}^*BJuEZj1=8 zFXUHtT%F{7P{XWdjY5T>0G9{g+&}2us@F-2(Lo2<%nmyfcXPAsEmOx;aaT-TYLA-g zgvewpb}BVR-ML%T9e1_+XSTRIu8ysxt~wvE#THu(7?>6s%t#g^w%AI*C@r+u&NSFS z!?YO379&Qd#efkr8h}DK?^}Y96T(bDG`ag0NywoDEJ20KvU^4sLVzaVq0LwZTv|C` z14y<Mrt?W@V8P^^=%-6_|0XRbcSYg9occ-vQ+qM(#t-DcxJ~#8dyhAU|L6C|x6g=K z4dT<chf-t&m_^-Xb_>1JvebUtkK*Sjex9GxKPxfB0|W^&XiG7#GZLgqMUf&w#9A^4 zW+iy=)FGciT7s+#QV7M`LjC>~tH06w!e2Ax?^P|^{|Jdg?L}zEBROmDjx(eq_hRc1 zV(lsh-~$j6AyVM#mLRo3yaZC>4oHYziCX!nWJ|kyDQ1We#|#&!v`Om_QWZjOQ|_<7 zqO^<JohuimbC-**bW<7r|Gn|+Mw?W#fOO|1?|%xjSp%R1(r<63B}{N`v9Au!5<>Ag z|LxCM>gQohx?AS&cd2u!HPjGABuD`9BFByk0|5i0D0M-?X4I1etS^BES`g^zkt~9N z6bNJ~lV}D>P(cz{NrEb0f~~eA*hz!DjYD*TB-l$5xJZI}3Z&b9(r1+npvb#yl83Nl z2RnI^NS>jR=NyU`K_+AH?@ubOxrE?5zK?(a5HSEGfL9XQB!kX)2>@jCl1u;sGFnn> zj2C28OX#Vbi5JWktIZxrhY<h;K(boif^{4@ARr)07!HpZSTqm-I!O3O82nAaFm^{y zT{?%|U;)6Eu5$Ll3+G@0GPef{?E(rNj7bVWNMO1eE1UrIsE3Od+;q{{(S$a+OZ0Pf z0K-8!E<R>IpYTimo&U!G5i)?Q&yyoK6r2DWv;-31u6PL4a9i$7$)2F)vjovc;xwPK zkBm6fN#La>Q69<uKy#b&3KIZz6oBd$!3pS-xzEE7@iwBzDw>B!-2$zOXy>J5lik8e zjvr!tgI)_mcek^UQnXpzqIehz`x2z^vtH%)_`!k3m2{<9hw^N84vueaRwueKS$3HK zVb)5CK*`%upy*Rb{-fw<4R%DoIZ>ilo*ZRa)D#}Tx)+(E&Z1l5xQ48UMoE>6C}TlH zzi*VptQV1_u#IZ4I$*gm@*C|gTAPwGntNMse;D@@02GLZEstc;mQ#|djM-gg+ZvER zs*0x>FbwEhF5>l%PyLvBaHKdMIm=jls)CofEk*ltCopWRZAp=ynu*F6+rJToloGhD zK$~G>vL-8w2Vjjj4qt;E)-no*zrxzjk;7tzvejc<`$O~munh-(`?5rjPvLp#Gx!03 zQlpT<(il36?a(U*@j5wBtwtSH=jYIE2f)zvu-AX$UG+dD!}anu^fqT3G1QWWK`>AT z`){B4jRWge!1`BdxMP#wk)vBR%!sa>ViO7q%y$S%s0cN|5n7^%Fc8IrK$H+Btz2Cs zD>zAuy<{a9xk<gedDcT6BxMVtkLEUwR<)1rOLw}<mTrdtg!|cPcT&)lYc4uG(}DXI zP$aNW6a`d4EuOvz-~f^V#+GzXFhl`00Eq&+7=yAQqfi9JU>14Gs1mf>8v&(?o;nb& z1P*8i74t2qRtys`mCQ;6We6lqC^V_2!A8isXLc@nFa|`jzFM)INiB@Dl`AG{3NIK? z5rn0wAPyMV4Uk-g<)=CFtJ&wbEP<?#p;$2r1E|6X2?S9S0YGGcOjwdR#R5<xLD)Qn ztr)b?G7L_N1lX~A(GnB_>a48K2Y@a&VyXcm6N)nbSph9zY&D=zMFA)~&X^R$umKua zfIz9Wq(Y-07+_SAB+mqiCZPc*V^Z4i=ulZ5&?r!ZK(A1$vKm2g^UV7Jb~Zlndl9dG z{TXm*1!agOP7zcBSrT2not*}`8#^CBU{HJtb~S_-uBKN0VP%Tl>aaPAF-fwx4W+PT zC!&!JAZLJ(R%+2<uov!xpPl^_5RKmgNDCO~>eCCg{s%XQqbgms+dUoGJ$TrEICQxG zMBnMk)3xV|Uaz`Pf60B_b<26H@|OEn%^mDc^*!5C*|O`A`&r3~`<3%u;cC&U>yzu7 zC1=eQ=W4&z|FGp<#frrx+Y}HGPyj^Xzv5jWpdbL|PebG^h-Z;G5}2DHbrY03fV~fd z`+#@|=!YQm5HOE{{y0RR0P;y7o(Abz2)+RLOF+K_p_d@^Ap}1I`70oPGKd}80|O`k zvX0Z}<`X2jxsD7fgkn)4F<izJ%2f)jL{!<T0J{~=RSGn!^tnLMq(y`DXjB~jkcYR> zs=LU?<YRQv#TQT*dL75=R7z@aofv@Qq?cw-zYda09CB&H)?l7NiKL8}>d=aObus|! z(Eb_0&jmb3w+NBZq5y*2@ssYZDSt(HCWd%C$xKd(XvIX0k&ID1=KIDy>8TE-BIPD( z_CQR^vqsx!#*H42Bi?w@T4REL_hSh^%I6vYB$N)oSV4~h;-2P&&Snj{J3XGHHnY1P z!)kVwqyjWG_X)t8NfYy)mlj(EU`PsfjNF5CwC&d3@(kPZEmIF9=~9&f@-qO`9~7&h zQMhF|zt-e8ee+2;*$yz;WQV=H%U4l>Mv@64=$4c=l$dKUW^X7h*&vo{D4X^M)4bA9 zzE;w_!@QYhj3&#RnI#+m-XN4>8N!}CKkQ%50E+FvCVM*iB5M2a8J`c%Iqv`f2QAuN zaIacLFhI~|&!&sYT-PiGvNU|lqD=TKD`V1VRVh8pqGIBP1e|c*!9E|h-#N5hj8j-m z?qg-+(C#FT%T-<6Al|6c##QM->NUMQy0C|rAL4sQVgVht+3q_oo3xulo%1wZz9(V7 zhb*u&+&};bC<sJaaMFq;K}q7?f*B@@iGcUTk_2<eSV!zo3P}(lhsx?`JDA`VR9?qe z!Mtc#RQCfjB^JPwz`X^-8z4^s85G%41*;$sWffA)?{c&EF$@mSV#KhU7#PrC068B! z<I77F@RrZW%oZ4+ToGHE&l}5>APD}_K=6e&Cg$;KP{BC?g{T3ufjydYcL~iWrL=ww z?w*g2hcr<_9i%De_J+;$Qfr3MF%jYK3z18KVF%zLBg{$d5E$Z@g)0sk?J;F*&2o0$ z$J_b3BhpFugAWQxEPI50kn-`|*{|(zO2er~RJh3zmng58d0L6Cm7%JHf+g*001fN{ z3<f{O|3iDa8`%1g6nY#|2nv;S=+)U{=Vkuozr{z(Z0$y4ucq#+^?#F~y=ImYGB1y* zY{fy@aZO>-$~`D@8K>bN>eLXqS%<0OV#<uVs+C#sl2~VYQ=BR?M3KuHULh~}M^$oR zeN9$g&3`osommsq2^^iTG40h_Hoak?vBBcvKnhe(F6jYxP>-dhVPU)emx68yL4kx- zrDm#&DkbKFp$aIx?5tL?<(;+&Vte$~g{7==_hVK-NZ(+WjvK}=P-xy(y-(e#DSesh zgvL@<k6UrnpCam(IRPjzH`{&?6txB|J}9heI_%N66GH=?nk67%k83JU`cT-uv)2>m zlnl*)X!#s|9R64angj7!89*OraXhRl@tMbTw`)|l5AjPbA>Tkwp2E_AW`QZLv`t~) zuPkx$rjB(DUr=D$l0PgY3+>Vh&A%OQ90)BfZ-UqktPE)smD6*5a;nZw)cM(I$LHp| zVzj($J_}Yu?nec(4ni3eY^UedZ_!n{wx)z7ciGFXU-h{P&eqqItJx#hINP}-8<yjD zcdNwcI_+pe_6IBGeR7ltU%0azT%aqXKq@r)%A9P47z#*_BtDcmO%_Q~jcG|LVrhvh zkNn*NrV;E~pck(-T${HncFPw1Nm^@W#)fhUtK(4TcCRrL0H9hb$7pI8432)kn`m|c z7g-raDiRiyG`<QW8{`t2y?ro+P4S7@mH)Oj@)~Ao7_Tz|p!^=olEa4LunxjD>R3?( z$L|Ii9_T@*;=(=cf*L7i*nyWG^DW4rC?m5sr;v2sL|W-eb>(&!UxjUp%7!YS`4sH5 z9se<yBRG1S)j?^ggJL44fqQ^KIbSi4e9>-U;oLr6;DZ^4KbhWh@y*{K*{D(!+J|1I zVZ?|v?oP|B*)?bG_VCDG-NjaY{w~+hcCM<ZXiVc|#hT?wpR&&$pX-Od^@%oX^stUG z>@GNqSVNqW@|T}FJT~!ZaixUWxJb{(L1$d2CAM7~mhwnq6&ZE}VtvAALfp={(9fMa zqZTYtpJQtsAGUgUG~$n?OB@@E_FWQVxlcoDElE2?!Wq-~#Oq(GWIy5dmNr!y3$)#3 z$E=P-aih9_1uG^+j!2JD;p3}A6XN<ew?JDCo1uviGkq*QbH62tvuUGNEyjSuty>&n z*!vI?6y%6ZtyunF<8_!dOq{{g(z@s+p)gcWHkx`mT*0*`>-s>B^s4j?Vsm2ZM*|qg zcm$9T%sa~vazY$p`60k-&gn9J9xhHfinHVZ?0p<p(=@E4PvcM!1tf?t^Gxk(!SA&! zpF6dT^BQDd{LiV`Z#o)F{%>CK_46HUV<uJ*7Tz-!kuP~6#qrNav_=&S4bLn>N*+_9 z77^9n7&GJ;GH5o`6D=dt6P-3>Fl5NFF(#@*EnK3_ss8plqI9u|P`CB*Ih_s)K|)hW z)uHO&tF>7~h|fVB0fv6wLz1LdCQV~>Ht0ow1kk{_5S!z_FkYdIFYCRD&!|~#-aLPf zS?3-QS#$9?FZ-Pvm8a~^mC)_SIQHW~W@fp9ExmeB90g<3d@jW-jDds?KoCXa4whXa zNSQYcn+SqrH;7^&$piti>x73GgaxcNv(2ZAzR-AV=9foI9sV@%|7X)xz5VXpt2?cE zU&JVRZ8F|#G&9p{WGdzcABYmp=7VzG){Vi!hv(xO0%P*?1&5EQ&O3UN#}DzZBtNLU z-X(ju8AHxx_x_Q+0n!%>YoB;zlrQ__UXKfj&mQoMr2f_Xg|4wR-!%yP%Eu>cOZgkP zMj%}`LjC}V1w<)t3qgYf22y8~I*g3z&<jStt#l=J81141djoD1bPRKcDfrW;V?pO1 zl^lg8!>hl=lsu_rg>t)npIAi5mnid8PMGf|vD-R3Z~aoe<MbQPy(J>f`hldw!teQ! zsW1CCF<CA?Hh#b}V4+kP9oX&vVmU}Bhn%5s##^?<&Ogj6^IjI%G4)?KPTvTA_o*wy z;o+kWsnl!FRVy&9FhK{Wc&<EQ8?QHxI9F9#JYJ@M8B;CbynriUFVz3ldAutS!@9zD z{DLv<qvtQZ@!OvVwaxV8giH@7Gs|X*qyL*-$V(GHZ>;dGwTq6RdafQcOuWVW!@s13 zE>ZtZfB%E7{$9LzUS6&Tz5M^m-Wm=%G!6#?5->5@KIKK}-R93(IWX}E6ZQ{_ZY13c z2pcl}Q4lA9VT{YzS05c-X@ADZW7|#9N|Ks?_W3kRmh*e#FMt4yKE!5l4fJ(!QCt)L zb^g<F(sT!gRrzldeHZI1_n#k)XUkD|BuD0>7*~>CJvyR$T$T7t_I%{@fX7%D^MaG~ zC=CaT*GmdT<`-I~+XIM=jRDfroh_Zv>1YVV`i})XKL{jwZBwVtCyN(YJGyh^8sqEc zwV>^zLiSIAepedEX5i|~3nq=R%h?m0AQ^5)Aa0_*wsNeJu?<eLZZ7QA^{gssDjQ@n zE@TH67_2(ZT2IZivufw%Q~N&KP8*NCan#G~&8)gMTFU5LwcFbJ#CrTmYtGflf8#sW zaFamEhuFlpt<smRZBy*&ZI#|{QJDO}eZDG`z4K?)a%DrpOp;7f4f9E$#S$sm=NT}b zSTardk#qY9NvDqp5YoQv2oUQ5K*EKnaKAPiyv<>fkVORt-`mSkw0Im5pOZ>Q<AQpF zs+Sj^Y+^_x;nFA#_b)Rn+WxeaGg<Q6>6pLJ=UEkDn3pq%U!As8g*NqaW#8<L@Kp!z zQ<aS1PJ&%5vmH{4W(KrU%%~isy{JAijCH;rEA=pxDg`H|&V*e7|0}WWZ(?9-`N**p z*0gtGXH<M_*Yf}l7jZKL=fhf~!n_-<pN)?gJepjI3l`(s?ta}-@Y8+8`l>&wy7?Q8 z7D^*}FG*uJ_$0^2z)J{bQeA&{nc-KbKgyPtW^6mgvS($1$J#z-S?7Uh8FNZQOTw7A zK&7noKlqM){%r*$`>htva9Vx#q(CA7hV}<$Y-*PNVZ9?}Zu)YDeu@4?AYHz7{9S$# zo%a|V*jpe+UkjL?iWG~dJ`0##+gh!@=B-y{Nb`F$i0L3aI;0qGAnKQxEo3=k+Vikh ziJgMWumgw|D{%Uz0VNSgrq({*m^j@e$JQt}pp%ze$T<e38trn7MXU4<#g*gR_$-7| z5ugBPKrGVXTc6@Qej545P&(RJSjb7f3q>eo0&tl~`<Kl%0i{kF6=OSp79UiS?V&)N znvJ%p(RuR#Z5;Q2C6PEMl^OY=-+RGn&FOT8>*-!AH_}$3p*6I*jb<f_bGVxFZK2`z zCHngr0bI5n!)RFKIgZ}hzT;=mQS^QR^q()k|Dy+ckm4#_TV%ON_`Leb$k-{>GEg1k zS?%Gy`!n*x1FjaPHP#XEZhh0Ghi3sH%+B`z1nKKjLEinDnO;32Kd$kT)w*>{wZ`4M z)!MclV*WmQ7)4L2ULW=fb>1`9MV-n*y+;GFe}0i^9YPD4$2jStf{8~F>DS?Y<;mB= zxuX3WziMHk@QMdA1vuF`k*Q~!bsuN#%o^;LDn%I<vUU$I{ZQMjIaYaTwXb#Sbi35+ z$Lo*!g@3({UzV{0OB0B1Ng#a7QD}zz0T2+>0Gjkl%6KIh<SqGQ{%}U*oLb>Z>$iU| zTZV7NKdy*ZRD3`_R-t;r>p$gw^z5@Ae_0(k-u#u<KNvXhixARLa-z&%m}|y=d#m!< zt|fDa|LD%9YTw@c%d(!WjbpAK_#JYUu6_WO99;VA#~((?FM^(T!g!W#^9#S8o{~E7 zCX%!9Je^UL7?fI6n6Wt%C~r>+4QP)kXM@KCAQ9lDRUiNk5wk8}7v5*?m9_0>GnZ)b zHXOqh`8Hd>M|pon*q9(r&|1CbLE1S)5x0aw+D<9C&<)B~1+x;X%-X7;FgA9K$?0gS z)7Th0O|}|R3;rgCc14zyPbK9ZJCaaz@Dgc}RF<FZA6k`_U(lC^yCjjythoOzs;y%^ zE=QP=Q`H)6pmYw;40LbtFRhuw$KCAwE~556jCotoxk^9)#<jq4$v;$h@iaFMXJ?aD z<myhEj@7s8i-m9kIr)T!SgS~Xr~ND(GFQCh)G#Ct+vtXj+zMcV%XiKOEaB3wd=MH> z06O}VB*4oJcKzYlSQI*e9ILZq1U<1LIG(s{E|6kNOGwf#G!}wgjvUDFSh3HaIa_i4 zj~Ir%e1=i~<NQf-Jb>VAUN9~-?l;w<g&ZkxnEsey#P3~8t*1D)$;o~R#-(tP0DzYk zXD~7M#8-2Oft|q2-LV?&em=hu#VTGSPinJSHzf?eXM+|d+mwrS4Tt<|zdC^Yx4(iv zC;2W!K#~xkl8LmdHw7XToM%*gQ(Ck|fdaMUNpbelHx{3D>hI>`rG3>&8GQ|<0?=~< z)P+(_zl`h{OONG9#6FsNPQRAO$V%H#de}xcc;sdP^Eew!7wL880=n>M&sf*G`}sGY zvfiu7nZ0pkA1>yuPM*-_8Ig11Lmu}dsj~Ko(L%lVjMH?zkI}-Dn|OB39}OSQ2iCUu zT!cIrx)$(9wo{J3WUw=H6tyAPo9mCv&}3_k59d?)BdOO*65ws)#m(7qG3A#pi&2WR z9GyN>R-Qe*9(^qh2w3X-3x2MP`P?&T6MZ6F8e~s+`<dgzTVdF{E{4O@u)GSO=OV;J zU`TkhF>iL92g?aLqK(7$J#lzBEn5+wjyJQypMRb0K*!G|hlhJ58~eWEefdUYAV|5i z&W*AO=3_2VGhs7*ne1oDNektL<%tVVldrNDlM_Ni{K7(V)g;o{nT2VI)oF27VP+Cr zRLEt9hsEt_P=nwLjMS?605o`%T$<SjunskJ0P(8nx%E&=F~&5PmV5=z6-9t@Z+vDm zTU5Q&OsMhbXM0HgyOL-Bfdf0RQ_Jn%1Ki<#W%%dq3c&!I|2_O4EckW*iwQI+r!!RV ze>GBm_>Rh<(02}SCmT@N5>Oc*mOT(t?8#K2xY`v`svc_epS#Kb$SpGKe{!-zdGxpV z1tZ?cn}~-08tT2%LG^F@MF@Ze0KGCOKmgF#I3N$GN0Y5pOIz)n1ew}WV|S5kioyYm zv$aEg{3r-<3&;(ckd7$@NJXN1!DImw@wU4|)a^@$+I%~$Jmp;6$~2iOLj~w+*%Ssy zK1I0=FanxB{6B-_FiB$zwMelwN1_lwU2*no095^IK&Ml;&9G7-5<@>{S<h21Kmj+& zE5VVVnokx0b&hxF#;iiGLWsg01k|&{yawu(l<tZj?buGR=wcHX?x=dfguqNzo@Bul z%~1*BBn3#_txDMY-zlILAL2Y$<RBqZP5wasOgfM!kzXONBCi|D=oWgIwiteF_?_YZ z3?CXj%+Hxlw3gk^9%B!qzuwlS`Zv|Ywm;?g)GxLZO|hmzb58TjRK{)N2D!tg-<keo zGU~Oom3E)DUAkLlht5WKTjrk3k_;wmsZWq)%Ccp<W&f2XpCs2O?<$`t-y=V#Ag@rV zFr-LO^is@H>{B8t-J{f`tf$OU{=+D*a!LiM{-7GH`nMQBP9|58e^c9|HmbI&uA+WS zJw?4z{f7FeMzBVy#vP3h6dB5X%4N!ernY90<{PauS`W2Vw5zl`wfnWFb#!%3>iFus z)%m@08`VJFNZmoTp&q0jr}|Q(sZ44)l|${K4pK$FB4Fad6L{Ew;5Go{U~Gmx0LzJ{ z*ti`X-EqJIv=O_~r1M)!-N+%?DoG~NY$2o_C{l!JL_*RaFu7wRc8Vx6$9a@xmV49y z9%>M%0mSBjHtabhGz__LKU_0z55yN{&qtKPf5r1N*C*qJ<)Wm`)Q(=>ZI)!x)wk!q z2||HF!oFQ5$t<b=s_Bn!-`10BF)t7sHX%K~AxM-?U)*Uv8-NCzJ(?hG!EruNtBjWX zNGNnUQwb_Pd@RxgKGgUx2Eh~flwudZ6D^*vz{7lT%p3R$C9$DhWi{5@xAL+n(v?ak zb*x+(7|5eYP&o#2rEhvWj63K8mUmD&RIMcX-JxU+Ct)BzH`_2};AHixLOZ}g6|af6 z^dFy`e5HSO>e&wU>bf9l3c{M6qy5Jeq#ZMS_4gM7gdtD<mJ{L%1F%{iM`nx*lc|+! z#92;<wZFXdgK^pCP@vB%mA=G#uG0}_Wkps{njUAxpM(2=ETRCXiE(~7XA?hDG?%rF zwnG8@bi-7rH;LjESm~t@7TLHW1)pp&Ms_vRZ<&N_x;w9&cEs5)QjlL9H)LmfIfqhY z-b14%6#Y0;2VO|VC_%+B(VDLG6xc|jF#t~;yn6jnnL76+WF;&(hw5~K1~ghUS(+V9 zxIqZ_F+ymG)QK=rbqmE~P0UO(*}c7cWex{xs5Hop_^1|TSC_{UMV&#i;Yd3zpmp)q zxGG7x;=^b5ppg<vW$;Q=&gQ^b$uqfCN}!0d680ls3gGY&j<2r}`lMI>Hm_Rpfbh>- zhUIy5w*$OAhDGUt7rk+VVU9bu$Pls=cd9-RSDO2J<T<hOptJnlGZBXpJYuXJY~T6m z4G}PKdkk(@MVuH8H-o|U16)H{iB-fs1ojCv@VJER2dIYKS?WL_nZ)bn+7IjS#63$< zK-+6~*|>=w#EiJuVI)EB7Y~mR0aQgH8I5Y#>!_I6m92^m{UA4HhaxN<*adsD5tu6= z5=u?O%c5n0SxVT)CK;Ea_SjX@-0fCKq}cORM?lW4fVkaWIO*t3nv2$zahx^<Atj(; zdt)&RwFDg*J%}K9T;SkFKvIsVvjMh(Z6YQxHb!7#luccPR$Lx;$rg**oxnz)-7v2a zkShrb^I@~q>UH``Ib$S&$Z3QBb*!#Qk?S3>H7r4d&#wvI$9LffbgyDcr^O}xMX{AA zuq1N7>U*eS^=gYXscv@gvi@$UA5`OrUK>YsJZ}E+O5S<_ma}H0d-L!nEZ^x^r@KAj zvx_uoy6o8WPeobJH#y{?UXZp>PYOypU9FrV=S~NxmR&`SqsZs0arU1Epr5hWh`}`` zi?NIS@jQIG#>6R3@abMJoHei??zUh8fz^JDc;K?c(DzSg7$)^_hqEiH{Un`C0&Cyy z(w&Yw+6D^EcVBwb(H6pM`{6jPvP)M065F>OyPcvqf5^!u<SKpBhh@8X%Z|!cG5+f| zcch%777I>YidQUh$I3TKO_*Z|V({}+&T+f2B%VBtXNSeU4aHVhqD9uBLG`<;y)Mt? zYCOlDQ(tXyDDG{XGilOvO8=%@4Pe9qhp2J*nNJKZj$hnTa|i!to~3d8OnfQLGUH!M zvdkap+l+_!uT^dP9X@{KZbyZ7;R9U73}fioj5trHLJ%RqIxPPKK@FokLZSzT9{i=l zU-pMDSciBn)0~5D%}*Tc1K3}+j>mNAOytbOhW$i<03nzPZUYyNT!xD;9Uq(D(R{q4 z@6?{MG6xS{QA<zU1>Cv7Q_|==eWHEHelzwo<Hv~RQTE2SUc)DYxKERuZZM+Kkczdz z*+fdn=q{b^6__{=2n$6~lxlPb3^1Pq+ea&=`QRc}@3~2AhIJ~fmYUfiHgPA+o22}9 z;oxWX+wYV+Pv~-zFsW4jW!7IEj45LQrm9%fZa^@+ppLqK&~m8BhFNAac((AO5NuHm zGi3p}2(loXKOC3YLvm|2P!OTXVR$-dE)AaE;2IoMnG9GphbW|USI)G>F7LI;1<RM) z?c;wKn>a=ki+|;XXOFlCRi!%2|5%b2jP2CTd+zBfzwT*FdkA>H$+BOs>6f}9Q_A$6 zrzw9g9|G9eIYgY?EmU?N&28_9vAw-@TGmV!-Sq72zI6WFLp|N?JCS)Es|;N?@p+hI zqOX+*9C8(Y51w(H&pqwI1e#{sFr+wR`DTO|W9A{4lF}VS5zQRMA08<O1$pIi^6^jY zfe;<YtEs1psB|&Uudk+8vO=X<*tkU$Uhu-KJba3^!<7}gGrlttFN(1ox1#5InEy5& z?=z(7r-w#jv8$6S*84pKl*hq4E8z%w$N*z@ceSLlmD*f<>|(U0t1dNv(m^<w+Nx_N zwdqXXS6;e23n|BPRT}oIjY}t;<N0<kg3!I`wHB7T9nH7YxRF~Kzt*OHPtX+S4faTY z3rxT^6OmNOg$VQF(FWn&=8}V?X@^*@F`zDB5YAy)WxW|w<H+0o3N|s{#$-PnGL$x{ z-K9#`wdd^8)$Qz%TP0Gp1a!fpdU<X~r6kWyn$=e~?@1HVbmP>!IQ>qz9KDfw*W`G5 z>!IB6Q_qMi;dXn9jNE#GkG^_R97>-RUUxJ#v-A+Ibi<3Gaq{^P6<OZyNg=<G@9RxV zTLdpH_;E~gqJ7X|n<t+ZU5LRgUXg*RTq(yadA@^ih~_k{sRgcvPpObK=~VF@D_=^w zESEZSN4(HrGwHLmZ!G*d1h*>Cqw_%-Wa^Z@!E^iX^E|d!P4XU1A0G{G&q;fK?8VVM zGUh~P6d!JK6+_J`17`DIqDT6{v&@e~?-u;x$OCYwt@I09O5A1Dco(e-H&)42R=a*6 zclTmOvcI1YBV2Asb9b`kex9VfaED6=b+L}r8eF63dJb7qf@}EXa3>toEs2E9WkwwD zCYqWEq0-mrh7_eqi{+`OfH&0cX(7AerMGfjF%md#rmXNL(!Q)6nB!3@dMVBAS3JMU z0?$bBglDYgqEi0iR@pBfW2|afvnxcXUqHUey<uKTdJTVDMq|LNu{x^EneyFmfjMO} z;0$~(yvsSNuYum1FE~TB-Cny-PH;L|HhN62NXxHSbl2(picYNC9hc~j@v<$rHG{t) zOmlqNWcgqq5a=Hf&T<@=w-mC+cxl(#s+Z{4MksJR^y?D$U~JoJo#zNFe@WExSZU}) zRPi9@7i55=u!AF%GL$fcB0X0sZ_T);dJ(0OkaH&AYtMg&nc+B!?n#!%#z2wLtY~Nl zU*IqVnc_CruyLh6J{+jbNZUL5AEWs!;lxfCzHIFkihZcADWv@-=$u8%nzqZ?7JSjW zw!RjN%q=7RXoU~u)>b?8zPB|Ych*JDgQ6i0>}dwr1$)9qd99{?{F1&_$fE1(sddbQ zVviv?l<*>ioj5n+ohC%>fm<n6CVbSue(|*+Nb~9~j-!gFS1#z;l=Xw>Dlv4l8VJ~a zLV?h*^T2uK;VWP+C4`cQIm4?ft?xA`51;WXIFbx^52_1{2Db0({0XY+t?K&w;Rtwe ztiUTLXf#YtE@Z3PbsDM)3k+9q5A^68Ge(O94-1o-x)AZ;rjkz!+mqFwB@<`ecae-d z0NI{hdV#(59g6h)Ix6VlvDPnBTBgzZD=ysQN<I5}3ufp#+xncq<lLsMZQ8hB&sW>* zZw*l&%ecSKN^z5LmK=H7N8lCQCRb3|Ordy-0#>bJy$})c=N;T9EspnnnzQARX@^IC z#F2?ZcDkVphOBKa*Vq_N-FzhRy`+pxOkA35#it$=bw)|9TU;<z+)U0#sL3yG(DH?V zuvBlZ&Yz+PJuogxR6}7g*hk?8yD2%lqc5Uf>xCiz>lnOnf+Sl|KxL55S%rNs95NXZ zd`jZ%ipjXsEBUmvgqOo4j94t}H9T`qR;YE{m`Uyy<9e%&{rm;b^I1Jlh~Y!OLTHfa zN_CLMC=+nBf+n4dgLT$I7sPt(NJ`@S>RG><dN}@b+%gbT*K2H}-@O#yDpg|^-gA^S zeXgE93K1is9HJR2n8|R|s=R(K%3oLSt;U%`O6+wEJS{i<iGK<vH#OL+1(s^%kn#G! zn!EqnpNtmnp>YqIT6n(UHCbLWLtF0qsxR$Oh6kJ(`!~Njb0wXS`osNWTedIiRb^CG z)ELmr2?w^odi&RS{((^Xy~je1VwRchGH?a1*tIX?<dEeLT)1aQT;7O-Q+Fa#8-*=U zlPU+cXz|_!hiSIVmA{sXt=<L7I1C=cf1i=1DKzhpCMVKbaR(405)BpsgE5XNcnpCv z)euxI1NCs=f49(m{F;0`erpA#HirxjMJo1y2o{{41jZhO@?HhQp@tXNJ$9<7YIN>i zW>^<#`ARaaJ(%JGET&YF<uSihImuqK0pk@DVGp9)=+!JTm(p45tj8_}#)i)J9m8M% zRG^K-VXQoS0Yr}9ZaM(V5K1YtK)JqQqIYm$dnSua-QY0{2s70@UInXI0nYn&Sb67E zGGY>xA4nCWZ3w^zZC1uW{Jca_uBxkXg;(|l-fdk6hk3!~c%j1V^U`VPZd83cN93<p zJmpBC!8-}cITB1mOoBX+@1xNB(LsY773lNC$Kr#C8al`dgkX^cUm<SqzDaCI5oFVm z&xPy7m{0Ll@ND@E?pPM9q96o}{EUmh9C(_ebR1MaEd#lN(XZesio!Wp>KZ;k8ywA} z5k-Sp<k&Cmo)RhNtFpJwo#VDz{XMs6jaeHNgdw|dHl{o@EO4F|p?^D8nCq%iy8R$V zyle6qlw&Dp^_eNUkn_@<=&(ZXb`p;}tu#?b_K>DU(i8*gg^cv8>58r3@ub4OcK9&& znNhG_@GxqjVK3B&J%{D^HbH;deaX7Mp9Z32&^3D3f90mP=tF!fe9&>s;W0m~7?~A3 zux4`Z+_2B&&IRlyCT>ODZ`DXBg;?l>VcO7-v}Qn30>_G#L1tGZ60ycSW|dPuxCY~C z?DBUN4%cm!9{5w@zZ1rtvV6t&#meNl<WGXd?0NM9b&xFEE37EP3@yLU#)U&u66$Gb zRGNvfsu=R;V@pEDU8|Jb*$^grVa2RLlE*uQ52#2@jC{T6)eDv85(eDOWOD6mKWohm z{V?c|#B~C>)pp}^FESGHmRz)CQ<j^T9}jkpys#ed$_q!dj2%7w(Bc_Z!L>KWID{e* zKl&Jl=Nczd7`2WWH@A)KYebMQNnqpHcr{eH5E61_)_fc#_p$9HX1N4TnjTJg-%wWH zoq3G1+6~rHwRoT!c1E-&qYs_3xi#$fI(6%GlvNp~MUmFlAu`Q+Aa;zrmahphCCG}z z0y;PaNCP>ruFkBkB;~qvNr}(}C+wTEUKCkk+*V_on5fG3DN%xiKzSk#3FGD1ut~Lt z^w~RQ$7Jwk)6g@$ICnR$+9l9SPld{*PkotiKI(+q(R~t;(U^h;-`ly|GZwjNukIR3 zZZy16I<`IW={p?5Hpoa7<VumKQ;?9Ng;81J4(Z2MaWTBfnnjho_S9rB%h2Ymek?e! z!lJqru+Zu)v)Gz);Is#GipMZ}LAlH|5U_h%IHb%+W(FBD8M5dMgDV0I4KYYRMg)47 z%cAX<j&2FyG8%e^0htqU>@rR}ZL~6p8EN_CWl6QP)wre$ha9MQ@W$csCm3+r!rzVG zx!T-w3Y0SrGE^(c^j=TXYZ)WoQ$z68k4d}y*m)BwN`KQ+4l<RVZ`Oq)xwdDZEMOK= zPkIOrVo#1)IJf22l+CKueNbM;QIPc{&6E)<RNB&@div3ZDl2gyO08D!Ua-VQuPQ$G z<Vh<1$x2qNv3Y#I1v0vrwKa+&9%LO)ww&U?cq8!73%Ie>R)8mFnO_%}^BGtC#DqKj zsiy#o)h5GqQwNXI^!m$bKqyP4dq^G;Stj9AG=8NZ;#|?4Tyy-|5bOl!Q)paeVE>yJ zuixF^`PGr0)8kVsCQkBj&{;$w2JFcfKBqLLz{vs59pkEXIBMN>!gZuKW`^>ZM5d!Z zdtW`z?~$Vc&(G7&wYjulSCXV=0YkS3u?<FGz^a3$>AB8{)D=lld)i{-6PoSA09a9! zB<jN`npXR{!Su%4iq<#x9v;#i*l(fqWBXEI=f|+_sE+8n{A_-oW*K?lXmI*v@s=## z5^klgv&)(w9EcXb%3O@b#l`z;M%gp*+#7yt^YFXJ@_is2fQhJJi$(RuJdj1d6AoJ` z#8$_dU*-Gv*wxOjs4TXaZYMgBN?005R{6Fi{)dz67Zr}n4lp;G4b^HyKxt&|)2J$Z zkS1_g@rDkBQbOZOJnKuFE9kUvENN6`u^CVCKsqhymA4QTGzl<Qaq*G}3mLv5rAest z$!IpG+=gXY+b->KcMT7hg+|U}vzwa3?iA9NwU8YOxVlCk_EUe9%nIY1jhY6h-u&sQ zo~O3G8DUww5+pR$<Ya?B2(vuQNTrHnGGz0281dWtJ)GmyfzV<hJya3mLr&;A)?bV1 zN#;O4lCIsxUDrFuUVgJB&{BLk5DdB`Aw?iQV}x?b%xHF?)ML(gUC=xM7_!T2#!4La zt##8!NNYL7&;vDu@-U%}4Z;T(;d&|EQe0kq^z_+Es_^O~W@FJsOswGNY5ZZiDfhK$ z+tA!**v=}xnAv82T~lmx={kl|amm@3BGK7PdcsRJPY&MFJsdE%Gy1lJk(0+eJ3Cs= z_^ojfQb#@`AK)3oaOetN^y7vI0U`K(z8DOJJj9O-Zx3$$`;;`bC+I=1m?YyBl8~8a znh`p{ZKsQ_T)e>DZi4{K;GtL2NFf*uT7L}E3w=)T^1||9ej$q)%lDowBv7+?!~e_6 zcszLNdUHpKLJ3`bQG#^v^-~e2b!6fIi88l~FM9Lm6MHiTpLhCg92#G4-riia;MU$E zJu;x$YiIqmr)3SK38&$5IvWV2QiYy+r>tk?4QH!#k0}%H{}!~+`zY<I6<6bID`zn% zE2dp`3^`~1cLV1&?Nm9xHj#2pv)(xnqSww&jcAV8Y}G<swZ2PQUZ-*7v%9{JWLBCG zp-{>4HQ^z+>pj}d`krItpcjKIlWE>kp1b;D;pG(3ut>NJ1P>G>z#yH|x3;marSq~R zL;vRLF6aEH6Yn@{7TcvY7MpzJ-Io7Gux(NgfmvRle{GAcfM{0#20Dza>wY68gnB_y zkAgJ@M*v4G<UkjjZFXkRFW+->qN>XI4X)`m2=nD26)6BZiV(G@Ty$u}XRUVqTO3f; zl$&n1Z!3uto*%&!O~d~BSd8#e99SaH<!OI5l~?vj6p^KE`JS?ZB$j~Ag43~bnvjuR zbjGxwgo%c40V9#^vHKfwB8nr>L-<Bq|G}NDLKMAqV|?f^Mr_*pY5U4ACXe0&9{fhe z)6mlP8h6`rnYfQn+6fZO-3I)|o^6F^n!A-T&Z<l{+r1Hv5?*yDo33DH!grYp_O+!K z=QM3~9crF?rDl#UU|LZ$TlJ--H2?`qw4~U3do1_FAWAx@I8iPI9G{*IITYnGXUgv% zPX#c7_MnRCV>anSvoo>S@%fTGiR>b&6=bY_H6g4D_D(vTPN@jVlle&rLPv#80IFF* z6(&zPi4Ef`is03;Yl)>-TdbQu6{fX&xTKk{8((IxfidA)eHGUfHqattu}<eve4zMp zXHahDW0+zH2QyUe*x23OdME%A3Xv?fk^$>56Nj_t6&cOl)314;z(c99T~X^aD*%S* zT}i8&MW3qMgsm3k?@ylWz0=(o(r$nJHfzmqsBl=3<MoN>E5F<RL{~*D;`U&)HJD>C z4}slCp-}ONBuqFbDJWZViA5Txy)XdJRI&3dZ^zI>%gR7!H{Ch#B|kKv1tW9IuOwfs za6?s=(L0Xzb!rQD!p#nX%lhLF!L)JY#CacD>5el$(S+Xh`_FjM8;{o%bTGXUAm?5J zp=8Oi>8P}3JtGAmtvOl#z7l{p#t{Vx!xCo=l~F=4&;)3r8iG@tBMd3+UAJpZQu%)g zArhsZ?&Q7|@WO#@wtt6>Y($LbGLGyvsHZ}`p>N4UqMH`F=tsCcmF5N|dR?DOePv{0 z`KYo(KCHjecqmmacJ0H<Wq4oxxMD#4Q2qpmA(BsWxpMl9eCv^>U#`YWH{!v#xm%m* zFprO$_g|ZOr9KygX5Y?g$38Rr<;qK5O=6C-sIRVM-)RGSZONPRxml-iza!0QdpnTT zfM2X|3^FW`B2osEqRjcbQQCbzsWgdfpBD;g?$j1%Qo-e+orc`*Tj|W>Z*$k4d%T8Q zANqsEqL7)n4akzOv3qZ}ByFgsF|M@rKIf6Rg<2J(s)a@}<Y*1y+Jz~islZhmELLtA zI9&d|D*!r{HEy)K?sNxcM(s^+w^_VBF$1;~+n*Ubf#Iz(dV|U90=hCh84E6TXf|=J zoNt-q?Z<uJGm;2sh|t~KH3fa`@3)0mc)v1aLz4}uNDv^#P3{oi8iTopnUjtH(-o7D zvXI(Hh)Ooa66Sghpb45Qz~xn(GR27BSS$x;S^0aEuP`I498iJMzb8bq^Mt2_>+)k~ z+GLuI@rxP^LZx9umelc-Y?2q%{VJKCjkJP9M*PYb*gb(ZE0)QY7nPNA6s$4Q(GlPm zb%F-gFA3j(?}y-6HqwtT=0EIJ`2P0ZZLOW*cf^z#wpkY8hof$rK6igIs<<>eJ28?9 z-qO?9TZ@D}ATEX9#CmGYa7QRRJj1KW+!n9e8x_oiVdA+A%NDU}PPz5l+NLp%C`w0O zDvko#g-WKTBGbFwlg;I=drj1A41O;T@_=MnRML{GJHkn)Yr~}8-b;RT!(;QQ@<?#| zKW8oYQbQo%b1@uUb_z?pP|4Dqc+yutxqd~_H{&Hme16+{HoK8qT*z#oP^@|grp?-H z1?UqsyQizW4!c|lB#pU*4>QYkje2^bGk(Z{@u;X*SZSw6el@?CiO*z^T?N$*%{NIT z;UEi<s<JkaAOQ=y#gSKH9zbJAd;73X3rf4(CNW5#Pzo*-S;z!pR*p%LFf<tPX|2Dq zrtJ1X%v$96-23~s+uc)B2lB^9oBPE3anOw~L@f!=37<)&y!`OltC46<A+3zXqMY$h z(I`=_SS&b7Tk}A32rfs<U0dfUe>nEsSGJOHMS9!>o^q%zL;qN@UB>YDmoQc*S8YQa zH`RVqR?x;E{-aRFmT2FiD?l0<Ij1?Awu^<WP-R)!o2dam#^{GB6MjBn`|Y2KA))jz zl6Q($;~<bMCaK@e9Vrd;`I=byh3>Wa>Des;w^AS)B;vBne6ug3N(qCu@!P2Xx|<2{ zUM#$xs*~qq7D3YW984#)(xQsV-wz&dkfb#npZXC|F!(&LySwe!``5&*_V54lR-Uk^ zZT-!MY_=$0J~jH`ArVf=TbRX69;!W(qZ5m9<NFsw{%*)QtELMM%-m2&{jItAbQN!k zI`nBf%tFb9uxHeE5{Y<7*ctL7iH3WE((dg(80qidCQslZ8w(HGCc`VliMZ1g@<)T3 z?x7(n3F?xr6P@I3f`E4ZPNEo&6*G55d>5OYM#r)1uQ$9v8>eHk4No~1i|B5T4kL+W z<J-S}y@_%<4eNc|$l<h`eb4DxGK#DV@Ndu{PO>v13|^R1ldoZGyFDfEvmz;Lh67dh zv-2Q;pa~9>tmyBok@aBWN4~2w`s~JM#;~;(8D#8j5PceKenmq>5?AsmT~<?o-DrOi zluu4pCV##nU0zuK+9s4pw8c`&{ob_bp6C4?8)VO`Poiw*%d;Vb`hC-tBJEfpn=NVV zDkG3Lr_t=6(@xM(b+o7;v{UcgG<7K|p8+vj5Ho>^$Kv!5{36@B5>{_4lhVOmfC!f0 zHj*Pw29#JKbWF?v)I7{>xR902Ec%Latk!WInzIminxD);6Ob8@$OcDSC4;R(8-EIB z4RuI1z?7UKaYg+d5yKT+Er!pHND@NMNv=?YOAG!<RY$DI?=FlpL@n-bhL}S!Q#e21 zPNx_C`}S_ttNhqDx8(+z;uv;xJ>n`K@mg%XTn&`WixU#GqEKNlqPVPm1mtwo+zK@V zl)!WOhtx8RU-u&a!<`ad>{`3Z)*CivaJhQpKro@r#7Z_J%{d4=%t9<6n#1~B{b3n| zdV!&TI&CCmWfK~pSvQTR1B4=EH+OeMnES32!GCeJ%Gs~~oVtoZwb%o4-8sPv1QK}z z<Iox=wwi;`36GS~=F;&!TS`PJob6TgQAE}=@ynY66Qh?Z)zdLQX*h<sbyo5U1Dun% z56>{AY^xOoE;BbHi8NjArzmxc{?dPcH(Piz#ARY;qViqR#Khd=Q}3nE`osNC3t7kz zj^#df!|oK!8e}*jZR(1_-3D7exio%B7NgSApN9W-eCcnyRHWvkNm#V^jTfR-*@$W& z+ei<-6Gqz*5w4&mCaIJbGq-zn6pEv%dvo67jcbvnJntZOkC9#BGmB8|IAXI6E|q$3 z+rWA*zZMX3;#308!i7C(_IleiulGTc%GOg;!%^xNze*KVl}ujh{_)pS#MR9zU9ei` zM2Oq2Af2;;7KdZIP>^cm?l&vpWxt3^(m5vy+(0vg^D4?VZ9~mAdCC<(HDoYLmzQLE zpEoOrPYT@KW2K)yVE%HxWb#&RuI)0f_xS+0>RETjKV01vwwM<Z6a40LmQC*DG>sB{ z&iv&IFI)Igd;Uc~29O~wn0;byhT(3e6qe$75`i;tS@O_}I!`d;!aFU0?}fo655vvH zu`jwkPLD0#`~JbKvJV#*dK@UBDZA%k+BM(5MjjvOWcvDo!9OD~>NCme_7$S~R@8S) z_k$)B8tKWkj*TykBG2eM9kJ-<wd@eXYr2OVZzLv?O4ZI$v#denQP`;pkSiKkFEljT zQyu@YlQ;ytoDs=fhev@~EYw4bq1@%-Ukb=aDzaE?o9uG>Ry{u+EZ8w*uHv9VHSSOs zK~9X{a{WUAsw;VKgKN*m?=cCoYP=6aa8}{)bWjur+x+Q7@WiAg>|XL|NwP~st>E@R z$|TlpYx?V~5cw+Tv+UJ`A91^fy(@4{_Ds?$XEGRcW;16-D>%Xe9SGKJN@8>~TfXhV z;+qp^wX7oXzqULse6t*Ml_8pXrn>7)GWoNs-^nx8x#_k$IgE$jr?M{rl}90+e!Y>6 zrj~tID_WI_6(nle5QztkplzgYRsH*zgihBs2#sbTYP>}l8gJ7TrgY+NCGQa9tjJh6 zX4K8|?%91X*ahz6jH}?<Ai@Ma#vuo*PGN=JW*3PgxkX6;hjcRI1i!e+!dXM>f5PC* z70GZe#Jm#m#emauwCJ@3pHaxB^2Wxum|u-NYgW@zLnON*bzV;~)b~_V(Z+aag@egv zcpm<Vh4CRg?Wt2KGTQ4KTc_n)G5-+MdFWe5d<UJm8ICFPu(&UWjbJ5IyiDAU|Ah+l zz?2@<c`1$pcF1_{pUWBHz;-+@6pNx~#B!lWWZ^EG`c}Re0mdG%*;)g(7^_${RplI? zE-}jthlW<e^+|`{+!{KJ;k3TXX49;qX}isKhktd>N2_)z<KO!++B#f?k!ollFo&u6 z+QF%FqHBJV;<zy8aWSte!-J=~nFS}A0nMHH5xWnayigsi7CdZszk)nxkQ>I|3Z1HS z7c(%Ww&mxHie+d{D-v1iQKHPsiTt&S0LP5?>nS&{<<DY7yFNj>woNkCT~l)8Zv+lb zfB*#kGH^)+uN*`(ByF4|gv9QmgDBl$_UmZ^$q*v)9jbsiZnr#n=uf7K;nhnfZYh(` zwOSXZA7p6pU|P0T73E#=wO_%BFocO)TWvr@z#(lKC4?d~O8u<P1Gr=>kO38cx|aL+ z5YY_MP>*s!*^o4#en?VhW9}b+65N=o+z@AFH-)UENjn~AmjO#`<nhe<X`n%JvMt&I zRrxF6_zToHHQ-u`boSekA7c!&Wq|BL9HF_Q3Ox8+zYOX5Ij|1Qua}TKhBv@jF(e!` zgw~KKSHn3aUK9++Z!XIcG7rc?8Cd}!02uZ!_VWMm+{wyiH%%3K0Kn2OFP9}{PyN)g zgVi6Z007jWh}sG8559wy(FIpJcQitP`u<?ZLZ<73E3Pj>=K1tMsvU#Omc6uf%G}Ks zSMpGQ4_z@blevfN1NEH<@1!k2reiTl3Lth`*}36rOF`92_pi4;x)r>Ant(7;+qS3# z;t-ao6r($~NucV}px&{}K%hPg4R>v=sL5A_OqYdhCnEzTdOuu49V$D(LT70&SOiy> zG%kUw=ODa9*NsaEuT3L{eq;tdo3cPm+FhL^WtssSAIY7a2v4nv7U@DqdanRcmZ7Er zWC5H0ZFF%v)WRDQO0-K*sx_mb)S;oJYRJR~;qI~I??v>Hd3dK30u&PaTsIj-=2+*1 zi_~kd0iUc?n**xP!tdH*)Rz<#s|1LppO)A(NHiykMA0n7f%S9sdB}*K<9|_Gkax3O zm^{CoZ+g45?L502drX3P@s$kV2Yy8EQ|1AYtjgY0i8o{rRtq33DRmR*5Oz}-aKg=C zm&j<g*sa1|PmEIMWsqX<SU_$8hb4CjlNGm-4qqyz)nIUoc*45N7$dk%I8x;<CuYaS znCZv?K7L4qMkbPAO`fy)bsU;ixB<M@!nZ*3G%+-4eo7&`iF<nlU=qI@eMBUl9F3v? z50}f$)2AJ^O0EL2_TA)g${3w|_j=HvE-XVylljAUR+HQ9;!ta!20dh0UkTXfxL}y} zmiep*lNwhbSdg<5x3-Hg!~?wcGI;mh#LLeECOn0K`Isw{n<^F2(^`L<0RR91JUTf| literal 0 HcmV?d00001 diff --git a/packages/theme/src/client/fonts/inter-roman-greek-ext.woff2 b/packages/theme/src/client/fonts/inter-roman-greek-ext.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..e3b0be76db2641253744aa613469eedb118667da GIT binary patch literal 11808 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 O1{o}0SRMEP0000Yp_Hru literal 0 HcmV?d00001 diff --git a/packages/theme/src/client/fonts/inter-roman-greek.woff2 b/packages/theme/src/client/fonts/inter-roman-greek.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..f790e047daa346583880da2be470431e35aa6054 GIT binary patch literal 21776 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¨-EKq;wUwr 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 De!(H( literal 0 HcmV?d00001 diff --git a/packages/theme/src/client/fonts/inter-roman-latin-ext.woff2 b/packages/theme/src/client/fonts/inter-roman-latin-ext.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..715bd903b9b14d22a056f10e6d13b8d7e0acce57 GIT binary patch literal 59608 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 literal 0 HcmV?d00001 diff --git a/packages/theme/src/client/fonts/inter-roman-latin.woff2 b/packages/theme/src/client/fonts/inter-roman-latin.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..a540b7afe7a46b9ff1412f433cd5180a9a9ab77d GIT binary patch literal 42464 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�zBE;A6`RoY<Ux!xgY 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 literal 0 HcmV?d00001 diff --git a/packages/theme/src/client/fonts/inter-roman-vietnamese.woff2 b/packages/theme/src/client/fonts/inter-roman-vietnamese.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..5a9f9cb9ca0cd78b6ea2f3e5c9d2838dc8895598 GIT binary patch literal 8492 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 a!Vc~9U7SGB8$q3Ii#9CnAx#qS0RRAsKuhfa literal 0 HcmV?d00001 diff --git a/packages/theme/src/client/styles/fonts.scss b/packages/theme/src/client/styles/fonts.scss new file mode 100644 index 00000000..c99c665c --- /dev/null +++ b/packages/theme/src/client/styles/fonts.scss @@ -0,0 +1,157 @@ +/* webfont-marker-begin */ +@import url('https://fonts.googleapis.com/css2?family=Inter:wght@100..900&display=swap'); + +html body { + font-synthesis: style; +} +/* webfont-marker-end */ + +@font-face { + font-family: 'Inter var'; + font-weight: 100 900; + font-display: swap; + font-style: normal; + font-named-instance: 'Regular'; + src: url('../fonts/inter-roman-cyrillic.woff2') format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + +@font-face { + font-family: 'Inter var'; + font-weight: 100 900; + font-display: swap; + font-style: normal; + font-named-instance: 'Regular'; + src: url('../fonts/inter-roman-cyrillic-ext.woff2') format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, + U+FE2E-FE2F; +} + +@font-face { + font-family: 'Inter var'; + font-weight: 100 900; + font-display: swap; + font-style: normal; + font-named-instance: 'Regular'; + src: url('../fonts/inter-roman-greek.woff2') format('woff2'); + unicode-range: U+0370-03FF; +} + +@font-face { + font-family: 'Inter var'; + font-weight: 100 900; + font-display: swap; + font-style: normal; + font-named-instance: 'Regular'; + src: url('../fonts/inter-roman-greek-ext.woff2') format('woff2'); + unicode-range: U+1F00-1FFF; +} + +@font-face { + font-family: 'Inter var'; + font-weight: 100 900; + font-display: swap; + font-style: normal; + font-named-instance: 'Regular'; + src: url('../fonts/inter-roman-latin.woff2') format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, + U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, + U+FEFF, U+FFFD; +} + +@font-face { + font-family: 'Inter var'; + font-weight: 100 900; + font-display: swap; + font-style: normal; + font-named-instance: 'Regular'; + src: url('../fonts/inter-roman-latin-ext.woff2') format('woff2'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, + U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} + +@font-face { + font-family: 'Inter var'; + font-weight: 100 900; + font-display: swap; + font-style: normal; + font-named-instance: 'Regular'; + src: url('../fonts/inter-roman-vietnamese.woff2') format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, + U+01AF-01B0, U+1EA0-1EF9, U+20AB; +} + +@font-face { + font-family: 'Inter var'; + font-weight: 100 900; + font-display: swap; + font-style: italic; + font-named-instance: 'Italic'; + src: url('../fonts/inter-italic-cyrillic.woff2') format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + +@font-face { + font-family: 'Inter var'; + font-weight: 100 900; + font-display: swap; + font-style: italic; + font-named-instance: 'Italic'; + src: url('../fonts/inter-italic-cyrillic-ext.woff2') format('woff2'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, + U+FE2E-FE2F; +} + +@font-face { + font-family: 'Inter var'; + font-weight: 100 900; + font-display: swap; + font-style: italic; + font-named-instance: 'Italic'; + src: url('../fonts/inter-italic-greek.woff2') format('woff2'); + unicode-range: U+0370-03FF; +} + +@font-face { + font-family: 'Inter var'; + font-weight: 100 900; + font-display: swap; + font-style: italic; + font-named-instance: 'Italic'; + src: url('../fonts/inter-italic-greek-ext.woff2') format('woff2'); + unicode-range: U+1F00-1FFF; +} + +@font-face { + font-family: 'Inter var'; + font-weight: 100 900; + font-display: swap; + font-style: italic; + font-named-instance: 'Italic'; + src: url('../fonts/inter-italic-latin.woff2') format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, + U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, + U+FEFF, U+FFFD; +} + +@font-face { + font-family: 'Inter var'; + font-weight: 100 900; + font-display: swap; + font-style: italic; + font-named-instance: 'Italic'; + src: url('../fonts/inter-italic-latin-ext.woff2') format('woff2'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, + U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} + +@font-face { + font-family: 'Inter var'; + font-weight: 100 900; + font-display: swap; + font-style: italic; + font-named-instance: 'Italic'; + src: url('../fonts/inter-italic-vietnamese.woff2') format('woff2'); + unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, + U+01AF-01B0, U+1EA0-1EF9, U+20AB; +} From 5842436b6cdbe052b2266a8c81e3eaf929c9f16c Mon Sep 17 00:00:00 2001 From: pengzhanbo <volodymyr@foxmail.com> Date: Fri, 10 Feb 2023 04:38:23 +0800 Subject: [PATCH 21/29] feat(theme): initial styles --- packages/theme/src/client/styles/index.scss | 4 + .../theme/src/client/styles/normalize.scss | 231 ++++++++++ .../theme/src/client/styles/nprogress.scss | 12 + packages/theme/src/client/styles/vars.scss | 401 ++++++++++++++++++ 4 files changed, 648 insertions(+) create mode 100644 packages/theme/src/client/styles/normalize.scss create mode 100644 packages/theme/src/client/styles/nprogress.scss create mode 100644 packages/theme/src/client/styles/vars.scss diff --git a/packages/theme/src/client/styles/index.scss b/packages/theme/src/client/styles/index.scss index e69de29b..dec863da 100644 --- a/packages/theme/src/client/styles/index.scss +++ b/packages/theme/src/client/styles/index.scss @@ -0,0 +1,4 @@ +@use 'vars'; +@use 'fonts'; +@use 'normalize'; +@use 'nprogress'; diff --git a/packages/theme/src/client/styles/normalize.scss b/packages/theme/src/client/styles/normalize.scss new file mode 100644 index 00000000..5ccb5d8b --- /dev/null +++ b/packages/theme/src/client/styles/normalize.scss @@ -0,0 +1,231 @@ +*, +::before, +::after { + box-sizing: border-box; +} + +html { + line-height: 1.4; + font-size: 16px; + -webkit-text-size-adjust: 100%; +} + +html.dark { + color-scheme: dark; +} + +body { + margin: 0; + width: 100%; + min-width: 320px; + min-height: 100vh; + line-height: 24px; + font-family: var(--vp-font-family-base); + font-size: 16px; + font-weight: 400; + color: var(--vp-c-text-1); + background-color: var(--vp-c-bg); + direction: ltr; + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +main { + display: block; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 0; + line-height: 24px; + font-size: 16px; + font-weight: 400; +} + +p { + margin: 0; +} + +strong, +b { + font-weight: 600; +} + +/** + * Avoid 300ms click delay on touch devices that support the `touch-action` + * CSS property. + * + * In particular, unlike most other browsers, IE11+Edge on Windows 10 on + * touch devices and IE Mobile 10-11 DON'T remove the click delay when + * `<meta name="viewport" content="width=device-width">` is present. + * However, they DO support removing the click delay via + * `touch-action: manipulation`. + * + * See: + * - http://v4-alpha.getbootstrap.com/content/reboot/#click-delay-optimization-for-touch + * - http://caniuse.com/#feat=css-touch-action + * - http://patrickhlauke.github.io/touch/tests/results/#suppressing-300ms-delay + */ +a, +area, +button, +[role='button'], +input, +label, +select, +summary, +textarea { + touch-action: manipulation; +} + +a { + color: inherit; + text-decoration: inherit; +} + +ol, +ul { + list-style: none; + margin: 0; + padding: 0; +} + +blockquote { + margin: 0; +} + +pre, +code, +kbd, +samp { + font-family: var(--vp-font-family-mono); +} + +img, +svg, +video, +canvas, +audio, +iframe, +embed, +object { + display: block; +} + +figure { + margin: 0; +} + +img, +video { + max-width: 100%; + height: auto; +} + +button, +input, +optgroup, +select, +textarea { + border: 0; + padding: 0; + line-height: inherit; + color: inherit; +} + +button { + padding: 0; + font-family: inherit; + background-color: transparent; + background-image: none; +} + +button:enabled, +[role='button']:enabled { + cursor: pointer; +} + +button:focus, +button:focus-visible { + outline: 1px dotted; + outline: 4px auto -webkit-focus-ring-color; +} + +button:focus:not(:focus-visible) { + outline: none !important; +} + +input:focus, +textarea:focus, +select:focus { + outline: none; +} + +table { + border-collapse: collapse; +} + +input { + background-color: transparent; +} + +input:-ms-input-placeholder, +textarea:-ms-input-placeholder { + color: var(--vp-c-text-3); +} + +input::-ms-input-placeholder, +textarea::-ms-input-placeholder { + color: var(--vp-c-text-3); +} + +input::placeholder, +textarea::placeholder { + color: var(--vp-c-text-3); +} + +input::-webkit-outer-spin-button, +input::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; +} + +input[type='number'] { + -moz-appearance: textfield; + appearance: textfield; +} + +textarea { + resize: vertical; +} + +select { + -webkit-appearance: none; + appearance: none; +} + +fieldset { + margin: 0; + padding: 0; +} + +h1, +h2, +h3, +h4, +h5, +h6, +li, +p { + overflow-wrap: break-word; +} + +vite-error-overlay { + z-index: 9999; +} diff --git a/packages/theme/src/client/styles/nprogress.scss b/packages/theme/src/client/styles/nprogress.scss new file mode 100644 index 00000000..477703ce --- /dev/null +++ b/packages/theme/src/client/styles/nprogress.scss @@ -0,0 +1,12 @@ +#nprogress .bar { + background: var(--vp-c-brand); +} + +#nprogress .spinner-icon { + border-top-color: var(--vp-c-brand); + border-left-color: var(--vp-c-brand); +} + +#nprogress .peg { + box-shadow: 0 0 10px var(--vp-c-brand), 0 0 5px var(--vp-c-brand); +} diff --git a/packages/theme/src/client/styles/vars.scss b/packages/theme/src/client/styles/vars.scss new file mode 100644 index 00000000..aee40e11 --- /dev/null +++ b/packages/theme/src/client/styles/vars.scss @@ -0,0 +1,401 @@ +/** + * Colors Base + * + * These are the pure base color presets. Most of the time, you should not be + * using these colors directly in the theme but rather use "Colors Theme" + * instead because those are "Theme (light or dark)" dependant. + * -------------------------------------------------------------------------- */ + +:root { + --vp-c-white: #ffffff; + --vp-c-black: #000000; + + --vp-c-gray: #8e8e93; + + --vp-c-text-light-1: rgba(60, 60, 67, 0.92); + --vp-c-text-light-2: rgba(60, 60, 67, 0.7); + --vp-c-text-light-3: rgba(60, 60, 67, 0.33); + + --vp-c-text-dark-1: rgba(255, 255, 245, 0.86); + --vp-c-text-dark-2: rgba(235, 235, 245, 0.6); + --vp-c-text-dark-3: rgba(235, 235, 245, 0.38); + + --vp-c-green: #10b981; + --vp-c-green-light: #34d399; + --vp-c-green-lighter: #6ee7b7; + --vp-c-green-dark: #059669; + --vp-c-green-darker: #047857; + --vp-c-green-dimm-1: rgba(16, 185, 129, 0.05); + --vp-c-green-dimm-2: rgba(16, 185, 129, 0.2); + --vp-c-green-dimm-3: rgba(16, 185, 129, 0.5); + + --vp-c-yellow: #eab308; + --vp-c-yellow-light: #facc15; + --vp-c-yellow-lighter: #fde047; + --vp-c-yellow-dark: #ca8a04; + --vp-c-yellow-darker: #a16207; + --vp-c-yellow-dimm-1: rgba(234, 179, 8, 0.05); + --vp-c-yellow-dimm-2: rgba(234, 179, 8, 0.2); + --vp-c-yellow-dimm-3: rgba(234, 179, 8, 0.5); + + --vp-c-red: #f43f5e; + --vp-c-red-light: #fb7185; + --vp-c-red-lighter: #fda4af; + --vp-c-red-dark: #e11d48; + --vp-c-red-darker: #be123c; + --vp-c-red-dimm-1: rgba(244, 63, 94, 0.05); + --vp-c-red-dimm-2: rgba(244, 63, 94, 0.2); + --vp-c-red-dimm-3: rgba(244, 63, 94, 0.5); + + --vp-c-sponsor: #db2777; +} + +/** + * Colors Theme + * -------------------------------------------------------------------------- */ + +:root { + --vp-c-bg: #ffffff; + + --vp-c-bg-elv: #ffffff; + --vp-c-bg-elv-up: #ffffff; + --vp-c-bg-elv-down: #f6f6f7; + --vp-c-bg-elv-mute: #f6f6f7; + + --vp-c-bg-soft: #f6f6f7; + --vp-c-bg-soft-up: #ffffff; + --vp-c-bg-soft-down: #e3e3e5; + --vp-c-bg-soft-mute: #e3e3e5; + + --vp-c-bg-alt: #f6f6f7; + + --vp-c-border: rgba(60, 60, 67, 0.29); + --vp-c-divider: rgba(60, 60, 67, 0.12); + --vp-c-gutter: rgba(60, 60, 67, 0.12); + + --vp-c-neutral: var(--vp-c-black); + --vp-c-neutral-inverse: var(--vp-c-white); + + --vp-c-text-1: var(--vp-c-text-light-1); + --vp-c-text-2: var(--vp-c-text-light-2); + --vp-c-text-3: var(--vp-c-text-light-3); + + --vp-c-text-inverse-1: var(--vp-c-text-dark-1); + --vp-c-text-inverse-2: var(--vp-c-text-dark-2); + --vp-c-text-inverse-3: var(--vp-c-text-dark-3); + + --vp-c-text-code: #476582; + + --vp-c-brand: var(--vp-c-green); + --vp-c-brand-light: var(--vp-c-green-light); + --vp-c-brand-lighter: var(--vp-c-green-lighter); + --vp-c-brand-dark: var(--vp-c-green-dark); + --vp-c-brand-darker: var(--vp-c-green-darker); + + --vp-c-mute: #f6f6f7; + --vp-c-mute-light: #f9f9fc; + --vp-c-mute-lighter: #ffffff; + --vp-c-mute-dark: #e3e3e5; + --vp-c-mute-darker: #d7d7d9; +} + +.dark { + --vp-c-bg: #1e1e20; + + --vp-c-bg-elv: #252529; + --vp-c-bg-elv-up: #313136; + --vp-c-bg-elv-down: #1e1e20; + --vp-c-bg-elv-mute: #313136; + + --vp-c-bg-soft: #252529; + --vp-c-bg-soft-up: #313136; + --vp-c-bg-soft-down: #1e1e20; + --vp-c-bg-soft-mute: #313136; + + --vp-c-bg-alt: #161618; + + --vp-c-border: rgba(82, 82, 89, 0.68); + --vp-c-divider: rgba(82, 82, 89, 0.32); + --vp-c-gutter: #000000; + + --vp-c-neutral: var(--vp-c-white); + --vp-c-neutral-inverse: var(--vp-c-black); + + --vp-c-text-1: var(--vp-c-text-dark-1); + --vp-c-text-2: var(--vp-c-text-dark-2); + --vp-c-text-3: var(--vp-c-text-dark-3); + + --vp-c-text-inverse-1: var(--vp-c-text-light-1); + --vp-c-text-inverse-2: var(--vp-c-text-light-2); + --vp-c-text-inverse-3: var(--vp-c-text-light-3); + + --vp-c-text-code: #c9def1; + + --vp-c-mute: #313136; + --vp-c-mute-light: #3a3a3c; + --vp-c-mute-lighter: #505053; + --vp-c-mute-dark: #2c2c30; + --vp-c-mute-darker: #252529; +} + +/** + * Typography + * -------------------------------------------------------------------------- */ + +:root { + --vp-font-family-base: 'Inter var', 'Inter', ui-sans-serif, system-ui, + -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', + Helvetica, Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', + 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'; + --vp-font-family-mono: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Monaco, + Consolas, 'Liberation Mono', 'Courier New', monospace; +} + +/** + * Shadows + * -------------------------------------------------------------------------- */ + +:root { + --vp-shadow-1: 0 1px 2px rgba(0, 0, 0, 0.04), 0 1px 2px rgba(0, 0, 0, 0.06); + --vp-shadow-2: 0 3px 12px rgba(0, 0, 0, 0.07), 0 1px 4px rgba(0, 0, 0, 0.07); + --vp-shadow-3: 0 12px 32px rgba(0, 0, 0, 0.1), 0 2px 6px rgba(0, 0, 0, 0.08); + --vp-shadow-4: 0 14px 44px rgba(0, 0, 0, 0.12), 0 3px 9px rgba(0, 0, 0, 0.12); + --vp-shadow-5: 0 18px 56px rgba(0, 0, 0, 0.16), 0 4px 12px rgba(0, 0, 0, 0.16); +} + +/** + * Z-indexes + * -------------------------------------------------------------------------- */ + +:root { + --vp-z-index-local-nav: 10; + --vp-z-index-nav: 20; + --vp-z-index-layout-top: 30; + --vp-z-index-backdrop: 40; + --vp-z-index-sidebar: 50; + --vp-z-index-footer: 60; +} + +/** + * Icons + * -------------------------------------------------------------------------- */ + +:root { + --vp-icon-copy: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' height='20' width='20' stroke='rgba(128,128,128,1)' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2'/%3E%3C/svg%3E"); + --vp-icon-copied: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' height='20' width='20' stroke='rgba(128,128,128,1)' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M9 5H7a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2M9 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M9 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2m-6 9 2 2 4-4'/%3E%3C/svg%3E"); +} + +/** + * Layouts + * -------------------------------------------------------------------------- */ + +:root { + --vp-layout-max-width: 1440px; +} + +/** + * Component: Code + * -------------------------------------------------------------------------- */ + +:root { + --vp-code-line-height: 1.7; + --vp-code-font-size: 0.875em; + + --vp-code-block-color: var(--vp-c-text-dark-1); + --vp-code-block-bg: #292b30; + --vp-code-block-divider-color: #000000; + + --vp-code-line-highlight-color: rgba(0, 0, 0, 0.5); + --vp-code-line-number-color: var(--vp-c-text-dark-3); + + --vp-code-line-diff-add-color: var(--vp-c-green-dimm-2); + --vp-code-line-diff-add-symbol-color: var(--vp-c-green); + + --vp-code-line-diff-remove-color: var(--vp-c-red-dimm-2); + --vp-code-line-diff-remove-symbol-color: var(--vp-c-red); + + --vp-code-line-warning-color: var(--vp-c-yellow-dimm-2); + --vp-code-line-error-color: var(--vp-c-red-dimm-2); + + --vp-code-copy-code-hover-bg: rgba(255, 255, 255, 0.05); + --vp-code-copy-code-active-text: var(--vp-c-text-dark-2); + + --vp-code-tab-divider: var(--vp-code-block-divider-color); + --vp-code-tab-text-color: var(--vp-c-text-dark-2); + --vp-code-tab-bg: var(--vp-code-block-bg); + --vp-code-tab-hover-text-color: var(--vp-c-text-dark-1); + --vp-code-tab-active-text-color: var(--vp-c-text-dark-1); + --vp-code-tab-active-bar-color: var(--vp-c-brand); +} + +.dark { + --vp-code-block-bg: #161618; +} + +/** + * Component: Button + * -------------------------------------------------------------------------- */ + +:root { + --vp-button-brand-border: var(--vp-c-brand-lighter); + --vp-button-brand-text: var(--vp-c-white); + --vp-button-brand-bg: var(--vp-c-brand); + --vp-button-brand-hover-border: var(--vp-c-brand-lighter); + --vp-button-brand-hover-text: var(--vp-c-white); + --vp-button-brand-hover-bg: var(--vp-c-brand-dark); + --vp-button-brand-active-border: var(--vp-c-brand-lighter); + --vp-button-brand-active-text: var(--vp-c-white); + --vp-button-brand-active-bg: var(--vp-c-brand-darker); + + --vp-button-alt-border: var(--vp-c-border); + --vp-button-alt-text: var(--vp-c-neutral); + --vp-button-alt-bg: var(--vp-c-mute); + --vp-button-alt-hover-border: var(--vp-c-border); + --vp-button-alt-hover-text: var(--vp-c-neutral); + --vp-button-alt-hover-bg: var(--vp-c-mute-dark); + --vp-button-alt-active-border: var(--vp-c-border); + --vp-button-alt-active-text: var(--vp-c-neutral); + --vp-button-alt-active-bg: var(--vp-c-mute-darker); + + --vp-button-sponsor-border: var(--vp-c-gray-light-3); + --vp-button-sponsor-text: var(--vp-c-text-light-2); + --vp-button-sponsor-bg: transparent; + --vp-button-sponsor-hover-border: var(--vp-c-sponsor); + --vp-button-sponsor-hover-text: var(--vp-c-sponsor); + --vp-button-sponsor-hover-bg: transparent; + --vp-button-sponsor-active-border: var(--vp-c-sponsor); + --vp-button-sponsor-active-text: var(--vp-c-sponsor); + --vp-button-sponsor-active-bg: transparent; +} + +.dark { + --vp-button-sponsor-border: var(--vp-c-gray-dark-1); + --vp-button-sponsor-text: var(--vp-c-text-dark-2); +} + +/** + * Component: Custom Block + * -------------------------------------------------------------------------- */ + +:root { + --vp-custom-block-font-size: 14px; + --vp-custom-block-code-font-size: 13px; + + --vp-custom-block-info-border: var(--vp-c-border); + --vp-custom-block-info-text: var(--vp-c-text-2); + --vp-custom-block-info-bg: var(--vp-c-bg-soft); + --vp-custom-block-info-code-bg: var(--vp-c-mute); + + --vp-custom-block-tip-border: var(--vp-c-green-dimm-3); + --vp-custom-block-tip-text: var(--vp-c-green); + --vp-custom-block-tip-bg: var(--vp-c-green-dimm-1); + --vp-custom-block-tip-code-bg: var(--vp-custom-block-tip-bg); + + --vp-custom-block-warning-border: var(--vp-c-yellow-dimm-3); + --vp-custom-block-warning-text: var(--vp-c-yellow); + --vp-custom-block-warning-bg: var(--vp-c-yellow-dimm-1); + --vp-custom-block-warning-code-bg: var(--vp-custom-block-warning-bg); + + --vp-custom-block-danger-border: var(--vp-c-red-dimm-3); + --vp-custom-block-danger-text: var(--vp-c-red); + --vp-custom-block-danger-bg: var(--vp-c-red-dimm-1); + --vp-custom-block-danger-code-bg: var(--vp-custom-block-danger-bg); + + --vp-custom-block-details-border: var(--vp-custom-block-info-border); + --vp-custom-block-details-text: var(--vp-custom-block-info-text); + --vp-custom-block-details-bg: var(--vp-custom-block-info-bg); + --vp-custom-block-details-code-bg: var(--vp-custom-block-details-bg); +} + +/** + * Component: Input + * -------------------------------------------------------------------------- */ + +:root { + --vp-input-border-color: var(--vp-c-border); + --vp-input-bg-color: var(--vp-c-bg-alt); + --vp-input-hover-border-color: var(--vp-c-gray); + + --vp-input-switch-bg-color: var(--vp-c-mute); +} + +/** + * Component: Nav + * -------------------------------------------------------------------------- */ + +:root { + --vp-nav-height: 64px; + --vp-nav-bg-color: var(--vp-c-bg); + --vp-nav-screen-bg-color: var(--vp-c-bg); +} + +/** + * Component: Local Nav + * -------------------------------------------------------------------------- */ + +:root { + --vp-local-nav-bg-color: var(--vp-c-bg); +} + +/** + * Component: Sidebar + * -------------------------------------------------------------------------- */ + +:root { + --vp-sidebar-width: 272px; + --vp-sidebar-bg-color: var(--vp-c-bg-alt); +} + +/** + * Colors Backdrop + * -------------------------------------------------------------------------- */ + +:root { + --vp-backdrop-bg-color: rgba(0, 0, 0, 0.6); +} + +/** + * Component: Home + * -------------------------------------------------------------------------- */ + +:root { + --vp-home-hero-name-color: var(--vp-c-brand); + --vp-home-hero-name-background: transparent; + + --vp-home-hero-image-background-image: none; + --vp-home-hero-image-filter: none; +} + +/** + * Component: Badge + * -------------------------------------------------------------------------- */ + +:root { + --vp-badge-info-border: var(--vp-c-border); + --vp-badge-info-text: var(--vp-c-text-2); + --vp-badge-info-bg: var(--vp-c-bg-soft); + + --vp-badge-tip-border: var(--vp-c-green-dark); + --vp-badge-tip-text: var(--vp-c-green); + --vp-badge-tip-bg: var(--vp-c-green-dimm-1); + + --vp-badge-warning-border: var(--vp-c-yellow-dark); + --vp-badge-warning-text: var(--vp-c-yellow); + --vp-badge-warning-bg: var(--vp-c-yellow-dimm-1); + + --vp-badge-danger-border: var(--vp-c-red-dark); + --vp-badge-danger-text: var(--vp-c-red); + --vp-badge-danger-bg: var(--vp-c-red-dimm-1); +} + +/** + * Component: CarbonAds + * -------------------------------------------------------------------------- */ + +:root { + --vp-carbon-ads-text-color: var(--vp-c-text-1); + --vp-carbon-ads-poweredby-color: var(--vp-c-text-2); + --vp-carbon-ads-bg-color: var(--vp-c-bg-soft); + --vp-carbon-ads-hover-text-color: var(--vp-c-brand); + --vp-carbon-ads-hover-poweredby-color: var(--vp-c-text-1); +} From 1689b9c691f1b22631e9d7725e220cd7a97fc838 Mon Sep 17 00:00:00 2001 From: pengzhanbo <volodymyr@foxmail.com> Date: Fri, 10 Feb 2023 04:39:12 +0800 Subject: [PATCH 22/29] feat(theme): add Nav components --- .../src/client/components/Nav/NavBar.vue | 213 ++++++++++++++++++ .../src/client/components/Nav/NavBarTitle.vue | 54 +++++ .../src/client/components/Nav/NavScreen.vue | 1 + .../theme/src/client/components/Nav/index.vue | 14 ++ .../src/client/components/Navbar/index.vue | 4 - .../theme/src/client/components/VImage.vue | 50 ++++ packages/theme/src/client/composables/nav.ts | 45 ++++ .../theme/src/client/composables/sidebar.ts | 11 + packages/theme/src/client/layouts/Layout.vue | 4 +- 9 files changed, 390 insertions(+), 6 deletions(-) create mode 100644 packages/theme/src/client/components/Nav/NavBar.vue create mode 100644 packages/theme/src/client/components/Nav/NavBarTitle.vue create mode 100644 packages/theme/src/client/components/Nav/NavScreen.vue create mode 100644 packages/theme/src/client/components/Nav/index.vue delete mode 100644 packages/theme/src/client/components/Navbar/index.vue create mode 100644 packages/theme/src/client/components/VImage.vue create mode 100644 packages/theme/src/client/composables/nav.ts create mode 100644 packages/theme/src/client/composables/sidebar.ts diff --git a/packages/theme/src/client/components/Nav/NavBar.vue b/packages/theme/src/client/components/Nav/NavBar.vue new file mode 100644 index 00000000..9b6aed79 --- /dev/null +++ b/packages/theme/src/client/components/Nav/NavBar.vue @@ -0,0 +1,213 @@ +<script lang="ts" setup> +import { useWindowScroll } from '@vueuse/core' +import { computed } from 'vue' +import { useSidebar } from '../../composables/sidebar.js' +import NavBarTitle from './NavBarTitle.vue' + +defineProps<{ + isScreenOpen: boolean +}>() +defineEmits<{ + (e: 'toggle-screen'): void +}>() + +const { y } = useWindowScroll() +const { hasSidebar } = useSidebar() + +const classes = computed(() => ({ + 'has-sidebar': hasSidebar.value, + 'fill': y.value > 0, +})) +</script> + +<template> + <div class="navbar-wrapper" :class="classes"> + <div class="container"> + <div class="title"> + <NavBarTitle /> + </div> + + <div class="content"> + <div class="curtain"></div> + <div class="content-body"> + <NavbarSearch class="search" /> + </div> + </div> + </div> + </div> +</template> + +<style scoped> +.navbar-wrapper { + position: relative; + border-bottom: 1px solid transparent; + padding: 0 8px 0 24px; + height: var(--vp-nav-height); + transition: border-color 0.5s, background-color 0.5s; + pointer-events: none; +} + +.navbar-wrapper.has-sidebar { + border-bottom-color: var(--vp-c-gutter); +} + +@media (min-width: 768px) { + .navbar-wrapper { + padding: 0 32px; + } +} + +@media (min-width: 960px) { + .navbar-wrapper.has-sidebar { + border-bottom-color: transparent; + padding: 0; + } + + .navbar-wrapper.fill:not(.has-sidebar) { + border-bottom-color: var(--vp-c-gutter); + background-color: var(--vp-nav-bg-color); + } +} + +.container { + display: flex; + justify-content: space-between; + margin: 0 auto; + max-width: calc(var(--vp-layout-max-width) - 64px); + height: var(--vp-nav-height); + pointer-events: none; +} + +.container :deep(*) { + pointer-events: auto; +} + +@media (min-width: 960px) { + .navbar-wrapper.has-sidebar .container { + max-width: 100%; + } +} + +.title { + flex-shrink: 0; + height: calc(var(--vp-nav-height) - 1px); + transition: background-color 0.5s; +} + +@media (min-width: 960px) { + .navbar-wrapper.has-sidebar .title { + position: absolute; + top: 0; + left: 0; + z-index: 2; + padding: 0 32px; + width: var(--vp-sidebar-width); + height: var(--vp-nav-height); + background-color: transparent; + } +} + +@media (min-width: 1440px) { + .navbar-wrapper.has-sidebar .title { + padding-left: max( + 32px, + calc((100% - (var(--vp-layout-max-width) - 64px)) / 2) + ); + width: calc( + (100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - + 32px + ); + } +} + +.content { + flex-grow: 1; +} + +@media (min-width: 960px) { + .navbar-wrapper.has-sidebar .content { + position: relative; + z-index: 1; + padding-right: 32px; + padding-left: var(--vp-sidebar-width); + } +} + +@media (min-width: 1440px) { + .navbar-wrapper.has-sidebar .content { + padding-right: calc((100vw - var(--vp-layout-max-width)) / 2 + 32px); + padding-left: calc( + (100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width) + ); + } +} + +.content-body { + display: flex; + justify-content: flex-end; + align-items: center; + height: calc(var(--vp-nav-height) - 1px); + transition: background-color 0.5s; +} + +@media (min-width: 960px) { + .navbar-wrapper.has-sidebar .content-body, + .navbar-wrapper.fill .content-body { + position: relative; + background-color: var(--vp-nav-bg-color); + } +} + +.menu + .translations::before, +.menu + .appearance::before, +.menu + .social-links::before, +.translations + .appearance::before, +.appearance + .social-links::before { + margin-right: 8px; + margin-left: 8px; + width: 1px; + height: 24px; + background-color: var(--vp-c-divider); + content: ''; +} + +.menu + .appearance::before, +.translations + .appearance::before { + margin-right: 16px; +} + +.appearance + .social-links::before { + margin-left: 16px; +} + +.social-links { + margin-right: -8px; +} + +@media (min-width: 960px) { + .navbar-wrapper.has-sidebar .curtain { + position: absolute; + right: 0; + bottom: -31px; + width: calc(100% - var(--vp-sidebar-width)); + height: 32px; + } + + .navbar-wrapper.has-sidebar .curtain::before { + display: block; + width: 100%; + height: 32px; + background: linear-gradient(var(--vp-c-bg), transparent 70%); + content: ''; + } +} + +@media (min-width: 1440px) { + .navbar-wrapper.has-sidebar .curtain { + width: calc( + 100% - + ((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width)) + ); + } +} +</style> diff --git a/packages/theme/src/client/components/Nav/NavBarTitle.vue b/packages/theme/src/client/components/Nav/NavBarTitle.vue new file mode 100644 index 00000000..24c92803 --- /dev/null +++ b/packages/theme/src/client/components/Nav/NavBarTitle.vue @@ -0,0 +1,54 @@ +<script lang="ts" setup> +import { useSiteLocaleData } from '@vuepress/client' +import { useThemeLocaleData } from '../../composables/themeData.js' +import VImage from '../VImage.vue' + +const theme = useThemeLocaleData() +const site = useSiteLocaleData() +</script> + +<template> + <div class="navbar-title"> + <a class="title" :href="theme.home"> + <VImage + v-if="theme.logo" + class="logo" + :image="{ light: theme.logo, dark: theme.logoDark || '' }" + /> + {{ site.title }} + </a> + </div> +</template> + +<style scoped> +.title { + display: flex; + align-items: center; + border-bottom: 1px solid transparent; + width: 100%; + height: var(--vp-nav-height); + font-size: 16px; + font-weight: 600; + color: var(--vp-c-text-1); + transition: opacity 0.25s; +} + +.title:hover { + opacity: 0.6; +} + +@media (min-width: 960px) { + .title { + flex-shrink: 0; + } + + .navbar-title.has-sidebar .title { + border-bottom-color: var(--vp-c-divider); + } +} + +:deep(.logo) { + margin-right: 8px; + height: 24px; +} +</style> diff --git a/packages/theme/src/client/components/Nav/NavScreen.vue b/packages/theme/src/client/components/Nav/NavScreen.vue new file mode 100644 index 00000000..6b4c19a0 --- /dev/null +++ b/packages/theme/src/client/components/Nav/NavScreen.vue @@ -0,0 +1 @@ +<script setup lang="ts"></script> diff --git a/packages/theme/src/client/components/Nav/index.vue b/packages/theme/src/client/components/Nav/index.vue new file mode 100644 index 00000000..071199a8 --- /dev/null +++ b/packages/theme/src/client/components/Nav/index.vue @@ -0,0 +1,14 @@ +<script lang="ts" setup> +import { provide } from 'vue' +import { useNav } from '../../composables/nav.js' +import Navbar from './Navbar.vue' + +const { isScreenOpen, closeScreen, toggleScreen } = useNav() + +provide('close-screen', closeScreen) +</script> +<template> + <div class="nav-wrapper"> + <Navbar :is-screen-open="isScreenOpen"></Navbar> + </div> +</template> diff --git a/packages/theme/src/client/components/Navbar/index.vue b/packages/theme/src/client/components/Navbar/index.vue deleted file mode 100644 index 6f0ce0e1..00000000 --- a/packages/theme/src/client/components/Navbar/index.vue +++ /dev/null @@ -1,4 +0,0 @@ -<script lang="ts" setup></script> -<template> - <div class="navbar-wrapper"></div> -</template> diff --git a/packages/theme/src/client/components/VImage.vue b/packages/theme/src/client/components/VImage.vue new file mode 100644 index 00000000..466a6789 --- /dev/null +++ b/packages/theme/src/client/components/VImage.vue @@ -0,0 +1,50 @@ +<script lang="ts" setup> +import { withBase } from '@vuepress/client' +defineProps<{ + image: + | string + | { src: string; alt?: string } + | { dark: string; light: string; alt?: string } + alt?: string +}>() +</script> +<script lang="ts"> +export default { + inheritAttrs: false, +} +</script> +<template> + <template v-if="image"> + <img + v-if="typeof image === 'string' || 'src' in image" + class="plume-image" + v-bind="typeof image === 'string' ? $attrs : { ...image, ...$attrs }" + :src="withBase(typeof image === 'string' ? image : image.src)" + :alt="alt ?? (typeof image === 'string' ? '' : image.alt || '')" + /> + <template v-else> + <VImage + class="dark" + :image="image.dark" + :alt="image.alt" + v-bind="$attrs" + /> + <VImage + class="light" + :image="image.light" + :alt="image.alt" + v-bind="$attrs" + /> + </template> + </template> +</template> + +<style scoped> +html:not(.dark) .plume-image.dark { + display: none; +} + +.dark .plume-image.light { + display: none; +} +</style> diff --git a/packages/theme/src/client/composables/nav.ts b/packages/theme/src/client/composables/nav.ts new file mode 100644 index 00000000..1fe0244f --- /dev/null +++ b/packages/theme/src/client/composables/nav.ts @@ -0,0 +1,45 @@ +import type { Ref } from 'vue' +import { ref, watch } from 'vue' +import { useRoute } from 'vue-router' + +export interface UseNavReturn { + isScreenOpen: Ref<boolean> + openScreen: () => void + closeScreen: () => void + toggleScreen: () => void +} + +export function useNav(): UseNavReturn { + const isScreenOpen = ref(false) + + function openScreen(): void { + isScreenOpen.value = true + window.addEventListener('resize', closeScreenOnTabletWindow) + } + + function closeScreen(): void { + isScreenOpen.value = false + window.removeEventListener('resize', closeScreenOnTabletWindow) + } + + function toggleScreen(): void { + isScreenOpen.value ? closeScreen() : openScreen() + } + + /** + * Close screen when the user resizes the window wider than tablet size. + */ + function closeScreenOnTabletWindow(): void { + window.outerWidth >= 768 && closeScreen() + } + + const route = useRoute() + watch(() => route.path, closeScreen) + + return { + isScreenOpen, + openScreen, + closeScreen, + toggleScreen, + } +} diff --git a/packages/theme/src/client/composables/sidebar.ts b/packages/theme/src/client/composables/sidebar.ts new file mode 100644 index 00000000..ac3e0a3b --- /dev/null +++ b/packages/theme/src/client/composables/sidebar.ts @@ -0,0 +1,11 @@ +import { computed } from 'vue' + +export function useSidebar() { + const hasSidebar = computed(() => { + return false + }) + + return { + hasSidebar, + } +} diff --git a/packages/theme/src/client/layouts/Layout.vue b/packages/theme/src/client/layouts/Layout.vue index 4fb39628..0c904404 100644 --- a/packages/theme/src/client/layouts/Layout.vue +++ b/packages/theme/src/client/layouts/Layout.vue @@ -1,5 +1,5 @@ <script setup lang="ts"> -import Navbar from '../components/Navbar/index.vue' +import Nav from '../components/Nav/index.vue' import { useScrollPromise, useThemeLocaleData } from '../composables/index.js' // handle scrollBehavior with transition @@ -9,6 +9,6 @@ const onBeforeLeave = scrollPromise.pending </script> <template> <div class="theme-plume relative min-h-100vh"> - <Navbar /> + <Nav /> </div> </template> From 8120ad3e650b4ea1c2d70eb5ef5dd25a3d4a1e45 Mon Sep 17 00:00:00 2001 From: pengzhanbo <volodymyr@foxmail.com> Date: Fri, 10 Feb 2023 04:39:46 +0800 Subject: [PATCH 23/29] refactor(theme): update basic --- .../composables/{useDarkMode.ts => darkMode.ts} | 2 +- packages/theme/src/client/composables/index.ts | 4 ++-- .../composables/{useThemeData.ts => themeData.ts} | 0 packages/theme/src/client/index.ts | 1 + packages/theme/src/client/shim.d.ts | 2 ++ packages/theme/src/node/autoFrontmatter.ts | 15 ++++++++++++--- packages/theme/src/shared/base.ts | 4 ++++ packages/theme/src/shared/index.ts | 1 + 8 files changed, 23 insertions(+), 6 deletions(-) rename packages/theme/src/client/composables/{useDarkMode.ts => darkMode.ts} (97%) rename packages/theme/src/client/composables/{useThemeData.ts => themeData.ts} (100%) create mode 100644 packages/theme/src/shared/base.ts diff --git a/packages/theme/src/client/composables/useDarkMode.ts b/packages/theme/src/client/composables/darkMode.ts similarity index 97% rename from packages/theme/src/client/composables/useDarkMode.ts rename to packages/theme/src/client/composables/darkMode.ts index 97d049fe..2e76b835 100644 --- a/packages/theme/src/client/composables/useDarkMode.ts +++ b/packages/theme/src/client/composables/darkMode.ts @@ -1,7 +1,7 @@ import { usePreferredDark, useStorage } from '@vueuse/core' import { computed, inject, onMounted, onUnmounted, provide, watch } from 'vue' import type { InjectionKey, WritableComputedRef } from 'vue' -import { useThemeLocaleData } from './useThemeData.js' +import { useThemeLocaleData } from './themeData.js' export type DarkModeRef = WritableComputedRef<boolean> diff --git a/packages/theme/src/client/composables/index.ts b/packages/theme/src/client/composables/index.ts index 7021f731..4dfbe520 100644 --- a/packages/theme/src/client/composables/index.ts +++ b/packages/theme/src/client/composables/index.ts @@ -1,4 +1,4 @@ -export * from './useDarkMode.js' +export * from './darkMode.js' export * from './useScrollPromise.js' -export * from './useThemeData.js' +export * from './themeData.js' export * from './useResolveRouteWithRedirect.js' diff --git a/packages/theme/src/client/composables/useThemeData.ts b/packages/theme/src/client/composables/themeData.ts similarity index 100% rename from packages/theme/src/client/composables/useThemeData.ts rename to packages/theme/src/client/composables/themeData.ts diff --git a/packages/theme/src/client/index.ts b/packages/theme/src/client/index.ts index e69de29b..72593733 100644 --- a/packages/theme/src/client/index.ts +++ b/packages/theme/src/client/index.ts @@ -0,0 +1 @@ +export * from '../shared/index.js' diff --git a/packages/theme/src/client/shim.d.ts b/packages/theme/src/client/shim.d.ts index bf554924..91c813d9 100644 --- a/packages/theme/src/client/shim.d.ts +++ b/packages/theme/src/client/shim.d.ts @@ -3,3 +3,5 @@ declare module '*.vue' { const comp: ComponentOptions export default comp } + +declare const __VUEPRESS_DEV__: string diff --git a/packages/theme/src/node/autoFrontmatter.ts b/packages/theme/src/node/autoFrontmatter.ts index 9fd601ae..06dc356d 100644 --- a/packages/theme/src/node/autoFrontmatter.ts +++ b/packages/theme/src/node/autoFrontmatter.ts @@ -1,6 +1,7 @@ import { createRequire } from 'node:module' import type { AutoFrontmatterOptions } from '@vuepress-plume/vuepress-plugin-auto-frontmatter' import type { App } from '@vuepress/core' +import { format } from 'date-fns' import type { PlumeThemeLocaleOptions } from '../shared/index.js' export default function ( @@ -21,13 +22,21 @@ export default function ( { include: '*', formatter: { + title(title: string) { + if (title) return title + return title + }, author(author: string) { if (author) return author - return pkg.author || '' + return localeOption.avatar?.name || pkg.author || '' }, - createTime(formatTime: string, data, { createTime }) { + createTime(formatTime: string, _, { createTime }) { if (formatTime) return formatTime - return createTime + return format(new Date(createTime), 'yyyy/MM/dd hh:mm:ss') + }, + permalink(permalink: string, _, { filepath }) { + if (permalink) return permalink + return permalink }, }, }, diff --git a/packages/theme/src/shared/base.ts b/packages/theme/src/shared/base.ts new file mode 100644 index 00000000..78ef99c4 --- /dev/null +++ b/packages/theme/src/shared/base.ts @@ -0,0 +1,4 @@ +export type PlumeThemeImage = + | string + | { src: string; alt?: string } + | { dark: string; light: string; alt?: string } diff --git a/packages/theme/src/shared/index.ts b/packages/theme/src/shared/index.ts index f15365c2..ea6df6fd 100644 --- a/packages/theme/src/shared/index.ts +++ b/packages/theme/src/shared/index.ts @@ -1,3 +1,4 @@ +export * from './base.js' export * from './frontmatter.js' export * from './note.js' export * from './options/index.js' From 86f51ff2710453f61bbd4e96c93f7398702548c8 Mon Sep 17 00:00:00 2001 From: pengzhanbo <volodymyr@foxmail.com> Date: Fri, 10 Feb 2023 16:39:34 +0800 Subject: [PATCH 24/29] feat(plugin-notes-data): provide notes-data --- docs/.vuepress/notes.ts | 12 +- .../src/client/composables/useBlogPostData.ts | 6 +- packages/plugin-notes-data/package.json | 6 +- .../src/client/clientConfig.ts | 34 +++- .../src/client/composables/index.ts | 1 + .../src/client/composables/notesDate.ts | 20 +++ .../plugin-notes-data/src/client/index.ts | 3 +- .../src/client/notesData.d.ts | 7 + packages/plugin-notes-data/src/node/plugin.ts | 10 +- .../src/node/prepareNotesData.ts | 159 ++++++++++++++++++ packages/plugin-notes-data/src/node/utils.ts | 5 + .../plugin-notes-data/src/shared/index.ts | 26 ++- .../plugin-notes-data/tsconfig.build.json | 6 +- packages/theme/package.json | 1 + packages/theme/src/node/defineConfig.ts | 14 +- packages/theme/src/node/plugins.ts | 2 + packages/theme/src/shared/options/index.ts | 4 - packages/theme/src/shared/options/locale.ts | 4 +- pnpm-lock.yaml | 10 ++ tsconfig.json | 3 + 20 files changed, 302 insertions(+), 31 deletions(-) create mode 100644 packages/plugin-notes-data/src/client/composables/index.ts create mode 100644 packages/plugin-notes-data/src/client/composables/notesDate.ts create mode 100644 packages/plugin-notes-data/src/client/notesData.d.ts create mode 100644 packages/plugin-notes-data/src/node/prepareNotesData.ts create mode 100644 packages/plugin-notes-data/src/node/utils.ts diff --git a/docs/.vuepress/notes.ts b/docs/.vuepress/notes.ts index 0d49d09c..97712243 100644 --- a/docs/.vuepress/notes.ts +++ b/docs/.vuepress/notes.ts @@ -1,6 +1,8 @@ import { definePlumeNotesConfig } from '@vuepress-plume/vuepress-theme-plume' export default definePlumeNotesConfig({ + dir: 'notes', + link: '/note', notes: [ { text: '', @@ -10,22 +12,22 @@ export default definePlumeNotesConfig({ '', { text: '指南', - children: ['快速开始', '编写文章'], + items: ['快速开始', '编写文章'], }, { text: '配置', - children: [ + items: [ { text: '主题配置', link: '主题配置', - children: ['主题插件配置', 'notes配置'], + items: ['主题插件配置', 'notes配置'], }, '页面配置', ], }, { text: '功能', - children: ['基础功能', 'markdown增强'], + items: ['基础功能', 'markdown增强'], }, ], }, @@ -39,7 +41,7 @@ export default definePlumeNotesConfig({ dir: 'netlify-functions', text: 'plugin-netlify-functions', link: 'netlify-functions', - children: ['', '介绍', '使用', '功能', 'API', 'functions开发指南'], + items: ['', '介绍', '使用', '功能', 'API', 'functions开发指南'], }, ], }, diff --git a/packages/plugin-blog-data/src/client/composables/useBlogPostData.ts b/packages/plugin-blog-data/src/client/composables/useBlogPostData.ts index 6e8290d0..222caea7 100644 --- a/packages/plugin-blog-data/src/client/composables/useBlogPostData.ts +++ b/packages/plugin-blog-data/src/client/composables/useBlogPostData.ts @@ -5,13 +5,13 @@ import type { BlogPostData } from '../../shared/index.js' declare const __VUE_HMR_RUNTIME__: Record<string, any> -export type ThemeDataRef<T extends BlogPostData = BlogPostData> = Ref<T> +export type BlogDataRef<T extends BlogPostData = BlogPostData> = Ref<T> -export const blogPostData: ThemeDataRef = ref(blogPostDataRaw) +export const blogPostData: BlogDataRef = ref(blogPostDataRaw) export const useBlogPostData = < T extends BlogPostData = BlogPostData ->(): ThemeDataRef<T> => blogPostData as ThemeDataRef<T> +>(): BlogDataRef<T> => blogPostData as BlogDataRef<T> if (import.meta.webpackHot || import.meta.hot) { __VUE_HMR_RUNTIME__.updateBlogData = (data: BlogPostData) => { diff --git a/packages/plugin-notes-data/package.json b/packages/plugin-notes-data/package.json index 9ecc79ba..20d745c4 100644 --- a/packages/plugin-notes-data/package.json +++ b/packages/plugin-notes-data/package.json @@ -30,10 +30,14 @@ "ts:watch": "tsc -b tsconfig.build.json --watch" }, "dependencies": { + "@vue/devtools-api": "^6.4.5", "@vuepress/client": "2.0.0-beta.60", "@vuepress/core": "2.0.0-beta.60", "@vuepress/shared": "2.0.0-beta.60", - "@vuepress/utils": "2.0.0-beta.60" + "@vuepress/utils": "2.0.0-beta.60", + "chokidar": "^3.5.3", + "create-filter": "^1.0.0", + "vue": "^3.2.47" }, "publishConfig": { "access": "public" diff --git a/packages/plugin-notes-data/src/client/clientConfig.ts b/packages/plugin-notes-data/src/client/clientConfig.ts index a726b269..fc251e8f 100644 --- a/packages/plugin-notes-data/src/client/clientConfig.ts +++ b/packages/plugin-notes-data/src/client/clientConfig.ts @@ -1,7 +1,37 @@ +import { setupDevtoolsPlugin } from '@vue/devtools-api' import { defineClientConfig } from '@vuepress/client' +import { useNotesData } from './composables/index.js' + +declare const __VUE_PROD_DEVTOOLS__: boolean export default defineClientConfig({ - setup() { - // do something + enhance({ app }) { + const notesData = useNotesData() + + // setup devtools in dev mode + if (__VUEPRESS_DEV__ || __VUE_PROD_DEVTOOLS__) { + setupDevtoolsPlugin( + { + // fix recursive reference + app: app as any, + id: 'org.vuepress-plume.plugin-notes-data', + label: 'VuePress Notes Data Plugin', + packageName: '@vuepress/plugin-notes-data', + homepage: 'https://pengzhanbo.cn', + logo: 'https://v2.vuepress.vuejs.org/images/hero.png', + componentStateTypes: ['VuePress'], + }, + (api) => { + api.on.inspectComponent((payload) => { + payload.instanceData.state.push({ + type: 'VuePress', + key: 'notesData', + editable: false, + value: notesData.value, + }) + }) + } + ) + } }, }) diff --git a/packages/plugin-notes-data/src/client/composables/index.ts b/packages/plugin-notes-data/src/client/composables/index.ts new file mode 100644 index 00000000..6434f5b2 --- /dev/null +++ b/packages/plugin-notes-data/src/client/composables/index.ts @@ -0,0 +1 @@ +export * from './notesDate.js' diff --git a/packages/plugin-notes-data/src/client/composables/notesDate.ts b/packages/plugin-notes-data/src/client/composables/notesDate.ts new file mode 100644 index 00000000..c9d54087 --- /dev/null +++ b/packages/plugin-notes-data/src/client/composables/notesDate.ts @@ -0,0 +1,20 @@ +import { notesData as notesDataRaw } from '@internal/notesData' +import { ref } from 'vue' +import type { Ref } from 'vue' +import type { NotesData } from '../../shared/index.js' + +declare const __VUE_HMR_RUNTIME__: Record<string, any> + +export type NotesDataRef<T extends NotesData = NotesData> = Ref<T> + +export const notesData: NotesDataRef = ref(notesDataRaw) + +export const useNotesData = < + T extends NotesData = NotesData +>(): NotesDataRef<T> => notesData as NotesDataRef<T> + +if (import.meta.webpackHot || import.meta.hot) { + __VUE_HMR_RUNTIME__.updateNotesData = (data: NotesData) => { + notesData.value = data + } +} diff --git a/packages/plugin-notes-data/src/client/index.ts b/packages/plugin-notes-data/src/client/index.ts index 72593733..f419aa80 100644 --- a/packages/plugin-notes-data/src/client/index.ts +++ b/packages/plugin-notes-data/src/client/index.ts @@ -1 +1,2 @@ -export * from '../shared/index.js' +export { NotesData, NotesSidebarItem } from '../shared/index.js' +export * from './composables/index.js' diff --git a/packages/plugin-notes-data/src/client/notesData.d.ts b/packages/plugin-notes-data/src/client/notesData.d.ts new file mode 100644 index 00000000..f5258ec2 --- /dev/null +++ b/packages/plugin-notes-data/src/client/notesData.d.ts @@ -0,0 +1,7 @@ +import type { NotesData } from '../shared/index.js' + +declare module '@internal/notesData' { + const notesData: NotesData + + export { notesData } +} diff --git a/packages/plugin-notes-data/src/node/plugin.ts b/packages/plugin-notes-data/src/node/plugin.ts index 2665ebb8..1a9b64af 100644 --- a/packages/plugin-notes-data/src/node/plugin.ts +++ b/packages/plugin-notes-data/src/node/plugin.ts @@ -1,12 +1,18 @@ import type { App, Plugin } from '@vuepress/core' -import { path } from '@vuepress/utils' +import { getDirname, path } from '@vuepress/utils' import type { NotesDataOptions } from '../shared/index.js' +import { prepareNotesData, watchNotesData } from './prepareNotesData.js' export const notesDataPlugin = (options: NotesDataOptions): Plugin => { return (app: App) => { return { name: '@vuepress-plume/vuepress-plugin-notes-data', - clientConfigFile: path.resolve(__dirname, '../client/clientConfig.js'), + clientConfigFile: path.resolve( + getDirname(import.meta.url), + '../client/clientConfig.js' + ), + onPrepared: () => prepareNotesData(app, options), + onWatched: (app, watchers) => watchNotesData(app, watchers, options), } } } diff --git a/packages/plugin-notes-data/src/node/prepareNotesData.ts b/packages/plugin-notes-data/src/node/prepareNotesData.ts new file mode 100644 index 00000000..dd3e5b71 --- /dev/null +++ b/packages/plugin-notes-data/src/node/prepareNotesData.ts @@ -0,0 +1,159 @@ +import path from 'node:path' +import type { App } from '@vuepress/core' +import * as chokidar from 'chokidar' +import { createFilter } from 'create-filter' +import type { + NotesData, + NotesDataOptions, + NotesItem, + NotesSidebar, + NotesSidebarItem, +} from '../shared/index.js' +import { ensureArray } from './utils.js' + +const HMR_CODE = ` +if (import.meta.webpackHot) { + import.meta.webpackHot.accept() + if (__VUE_HMR_RUNTIME__.updateNotesData) { + __VUE_HMR_RUNTIME__.updateNotesData(notesData) + } +} + +if (import.meta.hot) { + import.meta.hot.accept(({ notesData }) => { + __VUE_HMR_RUNTIME__.updateNotesData(notesData) + }) +} +` + +interface NotePage { + relativePath: string + title: string + link: string +} + +export const prepareNotesData = async ( + app: App, + { include, exclude, notes, dir, link }: NotesDataOptions +) => { + if (!notes || notes.length === 0) return + const filter = createFilter(ensureArray(include), ensureArray(exclude), { + resolve: false, + }) + const DIR_PATTERN = new RegExp(`^${path.join(dir, '/')}`) + const notesPageList: NotePage[] = app.pages + .filter( + (page) => + page.filePathRelative && + page.filePathRelative.startsWith(dir) && + filter(page.filePathRelative) + ) + .map((page) => { + return { + relativePath: page.filePathRelative?.replace(DIR_PATTERN, '') || '', + title: page.title, + link: page.path, + } + }) + + const notesData: NotesData = {} + notes.forEach((note) => { + notesData[path.join('/', link, note.link)] = initSidebar( + note, + notesPageList.filter((page) => + page.relativePath.startsWith(note.dir.trim().replace(/^\/|\/$/g, '')) + ) + ) + }) + let content = ` +export const notesData = ${JSON.stringify(notesData, null, 2)} +` + if (app.env.isDev) { + content += HMR_CODE + } + + await app.writeTemp('internal/notesData.js', content) +} + +export const watchNotesData = ( + app: App, + watchers: any[], + options: NotesDataOptions +): void => { + if (!options.notes || options.notes.length === 0 || !options.dir) return + const dir = path.join('pages', options.dir, '**/*') + const watcher = chokidar.watch(dir, { + cwd: app.dir.temp(), + ignoreInitial: true, + }) + + watcher.on('add', () => prepareNotesData(app, options)) + watcher.on('change', () => prepareNotesData(app, options)) + watcher.on('unlink', () => prepareNotesData(app, options)) + watchers.push(watcher) +} + +function initSidebar(note: NotesItem, pages: NotePage[]): NotesSidebarItem[] { + console.log('pages:', pages) + if (!note.sidebar) return [] + if (note.sidebar === 'auto') return [] + return initSidebarByConfig(note, pages) +} + +function initSidebarByConfig( + { text, link, dir, sidebar }: NotesItem, + pages: NotePage[] +): NotesSidebarItem[] { + return (sidebar as NotesSidebar).map((item) => { + console.log('text: ', text, 's-item: ', item, 'dir: ', dir) + if (typeof item === 'string') { + const current = findNotePage(item, dir, pages) + return { + text: current?.title || text, + link: current?.link, + items: [], + } + } else { + // link = path.join(link || '', item.link || '') + const current = findNotePage(item.link || '', dir, pages) + return { + text: item.text || item.dir || current?.title, + link: current?.link, + items: initSidebarByConfig( + { + link: item.link || '', + text: item.text || '', + sidebar: item.items, + dir: path.join(dir, item.dir || ''), + }, + pages + ), + } + } + }) +} + +function findNotePage( + sidebar: string, + dir: string, + notePageList: NotePage[] +): NotePage | undefined { + if (sidebar === '' || sidebar === 'README.md' || sidebar === 'index.md') { + return notePageList.find((page) => { + const relative = page.relativePath + return ( + relative === path.join(dir, 'README.md') || + relative === path.join(dir, 'index.md') + ) + }) + } else { + return notePageList.find((page) => { + const relative = page.relativePath + return ( + relative === path.join(dir, sidebar) || + relative === path.join(dir, sidebar + '.md') || + page.link === sidebar + ) + }) + } +} diff --git a/packages/plugin-notes-data/src/node/utils.ts b/packages/plugin-notes-data/src/node/utils.ts new file mode 100644 index 00000000..981a3c67 --- /dev/null +++ b/packages/plugin-notes-data/src/node/utils.ts @@ -0,0 +1,5 @@ +export function ensureArray<T>(thing: T | T[] | null | undefined): T[] { + if (Array.isArray(thing)) return thing + if (thing === null || thing === undefined) return [] + return [thing] +} diff --git a/packages/plugin-notes-data/src/shared/index.ts b/packages/plugin-notes-data/src/shared/index.ts index fc318a9b..67d5d9d0 100644 --- a/packages/plugin-notes-data/src/shared/index.ts +++ b/packages/plugin-notes-data/src/shared/index.ts @@ -1,3 +1,25 @@ -export interface NotesDataOptions { - a?: string +export type NotesDataOptions = { + dir: string + link: string + include?: string | string[] + exclude?: string | string[] + notes: NotesItem[] } + +export type NotesItem = { + dir: string + link: string + text: string + sidebar?: NotesSidebar | 'auto' +} + +export type NotesSidebar = (NotesSidebarItem | string)[] + +export type NotesSidebarItem = { + text?: string + link?: string + dir?: string + items?: NotesSidebar +} + +export type NotesData = Record<string, NotesSidebarItem[]> diff --git a/packages/plugin-notes-data/tsconfig.build.json b/packages/plugin-notes-data/tsconfig.build.json index 6bf67375..a08fdad2 100644 --- a/packages/plugin-notes-data/tsconfig.build.json +++ b/packages/plugin-notes-data/tsconfig.build.json @@ -2,7 +2,11 @@ "extends": "../tsconfig.build.json", "compilerOptions": { "rootDir": "./src", - "outDir": "./lib" + "outDir": "./lib", + "paths": { + "@internal/notesData": ["./src/client/notesData.d.ts"] + }, + "types": ["@vuepress/client/types", "vite/client", "webpack-env"] }, "include": ["./src"] } diff --git a/packages/theme/package.json b/packages/theme/package.json index 22235f40..eb23060d 100644 --- a/packages/theme/package.json +++ b/packages/theme/package.json @@ -39,6 +39,7 @@ "@vuepress-plume/vuepress-plugin-blog-data": "workspace:*", "@vuepress-plume/vuepress-plugin-caniuse": "workspace:*", "@vuepress-plume/vuepress-plugin-copy-code": "workspace:*", + "@vuepress-plume/vuepress-plugin-notes-data": "workspace:*", "@vuepress/client": "2.0.0-beta.60", "@vuepress/core": "2.0.0-beta.60", "@vuepress/plugin-active-header-links": "2.0.0-beta.60", diff --git a/packages/theme/src/node/defineConfig.ts b/packages/theme/src/node/defineConfig.ts index 27fd166e..4d7ca91c 100644 --- a/packages/theme/src/node/defineConfig.ts +++ b/packages/theme/src/node/defineConfig.ts @@ -1,12 +1,10 @@ import type { - PlumeThemeNotesItem, - PlumeThemeNotesOptions, -} from '../shared/index.js' + NotesDataOptions, + NotesItem, +} from '@vuepress-plume/vuepress-plugin-notes-data' export const definePlumeNotesConfig = ( - notes: PlumeThemeNotesOptions -): PlumeThemeNotesOptions => notes + notes: NotesDataOptions +): NotesDataOptions => notes -export const definePlumeNotesItemConfig = ( - item: PlumeThemeNotesItem -): PlumeThemeNotesItem => item +export const definePlumeNotesItemConfig = (item: NotesItem): NotesItem => item diff --git a/packages/theme/src/node/plugins.ts b/packages/theme/src/node/plugins.ts index 4ce3adb9..c2f17666 100644 --- a/packages/theme/src/node/plugins.ts +++ b/packages/theme/src/node/plugins.ts @@ -3,6 +3,7 @@ import { baiduTongjiPlugin } from '@vuepress-plume/vuepress-plugin-baidu-tongji' import { blogDataPlugin } from '@vuepress-plume/vuepress-plugin-blog-data' import { caniusePlugin } from '@vuepress-plume/vuepress-plugin-caniuse' import { copyCodePlugin } from '@vuepress-plume/vuepress-plugin-copy-code' +import { notesDataPlugin } from '@vuepress-plume/vuepress-plugin-notes-data' import type { App, PluginConfig } from '@vuepress/core' import { activeHeaderLinksPlugin } from '@vuepress/plugin-active-header-links' import { docsearchPlugin } from '@vuepress/plugin-docsearch' @@ -39,6 +40,7 @@ export const setupPlugins = ( include: ['**/*.md'], exclude: ['**/{README,index}.md', 'notes/**'], }), + localeOptions.notes ? notesDataPlugin(localeOptions.notes) : [], activeHeaderLinksPlugin({ headerLinkSelector: 'a.theme-plume-toc-link', headerAnchorSelector: '.header-anchor', diff --git a/packages/theme/src/shared/options/index.ts b/packages/theme/src/shared/options/index.ts index 588243bc..3363b0e1 100644 --- a/packages/theme/src/shared/options/index.ts +++ b/packages/theme/src/shared/options/index.ts @@ -39,10 +39,6 @@ export interface PlumeThemeOptions extends PlumeThemeLocaleOptions { */ exclude?: string[] } - - notes?: { - dir?: string - } } export type PlumeThemeLocaleOptions = PlumeThemeData diff --git a/packages/theme/src/shared/options/locale.ts b/packages/theme/src/shared/options/locale.ts index dba9f9f7..3183df1a 100644 --- a/packages/theme/src/shared/options/locale.ts +++ b/packages/theme/src/shared/options/locale.ts @@ -1,3 +1,4 @@ +import type { NotesDataOptions } from '@vuepress-plume/vuepress-plugin-notes-data' import type { LocaleData } from '@vuepress/core' // import type { NavbarConfig, NavLink } from '../layout/index.js' // import type { PlumeThemeNotesOptions } from './notes.js' @@ -5,7 +6,6 @@ import type { LocaleData } from '@vuepress/core' // todo type type NavbarConfig = any type NavLink = any -type PlumeThemeNotesOptions = any export interface PlumeThemeAvatar { /** @@ -135,7 +135,7 @@ export interface PlumeThemeLocaleData extends LocaleData { * * 注:你也可以将notes配置到navbar中,默认自动生成在右侧栏目中 */ - notes?: false | PlumeThemeNotesOptions + notes?: false | NotesDataOptions footer?: false | { content: string; copyright: string } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 17881d15..800d7f5b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -213,15 +213,23 @@ importers: packages/plugin-notes-data: specifiers: + '@vue/devtools-api': ^6.4.5 '@vuepress/client': 2.0.0-beta.60 '@vuepress/core': 2.0.0-beta.60 '@vuepress/shared': 2.0.0-beta.60 '@vuepress/utils': 2.0.0-beta.60 + chokidar: ^3.5.3 + create-filter: ^1.0.0 + vue: ^3.2.47 dependencies: + '@vue/devtools-api': 6.4.5 '@vuepress/client': 2.0.0-beta.60 '@vuepress/core': 2.0.0-beta.60 '@vuepress/shared': 2.0.0-beta.60 '@vuepress/utils': 2.0.0-beta.60 + chokidar: 3.5.3 + create-filter: 1.0.0 + vue: 3.2.47 packages/plugin-page-collection: specifiers: @@ -271,6 +279,7 @@ importers: '@vuepress-plume/vuepress-plugin-blog-data': workspace:* '@vuepress-plume/vuepress-plugin-caniuse': workspace:* '@vuepress-plume/vuepress-plugin-copy-code': workspace:* + '@vuepress-plume/vuepress-plugin-notes-data': workspace:* '@vuepress/client': 2.0.0-beta.60 '@vuepress/core': 2.0.0-beta.60 '@vuepress/plugin-active-header-links': 2.0.0-beta.60 @@ -305,6 +314,7 @@ importers: '@vuepress-plume/vuepress-plugin-blog-data': link:../plugin-blog-data '@vuepress-plume/vuepress-plugin-caniuse': link:../plugin-caniuse '@vuepress-plume/vuepress-plugin-copy-code': link:../plugin-copy-code + '@vuepress-plume/vuepress-plugin-notes-data': link:../plugin-notes-data '@vuepress/client': 2.0.0-beta.60 '@vuepress/core': 2.0.0-beta.60 '@vuepress/plugin-active-header-links': 2.0.0-beta.60 diff --git a/tsconfig.json b/tsconfig.json index 146ba7e4..db24b07a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,6 +9,9 @@ "@internal/blogData": [ "./packages/plugin-blog-data/src/client/blogPostData.d.ts" ], + "@internal/notesData": [ + "./packages/plugin-notes-data/src/client/notesData.d.ts" + ], "@internal/*": ["./docs/.vuepress/.temp/internal/*"], "@vuepress-plume/vuepress-*": ["./packages/*/src/node/index.ts"], "@vuepress-plume/vuepress-theme-plume": [ From 4b0078d010e2acc568d80e12ec36a6b4924ee491 Mon Sep 17 00:00:00 2001 From: pengzhanbo <volodymyr@foxmail.com> Date: Sat, 11 Feb 2023 18:59:38 +0800 Subject: [PATCH 25/29] feat(theme): add navbar components --- docs/.vuepress/config.ts | 27 +-- .../src/node/prepareNotesData.ts | 4 +- .../plugin-notes-data/src/shared/index.ts | 1 + .../theme/src/client/components/AutoLink.vue | 42 +++++ .../client/components/Flyout/MenuGroup.vue | 46 +++++ .../src/client/components/Flyout/MenuLink.vue | 57 ++++++ .../src/client/components/Flyout/VMenu.vue | 72 ++++++++ .../src/client/components/Flyout/index.vue | 138 +++++++++++++++ .../src/client/components/Nav/NavBar.vue | 14 ++ .../components/Nav/NavBarAppearance.vue | 25 +++ .../src/client/components/Nav/NavBarExtra.vue | 78 +++++++++ .../client/components/Nav/NavBarHamburger.vue | 118 +++++++++++++ .../src/client/components/Nav/NavBarMenu.vue | 35 ++++ .../client/components/Nav/NavBarMenuGroup.vue | 23 +++ .../client/components/Nav/NavBarMenuLink.vue | 50 ++++++ .../components/Nav/NavBarSocialLinks.vue | 27 +++ .../src/client/components/SocialLink.vue | 50 ++++++ .../src/client/components/SocialLinks.vue | 27 +++ .../theme/src/client/components/Switch.vue | 63 +++++++ .../client/components/SwitchAppearance.vue | 118 +++++++++++++ .../theme/src/client/composables/darkMode.ts | 57 +----- .../theme/src/client/composables/flyout.ts | 59 +++++++ .../theme/src/client/composables/sidebar.ts | 162 +++++++++++++++++- packages/theme/src/client/styles/index.scss | 1 + packages/theme/src/client/styles/utils.scss | 9 + packages/theme/src/client/utils/index.ts | 3 + .../theme/src/client/utils/normalizeLink.ts | 20 +++ packages/theme/src/client/utils/shared.ts | 43 +++++ .../theme/src/client/utils/socialIcons.ts | 22 +++ packages/theme/src/node/plugins.ts | 9 +- packages/theme/src/shared/options/index.ts | 1 + packages/theme/src/shared/options/locale.ts | 73 +++----- packages/theme/src/shared/options/navbar.ts | 28 +++ 33 files changed, 1383 insertions(+), 119 deletions(-) create mode 100644 packages/theme/src/client/components/AutoLink.vue create mode 100644 packages/theme/src/client/components/Flyout/MenuGroup.vue create mode 100644 packages/theme/src/client/components/Flyout/MenuLink.vue create mode 100644 packages/theme/src/client/components/Flyout/VMenu.vue create mode 100644 packages/theme/src/client/components/Flyout/index.vue create mode 100644 packages/theme/src/client/components/Nav/NavBarAppearance.vue create mode 100644 packages/theme/src/client/components/Nav/NavBarExtra.vue create mode 100644 packages/theme/src/client/components/Nav/NavBarHamburger.vue create mode 100644 packages/theme/src/client/components/Nav/NavBarMenu.vue create mode 100644 packages/theme/src/client/components/Nav/NavBarMenuGroup.vue create mode 100644 packages/theme/src/client/components/Nav/NavBarMenuLink.vue create mode 100644 packages/theme/src/client/components/Nav/NavBarSocialLinks.vue create mode 100644 packages/theme/src/client/components/SocialLink.vue create mode 100644 packages/theme/src/client/components/SocialLinks.vue create mode 100644 packages/theme/src/client/components/Switch.vue create mode 100644 packages/theme/src/client/components/SwitchAppearance.vue create mode 100644 packages/theme/src/client/composables/flyout.ts create mode 100644 packages/theme/src/client/styles/utils.scss create mode 100644 packages/theme/src/client/utils/index.ts create mode 100644 packages/theme/src/client/utils/normalizeLink.ts create mode 100644 packages/theme/src/client/utils/shared.ts create mode 100644 packages/theme/src/client/utils/socialIcons.ts create mode 100644 packages/theme/src/shared/options/navbar.ts diff --git a/docs/.vuepress/config.ts b/docs/.vuepress/config.ts index fc75ef62..1286668a 100644 --- a/docs/.vuepress/config.ts +++ b/docs/.vuepress/config.ts @@ -19,31 +19,32 @@ export default defineUserConfig({ theme: themePlume({ logo: 'https://pengzhanbo.cn/g.gif', hostname: 'https://pengzhanbo.cn', + appearance: true, avatar: { url: '/images/blogger.jpg', name: 'Plume Theme', description: 'The Theme for Vuepress 2.0', }, - social: { - email: 'volodymyr@foxmail.com', - github: 'pengzhanbo', - QQ: '942450674', - weiBo: 'https://weibo.com', - zhiHu: 'https://zhihu.com', - facebook: 'https://baidu.com', - twitter: 'https://baidu.com', - linkedin: 'https://baidu.com', - }, + social: [{ icon: 'github', link: 'https://github.com/pengzhanbo' }], + // { + // email: 'volodymyr@foxmail.com', + // github: 'pengzhanbo', + // QQ: '942450674', + // weiBo: 'https://weibo.com', + // zhiHu: 'https://zhihu.com', + // facebook: 'https://baidu.com', + // twitter: 'https://baidu.com', + // linkedin: 'https://baidu.com', + // }, notes, - darkMode: true, navbar: [ { text: 'VuePress', - children: [ + items: [ { text: 'theme-plume', link: '/note/vuepress-theme-plume/' }, { text: 'Plugin', - children: [ + items: [ { text: 'caniuse', link: '/note/vuepress-plugin/caniuse/' }, { text: 'netlify-functions', diff --git a/packages/plugin-notes-data/src/node/prepareNotesData.ts b/packages/plugin-notes-data/src/node/prepareNotesData.ts index dd3e5b71..6795c729 100644 --- a/packages/plugin-notes-data/src/node/prepareNotesData.ts +++ b/packages/plugin-notes-data/src/node/prepareNotesData.ts @@ -101,7 +101,7 @@ function initSidebar(note: NotesItem, pages: NotePage[]): NotesSidebarItem[] { } function initSidebarByConfig( - { text, link, dir, sidebar }: NotesItem, + { text, dir, sidebar }: NotesItem, pages: NotePage[] ): NotesSidebarItem[] { return (sidebar as NotesSidebar).map((item) => { @@ -114,11 +114,11 @@ function initSidebarByConfig( items: [], } } else { - // link = path.join(link || '', item.link || '') const current = findNotePage(item.link || '', dir, pages) return { text: item.text || item.dir || current?.title, link: current?.link, + collapsed: item.collapsed, items: initSidebarByConfig( { link: item.link || '', diff --git a/packages/plugin-notes-data/src/shared/index.ts b/packages/plugin-notes-data/src/shared/index.ts index 67d5d9d0..ea4a16fc 100644 --- a/packages/plugin-notes-data/src/shared/index.ts +++ b/packages/plugin-notes-data/src/shared/index.ts @@ -19,6 +19,7 @@ export type NotesSidebarItem = { text?: string link?: string dir?: string + collapsed?: boolean items?: NotesSidebar } diff --git a/packages/theme/src/client/components/AutoLink.vue b/packages/theme/src/client/components/AutoLink.vue new file mode 100644 index 00000000..ee8c11bc --- /dev/null +++ b/packages/theme/src/client/components/AutoLink.vue @@ -0,0 +1,42 @@ +<script lang="ts" setup> +import { computed } from 'vue' +import { EXTERNAL_URL_RE, normalizeLink } from '../utils/index.js' +import IconExternalLink from './icons/IconExternalLink.vue' + +const props = defineProps<{ + tag?: string + href?: string + noIcon?: boolean +}>() + +const tag = computed(() => (props.tag ?? props.href ? 'a' : 'span')) +const isExternal = computed( + () => props.href && EXTERNAL_URL_RE.test(props.href) +) +</script> + +<template> + <Component + :is="tag" + class="auto-link" + :class="{ link: href }" + :href="href ? normalizeLink(href) : undefined" + :target="isExternal ? '_blank' : undefined" + :rel="isExternal ? 'noreferrer' : undefined" + > + <slot /> + <IconExternalLink v-if="isExternal && !noIcon" class="icon" /> + </Component> +</template> + +<style scoped> +.icon { + display: inline-block; + margin-top: -1px; + margin-left: 4px; + width: 11px; + height: 11px; + fill: var(--vp-c-text-3); + transition: fill 0.25s; +} +</style> diff --git a/packages/theme/src/client/components/Flyout/MenuGroup.vue b/packages/theme/src/client/components/Flyout/MenuGroup.vue new file mode 100644 index 00000000..dc12f21e --- /dev/null +++ b/packages/theme/src/client/components/Flyout/MenuGroup.vue @@ -0,0 +1,46 @@ +<script lang="ts" setup> +import MenuLink from './MenuLink.vue' + +defineProps<{ + text?: string + items: any[] +}>() +</script> + +<template> + <div class="menu-group"> + <p v-if="text" class="title">{{ text }}</p> + + <template v-for="item in items"> + <MenuLink v-if="'link' in item" :key="item?.link" :item="item" /> + </template> + </div> +</template> + +<style scoped> +.menu-group { + margin: 12px -12px 0; + border-top: 1px solid var(--vp-c-divider); + padding: 12px 12px 0; +} + +.menu-group:first-child { + margin-top: 0; + border-top: 0; + padding-top: 0; +} + +.menu-group + .menu-group { + margin-top: 12px; + border-top: 1px solid var(--vp-c-divider); +} + +.title { + padding: 0 12px; + line-height: 32px; + font-size: 14px; + font-weight: 600; + color: var(--vp-c-text-2); + transition: color 0.25s; +} +</style> diff --git a/packages/theme/src/client/components/Flyout/MenuLink.vue b/packages/theme/src/client/components/Flyout/MenuLink.vue new file mode 100644 index 00000000..aa43cf43 --- /dev/null +++ b/packages/theme/src/client/components/Flyout/MenuLink.vue @@ -0,0 +1,57 @@ +<script lang="ts" setup> +import { usePageData } from '@vuepress/client' +import { isActive } from '../../utils/index.js' +import AutoLink from '../AutoLink.vue' + +defineProps<{ + item: any +}>() + +const page = usePageData() +</script> + +<template> + <div class="menu-link"> + <AutoLink + :class="{ + active: isActive( + page.path, + item.activeMatch || item.link, + !!item.activeMatch + ), + }" + :href="item.link" + > + {{ item.text }} + </AutoLink> + </div> +</template> + +<style scoped> +.menu-group + .menu-link { + margin: 12px -12px 0; + border-top: 1px solid var(--vp-c-divider); + padding: 12px 12px 0; +} + +.link { + display: block; + border-radius: 6px; + padding: 0 12px; + line-height: 32px; + font-size: 14px; + font-weight: 500; + color: var(--vp-c-text-1); + white-space: nowrap; + transition: background-color 0.25s, color 0.25s; +} + +.link:hover { + color: var(--vp-c-brand); + background-color: var(--vp-c-bg-elv-mute); +} + +.link.active { + color: var(--vp-c-brand); +} +</style> diff --git a/packages/theme/src/client/components/Flyout/VMenu.vue b/packages/theme/src/client/components/Flyout/VMenu.vue new file mode 100644 index 00000000..91c3f491 --- /dev/null +++ b/packages/theme/src/client/components/Flyout/VMenu.vue @@ -0,0 +1,72 @@ +<script lang="ts" setup> +import MenuGroup from './MenuGroup.vue' +import MenuLink from './MenuLink.vue' + +defineProps<{ + items?: any[] +}>() +</script> + +<template> + <div class="menu-wrapper"> + <div v-if="items" class="items"> + <template v-for="item in items" :key="item.text"> + <MenuLink v-if="'link' in item" :item="item" /> + <MenuGroup v-else :text="item.text" :items="item.items" /> + </template> + </div> + + <slot /> + </div> +</template> + +<style scoped> +.menu-wrapper { + border-radius: 12px; + padding: 12px; + min-width: 128px; + border: 1px solid var(--vp-c-divider); + background-color: var(--vp-c-bg-elv); + box-shadow: var(--vp-shadow-3); + transition: background-color 0.5s; + max-height: calc(100vh - var(--vp-nav-height)); + overflow-y: auto; +} + +.menu-wrapper :deep(.group) { + margin: 0 -12px; + padding: 0 12px 12px; +} + +.menu-wrapper :deep(.group + .group) { + border-top: 1px solid var(--vp-c-divider); + padding: 11px 12px 12px; +} + +.menu-wrapper :deep(.group:last-child) { + padding-bottom: 0; +} + +.menu-wrapper :deep(.group + .item) { + border-top: 1px solid var(--vp-c-divider); + padding: 11px 16px 0; +} + +.menu-wrapper :deep(.item) { + padding: 0 16px; + white-space: nowrap; +} + +.menu-wrapper :deep(.label) { + flex-grow: 1; + line-height: 28px; + font-size: 12px; + font-weight: 500; + color: var(--vp-c-text-2); + transition: color 0.5s; +} + +.menu-wrapper :deep(.action) { + padding-left: 24px; +} +</style> diff --git a/packages/theme/src/client/components/Flyout/index.vue b/packages/theme/src/client/components/Flyout/index.vue new file mode 100644 index 00000000..f4456911 --- /dev/null +++ b/packages/theme/src/client/components/Flyout/index.vue @@ -0,0 +1,138 @@ +<script lang="ts" setup> +import { ref } from 'vue' +import { useFlyout } from '../../composables/flyout.js' +import IconChevronDown from '../icons/IconChevronDown.vue' +import IconMoreHorizontal from '../icons/IconMoreHorizontal.vue' +import VMenu from './VMenu.vue' + +defineProps<{ + icon?: any + button?: string + label?: string + items?: any[] +}>() + +const open = ref(false) +const el = ref<HTMLElement>() + +useFlyout({ el, onBlur }) + +function onBlur() { + open.value = false +} +</script> + +<template> + <div + ref="el" + class="flyout-wrapper" + @mouseenter="open = true" + @mouseleave="open = false" + > + <button + type="button" + class="button" + aria-haspopup="true" + :aria-expanded="open" + :aria-label="label" + @click="open = !open" + > + <span v-if="button || icon" class="text"> + <Component :is="icon" v-if="icon" class="option-icon" /> + {{ button }} + <IconChevronDown class="text-icon" /> + </span> + + <IconMoreHorizontal v-else class="icon" /> + </button> + + <div class="menu"> + <VMenu :items="items"> + <slot /> + </VMenu> + </div> + </div> +</template> + +<style scoped> +.flyout-wrapper { + position: relative; +} + +.flyout-wrapper:hover { + color: var(--vp-c-brand); + transition: color 0.25s; +} + +.flyout-wrapper:hover .text { + color: var(--vp-c-text-2); +} + +.flyout-wrapper:hover .icon { + fill: var(--vp-c-text-2); +} + +.flyout-wrapper.active .text { + color: var(--vp-c-brand); +} + +.flyout-wrapper.active:hover .text { + color: var(--vp-c-brand-dark); +} + +.flyout-wrapper:hover .menu, +.button[aria-expanded='true'] + .menu { + opacity: 1; + visibility: visible; + transform: translateY(0); +} + +.button { + display: flex; + align-items: center; + padding: 0 12px; + height: var(--vp-nav-height); + color: var(--vp-c-text-1); + transition: color 0.5s; +} + +.text { + display: flex; + align-items: center; + line-height: var(--vp-nav-height); + font-size: 14px; + font-weight: 500; + color: var(--vp-c-text-1); + transition: color 0.25s; +} + +.option-icon { + margin-right: 0px; + width: 16px; + height: 16px; + fill: currentColor; +} + +.text-icon { + margin-left: 4px; + width: 14px; + height: 14px; + fill: currentColor; +} + +.icon { + width: 20px; + height: 20px; + fill: currentColor; + transition: fill 0.25s; +} + +.menu { + position: absolute; + top: calc(var(--vp-nav-height) / 2 + 20px); + right: 0; + opacity: 0; + visibility: hidden; + transition: opacity 0.25s, visibility 0.25s, transform 0.25s; +} +</style> diff --git a/packages/theme/src/client/components/Nav/NavBar.vue b/packages/theme/src/client/components/Nav/NavBar.vue index 9b6aed79..4b26fb1c 100644 --- a/packages/theme/src/client/components/Nav/NavBar.vue +++ b/packages/theme/src/client/components/Nav/NavBar.vue @@ -2,6 +2,11 @@ import { useWindowScroll } from '@vueuse/core' import { computed } from 'vue' import { useSidebar } from '../../composables/sidebar.js' +import NavBarAppearance from './NavBarAppearance.vue' +import NavBarExtra from './NavBarExtra.vue' +import NavBarHamburger from './NavBarHamburger.vue' +import NavBarMenu from './NavBarMenu.vue' +import NavBarSocialLinks from './NavBarSocialLinks.vue' import NavBarTitle from './NavBarTitle.vue' defineProps<{ @@ -31,6 +36,15 @@ const classes = computed(() => ({ <div class="curtain"></div> <div class="content-body"> <NavbarSearch class="search" /> + <NavBarMenu class="menu" /> + <NavBarAppearance class="appearance" /> + <NavBarSocialLinks class="social-links" /> + <NavBarExtra class="extra" /> + <NavBarHamburger + class="hamburger" + :active="isScreenOpen" + @click="$emit('toggle-screen')" + /> </div> </div> </div> diff --git a/packages/theme/src/client/components/Nav/NavBarAppearance.vue b/packages/theme/src/client/components/Nav/NavBarAppearance.vue new file mode 100644 index 00000000..b04ed1fd --- /dev/null +++ b/packages/theme/src/client/components/Nav/NavBarAppearance.vue @@ -0,0 +1,25 @@ +<script lang="ts" setup> +import { useThemeLocaleData } from '../../composables/index.js' +import SwitchAppearance from '../SwitchAppearance.vue' + +const theme = useThemeLocaleData() +</script> + +<template> + <div v-if="theme.appearance" class="navbar-appearance"> + <SwitchAppearance /> + </div> +</template> + +<style scoped> +.navbar-appearance { + display: none; +} + +@media (min-width: 1280px) { + .navbar-appearance { + display: flex; + align-items: center; + } +} +</style> diff --git a/packages/theme/src/client/components/Nav/NavBarExtra.vue b/packages/theme/src/client/components/Nav/NavBarExtra.vue new file mode 100644 index 00000000..fc8f22a7 --- /dev/null +++ b/packages/theme/src/client/components/Nav/NavBarExtra.vue @@ -0,0 +1,78 @@ +<script lang="ts" setup> +import { computed } from 'vue' +import { useThemeLocaleData } from '../../composables/index.js' +import Flyout from '../Flyout/index.vue' +import SocialLinks from '../SocialLinks.vue' +import SwitchAppearance from '../SwitchAppearance.vue' + +const theme = useThemeLocaleData() + +const hasExtraContent = computed( + () => theme.value.appearance || theme.value.social +) +</script> + +<template> + <Flyout v-if="hasExtraContent" class="navbar-extra" label="extra navigation"> + <div v-if="theme.appearance" class="group"> + <div class="item appearance"> + <p class="label">Appearance</p> + <div class="appearance-action"> + <SwitchAppearance /> + </div> + </div> + </div> + + <div v-if="theme.social" class="group"> + <div class="item social-links"> + <SocialLinks class="social-links-list" :links="theme.social" /> + </div> + </div> + </Flyout> +</template> + +<style scoped> +.navbar-extra { + display: none; + margin-right: -12px; +} + +@media (min-width: 768px) { + .navbar-extra { + display: block; + } +} + +@media (min-width: 1280px) { + .navbar-extra { + display: none; + } +} + +.trans-title { + padding: 0 24px 0 12px; + line-height: 32px; + font-size: 14px; + font-weight: 700; + color: var(--vp-c-text-1); +} + +.item.appearance, +.item.social-links { + display: flex; + align-items: center; + padding: 0 12px; +} + +.item.appearance { + min-width: 176px; +} + +.appearance-action { + margin-right: -2px; +} + +.social-links-list { + margin: -4px -8px; +} +</style> diff --git a/packages/theme/src/client/components/Nav/NavBarHamburger.vue b/packages/theme/src/client/components/Nav/NavBarHamburger.vue new file mode 100644 index 00000000..f4129e2a --- /dev/null +++ b/packages/theme/src/client/components/Nav/NavBarHamburger.vue @@ -0,0 +1,118 @@ +<script lang="ts" setup> +defineProps<{ + active: boolean +}>() + +defineEmits<{ + (e: 'click'): void +}>() +</script> + +<template> + <button + type="button" + class="navbar-hamburger" + :class="{ active }" + aria-label="mobile navigation" + :aria-expanded="active" + aria-controls="nav-screen" + @click="$emit('click')" + > + <span class="container"> + <span class="top" /> + <span class="middle" /> + <span class="bottom" /> + </span> + </button> +</template> + +<style scoped> +.navbar-hamburger { + display: flex; + justify-content: center; + align-items: center; + width: 48px; + height: var(--vp-nav-height); +} + +@media (min-width: 768px) { + .navbar-hamburger { + display: none; + } +} + +.container { + position: relative; + width: 16px; + height: 14px; + overflow: hidden; +} + +.navbar-hamburger:hover .top { + top: 0; + left: 0; + transform: translateX(4px); +} + +.navbar-hamburger:hover .middle { + top: 6px; + left: 0; + transform: translateX(0); +} + +.navbar-hamburger:hover .bottom { + top: 12px; + left: 0; + transform: translateX(8px); +} + +.navbar-hamburger.active .top { + top: 6px; + transform: translateX(0) rotate(225deg); +} + +.navbar-hamburger.active .middle { + top: 6px; + transform: translateX(16px); +} + +.navbar-hamburger.active .bottom { + top: 6px; + transform: translateX(0) rotate(135deg); +} + +.navbar-hamburger.active:hover .top, +.navbar-hamburger.active:hover .middle, +.navbar-hamburger.active:hover .bottom { + background-color: var(--vp-c-text-2); + transition: top 0.25s, background-color 0.25s, transform 0.25s; +} + +.top, +.middle, +.bottom { + position: absolute; + width: 16px; + height: 2px; + background-color: var(--vp-c-text-1); + transition: top 0.25s, background-color 0.5s, transform 0.25s; +} + +.top { + top: 0; + left: 0; + transform: translateX(0); +} + +.middle { + top: 6px; + left: 0; + transform: translateX(8px); +} + +.bottom { + top: 12px; + left: 0; + transform: translateX(4px); +} +</style> diff --git a/packages/theme/src/client/components/Nav/NavBarMenu.vue b/packages/theme/src/client/components/Nav/NavBarMenu.vue new file mode 100644 index 00000000..10c45b53 --- /dev/null +++ b/packages/theme/src/client/components/Nav/NavBarMenu.vue @@ -0,0 +1,35 @@ +<script lang="ts" setup> +import { useThemeLocaleData } from '../../composables/themeData.js' +import NavBarMenuGroup from './NavBarMenuGroup.vue' +import NavBarMenuLink from './NavBarMenuLink.vue' + +const theme = useThemeLocaleData() +</script> + +<template> + <nav + v-if="theme.navbar" + aria-labelledby="main-nav-aria-label" + class="navbar-menu" + > + <span id="main-nav-aria-label" class="visually-hidden" + >Main Navigation</span + > + <template v-for="item in theme.navbar" :key="item.text"> + <NavBarMenuLink v-if="'link' in item" :item="item" /> + <NavBarMenuGroup v-else :item="item" /> + </template> + </nav> +</template> + +<style scoped> +.navbar-menu { + display: none; +} + +@media (min-width: 768px) { + .navbar-menu { + display: flex; + } +} +</style> diff --git a/packages/theme/src/client/components/Nav/NavBarMenuGroup.vue b/packages/theme/src/client/components/Nav/NavBarMenuGroup.vue new file mode 100644 index 00000000..deb023ee --- /dev/null +++ b/packages/theme/src/client/components/Nav/NavBarMenuGroup.vue @@ -0,0 +1,23 @@ +<script lang="ts" setup> +import { usePageData } from '@vuepress/client' +import type { NavItemWithChildren } from '../../../shared/index.js' +import { isActive } from '../../utils/index.js' +import Flyout from '../Flyout/index.vue' + +defineProps<{ + item: NavItemWithChildren +}>() + +const page = usePageData() +</script> + +<template> + <Flyout + :class="{ + 'navbar-menu-group': true, + 'active': isActive(page.path, item.activeMatch, !!item.activeMatch), + }" + :button="item.text" + :items="item.items" + /> +</template> diff --git a/packages/theme/src/client/components/Nav/NavBarMenuLink.vue b/packages/theme/src/client/components/Nav/NavBarMenuLink.vue new file mode 100644 index 00000000..0b5bd0a5 --- /dev/null +++ b/packages/theme/src/client/components/Nav/NavBarMenuLink.vue @@ -0,0 +1,50 @@ +<script lang="ts" setup> +import { usePageData } from '@vuepress/client' +import type { NavItemWithLink } from '../../../shared/index.js' +import { isActive } from '../../utils/index.js' +import AutoLink from '../AutoLink.vue' + +defineProps<{ + item: NavItemWithLink +}>() + +const page = usePageData() +</script> + +<template> + <AutoLink + :class="{ + 'navbar-menu-link': true, + 'active': isActive( + page.path, + item.activeMatch || item.link, + !!item.activeMatch + ), + }" + :href="item.link" + :no-icon="true" + > + {{ item.text }} + </AutoLink> +</template> + +<style scoped> +.navbar-menu-link { + display: flex; + align-items: center; + padding: 0 12px; + line-height: var(--vp-nav-height); + font-size: 14px; + font-weight: 500; + color: var(--vp-c-text-1); + transition: color 0.25s; +} + +.navbar-menu-link.active { + color: var(--vp-c-brand); +} + +.navbar-menu-link:hover { + color: var(--vp-c-brand); +} +</style> diff --git a/packages/theme/src/client/components/Nav/NavBarSocialLinks.vue b/packages/theme/src/client/components/Nav/NavBarSocialLinks.vue new file mode 100644 index 00000000..9f1f494c --- /dev/null +++ b/packages/theme/src/client/components/Nav/NavBarSocialLinks.vue @@ -0,0 +1,27 @@ +<script lang="ts" setup> +import { useThemeLocaleData } from '../../composables/index.js' +import SocialLinks from '../SocialLinks.vue' + +const theme = useThemeLocaleData() +</script> + +<template> + <SocialLinks + v-if="theme.social" + class="navbar-social-links" + :links="theme.social" + /> +</template> + +<style scoped> +.navbar-social-links { + display: none; +} + +@media (min-width: 1280px) { + .navbar-social-links { + display: flex; + align-items: center; + } +} +</style> diff --git a/packages/theme/src/client/components/SocialLink.vue b/packages/theme/src/client/components/SocialLink.vue new file mode 100644 index 00000000..687ac3fe --- /dev/null +++ b/packages/theme/src/client/components/SocialLink.vue @@ -0,0 +1,50 @@ +<script lang="ts" setup> +import { computed } from 'vue' +import type { SocialLinkIcon } from '../../shared/index.js' +import { icons } from '../utils/index.js' + +const props = defineProps<{ + icon: SocialLinkIcon + link: string +}>() + +const svg = computed(() => { + if (typeof props.icon === 'object') return props.icon.svg + return icons[props.icon] +}) +</script> + +<template> + <!-- eslint-disable vue/no-v-html --> + <a + class="social-link" + :href="link" + target="_blank" + rel="noopener" + v-html="svg" + > + </a> +</template> + +<style scoped> +.social-link { + display: flex; + justify-content: center; + align-items: center; + width: 36px; + height: 36px; + color: var(--vp-c-text-2); + transition: color 0.5s; +} + +.social-link:hover { + color: var(--vp-c-text-1); + transition: color 0.25s; +} + +.social-link > :deep(svg) { + width: 20px; + height: 20px; + fill: currentColor; +} +</style> diff --git a/packages/theme/src/client/components/SocialLinks.vue b/packages/theme/src/client/components/SocialLinks.vue new file mode 100644 index 00000000..dcbee7a0 --- /dev/null +++ b/packages/theme/src/client/components/SocialLinks.vue @@ -0,0 +1,27 @@ +<script lang="ts" setup> +import type { SocialLink as SocialLinkType } from '../../shared/index.js' +import SocialLink from './SocialLink.vue' + +defineProps<{ + links: SocialLinkType[] +}>() +</script> + +<template> + <div class="social-links"> + <SocialLink + v-for="{ link, icon } in links" + :key="link" + :icon="icon" + :link="link" + /> + </div> +</template> + +<style scoped> +.social-links { + display: flex; + flex-wrap: wrap; + justify-content: center; +} +</style> diff --git a/packages/theme/src/client/components/Switch.vue b/packages/theme/src/client/components/Switch.vue new file mode 100644 index 00000000..174313fc --- /dev/null +++ b/packages/theme/src/client/components/Switch.vue @@ -0,0 +1,63 @@ +<template> + <button class="switch-wrapper" type="button" role="switch"> + <span class="check"> + <span v-if="$slots.default" class="icon"> + <slot /> + </span> + </span> + </button> +</template> + +<style scoped> +.switch-wrapper { + position: relative; + border-radius: 11px; + display: block; + width: 40px; + height: 22px; + flex-shrink: 0; + border: 1px solid var(--vp-input-border-color); + background-color: var(--vp-input-switch-bg-color); + transition: border-color 0.25s; +} + +.switch-wrapper:hover { + border-color: var(--vp-input-hover-border-color); +} + +.check { + position: absolute; + top: 1px; + /*rtl:ignore*/ + left: 1px; + width: 18px; + height: 18px; + border-radius: 50%; + background-color: var(--vp-c-neutral-inverse); + box-shadow: var(--vp-shadow-1); + transition: transform 0.25s; +} + +.icon { + position: relative; + display: block; + width: 18px; + height: 18px; + border-radius: 50%; + overflow: hidden; +} + +.icon :deep(svg) { + position: absolute; + top: 3px; + left: 3px; + width: 12px; + height: 12px; + fill: var(--vp-c-text-2); +} + +.dark .icon :deep(svg) { + fill: var(--vp-c-text-1); + transition: opacity 0.25s; +} +</style> diff --git a/packages/theme/src/client/components/SwitchAppearance.vue b/packages/theme/src/client/components/SwitchAppearance.vue new file mode 100644 index 00000000..d496fb24 --- /dev/null +++ b/packages/theme/src/client/components/SwitchAppearance.vue @@ -0,0 +1,118 @@ +<script lang="ts" setup> +import { onMounted, ref, watch } from 'vue' +import { useDarkMode } from '../composables/index.js' +import { useThemeLocaleData } from '../composables/themeData.js' +import { APPEARANCE_KEY } from '../utils/index.js' +import IconMoon from './icons/IconMoon.vue' +import IconSun from './icons/IconSun.vue' +import Switch from './Switch.vue' + +const theme = useThemeLocaleData() +const checked = ref(false) +const isDark = useDarkMode() + +// eslint-disable-next-line @typescript-eslint/no-empty-function +const toggle = typeof localStorage !== 'undefined' ? useAppearance() : () => {} + +onMounted(() => { + checked.value = document.documentElement.classList.contains('dark') +}) + +function useAppearance() { + const query = window.matchMedia('(prefers-color-scheme: dark)') + const classList = document.documentElement.classList + + let userPreference = localStorage.getItem(APPEARANCE_KEY) + + let isDark = + (theme.value.appearance === 'dark' && userPreference == null) || + (userPreference === 'auto' || userPreference == null + ? query.matches + : userPreference === 'dark') + + query.onchange = (e) => { + if (userPreference === 'auto') { + setClass((isDark = e.matches)) + } + } + + function toggle() { + setClass((isDark = !isDark)) + + userPreference = isDark + ? query.matches + ? 'auto' + : 'dark' + : query.matches + ? 'light' + : 'auto' + + localStorage.setItem(APPEARANCE_KEY, userPreference) + } + + function setClass(dark: boolean): void { + const css = document.createElement('style') + css.type = 'text/css' + css.appendChild( + document.createTextNode( + `:not(.VPSwitchAppearance):not(.VPSwitchAppearance *) { + -webkit-transition: none !important; + -moz-transition: none !important; + -o-transition: none !important; + -ms-transition: none !important; + transition: none !important; +}` + ) + ) + document.head.appendChild(css) + + checked.value = dark + classList[dark ? 'add' : 'remove']('dark') + + // eslint-disable-next-line @typescript-eslint/naming-convention + const _ = window.getComputedStyle(css).opacity + document.head.removeChild(css) + } + + return toggle +} + +watch(checked, (newIsDark) => { + isDark.value = newIsDark +}) +</script> + +<template> + <Switch + class="switch-appearance" + aria-label="toggle dark mode" + :aria-checked="checked" + @click="toggle" + > + <IconSun class="sun" /> + <IconMoon class="moon" /> + </Switch> +</template> + +<style scoped> +.sun { + opacity: 1; +} + +.moon { + opacity: 0; +} + +.dark .sun { + opacity: 0; +} + +.dark .moon { + opacity: 1; +} + +.dark .switch-appearance :deep(.check) { + /*rtl:ignore*/ + transform: translateX(18px); +} +</style> diff --git a/packages/theme/src/client/composables/darkMode.ts b/packages/theme/src/client/composables/darkMode.ts index 2e76b835..4a190911 100644 --- a/packages/theme/src/client/composables/darkMode.ts +++ b/packages/theme/src/client/composables/darkMode.ts @@ -1,7 +1,5 @@ -import { usePreferredDark, useStorage } from '@vueuse/core' -import { computed, inject, onMounted, onUnmounted, provide, watch } from 'vue' +import { inject, provide, ref } from 'vue' import type { InjectionKey, WritableComputedRef } from 'vue' -import { useThemeLocaleData } from './themeData.js' export type DarkModeRef = WritableComputedRef<boolean> @@ -13,60 +11,17 @@ export const darkModeSymbol: InjectionKey<DarkModeRef> = Symbol( * Inject dark mode global computed */ export const useDarkMode = (): DarkModeRef => { - const isDarkMode = inject(darkModeSymbol) - if (!isDarkMode) { + const isDark = inject(darkModeSymbol) + if (isDark === undefined) { throw new Error('useDarkMode() is called without provider.') } - return isDarkMode + return isDark } /** * Create dark mode ref and provide as global computed in setup */ export const setupDarkMode = (): void => { - const themeLocale = useThemeLocaleData() - const isDarkPreferred = usePreferredDark() - const darkStorage = useStorage( - 'vuepress-color-scheme', - themeLocale.value.colorMode - ) - - const isDarkMode = computed<boolean>({ - get() { - // disable color mode switching - if (!themeLocale.value.colorModeSwitch) { - return themeLocale.value.colorMode === 'dark' - } - // auto detected from prefers-color-scheme - if (darkStorage.value === 'auto') { - return isDarkPreferred.value - } - // storage value - return darkStorage.value === 'dark' - }, - set(val) { - if (val === isDarkPreferred.value) { - darkStorage.value = 'auto' - } else { - darkStorage.value = val ? 'dark' : 'light' - } - }, - }) - provide(darkModeSymbol, isDarkMode) - - updateHtmlDarkClass(isDarkMode) -} - -export const updateHtmlDarkClass = (isDarkMode: DarkModeRef): void => { - const update = (value = isDarkMode.value): void => { - // set `class="dark"` on `<html>` element - const htmlEl = window?.document.querySelector('html') - htmlEl?.classList.toggle('dark', value) - } - - onMounted(() => { - watch(isDarkMode, update, { immediate: true }) - }) - - onUnmounted(() => update()) + const isDark = ref<boolean>(false) + provide(darkModeSymbol, isDark) } diff --git a/packages/theme/src/client/composables/flyout.ts b/packages/theme/src/client/composables/flyout.ts new file mode 100644 index 00000000..cecc2520 --- /dev/null +++ b/packages/theme/src/client/composables/flyout.ts @@ -0,0 +1,59 @@ +import { onUnmounted, readonly, ref, type Ref, watch } from 'vue' +import { inBrowser } from '../utils/index.js' + +interface UseFlyoutOptions { + el: Ref<HTMLElement | undefined> + onFocus?(): void + onBlur?(): void +} + +export const focusedElement = ref<HTMLElement>() + +let active = false +let listeners = 0 + +export function useFlyout(options: UseFlyoutOptions) { + const focus = ref(false) + + if (inBrowser) { + !active && activateFocusTracking() + + listeners++ + + const unwatch = watch(focusedElement, (el) => { + if (el === options.el.value || options.el.value?.contains(el!)) { + focus.value = true + options.onFocus?.() + } else { + focus.value = false + options.onBlur?.() + } + }) + + onUnmounted(() => { + unwatch() + + listeners-- + + if (!listeners) { + deactivateFocusTracking() + } + }) + } + + return readonly(focus) +} + +function activateFocusTracking() { + document.addEventListener('focusin', handleFocusIn) + active = true + focusedElement.value = document.activeElement as HTMLElement +} + +function deactivateFocusTracking() { + document.removeEventListener('focusin', handleFocusIn) +} + +function handleFocusIn() { + focusedElement.value = document.activeElement as HTMLElement +} diff --git a/packages/theme/src/client/composables/sidebar.ts b/packages/theme/src/client/composables/sidebar.ts index ac3e0a3b..85738c51 100644 --- a/packages/theme/src/client/composables/sidebar.ts +++ b/packages/theme/src/client/composables/sidebar.ts @@ -1,11 +1,169 @@ -import { computed } from 'vue' +import type { + NotesData, + NotesSidebarItem, +} from '@vuepress-plume/vuepress-plugin-notes-data' +import { useNotesData } from '@vuepress-plume/vuepress-plugin-notes-data/client' +import type { PageData } from '@vuepress/client' +import { usePageData, usePageFrontmatter, withBase } from '@vuepress/client' +import { useMediaQuery } from '@vueuse/core' +import type { ComputedRef, Ref } from 'vue' +import { computed, onMounted, onUnmounted, ref, watchEffect } from 'vue' +import { useRoute } from 'vue-router' +import { isActive } from '../utils/index.js' +import { useThemeLocaleData } from './themeData.js' + +export function getSidebarList(path: string, notesData: NotesData) { + const link = Object.keys(notesData).find((link) => + path.startsWith(withBase(link)) + ) + return link ? notesData[link] : [] +} export function useSidebar() { + const route = useRoute() + const notesData = useNotesData() + const theme = useThemeLocaleData() + const frontmatter = usePageFrontmatter() + + const is960 = useMediaQuery('(min-width: 960px)') + + const isOpen = ref(false) + + const sidebar = computed(() => { + return theme.value.notes ? getSidebarList(route.path, notesData.value) : [] + }) const hasSidebar = computed(() => { - return false + return !frontmatter.value.home && sidebar.value.length > 0 }) + const hasAside = computed(() => { + return !frontmatter.value.home && frontmatter.value.aside !== false + }) + + const isSidebarEnabled = computed(() => hasSidebar.value && is960.value) + + function open() { + isOpen.value = true + } + + function close() { + isOpen.value = false + } + + function toggle() { + isOpen.value ? close() : open() + } + return { + isOpen, + sidebar, hasSidebar, + hasAside, + isSidebarEnabled, + open, + close, + toggle, } } + +export function useCloseSidebarOnEscape( + isOpen: Ref<boolean>, + close: () => void +) { + let triggerElement: HTMLButtonElement | undefined + + watchEffect(() => { + triggerElement = isOpen.value + ? (document.activeElement as HTMLButtonElement) + : undefined + }) + + onMounted(() => { + window.addEventListener('keyup', onEscape) + }) + + onUnmounted(() => { + window.removeEventListener('keyup', onEscape) + }) + + function onEscape(e: KeyboardEvent) { + if (e.key === 'Escape' && isOpen.value) { + close() + triggerElement?.focus() + } + } +} + +export function useSidebarControl(item: ComputedRef<NotesSidebarItem>) { + const page = usePageData<PageData>() + + const collapsed = ref(false) + + const collapsible = computed(() => { + return item.value.collapsed != null + }) + + const isLink = computed(() => { + return !!item.value.link + }) + + const isActiveLink = computed(() => { + return isActive(page.value.path, item.value.link) + }) + + const hasActiveLink = computed(() => { + if (isActiveLink.value) { + return true + } + + return item.value.items + ? containsActiveLink( + page.value.path, + item.value.items as NotesSidebarItem[] + ) + : false + }) + + const hasChildren = computed(() => { + return !!(item.value.items && item.value.items.length) + }) + + watchEffect(() => { + collapsed.value = !!(collapsible.value && item.value.collapsed) + }) + + watchEffect(() => { + ;(isActiveLink.value || hasActiveLink.value) && (collapsed.value = false) + }) + + function toggle() { + if (collapsible.value) { + collapsed.value = !collapsed.value + } + } + + return { + collapsed, + collapsible, + isLink, + isActiveLink, + hasActiveLink, + hasChildren, + toggle, + } +} + +export function containsActiveLink( + path: string, + items: NotesSidebarItem | NotesSidebarItem[] +): boolean { + if (Array.isArray(items)) { + return items.some((item) => containsActiveLink(path, item)) + } + + return isActive(path, items.link) + ? true + : items.items + ? containsActiveLink(path, items.items as NotesSidebarItem[]) + : false +} diff --git a/packages/theme/src/client/styles/index.scss b/packages/theme/src/client/styles/index.scss index dec863da..14cd491e 100644 --- a/packages/theme/src/client/styles/index.scss +++ b/packages/theme/src/client/styles/index.scss @@ -2,3 +2,4 @@ @use 'fonts'; @use 'normalize'; @use 'nprogress'; +@use 'utils'; diff --git a/packages/theme/src/client/styles/utils.scss b/packages/theme/src/client/styles/utils.scss new file mode 100644 index 00000000..65c7e55e --- /dev/null +++ b/packages/theme/src/client/styles/utils.scss @@ -0,0 +1,9 @@ +.visually-hidden { + position: absolute; + width: 1px; + height: 1px; + white-space: nowrap; + clip: rect(0 0 0 0); + clip-path: inset(50%); + overflow: hidden; +} diff --git a/packages/theme/src/client/utils/index.ts b/packages/theme/src/client/utils/index.ts new file mode 100644 index 00000000..326882af --- /dev/null +++ b/packages/theme/src/client/utils/index.ts @@ -0,0 +1,3 @@ +export * from './shared.js' +export * from './normalizeLink.js' +export * from './socialIcons.js' diff --git a/packages/theme/src/client/utils/normalizeLink.ts b/packages/theme/src/client/utils/normalizeLink.ts new file mode 100644 index 00000000..cddb372e --- /dev/null +++ b/packages/theme/src/client/utils/normalizeLink.ts @@ -0,0 +1,20 @@ +import { withBase } from '@vuepress/client' +import { isExternal, PATHNAME_PROTOCOL_RE } from './shared.js' + +export function normalizeLink(url: string): string { + if (isExternal(url)) { + return url.replace(PATHNAME_PROTOCOL_RE, '') + } + + const { pathname, search, hash } = new URL(url, 'http://example.com') + + const normalizedPath = + pathname.endsWith('/') || pathname.endsWith('.html') + ? url + : url.replace( + /(?:(^\.+)\/)?.*$/, + `$1${pathname.replace(/(\.md)?$/, '.html')}${search}${hash}` + ) + + return withBase(normalizedPath) +} diff --git a/packages/theme/src/client/utils/shared.ts b/packages/theme/src/client/utils/shared.ts new file mode 100644 index 00000000..e0a49ff9 --- /dev/null +++ b/packages/theme/src/client/utils/shared.ts @@ -0,0 +1,43 @@ +export const EXTERNAL_URL_RE = /^[a-z]+:/i +export const PATHNAME_PROTOCOL_RE = /^pathname:\/\// +export const APPEARANCE_KEY = 'vuepress-theme-appearance' +export const HASH_RE = /#.*$/ +export const EXT_RE = /(index)?\.(md|html)$/ + +export const inBrowser = typeof document !== 'undefined' + +export function isActive( + currentPath: string, + matchPath?: string, + asRegex = false +): boolean { + if (matchPath === undefined) { + return false + } + + currentPath = normalize(`/${currentPath}`) + + if (asRegex) { + return new RegExp(matchPath).test(currentPath) + } + + if (normalize(matchPath) !== currentPath) { + return false + } + + const hashMatch = matchPath.match(HASH_RE) + + if (hashMatch) { + return (inBrowser ? location.hash : '') === hashMatch[0] + } + + return true +} + +export function normalize(path: string): string { + return decodeURI(path).replace(HASH_RE, '').replace(EXT_RE, '') +} + +export function isExternal(path: string): boolean { + return EXTERNAL_URL_RE.test(path) +} diff --git a/packages/theme/src/client/utils/socialIcons.ts b/packages/theme/src/client/utils/socialIcons.ts new file mode 100644 index 00000000..54a91e6e --- /dev/null +++ b/packages/theme/src/client/utils/socialIcons.ts @@ -0,0 +1,22 @@ +// Used under CC0 1.0 from https://simpleicons.org/ + +export const icons = { + discord: + '<svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Discord', + facebook: + 'Facebook', + github: + 'GitHub', + instagram: + 'Instagram', + linkedin: + 'LinkedIn', + mastodon: + 'Mastodon', + slack: + 'Slack', + twitter: + 'Twitter', + youtube: + 'YouTube', +} as const diff --git a/packages/theme/src/node/plugins.ts b/packages/theme/src/node/plugins.ts index c2f17666..dff0f715 100644 --- a/packages/theme/src/node/plugins.ts +++ b/packages/theme/src/node/plugins.ts @@ -34,7 +34,14 @@ export const setupPlugins = ( return [ palettePlugin({ preset: 'sass' }), - themeDataPlugin({ themeData: localeOptions }), + themeDataPlugin({ + themeData: { + ...localeOptions, + notes: localeOptions.notes + ? { dir: localeOptions.notes.dir, link: localeOptions.notes.link } + : undefined, + } as any, + }), autoFrontmatterPlugin(autoFrontmatter(app, localeOptions)), blogDataPlugin({ include: ['**/*.md'], diff --git a/packages/theme/src/shared/options/index.ts b/packages/theme/src/shared/options/index.ts index 3363b0e1..4bba3d83 100644 --- a/packages/theme/src/shared/options/index.ts +++ b/packages/theme/src/shared/options/index.ts @@ -47,3 +47,4 @@ export type PlumeThemeData = ThemeData export * from './locale.js' export * from './plugins.js' +export * from './navbar.js' diff --git a/packages/theme/src/shared/options/locale.ts b/packages/theme/src/shared/options/locale.ts index 3183df1a..ef93cf02 100644 --- a/packages/theme/src/shared/options/locale.ts +++ b/packages/theme/src/shared/options/locale.ts @@ -1,12 +1,9 @@ import type { NotesDataOptions } from '@vuepress-plume/vuepress-plugin-notes-data' import type { LocaleData } from '@vuepress/core' +import type { NavItem, NavItemWithLink } from './navbar.js' // import type { NavbarConfig, NavLink } from '../layout/index.js' // import type { PlumeThemeNotesOptions } from './notes.js' -// todo type -type NavbarConfig = any -type NavLink = any - export interface PlumeThemeAvatar { /** * 头像链接 @@ -22,46 +19,28 @@ export interface PlumeThemeAvatar { description?: string } -export interface PlumeThemeSocialOption { - /** - * 邮箱 - */ - email?: string - /** - * github链接 支持仅填写 organization / Repositories - */ - github?: string - /** - * 微博 - */ - weiBo?: string - /** - * 知乎 - */ - zhiHu?: string - /** - * QQ - */ - QQ?: string - /** - * facebook - */ - facebook?: string - /** - * twitter - */ - twitter?: string - /** - * linkedin 英领 - */ - linkedin?: string +export interface SocialLink { + icon: SocialLinkIcon + link: string } +export type SocialLinkIcon = + | 'discord' + | 'facebook' + | 'github' + | 'instagram' + | 'linkedin' + | 'mastodon' + | 'slack' + | 'twitter' + | 'youtube' + | { svg: string } + export interface PlumeThemeLocaleData extends LocaleData { /** * 网站站点首页 */ - home?: false | NavLink + home?: false | NavItemWithLink /** * 网站站点logo */ @@ -73,13 +52,7 @@ export interface PlumeThemeLocaleData extends LocaleData { /** * 是否启用深色模式切换按钮 */ - colorModeSwitch?: boolean - - colorMode?: 'auto' | 'light' | 'dark' - - toggleDarkMode?: string - - toggleSidebar?: string + appearance?: boolean | 'dark' /** * 部署站点域名。 @@ -98,7 +71,7 @@ export interface PlumeThemeLocaleData extends LocaleData { /** * 社交账号配置 */ - social?: PlumeThemeSocialOption + social?: SocialLink[] /** * 文章链接前缀 @@ -112,14 +85,14 @@ export interface PlumeThemeLocaleData extends LocaleData { * * @def:{ text: '标签', link: '/tag/' } */ - tag?: false | NavLink + tag?: false | NavItemWithLink /** * 文章分类 与 navbar配置 * * @default: { text: '分类', link: '/category/ } */ - category?: false | NavLink + category?: false | NavItemWithLink /** * 归档页 链接与 navbar 配置 @@ -128,7 +101,7 @@ export interface PlumeThemeLocaleData extends LocaleData { * * @default: { text: '归档', link: '/timeline/' } */ - archive?: false | NavLink + archive?: false | NavItemWithLink /** * 笔记配置, 笔记中的文章默认不会出现在首页文章列表 @@ -165,7 +138,7 @@ export interface PlumeThemeLocaleData extends LocaleData { * * Set to `false` to disable navbar in current locale */ - navbar?: false | NavbarConfig + navbar?: false | NavItem[] /** * 外部链接打开方式 */ diff --git a/packages/theme/src/shared/options/navbar.ts b/packages/theme/src/shared/options/navbar.ts new file mode 100644 index 00000000..b70ed4a8 --- /dev/null +++ b/packages/theme/src/shared/options/navbar.ts @@ -0,0 +1,28 @@ +export type NavItem = NavItemWithLink | NavItemWithChildren + +export type NavItemWithLink = { + text: string + link: string + + /** + * `activeMatch` is expected to be a regex string. We can't use actual + * RegExp object here because it isn't serializable + */ + activeMatch?: string +} + +export type NavItemChildren = { + text?: string + items: NavItemWithLink[] +} + +export interface NavItemWithChildren { + text?: string + items: (NavItemChildren | NavItemWithLink)[] + + /** + * `activeMatch` is expected to be a regex string. We can't use actual + * RegExp object here because it isn't serializable + */ + activeMatch?: string +} From f94c443b2db1b1e93cf8229d9426b611f7976408 Mon Sep 17 00:00:00 2001 From: pengzhanbo Date: Sun, 12 Feb 2023 01:02:44 +0800 Subject: [PATCH 26/29] feat(theme): add nav screen --- packages/theme/package.json | 1 + .../theme/src/client/components/BlogPage.vue | 0 .../src/client/components/Nav/NavScreen.vue | 102 +++- .../components/Nav/NavScreenAppearance.vue | 31 ++ .../client/components/Nav/NavScreenMenu.vue | 20 + .../components/Nav/NavScreenMenuGroup.vue | 112 ++++ .../components/Nav/NavScreenMenuGroupLink.vue | 37 ++ .../Nav/NavScreenMenuGroupSection.vue | 35 ++ .../components/Nav/NavScreenMenuLink.vue | 34 ++ .../components/Nav/NavScreenSocialLinks.vue | 14 + .../theme/src/client/components/Nav/index.vue | 25 +- packages/theme/src/client/components/Page.vue | 11 + packages/theme/src/client/layouts/Layout.vue | 12 +- packages/theme/src/client/styles/content.css | 501 ++++++++++++++++++ pnpm-lock.yaml | 6 + 15 files changed, 937 insertions(+), 4 deletions(-) create mode 100644 packages/theme/src/client/components/BlogPage.vue create mode 100644 packages/theme/src/client/components/Nav/NavScreenAppearance.vue create mode 100644 packages/theme/src/client/components/Nav/NavScreenMenu.vue create mode 100644 packages/theme/src/client/components/Nav/NavScreenMenuGroup.vue create mode 100644 packages/theme/src/client/components/Nav/NavScreenMenuGroupLink.vue create mode 100644 packages/theme/src/client/components/Nav/NavScreenMenuGroupSection.vue create mode 100644 packages/theme/src/client/components/Nav/NavScreenMenuLink.vue create mode 100644 packages/theme/src/client/components/Nav/NavScreenSocialLinks.vue create mode 100644 packages/theme/src/client/components/Page.vue create mode 100644 packages/theme/src/client/styles/content.css diff --git a/packages/theme/package.json b/packages/theme/package.json index eb23060d..521f9aa6 100644 --- a/packages/theme/package.json +++ b/packages/theme/package.json @@ -57,6 +57,7 @@ "@vuepress/shared": "2.0.0-beta.60", "@vuepress/utils": "2.0.0-beta.60", "@vueuse/core": "^9.10.0", + "body-scroll-lock": "4.0.0-beta.0", "date-fns": "^2.29.3", "nanoid": "^4.0.0", "ts-debounce": "^4.0.0", diff --git a/packages/theme/src/client/components/BlogPage.vue b/packages/theme/src/client/components/BlogPage.vue new file mode 100644 index 00000000..e69de29b diff --git a/packages/theme/src/client/components/Nav/NavScreen.vue b/packages/theme/src/client/components/Nav/NavScreen.vue index 6b4c19a0..e4cb866c 100644 --- a/packages/theme/src/client/components/Nav/NavScreen.vue +++ b/packages/theme/src/client/components/Nav/NavScreen.vue @@ -1 +1,101 @@ - + + + + + diff --git a/packages/theme/src/client/components/Nav/NavScreenAppearance.vue b/packages/theme/src/client/components/Nav/NavScreenAppearance.vue new file mode 100644 index 00000000..2707f14a --- /dev/null +++ b/packages/theme/src/client/components/Nav/NavScreenAppearance.vue @@ -0,0 +1,31 @@ + + + + + diff --git a/packages/theme/src/client/components/Nav/NavScreenMenu.vue b/packages/theme/src/client/components/Nav/NavScreenMenu.vue new file mode 100644 index 00000000..a6a8873b --- /dev/null +++ b/packages/theme/src/client/components/Nav/NavScreenMenu.vue @@ -0,0 +1,20 @@ + + + diff --git a/packages/theme/src/client/components/Nav/NavScreenMenuGroup.vue b/packages/theme/src/client/components/Nav/NavScreenMenuGroup.vue new file mode 100644 index 00000000..65bcd0c1 --- /dev/null +++ b/packages/theme/src/client/components/Nav/NavScreenMenuGroup.vue @@ -0,0 +1,112 @@ + + + + + diff --git a/packages/theme/src/client/components/Nav/NavScreenMenuGroupLink.vue b/packages/theme/src/client/components/Nav/NavScreenMenuGroupLink.vue new file mode 100644 index 00000000..a8c277d2 --- /dev/null +++ b/packages/theme/src/client/components/Nav/NavScreenMenuGroupLink.vue @@ -0,0 +1,37 @@ + + + + + diff --git a/packages/theme/src/client/components/Nav/NavScreenMenuGroupSection.vue b/packages/theme/src/client/components/Nav/NavScreenMenuGroupSection.vue new file mode 100644 index 00000000..1255f75e --- /dev/null +++ b/packages/theme/src/client/components/Nav/NavScreenMenuGroupSection.vue @@ -0,0 +1,35 @@ + + + + + diff --git a/packages/theme/src/client/components/Nav/NavScreenMenuLink.vue b/packages/theme/src/client/components/Nav/NavScreenMenuLink.vue new file mode 100644 index 00000000..96a503d5 --- /dev/null +++ b/packages/theme/src/client/components/Nav/NavScreenMenuLink.vue @@ -0,0 +1,34 @@ + + + + + diff --git a/packages/theme/src/client/components/Nav/NavScreenSocialLinks.vue b/packages/theme/src/client/components/Nav/NavScreenSocialLinks.vue new file mode 100644 index 00000000..10584b92 --- /dev/null +++ b/packages/theme/src/client/components/Nav/NavScreenSocialLinks.vue @@ -0,0 +1,14 @@ + + + diff --git a/packages/theme/src/client/components/Nav/index.vue b/packages/theme/src/client/components/Nav/index.vue index 071199a8..176e26e4 100644 --- a/packages/theme/src/client/components/Nav/index.vue +++ b/packages/theme/src/client/components/Nav/index.vue @@ -1,7 +1,8 @@ + + diff --git a/packages/theme/src/client/components/Page.vue b/packages/theme/src/client/components/Page.vue new file mode 100644 index 00000000..0a35923b --- /dev/null +++ b/packages/theme/src/client/components/Page.vue @@ -0,0 +1,11 @@ + + + diff --git a/packages/theme/src/client/layouts/Layout.vue b/packages/theme/src/client/layouts/Layout.vue index 0c904404..8d3f278e 100644 --- a/packages/theme/src/client/layouts/Layout.vue +++ b/packages/theme/src/client/layouts/Layout.vue @@ -1,5 +1,6 @@ + + diff --git a/packages/theme/src/client/styles/content.css b/packages/theme/src/client/styles/content.css new file mode 100644 index 00000000..7b828e93 --- /dev/null +++ b/packages/theme/src/client/styles/content.css @@ -0,0 +1,501 @@ +/** + * Headings + * -------------------------------------------------------------------------- */ + +.plume-content h1, +.plume-content h2, +.plume-content h3, +.plume-content h4, +.plume-content h5, +.plume-content h6 { + position: relative; + font-weight: 600; + outline: none; +} + +.plume-content h1 { + letter-spacing: -0.02em; + line-height: 40px; + font-size: 28px; +} + +.plume-content h2 { + margin: 48px 0 16px; + border-top: 1px solid var(--vp-c-divider); + padding-top: 24px; + letter-spacing: -0.02em; + line-height: 32px; + font-size: 24px; +} + +.plume-content h3 { + margin: 32px 0 0; + letter-spacing: -0.01em; + line-height: 28px; + font-size: 20px; +} + +.plume-content .header-anchor { + float: left; + margin-left: -0.87em; + padding-right: 0.23em; + font-weight: 500; + user-select: none; + opacity: 0; + transition: color 0.25s, opacity 0.25s; +} + +.plume-content h1:hover .header-anchor, +.plume-content h1 .header-anchor:focus, +.plume-content h2:hover .header-anchor, +.plume-content h2 .header-anchor:focus, +.plume-content h3:hover .header-anchor, +.plume-content h3 .header-anchor:focus, +.plume-content h4:hover .header-anchor, +.plume-content h4 .header-anchor:focus, +.plume-content h5:hover .header-anchor, +.plume-content h5 .header-anchor:focus, +.plume-content h6:hover .header-anchor, +.plume-content h6 .header-anchor:focus { + opacity: 1; +} + +@media (min-width: 768px) { + .plume-content h1 { + letter-spacing: -0.02em; + line-height: 40px; + font-size: 32px; + } +} + +/** + * Paragraph and inline elements + * -------------------------------------------------------------------------- */ + +.plume-content p, +.plume-content summary { + margin: 16px 0; +} + +.plume-content p { + line-height: 28px; +} + +.plume-content blockquote { + margin: 16px 0; + border-left: 2px solid var(--vp-c-divider); + padding-left: 16px; + transition: border-color 0.5s; +} + +.plume-content blockquote > p { + margin: 0; + font-size: 16px; + color: var(--vp-c-text-2); + transition: color 0.5s; +} + +.plume-content a { + font-weight: 500; + color: var(--vp-c-brand); + text-decoration-style: dotted; + transition: color 0.25s; +} + +.plume-content a:hover { + color: var(--vp-c-brand-dark); +} + +.plume-content strong { + font-weight: 600; +} + +/** + * Lists + * -------------------------------------------------------------------------- */ + +.plume-content ul, +.plume-content ol { + padding-left: 1.25rem; + margin: 16px 0; +} + +.plume-content ul { + list-style: disc; +} + +.plume-content ol { + list-style: decimal; +} + +.plume-content li + li { + margin-top: 8px; +} + +.plume-content li > ol, +.plume-content li > ul { + margin: 8px 0 0; +} + +/** + * Table + * -------------------------------------------------------------------------- */ + +.plume-content table { + display: block; + border-collapse: collapse; + margin: 20px 0; + overflow-x: auto; +} + +.plume-content tr { + border-top: 1px solid var(--vp-c-divider); + transition: background-color 0.5s; +} + +.plume-content tr:nth-child(2n) { + background-color: var(--vp-c-bg-soft); +} + +.plume-content th, +.plume-content td { + border: 1px solid var(--vp-c-divider); + padding: 8px 16px; +} + +.plume-content th { + text-align: left; + font-size: 14px; + font-weight: 600; + color: var(--vp-c-text-2); + background-color: var(--vp-c-bg-soft); +} + +.plume-content td { + font-size: 14px; +} + +/** + * Decorational elements + * -------------------------------------------------------------------------- */ + +.plume-content hr { + margin: 16px 0; + border: none; + border-top: 1px solid var(--vp-c-divider); +} + +/** + * Custom Block + * -------------------------------------------------------------------------- */ + +.plume-content .custom-block { + margin: 16px 0; +} + +.plume-content .custom-block p { + margin: 8px 0; + line-height: 24px; +} + +.plume-content .custom-block p:first-child { + margin: 0; +} + +.plume-content .custom-block a { + color: inherit; + font-weight: 600; + text-decoration: underline; + transition: opacity 0.25s; +} + +.plume-content .custom-block a:hover { + opacity: 0.6; +} + +.plume-content .custom-block code { + font-size: var(--vp-custom-block-code-font-size); + font-weight: 700; + color: inherit; +} + +.plume-content .custom-block div[class*='language-'] { + margin: 8px 0; +} + +.plume-content .custom-block div[class*='language-'] code { + font-weight: 400; + background-color: transparent; +} + +/** + * Code + * -------------------------------------------------------------------------- */ + +/* inline code */ +.plume-content :not(pre, h1, h2, h3, h4, h5, h6) > code { + font-size: var(--vp-code-font-size); +} + +.plume-content :not(pre) > code { + border-radius: 4px; + padding: 3px 6px; + color: var(--vp-c-text-code); + background-color: var(--vp-c-mute); + transition: color 0.5s, background-color 0.5s; +} + +.plume-content h1 > code, +.plume-content h2 > code, +.plume-content h3 > code { + font-size: 0.9em; +} + +.plume-content a > code { + color: var(--vp-c-brand); + transition: color 0.25s; +} + +.plume-content a:hover > code { + color: var(--vp-c-brand-dark); +} + +.plume-content div[class*='language-'] { + position: relative; + margin: 16px -24px; + background-color: var(--vp-code-block-bg); + overflow-x: auto; + transition: background-color 0.5s; +} + +@media (min-width: 640px) { + .plume-content div[class*='language-'] { + border-radius: 8px; + margin: 16px 0; + } +} + +@media (max-width: 639px) { + .plume-content li div[class*='language-'] { + border-radius: 8px 0 0 8px; + } +} + +.plume-content div[class*='language-'] + div[class*='language-'], +.plume-content div[class$='-api'] + div[class*='language-'], +.plume-content + div[class*='language-'] + + div[class$='-api'] + > div[class*='language-'] { + margin-top: -8px; +} + +.plume-content [class*='language-'] pre, +.plume-content [class*='language-'] code { + /*rtl:ignore*/ + direction: ltr; + /*rtl:ignore*/ + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} + +.plume-content [class*='language-'] pre { + position: relative; + z-index: 1; + margin: 0; + padding: 16px 0; + background: transparent; + overflow-x: auto; +} + +.plume-content [class*='language-'] code { + display: block; + padding: 0 24px; + width: fit-content; + min-width: 100%; + line-height: var(--vp-code-line-height); + font-size: var(--vp-code-font-size); + color: var(--vp-code-block-color); + transition: color 0.5s; +} + +.plume-content [class*='language-'] code .highlighted { + background-color: var(--vp-code-line-highlight-color); + transition: background-color 0.5s; + margin: 0 -24px; + padding: 0 24px; + width: calc(100% + 2 * 24px); + display: inline-block; +} + +.plume-content [class*='language-'] code .highlighted.error { + background-color: var(--vp-code-line-error-color); +} + +.plume-content [class*='language-'] code .highlighted.warning { + background-color: var(--vp-code-line-warning-color); +} + +.plume-content [class*='language-'] code .diff { + transition: background-color 0.5s; + margin: 0 -24px; + padding: 0 24px; + width: calc(100% + 2 * 24px); + display: inline-block; +} + +.plume-content [class*='language-'] code .diff::before { + position: absolute; + left: 10px; +} + +.plume-content [class*='language-'] .has-focused-lines .line:not(.has-focus) { + filter: blur(0.095rem); + opacity: 0.4; + transition: filter 0.35s, opacity 0.35s; +} + +.plume-content [class*='language-'] .has-focused-lines .line:not(.has-focus) { + opacity: 0.7; + transition: filter 0.35s, opacity 0.35s; +} + +.plume-content + [class*='language-']:hover + .has-focused-lines + .line:not(.has-focus) { + filter: blur(0); + opacity: 1; +} + +.plume-content [class*='language-'] code .diff.remove { + background-color: var(--vp-code-line-diff-remove-color); + opacity: 0.7; +} + +.plume-content [class*='language-'] code .diff.remove::before { + content: '-'; + color: var(--vp-code-line-diff-remove-symbol-color); +} + +.plume-content [class*='language-'] code .diff.add { + background-color: var(--vp-code-line-diff-add-color); +} + +.plume-content [class*='language-'] code .diff.add::before { + content: '+'; + color: var(--vp-code-line-diff-add-symbol-color); +} + +.plume-content div[class*='language-'].line-numbers-mode { + /*rtl:ignore*/ + padding-left: 32px; +} + +.plume-content .line-numbers-wrapper { + position: absolute; + top: 0; + bottom: 0; + /*rtl:ignore*/ + left: 0; + z-index: 3; + /*rtl:ignore*/ + border-right: 1px solid var(--vp-code-block-divider-color); + padding-top: 16px; + width: 32px; + text-align: center; + font-family: var(--vp-font-family-mono); + line-height: var(--vp-code-line-height); + font-size: var(--vp-code-font-size); + color: var(--vp-code-line-number-color); + transition: border-color 0.5s, color 0.5s; +} + +.plume-content [class*='language-'] > button.copy { + /*rtl:ignore*/ + direction: ltr; + position: absolute; + top: 8px; + /*rtl:ignore*/ + right: 8px; + z-index: 3; + display: block; + justify-content: center; + align-items: center; + border-radius: 4px; + width: 40px; + height: 40px; + background-color: var(--vp-code-block-bg); + opacity: 0; + cursor: pointer; + background-image: var(--vp-icon-copy); + background-position: 50%; + background-size: 20px; + background-repeat: no-repeat; + transition: opacity 0.4s; +} + +.plume-content [class*='language-']:hover > button.copy, +.plume-content [class*='language-'] > button.copy:focus { + opacity: 1; +} + +.plume-content [class*='language-'] > button.copy:hover { + background-color: var(--vp-code-copy-code-hover-bg); +} + +.plume-content [class*='language-'] > button.copy.copied, +.plume-content [class*='language-'] > button.copy:hover.copied { + /*rtl:ignore*/ + border-radius: 0 4px 4px 0; + background-color: var(--vp-code-copy-code-hover-bg); + background-image: var(--vp-icon-copied); +} + +.plume-content [class*='language-'] > button.copy.copied::before, +.plume-content [class*='language-'] > button.copy:hover.copied::before { + position: relative; + /*rtl:ignore*/ + left: -65px; + display: flex; + justify-content: center; + align-items: center; + /*rtl:ignore*/ + border-radius: 4px 0 0 4px; + width: 64px; + height: 40px; + text-align: center; + font-size: 12px; + font-weight: 500; + color: var(--vp-code-copy-code-active-text); + background-color: var(--vp-code-copy-code-hover-bg); + white-space: nowrap; + content: 'Copied'; +} + +.plume-content [class*='language-'] > span.lang { + position: absolute; + top: 6px; + /*rtl:ignore*/ + right: 12px; + z-index: 2; + font-size: 12px; + font-weight: 500; + color: var(--vp-c-text-dark-3); + transition: color 0.4s, opacity 0.4s; +} + +.plume-content [class*='language-']:hover > button.copy + span.lang, +.plume-content [class*='language-'] > button.copy:focus + span.lang { + opacity: 0; +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 800d7f5b..520a8ad9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -297,6 +297,7 @@ importers: '@vuepress/shared': 2.0.0-beta.60 '@vuepress/utils': 2.0.0-beta.60 '@vueuse/core': ^9.10.0 + body-scroll-lock: 4.0.0-beta.0 date-fns: ^2.29.3 nanoid: ^4.0.0 ts-debounce: ^4.0.0 @@ -332,6 +333,7 @@ importers: '@vuepress/shared': 2.0.0-beta.60 '@vuepress/utils': 2.0.0-beta.60 '@vueuse/core': 9.10.0_vue@3.2.47 + body-scroll-lock: 4.0.0-beta.0 date-fns: 2.29.3 nanoid: 4.0.0 ts-debounce: 4.0.0 @@ -4522,6 +4524,10 @@ packages: - supports-color dev: false + /body-scroll-lock/4.0.0-beta.0: + resolution: {integrity: sha512-a7tP5+0Mw3YlUJcGAKUqIBkYYGlYxk2fnCasq/FUph1hadxlTRjF+gAcZksxANnaMnALjxEddmSi/H3OR8ugcQ==} + dev: false + /bonjour-service/1.0.13: resolution: {integrity: sha512-LWKRU/7EqDUC9CTAQtuZl5HzBALoCYwtLhffW3et7vZMwv3bWLpJf8bRYlMD5OCcDpTfnPgNCV4yo9ZIaJGMiA==} dependencies: From 4e98011b655eb2b815e602812ff067e0d4f95521 Mon Sep 17 00:00:00 2001 From: pengzhanbo Date: Sun, 12 Feb 2023 01:03:38 +0800 Subject: [PATCH 27/29] feat(theme): add content styles --- packages/theme/src/client/styles/{content.css => content.scss} | 0 packages/theme/src/client/styles/index.scss | 1 + 2 files changed, 1 insertion(+) rename packages/theme/src/client/styles/{content.css => content.scss} (100%) diff --git a/packages/theme/src/client/styles/content.css b/packages/theme/src/client/styles/content.scss similarity index 100% rename from packages/theme/src/client/styles/content.css rename to packages/theme/src/client/styles/content.scss diff --git a/packages/theme/src/client/styles/index.scss b/packages/theme/src/client/styles/index.scss index 14cd491e..1a78d8f9 100644 --- a/packages/theme/src/client/styles/index.scss +++ b/packages/theme/src/client/styles/index.scss @@ -3,3 +3,4 @@ @use 'normalize'; @use 'nprogress'; @use 'utils'; +@use 'content'; From 764c58693e14adb799ec01aa0c0cc4fd7240b399 Mon Sep 17 00:00:00 2001 From: pengzhanbo Date: Sun, 12 Feb 2023 06:03:52 +0800 Subject: [PATCH 28/29] feat(theme): add page components --- packages/theme/package.json | 1 + .../theme/src/client/components/BlogPage.vue | 28 ++ .../src/client/components/LayoutContent.vue | 48 ++ .../src/client/components/Nav/NavBarTitle.vue | 9 +- packages/theme/src/client/components/Page.vue | 159 ++++++- .../theme/src/client/components/PageAside.vue | 94 ++++ .../src/client/components/PageAsideItem.vue | 51 +++ .../theme/src/client/components/Sidebar.vue | 148 ++++++ .../src/client/components/SidebarItem.vue | 223 +++++++++ packages/theme/src/client/components/Toc.ts | 148 ++++++ .../theme/src/client/composables/aside.ts | 140 ++++++ .../theme/src/client/composables/index.ts | 2 + .../theme/src/client/composables/sidebar.ts | 41 +- packages/theme/src/client/layouts/Layout.vue | 34 +- .../theme/src/client/styles/_variables.scss | 5 + packages/theme/src/client/styles/code.scss | 277 ++++++++++++ packages/theme/src/client/styles/content.scss | 424 +++++++++--------- packages/theme/src/client/styles/index.scss | 4 + packages/theme/src/client/styles/toc.scss | 64 +++ packages/theme/src/client/styles/vars.scss | 6 + packages/theme/src/client/utils/animate.ts | 14 + packages/theme/src/client/utils/dom.ts | 65 +++ packages/theme/src/client/utils/index.ts | 1 + packages/theme/src/client/utils/shared.ts | 22 + packages/theme/src/node/plugins.ts | 14 +- packages/theme/src/shared/index.ts | 1 + packages/theme/src/shared/page.ts | 7 + pnpm-lock.yaml | 27 ++ 28 files changed, 1832 insertions(+), 225 deletions(-) create mode 100644 packages/theme/src/client/components/LayoutContent.vue create mode 100644 packages/theme/src/client/components/PageAside.vue create mode 100644 packages/theme/src/client/components/PageAsideItem.vue create mode 100644 packages/theme/src/client/components/Sidebar.vue create mode 100644 packages/theme/src/client/components/SidebarItem.vue create mode 100644 packages/theme/src/client/components/Toc.ts create mode 100644 packages/theme/src/client/composables/aside.ts create mode 100644 packages/theme/src/client/styles/_variables.scss create mode 100644 packages/theme/src/client/styles/code.scss create mode 100644 packages/theme/src/client/styles/toc.scss create mode 100644 packages/theme/src/client/utils/animate.ts create mode 100644 packages/theme/src/client/utils/dom.ts create mode 100644 packages/theme/src/shared/page.ts diff --git a/packages/theme/package.json b/packages/theme/package.json index 521f9aa6..868e2053 100644 --- a/packages/theme/package.json +++ b/packages/theme/package.json @@ -52,6 +52,7 @@ "@vuepress/plugin-palette": "2.0.0-beta.60", "@vuepress/plugin-prismjs": "2.0.0-beta.60", "@vuepress/plugin-search": "2.0.0-beta.60", + "@vuepress/plugin-shiki": "2.0.0-beta.60", "@vuepress/plugin-theme-data": "2.0.0-beta.60", "@vuepress/plugin-toc": "2.0.0-beta.60", "@vuepress/shared": "2.0.0-beta.60", diff --git a/packages/theme/src/client/components/BlogPage.vue b/packages/theme/src/client/components/BlogPage.vue index e69de29b..de33f312 100644 --- a/packages/theme/src/client/components/BlogPage.vue +++ b/packages/theme/src/client/components/BlogPage.vue @@ -0,0 +1,28 @@ + + + + diff --git a/packages/theme/src/client/components/LayoutContent.vue b/packages/theme/src/client/components/LayoutContent.vue new file mode 100644 index 00000000..ac9d8d61 --- /dev/null +++ b/packages/theme/src/client/components/LayoutContent.vue @@ -0,0 +1,48 @@ + + + + diff --git a/packages/theme/src/client/components/Nav/NavBarTitle.vue b/packages/theme/src/client/components/Nav/NavBarTitle.vue index 24c92803..3f2a80d5 100644 --- a/packages/theme/src/client/components/Nav/NavBarTitle.vue +++ b/packages/theme/src/client/components/Nav/NavBarTitle.vue @@ -1,22 +1,25 @@ diff --git a/packages/theme/src/client/components/Page.vue b/packages/theme/src/client/components/Page.vue index 0a35923b..4326bf5f 100644 --- a/packages/theme/src/client/components/Page.vue +++ b/packages/theme/src/client/components/Page.vue @@ -1,11 +1,164 @@ + - diff --git a/packages/theme/src/client/components/PageAside.vue b/packages/theme/src/client/components/PageAside.vue new file mode 100644 index 00000000..8e7d4d0a --- /dev/null +++ b/packages/theme/src/client/components/PageAside.vue @@ -0,0 +1,94 @@ + + + + diff --git a/packages/theme/src/client/components/PageAsideItem.vue b/packages/theme/src/client/components/PageAsideItem.vue new file mode 100644 index 00000000..b9257d11 --- /dev/null +++ b/packages/theme/src/client/components/PageAsideItem.vue @@ -0,0 +1,51 @@ + + + + + diff --git a/packages/theme/src/client/components/Sidebar.vue b/packages/theme/src/client/components/Sidebar.vue new file mode 100644 index 00000000..a0eef293 --- /dev/null +++ b/packages/theme/src/client/components/Sidebar.vue @@ -0,0 +1,148 @@ + + + + + diff --git a/packages/theme/src/client/components/SidebarItem.vue b/packages/theme/src/client/components/SidebarItem.vue new file mode 100644 index 00000000..75c17662 --- /dev/null +++ b/packages/theme/src/client/components/SidebarItem.vue @@ -0,0 +1,223 @@ + + + + + diff --git a/packages/theme/src/client/components/Toc.ts b/packages/theme/src/client/components/Toc.ts new file mode 100644 index 00000000..56c64365 --- /dev/null +++ b/packages/theme/src/client/components/Toc.ts @@ -0,0 +1,148 @@ +import { usePageData } from '@vuepress/client' +import type { PageHeader } from '@vuepress/client' +import type { PropType, VNode } from 'vue' +import { computed, defineComponent, h, toRefs } from 'vue' +import type { RouteLocationNormalizedLoaded } from 'vue-router' +import { useRoute } from 'vue-router' +import { scrollTo } from '../utils/index.js' + +export type TocPropsHeaders = PageHeader[] + +export interface TocPropsOptions { + containerTag: string + containerClass: string + listClass: string + itemClass: string + linkClass: string + linkActiveClass: string + linkChildrenActiveClass: string +} + +export interface TocProps { + headers: TocPropsHeaders + options: TocPropsOptions +} + +const renderLink = ( + header: PageHeader, + options: TocPropsOptions, + route: RouteLocationNormalizedLoaded +): VNode => { + const hash = `#${header.slug}` + const linkClass = [options.linkClass] + + if (options.linkActiveClass && route.hash === hash) { + linkClass.push(options.linkActiveClass) + } + + if ( + options.linkChildrenActiveClass && + header.children.some((item) => `#${item.slug}` === route.hash) + ) { + linkClass.push(options.linkChildrenActiveClass) + } + + const setActiveRouteHash = (): void => { + const headerAnchors: HTMLAnchorElement[] = Array.from( + document.querySelectorAll('.header-anchor') + ) + const anchor = headerAnchors.find( + (anchor) => decodeURI(anchor.hash) === hash + ) + if (!anchor) return + const el = document.documentElement + const top = anchor.getBoundingClientRect().top - 80 + el.scrollTop + scrollTo(document, top) + } + + return h( + 'a', + { + href: hash, + class: linkClass, + ariaLabel: header.title, + onClick: (e: MouseEvent) => { + e.preventDefault() + setActiveRouteHash() + }, + }, + header.title + ) +} + +const renderHeaders = ( + headers: PageHeader[], + options: TocPropsOptions, + route: RouteLocationNormalizedLoaded +): VNode[] => { + if (headers.length === 0) { + return [] + } + return [ + h( + 'ul', + { class: options.listClass }, + headers.map((header) => + h('li', { class: options.itemClass }, [ + renderLink(header, options, route), + renderHeaders(header.children, options, route), + ]) + ) + ), + ] +} + +const Toc = defineComponent({ + name: 'Toc', + props: { + headers: { + type: Array as PropType, + required: false, + default: null, + }, + options: { + type: Object as PropType, + required: false, + default: () => ({}), + }, + }, + setup(props) { + const { headers: propsHeaders, options: propsOptions } = toRefs(props) + + const defaultOptions: TocPropsOptions = { + containerTag: 'nav', + containerClass: 'theme-plume-toc', + listClass: 'theme-plume-toc-list', + itemClass: 'theme-plume-toc-item', + linkClass: 'theme-plume-toc-link', + linkActiveClass: 'active', + linkChildrenActiveClass: 'active', + } + + const route = useRoute() + const page = usePageData() + const headers = computed(() => { + const headerToUse = propsHeaders.value || page.value.headers + + return headerToUse[0]?.level === 1 ? headerToUse[0].children : headerToUse + }) + const options = computed(() => ({ + ...defaultOptions, + ...propsOptions.value, + })) + + return () => { + const renderedHeaders = renderHeaders(headers.value, options.value, route) + if (options.value.containerTag) { + return h( + options.value.containerTag, + { class: options.value.containerClass }, + renderedHeaders + ) + } + return renderedHeaders + } + }, +}) + +export default Toc diff --git a/packages/theme/src/client/composables/aside.ts b/packages/theme/src/client/composables/aside.ts new file mode 100644 index 00000000..9e8ea367 --- /dev/null +++ b/packages/theme/src/client/composables/aside.ts @@ -0,0 +1,140 @@ +import { useMediaQuery } from '@vueuse/core' +import type { Ref } from 'vue' +import { computed, onMounted, onUnmounted, onUpdated } from 'vue' +import { throttleAndDebounce } from '../utils/index.js' +import { useSidebar } from './sidebar.js' + +const PAGE_OFFSET = 71 + +export function useAside() { + const { hasSidebar } = useSidebar() + const is960 = useMediaQuery('(min-width: 960px)') + const is1280 = useMediaQuery('(min-width: 1280px)') + + const isAsideEnabled = computed(() => { + if (!is1280.value && !is960.value) { + return false + } + + return hasSidebar.value ? is1280.value : is960.value + }) + + return { + isAsideEnabled, + } +} + +export function useActiveAnchor( + container: Ref, + marker: Ref +) { + const { isAsideEnabled } = useAside() + + const onScroll = throttleAndDebounce(setActiveLink, 100) + + let prevActiveLink: HTMLAnchorElement | null = null + + onMounted(() => { + requestAnimationFrame(setActiveLink) + window.addEventListener('scroll', onScroll) + }) + + onUpdated(() => { + // sidebar update means a route change + activateLink(location.hash) + }) + + onUnmounted(() => { + window.removeEventListener('scroll', onScroll) + }) + + function setActiveLink() { + if (!isAsideEnabled.value) { + return + } + + const links = [].slice.call( + container.value.querySelectorAll('.outline-link') + ) as HTMLAnchorElement[] + + const anchors = [].slice + .call(document.querySelectorAll('.content .header-anchor')) + .filter((anchor: HTMLAnchorElement) => { + return links.some((link) => { + return link.hash === anchor.hash && anchor.offsetParent !== null + }) + }) as HTMLAnchorElement[] + + const scrollY = window.scrollY + const innerHeight = window.innerHeight + const offsetHeight = document.body.offsetHeight + const isBottom = Math.abs(scrollY + innerHeight - offsetHeight) < 1 + + // page bottom - highlight last one + if (anchors.length && isBottom) { + activateLink(anchors[anchors.length - 1].hash) + return + } + + for (let i = 0; i < anchors.length; i++) { + const anchor = anchors[i] + const nextAnchor = anchors[i + 1] + + const [isActive, hash] = isAnchorActive(i, anchor, nextAnchor) + + if (isActive) { + activateLink(hash) + return + } + } + } + + function activateLink(hash: string | null) { + if (prevActiveLink) { + prevActiveLink.classList.remove('active') + } + + if (hash !== null) { + prevActiveLink = container.value.querySelector( + `a[href="${decodeURIComponent(hash)}"]` + ) + } + + const activeLink = prevActiveLink + + if (activeLink) { + activeLink.classList.add('active') + marker.value.style.top = activeLink.offsetTop + 33 + 'px' + marker.value.style.opacity = '1' + } else { + marker.value.style.top = '33px' + marker.value.style.opacity = '0' + } + } +} + +function getAnchorTop(anchor: HTMLAnchorElement): number { + return anchor.parentElement!.offsetTop - PAGE_OFFSET +} + +function isAnchorActive( + index: number, + anchor: HTMLAnchorElement, + nextAnchor: HTMLAnchorElement | undefined +): [boolean, string | null] { + const scrollTop = window.scrollY + + if (index === 0 && scrollTop === 0) { + return [true, null] + } + + if (scrollTop < getAnchorTop(anchor)) { + return [false, null] + } + + if (!nextAnchor || scrollTop < getAnchorTop(nextAnchor)) { + return [true, anchor.hash] + } + + return [false, null] +} diff --git a/packages/theme/src/client/composables/index.ts b/packages/theme/src/client/composables/index.ts index 4dfbe520..124f8dbe 100644 --- a/packages/theme/src/client/composables/index.ts +++ b/packages/theme/src/client/composables/index.ts @@ -2,3 +2,5 @@ export * from './darkMode.js' export * from './useScrollPromise.js' export * from './themeData.js' export * from './useResolveRouteWithRedirect.js' +export * from './sidebar.js' +export * from './aside.js' diff --git a/packages/theme/src/client/composables/sidebar.ts b/packages/theme/src/client/composables/sidebar.ts index 85738c51..12dbc467 100644 --- a/packages/theme/src/client/composables/sidebar.ts +++ b/packages/theme/src/client/composables/sidebar.ts @@ -9,6 +9,7 @@ import { useMediaQuery } from '@vueuse/core' import type { ComputedRef, Ref } from 'vue' import { computed, onMounted, onUnmounted, ref, watchEffect } from 'vue' import { useRoute } from 'vue-router' +import type { PlumeThemePageData } from '../../shared/index.js' import { isActive } from '../utils/index.js' import { useThemeLocaleData } from './themeData.js' @@ -24,6 +25,7 @@ export function useSidebar() { const notesData = useNotesData() const theme = useThemeLocaleData() const frontmatter = usePageFrontmatter() + const page = usePageData() const is960 = useMediaQuery('(min-width: 960px)') @@ -33,7 +35,11 @@ export function useSidebar() { return theme.value.notes ? getSidebarList(route.path, notesData.value) : [] }) const hasSidebar = computed(() => { - return !frontmatter.value.home && sidebar.value.length > 0 + return ( + !frontmatter.value.home && + !page.value.isBlogPost && + sidebar.value.length > 0 + ) }) const hasAside = computed(() => { @@ -42,6 +48,10 @@ export function useSidebar() { const isSidebarEnabled = computed(() => hasSidebar.value && is960.value) + const sidebarGroups = computed(() => { + return hasSidebar.value ? getSidebarGroups(sidebar.value) : [] + }) + function open() { isOpen.value = true } @@ -60,6 +70,7 @@ export function useSidebar() { hasSidebar, hasAside, isSidebarEnabled, + sidebarGroups, open, close, toggle, @@ -167,3 +178,31 @@ export function containsActiveLink( ? containsActiveLink(path, items.items as NotesSidebarItem[]) : false } + +/** + * Get or generate sidebar group from the given sidebar items. + */ +export function getSidebarGroups( + sidebar: NotesSidebarItem[] +): NotesSidebarItem[] { + const groups: NotesSidebarItem[] = [] + + let lastGroupIndex = 0 + + for (const index in sidebar) { + const item = sidebar[index] + + if (item.items) { + lastGroupIndex = groups.push(item) + continue + } + + if (!groups[lastGroupIndex]) { + groups.push({ items: [] }) + } + + groups[lastGroupIndex]!.items!.push(item) + } + + return groups +} diff --git a/packages/theme/src/client/layouts/Layout.vue b/packages/theme/src/client/layouts/Layout.vue index 8d3f278e..709f37a1 100644 --- a/packages/theme/src/client/layouts/Layout.vue +++ b/packages/theme/src/client/layouts/Layout.vue @@ -1,7 +1,34 @@ + + + + diff --git a/packages/theme/src/client/components/Blog.vue b/packages/theme/src/client/components/Blog.vue new file mode 100644 index 00000000..fd6f311e --- /dev/null +++ b/packages/theme/src/client/components/Blog.vue @@ -0,0 +1,34 @@ + + + + diff --git a/packages/theme/src/client/components/BlogAvatar.vue b/packages/theme/src/client/components/BlogAvatar.vue new file mode 100644 index 00000000..1ba61122 --- /dev/null +++ b/packages/theme/src/client/components/BlogAvatar.vue @@ -0,0 +1,52 @@ + + + + + diff --git a/packages/theme/src/client/components/BlogPage.vue b/packages/theme/src/client/components/BlogPage.vue deleted file mode 100644 index de33f312..00000000 --- a/packages/theme/src/client/components/BlogPage.vue +++ /dev/null @@ -1,28 +0,0 @@ - - - - diff --git a/packages/theme/src/client/components/Home.vue b/packages/theme/src/client/components/Home.vue index db49aad6..f70353f5 100644 --- a/packages/theme/src/client/components/Home.vue +++ b/packages/theme/src/client/components/Home.vue @@ -1,3 +1,138 @@ + + + diff --git a/packages/theme/src/client/components/LayoutContent.vue b/packages/theme/src/client/components/LayoutContent.vue index ac9d8d61..37ae20e7 100644 --- a/packages/theme/src/client/components/LayoutContent.vue +++ b/packages/theme/src/client/components/LayoutContent.vue @@ -4,7 +4,11 @@ import { useSidebar } from '../composables/index.js' const { hasSidebar } = useSidebar() diff --git a/packages/theme/src/client/components/LocalNav.vue b/packages/theme/src/client/components/LocalNav.vue new file mode 100644 index 00000000..3a7b5fa6 --- /dev/null +++ b/packages/theme/src/client/components/LocalNav.vue @@ -0,0 +1,109 @@ + + + + + diff --git a/packages/theme/src/client/components/Nav/NavBar.vue b/packages/theme/src/client/components/Nav/NavBar.vue index 4b26fb1c..bd517d53 100644 --- a/packages/theme/src/client/components/Nav/NavBar.vue +++ b/packages/theme/src/client/components/Nav/NavBar.vue @@ -6,6 +6,7 @@ import NavBarAppearance from './NavBarAppearance.vue' import NavBarExtra from './NavBarExtra.vue' import NavBarHamburger from './NavBarHamburger.vue' import NavBarMenu from './NavBarMenu.vue' +import NavBarSearch from './NavBarSearch.vue' import NavBarSocialLinks from './NavBarSocialLinks.vue' import NavBarTitle from './NavBarTitle.vue' @@ -35,7 +36,7 @@ const classes = computed(() => ({
- +