From 3a990b3647e80f9348707b0a3d0d5aaf310c2a2b Mon Sep 17 00:00:00 2001 From: terwer Date: Tue, 22 Aug 2023 19:46:10 +0800 Subject: [PATCH] chore: sync repo v1.9.0 --- CHANGELOG.md | 26 +- README.md | 54 +- README_zh_CN.md | 47 +- icon.png | Bin 12170 -> 11616 bytes package.json | 32 +- plugin.json | 5 +- pnpm-lock.yaml | 858 ++++++++++++------ siyuan/i18n/en_US.json | 2 +- siyuan/i18n/zh_CN.json | 2 +- siyuan/index.ts | 10 +- siyuan/invoke/widgetInvoke.ts | 9 + siyuan/topbar.ts | 6 +- .../api/base/github/commonGithubApiAdaptor.ts | 49 +- .../metaweblog/metaweblogBlogApiAdaptor.ts | 13 +- .../api/base/metaweblog/metaweblogConfig.ts | 7 +- src/adaptors/api/cnblogs/cnblogsApiAdaptor.ts | 46 +- src/adaptors/api/cnblogs/cnblogsConfig.ts | 6 +- src/adaptors/api/cnblogs/useCnblogsApi.ts | 7 + src/adaptors/api/hexo/hexoApiAdaptor.ts | 19 +- src/adaptors/api/hexo/hexoConfig.ts | 9 +- .../api/hexo/hexoYamlConverterAdaptor.ts | 179 ++-- src/adaptors/api/hexo/useHexoApi.ts | 11 + .../api/metaweblog/useMetaweblogApi.ts | 7 + src/adaptors/api/notion/notionApiAdaptor.ts | 8 + src/adaptors/api/notion/notionConfig.ts | 8 +- src/adaptors/api/notion/useNotionApi.ts | 9 + src/adaptors/api/typecho/typechoConfig.ts | 6 +- src/adaptors/api/typecho/useTypechoApi.ts | 7 + src/adaptors/api/wordpress/useWordpressApi.ts | 7 + src/adaptors/api/wordpress/wordpressConfig.ts | 6 +- src/adaptors/api/yuque/useYuqueApi.ts | 9 + src/adaptors/api/yuque/yuqueApiAdaptor.ts | 8 +- src/adaptors/api/yuque/yuqueConfig.ts | 8 +- src/adaptors/base/baseExtendApi.ts | 84 +- src/adaptors/index.ts | 69 +- src/adaptors/web/zhihu/useZhihuWeb.ts | 9 + src/adaptors/web/zhihu/zhihuConfig.ts | 11 +- src/adaptors/web/zhihu/zhihuWebAdaptor.ts | 32 +- src/components/publish/BatchPublishIndex.vue | 221 ++++- .../publish/SinglePublishDoPublish.vue | 301 ++++-- .../publish/SinglePublishSelectPlatform.vue | 2 +- src/components/publish/form/AiSwitch.vue | 91 ++ .../publish/form/CommonCategories.vue | 127 +++ .../publish/form/EditModeSelect.vue | 85 ++ .../publish/form/PublishCategories.vue | 77 ++ .../publish/form/PublishDescription.vue | 129 +++ .../publish/form/PublishKnowledgeSpace.vue | 83 ++ src/components/publish/form/PublishTags.vue | 125 ++- src/components/publish/form/PublishTime.vue | 80 ++ src/components/publish/form/PublishTips.vue | 9 +- src/components/publish/form/SourceMode.vue | 399 ++++++++ .../publish/form/category/MultiCategories.vue | 230 +++++ .../form/kwspace/SingleKnowledgeSpace.vue | 173 ++++ .../form/kwspace/TreeSingleKnowledgeSpace.vue | 154 ++++ src/components/set/GeneralSetting.vue | 30 +- src/components/set/SiyuanSetting.vue | 43 +- .../set/preference/PreferenceSetting.vue | 70 ++ .../base/impl/CommonGithubSetting.vue | 2 +- .../commonblog/NotionSetting.vue | 8 +- .../metaweblog/CnblogsSetting.vue | 1 - src/components/test/ChatgptTest.vue | 104 +++ src/components/test/CnblogsTest.vue | 34 +- src/{pages => components/test}/OtherTest.vue | 27 +- src/{pages => components/test}/PicgoTest.vue | 22 +- src/components/test/SiyuanTest.vue | 38 +- src/components/test/TypechoTest.vue | 34 +- src/components/test/WordpressTest.vue | 35 +- src/components/test/YuqueTest.vue | 38 +- src/components/test/ZhihuTest.vue | 40 +- src/composables/useChatGPT.ts | 100 ++ src/composables/useProxy.ts | 2 +- src/composables/usePublish.ts | 303 ++++--- src/composables/usePublishConfig.ts | 8 +- src/composables/useSiyuanApi.ts | 12 +- src/composables/useVueRouter.ts | 72 +- src/extensions/manifest.json | 2 +- .../mv2/manifest-v2-for-firefox.json | 2 +- src/layouts/default/DefaultFooter.vue | 27 +- src/locales/en_US.ts | 30 +- src/locales/zh_CN.ts | 22 +- src/models/distributionPattern.ts | 41 + .../{yamlFormatObj.ts => pageEditMode.ts} | 27 +- .../publishPreferenceCfg.ts} | 40 +- src/models/sourceContentShowType.ts | 34 + src/pages/About.vue | 108 +++ src/pages/ApiTest.vue | 111 --- src/pages/Test.vue | 91 ++ src/platforms/dynamicConfig.ts | 48 +- src/stores/usePublishPreferenceSetting.ts | 72 ++ src/stores/useSiyuanSetting.ts | 23 +- src/types/ICategoryConfig.ts | 103 +++ src/utils/constants.ts | 1 + src/utils/vueUtils.ts | 8 +- src/workers/QuickPublish.vue | 32 +- vite.config.ts | 6 + widget.json | 2 +- 96 files changed, 4694 insertions(+), 1130 deletions(-) create mode 100644 src/components/publish/form/AiSwitch.vue create mode 100644 src/components/publish/form/CommonCategories.vue create mode 100644 src/components/publish/form/EditModeSelect.vue create mode 100644 src/components/publish/form/PublishCategories.vue create mode 100644 src/components/publish/form/PublishDescription.vue create mode 100644 src/components/publish/form/PublishKnowledgeSpace.vue create mode 100644 src/components/publish/form/PublishTime.vue create mode 100644 src/components/publish/form/SourceMode.vue create mode 100644 src/components/publish/form/category/MultiCategories.vue create mode 100644 src/components/publish/form/kwspace/SingleKnowledgeSpace.vue create mode 100644 src/components/publish/form/kwspace/TreeSingleKnowledgeSpace.vue create mode 100644 src/components/set/preference/PreferenceSetting.vue create mode 100644 src/components/test/ChatgptTest.vue rename src/{pages => components/test}/OtherTest.vue (79%) rename src/{pages => components/test}/PicgoTest.vue (74%) create mode 100644 src/composables/useChatGPT.ts create mode 100644 src/models/distributionPattern.ts rename src/models/{yamlFormatObj.ts => pageEditMode.ts} (81%) rename src/{platforms/yamlConvertAdaptor.ts => models/publishPreferenceCfg.ts} (56%) create mode 100644 src/models/sourceContentShowType.ts create mode 100644 src/pages/About.vue delete mode 100644 src/pages/ApiTest.vue create mode 100644 src/pages/Test.vue create mode 100644 src/stores/usePublishPreferenceSetting.ts create mode 100644 src/types/ICategoryConfig.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 12251cd..6ce6575 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,12 +1,34 @@ # Changelog -## [1.8.0](https://github.com/terwer/siyuan-plugin-publisher/compare/v1.7.0...v1.8.0) (2023-08-14) +## [1.9.0](https://github.com/terwer/siyuan-plugin-publisher/compare/v1.8.0...v1.9.0) (2023-08-21) ### Features +* hexo 平台支持修改自定义 yaml ([e9ce0da](https://github.com/terwer/siyuan-plugin-publisher/commit/e9ce0daa43d990762715a918527f218c6863cb21)) +* 优化部分交互 ([fea1af2](https://github.com/terwer/siyuan-plugin-publisher/commit/fea1af27ccff2d6f75aed174a984de9ec861b3ea)) +* 属性以yaml格式存储到文档自定义属性 ([9e8b17b](https://github.com/terwer/siyuan-plugin-publisher/commit/9e8b17b2f367090f70f6ecebef2184b0a376eef2)) +* 批量分发支持标签与分类合并 ([2e29bb4](https://github.com/terwer/siyuan-plugin-publisher/commit/2e29bb40afd48f5370b0630fc76f4c7de72a6773)) +* 支持发布视图 ([c286a64](https://github.com/terwer/siyuan-plugin-publisher/commit/c286a64586a5d3f9e0bb22cfbc14eb2fee0c2e13)) +* 支持文章分类 ([782f4fb](https://github.com/terwer/siyuan-plugin-publisher/commit/782f4fb05cb8494be91f64b06028be6e5e2225a9)) +* 支持文章分类-公共分类 ([66d3b54](https://github.com/terwer/siyuan-plugin-publisher/commit/66d3b54913f3dc3a26dd398b74396a290b273d81)) +* 支持文章分类-单选分类 ([4ca3ecd](https://github.com/terwer/siyuan-plugin-publisher/commit/4ca3ecddcd2b0eeb0378f633168d83afa6a408e6)) +* 支持文章分类-多选分类 ([3d031b9](https://github.com/terwer/siyuan-plugin-publisher/commit/3d031b9e652cccb6cc5f7945bd00bc5d177914cc)) +* 支持文章分类-树形单选分类 ([17538ca](https://github.com/terwer/siyuan-plugin-publisher/commit/17538ca93458bc3164e34296c5ec6dc5280311bf)) +* 支持文章标签 ([37833d1](https://github.com/terwer/siyuan-plugin-publisher/commit/37833d1d3ebee9042d90369b8612df0657079c3f)) +* 支持生成摘要 ([9aa12fa](https://github.com/terwer/siyuan-plugin-publisher/commit/9aa12fab3b64faa6b0d42df3586085701eed9db1)) +* 支持知识空间-树形单选知识空间 ([eb9c56c](https://github.com/terwer/siyuan-plugin-publisher/commit/eb9c56cb0e58966da22eb23023d389ec7dd18ff6)) +* 支持细粒度控制发布属性-支持修改发布时间和更新时间 ([f866652](https://github.com/terwer/siyuan-plugin-publisher/commit/f8666523dbfbb43a517da490882b4041972f04c0)) +* 新 logo ,新征程 ([49c2d7c](https://github.com/terwer/siyuan-plugin-publisher/commit/49c2d7cfec28cf24dc8f7277db3576b611d779b6)) +* 新增人工智能开关 ([6bbd3c8](https://github.com/terwer/siyuan-plugin-publisher/commit/6bbd3c8f8fcc3f53cae124313bb62e19638bb0ab)) +* 源码模式支持替换图片 ([09583e4](https://github.com/terwer/siyuan-plugin-publisher/commit/09583e4026441c686193784612d125f0da68afe8)) +### Bug Fixes +* **deps:** bump siyuan from 0.7.9 to 0.8.0 ([5c01104](https://github.com/terwer/siyuan-plugin-publisher/commit/5c01104ca46d1da06dc4c51a9d227f67b6257b21)) +* **deps:** bump zhi-github-middleware from 0.2.2 to 0.3.4 ([c9ed18b](https://github.com/terwer/siyuan-plugin-publisher/commit/c9ed18b8fcbd65ae8ff64d5ea7c58f11aecb06f5)) +* **deps:** bump zhi-xmlrpc-middleware from 0.4.15 to 0.5.4 ([56931da](https://github.com/terwer/siyuan-plugin-publisher/commit/56931da69614b111d3b78e835bfd7d472a08d6ad)) +* 移除错误引用 ([a7e5d39](https://github.com/terwer/siyuan-plugin-publisher/commit/a7e5d3913f80fd4a668a5730bcb76bb5c3741c7e)) +## [1.8.0](https://github.com/terwer/siyuan-plugin-publisher/compare/v1.7.0...v1.8.0) (2023-08-14) * 底部新增发布配置快捷入口 ([e2eec4c](https://github.com/terwer/siyuan-plugin-publisher/commit/e2eec4c493b1e1dece965f8c87e573a772583fcc)) * 所有平台迁移到官方的正向代理 ([c4de13f](https://github.com/terwer/siyuan-plugin-publisher/commit/c4de13f77c65b74b7db3284729cf4434a6ec6d47)) * 支持接入平台自有能力进行图片上传 ([efccca6](https://github.com/terwer/siyuan-plugin-publisher/commit/efccca6e2c03d2affcc912ec657a2f0ea1822324)) * 新增思源配置 ([202c2ce](https://github.com/terwer/siyuan-plugin-publisher/commit/202c2ce861489da1da4ce48b91bb73dac774c96e)) -### Bug Fixes * 修复思源配置 ([75712b8](https://github.com/terwer/siyuan-plugin-publisher/commit/75712b84b7e743d3dcb2b741aaab5c441405c834)) * 兼容平台图片上传 ([47472af](https://github.com/terwer/siyuan-plugin-publisher/commit/47472af2259592e2929cf14edc168e59ae3c65ab)) * 兼容平台图片上传-picgo 插件检测 ([090425c](https://github.com/terwer/siyuan-plugin-publisher/commit/090425ccec393ef0f582b89e91f846d35c850b80)) diff --git a/README.md b/README.md index fa637c6..4bde9fa 100644 --- a/README.md +++ b/README.md @@ -4,22 +4,25 @@ ![](./icon.png) -Publish articles from Siyuan Notes to platforms such as Yuque, Notion, Cnblogs, WordPress, Typecho, Hexo, Zhihu and more. +Publish articles from siyuan-note to platforms such as Yuque, Notion, Cnblogs, WordPress, Typecho, Hexo, Zhihu and more. Support features such as fast publishing, image bed management, platform expansion, smart labels, etc. -> **Front Announcement 1: Release Tool's first platform-wide version `1.8.0` using the forward agent of Siyuan Note!** +> **Front Announcement 1: The first version `1.9.0` for Publish Tools that supports release view and AI beta early adopter is released!** > -> **Front Announcement 2: The first version of the release tool that fully supports image upload `1.8.0` is released!** +> **Front Announcement 2: Version `1.8.0` released with full support for image upload in the Publish Tools!** Tips: Zhihu uses the image upload of the Zhihu platform, Yuque, Notion, and Hexo need Picgo plugin support, and the Metaweblog series platform supports both Picgo plugin and self-contained image upload (install Picgo plugin to use Picgo plugin, otherwise use their own platform) -We recommend that you use the `uninstall->install` method to update. If the configuration is abnormal, please back up `[workspace]/data/storage/syp/sy-p-plus-cfg.json` , and then delete it, this configuration file will be automatically initialized the first time it is used. +We recommend that you use the `uninstall->install` method to update. If the configuration is abnormal, please backup `[workspace]/data/storage/syp/sy-p-plus-cfg.json` , and then delete it, this configuration file will be automatically initialized the first time it is used. In later releases, the release configuration will only be backward compatible to `1.6.0+`. ## Recent critical updates and bug fixes +- Support multiple publishing views, simple mode, detailed mode and source mode +- Support to modify summary, tags, classification, knowledge space +- The Hexo platform supports custom modification of YAML - Yuque, Notion, and Hexo support image links, and automatic upload requires Picgo plugin support - Zhihu platform supports automatic image upload - When the Picgo plugin is not installed, some platforms can use the built-in image upload, such as Cnblogs, Typecho, WordPress @@ -28,36 +31,22 @@ In later releases, the release configuration will only be backward compatible to - Support publishing to Zhihu - Support for publishing to Hexo - Support for publishing to Notion -- Support for Yuque,Cnblogs, Metaweblog, Typecho, WordPress +- Support for Yuque, Cnblogs, Metaweblog, Typecho, WordPress - Support automatic generation of article aliases - Support for changing the default knowledge base -## Compatibility of Origin notes - -This plugin supports almost all devices and platforms of Siyuan Note, and the specific compatibility is as follows: - -- [X] Siyuan Note Client (zero configuration) is highly recommended -- [X] Servo environment (Zero configuration, cross-domain request proxy built-in) - - [X] CentSource Note Browser Servo - - [X] Siyuan Note Client Servo - - [X] Siyuan Notemaker mobile servo -- [X] Siyuan Note docker version (Zero configuration, cross-domain request proxy built-in) - -🎉 **All platforms have been migrated to the official forward proxy, achieving zero user configuration and supporting cross-domain request proxies by default 🎉** - - ## Platform List Names not listed in order - [X] Yuque +- [X] Notion +- [X] Github + - [X] Hexo - [X] Metaweblog - [X] Cnblogs - [X] Typecho - [X] WordPress -- [X] Github - - [X] Hexo -- [X] Notion - [X] Zhihu ## Core Features @@ -69,12 +58,12 @@ Names not listed in order - [X] **Platform switch**: All platforms support enabling and disabling, the blog garden is enabled by default, and can be disabled at any time - [X] **Dynamic Newly Added**: Support custom adding platform -- [ ] **Smart Classification**: Support smart tags, smart slug aliases, smart summaries, and continue to improve -- [X] **Article Binding**: Support linking existing platform articles to Siyuan Notes to facilitate follow-up management, +- [X] **Smart Classification**: Support smart tags, smart slug aliases, smart summaries, and continue to improve.Smart tags and smart summaries is currently in the invitation experience stage, if you want to experience, you can email youweics@163.com, I will send you a plugin experience package containing AI. +- [X] **Article Binding**: Support linking existing platform articles to siyuan-note to facilitate follow-up management, support Siyuan->platform one-way synchronization - [X] **Adapt to Theme**: Automatically adapt to dark mode and light mode - [X] **Language support**: multi-language support, support Chinese version and English version -- [ ] **Release view**: Support multiple release views, simple mode, detailed mode and source code mode +- [X] **Release view**: Support multiple release views, simple mode, detailed mode and source code mode - [X] **Multiple deployments**: support Siyuan notes pluginHighly recommended, Chrome browser extension, self-deployment This plugin promises that the basic functions will be free forever, and the follow-up related to intelligent AI may be charged, and the closed beta stage is completely free. If you want to support developers, please [feel free to support](https://github.com/terwer/siyuan-plugin-publisher/blob/main/README_zh_CN.md#Donate) here. @@ -83,6 +72,19 @@ This plugin promises that the basic functions will be free forever, and the foll > > In addition to [Extended Functions], **Other functions do not require any dependencies** , and there is no need to download the previous widget, which is already built-in in the plugin. +## Compatibility of Origin notes + +This plugin is fully compatible with `siyuan-note PC Client` , due to limited personal energy, other devices are no longer supported. + +## Supported taxonomy + +- [X] Classification + - [X] Multi-select classification + +- [X] Knowledge space + - [X] Single-choice knowledge space + - [X] Tree-shaped radio knowledge space + ## Platform Adaptation Plan If you have a platform you want to use, but this tool has not yet been implemented, you can submit @@ -171,4 +173,4 @@ more useful tools~ |Svelte|3.57+|Rich Harris| |TypeScript|5.0+|Microsoft| |siyuan-note|2.9.0+|D,V| -- Thanks to [leolee9086](https://github.com/leolee9086) for the icon resource +- Thanks to [leolee9086](https://github.com/leolee9086) and [ciwoyipang]() for the icon resource diff --git a/README_zh_CN.md b/README_zh_CN.md index 45f43fd..1ebdae0 100644 --- a/README_zh_CN.md +++ b/README_zh_CN.md @@ -6,9 +6,9 @@ 将思源笔记的文章发布到语雀、Notion、Cnblogs、WordPress、Typecho、Hexo、知乎 等平台,支持极速发布、图床管理、平台扩展、智能标签等特色功能。 -> **前排公告1:发布工具首个全平台使用思源笔记正向代理的版本 `1.8.0` 发布!** +> **前排公告1:发布工具首个支持发布视图以及AI公测尝鲜的版本 `1.9.0` 发布!** > -> **前排公告2:发布工具首个完整支持图片上传的版本 `1.8.0` 发布!** +> **前排公告2:发布工具完整支持图片上传的版本 `1.8.0` 发布!** 温馨提示:知乎使用知乎平台的图片上传,语雀、Notion、Hexo需要Picgo插件支持,Metaweblog系列平台同时支持Picgo插件和自带图片上传(安装了Picgo插件使用Picgo插件,否则使用自带) @@ -18,6 +18,9 @@ ## 最近的关键更新与 Bug 修复 +- 支持多种发布视图,简单模式、详细模式和源码模式 +- 支持修改摘要、标签、分类、知识空间 +- Hexo 平台支持自定义修改 YAML - 语雀、Notion、Hexo支持图片链接,自动上传需要Picgo插件支持 - 知乎平台支持图片自动上传 - 未安装Picgo插件时,部分平台可使用自带的图片上传,例如博客园、Typecho、WordPress @@ -28,35 +31,22 @@ - 支持发布到知乎 - 支持发布到 Hexo - 支持发布到 Notion -- 支持语雀、博客园、metaweblog、typecho、wordpress +- 支持语雀、博客园、Metaweblog、Typecho、WordPress - 支持自动生成文章别名 - 语雀支持更改默认知识库 -## 思源笔记兼容情况 - -本插件支持思源笔记几乎所有设备和平台,具体兼容情况如下: - -- [X] 思源笔记客户端(零配置)强烈推荐 -- [X] 伺服环境(零配置,跨域请求代理已内置) - - [X] 思源笔记浏览器伺服 - - [X] 思源笔记客户端伺服 - - [X] 思源笔记客移动端伺服 -- [X] 思源笔记docker版(零配置,跨域请求代理已内置) - -**🎉 所有平台均已迁移到官方的正向代理,实现了用户零配置,默认支持跨域请求代理 🎉** - ## 平台列表 排名不分先后 - [X] 语雀 -- [X] 博客园 +- [X] Notion +- [X] Github + - [X] Hexo - [X] Metaweblog +- [X] 博客园 - [X] Typecho - [X] WordPress -- [X] Github - - [X] Hexo -- [X] Notion - [X] 知乎 ## 核心特色 @@ -66,11 +56,11 @@ - [X] **支持扩展**:基于统一的博客 API 规范,内置 metaweblogAPI 、 WordPress 、Wechatsync 和 Github 支持,并提供了统一的适配器,理论上可支持扩展到任何平台 - [X] **平台开关**:所有平台均支持启用禁用,默认开启博客园,可随时禁用 - [X] **动态新增**:支持自定义添加平台 -- [ ] **智能分类**:支持智能标签、智能 slug 别名、智能摘要,并持续完善中 +- [X] **智能分类**:支持智能标签、智能 slug 别名、智能摘要,并持续完善中。智能标签和智能摘要目前处于邀请体验阶段,如果您想体验,可发邮件到 youweics@163.com ,我会发给您一个包含AI的插件体验包。 - [X] **文章绑定**:支持关联已有的平台文章到思源笔记,方便后续管理,支持思源-> 平台单向同步 - [X] **适应主题**:自动适配暗黑模式与浅色模式 - [X] **语言支持**:多语言支持,支持中文版和英文版 -- [ ] **发布视图**:支持多种发布视图,简单模式、详细模式和源码模式 +- [X] **发布视图**:支持多种发布视图,简单模式、详细模式和源码模式 - [X] **多种部署**:支持思源笔记插件强烈推荐、Chrome 浏览器扩展、自部署 本插件承诺,基础功能永久免费,智能AI相关的后续可能会收费,内测阶段完全免费。如果您想支持开发者,请在这里 [随意打赏](https://github.com/terwer/siyuan-plugin-publisher/blob/main/README_zh_CN.md#捐赠)。 @@ -79,6 +69,19 @@ > > 除 [扩展功能] 外,**其他功能无需任何依赖** ,也无需下载之前的挂件,挂件在插件中已经内置。 +## 思源笔记兼容情况 + +本插件完全兼容 `思源笔记PC客户端` ,由于个人精力有限,其他设备不再支持。 + +## 支持的分类体系 + +- [X] 分类 + - [X] 多选分类 + +- [X] 知识空间 + - [X] 单选知识空间 + - [X] 树形单选知识空间 + ## 平台适配计划 如果你有想使用的平台,但是此工具目前还没实现,可在这里提交 [思源笔记发布工具插件平台适配跟踪表](https://terwergreen.feishu.cn/share/base/form/shrcnGRdThUiqnhBg15xgclMM0c) diff --git a/icon.png b/icon.png index c35702c502f4b6c16da7e358f623ccd73669aae4..e321bbfd6c9a59ae1bf0017017944b6052605cdc 100644 GIT binary patch literal 11616 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 JD#VO}{ts@Oryu|T diff --git a/package.json b/package.json index 4414672..d291401 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "siyuan-plugin-publisher", - "version": "1.8.0", + "version": "1.9.0", "description": "Publish articles from Siyuan Notes to platforms such as Yuque, Notion, Cnblogs, WordPress, Typecho, Hexo, Zhihu and more", "repository": "terwer/siyuan-plugin-publisher", "homepage": "https://github.com/terwer/siyuan-plugin-publisher", @@ -30,9 +30,9 @@ "@terwer/esbuild-config-custom": "^1.2.0", "@terwer/eslint-config-custom": "^1.3.6", "@types/crypto-js": "^4.1.1", - "@types/node": "^18.17.5", - "@vitejs/plugin-vue": "^4.2.3", - "@vitest/coverage-v8": "^0.34.1", + "@types/node": "^18.17.7", + "@vitejs/plugin-vue": "^4.3.3", + "@vitest/coverage-v8": "^0.34.2", "@vue/test-utils": "^2.4.1", "esbuild-plugin-copy": "^2.1.1", "esbuild-style-plugin": "^1.6.2", @@ -44,40 +44,42 @@ "typescript": "^5.1.6", "unplugin-auto-import": "^0.16.6", "unplugin-vue-components": "^0.25.1", - "vercel": "^31.2.3", + "vercel": "^31.4.0", "vite": "^4.4.9", "vite-plugin-html": "^3.2.0", - "vite-plugin-node-polyfills": "^0.11.1", - "vitest": "^0.34.1", + "vite-plugin-node-polyfills": "^0.11.3", + "vitest": "^0.34.2", "vue-tsc": "^1.8.8" }, "dependencies": { "@element-plus/icons-vue": "^2.1.0", "@vueuse/components": "^10.3.0", "@vueuse/core": "^10.3.0", + "chatgpt": "^5.2.5", "cheerio": "1.0.0-rc.12", "cross-fetch": "^3.1.8", "crypto-js": "^4.1.1", "element-plus": "^2.3.9", "js-base64": "^3.7.5", + "lodash": "^4.17.21", "pinia": "^2.1.6", "shorthash2": "^1.0.3", "simple-xmlrpc": "^1.4.2", - "siyuan": "^0.7.9", + "siyuan": "^0.8.1", "siyuan-plugin-picgo": "^1.4.4", "uuid": "^9.0.0", "vue": "^3.3.4", "vue-i18n": "^9.2.2", "vue-router": "^4.2.4", "xmlbuilder2": "^3.1.1", - "zhi-blog-api": "^1.20.22", - "zhi-common": "^1.14.2", - "zhi-device": "^2.3.0", - "zhi-fetch-middleware": "^0.2.21", - "zhi-github-middleware": "^0.2.2", + "zhi-blog-api": "^1.33.1", + "zhi-common": "^1.23.1", + "zhi-device": "^2.3.1", + "zhi-fetch-middleware": "^0.3.5", + "zhi-github-middleware": "^0.3.5", "zhi-lib-base": "^0.4.4", "zhi-notion-markdown": "^0.1.4", - "zhi-siyuan-api": "^2.0.27", - "zhi-xmlrpc-middleware": "^0.4.15" + "zhi-siyuan-api": "^2.5.2", + "zhi-xmlrpc-middleware": "^0.5.5" } } diff --git a/plugin.json b/plugin.json index 1548f49..85182b9 100644 --- a/plugin.json +++ b/plugin.json @@ -2,13 +2,12 @@ "name": "siyuan-plugin-publisher", "author": "terwer", "url": "https://github.com/terwer/siyuan-plugin-publisher", - "version": "1.8.0", + "version": "1.9.0", "minAppVersion": "2.9.0", "backends": [ "windows", "linux", - "darwin", - "docker" + "darwin" ], "frontends": [ "desktop", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 24c2a1e..e2ab15a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,6 +14,9 @@ dependencies: '@vueuse/core': specifier: ^10.3.0 version: 10.3.0(vue@3.3.4) + chatgpt: + specifier: ^5.2.5 + version: 5.2.5 cheerio: specifier: 1.0.0-rc.12 version: 1.0.0-rc.12 @@ -29,6 +32,9 @@ dependencies: js-base64: specifier: ^3.7.5 version: 3.7.5 + lodash: + specifier: ^4.17.21 + version: 4.17.21 pinia: specifier: ^2.1.6 version: 2.1.6(typescript@5.1.6)(vue@3.3.4) @@ -39,8 +45,8 @@ dependencies: specifier: ^1.4.2 version: 1.4.2 siyuan: - specifier: ^0.7.9 - version: 0.7.9 + specifier: ^0.8.1 + version: 0.8.1 siyuan-plugin-picgo: specifier: ^1.4.4 version: 1.4.4(typescript@5.1.6) @@ -60,20 +66,20 @@ dependencies: specifier: ^3.1.1 version: 3.1.1 zhi-blog-api: - specifier: ^1.20.22 - version: 1.20.22 + specifier: ^1.33.1 + version: 1.33.1 zhi-common: - specifier: ^1.14.2 - version: 1.14.2 + specifier: ^1.23.1 + version: 1.23.1 zhi-device: - specifier: ^2.3.0 - version: 2.3.0 + specifier: ^2.3.1 + version: 2.3.1 zhi-fetch-middleware: - specifier: ^0.2.21 - version: 0.2.21 + specifier: ^0.3.5 + version: 0.3.5 zhi-github-middleware: - specifier: ^0.2.2 - version: 0.2.2 + specifier: ^0.3.5 + version: 0.3.5 zhi-lib-base: specifier: ^0.4.4 version: 0.4.4 @@ -81,11 +87,11 @@ dependencies: specifier: ^0.1.4 version: 0.1.4 zhi-siyuan-api: - specifier: ^2.0.27 - version: 2.0.27 + specifier: ^2.5.2 + version: 2.5.2 zhi-xmlrpc-middleware: - specifier: ^0.4.15 - version: 0.4.15 + specifier: ^0.5.5 + version: 0.5.5 devDependencies: '@terwer/esbuild-config-custom': @@ -93,19 +99,19 @@ devDependencies: version: 1.2.0(@types/minimist@1.2.2)(dotenv@16.3.1)(esbuild-plugin-copy@2.1.1)(esbuild-plugin-d.ts@1.1.0)(esbuild-plugin-ifdef@1.0.1)(esbuild-plugin-inline-image@0.0.9)(esbuild-plugin-vue3@0.3.2)(esbuild-style-plugin@1.6.2)(esbuild@0.17.19)(minimist@1.2.8)(rimraf@4.4.1)(stylus@0.59.0) '@terwer/eslint-config-custom': specifier: ^1.3.6 - version: 1.3.6(@nuxt/eslint-config@0.1.1)(@typescript-eslint/eslint-plugin@5.62.0)(astro-eslint-parser@0.13.3)(eslint-config-prettier@8.10.0)(eslint-config-turbo@1.10.12)(eslint-plugin-prettier@4.2.1)(eslint-plugin-svelte@2.32.4)(eslint-plugin-vue@9.17.0)(eslint@8.47.0)(prettier-plugin-svelte@2.10.1)(prettier@2.8.8)(typescript@5.1.6) + version: 1.3.6(@nuxt/eslint-config@0.1.1)(@typescript-eslint/eslint-plugin@5.62.0)(astro-eslint-parser@0.13.3)(eslint-config-prettier@8.10.0)(eslint-config-turbo@1.10.12)(eslint-plugin-prettier@4.2.1)(eslint-plugin-svelte@2.33.0)(eslint-plugin-vue@9.17.0)(eslint@8.47.0)(prettier-plugin-svelte@2.10.1)(prettier@2.8.8)(typescript@5.1.6) '@types/crypto-js': specifier: ^4.1.1 version: 4.1.1 '@types/node': - specifier: ^18.17.5 - version: 18.17.5 + specifier: ^18.17.7 + version: 18.17.7 '@vitejs/plugin-vue': - specifier: ^4.2.3 - version: 4.2.3(vite@4.4.9)(vue@3.3.4) + specifier: ^4.3.3 + version: 4.3.3(vite@4.4.9)(vue@3.3.4) '@vitest/coverage-v8': - specifier: ^0.34.1 - version: 0.34.1(vitest@0.34.1) + specifier: ^0.34.2 + version: 0.34.2(vitest@0.34.2) '@vue/test-utils': specifier: ^2.4.1 version: 2.4.1(vue@3.3.4) @@ -140,20 +146,20 @@ devDependencies: specifier: ^0.25.1 version: 0.25.1(vue@3.3.4) vercel: - specifier: ^31.2.3 - version: 31.2.3 + specifier: ^31.4.0 + version: 31.4.0 vite: specifier: ^4.4.9 - version: 4.4.9(@types/node@18.17.5)(stylus@0.59.0) + version: 4.4.9(@types/node@18.17.7)(stylus@0.59.0) vite-plugin-html: specifier: ^3.2.0 version: 3.2.0(vite@4.4.9) vite-plugin-node-polyfills: - specifier: ^0.11.1 - version: 0.11.1(vite@4.4.9) + specifier: ^0.11.3 + version: 0.11.3(vite@4.4.9) vitest: - specifier: ^0.34.1 - version: 0.34.1(jsdom@22.1.0)(stylus@0.59.0) + specifier: ^0.34.2 + version: 0.34.2(jsdom@22.1.0)(stylus@0.59.0) vue-tsc: specifier: ^1.8.8 version: 1.8.8(typescript@5.1.6) @@ -165,8 +171,8 @@ packages: engines: {node: '>=0.10.0'} dev: true - /@adobe/css-tools@4.3.0: - resolution: {integrity: sha512-+RNNcQvw2V1bmnBTPAtOLfW/9mhH2vC67+rUSi5T8EtEWt6lEnGNY2GuhZ1/YwbgikT1TkhvidCDmN5Q5YCo/w==} + /@adobe/css-tools@4.3.1: + resolution: {integrity: sha512-/62yikz7NLScCGAAST5SHdnjaDJQBDq0M2muyRTpf2VQhw6StBg2ALiu73zSJQ4fMVLA+0uBhBHAle7Wg+2kSg==} dev: true /@ampproject/remapping@2.2.1: @@ -177,14 +183,22 @@ packages: '@jridgewell/trace-mapping': 0.3.19 dev: true - /@antfu/utils@0.7.5: - resolution: {integrity: sha512-dlR6LdS+0SzOAPx/TPRhnoi7hE251OVeT2Snw0RguNbBSbjUHdWr0l3vcUUDg26rEysT89kCbtw1lVorBXLLCg==} + /@antfu/utils@0.7.6: + resolution: {integrity: sha512-pvFiLP2BeOKA/ZOS6jxx4XhKzdVLHDhGlFEaZ2flWWYf2xOqVniqpk38I04DFRyz+L0ASggl7SkItTc+ZLju4w==} dev: true - /@astrojs/compiler@1.8.1: - resolution: {integrity: sha512-C28qplQzgIJ+JU9S+1wNx+ue2KCBUp0TTAd10EWAEkk4RsL3Tzlw0BYvLDDb4KP9jS48lXmR4/1TtZ4aavYJ8Q==} + /@astrojs/compiler@1.8.2: + resolution: {integrity: sha512-o/ObKgtMzl8SlpIdzaxFnt7SATKPxu4oIP/1NL+HDJRzxfJcAkOTAb/ZKMRyULbz4q+1t2/DAebs2Z1QairkZw==} dev: true + /@babel/code-frame@7.22.10: + resolution: {integrity: sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.22.10 + chalk: 2.4.2 + dev: false + /@babel/helper-string-parser@7.22.5: resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} engines: {node: '>=6.9.0'} @@ -193,6 +207,15 @@ packages: resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} engines: {node: '>=6.9.0'} + /@babel/highlight@7.22.10: + resolution: {integrity: sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.5 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: false + /@babel/parser@7.22.10: resolution: {integrity: sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==} engines: {node: '>=6.0.0'} @@ -692,8 +715,8 @@ packages: eslint-visitor-keys: 3.4.3 dev: true - /@eslint-community/regexpp@4.6.2: - resolution: {integrity: sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==} + /@eslint-community/regexpp@4.7.0: + resolution: {integrity: sha512-+HencqxU7CFJnQb7IKtuNBqS6Yx3Tz4kOL8BJXo+JyeiBm5MEX6pO8onXDkjrkCRlfYXS1Axro15ZjVFe9YgsA==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} dev: true @@ -851,8 +874,8 @@ packages: engines: {node: '>=8'} dev: true - /@jest/schemas@29.6.0: - resolution: {integrity: sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==} + /@jest/schemas@29.6.3: + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@sinclair/typebox': 0.27.8 @@ -908,7 +931,7 @@ packages: detect-libc: 2.0.2 https-proxy-agent: 5.0.1 make-dir: 3.1.0 - node-fetch: 2.6.12 + node-fetch: 2.6.13 nopt: 5.0.0 npmlog: 5.0.1 rimraf: 3.0.2 @@ -945,7 +968,7 @@ packages: engines: {node: '>=12'} dependencies: '@types/node-fetch': 2.6.4 - node-fetch: 2.6.12 + node-fetch: 2.6.13 transitivePeerDependencies: - encoding dev: false @@ -1080,7 +1103,7 @@ packages: is-glob: 4.0.3 open: 9.1.0 picocolors: 1.0.0 - tslib: 2.6.1 + tslib: 2.6.2 dev: true /@rollup/plugin-inject@5.0.3: @@ -1156,7 +1179,7 @@ packages: dotenv: 16.3.1 esbuild: 0.17.19 esbuild-plugin-copy: 2.1.1(esbuild@0.17.19) - esbuild-plugin-d.ts: 1.1.0(postcss@8.4.27)(typescript@5.1.6) + esbuild-plugin-d.ts: 1.1.0(postcss@8.4.28)(typescript@5.1.6) esbuild-plugin-ifdef: 1.0.1 esbuild-plugin-inline-image: 0.0.9 esbuild-plugin-vue3: 0.3.2(cheerio@1.0.0-rc.12) @@ -1166,7 +1189,7 @@ packages: stylus: 0.59.0 dev: true - /@terwer/eslint-config-custom@1.3.6(@nuxt/eslint-config@0.1.1)(@typescript-eslint/eslint-plugin@5.62.0)(astro-eslint-parser@0.13.3)(eslint-config-prettier@8.10.0)(eslint-config-turbo@1.10.12)(eslint-plugin-prettier@4.2.1)(eslint-plugin-svelte@2.32.4)(eslint-plugin-vue@9.17.0)(eslint@8.47.0)(prettier-plugin-svelte@2.10.1)(prettier@2.8.8)(typescript@5.1.6): + /@terwer/eslint-config-custom@1.3.6(@nuxt/eslint-config@0.1.1)(@typescript-eslint/eslint-plugin@5.62.0)(astro-eslint-parser@0.13.3)(eslint-config-prettier@8.10.0)(eslint-config-turbo@1.10.12)(eslint-plugin-prettier@4.2.1)(eslint-plugin-svelte@2.33.0)(eslint-plugin-vue@9.17.0)(eslint@8.47.0)(prettier-plugin-svelte@2.10.1)(prettier@2.8.8)(typescript@5.1.6): resolution: {integrity: sha512-W0dFSTYfkzpp71LW8cDZUgLrNa004KDctojbiQrJrF4FIDmlwND/LyPUqfe1Eg8sulB5qkNX9qMgFWZ4SAVXBQ==} peerDependencies: '@nuxt/eslint-config': ^0.1.1 @@ -1189,7 +1212,7 @@ packages: eslint-config-prettier: 8.10.0(eslint@8.47.0) eslint-config-turbo: 1.10.12(eslint@8.47.0) eslint-plugin-prettier: 4.2.1(eslint-config-prettier@8.10.0)(eslint@8.47.0)(prettier@2.8.8) - eslint-plugin-svelte: 2.32.4(eslint@8.47.0)(svelte@4.2.0) + eslint-plugin-svelte: 2.33.0(eslint@8.47.0)(svelte@4.2.0) eslint-plugin-vue: 9.17.0(eslint@8.47.0) prettier: 2.8.8 prettier-plugin-svelte: 2.10.1(prettier@2.8.8)(svelte@4.2.0) @@ -1293,14 +1316,14 @@ packages: /@types/node-fetch@2.6.3: resolution: {integrity: sha512-ETTL1mOEdq/sxUtgtOhKjyB2Irra4cjxksvcMUR5Zr4n+PxVhsCD9WS46oPbHL3et9Zde7CNRr+WUNlcHvsX+w==} dependencies: - '@types/node': 18.17.5 + '@types/node': 18.17.7 form-data: 3.0.1 dev: true /@types/node-fetch@2.6.4: resolution: {integrity: sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==} dependencies: - '@types/node': 18.17.5 + '@types/node': 18.17.7 form-data: 3.0.1 dev: false @@ -1308,14 +1331,18 @@ packages: resolution: {integrity: sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg==} dev: true - /@types/node@18.17.5: - resolution: {integrity: sha512-xNbS75FxH6P4UXTPUJp/zNPq6/xsfdJKussCWNOnz4aULWIRwMgP1LgaB5RiBnMX1DPCYenuqGZfnIAx5mbFLA==} + /@types/node@18.17.7: + resolution: {integrity: sha512-WJj/p/cIg6zUsxv1n2leZHpvn8hr9TYuLQxAZxZcK/7+5t5ukmJGelOLGOy3L1MLhAO/sapTJGd1V7kvoIuzUg==} + + /@types/normalize-package-data@2.4.1: + resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} + dev: false /@types/sass@1.45.0: resolution: {integrity: sha512-jn7qwGFmJHwUSphV8zZneO3GmtlgLsmhs/LQyVvQbIIa+fzGMUiHI4HXJZL3FT8MJmgXWbLGiVVY7ElvHq6vDA==} deprecated: This is a stub types definition. sass provides its own type definitions, so you do not need this installed. dependencies: - sass: 1.65.1 + sass: 1.66.1 dev: true /@types/semver@7.5.0: @@ -1325,7 +1352,7 @@ packages: /@types/stylus@0.48.38: resolution: {integrity: sha512-B5otJekvD6XM8iTrnO6e2twoTY2tKL9VkL/57/2Lo4tv3EatbCaufdi68VVtn/h4yjO+HVvYEyrNQd0Lzj6riw==} dependencies: - '@types/node': 18.17.5 + '@types/node': 18.17.7 dev: true /@types/unist@2.0.7: @@ -1350,7 +1377,7 @@ packages: typescript: optional: true dependencies: - '@eslint-community/regexpp': 4.6.2 + '@eslint-community/regexpp': 4.7.0 '@typescript-eslint/parser': 5.62.0(eslint@8.47.0)(typescript@4.9.5) '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/type-utils': 5.62.0(eslint@8.47.0)(typescript@4.9.5) @@ -1378,7 +1405,7 @@ packages: typescript: optional: true dependencies: - '@eslint-community/regexpp': 4.6.2 + '@eslint-community/regexpp': 4.7.0 '@typescript-eslint/parser': 5.62.0(eslint@8.47.0)(typescript@5.1.6) '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/type-utils': 5.62.0(eslint@8.47.0)(typescript@5.1.6) @@ -1593,12 +1620,12 @@ packages: web-vitals: 0.2.4 dev: true - /@vercel/gatsby-plugin-vercel-builder@1.3.17: - resolution: {integrity: sha512-FxT9JZiaak1qCHF1qNKCbcgBPXNarxVLoZbAL2DvEkeyOE9CgadihAA+zTDsqMRFb/Y5dY2KP1+iZFop+K5tuQ==} + /@vercel/gatsby-plugin-vercel-builder@1.3.18: + resolution: {integrity: sha512-E9zk4lDiXigI5UdATt17ilvv+MA25U8QjH5OWqhJn/N3oNl0oZTm2kmXFxfV5lYyJOzAroAVbWZSVtgUMWtGng==} dependencies: '@sinclair/typebox': 0.25.24 '@vercel/build-utils': 6.8.3 - '@vercel/node': 2.15.9 + '@vercel/node': 2.15.10 '@vercel/routing-utils': 2.2.1 esbuild: 0.14.47 etag: 1.8.1 @@ -1642,8 +1669,8 @@ packages: - supports-color dev: true - /@vercel/node@2.15.9: - resolution: {integrity: sha512-nsfTMBZOuXFxz3s7A2b+3rkt2QN016TXn7apPb+apWaO+UzMaRLE0Gubn8TXQ08N4ag6G5bBJXrWRJywL4whrQ==} + /@vercel/node@2.15.10: + resolution: {integrity: sha512-IfnqnKAJlL1+0FSDJgxoe9J3kfYAgPGDjz4aO/H5FSjvqP7cKJnns1F9GsQq4pM499+TY8T8mKAdos7/m+WOEw==} dependencies: '@edge-runtime/node-utils': 2.0.3 '@edge-runtime/primitives': 2.1.2 @@ -1655,7 +1682,7 @@ packages: '@vercel/static-config': 2.0.17 async-listen: 3.0.0 content-type: 1.0.5 - edge-runtime: 2.4.3 + edge-runtime: 2.4.4 esbuild: 0.14.47 exit-hook: 2.2.1 node-fetch: 2.6.9 @@ -1684,8 +1711,8 @@ packages: - supports-color dev: true - /@vercel/remix-builder@1.10.0: - resolution: {integrity: sha512-yvCvj/e2xxkVaPukOb5aCBNCLGsEgi9VSfb79Fo8aWlm5aaCO6UJoGD28/7lF5MxAFAl+Jmbgq0EH+53v/CJ5g==} + /@vercel/remix-builder@1.10.1: + resolution: {integrity: sha512-qkK8Lv9KR4BVmLreKpwtJ9iaKh0NKF9SMZSsT5rLdX8F6EpkayUwSN3EEv4QN/9wFfEb8s1Nf2RY5Pj0zo8Itw==} dependencies: '@vercel/build-utils': 6.8.3 '@vercel/nft': 0.22.5 @@ -1710,11 +1737,11 @@ packages: resolution: {integrity: sha512-J8I0B7wAn8piGoPhBroBfJWgMEJTMEL/2o8MCoCyWdaE7MRtpXhI10pj8IvcUvAECoGJ+SM1Pm+SvBqtbtZ5FQ==} dev: true - /@vercel/static-build@1.3.45: - resolution: {integrity: sha512-htXQUuxxSguvTvsZO0gZeJiGXSUjzMu5VAUpUbQxVSdaB2tY4KKUSo/wq1vLq4jO5YydlUwqazelf0nehSJj6A==} + /@vercel/static-build@1.4.0: + resolution: {integrity: sha512-rCFVBve9nFaXrqP0pGiPaDciTTJ8CHeage8blF8xOEYMYdFRCg5nzFAOPERwUvl80RNpZrnGC7eJKxTHxfY2Ew==} dependencies: '@vercel/gatsby-plugin-vercel-analytics': 1.0.10 - '@vercel/gatsby-plugin-vercel-builder': 1.3.17 + '@vercel/gatsby-plugin-vercel-builder': 1.3.18 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' @@ -1729,19 +1756,19 @@ packages: ts-morph: 12.0.0 dev: true - /@vitejs/plugin-vue@4.2.3(vite@4.4.9)(vue@3.3.4): - resolution: {integrity: sha512-R6JDUfiZbJA9cMiguQ7jxALsgiprjBeHL5ikpXfJCH62pPHtI+JdJ5xWj6Ev73yXSlYl86+blXn1kZHQ7uElxw==} + /@vitejs/plugin-vue@4.3.3(vite@4.4.9)(vue@3.3.4): + resolution: {integrity: sha512-ssxyhIAZqB0TrpUg6R0cBpCuMk9jTIlO1GNSKKQD6S8VjnXi6JXKfUXjSsxey9IwQiaRGsO1WnW9Rkl1L6AJVw==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: vite: ^4.0.0 vue: ^3.2.25 dependencies: - vite: 4.4.9(@types/node@18.17.5)(stylus@0.59.0) + vite: 4.4.9(@types/node@18.17.7)(stylus@0.59.0) vue: 3.3.4 dev: true - /@vitest/coverage-v8@0.34.1(vitest@0.34.1): - resolution: {integrity: sha512-lRgUwjTMr8idXEbUPSNH4jjRZJXJCVY3BqUa+LDXyJVe3pldxYMn/r0HMqatKUGTp0Kyf1j5LfFoY6kRqRp7jw==} + /@vitest/coverage-v8@0.34.2(vitest@0.34.2): + resolution: {integrity: sha512-3VuDZPeGGd1zWtc0Tdj9cHSbFc8IQ0ffnWp9MlhItOkziN6HEf219meZ9cZheg/hJXrXb+Fi2bMu7GeCAfL4yA==} peerDependencies: vitest: '>=0.32.0 <1' dependencies: @@ -1751,70 +1778,70 @@ packages: istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 4.0.1 istanbul-reports: 3.1.6 - magic-string: 0.30.2 + magic-string: 0.30.3 picocolors: 1.0.0 - std-env: 3.3.3 + std-env: 3.4.2 test-exclude: 6.0.0 v8-to-istanbul: 9.1.0 - vitest: 0.34.1(jsdom@22.1.0)(stylus@0.59.0) + vitest: 0.34.2(jsdom@22.1.0)(stylus@0.59.0) transitivePeerDependencies: - supports-color dev: true - /@vitest/expect@0.34.1: - resolution: {integrity: sha512-q2CD8+XIsQ+tHwypnoCk8Mnv5e6afLFvinVGCq3/BOT4kQdVQmY6rRfyKkwcg635lbliLPqbunXZr+L1ssUWiQ==} + /@vitest/expect@0.34.2: + resolution: {integrity: sha512-EZm2dMNlLyIfDMha17QHSQcg2KjeAZaXd65fpPzXY5bvnfx10Lcaz3N55uEe8PhF+w4pw+hmrlHLLlRn9vkBJg==} dependencies: - '@vitest/spy': 0.34.1 - '@vitest/utils': 0.34.1 + '@vitest/spy': 0.34.2 + '@vitest/utils': 0.34.2 chai: 4.3.7 dev: true - /@vitest/runner@0.34.1: - resolution: {integrity: sha512-YfQMpYzDsYB7yqgmlxZ06NI4LurHWfrH7Wy3Pvf/z/vwUSgq1zLAb1lWcItCzQG+NVox+VvzlKQrYEXb47645g==} + /@vitest/runner@0.34.2: + resolution: {integrity: sha512-8ydGPACVX5tK3Dl0SUwxfdg02h+togDNeQX3iXVFYgzF5odxvaou7HnquALFZkyVuYskoaHUOqOyOLpOEj5XTA==} dependencies: - '@vitest/utils': 0.34.1 + '@vitest/utils': 0.34.2 p-limit: 4.0.0 pathe: 1.1.1 dev: true - /@vitest/snapshot@0.34.1: - resolution: {integrity: sha512-0O9LfLU0114OqdF8lENlrLsnn024Tb1CsS9UwG0YMWY2oGTQfPtkW+B/7ieyv0X9R2Oijhi3caB1xgGgEgclSQ==} + /@vitest/snapshot@0.34.2: + resolution: {integrity: sha512-qhQ+xy3u4mwwLxltS4Pd4SR+XHv4EajiTPNY3jkIBLUApE6/ce72neJPSUQZ7bL3EBuKI+NhvzhGj3n5baRQUQ==} dependencies: - magic-string: 0.30.2 + magic-string: 0.30.3 pathe: 1.1.1 - pretty-format: 29.6.2 + pretty-format: 29.6.3 dev: true - /@vitest/spy@0.34.1: - resolution: {integrity: sha512-UT4WcI3EAPUNO8n6y9QoEqynGGEPmmRxC+cLzneFFXpmacivjHZsNbiKD88KUScv5DCHVDgdBsLD7O7s1enFcQ==} + /@vitest/spy@0.34.2: + resolution: {integrity: sha512-yd4L9OhfH6l0Av7iK3sPb3MykhtcRN5c5K5vm1nTbuN7gYn+yvUVVsyvzpHrjqS7EWqn9WsPJb7+0c3iuY60tA==} dependencies: tinyspy: 2.1.1 dev: true - /@vitest/utils@0.34.1: - resolution: {integrity: sha512-/ql9dsFi4iuEbiNcjNHQWXBum7aL8pyhxvfnD9gNtbjR9fUKAjxhj4AA3yfLXg6gJpMGGecvtF8Au2G9y3q47Q==} + /@vitest/utils@0.34.2: + resolution: {integrity: sha512-Lzw+kAsTPubhoQDp1uVAOP6DhNia1GMDsI9jgB0yMn+/nDaPieYQ88lKqz/gGjSHL4zwOItvpehec9OY+rS73w==} dependencies: - diff-sequences: 29.4.3 + diff-sequences: 29.6.3 loupe: 2.3.6 - pretty-format: 29.6.2 + pretty-format: 29.6.3 dev: true - /@volar/language-core@1.10.0: - resolution: {integrity: sha512-ddyWwSYqcbEZNFHm+Z3NZd6M7Ihjcwl/9B5cZd8kECdimVXUFdFi60XHWD27nrWtUQIsUYIG7Ca1WBwV2u2LSQ==} + /@volar/language-core@1.10.1: + resolution: {integrity: sha512-JnsM1mIPdfGPxmoOcK1c7HYAsL6YOv0TCJ4aW3AXPZN/Jb4R77epDyMZIVudSGjWMbvv/JfUa+rQ+dGKTmgwBA==} dependencies: - '@volar/source-map': 1.10.0 + '@volar/source-map': 1.10.1 dev: true - /@volar/source-map@1.10.0: - resolution: {integrity: sha512-/ibWdcOzDGiq/GM1JU2eX8fH1bvAhl66hfe8yEgLEzg9txgr6qb5sQ/DEz5PcDL75tF5H5sCRRwn8Eu8ezi9mw==} + /@volar/source-map@1.10.1: + resolution: {integrity: sha512-3/S6KQbqa7pGC8CxPrg69qHLpOvkiPHGJtWPkI/1AXCsktkJ6gIk/5z4hyuMp8Anvs6eS/Kvp/GZa3ut3votKA==} dependencies: muggle-string: 0.3.1 dev: true - /@volar/typescript@1.10.0: - resolution: {integrity: sha512-OtqGtFbUKYC0pLNIk3mHQp5xWnvL1CJIUc9VE39VdZ/oqpoBh5jKfb9uJ45Y4/oP/WYTrif/Uxl1k8VTPz66Gg==} + /@volar/typescript@1.10.1: + resolution: {integrity: sha512-+iiO9yUSRHIYjlteT+QcdRq8b44qH19/eiUZtjNtuh6D9ailYM7DVR0zO2sEgJlvCaunw/CF9Ov2KooQBpR4VQ==} dependencies: - '@volar/language-core': 1.10.0 + '@volar/language-core': 1.10.1 dev: true /@vue/compiler-core@3.3.4: @@ -1841,8 +1868,8 @@ packages: '@vue/reactivity-transform': 3.3.4 '@vue/shared': 3.3.4 estree-walker: 2.0.2 - magic-string: 0.30.2 - postcss: 8.4.27 + magic-string: 0.30.3 + postcss: 8.4.28 source-map-js: 1.0.2 /@vue/compiler-ssr@3.3.4: @@ -1863,8 +1890,8 @@ packages: typescript: optional: true dependencies: - '@volar/language-core': 1.10.0 - '@volar/source-map': 1.10.0 + '@volar/language-core': 1.10.1 + '@volar/source-map': 1.10.1 '@vue/compiler-dom': 3.3.4 '@vue/reactivity': 3.3.4 '@vue/shared': 3.3.4 @@ -1881,7 +1908,7 @@ packages: '@vue/compiler-core': 3.3.4 '@vue/shared': 3.3.4 estree-walker: 2.0.2 - magic-string: 0.30.2 + magic-string: 0.30.3 /@vue/reactivity@3.3.4: resolution: {integrity: sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==} @@ -1930,7 +1957,7 @@ packages: /@vue/typescript@1.8.8(typescript@5.1.6): resolution: {integrity: sha512-jUnmMB6egu5wl342eaUH236v8tdcEPXXkPgj+eI/F6JwW/lb+yAU6U07ZbQ3MVabZRlupIlPESB7ajgAGixhow==} dependencies: - '@volar/typescript': 1.10.0 + '@volar/typescript': 1.10.1 '@vue/language-core': 1.8.8(typescript@5.1.6) transitivePeerDependencies: - typescript @@ -2030,6 +2057,17 @@ packages: - supports-color dev: true + /ajv-formats@2.1.1(ajv@8.12.0): + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + dependencies: + ajv: 8.12.0 + dev: false + /ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} dependencies: @@ -2039,6 +2077,15 @@ packages: uri-js: 4.4.1 dev: true + /ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: false + /ajv@8.6.3: resolution: {integrity: sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==} dependencies: @@ -2057,6 +2104,13 @@ packages: engines: {node: '>=12'} dev: true + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: false + /ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -2147,10 +2201,10 @@ packages: resolution: {integrity: sha512-n+fb6O40SM6sD36lGwgVIE3zeVQUMdl6ZHaHEjRI4zdaBu658XaAV1YDztF7Iga5kmeOxJYB87mcQ+lUnQs0Nw==} engines: {node: ^14.18.0 || >=16.0.0} dependencies: - '@astrojs/compiler': 1.8.1 + '@astrojs/compiler': 1.8.2 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 - astrojs-compiler-sync: 0.3.3(@astrojs/compiler@1.8.1) + astrojs-compiler-sync: 0.3.3(@astrojs/compiler@1.8.2) debug: 4.3.4 eslint-visitor-keys: 3.4.3 espree: 9.6.1 @@ -2159,13 +2213,13 @@ packages: - supports-color dev: true - /astrojs-compiler-sync@0.3.3(@astrojs/compiler@1.8.1): + /astrojs-compiler-sync@0.3.3(@astrojs/compiler@1.8.2): resolution: {integrity: sha512-LbhchWgsvjvRBb5n5ez8/Q/f9ZKViuox27VxMDOdTUm8MRv9U7phzOiLue5KluqTmC0z1LId4gY2SekvoDrkuw==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: '@astrojs/compiler': '>=0.27.0' dependencies: - '@astrojs/compiler': 1.8.1 + '@astrojs/compiler': 1.8.2 synckit: 0.8.5 dev: true @@ -2189,6 +2243,13 @@ packages: /asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + /atomically@2.0.2: + resolution: {integrity: sha512-Xfmb4q5QV7uqTlVdMSTtO5eF4DCHfNOdaPyKlbFShkzeNP+3lj3yjjcbdjSmEY4+pDBKJ9g26aP+ImTe88UHoQ==} + dependencies: + stubborn-fs: 1.2.5 + when-exit: 2.1.1 + dev: false + /available-typed-arrays@1.0.5: resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} engines: {node: '>= 0.4'} @@ -2210,7 +2271,6 @@ packages: /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: true /before-after-hook@2.2.3: resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} @@ -2393,7 +2453,6 @@ packages: /cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} - dev: true /call-bind@1.0.2: resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} @@ -2411,7 +2470,7 @@ packages: resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} dependencies: pascal-case: 3.1.2 - tslib: 2.6.1 + tslib: 2.6.2 dev: true /ccount@1.1.0: @@ -2431,6 +2490,15 @@ packages: type-detect: 4.0.8 dev: true + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: false + /chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -2451,6 +2519,22 @@ packages: resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} dev: false + /chatgpt@5.2.5: + resolution: {integrity: sha512-DNhBzPb2zTDjJADY44XfngMvsvrvHRq1md2VPXLmnKeP1UCeA1B6pV3s9ZRwlcgjVT0RyM77fRj1xj5V11Vctg==} + engines: {node: '>=14'} + hasBin: true + dependencies: + cac: 6.7.14 + conf: 11.0.2 + eventsource-parser: 1.0.0 + js-tiktoken: 1.0.7 + keyv: 4.5.3 + p-timeout: 6.1.2 + quick-lru: 6.1.1 + read-pkg-up: 9.1.0 + uuid: 9.0.0 + dev: false + /check-error@1.0.2: resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} dev: true @@ -2489,7 +2573,7 @@ packages: normalize-path: 3.0.0 readdirp: 3.6.0 optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 dev: true /chownr@2.0.0: @@ -2534,12 +2618,22 @@ packages: periscopic: 3.1.0 dev: true + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: false + /color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} dependencies: color-name: 1.1.4 + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: false + /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} @@ -2580,6 +2674,20 @@ packages: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: true + /conf@11.0.2: + resolution: {integrity: sha512-jjyhlQ0ew/iwmtwsS2RaB6s8DBifcE2GYBEaw2SJDUY/slJJbNfY4GlDVzOs/ff8cM/Wua5CikqXgbFl5eu85A==} + engines: {node: '>=14.16'} + dependencies: + ajv: 8.12.0 + ajv-formats: 2.1.1(ajv@8.12.0) + atomically: 2.0.2 + debounce-fn: 5.1.2 + dot-prop: 7.2.0 + env-paths: 3.0.0 + json-schema-typed: 8.0.1 + semver: 7.5.4 + dev: false + /config-chain@1.1.13: resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} dependencies: @@ -2657,7 +2765,7 @@ packages: /cross-fetch@3.1.8: resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} dependencies: - node-fetch: 2.6.12 + node-fetch: 2.6.13 transitivePeerDependencies: - encoding dev: false @@ -2755,6 +2863,13 @@ packages: resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} dev: true + /debounce-fn@5.1.2: + resolution: {integrity: sha512-Sr4SdOZ4vw6eQDvPYNxHogvrxmCIld/VenC5JbNrFwMiwd7lY/Z18ZFfo+EWNG4DD9nFlAujWAo/wGuOPHmy5A==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: false + /debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -2841,8 +2956,8 @@ packages: engines: {node: '>=8'} dev: true - /diff-sequences@29.4.3: - resolution: {integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==} + /diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dev: true @@ -2935,9 +3050,16 @@ packages: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} dependencies: no-case: 3.0.4 - tslib: 2.6.1 + tslib: 2.6.2 dev: true + /dot-prop@7.2.0: + resolution: {integrity: sha512-Ol/IPXUARn9CSbkrdV4VJo7uCy1I3VuSiWCaFSg+8BdUOzF9n3jefIpcgAydvUZbTdEBZs2vEiTiS9m61ssiDA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + type-fest: 2.19.0 + dev: false + /dotenv-expand@8.0.3: resolution: {integrity: sha512-SErOMvge0ZUyWd5B0NXMQlDkN+8r+HhVUsxgOO7IoPDOdDRD2JjExpN6y3KnFR66jsJMwSn1pqIivhU5rcJiNg==} engines: {node: '>=12'} @@ -2957,8 +3079,8 @@ packages: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: true - /edge-runtime@2.4.3: - resolution: {integrity: sha512-Amv/P+OJhxopvoVXFr7UXAKheBpdLeCcdR5Vw4GSdNFDWVny9sioQbczjEKPLER5WsMXl17P+llS011Xftducw==} + /edge-runtime@2.4.4: + resolution: {integrity: sha512-uq1YdIxkMDsBYLdSSp/w62PciCL46ic4m1Z/2G6N8RcAPI8p35O8u6hJQT83j28Dnt4U5iyvmwFMYouHMK51uA==} engines: {node: '>=14'} hasBin: true dependencies: @@ -3044,6 +3166,17 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + /env-paths@3.0.0: + resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + dev: false + /es6-object-assign@1.1.0: resolution: {integrity: sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==} dev: true @@ -3348,7 +3481,7 @@ packages: globby: 11.1.0 dev: true - /esbuild-plugin-d.ts@1.1.0(postcss@8.4.27)(typescript@5.1.6): + /esbuild-plugin-d.ts@1.1.0(postcss@8.4.28)(typescript@5.1.6): resolution: {integrity: sha512-3oSR3kUS4fNdKHLYLcST9YOfD2dULe7/UbXnrnu/mRybJYW+jZlYNgklb9Pt7osg6B1qwAYMyr2jTC+Ijj2YbQ==} engines: {node: '>=12.0.0'} peerDependencies: @@ -3357,7 +3490,7 @@ packages: chalk: 4.1.2 jju: 1.4.0 tmp: 0.2.1 - tsup: 5.12.9(postcss@8.4.27)(typescript@5.1.6) + tsup: 5.12.9(postcss@8.4.28)(typescript@5.1.6) typescript: 5.1.6 transitivePeerDependencies: - '@swc/core' @@ -3405,8 +3538,8 @@ packages: '@types/sass': 1.45.0 '@types/stylus': 0.48.38 glob: 10.3.3 - postcss: 8.4.27 - postcss-modules: 6.0.0(postcss@8.4.27) + postcss: 8.4.28 + postcss-modules: 6.0.0(postcss@8.4.28) dev: true /esbuild-sunos-64@0.14.47: @@ -3607,6 +3740,11 @@ packages: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} dev: false + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: false + /escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -3651,8 +3789,8 @@ packages: prettier-linter-helpers: 1.0.0 dev: true - /eslint-plugin-svelte@2.32.4(eslint@8.47.0)(svelte@4.2.0): - resolution: {integrity: sha512-VJ12i2Iogug1jvhwxSlognnfGj76P5gks/V4pUD4SCSVQOp14u47MNP0zAG8AQR3LT0Fi1iUvIFnY4l9z5Rwbg==} + /eslint-plugin-svelte@2.33.0(eslint@8.47.0)(svelte@4.2.0): + resolution: {integrity: sha512-kk7Z4BfxVjFYJseFcOpS8kiKNio7KnAnhFagmM89h1wNSKlM7tIn+uguNQppKM9leYW+S+Us0Rjg2Qg3zsEcvg==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0-0 @@ -3667,13 +3805,13 @@ packages: eslint: 8.47.0 esutils: 2.0.3 known-css-properties: 0.28.0 - postcss: 8.4.27 - postcss-load-config: 3.1.4(postcss@8.4.27) - postcss-safe-parser: 6.0.0(postcss@8.4.27) + postcss: 8.4.28 + postcss-load-config: 3.1.4(postcss@8.4.28) + postcss-safe-parser: 6.0.0(postcss@8.4.28) postcss-selector-parser: 6.0.13 semver: 7.5.4 svelte: 4.2.0 - svelte-eslint-parser: 0.32.2(svelte@4.2.0) + svelte-eslint-parser: 0.33.0(svelte@4.2.0) transitivePeerDependencies: - supports-color - ts-node @@ -3733,7 +3871,7 @@ packages: hasBin: true dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0) - '@eslint-community/regexpp': 4.6.2 + '@eslint-community/regexpp': 4.7.0 '@eslint/eslintrc': 2.1.2 '@eslint/js': 8.47.0 '@humanwhocodes/config-array': 0.11.10 @@ -3836,6 +3974,11 @@ packages: engines: {node: '>=0.8.x'} dev: true + /eventsource-parser@1.0.0: + resolution: {integrity: sha512-9jgfSCa3dmEme2ES3mPByGXfgZ87VbP97tng1G2nWwWx6bV2nYxm2AWCrbQjXToSe+yYlqaZNtxffR9IeQr95g==} + engines: {node: '>=14.18'} + dev: false + /evp_bytestokey@1.0.3: resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} dependencies: @@ -3884,7 +4027,6 @@ packages: /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: true /fast-diff@1.3.0: resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} @@ -3948,6 +4090,14 @@ packages: path-exists: 4.0.0 dev: true + /find-up@6.3.0: + resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + dev: false + /flat-cache@3.0.4: resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -4020,8 +4170,8 @@ packages: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} dev: true - /fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] requiresBuild: true @@ -4030,7 +4180,6 @@ packages: /function-bind@1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - dev: true /gauge@3.0.2: resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} @@ -4096,7 +4245,7 @@ packages: hasBin: true dependencies: foreground-child: 3.1.1 - jackspeak: 2.2.3 + jackspeak: 2.3.0 minimatch: 9.0.3 minipass: 7.0.3 path-scurry: 1.10.1 @@ -4178,6 +4327,11 @@ packages: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} dev: true + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: false + /has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -4215,7 +4369,6 @@ packages: engines: {node: '>= 0.4.0'} dependencies: function-bind: 1.1.1 - dev: true /hash-base@3.1.0: resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} @@ -4246,6 +4399,13 @@ packages: minimalistic-crypto-utils: 1.0.1 dev: true + /hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + dependencies: + lru-cache: 6.0.0 + dev: false + /html-encoding-sniffer@3.0.0: resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} engines: {node: '>=12'} @@ -4321,13 +4481,13 @@ packages: safer-buffer: 2.1.2 dev: true - /icss-utils@5.1.0(postcss@8.4.27): + /icss-utils@5.1.0(postcss@8.4.28): resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.27 + postcss: 8.4.28 dev: true /ieee754@1.2.1: @@ -4390,6 +4550,10 @@ packages: has-tostringtag: 1.0.0 dev: true + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + dev: false + /is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} @@ -4411,7 +4575,6 @@ packages: resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} dependencies: has: 1.0.3 - dev: true /is-decimal@1.0.4: resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} @@ -4568,8 +4731,8 @@ packages: istanbul-lib-report: 3.0.1 dev: true - /jackspeak@2.2.3: - resolution: {integrity: sha512-pF0kfjmg8DJLxDrizHoCZGUFz4P4czQ3HyfW4BU0ffebYkzAVlBywp5zaxW/TM+r0sGbmrQdi8EQQVTJFxnGsQ==} + /jackspeak@2.3.0: + resolution: {integrity: sha512-uKmsITSsF4rUWQHzqaRUuyAir3fZfW3f202Ee34lz/gZCi970CPZwyQXLGNgWJvvZbvFyzeyGq0+4fcG/mBKZg==} engines: {node: '>=14'} dependencies: '@isaacs/cliui': 8.0.2 @@ -4612,6 +4775,16 @@ packages: nopt: 6.0.0 dev: true + /js-tiktoken@1.0.7: + resolution: {integrity: sha512-biba8u/clw7iesNEWLOLwrNGoBP2lA+hTaBLs/D45pJdUPFXyxD6nhcDVtADChghv4GgyAiMKYMiRx7x6h7Biw==} + dependencies: + base64-js: 1.5.1 + dev: false + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: false + /js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true @@ -4664,6 +4837,14 @@ packages: - utf-8-validate dev: true + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: false + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: false + /json-schema-to-ts@1.6.4: resolution: {integrity: sha512-pR4yQ9DHz6itqswtHCm26mw45FSNfQ9rEQjosaZErhn5J3J2sIViQiz8rDaezjKAhFGpmsoczYVBgGHzFw/stA==} dependencies: @@ -4678,7 +4859,10 @@ packages: /json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - dev: true + + /json-schema-typed@8.0.1: + resolution: {integrity: sha512-XQmWYj2Sm4kn4WeTYvmpKEbyPsL7nBsb647c7pMe6l02/yx2+Jfc4dT6UZkEXnIUb5LhD55r2HPsJ1milQ4rDg==} + dev: false /json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} @@ -4703,6 +4887,12 @@ packages: commander: 2.20.3 dev: false + /keyv@4.5.3: + resolution: {integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==} + dependencies: + json-buffer: 3.0.1 + dev: false + /known-css-properties@0.28.0: resolution: {integrity: sha512-9pSL5XB4J+ifHP0e0jmmC98OGC1nL8/JjS+fi6mnTlIf//yt/MfVLtKg7S6nCtj/8KTcWX7nRlY0XywoYY1ISQ==} dev: true @@ -4722,7 +4912,6 @@ packages: /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: true /livereload-js@3.4.1: resolution: {integrity: sha512-5MP0uUeVCec89ZbNOT/i97Mc+q3SxXmiUGhRFOTmhrGPn//uWVQdCvcLJDy64MSBR5MidFdOR7B9viumoavy6g==} @@ -4768,6 +4957,13 @@ packages: p-locate: 5.0.0 dev: true + /locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + p-locate: 6.0.0 + dev: false + /lodash-es@4.17.21: resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} dev: false @@ -4812,7 +5008,7 @@ packages: /lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} dependencies: - tslib: 2.6.1 + tslib: 2.6.2 dev: true /lru-cache@10.0.1: @@ -4825,7 +5021,6 @@ packages: engines: {node: '>=10'} dependencies: yallist: 4.0.0 - dev: true /magic-string@0.27.0: resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} @@ -4834,8 +5029,8 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: true - /magic-string@0.30.2: - resolution: {integrity: sha512-lNZdu7pewtq/ZvWUp9Wpf/x7WzMTsR26TWV03BRZrXFsv+BI6dy8RAiKgm1uM/kyR0rCfUcqvOlXKG66KhIGug==} + /magic-string@0.30.3: + resolution: {integrity: sha512-B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw==} engines: {node: '>=12'} dependencies: '@jridgewell/sourcemap-codec': 1.4.15 @@ -5074,7 +5269,6 @@ packages: /mimic-fn@4.0.0: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} - dev: true /minimalistic-assert@1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} @@ -5204,11 +5398,11 @@ packages: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} dependencies: lower-case: 2.0.2 - tslib: 2.6.1 + tslib: 2.6.2 dev: true - /node-fetch@2.6.12: - resolution: {integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==} + /node-fetch@2.6.13: + resolution: {integrity: sha512-StxNAxh15zr77QvvkmveSQ8uCQ4+v5FkvNTj0OESmiHu+VRi/gXArXtkWMElOsOUNLtUEvI4yS+rdtOHZTwlQA==} engines: {node: 4.x || >=6.0.0} peerDependencies: encoding: ^0.1.0 @@ -5291,6 +5485,16 @@ packages: abbrev: 1.1.1 dev: true + /normalize-package-data@3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + dependencies: + hosted-git-info: 4.1.0 + is-core-module: 2.13.0 + semver: 7.5.4 + validate-npm-package-license: 3.0.4 + dev: false + /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -5305,7 +5509,7 @@ packages: engines: {node: '>=12'} dependencies: markdown-table: 2.0.0 - node-fetch: 2.6.12 + node-fetch: 2.6.13 transitivePeerDependencies: - encoding dev: false @@ -5425,7 +5629,6 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: yocto-queue: 1.0.0 - dev: true /p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} @@ -5434,6 +5637,18 @@ packages: p-limit: 3.1.0 dev: true + /p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + p-limit: 4.0.0 + dev: false + + /p-timeout@6.1.2: + resolution: {integrity: sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==} + engines: {node: '>=14.16'} + dev: false + /pako@1.0.11: resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} dev: true @@ -5442,7 +5657,7 @@ packages: resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} dependencies: dot-case: 3.0.4 - tslib: 2.6.1 + tslib: 2.6.2 dev: true /parent-module@1.0.1: @@ -5473,6 +5688,16 @@ packages: is-hexadecimal: 1.0.4 dev: false + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.22.10 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + dev: false + /parse-ms@2.1.0: resolution: {integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==} engines: {node: '>=6'} @@ -5493,7 +5718,7 @@ packages: resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} dependencies: no-case: 3.0.4 - tslib: 2.6.1 + tslib: 2.6.2 dev: true /path-browserify@1.0.1: @@ -5505,6 +5730,11 @@ packages: engines: {node: '>=8'} dev: true + /path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + /path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} @@ -5622,7 +5852,7 @@ packages: pathe: 1.1.1 dev: true - /postcss-load-config@3.1.4(postcss@8.4.27): + /postcss-load-config@3.1.4(postcss@8.4.28): resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} engines: {node: '>= 10'} peerDependencies: @@ -5635,83 +5865,83 @@ packages: optional: true dependencies: lilconfig: 2.1.0 - postcss: 8.4.27 + postcss: 8.4.28 yaml: 1.10.2 dev: true - /postcss-modules-extract-imports@3.0.0(postcss@8.4.27): + /postcss-modules-extract-imports@3.0.0(postcss@8.4.28): resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.27 + postcss: 8.4.28 dev: true - /postcss-modules-local-by-default@4.0.3(postcss@8.4.27): + /postcss-modules-local-by-default@4.0.3(postcss@8.4.28): resolution: {integrity: sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.27) - postcss: 8.4.27 + icss-utils: 5.1.0(postcss@8.4.28) + postcss: 8.4.28 postcss-selector-parser: 6.0.13 postcss-value-parser: 4.2.0 dev: true - /postcss-modules-scope@3.0.0(postcss@8.4.27): + /postcss-modules-scope@3.0.0(postcss@8.4.28): resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.27 + postcss: 8.4.28 postcss-selector-parser: 6.0.13 dev: true - /postcss-modules-values@4.0.0(postcss@8.4.27): + /postcss-modules-values@4.0.0(postcss@8.4.28): resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.27) - postcss: 8.4.27 + icss-utils: 5.1.0(postcss@8.4.28) + postcss: 8.4.28 dev: true - /postcss-modules@6.0.0(postcss@8.4.27): + /postcss-modules@6.0.0(postcss@8.4.28): resolution: {integrity: sha512-7DGfnlyi/ju82BRzTIjWS5C4Tafmzl3R79YP/PASiocj+aa6yYphHhhKUOEoXQToId5rgyFgJ88+ccOUydjBXQ==} peerDependencies: postcss: ^8.0.0 dependencies: generic-names: 4.0.0 - icss-utils: 5.1.0(postcss@8.4.27) + icss-utils: 5.1.0(postcss@8.4.28) lodash.camelcase: 4.3.0 - postcss: 8.4.27 - postcss-modules-extract-imports: 3.0.0(postcss@8.4.27) - postcss-modules-local-by-default: 4.0.3(postcss@8.4.27) - postcss-modules-scope: 3.0.0(postcss@8.4.27) - postcss-modules-values: 4.0.0(postcss@8.4.27) + postcss: 8.4.28 + postcss-modules-extract-imports: 3.0.0(postcss@8.4.28) + postcss-modules-local-by-default: 4.0.3(postcss@8.4.28) + postcss-modules-scope: 3.0.0(postcss@8.4.28) + postcss-modules-values: 4.0.0(postcss@8.4.28) string-hash: 1.1.3 dev: true - /postcss-safe-parser@6.0.0(postcss@8.4.27): + /postcss-safe-parser@6.0.0(postcss@8.4.28): resolution: {integrity: sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==} engines: {node: '>=12.0'} peerDependencies: postcss: ^8.3.3 dependencies: - postcss: 8.4.27 + postcss: 8.4.28 dev: true - /postcss-scss@4.0.6(postcss@8.4.27): - resolution: {integrity: sha512-rLDPhJY4z/i4nVFZ27j9GqLxj1pwxE80eAzUNRMXtcpipFYIeowerzBgG3yJhMtObGEXidtIgbUpQ3eLDsf5OQ==} + /postcss-scss@4.0.7(postcss@8.4.28): + resolution: {integrity: sha512-xPv2GseoyXPa58Nro7M73ZntttusuCmZdeOojUFR5PZDz2BR62vfYx1w9TyOnp1+nYFowgOMipsCBhxzVkAEPw==} engines: {node: '>=12.0'} peerDependencies: postcss: ^8.4.19 dependencies: - postcss: 8.4.27 + postcss: 8.4.28 dev: true /postcss-selector-parser@6.0.13: @@ -5726,8 +5956,8 @@ packages: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} dev: true - /postcss@8.4.27: - resolution: {integrity: sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==} + /postcss@8.4.28: + resolution: {integrity: sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==} engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.6 @@ -5767,11 +5997,11 @@ packages: engines: {node: '>=6'} dev: true - /pretty-format@29.6.2: - resolution: {integrity: sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==} + /pretty-format@29.6.3: + resolution: {integrity: sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/schemas': 29.6.0 + '@jest/schemas': 29.6.3 ansi-styles: 5.2.0 react-is: 18.2.0 dev: true @@ -5814,7 +6044,6 @@ packages: /punycode@2.3.0: resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} engines: {node: '>=6'} - dev: true /qs@6.11.2: resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} @@ -5836,6 +6065,11 @@ packages: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true + /quick-lru@6.1.1: + resolution: {integrity: sha512-S27GBT+F0NTRiehtbrgaSE1idUAJ5bX8dPAQTdylEyNlrdcH5X4Lz7Edz3DYzecbsCluD5zO8ZNEe04z3D3u6Q==} + engines: {node: '>=12'} + dev: false + /randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} dependencies: @@ -5853,6 +6087,25 @@ packages: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} dev: true + /read-pkg-up@9.1.0: + resolution: {integrity: sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + find-up: 6.3.0 + read-pkg: 7.1.0 + type-fest: 2.19.0 + dev: false + + /read-pkg@7.1.0: + resolution: {integrity: sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==} + engines: {node: '>=12.20'} + dependencies: + '@types/normalize-package-data': 2.4.1 + normalize-package-data: 3.0.3 + parse-json: 5.2.0 + type-fest: 2.19.0 + dev: false + /readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} @@ -5917,7 +6170,6 @@ packages: /require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - dev: true /requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} @@ -5984,15 +6236,15 @@ packages: engines: {node: '>=10.0.0'} hasBin: true optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 dev: true - /rollup@3.28.0: - resolution: {integrity: sha512-d7zhvo1OUY2SXSM6pfNjgD5+d0Nz87CUp4mt8l/GgVP3oBsPwzNvSzyu1me6BSG9JIgWNTVcafIXBIyM8yQ3yw==} + /rollup@3.28.1: + resolution: {integrity: sha512-R9OMQmIHJm9znrU3m3cpE8uhN0fGdXiawME7aZIpQqvpS/85+Vt1Hq1/yVIcYfOmaQiHjvXkQAoJukvLpau6Yw==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 dev: true /rrweb-cssom@0.6.0: @@ -6020,8 +6272,8 @@ packages: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} dev: true - /sass@1.65.1: - resolution: {integrity: sha512-9DINwtHmA41SEd36eVPQ9BJKpn7eKDQmUHmpI0y5Zv2Rcorrh0zS+cFrt050hdNbmmCNKTW3hV5mWfuegNRsEA==} + /sass@1.66.1: + resolution: {integrity: sha512-50c+zTsZOJVgFfTgwwEzkjA3/QACgdNsKueWPyAR0mRINIvLAStVQBbPg14iuqEQ74NPDbXzJARJ/O4SI1zftA==} engines: {node: '>=14.0.0'} hasBin: true dependencies: @@ -6063,7 +6315,6 @@ packages: hasBin: true dependencies: lru-cache: 6.0.0 - dev: true /set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} @@ -6150,11 +6401,11 @@ packages: vue: 3.3.4 vue-i18n: 9.2.2(vue@3.3.4) vue-router: 4.2.4(vue@3.3.4) - zhi-common: 1.14.2 - zhi-device: 2.3.0 - zhi-fetch-middleware: 0.2.21 + zhi-common: 1.23.1 + zhi-device: 2.3.1 + zhi-fetch-middleware: 0.2.29 zhi-lib-base: 0.4.4 - zhi-siyuan-api: 2.0.27 + zhi-siyuan-api: 2.5.2 transitivePeerDependencies: - '@vue/composition-api' - typescript @@ -6164,6 +6415,10 @@ packages: resolution: {integrity: sha512-X5olBQhfkgyPRF+d8agpcbAaFnCSvSkN3LWX7XU9jApmCfpJ/4PAmK7mKPfR1YGBpjFLRa/xTrv11BQ3hxN15Q==} dev: false + /siyuan@0.8.1: + resolution: {integrity: sha512-IchpxouG2+8lKEpm+tkjK9GpipIzQXY/mdH1V8JMv830ZkyCwTEqSbUJOUf1XcKSmOwadBFa1CAzdZmaQg3a4Q==} + dev: false + /slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -6196,6 +6451,28 @@ packages: whatwg-url: 7.1.0 dev: true + /spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.13 + dev: false + + /spdx-exceptions@2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + dev: false + + /spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + dependencies: + spdx-exceptions: 2.3.0 + spdx-license-ids: 3.0.13 + dev: false + + /spdx-license-ids@3.0.13: + resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} + dev: false + /sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} dev: false @@ -6204,8 +6481,8 @@ packages: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} dev: true - /std-env@3.3.3: - resolution: {integrity: sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg==} + /std-env@3.4.2: + resolution: {integrity: sha512-Cw6eJDX9AxEEL0g5pYj8Zx9KXtDf60rxwS2ze0HBanS0aKhj1sBlzcsmg+R0qYy8byFa854/yR2X5ZmBSClVmg==} dev: true /stream-browserify@3.0.0: @@ -6285,11 +6562,15 @@ packages: acorn: 8.10.0 dev: true + /stubborn-fs@1.2.5: + resolution: {integrity: sha512-H2N9c26eXjzL/S/K+i/RHHcFanE74dptvvjM8iwzwbVcWY/zjBbgRqF3K0DY4+OD+uTTASTBvDoxPDaPN02D7g==} + dev: false + /stylus@0.59.0: resolution: {integrity: sha512-lQ9w/XIOH5ZHVNuNbWW8D822r+/wBSO/d6XvtyHLF7LW4KaCIDeVbvn5DF8fGCJAUCwVhVi/h6J0NUcnylUEjg==} hasBin: true dependencies: - '@adobe/css-tools': 4.3.0 + '@adobe/css-tools': 4.3.1 debug: 4.3.4 glob: 7.2.3 sax: 1.2.4 @@ -6312,6 +6593,13 @@ packages: ts-interface-checker: 0.1.13 dev: true + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: false + /supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -6324,8 +6612,8 @@ packages: engines: {node: '>= 0.4'} dev: true - /svelte-eslint-parser@0.32.2(svelte@4.2.0): - resolution: {integrity: sha512-Ok9D3A4b23iLQsONrjqtXtYDu5ZZ/826Blaw2LeFZVTg1pwofKDG4mz3/GYTax8fQ0plRGHI6j+d9VQYy5Lo/A==} + /svelte-eslint-parser@0.33.0(svelte@4.2.0): + resolution: {integrity: sha512-5awZ6Bs+Tb/zQwa41PSdcLynAVQTwW0HGyCBjtbAQ59taLZqDgQSMzRlDmapjZdDtzERm0oXDZNE0E+PKJ6ryg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: svelte: ^3.37.0 || ^4.0.0 @@ -6336,8 +6624,8 @@ packages: eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 - postcss: 8.4.27 - postcss-scss: 4.0.6(postcss@8.4.27) + postcss: 8.4.28 + postcss-scss: 4.0.7(postcss@8.4.28) svelte: 4.2.0 dev: true @@ -6356,7 +6644,7 @@ packages: estree-walker: 3.0.3 is-reference: 3.0.1 locate-character: 3.0.0 - magic-string: 0.30.2 + magic-string: 0.30.3 periscopic: 3.1.0 dev: true @@ -6369,7 +6657,7 @@ packages: engines: {node: ^14.18.0 || >=16.0.0} dependencies: '@pkgr/utils': 2.4.2 - tslib: 2.6.1 + tslib: 2.6.2 dev: true /tar@6.1.15: @@ -6565,11 +6853,11 @@ packages: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} dev: true - /tslib@2.6.1: - resolution: {integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==} + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} dev: true - /tsup@5.12.9(postcss@8.4.27)(typescript@5.1.6): + /tsup@5.12.9(postcss@8.4.28)(typescript@5.1.6): resolution: {integrity: sha512-dUpuouWZYe40lLufo64qEhDpIDsWhRbr2expv5dHEMjwqeKJS2aXA/FPqs1dxO4T6mBojo7rvo3jP9NNzaKyDg==} hasBin: true peerDependencies: @@ -6592,8 +6880,8 @@ packages: execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 - postcss: 8.4.27 - postcss-load-config: 3.1.4(postcss@8.4.27) + postcss: 8.4.28 + postcss-load-config: 3.1.4(postcss@8.4.28) resolve-from: 5.0.0 rollup: 2.79.1 source-map: 0.8.0-beta.0 @@ -6646,6 +6934,11 @@ packages: engines: {node: '>=10'} dev: true + /type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + dev: false + /typescript@4.9.5: resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} engines: {node: '>=4.2.0'} @@ -6680,7 +6973,7 @@ packages: escape-string-regexp: 5.0.0 fast-glob: 3.3.1 local-pkg: 0.4.3 - magic-string: 0.30.2 + magic-string: 0.30.3 mlly: 1.4.0 pathe: 1.1.1 pkg-types: 1.0.3 @@ -6734,12 +7027,12 @@ packages: '@vueuse/core': optional: true dependencies: - '@antfu/utils': 0.7.5 + '@antfu/utils': 0.7.6 '@rollup/pluginutils': 5.0.3 '@vueuse/core': 10.3.0(vue@3.3.4) fast-glob: 3.3.1 local-pkg: 0.4.3 - magic-string: 0.30.2 + magic-string: 0.30.3 minimatch: 9.0.3 unimport: 3.1.3 unplugin: 1.4.0 @@ -6760,13 +7053,13 @@ packages: '@nuxt/kit': optional: true dependencies: - '@antfu/utils': 0.7.5 + '@antfu/utils': 0.7.6 '@rollup/pluginutils': 5.0.3 chokidar: 3.5.3 debug: 4.3.4 fast-glob: 3.3.1 local-pkg: 0.4.3 - magic-string: 0.30.2 + magic-string: 0.30.3 minimatch: 9.0.3 resolve: 1.22.4 unplugin: 1.4.0 @@ -6794,7 +7087,6 @@ packages: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: punycode: 2.3.0 - dev: true /url-parse@1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} @@ -6842,8 +7134,15 @@ packages: convert-source-map: 1.9.0 dev: true - /vercel@31.2.3: - resolution: {integrity: sha512-wbdO/3DGBGRcEYYeYBPc1oAiK+TeQ5CPa0CzT1J/BaBoXor2v3TgcnMwNI70wuxq5pXu4rk54E1Ew11EHQiwqQ==} + /validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + dev: false + + /vercel@31.4.0: + resolution: {integrity: sha512-jRzA3GyPiNckPN9aOiN63ulzgqEduTzALf4N8nh9UvCEzyEisCgtUxj2e+3xVWljdcGkj22VVij/DV4SnAXO6Q==} engines: {node: '>= 14'} hasBin: true dependencies: @@ -6851,12 +7150,12 @@ packages: '@vercel/go': 2.5.1 '@vercel/hydrogen': 0.0.64 '@vercel/next': 3.9.4 - '@vercel/node': 2.15.9 + '@vercel/node': 2.15.10 '@vercel/python': 3.1.60 '@vercel/redwood': 1.1.15 - '@vercel/remix-builder': 1.10.0 + '@vercel/remix-builder': 1.10.1 '@vercel/ruby': 1.3.76 - '@vercel/static-build': 1.3.45 + '@vercel/static-build': 1.4.0 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' @@ -6880,8 +7179,8 @@ packages: vfile-message: 2.0.4 dev: false - /vite-node@0.34.1(@types/node@18.17.5)(stylus@0.59.0): - resolution: {integrity: sha512-odAZAL9xFMuAg8aWd7nSPT+hU8u2r9gU3LRm9QKjxBEF2rRdWpMuqkrkjvyVQEdNFiBctqr2Gg4uJYizm5Le6w==} + /vite-node@0.34.2(@types/node@18.17.7)(stylus@0.59.0): + resolution: {integrity: sha512-JtW249Zm3FB+F7pQfH56uWSdlltCo1IOkZW5oHBzeQo0iX4jtC7o1t9aILMGd9kVekXBP2lfJBEQt9rBh07ebA==} engines: {node: '>=v14.18.0'} hasBin: true dependencies: @@ -6890,7 +7189,7 @@ packages: mlly: 1.4.0 pathe: 1.1.1 picocolors: 1.0.0 - vite: 4.4.9(@types/node@18.17.5)(stylus@0.59.0) + vite: 4.4.9(@types/node@18.17.7)(stylus@0.59.0) transitivePeerDependencies: - '@types/node' - less @@ -6919,24 +7218,24 @@ packages: html-minifier-terser: 6.1.0 node-html-parser: 5.4.2 pathe: 0.2.0 - vite: 4.4.9(@types/node@18.17.5)(stylus@0.59.0) + vite: 4.4.9(@types/node@18.17.7)(stylus@0.59.0) dev: true - /vite-plugin-node-polyfills@0.11.1(vite@4.4.9): - resolution: {integrity: sha512-9bIZGzMhaGk2s/UC0fpDyIsPo5e33xAUAgZOav2GMgxC5KD48lgTecMmWgL326idrXmLGI12ef52CsKHSvSV6Q==} + /vite-plugin-node-polyfills@0.11.3(vite@4.4.9): + resolution: {integrity: sha512-Cz+FJMGzEBwN9KfImOnij3NAfc+P59BXpUqbuN9BzkCr806MY+zo/xzBGOEz9ynY5DUN8fHW2VHUzZgQQS6WJQ==} peerDependencies: vite: ^2.0.0 || ^3.0.0 || ^4.0.0 dependencies: '@rollup/plugin-inject': 5.0.3 buffer-polyfill: /buffer@6.0.3 node-stdlib-browser: 1.2.0 - process-polyfill: /process@0.11.10 - vite: 4.4.9(@types/node@18.17.5)(stylus@0.59.0) + process: 0.11.10 + vite: 4.4.9(@types/node@18.17.7)(stylus@0.59.0) transitivePeerDependencies: - rollup dev: true - /vite@4.4.9(@types/node@18.17.5)(stylus@0.59.0): + /vite@4.4.9(@types/node@18.17.7)(stylus@0.59.0): resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true @@ -6964,17 +7263,17 @@ packages: terser: optional: true dependencies: - '@types/node': 18.17.5 + '@types/node': 18.17.7 esbuild: 0.18.20 - postcss: 8.4.27 - rollup: 3.28.0 + postcss: 8.4.28 + rollup: 3.28.1 stylus: 0.59.0 optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 dev: true - /vitest@0.34.1(jsdom@22.1.0)(stylus@0.59.0): - resolution: {integrity: sha512-G1PzuBEq9A75XSU88yO5G4vPT20UovbC/2osB2KEuV/FisSIIsw7m5y2xMdB7RsAGHAfg2lPmp2qKr3KWliVlQ==} + /vitest@0.34.2(jsdom@22.1.0)(stylus@0.59.0): + resolution: {integrity: sha512-WgaIvBbjsSYMq/oiMlXUI7KflELmzM43BEvkdC/8b5CAod4ryAiY2z8uR6Crbi5Pjnu5oOmhKa9sy7uk6paBxQ==} engines: {node: '>=v14.18.0'} hasBin: true peerDependencies: @@ -7006,12 +7305,12 @@ packages: dependencies: '@types/chai': 4.3.5 '@types/chai-subset': 1.3.3 - '@types/node': 18.17.5 - '@vitest/expect': 0.34.1 - '@vitest/runner': 0.34.1 - '@vitest/snapshot': 0.34.1 - '@vitest/spy': 0.34.1 - '@vitest/utils': 0.34.1 + '@types/node': 18.17.7 + '@vitest/expect': 0.34.2 + '@vitest/runner': 0.34.2 + '@vitest/snapshot': 0.34.2 + '@vitest/spy': 0.34.2 + '@vitest/utils': 0.34.2 acorn: 8.10.0 acorn-walk: 8.2.0 cac: 6.7.14 @@ -7019,15 +7318,15 @@ packages: debug: 4.3.4 jsdom: 22.1.0 local-pkg: 0.4.3 - magic-string: 0.30.2 + magic-string: 0.30.3 pathe: 1.1.1 picocolors: 1.0.0 - std-env: 3.3.3 + std-env: 3.4.2 strip-literal: 1.3.0 tinybench: 2.5.0 tinypool: 0.7.0 - vite: 4.4.9(@types/node@18.17.5)(stylus@0.59.0) - vite-node: 0.34.1(@types/node@18.17.5)(stylus@0.59.0) + vite: 4.4.9(@types/node@18.17.7)(stylus@0.59.0) + vite-node: 0.34.2(@types/node@18.17.7)(stylus@0.59.0) why-is-node-running: 2.2.2 transitivePeerDependencies: - less @@ -7195,6 +7494,10 @@ packages: webidl-conversions: 4.0.2 dev: true + /when-exit@2.1.1: + resolution: {integrity: sha512-XLipGldz/UcleuGaoQjbYuWwD+ICRnzIjlldtwTaTWr7aZz8yQW49rXk6MHQnh+KxOiWiJpM1vIyaxprOnlW4g==} + dev: false + /which-typed-array@1.1.11: resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} engines: {node: '>= 0.4'} @@ -7306,7 +7609,6 @@ packages: /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true /yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} @@ -7344,16 +7646,16 @@ packages: /yocto-queue@1.0.0: resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} engines: {node: '>=12.20'} - dev: true - /zhi-blog-api@1.20.22: - resolution: {integrity: sha512-Qkx502WIJfMUA2IlrYWyQCwGMYGIEFIK4/Yb3iarpEkjV22Z1dOsvTmym8K1ugJb+8gwotcj6ZlgJ+74k36s1Q==} + /zhi-blog-api@1.33.1: + resolution: {integrity: sha512-014v3r3Qx113zuuSoq4FPhd9T27diU79RnlXTpylLaeCGSBhuYQpJHsaee8u9R5Edqcsnxh13Nsg1GhcrCLrpQ==} dependencies: + zhi-common: 1.23.1 zhi-lib-base: 0.4.4 dev: false - /zhi-common@1.14.2: - resolution: {integrity: sha512-UeGLPvhNF5djrcR5srHrA67hGIL1L5wU8IVuwHWL281aJC5JfB/UE00Np1lGT8R0YwqJsE0jy4u9vf2jfJEjSw==} + /zhi-common@1.18.0: + resolution: {integrity: sha512-7m8uyV8+kZ0tJky0myjz8Nj1Ad0kNsMNsg4itixnoM0yIYo6VZ7uU+oMd3qmqyA9kcvszD2QXV4w8qlgIDBGfg==} dependencies: js-yaml: 4.1.0 shorthash2: 1.0.3 @@ -7362,24 +7664,42 @@ packages: zhi-lib-base: 0.4.4 dev: false - /zhi-device@2.3.0: - resolution: {integrity: sha512-we04mMt4BEqeKDxoqdJQsDFYImYlcp/yaAIkpxpMGg+9tBURfNeHPHIHkFias9VbM8yuk6xjAX6B2xJjvYE/iw==} + /zhi-common@1.23.1: + resolution: {integrity: sha512-WvITHbbcehoNJdMPJhjbMQVeAcZMwaTewIszidxPFras0VALZAZn6/Lbgwb9fHy441QlIkUe0KLUUQQ6drforw==} + dependencies: + js-yaml: 4.1.0 + shorthash2: 1.0.3 + transliteration: 2.3.5 + vue: 3.3.4 + zhi-lib-base: 0.4.4 + dev: false + + /zhi-device@2.3.1: + resolution: {integrity: sha512-HLNroA/bIHrEPQTaOC0gZyR42FpaxSJb/lc+LqWvtlazsxeOiYAc9HhFHBwJFdbikMqCogFWVFtGG7OMLYmaKg==} + dev: false + + /zhi-fetch-middleware@0.2.29: + resolution: {integrity: sha512-QUIwvOJ7Aa1EPVPwAflzpvQC8wXvUetdHrFIk+umdVa8L+wYCAF2QTWpCVe4wGe0JClR+V9J8iVlKu9coMZYWw==} + dependencies: + zhi-common: 1.18.0 + zhi-device: 2.3.1 + zhi-lib-base: 0.4.4 dev: false - /zhi-fetch-middleware@0.2.21: - resolution: {integrity: sha512-W+m5mqNMn7GcDsUaDBsDS9w5V+yJsPyBKwlssnnW3ENAavRLYF/7dTkQe/TXLuW36Y3V8981jF6rcw1s6mMOeg==} + /zhi-fetch-middleware@0.3.5: + resolution: {integrity: sha512-/LPOYr/myIhHuJPbQEb3dZaoZOeV9zpi/Fv0g2ogcoLvraIIkRcNU6EJBiqOvxpvx8NRsDX8ZmEumwJIEdXunA==} dependencies: - zhi-common: 1.14.2 - zhi-device: 2.3.0 + zhi-common: 1.23.1 + zhi-device: 2.3.1 zhi-lib-base: 0.4.4 dev: false - /zhi-github-middleware@0.2.2: - resolution: {integrity: sha512-Nja/IIPxSGOg1hpxjAeHf0C4scNZReCURLUzU31Dvv4fRU5qdLxhvOkAJVtHUAp6yfg65/1rminSYsFeRMCBWA==} + /zhi-github-middleware@0.3.5: + resolution: {integrity: sha512-MizdKNJvRf7XvX/sUZniKVKQPNmstkw2TSmd5BiYhoaaAzTcYnONStllvOzLJjexqJh7eUMclUQzW5l+GZU2Wg==} dependencies: '@octokit/core': 5.0.0 js-base64: 3.7.5 - zhi-common: 1.14.2 + zhi-common: 1.23.1 zhi-lib-base: 0.4.4 dev: false @@ -7397,19 +7717,19 @@ packages: - supports-color dev: false - /zhi-siyuan-api@2.0.27: - resolution: {integrity: sha512-V9nteLQHm3Vbu0ANvGUGlCap+I5+BqWTFFcWyqR3Bl9cl1wSKlB2vRV285l8KQecvNSJ21J7bvCuYyFWOeqmpQ==} + /zhi-siyuan-api@2.5.2: + resolution: {integrity: sha512-mnF2J6OWWt15Lwa2w/sWHXn+SQqeHqlW2CIgZHK0wKOaPYI3hH/jVvuTs7pKs1KZa0i6P+mpLIknbTF4da5hCA==} dependencies: - zhi-blog-api: 1.20.22 - zhi-common: 1.14.2 + zhi-blog-api: 1.33.1 + zhi-common: 1.23.1 zhi-lib-base: 0.4.4 dev: false - /zhi-xmlrpc-middleware@0.4.15: - resolution: {integrity: sha512-XmqKZPyeyO+IU3wwDc1GPghevCFW6Ix9DKWW1MnXC4QsPTsQK8b3UN6OlMKTGqfj2mPle1Kg8H/01AihE7utrA==} + /zhi-xmlrpc-middleware@0.5.5: + resolution: {integrity: sha512-j1OTT2vIjP3SovcuA6NtPEXssOLESMO6xepBvffeZ0pbFcS8KHBVUGz38djeFpnRleofNSvab7d7gDKk71YVRA==} dependencies: - zhi-common: 1.14.2 - zhi-device: 2.3.0 + zhi-common: 1.23.1 + zhi-device: 2.3.1 zhi-lib-base: 0.4.4 dev: false diff --git a/siyuan/i18n/en_US.json b/siyuan/i18n/en_US.json index fd2dd64..076cf2d 100644 --- a/siyuan/i18n/en_US.json +++ b/siyuan/i18n/en_US.json @@ -8,7 +8,7 @@ "settingPicbed": "Picbed manage", "settingPublish": "Publish setting", "settingPlatform": "Platform setting", - "settingMenuTips": "Let creation return to fun", + "settingAbout": "About", "copyPageId": "Copy pageId", "publisherWidget": "Publisher Widget", "cancel": "Cancel", diff --git a/siyuan/i18n/zh_CN.json b/siyuan/i18n/zh_CN.json index be01e91..74dff09 100644 --- a/siyuan/i18n/zh_CN.json +++ b/siyuan/i18n/zh_CN.json @@ -8,7 +8,7 @@ "settingPicbed": "图床设置", "settingPublish": "发布设置", "settingPlatform": "平台设置", - "settingMenuTips": "让创作回归乐趣", + "settingAbout": "关于", "copyPageId": "复制文档ID", "publisherWidget": "挂件版", "cancel": "取消", diff --git a/siyuan/index.ts b/siyuan/index.ts index cfc6b66..9398bfd 100644 --- a/siyuan/index.ts +++ b/siyuan/index.ts @@ -23,11 +23,11 @@ * questions. */ -import {App, getFrontend, IObject, Plugin} from "siyuan" -import {SiyuanConfig, SiyuanKernelApi} from "zhi-siyuan-api" -import {createSiyuanAppLogger} from "./appLogger" -import {WidgetInvoke} from "./invoke/widgetInvoke" -import {Topbar} from "./topbar" +import { App, getFrontend, IObject, Plugin } from "siyuan" +import { SiyuanConfig, SiyuanKernelApi } from "zhi-siyuan-api" +import { createSiyuanAppLogger } from "./appLogger" +import { WidgetInvoke } from "./invoke/widgetInvoke" +import { Topbar } from "./topbar" import "./index.styl" diff --git a/siyuan/invoke/widgetInvoke.ts b/siyuan/invoke/widgetInvoke.ts index c1a77b3..1499987 100644 --- a/siyuan/invoke/widgetInvoke.ts +++ b/siyuan/invoke/widgetInvoke.ts @@ -95,6 +95,15 @@ export class WidgetInvoke { await this.showPage(`/setting/general?id=${pageId}`) } + public async showPublisherAboutDialog() { + let pageId: string | undefined = PageUtil.getPageId() + if (pageId == "") { + pageId = undefined + } + this.logger.debug("pageId=>", pageId) + await this.showPage(`/about?id=${pageId}`) + } + private async showPage(pageUrl: string, isReload?: boolean, w?: string, h?: string, noscroll?: boolean) { const deviceType: DeviceTypeEnum = DeviceDetection.getDevice() this.logger.info(`you are from ${deviceType}`) diff --git a/siyuan/topbar.ts b/siyuan/topbar.ts index bb891ad..c544c5e 100644 --- a/siyuan/topbar.ts +++ b/siyuan/topbar.ts @@ -254,8 +254,10 @@ export class Topbar { menu.addSeparator() menu.addItem({ icon: "iconSparkles", - label: this.pluginInstance.i18n.settingMenuTips, - type: "readonly", + label: this.pluginInstance.i18n.settingAbout, + click: () => { + this.widgetInvoke.showPublisherAboutDialog() + }, }) if (this.pluginInstance.isMobile) { diff --git a/src/adaptors/api/base/github/commonGithubApiAdaptor.ts b/src/adaptors/api/base/github/commonGithubApiAdaptor.ts index 07c4294..599920c 100644 --- a/src/adaptors/api/base/github/commonGithubApiAdaptor.ts +++ b/src/adaptors/api/base/github/commonGithubApiAdaptor.ts @@ -25,10 +25,10 @@ import { BaseBlogApi } from "~/src/adaptors/api/base/baseBlogApi.ts" import { createAppLogger } from "~/src/utils/appLogger.ts" -import { CategoryInfo, Post, UserBlog } from "zhi-blog-api" +import { CategoryInfo, Post, UserBlog, YamlConvertAdaptor, YamlFormatObj } from "zhi-blog-api" import { CommonGithubClient, GithubConfig } from "zhi-github-middleware" import { CommonGithubConfig } from "~/src/adaptors/api/base/github/commonGithubConfig.ts" -import { StrUtil } from "zhi-common" +import { StrUtil, YamlUtil } from "zhi-common" import { toRaw } from "vue" import { Base64 } from "js-base64" @@ -80,6 +80,24 @@ class CommonGithubApiAdaptor extends BaseBlogApi { return result } + public async preEditPost(post: Post, id?: string, publishCfg?: any): Promise { + // 调用父类预处理 + await super.preEditPost(post, id, publishCfg) + this.logger.debug("handled preEditPost with parent", { post: toRaw(post) }) + + const yamlAdaptor: YamlConvertAdaptor = this.getYamlAdaptor() + if (null !== yamlAdaptor) { + // 先生成对应平台的yaml + const yamlObj: YamlFormatObj = yamlAdaptor.convertToYaml(post, this.cfg) + this.logger.debug("generate yamlObj using YamlConverterAdaptor =>", yamlObj) + // 同步发布内容 + post.markdown = yamlObj.mdFullContent + this.logger.info("handled yaml using YamlConverterAdaptor") + } + + return post + } + public async newPost(post: Post, publish?: boolean): Promise { this.logger.debug("start newPost =>", { post: toRaw(post) }) const cfg = this.cfg as CommonGithubConfig @@ -104,14 +122,26 @@ class CommonGithubApiAdaptor extends BaseBlogApi { throw new Error("Github 调用API异常") } - const commonPost = new Post() + let commonPost = new Post() commonPost.postid = res.path - // commonPost.title = res.name - commonPost.description = Base64.fromBase64(res.content) + commonPost.markdown = Base64.fromBase64(res.content) + commonPost.description = commonPost.markdown + + // YAML属性转换 + const yamlAdaptor: YamlConvertAdaptor = this.getYamlAdaptor() + if (null !== yamlAdaptor) { + const yamlObj = await YamlUtil.yaml2ObjAsync(commonPost.description) + const yamlFormatObj = new YamlFormatObj() + yamlFormatObj.yamlObj = yamlObj + this.logger.debug("extract frontFormatter, yamlFormatObj =>", yamlFormatObj) + commonPost = yamlAdaptor.convertToAttr(commonPost, yamlFormatObj, this.cfg) + this.logger.debug("handled yamlObj using YamlConverterAdaptor =>", yamlObj) + } - const cats = [] + // 初始化知识空间 const catSlugs = [] - commonPost.categories = cats + const extractedPath = res.path.replace(res.name, "").replace(/\/$/, "") + catSlugs.push(extractedPath) commonPost.cate_slugs = catSlugs return commonPost @@ -139,6 +169,11 @@ class CommonGithubApiAdaptor extends BaseBlogApi { return Promise.resolve([]) } + public async getCategoryTreeNodes(docPath: string): Promise { + const res = await this.githubClient.getGithubPageTreeNode(docPath) + return res + } + public async getPreviewUrl(postid: string): Promise { const cfg = this.cfg as CommonGithubConfig let previewUrl: string diff --git a/src/adaptors/api/base/metaweblog/metaweblogBlogApiAdaptor.ts b/src/adaptors/api/base/metaweblog/metaweblogBlogApiAdaptor.ts index fbe642c..377ee62 100644 --- a/src/adaptors/api/base/metaweblog/metaweblogBlogApiAdaptor.ts +++ b/src/adaptors/api/base/metaweblog/metaweblogBlogApiAdaptor.ts @@ -199,10 +199,15 @@ class MetaweblogBlogApiAdaptor extends BaseBlogApi { this.logger.debug("获取的分类信息,dataArr=>", dataArr) dataArr.forEach((item: any) => { - const cat = new CategoryInfo() - cat.description = item.description - cat.categoryId = item.categoryId - result.push(cat) + const cate = new CategoryInfo() + cate.categoryId = item.categoryId + cate.categoryName = item.categoryName + cate.description = item.description + cate.categoryDescription = item.categoryDescription + cate.htmlUrl = item.htmlUrl + cate.parentId = item.parentId + cate.rssUrl = item.rssUrl + result.push(cate) }) } catch (e) { this.logger.error("分类获取失败", e) diff --git a/src/adaptors/api/base/metaweblog/metaweblogConfig.ts b/src/adaptors/api/base/metaweblog/metaweblogConfig.ts index 23a4677..46abb52 100644 --- a/src/adaptors/api/base/metaweblog/metaweblogConfig.ts +++ b/src/adaptors/api/base/metaweblog/metaweblogConfig.ts @@ -23,7 +23,7 @@ * questions. */ -import { PageTypeEnum } from "zhi-blog-api" +import { CategoryTypeEnum, PageTypeEnum } from "zhi-blog-api" import { MetaweblogPlaceholder } from "~/src/adaptors/api/base/metaweblog/metaweblogPlaceholder.ts" import { CommonBlogConfig } from "~/src/adaptors/api/base/commonBlogConfig.ts" @@ -107,5 +107,10 @@ export class MetaweblogConfig extends CommonBlogConfig { this.usernameEnabled = true this.showTokenTip = false this.allowPreviewUrlChange = true + this.allowPreviewUrlChange = true + this.cateEnabled = true + this.categoryType = CategoryTypeEnum.CategoryType_Multi + this.allowCateChange = true + this.knowledgeSpaceEnabled = false } } diff --git a/src/adaptors/api/cnblogs/cnblogsApiAdaptor.ts b/src/adaptors/api/cnblogs/cnblogsApiAdaptor.ts index 71e811e..49e431a 100644 --- a/src/adaptors/api/cnblogs/cnblogsApiAdaptor.ts +++ b/src/adaptors/api/cnblogs/cnblogsApiAdaptor.ts @@ -23,12 +23,13 @@ * questions. */ -import { Post, UserBlog } from "zhi-blog-api" +import { CategoryInfo, Post, UserBlog } from "zhi-blog-api" import { CnblogsConfig } from "~/src/adaptors/api/cnblogs/cnblogsConfig.ts" import { AppInstance } from "~/src/appInstance.ts" import { createAppLogger } from "~/src/utils/appLogger.ts" import { CnblogsConstants } from "~/src/adaptors/api/cnblogs/cnblogsConstants.ts" import { MetaweblogBlogApiAdaptor } from "~/src/adaptors/api/base/metaweblog/metaweblogBlogApiAdaptor.ts" +import { MetaweblogConstants } from "~/src/adaptors/api/base/metaweblog/metaweblogConstants.ts" /** * 博客园 API 适配器 @@ -40,6 +41,8 @@ import { MetaweblogBlogApiAdaptor } from "~/src/adaptors/api/base/metaweblog/met * @since 0.9.0 */ class CnblogsApiAdaptor extends MetaweblogBlogApiAdaptor { + private readonly MD_CATEGORY = "[Markdown]" + /** * 初始化博客园 API 适配器 * @@ -88,12 +91,43 @@ class CnblogsApiAdaptor extends MetaweblogBlogApiAdaptor { return ret } - private assignMdCategory(post: Post) { - const MD_CATEGORY = "[Markdown]" - const cats = post.categories ?? [] + public override async getCategories(): Promise { + const result = [] as CategoryInfo[] + + try { + const ret = await this.metaweblogCall(MetaweblogConstants.METHOD_GET_CATEGORIES, [ + this.cfg.blogid, + this.cfg.username, + this.cfg.password, + ]) + const dataArr = ret + this.logger.debug("博客园获取的分类信息,dataArr=>", dataArr) + + dataArr.forEach((item: any) => { + const cate = new CategoryInfo() + // MD 分类默认不展示 + if (item.title !== this.MD_CATEGORY) { + cate.categoryId = item.categoryid + cate.categoryName = item.title + cate.description = item.description + cate.categoryDescription = item.categoryDescription + cate.htmlUrl = item.htmlUrl + cate.parentId = item.parentId + cate.rssUrl = item.rssUrl + result.push(cate) + } + }) + } catch (e) { + this.logger.error("博客园分类获取失败", e) + } - if (cats.length === 0 || cats.some((cat) => cat.toLowerCase() === MD_CATEGORY.toLowerCase())) { - cats.push(MD_CATEGORY) + return result + } + + private assignMdCategory(post: Post) { + const cates = post.categories ?? [] + if (!cates.some((cate) => cate.toLowerCase() === this.MD_CATEGORY.toLowerCase())) { + cates.push(this.MD_CATEGORY) } return post diff --git a/src/adaptors/api/cnblogs/cnblogsConfig.ts b/src/adaptors/api/cnblogs/cnblogsConfig.ts index 8c6738a..7400586 100644 --- a/src/adaptors/api/cnblogs/cnblogsConfig.ts +++ b/src/adaptors/api/cnblogs/cnblogsConfig.ts @@ -23,7 +23,7 @@ * questions. */ -import { PageTypeEnum, PasswordType } from "zhi-blog-api" +import { CategoryTypeEnum, PageTypeEnum, PasswordType } from "zhi-blog-api" import { MetaweblogConfig } from "~/src/adaptors/api/base/metaweblog/metaweblogConfig.ts" /** @@ -51,6 +51,10 @@ class CnblogsConfig extends MetaweblogConfig { this.passwordType = PasswordType.PasswordType_Token this.showTokenTip = true this.allowPreviewUrlChange = true + this.cateEnabled = true + this.categoryType = CategoryTypeEnum.CategoryType_Multi + this.allowCateChange = true + this.knowledgeSpaceEnabled = false } } diff --git a/src/adaptors/api/cnblogs/useCnblogsApi.ts b/src/adaptors/api/cnblogs/useCnblogsApi.ts index c9b7631..bc74a34 100644 --- a/src/adaptors/api/cnblogs/useCnblogsApi.ts +++ b/src/adaptors/api/cnblogs/useCnblogsApi.ts @@ -31,6 +31,7 @@ import { AppInstance } from "~/src/appInstance.ts" import { useSettingStore } from "~/src/stores/useSettingStore.ts" import { JsonUtil, ObjectUtil, StrUtil } from "zhi-common" import { getDynPostidKey } from "~/src/platforms/dynamicConfig.ts" +import { CategoryTypeEnum } from "zhi-blog-api" /** * 使用Cnblogs API的自定义hook @@ -86,6 +87,12 @@ export const useCnblogsApi = async (key?: string, newCfg?: CnblogsConfig) => { } } + // 博客园使用多选分类 + cfg.cateEnabled = true + cfg.categoryType = CategoryTypeEnum.CategoryType_Multi + cfg.allowCateChange = true + cfg.knowledgeSpaceEnabled = false + // 创建Cnblogs API适配器 const blogApi = new CnblogsApiAdaptor(appInstance, cfg) diff --git a/src/adaptors/api/hexo/hexoApiAdaptor.ts b/src/adaptors/api/hexo/hexoApiAdaptor.ts index 9f76aaa..bc5429e 100644 --- a/src/adaptors/api/hexo/hexoApiAdaptor.ts +++ b/src/adaptors/api/hexo/hexoApiAdaptor.ts @@ -24,10 +24,7 @@ */ import { CommonGithubApiAdaptor } from "~/src/adaptors/api/base/github/commonGithubApiAdaptor.ts" -import { Post } from "zhi-blog-api" -import { CommonGithubConfig } from "~/src/adaptors/api/base/github/commonGithubConfig.ts" -import { YamlConvertAdaptor } from "~/src/platforms/yamlConvertAdaptor.ts" -import { YamlFormatObj } from "~/src/models/yamlFormatObj.ts" +import { YamlConvertAdaptor } from "zhi-blog-api" import { HexoYamlConverterAdaptor } from "~/src/adaptors/api/hexo/hexoYamlConverterAdaptor.ts" /** @@ -38,18 +35,8 @@ import { HexoYamlConverterAdaptor } from "~/src/adaptors/api/hexo/hexoYamlConver * @since 0.8.1 */ class HexoApiAdaptor extends CommonGithubApiAdaptor { - public async preEditPost(post: Post, id?: string, publishCfg?: any): Promise { - // 调用父类预处理 - await super.preEditPost(post, id, publishCfg) - this.logger.info("handled preEditPost with parent") - - // 处理 YAML - const cfg = this.cfg as CommonGithubConfig - const yamlApi: YamlConvertAdaptor = new HexoYamlConverterAdaptor() - const yamlObj: YamlFormatObj = yamlApi.convertToYaml(post, cfg) - post.description = yamlObj.mdFullContent - this.logger.info("handled yaml using HexoYamlConverterAdaptor") - return post + public override getYamlAdaptor(): YamlConvertAdaptor { + return new HexoYamlConverterAdaptor() } } diff --git a/src/adaptors/api/hexo/hexoConfig.ts b/src/adaptors/api/hexo/hexoConfig.ts index a15dc17..4f30090 100644 --- a/src/adaptors/api/hexo/hexoConfig.ts +++ b/src/adaptors/api/hexo/hexoConfig.ts @@ -24,7 +24,7 @@ */ import { CommonGithubConfig } from "~/src/adaptors/api/base/github/commonGithubConfig.ts" -import { PageTypeEnum, PasswordType } from "zhi-blog-api" +import { CategoryTypeEnum, PageTypeEnum, PasswordType } from "zhi-blog-api" /** * 博 Hexo 配置 @@ -51,6 +51,13 @@ class HexoConfig extends CommonGithubConfig { this.pageType = PageTypeEnum.Markdown this.passwordType = PasswordType.PasswordType_Token this.allowPreviewUrlChange = false + this.cateEnabled = true + this.allowCateChange = true + this.categoryType = CategoryTypeEnum.CategoryType_Multi + this.knowledgeSpaceEnabled = true + this.allowKnowledgeSpaceChange = false + this.placeholder.knowledgeSpaceReadonlyModeTip = "Hexo 平台暂不支持修改发布目录,如需修改,请删除之后重新发布" + this.knowledgeSpaceType = CategoryTypeEnum.CategoryType_Tree_Single } } diff --git a/src/adaptors/api/hexo/hexoYamlConverterAdaptor.ts b/src/adaptors/api/hexo/hexoYamlConverterAdaptor.ts index 9465cc9..ff39e07 100644 --- a/src/adaptors/api/hexo/hexoYamlConverterAdaptor.ts +++ b/src/adaptors/api/hexo/hexoYamlConverterAdaptor.ts @@ -23,13 +23,11 @@ * questions. */ -import { YamlConvertAdaptor } from "~/src/platforms/yamlConvertAdaptor.ts" import { createAppLogger } from "~/src/utils/appLogger.ts" -import { YamlFormatObj } from "~/src/models/yamlFormatObj.ts" -import { Post } from "zhi-blog-api" -import { CommonBlogConfig } from "~/src/adaptors/api/base/commonBlogConfig.ts" +import { BlogConfig, Post, YamlConvertAdaptor, YamlFormatObj } from "zhi-blog-api" import { DateUtil, StrUtil, YamlUtil } from "zhi-common" import { CommonGithubConfig } from "~/src/adaptors/api/base/github/commonGithubConfig.ts" +import { toRaw } from "vue" /** * Hexo平台的YAML解析器 @@ -40,75 +38,124 @@ import { CommonGithubConfig } from "~/src/adaptors/api/base/github/commonGithubC export class HexoYamlConverterAdaptor extends YamlConvertAdaptor { private readonly logger = createAppLogger("hexo-yaml-converter-adaptor") - convertToYaml(post: Post, cfg?: CommonBlogConfig): YamlFormatObj { - let yamlFormatObj: YamlFormatObj = new YamlFormatObj() - this.logger.debug("您正在使用 Hexo Yaml Converter", post) - - // title - yamlFormatObj.yamlObj.title = post.title - - // date - // yamlFormatObj.yamlObj.date = post.dateCreated - - // updated - yamlFormatObj.yamlObj.updated = DateUtil.formatIsoToZhDate(new Date().toISOString()) - - // excerpt - yamlFormatObj.yamlObj.excerpt = post.shortDesc - - // // tags - // yamlFormatObj.yamlObj.tags = postForm.formData.tag.dynamicTags - // - // // categories - // yamlFormatObj.yamlObj.categories = postForm.formData.categories - - // permalink - let link = "/post/" + post.wp_slug + ".html" - if (cfg instanceof CommonGithubConfig) { - const githubCfg = cfg as CommonGithubConfig - if (!StrUtil.isEmptyString(cfg.previewPostUrl)) { - link = githubCfg.previewPostUrl.replace("[postid]", post.wp_slug) - const created = DateUtil.formatIsoToZh(post.dateCreated.toISOString(), true) - const datearr = created.split(" ")[0] - const numarr = datearr.split("-") - this.logger.debug("created numarr=>", numarr) - const y = numarr[0] - const m = numarr[1] - const d = numarr[2] - link = link.replace(/\[yyyy]/g, y) - link = link.replace(/\[MM]/g, m) - link = link.replace(/\[mm]/g, m) - link = link.replace(/\[dd]/g, d) - - if (yamlFormatObj.yamlObj.categories.length > 0) { - link = link.replace(/\[cats]/, yamlFormatObj.yamlObj.categories.join("/")) - } else { - link = link.replace(/\/\[cats]/, "") + public convertToYaml(post: Post, cfg?: BlogConfig): YamlFormatObj { + this.logger.debug("您正在使用 Hexo Yaml Converter", { post: toRaw(post) }) + const savedYaml = YamlUtil.extractFrontmatter(post.yaml).trim() + if (!StrUtil.isEmptyString(savedYaml)) { + const yamlFormatObj = new YamlFormatObj() + const yamlObj = YamlUtil.yaml2Obj(savedYaml) + yamlFormatObj.yamlObj = yamlObj + yamlFormatObj.formatter = post.yaml + yamlFormatObj.mdContent = post.markdown + yamlFormatObj.mdFullContent = YamlUtil.addYamlToMd(post.yaml, yamlFormatObj.mdContent) + yamlFormatObj.htmlContent = post.html + this.logger.info("读取已经存在的YAML") + return yamlFormatObj + } else { + let defaultYFMObj: YamlFormatObj = new YamlFormatObj() + // title + defaultYFMObj.yamlObj.title = post.title + + // date + defaultYFMObj.yamlObj.date = DateUtil.formatIsoToZh(post.dateCreated.toISOString(), true) + + // updated + if (!post.dateUpdated) { + post.dateUpdated = new Date() + } + defaultYFMObj.yamlObj.updated = DateUtil.formatIsoToZh(post.dateUpdated.toISOString(), true) + + // excerpt + if (!StrUtil.isEmptyString(post.shortDesc)) { + defaultYFMObj.yamlObj.excerpt = post.shortDesc + } + + // tags + if (!StrUtil.isEmptyString(post.mt_keywords)) { + const tags = post.mt_keywords.split(",") + defaultYFMObj.yamlObj.tags = tags + } + + // categories + if (post.categories?.length > 0) { + defaultYFMObj.yamlObj.categories = post.categories + } + + // permalink + let link = "/post/" + post.wp_slug + ".html" + if (cfg instanceof CommonGithubConfig) { + const githubCfg = cfg as CommonGithubConfig + if (!StrUtil.isEmptyString(cfg.previewPostUrl)) { + link = githubCfg.previewPostUrl.replace("[postid]", post.wp_slug) + const created = DateUtil.formatIsoToZh(post.dateCreated.toISOString(), true) + const datearr = created.split(" ")[0] + const numarr = datearr.split("-") + this.logger.debug("created numarr=>", numarr) + const y = numarr[0] + const m = numarr[1] + const d = numarr[2] + link = link.replace(/\[yyyy]/g, y) + link = link.replace(/\[MM]/g, m) + link = link.replace(/\[mm]/g, m) + link = link.replace(/\[dd]/g, d) + + if (defaultYFMObj.yamlObj.categories?.length > 0) { + link = link.replace(/\[cats]/, defaultYFMObj.yamlObj.categories.join("/")) + } else { + link = link.replace(/\/\[cats]/, "") + } } } - } - yamlFormatObj.yamlObj.permalink = link + defaultYFMObj.yamlObj.permalink = link - // comments - yamlFormatObj.yamlObj.comments = true + // comments + defaultYFMObj.yamlObj.comments = true - // toc - yamlFormatObj.yamlObj.toc = true + // toc + defaultYFMObj.yamlObj.toc = true - // formatter - let yaml = YamlUtil.obj2Yaml(yamlFormatObj.yamlObj) - // 修复yaml的ISO日期格式(js-yaml转换的才需要) - yaml = DateUtil.formatIsoToZhDate(yaml) - this.logger.debug("yaml=>", yaml) + // formatter + let yaml = YamlUtil.obj2Yaml(defaultYFMObj.yamlObj) + this.logger.debug("yaml=>", yaml) - yamlFormatObj.formatter = yaml - yamlFormatObj.mdContent = post.markdown - yamlFormatObj.mdFullContent = yamlFormatObj.formatter + "\n\n" + yamlFormatObj.mdContent - yamlFormatObj.htmlContent = post.html - return yamlFormatObj + defaultYFMObj.formatter = yaml + defaultYFMObj.mdContent = post.markdown + defaultYFMObj.mdFullContent = YamlUtil.addYamlToMd(defaultYFMObj.formatter, defaultYFMObj.mdContent) + defaultYFMObj.htmlContent = post.html + this.logger.info("生成默认的YAML") + return defaultYFMObj + } } - convertToAttr(yamlFormatObj: YamlFormatObj, cfg?: CommonBlogConfig): Post { - return super.convertToAttr(yamlFormatObj, cfg) + public convertToAttr(post: Post, yamlFormatObj: YamlFormatObj, cfg?: BlogConfig): Post { + this.logger.debug("开始转换YAML到Post", yamlFormatObj) + + // 标题 + if (yamlFormatObj.yamlObj?.title) { + post.title = yamlFormatObj.yamlObj?.title + } + + // 发布时间 + if (yamlFormatObj.yamlObj?.date) { + post.dateCreated = DateUtil.convertStringToDate(yamlFormatObj.yamlObj?.date) + } + if (yamlFormatObj.yamlObj?.updated) { + post.dateUpdated = DateUtil.convertStringToDate(yamlFormatObj.yamlObj?.updated) + } + + // 摘要 + post.shortDesc = yamlFormatObj.yamlObj?.excerpt + + // 标签 + post.mt_keywords = yamlFormatObj.yamlObj?.tags?.join(",") + + // 分类 + post.categories = yamlFormatObj.yamlObj?.categories + + // 添加新的YAML + post.yaml = YamlUtil.obj2Yaml(yamlFormatObj.yamlObj) + + this.logger.debug("转换完成,post =>", post) + return post } } diff --git a/src/adaptors/api/hexo/useHexoApi.ts b/src/adaptors/api/hexo/useHexoApi.ts index d1edd9d..e1c47ee 100644 --- a/src/adaptors/api/hexo/useHexoApi.ts +++ b/src/adaptors/api/hexo/useHexoApi.ts @@ -32,6 +32,7 @@ import { getDynPostidKey } from "~/src/platforms/dynamicConfig.ts" import { HexoConfig } from "~/src/adaptors/api/hexo/hexoConfig.ts" import { HexoApiAdaptor } from "~/src/adaptors/api/hexo/hexoApiAdaptor.ts" import { HexoYamlConverterAdaptor } from "~/src/adaptors/api/hexo/hexoYamlConverterAdaptor.ts" +import { CategoryTypeEnum } from "zhi-blog-api" const useHexoApi = async (key: string, newCfg?: HexoConfig) => { // 创建应用日志记录器 @@ -76,6 +77,16 @@ const useHexoApi = async (key: string, newCfg?: HexoConfig) => { } } + // 分类 + cfg.cateEnabled = true + cfg.allowCateChange = true + cfg.categoryType = CategoryTypeEnum.CategoryType_Multi + // 知识空间 + cfg.knowledgeSpaceEnabled = true + cfg.allowKnowledgeSpaceChange = false + cfg.placeholder.knowledgeSpaceReadonlyModeTip = "Hexo 平台暂不支持修改发布目录,如需修改,请删除之后重新发布" + cfg.knowledgeSpaceType = CategoryTypeEnum.CategoryType_Tree_Single + // 创建 Hexo 的 yamlAdaptor const yamlAdaptor = new HexoYamlConverterAdaptor() diff --git a/src/adaptors/api/metaweblog/useMetaweblogApi.ts b/src/adaptors/api/metaweblog/useMetaweblogApi.ts index a4f62db..1484357 100644 --- a/src/adaptors/api/metaweblog/useMetaweblogApi.ts +++ b/src/adaptors/api/metaweblog/useMetaweblogApi.ts @@ -31,6 +31,7 @@ import { JsonUtil, ObjectUtil, StrUtil } from "zhi-common" import { Utils } from "~/src/utils/utils.ts" import { getDynPostidKey } from "~/src/platforms/dynamicConfig.ts" import { MetaweblogBlogApiAdaptor } from "~/src/adaptors/api/base/metaweblog/metaweblogBlogApiAdaptor.ts" +import { CategoryTypeEnum } from "zhi-blog-api" /** * 使用Metaweblog API的自定义hook @@ -83,6 +84,12 @@ export const useMetaweblogApi = async (key?: string, newCfg?: MetaweblogConfig) } } + // Metaweblog 默认支持多选分类 + cfg.cateEnabled = true + cfg.categoryType = CategoryTypeEnum.CategoryType_Multi + cfg.allowCateChange = true + cfg.knowledgeSpaceEnabled = false + // 创建Metaweblog API适配器 const blogApi = new MetaweblogBlogApiAdaptor(appInstance, cfg) diff --git a/src/adaptors/api/notion/notionApiAdaptor.ts b/src/adaptors/api/notion/notionApiAdaptor.ts index 135aa39..e5b0d28 100644 --- a/src/adaptors/api/notion/notionApiAdaptor.ts +++ b/src/adaptors/api/notion/notionApiAdaptor.ts @@ -75,10 +75,18 @@ class NotionApiAdaptor extends BaseBlogApi { const notionPostidKey = this.getNotionPostidKey(postid) const notionPage = await this.getPage(notionPostidKey.pageId) this.logger.debug("notionPage=>", notionPage) + this.logger.debug("postid=>", postid) const commonPost = new Post() const titles = notionPage?.properties?.title?.title ?? [] commonPost.title = titles.map((x: any) => x.plain_text).join("") commonPost.description = "暂不支持Notion正文" + + // notion根页面 + const parentPageId = notionPage?.parent?.page_id + const catSlugs = [] + catSlugs.push(parentPageId) + commonPost.cate_slugs = catSlugs + return commonPost } diff --git a/src/adaptors/api/notion/notionConfig.ts b/src/adaptors/api/notion/notionConfig.ts index 153e1df..b02d411 100644 --- a/src/adaptors/api/notion/notionConfig.ts +++ b/src/adaptors/api/notion/notionConfig.ts @@ -38,9 +38,13 @@ class NotionConfig extends CommonBlogConfig { this.previewUrl = "/[postid]" this.pageType = PageTypeEnum.Markdown this.passwordType = PasswordType.PasswordType_Token - this.knowledgeSpaceTitle = "根页面" - this.enableKnowledgeSpace = true this.allowPreviewUrlChange = false + this.cateEnabled = false + this.knowledgeSpaceEnabled = true + this.knowledgeSpaceTitle = "根页面" + this.allowKnowledgeSpaceChange = false + this.placeholder.knowledgeSpaceReadonlyModeTip = + "由于Notion平台的限制,暂时不支持编辑所属父页面。如果您想移动文档,请先点击取消删除该文档,然后重新选择新的根页面发布" } } diff --git a/src/adaptors/api/notion/useNotionApi.ts b/src/adaptors/api/notion/useNotionApi.ts index c59174d..9d582c2 100644 --- a/src/adaptors/api/notion/useNotionApi.ts +++ b/src/adaptors/api/notion/useNotionApi.ts @@ -31,6 +31,7 @@ import { useSettingStore } from "~/src/stores/useSettingStore.ts" import { JsonUtil, ObjectUtil, StrUtil } from "zhi-common" import { getDynPostidKey } from "~/src/platforms/dynamicConfig.ts" import { NotionApiAdaptor } from "~/src/adaptors/api/notion/notionApiAdaptor.ts" +import { CategoryTypeEnum } from "zhi-blog-api" const useNotionApi = async (key: string, newCfg?: NotionConfig) => { // 创建应用日志记录器 @@ -72,6 +73,14 @@ const useNotionApi = async (key: string, newCfg?: NotionConfig) => { } } + // Notion 使用单选分类作为知识空间 + cfg.cateEnabled = false + cfg.knowledgeSpaceEnabled = true + cfg.knowledgeSpaceType = CategoryTypeEnum.CategoryType_Single + cfg.allowKnowledgeSpaceChange = false + cfg.placeholder.knowledgeSpaceReadonlyModeTip = + "由于Notion平台的限制,暂时不支持编辑所属父页面。如果您想移动文档,请先点击取消删除该文档,然后重新选择新的根页面发布" + // 创建 Notion API 适配器 const blogApi = new NotionApiAdaptor(appInstance, cfg) logger.info("Notion API created successfully.", cfg) diff --git a/src/adaptors/api/typecho/typechoConfig.ts b/src/adaptors/api/typecho/typechoConfig.ts index 669f3f5..1b2b5b1 100644 --- a/src/adaptors/api/typecho/typechoConfig.ts +++ b/src/adaptors/api/typecho/typechoConfig.ts @@ -23,7 +23,7 @@ * questions. */ -import { PageTypeEnum } from "zhi-blog-api" +import { CategoryTypeEnum, PageTypeEnum } from "zhi-blog-api" import TypechoUtils from "~/src/adaptors/api/typecho/typechoUtils.ts" import { MetaweblogConfig } from "~/src/adaptors/api/base/metaweblog/metaweblogConfig.ts" @@ -52,6 +52,10 @@ class TypechoConfig extends MetaweblogConfig { this.pageType = PageTypeEnum.Html this.showTokenTip = false this.allowPreviewUrlChange = true + this.cateEnabled = true + this.categoryType = CategoryTypeEnum.CategoryType_Multi + this.allowCateChange = true + this.knowledgeSpaceEnabled = false } } diff --git a/src/adaptors/api/typecho/useTypechoApi.ts b/src/adaptors/api/typecho/useTypechoApi.ts index 3a49b8b..08da192 100644 --- a/src/adaptors/api/typecho/useTypechoApi.ts +++ b/src/adaptors/api/typecho/useTypechoApi.ts @@ -31,6 +31,7 @@ import { TypechoConfig } from "~/src/adaptors/api/typecho/typechoConfig.ts" import { JsonUtil, ObjectUtil, StrUtil } from "zhi-common" import { getDynPostidKey } from "~/src/platforms/dynamicConfig.ts" import { TypechoApiAdaptor } from "~/src/adaptors/api/typecho/typechoApiAdaptor.ts" +import { CategoryTypeEnum } from "zhi-blog-api" /** * 使用Typecho API的自定义hook @@ -82,6 +83,12 @@ export const useTypechoApi = async (key?: string, newCfg?: TypechoConfig) => { } } + // Typecho使用多选分类 + cfg.cateEnabled = true + cfg.categoryType = CategoryTypeEnum.CategoryType_Multi + cfg.allowCateChange = true + cfg.knowledgeSpaceEnabled = false + // 创建Typecho API适配器 const blogApi = new TypechoApiAdaptor(appInstance, cfg) logger.info("Typecho API created successfully.", cfg) diff --git a/src/adaptors/api/wordpress/useWordpressApi.ts b/src/adaptors/api/wordpress/useWordpressApi.ts index 314dbbf..bc84b03 100644 --- a/src/adaptors/api/wordpress/useWordpressApi.ts +++ b/src/adaptors/api/wordpress/useWordpressApi.ts @@ -31,6 +31,7 @@ import { JsonUtil, ObjectUtil, StrUtil } from "zhi-common" import { WordpressConfig } from "~/src/adaptors/api/wordpress/wordpressConfig.ts" import { WordpressApiAdaptor } from "~/src/adaptors/api/wordpress/wordpressApiAdaptor.ts" import { getDynPostidKey } from "~/src/platforms/dynamicConfig.ts" +import { CategoryTypeEnum } from "zhi-blog-api" /** * 使用Wordpress API的自定义hook @@ -82,6 +83,12 @@ export const useWordpressApi = async (key?: string, newCfg?: WordpressConfig) => } } + // WordPress使用多选分类 + cfg.cateEnabled = true + cfg.categoryType = CategoryTypeEnum.CategoryType_Multi + cfg.allowCateChange = true + cfg.knowledgeSpaceEnabled = false + // 创建Wordpress API适配器 const blogApi = new WordpressApiAdaptor(appInstance, cfg) logger.info("Wordpress API created successfully.", cfg) diff --git a/src/adaptors/api/wordpress/wordpressConfig.ts b/src/adaptors/api/wordpress/wordpressConfig.ts index 2479de6..f947c5b 100644 --- a/src/adaptors/api/wordpress/wordpressConfig.ts +++ b/src/adaptors/api/wordpress/wordpressConfig.ts @@ -24,7 +24,7 @@ */ import { MetaweblogConfig } from "~/src/adaptors/api/base/metaweblog/metaweblogConfig.ts" -import { PageTypeEnum } from "zhi-blog-api" +import { CategoryTypeEnum, PageTypeEnum } from "zhi-blog-api" import WordpressUtils from "~/src/adaptors/api/wordpress/wordpressUtils.ts" /** @@ -53,6 +53,10 @@ class WordpressConfig extends MetaweblogConfig { this.usernameEnabled = true this.showTokenTip = false this.allowPreviewUrlChange = true + this.cateEnabled = true + this.categoryType = CategoryTypeEnum.CategoryType_Multi + this.allowCateChange = true + this.knowledgeSpaceEnabled = false } } diff --git a/src/adaptors/api/yuque/useYuqueApi.ts b/src/adaptors/api/yuque/useYuqueApi.ts index 1f5c697..df6654d 100644 --- a/src/adaptors/api/yuque/useYuqueApi.ts +++ b/src/adaptors/api/yuque/useYuqueApi.ts @@ -31,6 +31,7 @@ import { useSettingStore } from "~/src/stores/useSettingStore.ts" import { JsonUtil, ObjectUtil, StrUtil } from "zhi-common" import { getDynPostidKey } from "~/src/platforms/dynamicConfig.ts" import { YuqueApiAdaptor } from "~/src/adaptors/api/yuque/yuqueApiAdaptor.ts" +import { CategoryTypeEnum } from "zhi-blog-api" const useYuqueApi = async (key: string, newCfg?: YuqueConfig) => { // 创建应用日志记录器 @@ -73,6 +74,14 @@ const useYuqueApi = async (key: string, newCfg?: YuqueConfig) => { } } + // Yuque 使用单选分类作为知识空间 + cfg.cateEnabled = false + cfg.knowledgeSpaceEnabled = true + cfg.knowledgeSpaceType = CategoryTypeEnum.CategoryType_Single + cfg.allowKnowledgeSpaceChange = false + cfg.placeholder.knowledgeSpaceReadonlyModeTip = + "由于语雀平台的限制,暂时不支持编辑所属知识库。如果您想移动文档,请先点击取消删除该文档,然后重新选择新的知识库发布" + // 创建 Yuque API 适配器 const blogApi = new YuqueApiAdaptor(appInstance, cfg) logger.info("Yuque API created successfully.", cfg) diff --git a/src/adaptors/api/yuque/yuqueApiAdaptor.ts b/src/adaptors/api/yuque/yuqueApiAdaptor.ts index 1928188..0c8ce8d 100644 --- a/src/adaptors/api/yuque/yuqueApiAdaptor.ts +++ b/src/adaptors/api/yuque/yuqueApiAdaptor.ts @@ -87,13 +87,9 @@ class YuqueApiAdaptor extends BaseBlogApi { commonPost.title = yuqueDoc.title commonPost.description = yuqueDoc.body + // 语雀知识库 const book = yuqueDoc.book - const cats = [] const catSlugs = [] - - cats.push(book.name) - commonPost.categories = cats - catSlugs.push(book.namespace) commonPost.cate_slugs = catSlugs @@ -109,7 +105,7 @@ class YuqueApiAdaptor extends BaseBlogApi { // 只获取文档库 if (repo.type === "Book") { const cat = new CategoryInfo() - cat.categoryId = repo.slug + cat.categoryId = `${this.cfg.username}/${repo.slug}` cat.categoryName = repo.name cat.description = repo.name cat.categoryDescription = repo.name diff --git a/src/adaptors/api/yuque/yuqueConfig.ts b/src/adaptors/api/yuque/yuqueConfig.ts index 22601dd..1958600 100644 --- a/src/adaptors/api/yuque/yuqueConfig.ts +++ b/src/adaptors/api/yuque/yuqueConfig.ts @@ -39,9 +39,13 @@ class YuqueConfig extends CommonBlogConfig { this.pageType = PageTypeEnum.Markdown this.usernameEnabled = true this.passwordType = PasswordType.PasswordType_Token - this.knowledgeSpaceTitle = "知识库" - this.enableKnowledgeSpace = true this.allowPreviewUrlChange = false + this.cateEnabled = false + this.knowledgeSpaceEnabled = true + this.knowledgeSpaceTitle = "知识库" + this.allowKnowledgeSpaceChange = false + this.placeholder.knowledgeSpaceReadonlyModeTip = + "由于语雀平台的限制,暂时不支持编辑所属知识库。如果您想移动文档,请先点击取消删除该文档,然后重新选择新的知识库发布" } } diff --git a/src/adaptors/base/baseExtendApi.ts b/src/adaptors/base/baseExtendApi.ts index 5f631c8..72e85f4 100644 --- a/src/adaptors/base/baseExtendApi.ts +++ b/src/adaptors/base/baseExtendApi.ts @@ -53,6 +53,11 @@ class BaseExtendApi extends WebApi implements IBlogApi, IWebApi { private readonly isSiyuanOrSiyuanNewWin: boolean private readonly kernelApi: SiyuanKernelApi + /** + * 构造函数用于创建一个新的实例 + * + * @param api - 一个 BaseBlogApi 或 BaseWebApi 实例,用于与 API 进行通信 + */ constructor(api: BaseBlogApi | BaseWebApi) { super() this.logger = createAppLogger("base-extend-api") @@ -65,9 +70,35 @@ class BaseExtendApi extends WebApi implements IBlogApi, IWebApi { this.kernelApi = kernelApi } + /** + * 在保存前编辑文章 + * + * @param post - 要编辑的文章 + * @param id - 文章的可选 ID + * @param publishCfg - 发布配置的可选参数 + * @returns 一个 Promise,解析为编辑后的文章 + */ public async preEditPost(post: Post, id?: string, publishCfg?: any): Promise { - const cfg: BlogConfig = publishCfg.cfg - const dynCfg: DynamicConfig = publishCfg.dynCfg + // 处理图片 + post = await this.handlePictures(post, id, publishCfg) + return post + } + + // ================ + // private methods + // ================ + /** + * 处理图片 + * + * @param post - 要处理图片的 Post 对象 + * @param id - 思源笔记文档 ID + * @param publishCfg - (可选)发布配置参数 + * @returns 一个 Promise,解析为处理后的 Post 对象 + */ + private async handlePictures(post: Post, id: string, publishCfg?: any): Promise { + const cfg: BlogConfig = publishCfg?.cfg + const dynCfg: DynamicConfig = publishCfg?.dynCfg + const middlewareUrl = cfg?.middlewareUrl // 判断key包含 custom_Zhihu 或者 /custom_Zhihu-\w+/ const mustUseOwnPlatform: string[] = MUST_USE_OWN_PLATFORM @@ -76,15 +107,21 @@ class BaseExtendApi extends WebApi implements IBlogApi, IWebApi { if (!isPicgoInstalled) { this.logger.warn("未安装 PicGO 插件,将使用平台上传图片") } - // 注意如果 platformKey=custom_Zhihu 或者 custom_Zhihu-xxx custom_Notion-xxx 也算 可以参考 /custom_Zhihu-\w+/ - const mustUseOwn: boolean = mustUseOwnPlatform.some((platform) => { - const regex = new RegExp(`${platform}(-\\w+)?`) - return regex.test(dynCfg.platformKey) - }) - const mustUsePicbed: boolean = mustUsePicbedPlatform.some((platform) => { - const regex = new RegExp(`${platform}(-\\w+)?`) - return regex.test(dynCfg.platformKey) - }) + + let mustUseOwn: boolean = false + let mustUsePicbed: boolean = false + if (dynCfg?.platformKey) { + // 注意如果 platformKey=custom_Zhihu 或者 custom_Zhihu-xxx custom_Notion-xxx 也算 可以参考 /custom_Zhihu-\w+/ + mustUseOwn = mustUseOwnPlatform.some((platform) => { + const regex = new RegExp(`${platform}(-\\w+)?`) + return regex.test(dynCfg.platformKey) + }) + mustUsePicbed = mustUsePicbedPlatform.some((platform) => { + const regex = new RegExp(`${platform}(-\\w+)?`) + return regex.test(dynCfg.platformKey) + }) + } + if (mustUseOwn) { this.logger.warn("该平台不支持 Picgo 插件,将使用平台上传图片") } @@ -124,7 +161,7 @@ class BaseExtendApi extends WebApi implements IBlogApi, IWebApi { try { for (const image of images) { const imageUrl = image.url - const base64Info = await this.readFileToBase64(imageUrl, cfg) + const base64Info = await this.readFileToBase64(imageUrl, middlewareUrl) const bits = base64ToBuffer(base64Info.imageBase64) const mediaObject = new MediaObject(image.name, base64Info.mimeType, bits) this.logger.debug("before upload, mediaObject =>", mediaObject) @@ -163,25 +200,32 @@ class BaseExtendApi extends WebApi implements IBlogApi, IWebApi { return post } - // ================ - // private methods - // ================ + /** + * 检查 Picgo 是否已安装 + * + * @returns 一个 Promise,解析为布尔值,表示是否已安装 Picgo + */ private async checkPicgoInstalled() { // 检测是否安装 picgo 插件 return await isFileExists(this.kernelApi, "/data/plugins/siyuan-plugin-picgo/plugin.json", "text") } - private async readFileToBase64(url: string, cfg: BlogConfig): Promise { + /** + * 读取文件并将其转换为 Base64 编码 + * + * @param url - 要读取的文件的 URL + * @param middlewareUrl - 代理地址 + * @returns 一个 Promise,解析为文件的 Base64 编码字符串 + */ + private async readFileToBase64(url: string, middlewareUrl?: string): Promise { let base64Info: any if (this.isSiyuanOrSiyuanNewWin) { this.logger.info("Inside Siyuan notes, use the built-in request to obtain base64") base64Info = await remoteImageToBase64Info(url) } else { this.logger.info("Outside the browser, use an image proxy") - const middlewareUrl = StrUtil.isEmptyString(cfg.middlewareUrl) - ? "https://api.terwer.space/api/middleware" - : cfg.middlewareUrl - const response = await this.api.proxyFetch(`${middlewareUrl}/image`, [], { url: url }, "POST") + const proxyUrl = StrUtil.isEmptyString(middlewareUrl) ? "https://api.terwer.space/api/middleware" : middlewareUrl + const response = await this.api.proxyFetch(`${proxyUrl}/image`, [], { url: url }, "POST") this.logger.debug("readFileToBase64 proxyFetch response =>", response) const resBody = response.body const base64String = resBody.base64 diff --git a/src/adaptors/index.ts b/src/adaptors/index.ts index 75fef91..e4d060a 100644 --- a/src/adaptors/index.ts +++ b/src/adaptors/index.ts @@ -23,7 +23,7 @@ * questions. */ -import { BlogAdaptor, BlogConfig, WebAdaptor } from "zhi-blog-api" +import { BlogAdaptor, WebAdaptor, YamlConvertAdaptor } from "zhi-blog-api" import { getSubPlatformTypeByKey, SubPlatformType } from "~/src/platforms/dynamicConfig.ts" import { useCnblogsApi } from "~/src/adaptors/api/cnblogs/useCnblogsApi.ts" import { createAppLogger } from "~/src/utils/appLogger.ts" @@ -35,6 +35,7 @@ import { useSiyuanApi } from "~/src/composables/useSiyuanApi.ts" import { useMetaweblogApi } from "~/src/adaptors/api/metaweblog/useMetaweblogApi.ts" import { useNotionApi } from "~/src/adaptors/api/notion/useNotionApi.ts" import { useHexoApi } from "~/src/adaptors/api/hexo/useHexoApi.ts" +import { CommonBlogConfig } from "~/src/adaptors/api/base/commonBlogConfig.ts" /** * 适配器统一入口 @@ -49,49 +50,50 @@ class Adaptors { * 根据平台key查找配置 * * @param key + * @param newCfg */ - public static async getCfg(key: string): Promise { + public static async getCfg(key: string, newCfg?: any): Promise { let conf = null const type: SubPlatformType = getSubPlatformTypeByKey(key) switch (type) { case SubPlatformType.Common_Yuque: { - const { cfg } = await useYuqueApi(key) + const { cfg } = await useYuqueApi(key, newCfg) conf = cfg break } case SubPlatformType.Common_Notion: { - const { cfg } = await useNotionApi(key) + const { cfg } = await useNotionApi(key, newCfg) conf = cfg break } case SubPlatformType.Github_Hexo: { - const { cfg } = await useHexoApi(key) + const { cfg } = await useHexoApi(key, newCfg) conf = cfg break } case SubPlatformType.Metaweblog_Metaweblog: { - const { cfg } = await useMetaweblogApi(key) + const { cfg } = await useMetaweblogApi(key, newCfg) conf = cfg break } case SubPlatformType.Metaweblog_Cnblogs: { - const { cfg } = await useCnblogsApi(key) + const { cfg } = await useCnblogsApi(key, newCfg) conf = cfg break } case SubPlatformType.Metaweblog_Typecho: { - const { cfg } = await useTypechoApi(key) + const { cfg } = await useTypechoApi(key, newCfg) conf = cfg break } case SubPlatformType.Wordpress_Wordpress: { - const { cfg } = await useWordpressApi(key) + const { cfg } = await useWordpressApi(key, newCfg) conf = cfg break } case SubPlatformType.Custom_Zhihu: { - const { cfg } = await useZhihuWeb(key) + const { cfg } = await useZhihuWeb(key, newCfg) conf = cfg break } @@ -213,30 +215,29 @@ class Adaptors { return blogAdaptor } - // 新增 preEditPost , 此方法不再需要 - // /** - // * 根据平台key查找YAML适配器 - // * - // * @param key - // * @param newCfg - // */ - // public static async getYamlAdaptor(key: string, newCfg?: any): Promise { - // let yamlAdp = null - // const type: SubPlatformType = getSubPlatformTypeByKey(key) - // - // switch (type) { - // case SubPlatformType.Github_Hexo: { - // const { yamlAdaptor } = await useHexoApi(key, newCfg) - // yamlAdp = yamlAdaptor - // break - // } - // default: { - // break - // } - // } - // this.logger.debug(`get yamlAdaptor from key ${key}=>`, yamlAdp) - // return yamlAdp - // } + /** + * 根据平台key查找YAML适配器 + * + * @param key + * @param newCfg + */ + public static async getYamlAdaptor(key: string, newCfg?: any): Promise { + let yamlAdp = null + const type: SubPlatformType = getSubPlatformTypeByKey(key) + + switch (type) { + case SubPlatformType.Github_Hexo: { + const { yamlAdaptor } = await useHexoApi(key, newCfg) + yamlAdp = yamlAdaptor + break + } + default: { + break + } + } + this.logger.debug(`get yamlAdaptor from key ${key}=>`, yamlAdp) + return yamlAdp + } } export default Adaptors diff --git a/src/adaptors/web/zhihu/useZhihuWeb.ts b/src/adaptors/web/zhihu/useZhihuWeb.ts index 7aa62f1..1e7592b 100644 --- a/src/adaptors/web/zhihu/useZhihuWeb.ts +++ b/src/adaptors/web/zhihu/useZhihuWeb.ts @@ -31,6 +31,7 @@ import { useSettingStore } from "~/src/stores/useSettingStore.ts" import { JsonUtil, ObjectUtil, StrUtil } from "zhi-common" import { Utils } from "~/src/utils/utils.ts" import { getDynPostidKey } from "~/src/platforms/dynamicConfig.ts" +import { CategoryTypeEnum } from "zhi-blog-api" /** * 用于获取ZhihuWeb的API的自定义Hook @@ -80,6 +81,14 @@ const useZhihuWeb = async (key?: string, newCfg?: ZhihuConfig) => { } } + // 知乎使用单选分类作为专栏 + cfg.cateEnabled = false + cfg.knowledgeSpaceEnabled = true + cfg.knowledgeSpaceType = CategoryTypeEnum.CategoryType_Single + cfg.allowKnowledgeSpaceChange = false + cfg.placeholder.knowledgeSpaceReadonlyModeTip = + "由于知乎平台的限制,暂时不支持编辑所属专栏。如果您想移动文档,请先点击取消删除该文档,然后重新选择新的专栏发布" + const webApi = new ZhihuWebAdaptor(appInstance, cfg) return { cfg, diff --git a/src/adaptors/web/zhihu/zhihuConfig.ts b/src/adaptors/web/zhihu/zhihuConfig.ts index 89fdfb7..5862d8a 100644 --- a/src/adaptors/web/zhihu/zhihuConfig.ts +++ b/src/adaptors/web/zhihu/zhihuConfig.ts @@ -24,7 +24,7 @@ */ import { CommonWebConfig } from "~/src/adaptors/web/base/commonWebConfig.ts" -import { PageTypeEnum, PasswordType } from "zhi-blog-api" +import { CategoryTypeEnum, PageTypeEnum, PasswordType } from "zhi-blog-api" /** * 知乎配置 @@ -36,7 +36,12 @@ export class ZhihuConfig extends CommonWebConfig { this.pageType = PageTypeEnum.Html this.usernameEnabled = true this.passwordType = PasswordType.PasswordType_Cookie + this.cateEnabled = false + this.knowledgeSpaceEnabled = true this.knowledgeSpaceTitle = "专栏" - this.enableKnowledgeSpace = true + this.knowledgeSpaceType = CategoryTypeEnum.CategoryType_Single + this.allowKnowledgeSpaceChange = false + this.placeholder.knowledgeSpaceReadonlyModeTip = + "由于知乎平台的限制,暂时不支持编辑所属专栏。如果您想移动文档,请先点击取消删除该文档,然后重新选择新的专栏发布" } -} \ No newline at end of file +} diff --git a/src/adaptors/web/zhihu/zhihuWebAdaptor.ts b/src/adaptors/web/zhihu/zhihuWebAdaptor.ts index 3d30b86..7a100e8 100644 --- a/src/adaptors/web/zhihu/zhihuWebAdaptor.ts +++ b/src/adaptors/web/zhihu/zhihuWebAdaptor.ts @@ -24,7 +24,7 @@ */ import { BaseWebApi } from "~/src/adaptors/web/base/baseWebApi.ts" -import { Post, UserBlog } from "zhi-blog-api" +import { CategoryInfo, Post, UserBlog } from "zhi-blog-api" import * as cheerio from "cheerio" import { JsonUtil, StrUtil } from "zhi-common" import CryptoJS from "crypto-js" @@ -175,8 +175,8 @@ class ZhihuWebAdaptor extends BaseWebApi { ) // 收录文章到专栏 - const column = post.cate_slugs?.[0] ?? this.cfg.blogid - await this.addPostToColumn(column, postid) + // const column = post.cate_slugs?.[0] ?? this.cfg.blogid + // await this.addPostToColumn(column, postid) this.logger.debug("edit zhihu pubRes=>", pubRes) return true @@ -204,6 +204,32 @@ class ZhihuWebAdaptor extends BaseWebApi { return flag } + public async getCategories(): Promise { + const cats = [] as CategoryInfo[] + + const url = `https://www.zhihu.com/people/${this.cfg.username}/columns` + const res = await this.webProxyFetch(url, [], {}, "GET", "text/html") + this.logger.debug("get zhihu columns dom =>", { res }) + const $ = cheerio.load(res) + const scriptContent = $("#js-initialData").html() + const initJson = JsonUtil.safeParse(scriptContent, {}) + this.logger.debug("get column initJson=>", initJson) + const columns = initJson?.initialState?.entities?.columns ?? {} + this.logger.debug("get columns=>", columns) + + Object.keys(columns).map((key) => { + const cat = new CategoryInfo() + const item = columns[key] + cat.categoryId = item.id + cat.categoryName = item.title + cat.description = item.url + cat.categoryDescription = item.url + cats.push(cat) + }) + + return cats + } + // ================ // private methods // ================ diff --git a/src/components/publish/BatchPublishIndex.vue b/src/components/publish/BatchPublishIndex.vue index e70a8ca..464f7f8 100644 --- a/src/components/publish/BatchPublishIndex.vue +++ b/src/components/publish/BatchPublishIndex.vue @@ -27,7 +27,7 @@ import { createAppLogger } from "~/src/utils/appLogger.ts" import PublishTips from "~/src/components/publish/form/PublishTips.vue" import PublishPlatform from "~/src/components/publish/form/PublishPlatform.vue" -import { markRaw, onMounted, reactive } from "vue" +import { markRaw, onMounted, reactive, toRaw } from "vue" import { usePublish } from "~/src/composables/usePublish.ts" import { useSiyuanApi } from "~/src/composables/useSiyuanApi.ts" import { useVueI18n } from "~/src/composables/useVueI18n.ts" @@ -39,6 +39,15 @@ import { BrowserUtil } from "zhi-device" import { usePublishConfig } from "~/src/composables/usePublishConfig.ts" import { Post } from "zhi-blog-api" import { IPublishCfg } from "~/src/types/IPublishCfg.ts" +import { PageEditMode } from "~/src/models/pageEditMode.ts" +import EditModeSelect from "~/src/components/publish/form/EditModeSelect.vue" +import PublishTime from "~/src/components/publish/form/PublishTime.vue" +import AiSwitch from "~/src/components/publish/form/AiSwitch.vue" +import { isDev } from "~/src/utils/constants.ts" +import { ICategoryConfig } from "~/src/types/ICategoryConfig.ts" +import { SiyuanAttr } from "zhi-siyuan-api" +import { DistributionPattern } from "~/src/models/distributionPattern.ts" +import _ from "lodash" const logger = createAppLogger("publisher-index") @@ -52,9 +61,10 @@ const props = defineProps({ // uses const { t } = useVueI18n() -const { doSinglePublish, doSingleDelete, doForceSingleDelete } = usePublish() +const { doSinglePublish, doSingleDelete, doForceSingleDelete, initPublishMethods } = usePublish() const { blogApi } = useSiyuanApi() const { getPublishCfg } = usePublishConfig() +const { kernelApi } = useSiyuanApi() // datas const sysKeys = pre.systemCfg.map((item) => { @@ -62,9 +72,11 @@ const sysKeys = pre.systemCfg.map((item) => { }) const id = StrUtil.isEmptyString(props.id) ? process.env.VITE_DEV_PAGE_ID : props.id const formData = reactive({ + // loading isPublishLoading: false, isDeleteLoading: false, + // process showProcessResult: false, errCount: 0, successBatchResults: [], @@ -74,7 +86,25 @@ const formData = reactive({ siyuanPost: {} as Post, publishCfg: {} as IPublishCfg, + // 分类配置 + categoryConfig: {} as ICategoryConfig, + + // ========================= + // extra sync attrs start + // ========================= + // AI开关 + useAi: false, + + // 平台列表 dynList: [], + + // 页面模式 + editType: PageEditMode.EditMode_simple, + // ========================= + // sync attrs end + // ========================= + + distriPattern: DistributionPattern.Override, actionEnable: true, }) @@ -88,13 +118,34 @@ const handlePublish = async () => { formData.errCount = 0 formData.failBatchResults = [] formData.successBatchResults = [] + + // 思源笔记原始文章数据 + const siyuanPost = _.cloneDeep(formData.siyuanPost) as Post for (const key of formData.dynList) { - // 思源笔记原始文章数据 - const siyuanPost = await blogApi.getPost(id) - // 初始化属性 - const publishCfg = await getPublishCfg(key) - formData.publishCfg = publishCfg - const batchResult = await doSinglePublish(key, id, publishCfg, siyuanPost) + let batchItemPost: Post + if (sysKeys.includes(key)) { + logger.info(`开始发布 [${key}] 系统内置平台`) + batchItemPost = siyuanPost + } else { + logger.info(`开始发布 [${key}] 自定义平台`) + // 平台相关的配置,需要各自重新获取 + const publishCfg = await getPublishCfg(key) + formData.publishCfg = publishCfg + + // 平台相关的元数据初始化 + batchItemPost = await initPublishMethods.assignInitAttrs(siyuanPost, id, formData.publishCfg) + + // 合并属性 + if (formData.distriPattern === DistributionPattern.Merge) { + batchItemPost = initPublishMethods.doMergeBatchPost(siyuanPost, batchItemPost) + logger.debug("批量分发模式文章已合并", { + siyuanPost: toRaw(siyuanPost), + mergedPost: toRaw(batchItemPost), + }) + } + } + + const batchResult = await doSinglePublish(key, id, formData.publishCfg, batchItemPost) if (batchResult.status) { formData.successBatchResults.push(batchResult) } else { @@ -187,8 +238,51 @@ const handleForceDelete = async (key: string, id: string, publishCfg: IPublishCf } } +const handleSyncToSiyuan = async () => { + const newAttrs = { + [SiyuanAttr.Sys_memo]: formData.siyuanPost.shortDesc, + [SiyuanAttr.Sys_tags]: formData.siyuanPost.mt_keywords, + [SiyuanAttr.Custom_categories]: formData.siyuanPost.categories.join(","), + } + await kernelApi.setBlockAttrs(id, newAttrs) + logger.info("内置平台,保存属性", newAttrs) + ElMessage.success("属性已经成功同步到思源") +} + +const syncAiSwitch = (val: boolean) => { + formData.useAi = val + logger.debug(`syncAiSwitch in batch publish => ${formData.useAi}`) +} + +const syncEditMode = async (val: PageEditMode) => { + formData.editType = val + logger.debug("syncEditMode in batch publish") +} + const syncDynList = (selectedKeys: string[]) => { formData.dynList = selectedKeys + logger.debug("syncDynList in batch publish") +} + +const syncDesc = (val: string) => { + formData.siyuanPost.shortDesc = val + logger.debug("syncDesc in batch publish") +} + +const syncTags = (val: string[]) => { + formData.siyuanPost.mt_keywords = val.join(",") + logger.debug("syncTags in batch publish") +} + +const syncCates = (cates: string[]) => { + formData.siyuanPost.categories = cates + logger.debug("syncCates in batch publish") +} + +const syncPublishTime = (val1: Date, val2: Date) => { + formData.siyuanPost.dateCreated = val1 + formData.siyuanPost.dateUpdated = val2 + logger.debug("syncPublishTime in batch publish") } const handleRefresh = () => { @@ -196,9 +290,23 @@ const handleRefresh = () => { } onMounted(async () => { + // ================== + // 初始化开始 + // ================== + // 初始化属性 + formData.publishCfg = await getPublishCfg() // 思源笔记原始文章数据 const siyuanPost = await blogApi.getPost(id) - formData.siyuanPost = siyuanPost + // 元数据初始化 + formData.siyuanPost = await initPublishMethods.assignInitSlug(siyuanPost, id, formData.publishCfg) + logger.debug("batch inited siyuanPost =>", toRaw(formData.siyuanPost)) + // ================== + // 初始化结束 + // ================== + + // 这里可以控制一些功能开关 + formData.useAi = isDev + formData.editType = PageEditMode.EditMode_simple }) @@ -238,25 +346,84 @@ onMounted(async () => {
- -
- - - + + + + + +
+ +
+ + + +
+ + +
+ + + 覆盖 + 合并 + + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + +
- + - - - { > {{ t("main.publish.remove") }} + 同步修改到思源笔记
@@ -285,6 +453,10 @@ onMounted(async () => { diff --git a/src/components/publish/SinglePublishDoPublish.vue b/src/components/publish/SinglePublishDoPublish.vue index 098f634..18e3122 100644 --- a/src/components/publish/SinglePublishDoPublish.vue +++ b/src/components/publish/SinglePublishDoPublish.vue @@ -24,15 +24,15 @@ --> @@ -257,36 +395,90 @@ onMounted(async () => {
- +
- -
- - - - + + + + +
+ +
+ + + +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
- - - @@ -309,6 +501,7 @@ onMounted(async () => { > {{ t("main.cancel") }} + 同步修改到思源笔记 diff --git a/src/components/publish/SinglePublishSelectPlatform.vue b/src/components/publish/SinglePublishSelectPlatform.vue index cbdef7a..e67c7da 100644 --- a/src/components/publish/SinglePublishSelectPlatform.vue +++ b/src/components/publish/SinglePublishSelectPlatform.vue @@ -116,7 +116,7 @@ onMounted(async () => { - {{ HtmlUtil.parseHtml(cfg.platformName, 11) }} + {{ StrUtil.upperFirst(HtmlUtil.parseHtml(cfg.platformName, 11)) }}
diff --git a/src/components/publish/form/AiSwitch.vue b/src/components/publish/form/AiSwitch.vue new file mode 100644 index 0000000..70aa786 --- /dev/null +++ b/src/components/publish/form/AiSwitch.vue @@ -0,0 +1,91 @@ + + + + + + + diff --git a/src/components/publish/form/CommonCategories.vue b/src/components/publish/form/CommonCategories.vue new file mode 100644 index 0000000..65e28f7 --- /dev/null +++ b/src/components/publish/form/CommonCategories.vue @@ -0,0 +1,127 @@ + + + + + + + diff --git a/src/components/publish/form/EditModeSelect.vue b/src/components/publish/form/EditModeSelect.vue new file mode 100644 index 0000000..f70cdc5 --- /dev/null +++ b/src/components/publish/form/EditModeSelect.vue @@ -0,0 +1,85 @@ + + + + + + + diff --git a/src/components/publish/form/PublishCategories.vue b/src/components/publish/form/PublishCategories.vue new file mode 100644 index 0000000..db74657 --- /dev/null +++ b/src/components/publish/form/PublishCategories.vue @@ -0,0 +1,77 @@ + + + + + diff --git a/src/components/publish/form/PublishDescription.vue b/src/components/publish/form/PublishDescription.vue new file mode 100644 index 0000000..bf413ae --- /dev/null +++ b/src/components/publish/form/PublishDescription.vue @@ -0,0 +1,129 @@ + + + + + + + diff --git a/src/components/publish/form/PublishKnowledgeSpace.vue b/src/components/publish/form/PublishKnowledgeSpace.vue new file mode 100644 index 0000000..be9aa0d --- /dev/null +++ b/src/components/publish/form/PublishKnowledgeSpace.vue @@ -0,0 +1,83 @@ + + + + + diff --git a/src/components/publish/form/PublishTags.vue b/src/components/publish/form/PublishTags.vue index 9711aab..5490748 100644 --- a/src/components/publish/form/PublishTags.vue +++ b/src/components/publish/form/PublishTags.vue @@ -25,30 +25,139 @@ diff --git a/src/components/publish/form/PublishTime.vue b/src/components/publish/form/PublishTime.vue new file mode 100644 index 0000000..482ae1d --- /dev/null +++ b/src/components/publish/form/PublishTime.vue @@ -0,0 +1,80 @@ + + + + + + + diff --git a/src/components/publish/form/PublishTips.vue b/src/components/publish/form/PublishTips.vue index 77db53e..40facb7 100644 --- a/src/components/publish/form/PublishTips.vue +++ b/src/components/publish/form/PublishTips.vue @@ -23,11 +23,14 @@ - questions. --> - - diff --git a/src/components/publish/form/SourceMode.vue b/src/components/publish/form/SourceMode.vue new file mode 100644 index 0000000..41b07f1 --- /dev/null +++ b/src/components/publish/form/SourceMode.vue @@ -0,0 +1,399 @@ + + + + + + + + + diff --git a/src/components/publish/form/category/MultiCategories.vue b/src/components/publish/form/category/MultiCategories.vue new file mode 100644 index 0000000..caef112 --- /dev/null +++ b/src/components/publish/form/category/MultiCategories.vue @@ -0,0 +1,230 @@ + + + + + + + diff --git a/src/components/publish/form/kwspace/SingleKnowledgeSpace.vue b/src/components/publish/form/kwspace/SingleKnowledgeSpace.vue new file mode 100644 index 0000000..9e918fa --- /dev/null +++ b/src/components/publish/form/kwspace/SingleKnowledgeSpace.vue @@ -0,0 +1,173 @@ + + + + + + + diff --git a/src/components/publish/form/kwspace/TreeSingleKnowledgeSpace.vue b/src/components/publish/form/kwspace/TreeSingleKnowledgeSpace.vue new file mode 100644 index 0000000..cf104f3 --- /dev/null +++ b/src/components/publish/form/kwspace/TreeSingleKnowledgeSpace.vue @@ -0,0 +1,154 @@ + + + + + + + diff --git a/src/components/set/GeneralSetting.vue b/src/components/set/GeneralSetting.vue index 81ce1fd..68753da 100644 --- a/src/components/set/GeneralSetting.vue +++ b/src/components/set/GeneralSetting.vue @@ -25,17 +25,31 @@ + + diff --git a/src/components/set/SiyuanSetting.vue b/src/components/set/SiyuanSetting.vue index 47548d0..4f241c6 100644 --- a/src/components/set/SiyuanSetting.vue +++ b/src/components/set/SiyuanSetting.vue @@ -34,29 +34,22 @@ const siyuanSettingForm = getSiyuanSetting() - - diff --git a/src/components/set/preference/PreferenceSetting.vue b/src/components/set/preference/PreferenceSetting.vue new file mode 100644 index 0000000..cb0c345 --- /dev/null +++ b/src/components/set/preference/PreferenceSetting.vue @@ -0,0 +1,70 @@ + + + + + diff --git a/src/components/set/publish/singleplatform/base/impl/CommonGithubSetting.vue b/src/components/set/publish/singleplatform/base/impl/CommonGithubSetting.vue index 74a49db..ef0aaff 100644 --- a/src/components/set/publish/singleplatform/base/impl/CommonGithubSetting.vue +++ b/src/components/set/publish/singleplatform/base/impl/CommonGithubSetting.vue @@ -26,7 +26,7 @@ + + + + diff --git a/src/components/test/CnblogsTest.vue b/src/components/test/CnblogsTest.vue index 9fb1929..913e1a9 100644 --- a/src/components/test/CnblogsTest.vue +++ b/src/components/test/CnblogsTest.vue @@ -405,26 +405,28 @@ const cnblogsHandleApi = async () => { diff --git a/src/pages/PicgoTest.vue b/src/components/test/PicgoTest.vue similarity index 74% rename from src/pages/PicgoTest.vue rename to src/components/test/PicgoTest.vue index 594dd9c..a08aaf8 100644 --- a/src/pages/PicgoTest.vue +++ b/src/components/test/PicgoTest.vue @@ -24,27 +24,41 @@ --> + + diff --git a/src/components/test/SiyuanTest.vue b/src/components/test/SiyuanTest.vue index 3a850df..bdd2261 100644 --- a/src/components/test/SiyuanTest.vue +++ b/src/components/test/SiyuanTest.vue @@ -194,8 +194,6 @@ const siyuanHandleApi = async () => { switch (methodOption.value) { case METHOD_GET_USERS_BLOGS: { const siyuanCfg = new SiyuanConfig("http://127.0.0.1:6806", "") - // 显示指定修复标题 - siyuanCfg.fixTitle = true const siyuanApiAdaptor = new SiYuanApiAdaptor(siyuanCfg) const siyuanApi = Utils.blogApi(appInstance, siyuanApiAdaptor) const siyuanUsersBlogs = await siyuanApi.getUsersBlogs() @@ -214,8 +212,6 @@ const siyuanHandleApi = async () => { } case METHOD_GET_RECENT_POSTS: { const siyuanCfg = new SiyuanConfig("http://127.0.0.1:6806", "") - // 显示指定修复标题 - siyuanCfg.fixTitle = true const siyuanApiAdaptor = new SiYuanApiAdaptor(siyuanCfg) const siyuanApi = Utils.blogApi(appInstance, siyuanApiAdaptor) const paramsValue = JSON.parse(params.value) @@ -335,26 +331,28 @@ const siyuanHandleApi = async () => { diff --git a/src/pages/ApiTest.vue b/src/pages/ApiTest.vue deleted file mode 100644 index b5d0fd3..0000000 --- a/src/pages/ApiTest.vue +++ /dev/null @@ -1,111 +0,0 @@ - - - - - - - diff --git a/src/pages/Test.vue b/src/pages/Test.vue new file mode 100644 index 0000000..ddda9db --- /dev/null +++ b/src/pages/Test.vue @@ -0,0 +1,91 @@ + + + + + + + diff --git a/src/platforms/dynamicConfig.ts b/src/platforms/dynamicConfig.ts index 4e576b2..d74a25c 100644 --- a/src/platforms/dynamicConfig.ts +++ b/src/platforms/dynamicConfig.ts @@ -23,7 +23,6 @@ * questions. */ -import { YamlConvertAdaptor } from "~/src/platforms/yamlConvertAdaptor.ts" import idUtil from "~/src/utils/idUtil.ts" import { StrUtil } from "zhi-common" @@ -87,18 +86,12 @@ export class DynamicConfig { */ isSys: boolean - /** - * YAML转换器 - */ - yamlConverter?: YamlConvertAdaptor - constructor( platformType: PlatformType, platformKey: string, platformName: string, subPlatformType?: SubPlatformType, - platformIcon?: string, - yamlConverter?: YamlConvertAdaptor + platformIcon?: string ) { this.platformType = platformType this.platformKey = platformKey @@ -110,7 +103,6 @@ export class DynamicConfig { this.subPlatformType = subPlatformType this.platformIcon = platformIcon - this.yamlConverter = yamlConverter } } @@ -414,48 +406,20 @@ export function deletePlatformByKey(dynamicConfigArray: any[], key: string): any return dynamicConfigArray.filter((item) => item.platformKey !== key) } -// ===================== -// 动态平台文章ID规则 -// ===================== /** * 获取动态文章ID的key + * * @param platformKey */ export function getDynPostidKey(platformKey: string): string { return "custom-" + platformKey + "-post-id" } -// ====================== -// 动态平台Object对象初始化 -// ====================== /** - * 根据平台key获取YAML转换器 + * 获取动态YAML的key + * * @param platformKey */ -export const getDynYamlConverterAdaptor = (platformKey: string): YamlConvertAdaptor => { - const yamlConverter = new YamlConvertAdaptor() - if (platformKey.includes("-")) { - const typeArr = platformKey.split("-") - if (typeArr.length > 0) { - const ptype = typeArr[0].toLowerCase() - - // if (ptype.includes(SubPlatformType.Github_Vuepress.toLowerCase())) { - // yamlConverter = new VuepressYamlConvertAdaptor() - // } else if (ptype.includes(SubPlatformType.Github_Hugo.toLowerCase())) { - // yamlConverter = new HugoYamlConverterAdaptor() - // } else if (ptype.includes(SubPlatformType.Github_Hexo.toLowerCase())) { - // yamlConverter = new HexoYamlConverterAdaptor() - // } else if (ptype.includes(SubPlatformType.Github_Jekyll.toLowerCase())) { - // yamlConverter = new JekyllYamlConverterAdaptor() - // } else if (ptype.includes(SubPlatformType.Github_Vitepress.toLowerCase())) { - // yamlConverter = new VitepressYamlConverterAdaptor() - // } else if (ptype.includes(SubPlatformType.Github_Nuxt.toLowerCase())) { - // yamlConverter = new NuxtYamlConverterAdaptor() - // } else if (ptype.includes(SubPlatformType.Github_Next.toLowerCase())) { - // yamlConverter = new NextYamlConvertAdaptor() - // } - } - } - - return yamlConverter +export function getDynYamlKey(platformKey: string): string { + return "custom-" + platformKey.replace(/_/g, "-") + "-yaml" } diff --git a/src/stores/usePublishPreferenceSetting.ts b/src/stores/usePublishPreferenceSetting.ts new file mode 100644 index 0000000..32416c1 --- /dev/null +++ b/src/stores/usePublishPreferenceSetting.ts @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2023, Terwer . All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Terwer designates this + * particular file as subject to the "Classpath" exception as provided + * by Terwer in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Terwer, Shenzhen, Guangdong, China, youweics@163.com + * or visit www.terwer.space if you need additional information or have any + * questions. + */ + +import { RemovableRef, StorageSerializers, useLocalStorage } from "@vueuse/core" +import { PublishPreferenceCfg } from "~/src/models/publishPreferenceCfg.ts" +import { readonly } from "vue" + +/** + * 使用发布偏好设置的自定义钩子 + */ +const usePublishPreferenceSetting = () => { + // 存储键 + const storageKey = "publish-preference-cfg" + + /** + * 获取思源笔记配置 + * + * @returns {RemovableRef} 可移除引用的发布偏好设置 + * @author terwer + * @since 0.6.0 + */ + const getPublishPreferenceSetting = (): RemovableRef => { + const initialValue = new PublishPreferenceCfg() + const siyuanConfig = useLocalStorage(storageKey, initialValue, { + serializer: StorageSerializers.object, + }) + return siyuanConfig + } + + /** + * 获取只读版本的思源笔记配置 + * 调用现有的 getPublishPreferenceSetting 并将其转化为只读引用 + * + * @returns 只读引用的发布偏好设置 + * @author + * @since 0.6.0 + */ + const getReadOnlyPublishPreferenceSetting = () => { + const siyuanConfigRef = getPublishPreferenceSetting() + const readOnlySiyuanConfigRef = readonly(siyuanConfigRef) + return readOnlySiyuanConfigRef + } + + return { + getPublishPreferenceSetting, + getReadOnlyPublishPreferenceSetting, + } +} + +export { usePublishPreferenceSetting } diff --git a/src/stores/useSiyuanSetting.ts b/src/stores/useSiyuanSetting.ts index 8643d28..a26b12d 100644 --- a/src/stores/useSiyuanSetting.ts +++ b/src/stores/useSiyuanSetting.ts @@ -25,7 +25,15 @@ import { SiyuanConfig } from "zhi-siyuan-api" import { RemovableRef, StorageSerializers, useLocalStorage } from "@vueuse/core" +import { readonly } from "vue" +/** + * 思源笔记设置 + * + * @author terwer + * @version 1.8.0 + * @since 1.8.0 + */ const useSiyuanSetting = () => { const storageKey = "siyuan-cfg" @@ -47,7 +55,20 @@ const useSiyuanSetting = () => { return siyuanConfig } - return { getSiyuanSetting } + /** + * 获取只读版本的思源笔记配置 + * 调用现有的 getSiyuanSetting 并转化为只读 + * + * @author terwer + * @since 0.6.0 + */ + const getReadOnlySiyuanSetting = () => { + const siyuanConfigRef = getSiyuanSetting() + const readOnlySiyuanConfigRef = readonly(siyuanConfigRef) + return readOnlySiyuanConfigRef + } + + return { getSiyuanSetting, getReadOnlySiyuanSetting } } export { useSiyuanSetting } diff --git a/src/types/ICategoryConfig.ts b/src/types/ICategoryConfig.ts new file mode 100644 index 0000000..95f0150 --- /dev/null +++ b/src/types/ICategoryConfig.ts @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2023, Terwer . All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Terwer designates this + * particular file as subject to the "Classpath" exception as provided + * by Terwer in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Terwer, Shenzhen, Guangdong, China, youweics@163.com + * or visit www.terwer.space if you need additional information or have any + * questions. + */ + +import { BlogConfig } from "zhi-blog-api" + +/** + * 类别接口配置 + * + * @author terwer + * @since 1.9.0 + */ +interface ICategoryConfig { + /** + * 是否启用类别 + */ + cateEnabled: boolean + + /** + * 是否只读模式 + */ + readonlyMode: boolean + + /** + * 只读模式提示 + */ + readonlyModeTip?: string + + /** + * 思源笔记的文档ID + */ + pageId?: string + + /** + * API类型 + */ + apiType?: string + + /** + * 平台配置 + */ + cfg?: BlogConfig +} + +/** + * 类别配置接口 + * + * @author terwer + * @since 1.9.0 + */ +interface ISingleCategoryConfig extends ICategoryConfig {} + +/** + * 多个类别的配置 + * @author terwer + * @since 1.9.0 + */ +interface IMultiCategoriesConfig extends ICategoryConfig {} + +/** + * 树状结构中单个类别的配置 + * + * @author terwer + * @since 1.9.0 + */ +interface ITreeSingleCategoryConfig extends ICategoryConfig {} + +/** + * 树状结构中多个类别的配置 + * + * @author terwer + * @since 1.9.0 + */ +interface ITreeMultiCategoriesConfig extends ICategoryConfig {} + +export { + type ICategoryConfig, + type ISingleCategoryConfig, + type IMultiCategoriesConfig, + type ITreeSingleCategoryConfig, + type ITreeMultiCategoriesConfig, +} diff --git a/src/utils/constants.ts b/src/utils/constants.ts index d378ca5..5767f3a 100644 --- a/src/utils/constants.ts +++ b/src/utils/constants.ts @@ -24,6 +24,7 @@ */ export const isDev = process.env.DEV_MODE === "true" +// export const isDev = false export const isDebugMode = process.env.DEBUG_MODE === "true" /** diff --git a/src/utils/vueUtils.ts b/src/utils/vueUtils.ts index 65f649d..3379802 100644 --- a/src/utils/vueUtils.ts +++ b/src/utils/vueUtils.ts @@ -23,12 +23,12 @@ * questions. */ -import {createApp} from "vue" +import { createApp } from "vue" import App from "~/src/App.vue" -import {createAppLogger} from "~/src/utils/appLogger.ts" -import {useVueRouter} from "~/src/composables/useVueRouter.ts" +import { createAppLogger } from "~/src/utils/appLogger.ts" +import { useVueRouter } from "~/src/composables/useVueRouter.ts" import i18n from "~/src/locales" -import {createPinia} from "pinia" +import { createPinia } from "pinia" /** * Vue 入口 diff --git a/src/workers/QuickPublish.vue b/src/workers/QuickPublish.vue index 06d1cea..4a33fee 100644 --- a/src/workers/QuickPublish.vue +++ b/src/workers/QuickPublish.vue @@ -24,23 +24,27 @@ -->