diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 11a7979..c065732 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,11 +12,11 @@ jobs: uses: actions/checkout@v3 - name: Install Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: 18 - - uses: pnpm/action-setup@v2 + - uses: pnpm/action-setup@v3 name: Install pnpm id: pnpm-install with: @@ -29,7 +29,7 @@ jobs: run: | echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT - - uses: actions/cache@v3 + - uses: actions/cache@v4 name: Setup pnpm cache with: path: ${{ steps.pnpm-cache.outputs.STORE_PATH }} diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml index 4ed92b0..b7661ac 100644 --- a/.github/workflows/release-please.yml +++ b/.github/workflows/release-please.yml @@ -10,88 +10,82 @@ jobs: steps: # Create release - name: Create release - uses: google-github-actions/release-please-action@v3 + uses: google-github-actions/release-please-action@v4 id: release with: - release-type: node - package-name: release-please-action - ## branch to open pull release PR against (detected by default) - default-branch: main - ## Should breaking changes before 1.0.0 produce minor bumps? Default false - # bump-minor-pre-major: true - ## Should feat changes before 1.0.0 produce patch bumps instead of minor bumps? Default false - # bump-patch-for-minor-pre-major: true - ## If set, create releases that are pre-major or pre-release version marked as pre-release on GitHub. Defaults false - prerelease: false - ## header used within the release PR body, defaults to using :robot: I have created a release *beep* *boop* - pull-request-header: ':robot: A new release will be created' - ## A JSON formatted String containing to override the outputted changelog sections - changelog-types: '[{"type":"feat","section":"Features","hidden":false},{"type":"fix","section":"Bug Fixes","hidden":false},{"type":"refactor","section":"Code Refactoring","hidden":false},{"type":"chore","section":"Miscellaneous","hidden":false},{"type":"perf","section":"Performance Improvements","hidden":false}]' + # this assumes that you have created a personal access token + # (PAT) and configured it as a GitHub action secret named + # `GH_TOKEN` (this secret name is not important). + token: ${{ secrets.GH_TOKEN }} + # optional. customize path to release-please-config.json + config-file: release-please-config.json + # optional. customize path to .release-please-manifest.json + manifest-file: .release-please-manifest.json # Checkout - name: Checkout - if: ${{ steps.release.outputs.release_created }} uses: actions/checkout@v3 + if: ${{ steps.release.outputs.release_created }} # Install Node.js - name: Install Node.js - if: ${{ steps.release.outputs.release_created }} - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: 18 registry-url: 'https://registry.npmjs.org' + if: ${{ steps.release.outputs.release_created }} # Install pnpm - name: Install pnpm - if: ${{ steps.release.outputs.release_created }} - uses: pnpm/action-setup@v2 + uses: pnpm/action-setup@v3 id: pnpm-install with: version: 8 run_install: false + if: ${{ steps.release.outputs.release_created }} # Get pnpm store directory - name: Get pnpm store directory - if: ${{ steps.release.outputs.release_created }} id: pnpm-cache shell: bash run: | echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT + if: ${{ steps.release.outputs.release_created }} # Setup pnpm cache - name: Setup pnpm cache - if: ${{ steps.release.outputs.release_created }} - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ${{ steps.pnpm-cache.outputs.STORE_PATH }} key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} restore-keys: | ${{ runner.os }}-pnpm-store- + if: ${{ steps.release.outputs.release_created }} # Install dependencies - name: Install dependencies - if: ${{ steps.release.outputs.release_created }} run: pnpm install + if: ${{ steps.release.outputs.release_created }} # Prepare new version # https://github.com/google-github-actions/release-please-action#outputs - name: Prepare new version - if: ${{ steps.release.outputs.release_created }} run: | pnpm prepareRelease + if: ${{ steps.release.outputs.release_created }} # Build for production and Archive package - name: Build for production - if: ${{ steps.release.outputs.release_created }} run: pnpm package + if: ${{ steps.release.outputs.release_created }} # Upload package to release # https://github.com/philips-labs/terraform-aws-github-runner/blob/main/.github/workflows/release.yml#L46 - name: Upload package.zip to the release - if: ${{ steps.release.outputs.releases_created }} env: GITHUB_TOKEN: ${{ secrets.GH_TOKEN }} run: | for f in $(find ./build -name '*.zip'); do gh release upload ${{ steps.release.outputs.tag_name }} $f - done \ No newline at end of file + done + if: ${{ steps.release.outputs.releases_created }} \ No newline at end of file diff --git a/.gitignore b/.gitignore index 1aea3a1..6d5f6aa 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,7 @@ venv __pycache__ cookie.txt token.txt +pageId.txt # ext extension @@ -32,6 +33,10 @@ build widget archive.zip components.d.ts +auto-imports.d.ts + +# ginx +nginx # test coverage diff --git a/.release-please-manifest.json b/.release-please-manifest.json new file mode 100644 index 0000000..69eb19a --- /dev/null +++ b/.release-please-manifest.json @@ -0,0 +1,3 @@ +{ + ".": "1.20.0" +} \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 4fe6b6c..db079ab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,103 +1,64 @@ # Changelog -## [0.11.0](https://github.com/terwer/sy-post-publisher/compare/v0.10.7...v0.11.0) (2023-09-18) +## [1.20.0](https://github.com/terwer/siyuan-plugin-publisher/compare/siyuan-plugin-publisher-v1.19.1...siyuan-plugin-publisher-v1.20.0) (2024-03-11) ### Features -* 兼容 siyuanhook ([a0017c3](https://github.com/terwer/siyuan-plugin-publisher/commit/a0017c39cf50e9960b4d459b5d66e622104dc0c4)) -* 插件挂件源码合并 https://github.com/terwer/sy-post-publisher/issues/89 https://github.com/terwer/siyuan-plugin-publisher/issues/522 ([c18023f](https://github.com/terwer/siyuan-plugin-publisher/commit/c18023f3c9c9a649e1d08a84d89673d29b2a29db)) -* 新版挂件-优化发布交互 ([323496d](https://github.com/terwer/sy-post-publisher/commit/323496de9805865fdf56ccd0fe7973688d14087a)) -* 新版挂件-优化发布配置 ([b93112b](https://github.com/terwer/sy-post-publisher/commit/b93112bc945fa03d5896398537042613f98f1960)) -* 新版挂件-优化发布配置-列表页面 ([c52c287](https://github.com/terwer/sy-post-publisher/commit/c52c287348fbabadd7f3239cfd09e09829327121)) -* 新版挂件-优化平台分类 ([9dea195](https://github.com/terwer/sy-post-publisher/commit/9dea1951fb93757efe059bc139c125f18addbf98)) -* 新版挂件-优化平台适配器 ([e4a9f1d](https://github.com/terwer/sy-post-publisher/commit/e4a9f1d504478e4d2798a6c5f5f0d3aef5955c13)) -* 新版挂件-修复electron校验执行顺序问题 ([a063926](https://github.com/terwer/sy-post-publisher/commit/a063926f7ef17440097c09cfc7d4458bb1709f78)) -* 新版挂件-兼容windows构建 ([b485845](https://github.com/terwer/sy-post-publisher/commit/b485845c917dd8c9eac1d0ad4f638d58cbfc2b89)) -* 新版挂件-兼容windows构建,修复博客园api报错问题 ([d1ba9e7](https://github.com/terwer/sy-post-publisher/commit/d1ba9e7db532b7917b1a5d7d97521c13318fd5ce)) -* 新版挂件-动态平台管理 ([de09930](https://github.com/terwer/sy-post-publisher/commit/de09930ace424512095308cc463463944d187d98)) -* 新版挂件-动态读取配置 ([5234e76](https://github.com/terwer/sy-post-publisher/commit/5234e76716d74223b4e0c234b6ec7a57f3e8ed85)) -* 新版挂件-发布0.9.0内测版 ([2807680](https://github.com/terwer/sy-post-publisher/commit/28076800fea932e8bfaf914069188b37c99f3298)) -* 新版挂件-插件版极速发布菜单联动 ([833af19](https://github.com/terwer/sy-post-publisher/commit/833af19fbfdb69181c05ea265a19ebab1db93063)) -* 新版挂件-支持api携带token和cookie ([24bd457](https://github.com/terwer/sy-post-publisher/commit/24bd4577646815c54481fbd0c9c36fc69956b2c5)) -* 新版挂件-支持博客园快速发布 ([58adf94](https://github.com/terwer/sy-post-publisher/commit/58adf94a92cb1d5b784b0b1dca799a9c1ce8d1de)) -* 新版挂件-支持知乎网页授权 ([044091e](https://github.com/terwer/sy-post-publisher/commit/044091e8a99144fc01471b1dc54b9e7f36c64610)) -* 新版挂件-新增csdn适配器 ([4bbc435](https://github.com/terwer/sy-post-publisher/commit/4bbc4351cdcdce960a328af3e40861fedc55ce73)) -* 新版挂件-新增微信公众号适配器 ([ce4a51b](https://github.com/terwer/sy-post-publisher/commit/ce4a51b431edcb74dcd6ebfc4288ee505acb0e2e)) -* 新版挂件-新增掘金适配器 ([53ba03e](https://github.com/terwer/sy-post-publisher/commit/53ba03e68ebceaf179cf21bc88d18e589e0301ce)) -* 新版挂件-新增知乎网页授权 ([0ff11a4](https://github.com/terwer/sy-post-publisher/commit/0ff11a44f7fcbf7e2bc60dbded5bb58273220b28)) -* 新版挂件-新增简书适配器 ([b596687](https://github.com/terwer/sy-post-publisher/commit/b5966879c77417abcfba93621108445ad7ae9c9b)) -* 新版挂件-新的发布配置ui ([fe2667d](https://github.com/terwer/sy-post-publisher/commit/fe2667db8b23e4433d2a8d6b54b5db3c49435ba4)) -* 新版挂件-知乎网页授权同时兼容electron、chrome浏览器插件、chrome浏览器 ([3591d1c](https://github.com/terwer/sy-post-publisher/commit/3591d1c0c2d00060e05ab6e3e08c9efc88c00114)) -* 新版挂件-网页授权交互 ([98949eb](https://github.com/terwer/sy-post-publisher/commit/98949ebc0ad36301e1dea6b15b5a6719d8fe02ae)) -* 新版挂件-网页授权支持客户端自动读取cookie ([b2501b3](https://github.com/terwer/sy-post-publisher/commit/b2501b3eede424da2e2ccf6416c6e2024dccb8c6)) -* 新版挂件-适配typecho配置 ([f41d464](https://github.com/terwer/sy-post-publisher/commit/f41d46438fb924f6d4b0a0fb284af1cef703cd6b)) -* 新版挂件-适配wordpress配置 ([a780b81](https://github.com/terwer/sy-post-publisher/commit/a780b81a6bf308de18ece1b498e2556414d3811f)) -* 新版挂件-适配yuque配置 ([e348d89](https://github.com/terwer/sy-post-publisher/commit/e348d89caa8dfcb4b360ea544ba214bcedf68fc5)) -* 新版挂件-适配博客园配置 ([3aab48e](https://github.com/terwer/sy-post-publisher/commit/3aab48e91fc3773fecdf73f9cbdbd01853768c60)) -* 新版挂件-通用平台定义 ([c380c1a](https://github.com/terwer/sy-post-publisher/commit/c380c1a7a86e2d802d588fe28f352facb232f9ca)) -* 新版挂件-通用平台管理 ([277afc8](https://github.com/terwer/sy-post-publisher/commit/277afc84edd3ade52b41fb243be5ab22f3224c8c)) -* 新版挂件-重构发布配置 ([7729d99](https://github.com/terwer/sy-post-publisher/commit/7729d99444317b6abe63b1f30cc175bfde617328)) -* 新版挂件-重构平台管理 ([003b6c2](https://github.com/terwer/sy-post-publisher/commit/003b6c2c9ce8ef4022a8d1a61c0b6ee642446016)) -* 新版挂件-重构设置页面 ([72d4f0b](https://github.com/terwer/sy-post-publisher/commit/72d4f0b9542779153f2b9cc0b0cd1eceec4e9461)) -* 新版挂件-集成 api 测试 ([cac089e](https://github.com/terwer/sy-post-publisher/commit/cac089ec80da2fafe08c517e679dfbcfa6b2722a)) +* [#058](https://github.com/terwer/siyuan-plugin-publisher/issues/058) [#1009](https://github.com/terwer/siyuan-plugin-publisher/issues/1009) 全面适配 docker(实验性) ([901e24f](https://github.com/terwer/siyuan-plugin-publisher/commit/901e24f64abe118a9df2dde15501a088257525e0)) +* [#1009](https://github.com/terwer/siyuan-plugin-publisher/issues/1009) resolve compatibility issues with Docker ([cbef25e](https://github.com/terwer/siyuan-plugin-publisher/commit/cbef25ef042f58104592806e4b126c5266b16c16)) +* [#1053](https://github.com/terwer/siyuan-plugin-publisher/issues/1053) 新增发布平台 telegra.ph - cookie 验证 ([da6e5c7](https://github.com/terwer/siyuan-plugin-publisher/commit/da6e5c75cec3c2e896eaa3193fce069f6156b279)) +* [#1054](https://github.com/terwer/siyuan-plugin-publisher/issues/1054) 新增文章管理功能 - 页面样式优化 ([07ac460](https://github.com/terwer/siyuan-plugin-publisher/commit/07ac46095413ea3af3f1e71677de0d994fe142e2)) +* [#1076](https://github.com/terwer/siyuan-plugin-publisher/issues/1076) [#1077](https://github.com/terwer/siyuan-plugin-publisher/issues/1077) 优化发布配置、平台导入、插件商店使用体验 - 支持自定义导入 ([9161790](https://github.com/terwer/siyuan-plugin-publisher/commit/916179083bc7a279c59a24c9ee817bd84aa2a1d4)) +* [#1077](https://github.com/terwer/siyuan-plugin-publisher/issues/1077) 优化导入体验 ([b61d420](https://github.com/terwer/siyuan-plugin-publisher/commit/b61d4201281144976bcd2c4c04038ae9e5c3ed42)) +* [#11076](https://github.com/terwer/siyuan-plugin-publisher/issues/11076) [#1077](https://github.com/terwer/siyuan-plugin-publisher/issues/1077) 优化发布配置、平台导入、插件商店使用体验 ([98cc1d3](https://github.com/terwer/siyuan-plugin-publisher/commit/98cc1d3d47e22bb1e10600372d63972349431edc)) +* [#958](https://github.com/terwer/siyuan-plugin-publisher/issues/958) [#1009](https://github.com/terwer/siyuan-plugin-publisher/issues/1009) 全面适配 docker(实验性)- 兼容 telegra.ph ([01e41ac](https://github.com/terwer/siyuan-plugin-publisher/commit/01e41acee8c879173cdabb52c54af3907a2bcf1f)) +* default to use proxy preview at telegra.ph ([7ed8222](https://github.com/terwer/siyuan-plugin-publisher/commit/7ed822200c5e15bbe30377c15d0b34baea1974ea)) +* 深度优化挂件版本 ([128a07b](https://github.com/terwer/siyuan-plugin-publisher/commit/128a07b46b87e617409c8150e4fa8eb716f359ab)) ### Bug Fixes -* [#83](https://github.com/terwer/siyuan-plugin-publisher/issues/83) 多平台分发需要考虑同步更新思源笔记 ([103203d](https://github.com/terwer/siyuan-plugin-publisher/commit/103203d3ad867991f0d86909fcb82bcc2f0cd7ad)) -* 修复 commonjs 构建错误,取消 type=module 默认 ([aa41b10](https://github.com/terwer/sy-post-publisher/commit/aa41b105c7c69fa905922053ea9112aefd65212c)) -* 修复发布更新状态判断错误的问题 ([cbc271e](https://github.com/terwer/sy-post-publisher/commit/cbc271ee793bb2bfd052ec6971b07b71abd9876f)) -* 修改构建错误 ([0681ebd](https://github.com/terwer/siyuan-plugin-publisher/commit/0681ebd97572f2b6651a37c60e67669b8f9c563b)) -### Code Refactoring -* [#8](https://github.com/terwer/sy-post-publisher/issues/8) 迁移到新的打包方式 ([58327a3](https://github.com/terwer/sy-post-publisher/commit/58327a3654c5a4a33140b86d899aa60f710a8544)) -* 上传文件接口调通 ([8c174ae](https://github.com/terwer/sy-post-publisher/commit/8c174aef8c6855b46ef2572c83a901731b54bdb8)) -* 使用 eruda 进行日志监控 ([01449b1](https://github.com/terwer/sy-post-publisher/commit/01449b17bfdc9dcf2c00b6c7279788a3e5401dee)) -* 使用 eruda 进行日志监控 - 生产阶段去掉调试 ([bede15b](https://github.com/terwer/sy-post-publisher/commit/bede15bb9fc0c03009b4e19e1321aff8d617ff9a)) -* 兼容 vercel ([9feda3c](https://github.com/terwer/sy-post-publisher/commit/9feda3c1ce9efc217a61cd8838e38d707c491933)) -* 国际化 ([eb1c051](https://github.com/terwer/sy-post-publisher/commit/eb1c051926565ccd41cd40c98a3889fc9f7db2f7)) -* 基本布局、国际化、ui组件 ([f442962](https://github.com/terwer/sy-post-publisher/commit/f442962d6349af2036d5196cc98793c3ccfe9469)) -* 多语言切换 ([09c7a2d](https://github.com/terwer/sy-post-publisher/commit/09c7a2d74872703404dbadfc599b4929cb310be5)) -* 完善 api ([3dbd7d4](https://github.com/terwer/sy-post-publisher/commit/3dbd7d4dfe1377ce761e521e3c75abe02dc910c4)) -* 尝试上传文件 ([749852b](https://github.com/terwer/sy-post-publisher/commit/749852b0b86545ef0a3d4c52dcd3af3beaca81e2)) -* 打包脚本 ([ea86872](https://github.com/terwer/sy-post-publisher/commit/ea86872de2dbe8bd228117ea8b46205d6229ec60)) -* 按需导入 ([7631c3b](https://github.com/terwer/sy-post-publisher/commit/7631c3b574e82f7208bad08a8678d522baa6d43d)) -* 新增 api 适配器 ([43da3de](https://github.com/terwer/sy-post-publisher/commit/43da3dea4e66aa90fa2fba127b757769e0ef6b08)) -* 新增 apitest 页面 ([a4408ff](https://github.com/terwer/sy-post-publisher/commit/a4408ff764d2b58e48efb602b64f7b0b2e9a2e48)) -* 新增博客api、思源api ([d02c122](https://github.com/terwer/sy-post-publisher/commit/d02c122d277b0126f8b3f9506c93db408ad9248b)) -* 新增页面路由 ([a8cd654](https://github.com/terwer/siyuan-plugin-publisher/commit/a8cd6543413e8cd8d88bb443e9b915c509b2a470)) -* 更新 xmlrpc 类库 ([a4308cd](https://github.com/terwer/sy-post-publisher/commit/a4308cd076d829799630f67654b047dd27295c8c)) -* 调整 logger ([4175c4c](https://github.com/terwer/sy-post-publisher/commit/4175c4c979259e09d9073e74b7d178c5e33bc1f8)) -* 迁移源码到挂件仓库 https://github.com/siyuan-note/bazaar/issues/1095 ([56fd048](https://github.com/terwer/sy-post-publisher/commit/56fd048420c2314149f865b791ec5cf2a56c2ee9)) -* 配置适配器 ([f8730db](https://github.com/terwer/sy-post-publisher/commit/f8730db433df87e7a71975de892d552c0b36b117)) -* 重构项目结构,兼容 webview 和 iframe ([9718949](https://github.com/terwer/sy-post-publisher/commit/9718949bd7b4cc32603c5eecc2fe919c3e6666ba)) -* 集成 api 测试 ([647154c](https://github.com/terwer/sy-post-publisher/commit/647154c9a8835037c36debc3f9cab60f885c6918)) +* [#1035](https://github.com/terwer/siyuan-plugin-publisher/issues/1035) 代码块里面的文本不应该被错误转义 ([8fc148f](https://github.com/terwer/siyuan-plugin-publisher/commit/8fc148f308c593af0888861f453c1f8c964bf55e)) +* **deps:** bump @iconify/json from 2.2.190 to 2.2.191 ([e8d2499](https://github.com/terwer/siyuan-plugin-publisher/commit/e8d24993dce88ad92df4482f1f1716d3c3f94eff)) +* **deps:** bump @vueuse/core from 10.7.2 to 10.8.0 ([2c14767](https://github.com/terwer/siyuan-plugin-publisher/commit/2c1476720c12845370dede552b8f14ad8e583648)) +* **deps:** bump element-plus from 2.5.5 to 2.5.6 ([4ed2d38](https://github.com/terwer/siyuan-plugin-publisher/commit/4ed2d380c1b77778785573f9cc31128cd5b76131)) +* **deps:** bump js-base64 from 3.7.6 to 3.7.7 ([384a9df](https://github.com/terwer/siyuan-plugin-publisher/commit/384a9df6c18fd3b5dfd9389473272ea1a8b48f6e)) +* **deps:** bump siyuan from 0.9.3 to 0.9.4 ([4bc38e3](https://github.com/terwer/siyuan-plugin-publisher/commit/4bc38e3fb033e4dc30f016a7c1d0c9fb6e4e6660)) +* **deps:** bump vue from 3.4.19 to 3.4.20 ([87ac61d](https://github.com/terwer/siyuan-plugin-publisher/commit/87ac61d67241824a21e40aeea99dc261fab5c602)) +* **deps:** bump vue-router from 4.2.5 to 4.3.0 ([7bb87e4](https://github.com/terwer/siyuan-plugin-publisher/commit/7bb87e4e14e7a50f62622540263992bf7aaa4b9b)) +* 修复 setup 警告 ([ee3f1b7](https://github.com/terwer/siyuan-plugin-publisher/commit/ee3f1b77992213d5c5f1b1747f38526a5b25b344)) +* 修复升级 element-plus 产生的问题 label act as value is about to be deprecated in version 3.0.0 ([7f1622f](https://github.com/terwer/siyuan-plugin-publisher/commit/7f1622fae323a4fd83a411643bee84206f8f0d59)) +* 修复未能自动生成打包文件的问题 ([931bbe9](https://github.com/terwer/siyuan-plugin-publisher/commit/931bbe9630a3fd7ba8993053fb9cc03a34372b73)) +* 完善开发文档 ([51bbf7b](https://github.com/terwer/siyuan-plugin-publisher/commit/51bbf7b967514df42b76f79dead9e163bbc0d7a0)) +* 完善开发文档 - 支持 serve、思源笔记插件、nginx 部署开发调试 ([532d8ed](https://github.com/terwer/siyuan-plugin-publisher/commit/532d8ed9816def408efcfce1c74f740ab140d08b)) +* 完善开发文档 - 支持 serve、思源笔记插件、nginx、vercel 部署开发调试 ([7b216b8](https://github.com/terwer/siyuan-plugin-publisher/commit/7b216b8de9eff63edfb542a187b6da59c47961aa)) +* 完善开发文档 - 支持全平台部署开发调试 ([c06abff](https://github.com/terwer/siyuan-plugin-publisher/commit/c06abff85f5af82b8073cebf41c11bc1f39d1d3d)) ### Miscellaneous -* [#7](https://github.com/terwer/sy-post-publisher/issues/7) 全自动化发布流程 ([75d83f5](https://github.com/terwer/sy-post-publisher/commit/75d83f556d8d47c08956f01e79c74cdd813e0608)) -* **deps-dev:** bump vercel from 31.2.3 to 32.0.0 ([6d7dd62](https://github.com/terwer/sy-post-publisher/commit/6d7dd625d394a91a8a800353b2cb303494bedd2a)) -* **main:** release 0.10.0 ([4b70479](https://github.com/terwer/sy-post-publisher/commit/4b70479d1686ef84c6ddc12e2a652a1670b244e0)) -* **main:** release 0.10.1 ([84e7c37](https://github.com/terwer/sy-post-publisher/commit/84e7c37ce2800321a8b5b4931a33e3b6201e4cd2)) -* **main:** release 0.10.2 ([f7f0cd9](https://github.com/terwer/sy-post-publisher/commit/f7f0cd9785e08b4367fbde74a91b126b4f438a93)) -* **main:** release 0.10.3 ([8385860](https://github.com/terwer/sy-post-publisher/commit/83858602676291a3f284c66dec27e7d790d076e2)) -* **main:** release 0.10.4 ([f59ed5d](https://github.com/terwer/sy-post-publisher/commit/f59ed5d53bef1301211abfb2e1633e8793ae48a8)) -* **main:** release 0.10.5 ([6b67ef1](https://github.com/terwer/sy-post-publisher/commit/6b67ef1031a81b9a564baf400f4b64cd1aeb53b6)) -* **main:** release 0.10.6 ([307d29f](https://github.com/terwer/sy-post-publisher/commit/307d29fe2168d62af12d05fb6b9a91f6841e2c51)) -* **main:** release 0.10.7 ([1f7e737](https://github.com/terwer/sy-post-publisher/commit/1f7e7376a3ced5a4f0722f9c28fcb41dd3c52130)) -* **main:** release 0.8.1 ([506cb7a](https://github.com/terwer/sy-post-publisher/commit/506cb7a8b182c85c0c751377eb0528b64d74fc32)) -* **main:** release 0.8.2 ([288c14e](https://github.com/terwer/sy-post-publisher/commit/288c14e4ceeef7961b4e3afcec98ded3f71a47fa)) -* **main:** release 0.9.0 ([13c2963](https://github.com/terwer/sy-post-publisher/commit/13c29637246e775f40f3613a0fdec25725e33114)) -* sync repo v1.1.1 ([23b0c85](https://github.com/terwer/sy-post-publisher/commit/23b0c852aae9e7981b8d3cd3ec53b061c975064f)) -* sync repo v1.1.2 ([d1815cd](https://github.com/terwer/sy-post-publisher/commit/d1815cd44c6b5dce13db83f8733f78ee950fb025)) -* sync repo v1.14.0 ([16a3f40](https://github.com/terwer/sy-post-publisher/commit/16a3f404109f149ea34a46bb20c8841589a254c0)) -* sync repo v1.14.1 ([d473d9b](https://github.com/terwer/sy-post-publisher/commit/d473d9bad00c6ecf37332b2ced8ea59452e68ed0)) -* sync repo v1.5.0 ([c62657e](https://github.com/terwer/sy-post-publisher/commit/c62657e7614cea2ca519ea91e48c2663364a1239)) -* sync repo v1.5.2 ([2729124](https://github.com/terwer/sy-post-publisher/commit/27291248161370e83cb5375d44659b1a56ff3781)) -* sync repo v1.6.1 ([ea14e94](https://github.com/terwer/sy-post-publisher/commit/ea14e94d0f28c486b410371dfbe54d267e63fd1a)) -* sync repo v1.8.0 ([d59b668](https://github.com/terwer/sy-post-publisher/commit/d59b6686f9af846faa960c7d7e9b1a9a9f85dfdd)) -* sync repo v1.9.0 ([3a990b3](https://github.com/terwer/sy-post-publisher/commit/3a990b3647e80f9348707b0a3d0d5aaf310c2a2b)) -* 同步版本号 ([90b1dbb](https://github.com/terwer/sy-post-publisher/commit/90b1dbb0d776622c7da87d6fe75d180b10cd7522)) -* 更新依赖 ([281cba0](https://github.com/terwer/sy-post-publisher/commit/281cba0447b7f09b6a98435bbd07bb61ad645185)) -* 更新文档 ([2a2f0cb](https://github.com/terwer/sy-post-publisher/commit/2a2f0cbc9b9c1636ed586befe311fa8e581a205e)) -## [0.10.7](https://github.com/terwer/sy-post-publisher/compare/v0.10.6...v0.10.7) (2023-09-18) -## [1.14.1](https://github.com/terwer/siyuan-plugin-publisher/compare/v1.14.0...v1.14.1) (2023-09-18) -* notion支持根页面搜索 ([ef88004](https://github.com/terwer/siyuan-plugin-publisher/commit/ef880045587f3ccf8459a7731ebac3d250c87cfa)) -* 修复非github平台发布错误的问题 ([2a42c3c](https://github.com/terwer/siyuan-plugin-publisher/commit/2a42c3c804b55917780fbc35af27805182759b41)) -* 修复默认导入未导入wordpress的问题 ([00c44b6](https://github.com/terwer/siyuan-plugin-publisher/commit/00c44b6dbb80aa46264ad62359b6da4e19eee0cb)) -## [1.14.0](https://github.com/terwer/siyuan-plugin-publisher/compare/v1.13.0...v1.14.0) (2023-09-14) +* **deps-dev:** bump jsdom from 23.2.0 to 24.0.0 ([5f10543](https://github.com/terwer/siyuan-plugin-publisher/commit/5f105435a962e6599dd686263e694b046539be15)) +* **deps-dev:** bump stylus from 0.62.0 to 0.63.0 ([7335885](https://github.com/terwer/siyuan-plugin-publisher/commit/733588554ed3e6d432cd63aa3a7d9665c31f6aa6)) +* **deps-dev:** bump vercel from 33.5.1 to 33.5.2 ([48b789b](https://github.com/terwer/siyuan-plugin-publisher/commit/48b789bed83003b49b46d702a9e79171a9d29686)) +* **deps-dev:** bump vite-plugin-node-polyfills from 0.19.0 to 0.21.0 ([8965a9c](https://github.com/terwer/siyuan-plugin-publisher/commit/8965a9c8678cba2201cfe36178b571f0a08f7ee5)) +* **deps-dev:** bump vue-tsc from 1.8.27 to 2.0.6 ([84f5dd7](https://github.com/terwer/siyuan-plugin-publisher/commit/84f5dd79c00c560446be0112ee86689b10246010)) +## [1.19.1](https://github.com/terwer/siyuan-plugin-publisher/compare/siyuan-plugin-publisher-v1.19.0...siyuan-plugin-publisher-v1.19.1) (2024-02-18) +* **deps:** bump @vueuse/core from 10.7.1 to 10.7.2 ([30047db](https://github.com/terwer/siyuan-plugin-publisher/commit/30047db126444b147734213f9ebc610e966cd40e)) +* **deps:** bump actions/cache from 3 to 4 ([c7591e3](https://github.com/terwer/siyuan-plugin-publisher/commit/c7591e3fbff096199e7864f92d4d59971d0d9754)) +* **deps:** bump element-plus from 2.4.4 to 2.5.5 ([070501c](https://github.com/terwer/siyuan-plugin-publisher/commit/070501caab005b7c20439a264bd1172b319ffd48)) +* **deps:** bump pnpm/action-setup from 2 to 3 ([4a8c07a](https://github.com/terwer/siyuan-plugin-publisher/commit/4a8c07a0355c5685035364182de044e5db88153d)) +* **deps:** bump siyuan from 0.9.1 to 0.9.3 ([7a2d36a](https://github.com/terwer/siyuan-plugin-publisher/commit/7a2d36afd9277250b0606852e9d8d8486b444e12)) +* **deps:** bump vue from 3.4.5 to 3.4.19 ([0c74d35](https://github.com/terwer/siyuan-plugin-publisher/commit/0c74d35df4cdf58b46b78f381d4ff7ea41ea14d8)) +* **deps-dev:** bump @vitejs/plugin-vue from 5.0.2 to 5.0.4 ([2994019](https://github.com/terwer/siyuan-plugin-publisher/commit/2994019bc5dc6b3e92855577dcc51ce66a58829a)) +* **deps-dev:** bump @vitest/coverage-v8 from 1.1.3 to 1.2.2 ([e41c57d](https://github.com/terwer/siyuan-plugin-publisher/commit/e41c57dcce1b39abf14c38e4cfc27756994233fe)) +* **deps-dev:** bump vercel from 33.0.2 to 33.5.1 ([8277d01](https://github.com/terwer/siyuan-plugin-publisher/commit/8277d015a5c9e1e240d680f95e117feb7fa318e2)) +* **deps-dev:** bump vitest from 1.1.3 to 1.2.2 ([3ba33bc](https://github.com/terwer/siyuan-plugin-publisher/commit/3ba33bce3446099f95eb2c3461e5a4ea3f20f9f8)) +## [1.19.0](https://github.com/terwer/siyuan-plugin-publisher/compare/siyuan-plugin-publisher-v1.18.11...siyuan-plugin-publisher-v1.19.0) (2024-01-08) +* [#130](https://github.com/terwer/siyuan-plugin-publisher/issues/130) 支持发布到CSDN ([5566040](https://github.com/terwer/siyuan-plugin-publisher/commit/5566040934eddcc22d5d1480beab70294e994a28)) +* [#773](https://github.com/terwer/siyuan-plugin-publisher/issues/773) 偏好设置数据持久化 ([1b2608d](https://github.com/terwer/siyuan-plugin-publisher/commit/1b2608da28cb6bb0bc27e6dd242ee42b06c65cfe)) +* [#774](https://github.com/terwer/siyuan-plugin-publisher/issues/774) [#751](https://github.com/terwer/siyuan-plugin-publisher/issues/751) 知乎平台支持公式和表格 ([21f2513](https://github.com/terwer/siyuan-plugin-publisher/commit/21f25135fd5bd14c0daafc62d24ae425e645e90e)) +* [#790](https://github.com/terwer/siyuan-plugin-publisher/issues/790) 支持外链转换 ([7fc9cfe](https://github.com/terwer/siyuan-plugin-publisher/commit/7fc9cfeaf619902ff0f30a90d194a672efc315ab)) +* [#800](https://github.com/terwer/siyuan-plugin-publisher/issues/800) 发布配置中的文件规则支持手动设置 ([69c527f](https://github.com/terwer/siyuan-plugin-publisher/commit/69c527f88298b4a951d00e0e646c174120320d3c)) +* [#801](https://github.com/terwer/siyuan-plugin-publisher/issues/801) 强化GitHub平台和Gitlab平台的校验 ([3cbfcd6](https://github.com/terwer/siyuan-plugin-publisher/commit/3cbfcd6645cae459a8505031b592d46c5e542222)) +* [#822](https://github.com/terwer/siyuan-plugin-publisher/issues/822) html发布时公式无法显示 ([bc311e1](https://github.com/terwer/siyuan-plugin-publisher/commit/bc311e10ff85a672f9ad0f80493d91a6dce97d1f)) +* ai 功能发布 ([ff837b0](https://github.com/terwer/siyuan-plugin-publisher/commit/ff837b0e5282a6994c1ac95689edc7eb1e161140)) +* ai集成 ([c701ce6](https://github.com/terwer/siyuan-plugin-publisher/commit/c701ce600f90c392fe9f07131e5a438374dabb6a)) +* ai集成-支持生成标题和生成摘要 ([2e48ca5](https://github.com/terwer/siyuan-plugin-publisher/commit/2e48ca5bfe9176ce9ead88ab3ee010dd063d5cdd)) +* github 和 gitlab 系列平台支持自定义设置作者主页 ([720c3b4](https://github.com/terwer/siyuan-plugin-publisher/commit/720c3b4a437e6ca546b25376041fd7246976ecca)) +* notion 支持文档更新 ([23f331f](https://github.com/terwer/siyuan-plugin-publisher/commit/23f331faf7421d6654edfbd49c47ebe38721e509)) +* 优化列表平台名称展示、新增新平台提示 ([f5d0db7](https://github.com/terwer/siyuan-plugin-publisher/commit/f5d0db7f938441f61fecf260ce8e5c8e1f6299c1)) * 全面支持github和gitlab各平台 ([b5e7413](https://github.com/terwer/siyuan-plugin-publisher/commit/b5e7413b7c03558f86f6429ef61bab7255760933)) * 全面支持github和gitlab各平台-hugo ([0396d77](https://github.com/terwer/siyuan-plugin-publisher/commit/0396d779a46d3f869091ce949f1e887a1b92650d)) * 全面支持github和gitlab各平台-jekyll ([1bb4cbe](https://github.com/terwer/siyuan-plugin-publisher/commit/1bb4cbe48196637e9b2438e196ef481c825170d0)) @@ -105,80 +66,247 @@ * 全面支持github和gitlab各平台-vuepress ([b9d1829](https://github.com/terwer/siyuan-plugin-publisher/commit/b9d18294841cbf797a742e575ce1dc3253b8d611)) * 全面支持github和gitlab各平台-vuepress2 ([92b54c6](https://github.com/terwer/siyuan-plugin-publisher/commit/92b54c67f67a64c8c89ee00be32b5374ae209dac)) * 全面支持github和gitlab各平台-vuepress2和vitepress ([485f2ff](https://github.com/terwer/siyuan-plugin-publisher/commit/485f2ff42f1fcbfd119fc070523e0d04b14e2dfd)) +* 平台列表新增 hover 提示 ([e700b0d](https://github.com/terwer/siyuan-plugin-publisher/commit/e700b0d8af9ed00b82fb50f1e79237fce47ab656)) +* 微信公众号支持 cookie 认证 ([7816ca5](https://github.com/terwer/siyuan-plugin-publisher/commit/7816ca516b3c2630b4a0a635aa9ddb2416439dc7)) +* 微信公众号支持上传图片 ([2384e72](https://github.com/terwer/siyuan-plugin-publisher/commit/2384e72817b05058601351ed263c49b956a830cc)) +* 微信公众号文章发布form表单探索 ([9c6ab1b](https://github.com/terwer/siyuan-plugin-publisher/commit/9c6ab1b1f0f79cd52ec520dd9f161dfdb0e28db4)) +* 微信公众号文章文章更新 ([85e3668](https://github.com/terwer/siyuan-plugin-publisher/commit/85e3668d87bcac8c4fb3d69d495727050d0e5589)) * 抽取网页授权平台图片上传为公共能力且仅支持pc客户端 ([2d0d137](https://github.com/terwer/siyuan-plugin-publisher/commit/2d0d137c07449dadcef2f761c4f45131de2b0f2c)) * 掘金使用别名标签,新增 gettags 方法、slugtagenabled 属性 ([f1b2b2d](https://github.com/terwer/siyuan-plugin-publisher/commit/f1b2b2dabb77e95f78634fd82b466c18744e5f6c)) * 掘金平台分类与标签初始化 ([e322697](https://github.com/terwer/siyuan-plugin-publisher/commit/e3226971cfdb1eec3fa8e5574c9c8ef5c9fef71f)) * 掘金平台支持分类与标签 ([39d7b00](https://github.com/terwer/siyuan-plugin-publisher/commit/39d7b001f9b3f6b23d4aa4a28a7973171cc653de)) * 掘金支持专栏作为分类 ([546fec2](https://github.com/terwer/siyuan-plugin-publisher/commit/546fec287dbedaadf1aa5ab367d0ebd15c5e40c2)) +* 支持 flowus 息流 ([c930c4e](https://github.com/terwer/siyuan-plugin-publisher/commit/c930c4e8eb7ee4cec90f3e12b3a299bb7c6bc0c4)) +* 支持 halo - 支持上传图片 ([3e13fb5](https://github.com/terwer/siyuan-plugin-publisher/commit/3e13fb58dc4bf374956c778d4a1f93b2f63bef01)) +* 支持gitlab ([06f71fb](https://github.com/terwer/siyuan-plugin-publisher/commit/06f71fb9f79eebb11a72d55cb78d70fa812d2180)) * 支持别名标签 ([975c234](https://github.com/terwer/siyuan-plugin-publisher/commit/975c2343f0574a8c825e104580f9e433933e386d)) +* 支持文档路径自动映射为分类 ([3787ed1](https://github.com/terwer/siyuan-plugin-publisher/commit/3787ed1436ee445e440e62b7f90b488134d7ed0c)) * 支持简书和掘金 ([3c3e49e](https://github.com/terwer/siyuan-plugin-publisher/commit/3c3e49ed713e88069370713a2be1931f1f4dfa79)) * 支持简书平台上传图片 ([75768e1](https://github.com/terwer/siyuan-plugin-publisher/commit/75768e18b0e728d36cc4644cea3bbf4efca18a4b)) * 支持简书文章版本 ([6295faa](https://github.com/terwer/siyuan-plugin-publisher/commit/6295faad452b0bab4fdaa3101d400aac647e029f)) +* 支持选择知识空间 ([ab1a648](https://github.com/terwer/siyuan-plugin-publisher/commit/ab1a648bbf9b56341861774f24b9e7a8164e9ac5)) +* 整合菜单,专注核心功能 ([72e525e](https://github.com/terwer/siyuan-plugin-publisher/commit/72e525eb714a67acfd4e3c15c9a74e4971c41478)) +* 适配 flowus 息流 ([acd5502](https://github.com/terwer/siyuan-plugin-publisher/commit/acd5502da3b59592e8f6a7c4b32b8ecdd6cedf27)) +* [#388](https://github.com/terwer/siyuan-plugin-publisher/issues/388) 保存各个平台的标签和分类 ([ca9d183](https://github.com/terwer/siyuan-plugin-publisher/commit/ca9d183197ea7d880fbbcf765263ebf4c4728b40)) +* [#435](https://github.com/terwer/siyuan-plugin-publisher/issues/435) 过滤掉思源剪藏插件的引用摘要 ([617be1d](https://github.com/terwer/siyuan-plugin-publisher/commit/617be1de671f2dc424784d6dab49b8152177bf60)) +* [#680](https://github.com/terwer/siyuan-plugin-publisher/issues/680) PC客户端多个工作空间情况下,自动读取思源地址 ([cd8a375](https://github.com/terwer/siyuan-plugin-publisher/commit/cd8a375d4abffc22ee5fe15f78fa43270be3b332)) +* [#692](https://github.com/terwer/siyuan-plugin-publisher/issues/692) 闪卡标记渲染成Markdown之后去除== ([0e1e7f1](https://github.com/terwer/siyuan-plugin-publisher/commit/0e1e7f1592291c340035c304ac98950fb012f2af)) +* [#744](https://github.com/terwer/siyuan-plugin-publisher/issues/744) WordPress更新文章标签重复 ([1fc2171](https://github.com/terwer/siyuan-plugin-publisher/commit/1fc2171420bd309ce8354f226698f1968ab0349b)) +* [#754](https://github.com/terwer/siyuan-plugin-publisher/issues/754) 修复旧挂件发布过的文章无法更新的问题 ([3b12563](https://github.com/terwer/siyuan-plugin-publisher/commit/3b12563c37caa2a0c54e6ca6b0cef2c0283a8ec4)) +* [#765](https://github.com/terwer/siyuan-plugin-publisher/issues/765) 修复Halo 平台无法设置发布时间的问题 ([acc6dc9](https://github.com/terwer/siyuan-plugin-publisher/commit/acc6dc91ff3c3dfdc6ce6b04c0c9b52f0ac9de7d)) +* [#775](https://github.com/terwer/siyuan-plugin-publisher/issues/775) ([6fb23fb](https://github.com/terwer/siyuan-plugin-publisher/commit/6fb23fb6ed2cf323d2863ea3bb538d2b21a85fec)) +* [#821](https://github.com/terwer/siyuan-plugin-publisher/issues/821) html发布的时候会出现有些格式没有转化 ([4c44dbf](https://github.com/terwer/siyuan-plugin-publisher/commit/4c44dbf6e48d3e8d331580d16b9be2a4fe44610f)) +* [#838](https://github.com/terwer/siyuan-plugin-publisher/issues/838) 保存各个平台的标签和分类 ([6b663ff](https://github.com/terwer/siyuan-plugin-publisher/commit/6b663ffed090d02118be3e01ea1e20e9f5b0e356)) +* [#843](https://github.com/terwer/siyuan-plugin-publisher/issues/843) 授权方式改为只读,防止引起误解或者误配置 ([ec6b7ac](https://github.com/terwer/siyuan-plugin-publisher/commit/ec6b7ac5c7718335d0d481c5aa433f1e63301dce)) +* [#855](https://github.com/terwer/siyuan-plugin-publisher/issues/855) 自动映射分类时才添加路径为分类 ([cc2bb44](https://github.com/terwer/siyuan-plugin-publisher/commit/cc2bb44e0a86f92a492869d2650990a695fbc23e)) +* [#857](https://github.com/terwer/siyuan-plugin-publisher/issues/857) 修复查看最新文章路径错误 ([c5dda53](https://github.com/terwer/siyuan-plugin-publisher/commit/c5dda53db2426de95f1df957a6d8f0791c4970a3)) +* [#892](https://github.com/terwer/siyuan-plugin-publisher/issues/892) 支持常规发布模式下的单个预览和一键预览 ([e804b16](https://github.com/terwer/siyuan-plugin-publisher/commit/e804b16a3f51b4fc62cd716049c6ddca6ce67b20)) +* [#893](https://github.com/terwer/siyuan-plugin-publisher/issues/893) 非源码模式修改的文章属性无法保存 ([a40fc5e](https://github.com/terwer/siyuan-plugin-publisher/commit/a40fc5e6a76cff18cbc4e3e287a83a3e3f337da2)) +* [#899](https://github.com/terwer/siyuan-plugin-publisher/issues/899) 重构 YAML 部分逻辑 ([55e52e8](https://github.com/terwer/siyuan-plugin-publisher/commit/55e52e88afb0cdda596beb40b71f9df96240031a)) +* [#927](https://github.com/terwer/siyuan-plugin-publisher/issues/927) 修复 CSDN 和知乎公式解析不正常的问题 ([aee7081](https://github.com/terwer/siyuan-plugin-publisher/commit/aee70815cbbbbe80596e98b136fd45ba7d4d2de5)) +* [#964](https://github.com/terwer/siyuan-plugin-publisher/issues/964) 修复转义文本导致的知乎依旧公式解析错误问题 ([988b46d](https://github.com/terwer/siyuan-plugin-publisher/commit/988b46d380eb4fbbfc9e82c4edce6378aefab36d)) +* AI-generated desc lose space and case info [#775](https://github.com/terwer/siyuan-plugin-publisher/issues/775) ([e4f07f7](https://github.com/terwer/siyuan-plugin-publisher/commit/e4f07f7dd37bc2a89e670275362c39d0b742c84c)) +* **deps:** bump @vueuse/components from 10.6.1 to 10.7.1 ([c2a3513](https://github.com/terwer/siyuan-plugin-publisher/commit/c2a351371790f47357336c29d91dcccfc1529f61)) +* **deps:** bump @vueuse/core from 10.6.1 to 10.7.1 ([1b3f182](https://github.com/terwer/siyuan-plugin-publisher/commit/1b3f1828d09d5294282e2dc2fd5f95147e3547ae)) +* **deps:** bump actions/setup-node from 3 to 4 ([99247dd](https://github.com/terwer/siyuan-plugin-publisher/commit/99247ddbe2d7657c6bed4df583dc51ebfabbef1d)) +* **deps:** bump element-plus from 2.3.14 to 2.4.0 ([c017e20](https://github.com/terwer/siyuan-plugin-publisher/commit/c017e204c7555a3b0e617edf5155960e2ab219a3)) +* **deps:** bump google-github-actions/release-please-action from 3 to 4 ([696b383](https://github.com/terwer/siyuan-plugin-publisher/commit/696b38304e74e553387a2dbe7f852e28f87a4782)) +* **deps:** bump pinia from 2.1.6 to 2.1.7 ([874c7a8](https://github.com/terwer/siyuan-plugin-publisher/commit/874c7a800f4c6ada35662e37b683882408eccd47)) +* **deps:** bump siyuan from 0.8.4 to 0.8.5 ([f57609c](https://github.com/terwer/siyuan-plugin-publisher/commit/f57609c18eda3a7d5888709d1ba36bbfed3bb598)) +* **deps:** bump siyuan from 0.8.9 to 0.9.1 ([258bfe2](https://github.com/terwer/siyuan-plugin-publisher/commit/258bfe209e811079e9834302e66c85295f064d10)) * **deps:** bump uuid from 9.0.0 to 9.0.1 ([9fab366](https://github.com/terwer/siyuan-plugin-publisher/commit/9fab366e87f4fd13c68afcd4b3cb9a862b2001a3)) +* **deps:** bump vue from 3.3.7 to 3.3.8 ([96b7753](https://github.com/terwer/siyuan-plugin-publisher/commit/96b7753d85722642681af51ee3ec85869ee41feb)) +* **deps:** bump vue from 3.3.9 to 3.4.5 ([f86c533](https://github.com/terwer/siyuan-plugin-publisher/commit/f86c53329f8a27465ac60d69cf0da8beb7897730)) +* **deps:** bump vue-i18n from 9.3.0 to 9.4.0 ([09d8992](https://github.com/terwer/siyuan-plugin-publisher/commit/09d899201f92c47b2e99ab6dc37c3c6984011e4f)) +* **deps:** bump vue-i18n from 9.4.1 to 9.5.0 ([dbb0df7](https://github.com/terwer/siyuan-plugin-publisher/commit/dbb0df790cdd78f1103ba826ce73c3bfc3990b6d)) +* **deps:** bump vue-i18n from 9.6.1 to 9.6.2 ([d1c008a](https://github.com/terwer/siyuan-plugin-publisher/commit/d1c008ab42a5849be96eb5ab9b890aa18e5b47bd)) +* **deps:** bump vue-i18n from 9.6.2 to 9.6.4 ([9f96acb](https://github.com/terwer/siyuan-plugin-publisher/commit/9f96acbb80ea75f9c2c0cd63b7131b6e93cc22a3)) +* **deps:** bump vue-router from 4.2.4 to 4.2.5 ([11cec9d](https://github.com/terwer/siyuan-plugin-publisher/commit/11cec9d20b02494d6eecfd30eaf31daaa14b16e4)) +* **deps:** bump zhi-github-middleware from 0.3.9 to 0.4.1 ([9e16094](https://github.com/terwer/siyuan-plugin-publisher/commit/9e160943cd7d51af27bb6b092d9fb62fdb417a88)) +* **deps:** bump zhi-lib-base from 0.4.4 to 0.5.0 ([0388459](https://github.com/terwer/siyuan-plugin-publisher/commit/03884599b69f0be18034a8e7ef1eaa09a9950a97)) +* **deps:** bump zhi-siyuan-api from 2.12.2 to 2.12.3 ([0e480a6](https://github.com/terwer/siyuan-plugin-publisher/commit/0e480a6ec6f0551f2bf12ffddfc41b74da492bd9)) +* hexo 深度优化 ([596c09e](https://github.com/terwer/siyuan-plugin-publisher/commit/596c09e251d55ae3fb19f36992814eedf5eb863e)) +* hexo 配置支持关闭永久链接 ([c085f76](https://github.com/terwer/siyuan-plugin-publisher/commit/c085f763059e09eaad9e24fa81ab7d1d6b5a86c0)) +* notion支持根页面搜索 ([ef88004](https://github.com/terwer/siyuan-plugin-publisher/commit/ef880045587f3ccf8459a7731ebac3d250c87cfa)) +* update to latest release please ([7c40d30](https://github.com/terwer/siyuan-plugin-publisher/commit/7c40d303beb84c56edb085c33494185beb96842b)) +* vuepress 支持发布为日记 ([3da0481](https://github.com/terwer/siyuan-plugin-publisher/commit/3da0481a9dbde59b207b2cb720c16f1b5f47b5d5)) +* vuepress 支持自动推测发布目录 ([71e57d3](https://github.com/terwer/siyuan-plugin-publisher/commit/71e57d30b3a61571c282a8561761207ec1e9cac7)) +* 一键预览新增确认 ([1d6997b](https://github.com/terwer/siyuan-plugin-publisher/commit/1d6997b12290cbdc23f9470eecf4d982d04d67d0)) +* 不分割js代码,有缓存的情况下性能更好 ([fa499c1](https://github.com/terwer/siyuan-plugin-publisher/commit/fa499c1a78469c6e01696e17fe688a463bdd9c86)) +* 专业版预告 ([361516f](https://github.com/terwer/siyuan-plugin-publisher/commit/361516fe2153151f4cef16f85319c178ec527c6e)) +* 优化ai指令 ([733f0cf](https://github.com/terwer/siyuan-plugin-publisher/commit/733f0cf3ddd56c9f24e8bf93c387d16e6b659ebb)) +* 优化ai配置检测机制 ([02a243a](https://github.com/terwer/siyuan-plugin-publisher/commit/02a243aae5b85affba4145cd9178addf7649612d)) +* 优化token检测 ([d43f6b4](https://github.com/terwer/siyuan-plugin-publisher/commit/d43f6b4cd9f223584fa2195b7bb1148bf61eea57)) +* 优化一些属性合并逻辑 ([f8719c7](https://github.com/terwer/siyuan-plugin-publisher/commit/f8719c72986b8a0222434fed0596eb768d6870f8)) +* 优化单个文章的删除流程 ([453620f](https://github.com/terwer/siyuan-plugin-publisher/commit/453620f1c640c575fc370cf755af6cbf7507234f)) +* 优化帮助指引 ([5a3c99a](https://github.com/terwer/siyuan-plugin-publisher/commit/5a3c99aa87f097ea6c61c50305239d81f92f1ea0)) +* 优化文章未发布时的提示 ([abc9095](https://github.com/terwer/siyuan-plugin-publisher/commit/abc90957ffc258a3c7ea9bb3f5d225499329443b)) +* 优化配置 ([d85f950](https://github.com/terwer/siyuan-plugin-publisher/commit/d85f950bdc509a93eef0939caa317f92c6dc3f9a)) +* 修复 ai 标签无法打开的问题 ([9689c55](https://github.com/terwer/siyuan-plugin-publisher/commit/9689c55aa61b07e8e1c54c80da8d40fe1000ddc3)) * 修复 cookie 设置问题 ([642e570](https://github.com/terwer/siyuan-plugin-publisher/commit/642e57040f9410af9162e0f44fcddbb727a2e22f)) +* 修复 vuepress 文件名不正确的问题 ([409d6c0](https://github.com/terwer/siyuan-plugin-publisher/commit/409d6c0c5ce67dba07e8de267be3fa5139648550)) +* 修复 vuepress 转换错误问题 ([0f8e5a2](https://github.com/terwer/siyuan-plugin-publisher/commit/0f8e5a2256cecafbe21bbffdba76f455e04143a6)) +* 修复 wordpress 摘要更新未生效的问题 ([65feeb2](https://github.com/terwer/siyuan-plugin-publisher/commit/65feeb267cc8f71f05da643aa9d85f0a0e8189d3)) +* 修复 yaml 修改未生效问题 ([c3180b9](https://github.com/terwer/siyuan-plugin-publisher/commit/c3180b93ab2964b2ad81a5ba3b7f8bd54781765b)) +* 修复ai提示字符超出问题 ([6f7af83](https://github.com/terwer/siyuan-plugin-publisher/commit/6f7af83d7ffac776766283bfadb9952a9a1b27e3)) +* 修复yaml修改不生效的问题 ([ac21891](https://github.com/terwer/siyuan-plugin-publisher/commit/ac21891c7b04f66a433dfd8e1788811026663c92)) +* 修复yaml初始化未读取最新的问题 ([704241b](https://github.com/terwer/siyuan-plugin-publisher/commit/704241b8a99b8f5319706e05a342e6f83cc764d3)) +* 修复yaml初始化错误 ([0922fa6](https://github.com/terwer/siyuan-plugin-publisher/commit/0922fa6a9d7fa7ebfac02d63e10e3c99ecbdf541)) +* 修复yaml在部分场景下误解析的问题 ([9edd0c0](https://github.com/terwer/siyuan-plugin-publisher/commit/9edd0c09405e8b271fb1a9374ccff3e89087e57c)) +* 修复yaml转换错误 ([53f7196](https://github.com/terwer/siyuan-plugin-publisher/commit/53f71967b18824206673a8b51fe5be38cd6db568)) +* 修复主页末尾有斜杠预览错误的问题 ([b58f5c3](https://github.com/terwer/siyuan-plugin-publisher/commit/b58f5c344589cad707dadd828831c8408e0648d3)) +* 修复删除标签,然后点击选择标签,标签仍然存在的问题 ([3219fd2](https://github.com/terwer/siyuan-plugin-publisher/commit/3219fd2b8183fd1c1e3ba68b9dfbf1b438c38cac)) +* 修复博客园可能出现的预览错误问题 ([a4ba0ed](https://github.com/terwer/siyuan-plugin-publisher/commit/a4ba0edb582ac28bf27551639797bc8caa1b3686)) +* 修复博客园无法上传图片问题 ([103c18d](https://github.com/terwer/siyuan-plugin-publisher/commit/103c18dc344adb4179d0b139b447a28fe54e33d0)) +* 修复图床插件开启的时候csdn平台的图片问题 ([3eb68c0](https://github.com/terwer/siyuan-plugin-publisher/commit/3eb68c08253ca5db1d257797fee0c26837d306e5)) +* 修复多个平台发布之后数据不一致的问题 ([fd9cfe7](https://github.com/terwer/siyuan-plugin-publisher/commit/fd9cfe702c38d021615c30567abb5a99735444b8)) +* 修复平台名称被截断的问题 ([76136e5](https://github.com/terwer/siyuan-plugin-publisher/commit/76136e5f2d217e05edbd3cfb67f738d7ed8d1e8f)) +* 修复强制删除属性残留问题 ([120d62f](https://github.com/terwer/siyuan-plugin-publisher/commit/120d62f7ddb029a1d328f67c33a001b7870a73dd)) +* 修复批量分发属性错误问题 ([1101caf](https://github.com/terwer/siyuan-plugin-publisher/commit/1101caf2ec7845f40212dc5d4cd3ee92f59ac42c)) +* 修复掘金平台发布错误的问题 ([4516bb7](https://github.com/terwer/siyuan-plugin-publisher/commit/4516bb74bdecd7635353fd50d2295d8bd41d7330)) +* 修复无法通过伺服进行调试的问题 ([3c9e9a1](https://github.com/terwer/siyuan-plugin-publisher/commit/3c9e9a1bcc88de4282a1145fcc507a0344b628f3)) * 修复未初始化标签时初始化异常的问题 ([cea4056](https://github.com/terwer/siyuan-plugin-publisher/commit/cea40561e379ee6c69fdba73c18caf5cdc16921d)) +* 修复未设置标签分类可能报错的问题 ([4645104](https://github.com/terwer/siyuan-plugin-publisher/commit/46451042d600c7221ce59ef06edb8d7e58a2a1cf)) +* 修复构建错误 ([32e8f61](https://github.com/terwer/siyuan-plugin-publisher/commit/32e8f61d193d0a979c4417653bc8b202b0be7b04)) +* 修复某些平台 yaml 生成可能发生错误的问题 ([7f99a1b](https://github.com/terwer/siyuan-plugin-publisher/commit/7f99a1b15ea85597828d80534c98559b37d446ff)) +* 修复标签为空时部分平台报错的问题 ([3031c2a](https://github.com/terwer/siyuan-plugin-publisher/commit/3031c2a691a7bb5f350b202ee7c593b66b760db4)) +* 修复根目录发布文档可能呢个出现的路径错误问题 ([bee47fa](https://github.com/terwer/siyuan-plugin-publisher/commit/bee47fa1ceebf3d169928d8105295d5284a1c6ba)) +* 修复添加新标签,然后点击选择标签,新标签消失的问题 ([cd8e61d](https://github.com/terwer/siyuan-plugin-publisher/commit/cd8e61db261c9f5f617f4253a5686d9e90119b88)) * 修复知识空间重复显示的问题 ([9671464](https://github.com/terwer/siyuan-plugin-publisher/commit/9671464d4dd4f576e68f80d8956b92d57798fdd1)) +* 修复简书发布报错问题 ([fbad5ee](https://github.com/terwer/siyuan-plugin-publisher/commit/fbad5ee0a7fe744848c2a8b7767187b3f34cd55e)) +* 修复自动分类路径可能为空的问题 ([b31cbd0](https://github.com/terwer/siyuan-plugin-publisher/commit/b31cbd0f19e99a905fe7088de1751ab59e2e9d39)) +* 修复调试模式思源地址错误的问题 ([d97499d](https://github.com/terwer/siyuan-plugin-publisher/commit/d97499d8de545ef64bca21536ebeb17e05cf254f)) +* 修复部分文案错误 ([8267742](https://github.com/terwer/siyuan-plugin-publisher/commit/8267742b0fa964b4b0d1f7ea13158c39bf16b8bf)) +* 修复非github平台发布错误的问题 ([2a42c3c](https://github.com/terwer/siyuan-plugin-publisher/commit/2a42c3c804b55917780fbc35af27805182759b41)) +* 修复默认导入未导入wordpress的问题 ([00c44b6](https://github.com/terwer/siyuan-plugin-publisher/commit/00c44b6dbb80aa46264ad62359b6da4e19eee0cb)) +* 修改关于页面央视错乱问题 ([89c4f8c](https://github.com/terwer/siyuan-plugin-publisher/commit/89c4f8c3aeced81ca11fcc596fc586c145a12942)) +* 兼容 csdn 错误提示 ([0706aea](https://github.com/terwer/siyuan-plugin-publisher/commit/0706aea3f99387c3c33258ac0278d58ad3da4594)) +* 兼容csdn公式 ([f954feb](https://github.com/terwer/siyuan-plugin-publisher/commit/f954febf246d16933fed6b8fc5ce7896c19ab92e)) +* 兼容知乎公式 ([78688cd](https://github.com/terwer/siyuan-plugin-publisher/commit/78688cd7ca4584a83e45f1d208a8e98d62c3b216)) +* 减少上传提示打扰 ([2fc4d25](https://github.com/terwer/siyuan-plugin-publisher/commit/2fc4d25a6f772ee3107c09dc8de81f8cab6d44be)) +* 删除文章需移除属性 ([d9d624c](https://github.com/terwer/siyuan-plugin-publisher/commit/d9d624ca68665da20c5647783ee090a57c5f9b6a)) +* 回滚批量分发的覆盖与合并并进行优化 ([bb6f1e5](https://github.com/terwer/siyuan-plugin-publisher/commit/bb6f1e572ce72497caa4553fb5b5cd3cde6685ab)) +* 对不支持标签的平台隐藏标签设置 ([7ecfb23](https://github.com/terwer/siyuan-plugin-publisher/commit/7ecfb235c470129b0333057290a3aba71d053701)) +* 将index.html中 modulepreload 改为 preload ([a43b572](https://github.com/terwer/siyuan-plugin-publisher/commit/a43b572cae24fc7de380207773ca43d256859566)) +* 掘金平台摘要控制在50-100 ([db620b7](https://github.com/terwer/siyuan-plugin-publisher/commit/db620b7cb33f362a4d2cc54e5529d8c8239654dc)) +* 控制默认展示方式,如果有适配器,优先展示 yaml ([c155c42](https://github.com/terwer/siyuan-plugin-publisher/commit/c155c42757174391ef71fce26b8582ca1ad5c8ea)) +* 摘要同步 ([f761572](https://github.com/terwer/siyuan-plugin-publisher/commit/f761572ab2c341e0179883c3980165103b12e6b1)) +* 支持 halo ([125455e](https://github.com/terwer/siyuan-plugin-publisher/commit/125455ee001d60ba8639b68a67af75337135c1a5)) +* 支持 halo - 基本发布功能 ([8964d66](https://github.com/terwer/siyuan-plugin-publisher/commit/8964d66e40cf233e7da55c6058b9cd3b2e0b9986)) +* 支持 halo - 新建和更新文章 ([27f5d32](https://github.com/terwer/siyuan-plugin-publisher/commit/27f5d3297c84238f070ebc164666dee2e574a826)) +* 支持平台一键导入 ([1c8934e](https://github.com/terwer/siyuan-plugin-publisher/commit/1c8934ea1e9795ab816f914938d4159a155a9103)) +* 新增csdn发布说明 ([5df6ed9](https://github.com/terwer/siyuan-plugin-publisher/commit/5df6ed9b59c223ecf7964dbf6fc5f2fc15d20f58)) +* 新增强制删除 ([629c468](https://github.com/terwer/siyuan-plugin-publisher/commit/629c468b6ee5dd61e73acf4c82041363084c62d8)) +* 新增性能计时器 ([706ce2e](https://github.com/terwer/siyuan-plugin-publisher/commit/706ce2e7f13c4ed2ae2599e8f7ab73c439c857fe)) +* 新增菜单开关 ([8589364](https://github.com/terwer/siyuan-plugin-publisher/commit/8589364edb9b3c31f45d5a99296de9f86d7dfd66)) +* 自动保存属性,取消不必要的提示 ([9f9926d](https://github.com/terwer/siyuan-plugin-publisher/commit/9f9926d39771d8870ea57652e203223bdcfd6940)) +* 进一步优化 ai 效果 ([b2ccb55](https://github.com/terwer/siyuan-plugin-publisher/commit/b2ccb55abfcfd924968cac928bd2879041f95d3a)) +* 部分场景适配网页版 ([3eaf1d2](https://github.com/terwer/siyuan-plugin-publisher/commit/3eaf1d2bcd62fad5fd18b953d5d9c58831734865)) +* 部分文件改为异步加载,小幅度提升性能 ([19455b0](https://github.com/terwer/siyuan-plugin-publisher/commit/19455b04ec35613427b032aa27b04f5b11954e98)) +* 重构存储 ([c1b646a](https://github.com/terwer/siyuan-plugin-publisher/commit/c1b646a440b9a12b737d1fddd553c01c4a47c968)) +### Code Refactoring +* 重构项目结构 ([9629fbc](https://github.com/terwer/siyuan-plugin-publisher/commit/9629fbc2eab90cc613f7ade523045d6cd8cff7ea)) +* **deps-dev:** bump @halo-dev/api-client from 2.9.0 to 2.10.0 ([bc92f28](https://github.com/terwer/siyuan-plugin-publisher/commit/bc92f28d0469096841faff1de81c6db506915246)) +* **deps-dev:** bump @types/crypto-js from 4.1.3 to 4.2.0 ([2042f17](https://github.com/terwer/siyuan-plugin-publisher/commit/2042f1720f416208107375a0918b94b6887b8515)) +* **deps-dev:** bump @vitejs/plugin-vue from 4.3.4 to 4.4.0 ([eea41e0](https://github.com/terwer/siyuan-plugin-publisher/commit/eea41e0a388900bad8eb80f14721c9494e10f902)) +* **deps-dev:** bump @vitejs/plugin-vue from 4.4.0 to 4.4.1 ([938511b](https://github.com/terwer/siyuan-plugin-publisher/commit/938511b3e1e1f2abe36220048be5ac3fd77f8459)) +* **deps-dev:** bump @vitest/coverage-v8 from 0.34.4 to 0.34.6 ([df8cec7](https://github.com/terwer/siyuan-plugin-publisher/commit/df8cec75dc5ebdb2e0f6cf580aed825a54ef80b8)) +* **deps-dev:** bump esbuild-style-plugin from 1.6.2 to 1.6.3 ([a53ee10](https://github.com/terwer/siyuan-plugin-publisher/commit/a53ee10beab9ca0f1ecdd67eb03f460b3c3094dc)) +* **deps-dev:** bump fast-glob from 3.3.1 to 3.3.2 ([647c993](https://github.com/terwer/siyuan-plugin-publisher/commit/647c9932155ee31e3bbd8f106a56f8e1bcb9da6b)) +* **deps-dev:** bump jsdom from 22.1.0 to 23.2.0 ([7fa13c5](https://github.com/terwer/siyuan-plugin-publisher/commit/7fa13c5979853b2ca93d6e63f9bdc20e5388add2)) +* **deps-dev:** bump unplugin-auto-import from 0.16.7 to 0.17.2 ([b8fc1f7](https://github.com/terwer/siyuan-plugin-publisher/commit/b8fc1f7704e67d9d51b5648a4e1be26578acb510)) +* **deps-dev:** bump unplugin-vue-components from 0.25.1 to 0.25.2 ([1ba446a](https://github.com/terwer/siyuan-plugin-publisher/commit/1ba446a25ae7aa021bd4022e80e265bac726cb51)) +* **deps-dev:** bump unplugin-vue-components from 0.25.2 to 0.26.0 ([2ac91db](https://github.com/terwer/siyuan-plugin-publisher/commit/2ac91db3586029cabacc48b3f916fd0c82028b24)) * **deps-dev:** bump vercel from 32.1.0 to 32.2.2 ([795221a](https://github.com/terwer/siyuan-plugin-publisher/commit/795221a946b1d1e0fa01a81f8708fce9797052b2)) +* **deps-dev:** bump vercel from 32.2.5 to 32.4.1 ([454f6c1](https://github.com/terwer/siyuan-plugin-publisher/commit/454f6c1ad3489b6f7d9fbdfcd69015eb293a8b7e)) +* **deps-dev:** bump vercel from 32.5.0 to 32.5.2 ([93d2934](https://github.com/terwer/siyuan-plugin-publisher/commit/93d29346dce39aed8626353dd32894f3fcbcbdb4)) +* **deps-dev:** bump vercel from 32.5.2 to 32.5.3 ([d55392c](https://github.com/terwer/siyuan-plugin-publisher/commit/d55392c8fd2980b9d730123fd5ed80ef19447242)) +* **deps-dev:** bump vite from 4.4.9 to 4.4.11 ([d868454](https://github.com/terwer/siyuan-plugin-publisher/commit/d868454795d7b7a62c31d7fa68b72b9a29f16081)) +* **deps-dev:** bump vite-plugin-node-polyfills from 0.11.3 to 0.12.0 ([b298b5f](https://github.com/terwer/siyuan-plugin-publisher/commit/b298b5fd2f51f86d5d0f13fa0adedba857eda965)) * **deps-dev:** bump vite-plugin-node-polyfills from 0.12.0 to 0.14.0 ([412d2f8](https://github.com/terwer/siyuan-plugin-publisher/commit/412d2f8a4184322f380fd0a1e507c0470a9f1420)) +* **deps-dev:** bump vite-plugin-node-polyfills from 0.14.1 to 0.15.0 ([36c7a87](https://github.com/terwer/siyuan-plugin-publisher/commit/36c7a87a043681bd767a8cc05f6ed3906ce50fa1)) +* **deps-dev:** bump vite-plugin-node-polyfills from 0.15.0 to 0.16.0 ([5e4411f](https://github.com/terwer/siyuan-plugin-publisher/commit/5e4411f0b7ef5984411a75383961746910455d29)) +* **deps-dev:** bump vite-plugin-node-polyfills from 0.16.0 to 0.19.0 ([03ba0f9](https://github.com/terwer/siyuan-plugin-publisher/commit/03ba0f9e0e0321b2259940e5f970b0fd95a714ec)) +* **deps-dev:** bump vitest from 0.34.4 to 0.34.6 ([82abb1e](https://github.com/terwer/siyuan-plugin-publisher/commit/82abb1e87fa322fb2d4db8366718d66b39c2a630)) +* **deps-dev:** bump vue-tsc from 1.8.10 to 1.8.11 ([89f8c26](https://github.com/terwer/siyuan-plugin-publisher/commit/89f8c26388f271ccb8ffc8e56ae38be956a90720)) +* **deps-dev:** bump vue-tsc from 1.8.11 to 1.8.13 ([7c9c1ac](https://github.com/terwer/siyuan-plugin-publisher/commit/7c9c1ac63cf76e370df79ff8d5e9e10475889f19)) +* **deps-dev:** bump vue-tsc from 1.8.13 to 1.8.15 ([f1b6783](https://github.com/terwer/siyuan-plugin-publisher/commit/f1b67837cb07d333296e482d752b497eaf2c572e)) +* **deps-dev:** bump vue-tsc from 1.8.16 to 1.8.18 ([61dadf6](https://github.com/terwer/siyuan-plugin-publisher/commit/61dadf6ec63e1a1d922e76f4219fb973b4c0a546)) +* **deps-dev:** bump vue-tsc from 1.8.24 to 1.8.27 ([0a4596b](https://github.com/terwer/siyuan-plugin-publisher/commit/0a4596b0b9068b8a744327f57a513815f39bb204)) * **deps-dev:** bump vue-tsc from 1.8.8 to 1.8.10 ([cb26813](https://github.com/terwer/siyuan-plugin-publisher/commit/cb26813dc9f97522c2eba9ec4843b5a2ec09378a)) +* dynamic import chatgpt [#786](https://github.com/terwer/siyuan-plugin-publisher/issues/786) ([8904c3a](https://github.com/terwer/siyuan-plugin-publisher/commit/8904c3a1fedf243b143e3e877bacddb806cbce6a)) +* **main:** release 1.10.0 ([9db6aec](https://github.com/terwer/siyuan-plugin-publisher/commit/9db6aec5f53ab9dadea3221d3580ef9a97a91907)) +* **main:** release 1.10.1 ([8c3655c](https://github.com/terwer/siyuan-plugin-publisher/commit/8c3655c57119d7897061ddf2229148d5fffd9130)) +* **main:** release 1.10.2 ([bda0cc0](https://github.com/terwer/siyuan-plugin-publisher/commit/bda0cc0daedf8ef560b9afe63fbfaa8eb17bdc70)) +* **main:** release 1.10.3 ([ff925ed](https://github.com/terwer/siyuan-plugin-publisher/commit/ff925ed6bb5770a93fd1cc7d14ce492229ab4e48)) +* **main:** release 1.11.0 ([4fafbf9](https://github.com/terwer/siyuan-plugin-publisher/commit/4fafbf9121fe5ebb2146429876d3c6fd3b4837f0)) +* **main:** release 1.11.1 ([6a96d13](https://github.com/terwer/siyuan-plugin-publisher/commit/6a96d13ec651a9e2bf3ddbdadb7b3cd0e792d0f7)) +* **main:** release 1.11.2 ([bcac2cf](https://github.com/terwer/siyuan-plugin-publisher/commit/bcac2cf8861f5082e6fc93a25c022ae536caafd7)) +* **main:** release 1.11.3 ([3566dbf](https://github.com/terwer/siyuan-plugin-publisher/commit/3566dbfd1b6a70f95cb8d700b0e03f8283b02aa0)) +* **main:** release 1.12.0 ([ed01855](https://github.com/terwer/siyuan-plugin-publisher/commit/ed01855d6c49e1e08b17612be2a246f59590e73d)) +* **main:** release 1.13.0 ([48b1fac](https://github.com/terwer/siyuan-plugin-publisher/commit/48b1fac66779dd3c4fc7067c3d826421e7d6b49f)) +* **main:** release 1.14.0 ([3c87f76](https://github.com/terwer/siyuan-plugin-publisher/commit/3c87f766ab3e1e83e2b668ebae231bdb0a01d602)) +* **main:** release 1.14.1 ([d89a86a](https://github.com/terwer/siyuan-plugin-publisher/commit/d89a86aa4d813bbd2e0f6bf227acabe84b7b7e0c)) +* **main:** release 1.15.0 ([eb0c9dc](https://github.com/terwer/siyuan-plugin-publisher/commit/eb0c9dccf01934dc0b431badd39cb4b17faae91f)) +* **main:** release 1.15.1 ([7eaeea4](https://github.com/terwer/siyuan-plugin-publisher/commit/7eaeea406a15998ca73d9b2b61bdb0e15027093e)) +* **main:** release 1.16.0 ([304ebf3](https://github.com/terwer/siyuan-plugin-publisher/commit/304ebf3cfb3486a2ba85033c8ad2ed2e20072528)) +* **main:** release 1.17.0 ([2ae1285](https://github.com/terwer/siyuan-plugin-publisher/commit/2ae12857df0e7cd9fc3332a7d28806aeff387645)) +* **main:** release 1.17.1 ([ca3bb26](https://github.com/terwer/siyuan-plugin-publisher/commit/ca3bb266a7aed65fd31ebf697eec41f92cd0bbe6)) +* **main:** release 1.17.2 ([c160c82](https://github.com/terwer/siyuan-plugin-publisher/commit/c160c82f75981cbf0c22ce1b01a56b2826d8df07)) +* **main:** release 1.17.3 ([a238566](https://github.com/terwer/siyuan-plugin-publisher/commit/a238566fd7a1435964df4f6900c03357be362191)) +* **main:** release 1.18.0 ([70cb431](https://github.com/terwer/siyuan-plugin-publisher/commit/70cb431297dc97a2fbe11f53d4a1a90d402ca737)) +* **main:** release 1.18.1 ([4b3efdc](https://github.com/terwer/siyuan-plugin-publisher/commit/4b3efdcfe206958bc6ccaed3444e8727d8395aa3)) +* **main:** release 1.18.10 ([80604e8](https://github.com/terwer/siyuan-plugin-publisher/commit/80604e8b5d080a859f1945f9965bfc3a2e207ba3)) +* **main:** release 1.18.11 ([0ef1921](https://github.com/terwer/siyuan-plugin-publisher/commit/0ef19216f6ce890e4f031b4a150c168c1628a63b)) +* **main:** release 1.18.12 ([2bce9c5](https://github.com/terwer/siyuan-plugin-publisher/commit/2bce9c531ce6096c8864fcea7797441f25019b45)) +* **main:** release 1.18.2 ([07baa0a](https://github.com/terwer/siyuan-plugin-publisher/commit/07baa0a618e7b2a13b0445396481f3eab818932f)) +* **main:** release 1.18.3 ([b957325](https://github.com/terwer/siyuan-plugin-publisher/commit/b957325aafc5a9cb60f53e9d6161623bbddd0b9b)) +* **main:** release 1.18.4 ([2380c6e](https://github.com/terwer/siyuan-plugin-publisher/commit/2380c6e075e1e6a60eb31716448d13e415192ab4)) +* **main:** release 1.18.5 ([f849233](https://github.com/terwer/siyuan-plugin-publisher/commit/f849233c7fdd81e90cfb7d60285d90e0805d4464)) +* **main:** release 1.18.6 ([b42f227](https://github.com/terwer/siyuan-plugin-publisher/commit/b42f227f9e9239d51c12bb8d6ddba8fce74311de)) +* **main:** release 1.18.7 ([e5527b9](https://github.com/terwer/siyuan-plugin-publisher/commit/e5527b946c02dae7511fd8f42e141134e130ecfd)) +* **main:** release 1.18.8 ([c62606a](https://github.com/terwer/siyuan-plugin-publisher/commit/c62606ad173da755bb2022344359d52d80f3cb5c)) +* **main:** release 1.18.9 ([edd0c58](https://github.com/terwer/siyuan-plugin-publisher/commit/edd0c58ce0ae0036b74a677d41dd9def3185e932)) +* merge [#780](https://github.com/terwer/siyuan-plugin-publisher/issues/780) ([ad93890](https://github.com/terwer/siyuan-plugin-publisher/commit/ad93890359d4278664613d48df0576713fdf570d)) +* 使用软链接构建项目,提升效率 ([c51abe8](https://github.com/terwer/siyuan-plugin-publisher/commit/c51abe8912a989f531b5c4b57a62ae32c2db63c4)) +* 兼容windows构建 ([d6939e9](https://github.com/terwer/siyuan-plugin-publisher/commit/d6939e9047ef74238dc906aecfbfe874a7b6e5ae)) +* 升级依赖 ([8ea2970](https://github.com/terwer/siyuan-plugin-publisher/commit/8ea2970ee4c6e1f71ec2d3a3c5614a507eb53aad)) +## [1.18.12](https://github.com/terwer/siyuan-plugin-publisher/compare/v1.18.11...v1.18.12) (2024-01-08) +## [1.18.11](https://github.com/terwer/siyuan-plugin-publisher/compare/v1.18.10...v1.18.11) (2023-12-03) +## [1.18.10](https://github.com/terwer/siyuan-plugin-publisher/compare/v1.18.9...v1.18.10) (2023-11-13) +## [1.18.9](https://github.com/terwer/siyuan-plugin-publisher/compare/v1.18.8...v1.18.9) (2023-11-13) +## [1.18.8](https://github.com/terwer/siyuan-plugin-publisher/compare/v1.18.7...v1.18.8) (2023-11-13) +## [1.18.7](https://github.com/terwer/siyuan-plugin-publisher/compare/v1.18.6...v1.18.7) (2023-11-09) +## [1.18.6](https://github.com/terwer/siyuan-plugin-publisher/compare/v1.18.5...v1.18.6) (2023-11-08) +## [1.18.5](https://github.com/terwer/siyuan-plugin-publisher/compare/v1.18.4...v1.18.5) (2023-11-07) +## [1.18.4](https://github.com/terwer/siyuan-plugin-publisher/compare/v1.18.3...v1.18.4) (2023-11-06) +## [1.18.3](https://github.com/terwer/siyuan-plugin-publisher/compare/v1.18.2...v1.18.3) (2023-11-05) +## [1.18.2](https://github.com/terwer/siyuan-plugin-publisher/compare/v1.18.1...v1.18.2) (2023-11-05) +## [1.18.1](https://github.com/terwer/siyuan-plugin-publisher/compare/v1.18.0...v1.18.1) (2023-11-04) +## [1.18.0](https://github.com/terwer/siyuan-plugin-publisher/compare/v1.17.3...v1.18.0) (2023-10-31) +## [1.17.3](https://github.com/terwer/siyuan-plugin-publisher/compare/v1.17.2...v1.17.3) (2023-10-12) +## [1.17.2](https://github.com/terwer/siyuan-plugin-publisher/compare/v1.17.1...v1.17.2) (2023-10-12) +## [1.17.1](https://github.com/terwer/siyuan-plugin-publisher/compare/v1.17.0...v1.17.1) (2023-10-11) +## [1.17.0](https://github.com/terwer/siyuan-plugin-publisher/compare/v1.16.0...v1.17.0) (2023-10-11) +## [1.16.0](https://github.com/terwer/siyuan-plugin-publisher/compare/v1.15.1...v1.16.0) (2023-10-10) +## [1.15.1](https://github.com/terwer/siyuan-plugin-publisher/compare/v1.15.0...v1.15.1) (2023-10-08) +## [1.15.0](https://github.com/terwer/siyuan-plugin-publisher/compare/v1.14.1...v1.15.0) (2023-09-21) +## [1.14.1](https://github.com/terwer/siyuan-plugin-publisher/compare/v1.14.0...v1.14.1) (2023-09-18) +## [1.14.0](https://github.com/terwer/siyuan-plugin-publisher/compare/v1.13.0...v1.14.0) (2023-09-14) ## [1.13.0](https://github.com/terwer/siyuan-plugin-publisher/compare/v1.12.0...v1.13.0) (2023-09-06) -* 微信公众号支持 cookie 认证 ([7816ca5](https://github.com/terwer/siyuan-plugin-publisher/commit/7816ca516b3c2630b4a0a635aa9ddb2416439dc7)) -* 微信公众号支持上传图片 ([2384e72](https://github.com/terwer/siyuan-plugin-publisher/commit/2384e72817b05058601351ed263c49b956a830cc)) -* 微信公众号文章发布form表单探索 ([9c6ab1b](https://github.com/terwer/siyuan-plugin-publisher/commit/9c6ab1b1f0f79cd52ec520dd9f161dfdb0e28db4)) -* 微信公众号文章文章更新 ([85e3668](https://github.com/terwer/siyuan-plugin-publisher/commit/85e3668d87bcac8c4fb3d69d495727050d0e5589)) -* 修复图床插件开启的时候csdn平台的图片问题 ([3eb68c0](https://github.com/terwer/siyuan-plugin-publisher/commit/3eb68c08253ca5db1d257797fee0c26837d306e5)) -* 修复部分文案错误 ([8267742](https://github.com/terwer/siyuan-plugin-publisher/commit/8267742b0fa964b4b0d1f7ea13158c39bf16b8bf)) -* 对不支持标签的平台隐藏标签设置 ([7ecfb23](https://github.com/terwer/siyuan-plugin-publisher/commit/7ecfb235c470129b0333057290a3aba71d053701)) -* 支持平台一键导入 ([1c8934e](https://github.com/terwer/siyuan-plugin-publisher/commit/1c8934ea1e9795ab816f914938d4159a155a9103)) ## [1.12.0](https://github.com/terwer/siyuan-plugin-publisher/compare/v1.11.3...v1.12.0) (2023-09-02) -* [#130](https://github.com/terwer/siyuan-plugin-publisher/issues/130) 支持发布到CSDN ([5566040](https://github.com/terwer/siyuan-plugin-publisher/commit/5566040934eddcc22d5d1480beab70294e994a28)) * 支持发布到csdn,完成授权验证 ([3f90230](https://github.com/terwer/siyuan-plugin-publisher/commit/3f90230106e5924401f8e50cfa91958053f8635a)) * 支持发布到csdn,支持csdn图床 ([958c34b](https://github.com/terwer/siyuan-plugin-publisher/commit/958c34bcdea1f8111097f86c91ddfce3477a1777)) * 支持发布到csdn,支持专栏 ([6086047](https://github.com/terwer/siyuan-plugin-publisher/commit/6086047a8afa7c66c3060a9cba27d1e4dc7b7075)) * 支持发布到csdn,支持文章发布、更新和删除 ([0e7eb52](https://github.com/terwer/siyuan-plugin-publisher/commit/0e7eb5260fd09f72fbbf75a5cf5c437a74e4272f)) -* 修复调试模式思源地址错误的问题 ([d97499d](https://github.com/terwer/siyuan-plugin-publisher/commit/d97499d8de545ef64bca21536ebeb17e05cf254f)) -* 重构项目结构 ([9629fbc](https://github.com/terwer/siyuan-plugin-publisher/commit/9629fbc2eab90cc613f7ade523045d6cd8cff7ea)) -* **deps-dev:** bump vite-plugin-node-polyfills from 0.11.3 to 0.12.0 ([b298b5f](https://github.com/terwer/siyuan-plugin-publisher/commit/b298b5fd2f51f86d5d0f13fa0adedba857eda965)) ## [1.11.3](https://github.com/terwer/siyuan-plugin-publisher/compare/v1.11.2...v1.11.3) (2023-08-31) -* [#435](https://github.com/terwer/siyuan-plugin-publisher/issues/435) 过滤掉思源剪藏插件的引用摘要 ([617be1d](https://github.com/terwer/siyuan-plugin-publisher/commit/617be1de671f2dc424784d6dab49b8152177bf60)) -* [#680](https://github.com/terwer/siyuan-plugin-publisher/issues/680) PC客户端多个工作空间情况下,自动读取思源地址 ([cd8a375](https://github.com/terwer/siyuan-plugin-publisher/commit/cd8a375d4abffc22ee5fe15f78fa43270be3b332)) -* [#692](https://github.com/terwer/siyuan-plugin-publisher/issues/692) 闪卡标记渲染成Markdown之后去除== ([0e1e7f1](https://github.com/terwer/siyuan-plugin-publisher/commit/0e1e7f1592291c340035c304ac98950fb012f2af)) -* 优化ai配置检测机制 ([02a243a](https://github.com/terwer/siyuan-plugin-publisher/commit/02a243aae5b85affba4145cd9178addf7649612d)) -* 修复yaml转换错误 ([53f7196](https://github.com/terwer/siyuan-plugin-publisher/commit/53f71967b18824206673a8b51fe5be38cd6db568)) -* 修复多个平台发布之后数据不一致的问题 ([fd9cfe7](https://github.com/terwer/siyuan-plugin-publisher/commit/fd9cfe702c38d021615c30567abb5a99735444b8)) ## [1.11.2](https://github.com/terwer/siyuan-plugin-publisher/compare/v1.11.1...v1.11.2) (2023-08-31) -* 优化一些属性合并逻辑 ([f8719c7](https://github.com/terwer/siyuan-plugin-publisher/commit/f8719c72986b8a0222434fed0596eb768d6870f8)) -* 修复yaml初始化未读取最新的问题 ([704241b](https://github.com/terwer/siyuan-plugin-publisher/commit/704241b8a99b8f5319706e05a342e6f83cc764d3)) -* 修复yaml初始化错误 ([0922fa6](https://github.com/terwer/siyuan-plugin-publisher/commit/0922fa6a9d7fa7ebfac02d63e10e3c99ecbdf541)) -* **deps-dev:** bump unplugin-vue-components from 0.25.1 to 0.25.2 ([1ba446a](https://github.com/terwer/siyuan-plugin-publisher/commit/1ba446a25ae7aa021bd4022e80e265bac726cb51)) -* 兼容windows构建 ([d6939e9](https://github.com/terwer/siyuan-plugin-publisher/commit/d6939e9047ef74238dc906aecfbfe874a7b6e5ae)) ## [1.11.1](https://github.com/terwer/siyuan-plugin-publisher/compare/v1.11.0...v1.11.1) (2023-08-30) -* hexo 深度优化 ([596c09e](https://github.com/terwer/siyuan-plugin-publisher/commit/596c09e251d55ae3fb19f36992814eedf5eb863e)) -* 优化单个文章的删除流程 ([453620f](https://github.com/terwer/siyuan-plugin-publisher/commit/453620f1c640c575fc370cf755af6cbf7507234f)) -* 修复yaml修改不生效的问题 ([ac21891](https://github.com/terwer/siyuan-plugin-publisher/commit/ac21891c7b04f66a433dfd8e1788811026663c92)) -* 新增强制删除 ([629c468](https://github.com/terwer/siyuan-plugin-publisher/commit/629c468b6ee5dd61e73acf4c82041363084c62d8)) ## [1.11.0](https://github.com/terwer/siyuan-plugin-publisher/compare/v1.10.3...v1.11.0) (2023-08-29) -* 支持gitlab ([06f71fb](https://github.com/terwer/siyuan-plugin-publisher/commit/06f71fb9f79eebb11a72d55cb78d70fa812d2180)) -* 支持选择知识空间 ([ab1a648](https://github.com/terwer/siyuan-plugin-publisher/commit/ab1a648bbf9b56341861774f24b9e7a8164e9ac5)) -* **deps:** bump zhi-github-middleware from 0.3.9 to 0.4.1 ([9e16094](https://github.com/terwer/siyuan-plugin-publisher/commit/9e160943cd7d51af27bb6b092d9fb62fdb417a88)) -* 修复 wordpress 摘要更新未生效的问题 ([65feeb2](https://github.com/terwer/siyuan-plugin-publisher/commit/65feeb267cc8f71f05da643aa9d85f0a0e8189d3)) ## [1.10.3](https://github.com/terwer/siyuan-plugin-publisher/compare/v1.10.2...v1.10.3) (2023-08-26) -* 摘要同步 ([f761572](https://github.com/terwer/siyuan-plugin-publisher/commit/f761572ab2c341e0179883c3980165103b12e6b1)) ## [1.10.2](https://github.com/terwer/siyuan-plugin-publisher/compare/v1.10.1...v1.10.2) (2023-08-25) -* **deps:** bump zhi-lib-base from 0.4.4 to 0.5.0 ([0388459](https://github.com/terwer/siyuan-plugin-publisher/commit/03884599b69f0be18034a8e7ef1eaa09a9950a97)) -* 优化ai指令 ([733f0cf](https://github.com/terwer/siyuan-plugin-publisher/commit/733f0cf3ddd56c9f24e8bf93c387d16e6b659ebb)) -* 优化token检测 ([d43f6b4](https://github.com/terwer/siyuan-plugin-publisher/commit/d43f6b4cd9f223584fa2195b7bb1148bf61eea57)) -* 优化配置 ([d85f950](https://github.com/terwer/siyuan-plugin-publisher/commit/d85f950bdc509a93eef0939caa317f92c6dc3f9a)) -* 修复ai提示字符超出问题 ([6f7af83](https://github.com/terwer/siyuan-plugin-publisher/commit/6f7af83d7ffac776766283bfadb9952a9a1b27e3)) -* 删除文章需移除属性 ([d9d624c](https://github.com/terwer/siyuan-plugin-publisher/commit/d9d624ca68665da20c5647783ee090a57c5f9b6a)) -* 回滚批量分发的覆盖与合并并进行优化 ([bb6f1e5](https://github.com/terwer/siyuan-plugin-publisher/commit/bb6f1e572ce72497caa4553fb5b5cd3cde6685ab)) ## [1.10.1](https://github.com/terwer/siyuan-plugin-publisher/compare/v1.10.0...v1.10.1) (2023-08-24) -* hexo 配置支持关闭永久链接 ([c085f76](https://github.com/terwer/siyuan-plugin-publisher/commit/c085f763059e09eaad9e24fa81ab7d1d6b5a86c0)) -* 修复批量分发属性错误问题 ([1101caf](https://github.com/terwer/siyuan-plugin-publisher/commit/1101caf2ec7845f40212dc5d4cd3ee92f59ac42c)) ## [1.10.0](https://github.com/terwer/siyuan-plugin-publisher/compare/v1.9.0...v1.10.0) (2023-08-23) -* ai 功能发布 ([ff837b0](https://github.com/terwer/siyuan-plugin-publisher/commit/ff837b0e5282a6994c1ac95689edc7eb1e161140)) -* ai集成 ([c701ce6](https://github.com/terwer/siyuan-plugin-publisher/commit/c701ce600f90c392fe9f07131e5a438374dabb6a)) -* ai集成-支持生成标题和生成摘要 ([2e48ca5](https://github.com/terwer/siyuan-plugin-publisher/commit/2e48ca5bfe9176ce9ead88ab3ee010dd063d5cdd)) * **deps:** bump siyuan from 0.8.0 to 0.8.1 ([98fb7e6](https://github.com/terwer/siyuan-plugin-publisher/commit/98fb7e616ac9e365b4ee74320ff555376ac28066)) * 修复yaml初始化失败问题 ([9ec4af8](https://github.com/terwer/siyuan-plugin-publisher/commit/9ec4af88547c02dec31f29f08a95fdbdb925fae4)) * 修复知识空间设置错误问题 ([4d558e9](https://github.com/terwer/siyuan-plugin-publisher/commit/4d558e9a8159d1443dedd80ad13e63fb550bbac3)) @@ -247,7 +375,6 @@ * 支持文章绑定 ([e3a92d0](https://github.com/terwer/siyuan-plugin-publisher/commit/e3a92d0d2d0e67d4e97cd864f5cd707c02f97610)) * fix typo ([94f77ba](https://github.com/terwer/siyuan-plugin-publisher/commit/94f77bab0e977166370a20861e2eb6c2c65751e5)) ## [1.4.1](https://github.com/terwer/siyuan-plugin-publisher/compare/v1.4.0...v1.4.1) (2023-08-07) -* 修复构建错误 ([32e8f61](https://github.com/terwer/siyuan-plugin-publisher/commit/32e8f61d193d0a979c4417653bc8b202b0be7b04)) ## [1.4.0](https://github.com/terwer/siyuan-plugin-publisher/compare/v1.3.2...v1.4.0) (2023-08-07) * hexo 平台设置 ([77950ed](https://github.com/terwer/siyuan-plugin-publisher/commit/77950ed45f0bf5eda4eed9a0afd1a3ba18a53c43)) * hexo 平台设置 - 增加 yaml 转换器 ([97a13ee](https://github.com/terwer/siyuan-plugin-publisher/commit/97a13ee2392ccbeacfe8f46dcd8a20e33b0ae7bf)) @@ -313,8 +440,11 @@ * 修复语雀客户端报错问题 ([1d72fff](https://github.com/terwer/siyuan-plugin-publisher/commit/1d72fff05cc93d5e66ec2da714e6a1f7fe2eb9d2)) * 新增 vercel 和 nginx 构建支持 ([6fda465](https://github.com/terwer/siyuan-plugin-publisher/commit/6fda465a9c1e1200c598ff3ba6f237424c24c623)) ## [1.1.1](https://github.com/terwer/siyuan-plugin-publisher/compare/v1.1.0...v1.1.1) (2023-08-01) +* 修改构建错误 ([0681ebd](https://github.com/terwer/siyuan-plugin-publisher/commit/0681ebd97572f2b6651a37c60e67669b8f9c563b)) ## [1.1.0](https://github.com/terwer/siyuan-plugin-publisher/compare/v1.0.0...v1.1.0) (2023-08-01) +* [#83](https://github.com/terwer/siyuan-plugin-publisher/issues/83) 多平台分发需要考虑同步更新思源笔记 ([103203d](https://github.com/terwer/siyuan-plugin-publisher/commit/103203d3ad867991f0d86909fcb82bcc2f0cd7ad)) * 仓库同步 ([7960387](https://github.com/terwer/siyuan-plugin-publisher/commit/7960387d1d11216d5bd072db4d26735cf277f048)) +* 插件挂件源码合并 https://github.com/terwer/sy-post-publisher/issues/89 https://github.com/terwer/siyuan-plugin-publisher/issues/522 ([c18023f](https://github.com/terwer/siyuan-plugin-publisher/commit/c18023f3c9c9a649e1d08a84d89673d29b2a29db)) * 整合挂件功能 ([61c83c7](https://github.com/terwer/siyuan-plugin-publisher/commit/61c83c756c965235eed576a3c6f4e75cee3972f9)) * 新增扩展菜单 ([6fb007d](https://github.com/terwer/siyuan-plugin-publisher/commit/6fb007df7b04ee212065eb2135903e01a2ab5637)) * 修复 cross-fetch 版本问题,必须使用 cross-fetch 3 ([69b33dc](https://github.com/terwer/siyuan-plugin-publisher/commit/69b33dca0f04da05113dab530e03b23d1082c2b8)) @@ -332,6 +462,7 @@ * **publisher-main:** 加载插件菜单 ([a621fbf](https://github.com/terwer/siyuan-plugin-publisher/commit/a621fbf722cc04f5a18adca71524e33a7b43d4ab)) * **publisher-main:** 集成 svelte 到插件 ([22b7b67](https://github.com/terwer/siyuan-plugin-publisher/commit/22b7b6776ebcf586420419fb55eb1e332d1b8fa6)) * 修改图标 ([25a750e](https://github.com/terwer/siyuan-plugin-publisher/commit/25a750ef9db8789b028641c6906b495cabacdeaa)) +* 兼容 siyuanhook ([a0017c3](https://github.com/terwer/siyuan-plugin-publisher/commit/a0017c39cf50e9960b4d459b5d66e622104dc0c4)) * 兼容挂件版 ([e6754fa](https://github.com/terwer/siyuan-plugin-publisher/commit/e6754fac6ebce00aaf74ee4dd1dbf15dc0f7a740)) * 发布工具插件版第一版-优化信息提示 ([69bd749](https://github.com/terwer/siyuan-plugin-publisher/commit/69bd7495bf1642e16815359e2bff6e12c640d68a)) * 发布工具插件版第一版-修改设置菜单 ([618415a](https://github.com/terwer/siyuan-plugin-publisher/commit/618415a1c561a9d284dd826b00126cdb4855774b)) @@ -373,6 +504,7 @@ * 引入 electron 工具类 ([d8bb857](https://github.com/terwer/siyuan-plugin-publisher/commit/d8bb857f17611e5321131ea27bb8d3ba5c38f0d5)) * 新增基本页面 ([7d275f7](https://github.com/terwer/siyuan-plugin-publisher/commit/7d275f7a91d7da11b307222925d7855fdb414232)) * 新增按钮菜单 ([664ac12](https://github.com/terwer/siyuan-plugin-publisher/commit/664ac12223e10f2f572cde4b3fff0dc5dffe7c2e)) +* 新增页面路由 ([a8cd654](https://github.com/terwer/siyuan-plugin-publisher/commit/a8cd6543413e8cd8d88bb443e9b915c509b2a470)) * 更新代码校验规则 ([1be577b](https://github.com/terwer/siyuan-plugin-publisher/commit/1be577b8842cc8772e50f3db2820c07b27913e97)) * 项目结构重构 ([1129f3d](https://github.com/terwer/siyuan-plugin-publisher/commit/1129f3d83e5bd297664bbd91e0d083af71ca1719)) * **deps-dev:** bump svelte from 3.59.2 to 4.1.2 ([03393d2](https://github.com/terwer/siyuan-plugin-publisher/commit/03393d2ec1a0373aea298dbfd685dd3e1fec8ff2)) diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md new file mode 100644 index 0000000..ee8a7ec --- /dev/null +++ b/DEVELOPMENT.md @@ -0,0 +1,74 @@ +# Development + +## Prerequisites + +```bash +pnpm install +``` + +## Development + +serve + +```bash +pnpm serve +``` + +dev + +```bash +pnpm dev -p siyuan +# siyuan plugin +# -d 默认 dist +# -t 默认 plugin +pnpm makeLink -p siyuan + +# -d 默认 widget +pnpm dev -p widget +# siyuan widget +pnpm makeLink -p widget -d widget -t widget + +# chrome extension +# -d 默认 chrome,实际地址是:extension/extension +pnpm dev -p chrome + +# firefox extension +# -d 默认 firefox,实际地址是:extension/firefox +pnpm dev -p firefox + +# nginx +# -d 默认 nginx +pnpm dev -p nginx +# ================================================ +# serve nginx +cd ./nginx +# npm i -g serve +serve -l 9000 -C +``` + +## Build + +```bash +pnpm package +``` + +artifacts structure + +``` +├── build + ├── package.zip + ├── package-widget.zip + ├── siyuan-plugin-publisher-1.19.1.zip + ├── siyuan-publisher-nginx-1.19.1 + ├── sy-post-publisher-chrome-1.19.1.zip + ├── sy-post-publisher-firefox-1.19.1.zip + └── sy-post-publisher-widget-1.19.1.zip +``` + +Note: vercel is also supported via `pnpm vercelBuild` + +## Sync to legacy widget repo + +```bash +pnpm syncWidgetRepo +``` \ No newline at end of file diff --git a/README.md b/README.md index 59e35af..3142179 100644 --- a/README.md +++ b/README.md @@ -4,100 +4,202 @@ ![](./icon.png) -Publish articles from siyuan-note to platforms such as Yuque, Notion, Cnblogs, WordPress, Typecho, Hexo, Zhihu and more. +Publish articles from siyuan-note to platforms like Yuque etc. `Free` and `open source`. -Support features such as fast publishing, image bed management, platform expansion, smart labels, etc. +If you're interested in the paid professional version, please check the paied +➡️ [Publishing Tool Professional Edition](https://github.com/terwer/siyuan-plugin-publisher-pro) -> Recent Bug Fix - Version `1.14.1` - - This updates have introduced a new feature: Notion now supports root page search. Additionally, we have fixed issues related to incorrect publishing on non-Github platforms and resolved the problem of default imports not importing WordPress. - - **If you have experienced issues with publishing in the past, this update should address your concerns. We recommend all users to upgrade.** +> The latest Publish Tool version `1.20.0` is released🎉, potentially one of the most revolutionary iterations since the +> inception of first releases👀. -> 🎉 I am pleased to announce the `1.14.0` release of Publish Tool. +- Notable inclusions within version `1.20.0` comprise the introduction of additional publishing platforms, an initial + foray into supporting the docker version, along with enhancements tailored to optimize user interactions. - - In this update, we have added several new platforms, including JianShu, Juejin, as well as Hugo, Jekyll, Vuepress, Vuepress2, and Vitepress. The latter platforms are also compatible with both `Github` and `Gitlab`. - - Oh, and in this version, the author secretly developed an import feature. You can quickly import predefined platforms using the `Settings` -> `Publish Settings` -> `Import Predefined Platforms` function 😄 + - The prominent features integrated into `1.20.0` encompass: -> Platform Limitations: - - **WeChat Official Accounts**: Publishing Tool now supports posting articles to the WeChat Official Accounts draft box in version `1.13.0` and beyond. However, due to limitations on the WeChat platform in Electron, normal login operations are not possible. Therefore, you will need to visit `https://mp.weixin.qq.com/` yourself, complete the login, copy the cookie, and then paste it into the configuration options. - - **Notion**: Since Notion is block-based, not a whole document, it is constrained by technology and does not support updates. To update, you can only delete and then repost it. - - **Juejin**: Due to the mandatory requirements of the Jujin platform, tags and classifications must be filled in, if you do not select publishing, a backend classification and programmer label will be added by default, otherwise you will not be able to publish. - - **Juejin**: **Juejin need to review every time they publish an article**, so the preview may be 404 immediately after publishing the article, at which point you can modify the link '/post' to '/spost' for temporary viewing, or wait patiently for the review to pass. + - #958 #1009 Experimental support for the docker edition of siyuan-note, marking a preliminary step towards its + implementation. Should anomalies surface during deployment, the extension welcomes the addition of GitHub + issues for resolution. + - **Please note: Unavailability of CORS proxy configuration will render the functionality inactive!!!** + - The image feature of the Picgo plugin is currently unavailable in the Docker version; support will be + introduced in 1.20.1. + - #1053 Introduction of the publishing platform telegra.ph + - **Please note: Unavailability of CORS proxy configuration will render the functionality inactive!!! + Furthermore, accessing article previews mandates circumventing restrictions via appropriate means.** + - For discussions on CORS proxy complications or other inquiries, feel free to engage in group discussions + or reach out to the author at youweics@163.com + - At present, only anonymous posting and updates are supported; login functionality will be incorporated in + version 1.20.1. + - #1054 Addition of article management capabilities + - Renamed article management as Dashboard. Feedback regarding nomenclature adjustments can be deliberated + via issues, facilitating responsive modifications by the author. + - Facilitation of displaying all platform publication icons + - Provision for exhibiting the count of publishing platforms + - Integration of filters for curated published articles -> [Click here](https://blog.terwer.space/s/20230810132040-nn4q7vs) to view the latest help documentation. + - `1.20.0` predominantly refines the following areas of focus: + + - Incorporation of development documentation alongside a preview of forthcoming version agendas + - Enhanced Plugin Store experience + - Streamlined import processes, now accommodating customized imports + - Exquisitely refined iteration of `sy-post-publisher widget + + - Furthermore, post the `1.14.0` version, the author discretely developed an import function. Users can swiftly + import built-in platforms through `Settings` -> `Publish Settings` -> `Import Platforms` feature 😄 + +> For further details, kindly [click here](https://blog.terwer.space/s/20230810132040-nn4q7vs) to peruse the latest help +> documentation. + +**Should you encounter any issues or wish to submit suggestions, feel free to join QQ group `895063267` for discussions. +** + +## Version Preview + +### 1.20.1-preview – As of Q1 2024 + +- Support picture upload form picgo via docker +- Expansion of telegra.ph support for image uploads + - Reference: https://www.npmjs.com/package/telegraph-uploader +- Support login for telegra.ph +- Rectification of scenarios entailing repetitive image uploads across select platforms +- Resolution of formatting discrepancies within WeChat public accounts +- #990 Rectification of irregular display issues while posting to Jian Shu +- #989 Failure in posting certain articles to Notion +- Rectifying error scenarios during posting to WeChat public accounts in certain contexts +- #948 #905 Corrections addressing halo platform-related concerns +- Addressing vuepress2 related issues + +### 1.21.0-preview – As of Q1 2024 + +- Inclusion of support for BiliBili and Xiaohongshu platforms + +### 1.22.0-preview – As of Q2 2024 + +- Embracing compatibility for Evernote and Antora (including GitHub and GitLab) + +### 1.23.0-preview – As of Q2 2024 + +- Enabling support for Docsify (inclusive of GitHub and GitLab) and Douban + +### 1.24.0-preview – As of Q2 2024 + +- Integration with flowus platform + +### 1.25.0-preview – As of Q2 2024 + +- Extending support to Xlog, mdnice, and zola platforms + +### 1.26.0-preview – As of Q3 2024 + +- Collaborative interactions with #956 and OceanPress ## Update history Please check [CHANGELOG](./CHANGELOG.MD) +## Development + +Please refer to [DEVELOPMENT](./DEVELOPMENT.md) + ## Platform List Names not listed in order -- [X] Yuque -- [X] Notion -- [X] Github - - [X] Hexo - - [X] Hugo - - [X] Jekyll - - [X] Vuepress - - [X] Vuepress2 - - [X] Vitepress -- [X] Gitlab - - [X] Gitlabhexo - - [X] Gitlabhugo - - [X] Gitlabjekyll - - [X] Gitlabvuepress - - [X] Gitlabvuepress2 - - [X] Gitlabvitepress -- [X] Metaweblog -- [X] Cnblogs -- [X] Typecho -- [X] WordPress -- [X] Zhihu -- [X] CSDN -- [X] Wechat -- [X] Jianshu -- [X] Juejin +| Type | Platform | Status | PC Client | PC Image Upload | Docker | Docker Image Upload | Note | +|:---------------------:|:-----------------------:|:------:|:--------------------:|:---------------:|:------------------------------------------------------:|:-------------------:|:----------------------------------------------------------:| +| Generic | Yuque | ✔ | Fully Compatible | ✔ | Partially Compatible | ❌ | [Official Website](https://yuque.com) | +| Generic | Notion | ✔ | Fully Compatible | ✔ | Partially Compatible | ❌ | [Official Website](https://www.notion.so) | +| Generic | Halo | ✔ | Fully Compatible | ✔ | Partially Compatible | ❌ | [Official Website](https://halo.run) | +| Generic | Evernote | TODO | TODO | TODO | TODO | TODO | [Official Website](https://www.evernote.com) | +| Generic | Github | ✔ | Fully Compatible | ✔ | Partially Compatible | ❌ | [Official Website](https://github.com) | +| Static Site Generator | Hexo | ✔ | Fully Compatible | ✔ | Partially Compatible | ❌ | [Official Website](https://hexo.io/zh-cn/) | +| Static Site Generator | Hugo | ✔ | Fully Compatible | ✔ | Partially Compatible | ❌ | [Official Website](https://gohugo.io/) | +| Static Site Generator | Jekyll | ✔ | Fully Compatible | ✔ | Partially Compatible | ❌ | [Official Website](https://jekyllrb.com/) | +| Static Site Generator | Vuepress | ✔ | Fully Compatible | ✔ | Partially Compatible | ❌ | [Official Website](https://vuepress.vuejs.org/) | +| Static Site Generator | Vuepress2 | ✔ | Fully Compatible | ✔ | Partially Compatible | ❌ | [Official Website](https://v2.vuepress.vuejs.org/) | +| Static Site Generator | Vitepress | ✔ | Fully Compatible | ✔ | Partially Compatible | ❌ | [Official Website](https://vitepress.vuejs.org/) | +| Static Site Generator | Antora | TODO | TODO | TODO | TODO | TODO | [Official Website](https://antora.org/) | +| Static Site Generator | Docsify | TODO | TODO | TODO | TODO | TODO | [Official Website](https://docsify.js.org/) | +| Git Hosting | Gitlab | ✔ | Fully Compatible | ✔ | Partially Compatible | ❌ | [Official Website](https://gitlab.com/) | +| Git Hosting | Gitlabhexo | ✔ | Fully Compatible | ✔ | Partially Compatible | ❌ | [Official Website](https://gitlab.com/) | +| Git Hosting | Gitlabhugo | ✔ | Fully Compatible | ✔ | Partially Compatible | ❌ | [Official Website](https://gitlab.com/) | +| Git Hosting | Gitlabjekyll | ✔ | Fully Compatible | ✔ | Partially Compatible | ❌ | [Official Website](https://gitlab.com/) | +| Git Hosting | Gitlabvuepress | ✔ | Fully Compatible | ✔ | Partially Compatible | ❌ | [Official Website](https://gitlab.com/) | +| Git Hosting | Gitlabvuepress2 | ✔ | Fully Compatible | ✔ | Partially Compatible | ❌ | [Official Website](https://gitlab.com/) | +| Git Hosting | Gitlabvitepress | ✔ | Fully Compatible | ✔ | Partially Compatible | ❌ | [Official Website](https://gitlab.com/) | +| Git Hosting | Gitlabantora | TODO | TODO | TODO | TODO | TODO | [Official Website](https://gitlab.com/) | +| Git Hosting | Gitlabdocsify | TODO | TODO | TODO | TODO | TODO | [Official Website](https://gitlab.com/) | +| Blog | Metaweblog | ✔ | Fully Compatible | ✔ | Partially Compatible | ❌ | [Official Website](http://xmlrpc.scripting.com/metaWeblog) | +| Blog | CnBlogs | ✔ | Fully Compatible | ✔ | Partially Compatible | ❌ | [Official Website](https://cnblogs.com) | +| Blog | Typecho | ✔ | Fully Compatible | ✔ | Partially Compatible | ❌ | [Official Website](https://typecho.org/) | +| Blog | Jvue | ✔ | Fully Compatible | ✔ | Partially Compatible | ❌ | [Official Website](https://github.com/terwer/jvue) | +| Blog | WordPress | ✔ | Fully Compatible | ✔ | Partially Compatible | ❌ | [Official Website](https://wordpress.org/) | +| Social Media | Zhihu | ✔ | Fully Compatible | ✔ | Partially Compatible, Requires PC Account Verification | ❌ | [Official Website](https://www.zhihu.com/) | +| Social Media | CSDN | ✔ | Fully Compatible | ✔ | Partially Compatible, Requires PC Account Verification | ❌ | [Official Website](https://www.csdn.net/) | +| Social Media | WeChat Official Account | ✔ | Fully Compatible | ✔ | Partially Compatible, Requires PC Account Verification | ❌ | [Official Website](https://mp.weixin.qq.com/) | +| Social Media | Jianshu | ✔ | Fully Compatible | ✔ | Partially Compatible, Requires PC Account Verification | ❌ | [Official Website](https://www.jianshu.com/) | +| Social Media | Juejin | ✔ | Fully Compatible | ✔ | Partially Compatible, Requires PC Account Verification | ❌ | [Official Website](https://juejin.cn/) | +| Community | 52pojie | TODO | TODO | TODO | TODO | TODO | [Official Website](https://www.52pojie.cn/) | +| Community | Bilibili | TODO | TODO | TODO | TODO | TODO | [Official Website](https://www.bilibili.com/) | +| Community | Xiaohongshu | TODO | TODO | TODO | TODO | TODO | [Official Website](https://www.xiaohongshu.com/) | +| Community | Douban | TODO | TODO | TODO | TODO | TODO | [Official Website](https://www.douban.com/) | +| Others | Xlog | TODO | TODO | TODO | TODO | TODO | [Official Website](https://xlog.cn/) | +| Others | Mdnice | TODO | TODO | TODO | TODO | TODO | [Official Website](https://mdnice.com/) | +| Others | Flowus | TODO | TODO | TODO | TODO | TODO | [Official Website](https://www.flowus.com/) | +| Others | telegra.ph | ✔ | Partially Compatible | ❌ | Partially Compatible | ❌ | [Official Website](https://telegra.ph) | ## Core Features - [X] **Rapid Publishing**: One-time configuration, one-click publishing. -- [X] **Image Hosting Management**: Integrated with PicGO image hosting, supports s3, minio, watermark plugins. Requires installation of [Picgo plugin](https://github.com/terwer/siyuan-plugin-picgo) from the marketplace. **Currently only available for PC client**. -- [X] **Extension Support**: Built on a unified blog API specification, with built-in metaweblogAPI, WordPress, Wechatsync, and Github support. Provides a unified adapter, theoretically extensible to any platform. +- [X] **Image Hosting Management**: Integrated with PicGO image hosting, supports s3, minio, watermark plugins. Requires + installation of [Picgo plugin](https://github.com/terwer/siyuan-plugin-picgo) from the marketplace. **Currently only + available for PC client**. +- [X] **Extension Support**: Built on a unified blog API specification, with built-in metaweblogAPI, WordPress, + Wechatsync, and Github support. Provides a unified adapter, theoretically extensible to any platform. - [X] **Platform Toggle**: Enable or disable all platforms. - [X] **Dynamic Addition**: Supports custom adding of platforms. - [X] **AI Integration**: Integrates freeform chat and context-based chat based on the current document. -- [X] **Intelligent Categorization**: Supports intelligent slug aliases, intelligent titles, intelligent summaries, intelligent tags, intelligent categories. -- [X] **Article Association**: Supports linking existing platform articles to SiYuan notes for convenient future management. Supports one-way synchronization from SiYuan to platforms. +- [X] **Intelligent Categorization**: Supports intelligent slug aliases, intelligent titles, intelligent summaries, + intelligent tags, intelligent categories. +- [X] **Article Association**: Supports linking existing platform articles to SiYuan notes for convenient future + management. Supports one-way synchronization from SiYuan to platforms. - [X] **Theme Adaptation**: Automatically adapts to dark mode and light mode. - [X] **Language Support**: Multi-language support, including Chinese and English versions. - [X] **Publishing Views**: Supports various publishing views - simple mode, detailed mode, and source code mode. -- [X] **Multiple Deployment Options**: Supports SiYuan Note plugin highly recommended, Chrome browser extension, and self-deployment. +- [X] **Multiple Deployment Options**: Supports SiYuan Note plugin highly recommended, Chrome browser + extension, and 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. +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. -> 🌹 Tips: This plugin is an upgraded version of the original 'Siyuan Note Publishing Tool' widget, which includes all the functions provided by the original widget, provides a convenient menu operation entry, and has carried out a series of problem fixes and experience optimizations. +> 🌹 Tips: This plugin is an upgraded version of the original 'Siyuan Note Publishing Tool' widget, which includes all +> the functions provided by the original widget, provides a convenient menu operation entry, and has carried out a +> series +> of problem fixes and experience optimizations. > -> 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. +> 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. +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] Multi-select classification - [X] Knowledge space - - [X] Single-choice knowledge space - - [X] Tree-shaped radio knowledge space + - [X] Single-choice knowledge space + - [X] Tree-shaped radio knowledge space - [X] tag - - [X] Multi-select tab + - [X] Multi-select tab - [X] Label alias - - [X] Radio label alias + - [X] Radio label alias ## Platform Adaptation Plan @@ -114,9 +216,11 @@ to [Latest Adaptation](https://terwergreen.feishu.cn/share/base/view/shrcnWT2IGI A1:Find **`Bazaar->Plugins->Publishing Tools`** to download and enable. - The installation process requires no further action. This is no different from the download and installation of other plugins. + The installation process requires no further action. This is no different from the download and installation of other + plugins. - After the installation is complete, find the ✈️ icon on the top right toolbar, click the menu, and follow the corresponding instructions to use it. + After the installation is complete, find the ✈️ icon on the top right toolbar, click the menu, and follow the + corresponding instructions to use it. * Q2:After installing the publishing tool plugin, do I still need to install the widget? @@ -129,16 +233,21 @@ to [Latest Adaptation](https://terwergreen.feishu.cn/share/base/view/shrcnWT2IGI A3:**Yes but not recommended.** - **We strongly recommend that you use the plug-in version directly, because the plug-in version will be the main version for long-term maintenance in the future, and the hanger version has been deprecated only as a fix for problems and compatible with historical users.** + **We strongly recommend that you use the plug-in version directly, because the plug-in version will be the main + version for long-term maintenance in the future, and the hanger version has been deprecated only as a fix for problems + and compatible with historical users.** * Q4:I used to use `Custom JS Fragment` or add `WidgetInvoke` directly, do I still need to download the plugin now? A4:**Optional.** But we highly recommended to remove JS snippets and widgets to download the plugin version. - If you don't want to use the plugin version, you don't need to download it, just use the original `custom JS fragment` or add `widget` to continue using. + If you don't want to use the plugin version, you don't need to download it, just use the original `custom JS fragment` + or add `widget` to continue using. - If you want to use the plugin version, then we strongly recommend that you delete the previously added `custom JS snippets` and `widgets`, download the plugin version directly, and enable it. No other additional action is required. + If you want to use the plugin version, then we strongly recommend that you delete the previously + added `custom JS snippets` and `widgets`, download the plugin version directly, and enable it. No other additional + action is required. * Q5:Is it possible to migrate my historical configuration data items to the plugin? @@ -151,7 +260,9 @@ to [Latest Adaptation](https://terwergreen.feishu.cn/share/base/view/shrcnWT2IGI * Q6:What should I do if the platform I need to publish is not provided by the publishing tool? -* A6:Reference: [Platform Adaptation Plan](https://github.com/terwer/siyuan-plugin-publisher/blob/main/README_zh_CN.md#platform-adaptation-plan "Platform Adaptation Plan") +* + +A6:Reference: [Platform Adaptation Plan](https://github.com/terwer/siyuan-plugin-publisher/blob/main/README_zh_CN.md#platform-adaptation-plan "Platform Adaptation Plan") ## Donate @@ -170,6 +281,10 @@ more useful tools~ alipay +### Afdian + +https://afdian.net/a/terwer + # Thanks - Thanks to the third-party framework for supporting the bottom layer of this project @@ -177,7 +292,7 @@ more useful tools~ Names not listed in order | Name | version |vendor| - |:-----------:|:-------:| :---------: | + |:-----------:|:-------:| :---------: | | turbo | 1.9+ |Vercel| | Vue | 3.3.4+ |Evan You| | Vite | 4.2+ |Evan You| @@ -188,15 +303,15 @@ more useful tools~ * Thanks to the enthusiastic support of the following users, I will continue to update and maintain the project! - - 2023-09-04 *Xia Donate to [Publish Tool] - - 2023-08-31 *Cheng Donate to [Publishing Tool] Thanks for providing the note posting tool, reminder change - - 2023-08-31 *? Donated to [Publish Tool] Thanks for providing the siyuan-note Publish Tool. - - 2023-08-14 *? Donated to [Publish Tool] - - 2023-08-10 *f Donated to [Publish Tool] for liking the release plugin. - - 2023-08-10 *2 Donated to [Publish Tool] to support the development of Source Release Plugin. - - 2023-07-13 *Liang Donated to [Document Alias] Is it possible to expand the functionality to H1? - - 2023-07-09 *z Donated to [Online Sharing] The online sharing plugin is great, thanks! - - 2023-06-14 *Jun Donated to [Document Roaming] Thanks for the Document Roaming feature. - - 2023-01-16 *Zhan Donated to [Import Tool] Finally, we can import epub files. - - If you do not want to display donation information, you can send an email directly to youweics@163.com. + - 2023-09-04 *Xia Donate to [Publish Tool] + - 2023-08-31 *Cheng Donate to [Publishing Tool] Thanks for providing the note posting tool, reminder change + - 2023-08-31 *? Donated to [Publish Tool] Thanks for providing the siyuan-note Publish Tool. + - 2023-08-14 *? Donated to [Publish Tool] + - 2023-08-10 *f Donated to [Publish Tool] for liking the release plugin. + - 2023-08-10 *2 Donated to [Publish Tool] to support the development of Source Release Plugin. + - 2023-07-13 *Liang Donated to [Document Alias] Is it possible to expand the functionality to H1? + - 2023-07-09 *z Donated to [Online Sharing] The online sharing plugin is great, thanks! + - 2023-06-14 *Jun Donated to [Document Roaming] Thanks for the Document Roaming feature. + - 2023-01-16 *Zhan Donated to [Import Tool] Finally, we can import epub files. + + If you do not want to display donation information, you can send an email directly to youweics@163.com. diff --git a/README_zh_CN.md b/README_zh_CN.md index 87e5d46..e7daeaa 100644 --- a/README_zh_CN.md +++ b/README_zh_CN.md @@ -4,79 +4,154 @@ ![](./icon.png) -将思源笔记的文章发布到语雀、Notion、Cnblogs、WordPress、Typecho、Hexo、知乎 等平台,支持极速发布、图床管理、平台扩展、智能标签等特色功能。 +将思源笔记的文章发布到语雀等平台,`开源`、`免费` 。 + +如果您对 [增值功能](https://github.com/terwer/siyuan-plugin-publisher/issues/846) 感兴趣,请移步 ➡️ +收费的 [发布工具专业版](https://github.com/terwer/siyuan-plugin-publisher-pro) + +> 最近的新版本:🎉 发布工具新版本 `1.20.0` 发布,可能是插件发布以来,革命性变更最大的版本之一👀 + +- `1.20.0` 新增部分发布平台,初步支持 docker 版本,同时对用户的使用体验进行了优化。 +- `1.20.0` 主要新增以下特性: + - #958 #1009 支持 docker 版本的思源笔记实验性 + - 此版本初步支持了 docker 版本的思源笔记,如果某些情况下发布异常,欢迎GitHub 新增 issue 反馈。 + - **注意:如果未配置 CORS 代理,功能将不可用!!!** + - Picgo 插件的图片功能目前在 docker 版本不可用,1.20.1 会支持 + - #1053 新增发布平台 telegra.ph + - **注意:如果未配置 CORS 代理,功能将不可用!!!,而且文章预览需要科学上网,请自行解决科学上网的问题。** + - CORS 代理问题可加群讨论或者私聊作者 youweics@163.com + - 目前仅支持匿名发布和更新,登录将在 1.20.1 实现 + - #1054 新增文章管理功能new + - 文章管理重命名为仪表盘。关于名称,可在 issue 讨论,作者会根据反馈进行调整。 + - 支持显示所有平台发布图标 + - 支持显示发布平台数量 + - 支持筛选已发布文章 +- `1.20.0` 主要优化以下方面: + - 新增开发文档,新增下版本开发计划预告 + - 优化插件商店体验new + - 优化导入体验,现在支持自定义导入了实验性 + - 深度优化挂件版本 +- 咳咳,另外,在 `1.14.0` 版本之后,作者还悄悄开发了导入功能。您可以使用 `设置` -> `发布设置` -> `平台导入` 功能快速导入内置平台 + 😄 -> 最近的Bug修复 `1.14.1` - - 本次更新新增了特性:notion支持根页面搜索。同时修复了非Github平台发布错误的问题以及修复一键导入平台时未导入WordPress的问题。 - - **如果您之前出现无法发布的问题,那么本次更新应该能解决您的问题,建议所有用户升级。** +> [猛击这里](https://blog.terwer.space/s/20230810132040-nn4q7vs),查看最新帮助文档。 -> 最近的新特性版本:🎉 发布工具新版本 `1.14.0` 发布 +**遇到其他问题或者需求建议?请加 QQ 群 `895063267` 讨论。** - - 本次更新新增多个平台,包括简书、掘金以及 Hugo、Jekyll、Vuepress、Vuepress2、Vitepress,后面几个平台同时兼容 `Github` 和 `Gitlab` - - 咳咳,另外,在本版本中,作者还悄悄开发了导入功能。您可以使用 `设置` -> `发布设置` -> `导入预定义平台` 功能快速导入内置平台😄 +## 版本预告 -> 平台限制说明 +### 1.20.1-preview - 截止到 2024 年 Q1 - - 所有平台:发布工具每次都会获取思源笔记最新编辑的正文进行覆盖发布。每次发布都会覆盖正文,每次发布都会覆盖正文,每次发布都会覆盖正文。因此,请勿在平台自行修改正文。 - - **微信公众号**:目前,发布工具在 `1.13.0+` 已经支持发布文章到微信公众号草稿箱。但是由于微信平台在 Electron 上有限制,无法正常进行登录操作。因此,只能自己访问 `https://mp.weixin.qq.com/` ,登录完成之后,复制cookie然后粘贴到配置选项。 - - **Notion**: 由于Notion是基于块的,不是整篇文档,受限于技术,notion不支持更新。如需更新,目前只能删除后重新发布。 - - **掘金**:由于掘金平台强制要求,必须填写标签和分类,如果发布不选择默认会加上一个后端分类、程序员标签,否则将无法发布。 - - **掘金**:**掘金每次发布文章都需要审核** ,因此发布文章之后马上预览可能会404,此时可修改链接的 `/post` 为 `/spost` 临时查看,或者耐心等待审核通过。 +- docker 版本支持 Picgo 插件上传图片 +- telegra.ph 支持上传图片 + - 参考 https://www.npmjs.com/package/telegraph-uploader +- 支持 telegra.ph 登录 +- 解决部分平台在某些场景下重复上传图片的问题 +- 修复微信公众号排版问题 +- #990 修复发布到简书时部分格式显示不正常的问题 +- #989 部分文章发布到 Notion 失败 +- 修复部分场景发布到微信公众号报错的问题 +- #948 #905 halo 平台相关问题修复 +- vuepress2 相关问题 -**遇到问题或者需求建议?请加QQ群 `895063267` 讨论。或者查看下面的在线文档:** +### 1.21.0-preview - 截止到 2024 年 Q1 -> [猛击这里](https://blog.terwer.space/s/20230810132040-nn4q7vs),查看最新帮助文档。 +- 支持 B 站、小红书 + +### 1.22.0-preview - 截止到 2024 年 Q2 + +- 支持 Evernote、Antora(包括 GitHub 和 gitlab) + +### 1.23.0-preview - 截止到 2024 年 Q2 + +- 支持 Docsify(包括 GitHub 和 gitlab)、Douban + +### 1.24.0-preview - 截止到 2024 年 Q2 + +- 支持 flowus + +### 1.25.0-preview - 截止到 2024 年 Q2 + +- 支持 Xlog、mdnice、zola + +### 1.26.0-preview - 截止到 2024 年 Q3 + +- #956 和 OceanPress 联动 ## 更新历史 请直接查看 [CHANGELOG](./CHANGELOG.md) +## 开发 + +请参考 [DEVELOPMENT](./DEVELOPMENT.md) + ## 平台列表 排名不分先后 -- [X] 语雀 -- [X] Notion -- [X] Github - - [X] Hexo - - [X] Hugo - - [X] Jekyll - - [X] Vuepress - - [X] Vuepress2 - - [X] Vitepress -- [X] Gitlab - - [X] Gitlabhexo - - [X] Gitlabhugo - - [X] Gitlabjekyll - - [X] Gitlabvuepress - - [X] Gitlabvuepress2 - - [X] Gitlabvitepress -- [X] Metaweblog -- [X] 博客园 -- [X] Typecho -- [X] WordPress -- [X] 知乎 -- [X] CSDN -- [X] 微信公众号 -- [X] 简书 -- [X] 掘金 +| 类型 | 平台 | 状态 | PC 客户端 | PC 图片上传 | Docker | Docker 图片上传 | 备注 | +|:-------:|:---------------:|:----:|:------:|:-------:|:---------------:|:-----------:|:--------------------------------------------:| +| 通用 | 语雀 | ✔ | 完全兼容 | ✔ | 部分兼容 | ✖ | [官网](https://yuque.com) | +| 通用 | Notion | ✔ | 完全兼容 | ✔ | 部分兼容 | ✖ | [官网](https://www.notion.so) | +| 通用 | Halo | ✔ | 完全兼容 | ✔ | 部分兼容 | ✖ | [官网](https://halo.run) | +| 通用 | 印象笔记 | TODO | TODO | TODO | TODO | TODO | [官网](https://www.yinxiang.com) | +| 通用 | Github | ✔ | 完全兼容 | ✔ | 部分兼容 | ✖ | [官网](https://github.com) | +| 静态网站生成器 | Hexo | ✔ | 完全兼容 | ✔ | 部分兼容 | ✖ | [官网](https://hexo.io/zh-cn/) | +| 静态网站生成器 | Hugo | ✔ | 完全兼容 | ✔ | 部分兼容 | ✖ | [官网](https://gohugo.io/) | +| 静态网站生成器 | Jekyll | ✔ | 完全兼容 | ✔ | 部分兼容 | ✖ | [官网](https://jekyllrb.com/) | +| 静态网站生成器 | Vuepress | ✔ | 完全兼容 | ✔ | 部分兼容 | ✖ | [官网](https://vuepress.vuejs.org/) | +| 静态网站生成器 | Vuepress2 | ✔ | 完全兼容 | ✔ | 部分兼容 | ✖ | [官网](https://v2.vuepress.vuejs.org/) | +| 静态网站生成器 | Vitepress | ✔ | 完全兼容 | ✔ | 部分兼容 | ✖ | [官网](https://vitepress.vuejs.org/) | +| 静态网站生成器 | Antora | TODO | TODO | TODO | TODO | TODO | [官网](https://antora.org/) | +| 静态网站生成器 | Docsify | TODO | TODO | TODO | TODO | TODO | [官网](https://docsify.js.org/) | +| Git 托管 | Gitlab | ✔ | 完全兼容 | ✔ | 部分兼容 | ✖ | [官网](https://gitlab.com/) | +| Git 托管 | Gitlabhexo | ✔ | 完全兼容 | ✔ | 部分兼容 | ✖ | [官网](https://gitlab.com/) | +| Git 托管 | Gitlabhugo | ✔ | 完全兼容 | ✔ | 部分兼容 | ✖ | [官网](https://gitlab.com/) | +| Git 托管 | Gitlabjekyll | ✔ | 完全兼容 | ✔ | 部分兼容 | ✖ | [官网](https://gitlab.com/) | +| Git 托管 | Gitlabvuepress | ✔ | 完全兼容 | ✔ | 部分兼容 | ✖ | [官网](https://gitlab.com/) | +| Git 托管 | Gitlabvuepress2 | ✔ | 完全兼容 | ✔ | 部分兼容 | ✖ | [官网](https://gitlab.com/) | +| Git 托管 | Gitlabvitepress | ✔ | 完全兼容 | ✔ | 部分兼容 | ✖ | [官网](https://gitlab.com/) | +| Git 托管 | Gitlabantora | TODO | TODO | TODO | TODO | TODO | [官网](https://gitlab.com/) | +| Git 托管 | Gitlabdocsify | TODO | TODO | TODO | TODO | TODO | [官网](https://gitlab.com/) | +| 博客 | Metaweblog | ✔ | 完全兼容 | ✔ | 部分兼容 | ✖ | [官网](http://xmlrpc.scripting.com/metaWeblog) | +| 博客 | CnBlogs | ✔ | 完全兼容 | ✔ | 部分兼容 | ✖ | [官网](https://cnblogs.com) | +| 博客 | Typecho | ✔ | 完全兼容 | ✔ | 部分兼容 | ✖ | [官网](https://typecho.org/) | +| 博客 | Jvue | ✔ | 完全兼容 | ✔ | 部分兼容 | ✖ | [官网](https://github.com/terwer/jvue) | +| 博客 | WordPress | ✔ | 完全兼容 | ✔ | 部分兼容 | ✖ | [官网](https://wordpress.org/) | +| 社交媒体 | 知乎 | ✔ | 完全兼容 | ✔ | 部分兼容,需 PC 端账号验证 | ✖ | [官网](https://www.zhihu.com/) | +| 社交媒体 | CSDN | ✔ | 完全兼容 | ✔ | 部分兼容,需 PC 端账号验证 | ✖ | [官网](https://www.csdn.net/) | +| 社交媒体 | 微信公众号 | ✔ | 完全兼容 | ✔ | 部分兼容,需 PC 端账号验证 | ✖ | [官网](https://mp.weixin.qq.com/) | +| 社交媒体 | 简书 | ✔ | 完全兼容 | ✔ | 部分兼容,需 PC 端账号验证 | ✖ | [官网](https://www.jianshu.com/) | +| 社交媒体 | 掘金 | ✔ | 完全兼容 | ✔ | 部分兼容,需 PC 端账号验证 | ✖ | [官网](https://juejin.cn/) | +| 社区 | 52破解 | TODO | TODO | TODO | TODO | TODO | [官网](https://www.52pojie.cn/) | +| 社区 | Bilibili | TODO | TODO | TODO | TODO | TODO | [官网](https://www.bilibili.com/) | +| 社区 | 小红书 | TODO | TODO | TODO | TODO | TODO | [官网](https://www.xiaohongshu.com/) | +| 社区 | 豆瓣 | TODO | TODO | TODO | TODO | TODO | [官网](https://www.douban.com/) | +| 其他 | Xlog | TODO | TODO | TODO | TODO | TODO | [官网](https://xlog.cn/) | +| 其他 | Mdnice | TODO | TODO | TODO | TODO | TODO | [官网](https://mdnice.com/) | +| 其他 | Flowus | TODO | TODO | TODO | TODO | TODO | [官网](https://www.flowus.com/) | +| 其他 | telegra.ph | ✔ | 部分兼容 | ✖ | 部分兼容 | ✖ | [官网](https://telegra.ph) | ## 核心特色 -- [X] **极速发布**:一次配置,一键发布 -- [X] **图床管理**:集成 PicGO 图床,支持 s3、minio、水印插件,需要在集市安装 [Picgo插件](https://github.com/terwer/siyuan-plugin-picgo) ,**目前仅支持PC客户端** -- [X] **支持扩展**:基于统一的博客 API 规范,内置 metaweblogAPI 、 WordPress 、Wechatsync 和 Github 支持,并提供了统一的适配器,理论上可支持扩展到任何平台 -- [X] **平台开关**:所有平台均支持启用禁用 -- [X] **动态新增**:支持自定义添加平台 -- [X] **AI集成**:集成自由聊天和基于当前文档上下文的聊天 -- [X] **智能分类**:支持智能 slug 别名、智能标题、智能摘要、智能标签、智能分类 -- [X] **文章绑定**:支持关联已有的平台文章到思源笔记,方便后续管理,支持思源-> 平台单向同步 -- [X] **适应主题**:自动适配暗黑模式与浅色模式 -- [X] **语言支持**:多语言支持,支持中文版和英文版 -- [X] **发布视图**:支持多种发布视图,简单模式、详细模式和源码模式 -- [X] **多种部署**:支持思源笔记插件强烈推荐、Chrome 浏览器扩展、自部署 - -本插件承诺,**插件本身的基础功能永久免费** ,第三方平台提供的相关服务的可能需要自己注册账号或者购买服务。如果您想支持开发者,请在这里 [随意打赏](https://github.com/terwer/siyuan-plugin-publisher/blob/main/README_zh_CN.md#捐赠)。 +- [x] **极速发布**:一次配置,一键发布 +- [x] **图床管理**:集成 PicGO 图床,支持 + s3、minio、水印插件,需要在集市安装 [Picgo 插件](https://github.com/terwer/siyuan-plugin-picgo) ,**目前仅支持 PC 客户端** +- [x] **支持扩展**:基于统一的博客 API 规范,内置 metaweblogAPI 、 WordPress 、Wechatsync 和 Github + 支持,并提供了统一的适配器,理论上可支持扩展到任何平台 +- [x] **平台开关**:所有平台均支持启用禁用 +- [x] **动态新增**:支持自定义添加平台 +- [x] **AI 集成**:集成自由聊天和基于当前文档上下文的聊天 +- [x] **智能分类**:支持智能 slug 别名、智能标题、智能摘要、智能标签、智能分类 +- [x] **文章绑定**:支持关联已有的平台文章到思源笔记,方便后续管理,支持思源-> 平台单向同步 +- [x] **适应主题**:自动适配暗黑模式与浅色模式 +- [x] **语言支持**:多语言支持,支持中文版和英文版 +- [x] **发布视图**:支持多种发布视图,简单模式、详细模式和源码模式 +- [x] **多种部署**:支持思源笔记插件强烈推荐、Chrome 浏览器扩展、自部署 + +本插件承诺,**插件本身的基础功能永久免费** +,第三方平台提供的相关服务的可能需要自己注册账号或者购买服务。如果您想支持开发者,请在这里 [随意打赏](https://github.com/terwer/siyuan-plugin-publisher/blob/main/README_zh_CN.md#捐赠)。 > 🌹 温馨提示:这个插件是原 `思源笔记发布工具` 挂件的插件升级版,功能包含原有挂件提供的所有功能,同时提供了方便的菜单操作入口,并进行了一系列问题修复和体验优化。 > @@ -88,18 +163,21 @@ ## 支持的分类体系 -- [X] 分类 - - [X] 多选分类 +- [x] 分类 + + - [x] 多选分类 -- [X] 知识空间 - - [X] 单选知识空间 - - [X] 树形单选知识空间 +- [x] 知识空间 -- [X] 标签 - - [X] 多选标签 + - [x] 单选知识空间 + - [x] 树形单选知识空间 -- [X] 标签别名 - - [X] 单选标签别名 +- [x] 标签 + + - [x] 多选标签 + +- [x] 标签别名 + - [x] 单选标签别名 ## 平台适配计划 @@ -110,7 +188,7 @@ ## FAQ -* Q1:发布工具插件怎么安装?安装之后在哪里找到他的入口? +- Q1:发布工具插件怎么安装?安装之后在哪里找到他的入口? A1:找到 **`集市->插件->发布工具`** 下载启用即可。 @@ -118,19 +196,19 @@ 安装完成后,在顶部右侧工具栏找到 ✈️ 图标,点击菜单,按照对应说明操作使用即可。 -* Q2:装了发布工具插件之后,还需要安装挂件吗? +- Q2:装了发布工具插件之后,还需要安装挂件吗? A2:**不需要。** 插件版包含挂件版的所有功能。 -* Q3:我不习惯新版操作,想继续使用以前的挂件,可以吗? +- Q3:我不习惯新版操作,想继续使用以前的挂件,可以吗? A3:**可以但是不推荐。** **我们强烈推荐您直接使用插件版,因为插件版将是以后长久维护的主要版本,挂架版本已废弃,仅作为修复问题以及兼容历史用户。** -* Q4:我以前是通过 `自定义JS片段 ` 或者 直接添加 `挂件` 来使用的,现在还需要下载该插件吗? +- Q4:我以前是通过 `自定义JS片段 ` 或者 直接添加 `挂件` 来使用的,现在还需要下载该插件吗? A4:**可选。** 但是我们强烈推荐您删除 JS 片段和挂件,下载插件版使用。 @@ -138,15 +216,17 @@ 如果您想使用插件版,那么我们强烈建议您删除之前添加的 `自定义JS片段` 和 `挂件`,直接下载插件版,启用即可。无需其他额外操作。 -* Q5:我的历史配置数据项迁移到插件,可以吗? -* A5:**可以。** 注意:数据迁移将在后续版本提供。 +- Q5:我的历史配置数据项迁移到插件,可以吗? +- A5:**可以。** 注意:数据迁移将在后续版本提供。 请在 `发布设置->检测并迁移历史配置。` 操作。 注意:挂件版配置数据导入仅支持 `sy-p-cfg-v0.8.1.json` 。 -* Q6:我需要发布的平台,发布工具没有提供怎么办? -* A6:参考:[平台适配计划](https://github.com/terwer/siyuan-plugin-publisher/blob/main/README_zh_CN.md#平台适配计划 "平台适配计划") +- Q6:我需要发布的平台,发布工具没有提供怎么办? +- + +A6:参考:[平台适配计划](https://github.com/terwer/siyuan-plugin-publisher/blob/main/README_zh_CN.md#平台适配计划 "平台适配计划") ## 捐赠 @@ -164,33 +244,37 @@ alipay +### 爱发电 + +https://afdian.net/a/terwer + # 感谢 - 感谢第三方框架对本项目底层的支持 - - 排名不分先后 - - | Name | version |vendor| - |:-----------:|:-------:| :---------: | - | turbo | 1.9+ |Vercel| - | Vue | 3.3.4+ |Evan You| - | Vite | 4.2+ |Evan You| - | TypeScript | 5.0+ |Microsoft| - | siyuan-note | 2.9.0+ |D,V| - -* 感谢 [leolee9086](https://github.com/leolee9086) 和 [赐我一胖]() 提供的图标资源 - -* 感谢以下热心用户的支持,我会坚持一直持续更新维护下去! - - - 2023-09-04 *霞 捐赠到 [发布工具] - - 2023-08-31 *成 捐赠到 [发布工具] 感谢提供笔记发布工具,催更 - - 2023-08-31 *? 捐赠到 [发布工具] 感谢提供思源笔记发布工具 - - 2023-08-14 *? 捐赠到 [发布工具] - - 2023-08-10 *f 捐赠到 [发布工具] 为发布插件点赞 - - 2023-08-10 *2 捐赠到 [发布工具] 支持开发思源发布插件 - - 2023-07-13 *亮 捐赠到 [文档别名] 有没有可能把功能扩展到H1? - - 2023-07-09 *z 捐赠到 [在线分享] 在线分享插件好用,感谢 - - 2023-06-14 *俊 捐赠到 [文档漫游] 感谢文档漫游这个功能 - - 2023-01-16 *站 捐赠到 [导入工具] 终于可以导入epub了 - - 如果您不想展示捐赠信息,可直接发邮件到 youweics@163.com 。 +感谢第三方框架对本项目底层的支持 + +排名不分先后 + +| Name | version | vendor | +|:-----------:|:-------:|:---------:| +| turbo | 1.9+ | Vercel | +| Vue | 3.3.4+ | Evan You | +| Vite | 4.2+ | Evan You | +| TypeScript | 5.0+ | Microsoft | +| siyuan-note | 2.9.0+ | D,V | + +- 感谢 [leolee9086](https://github.com/leolee9086) 和 [赐我一胖]() 提供的图标资源 + +- 感谢以下热心用户的支持,我会坚持一直持续更新维护下去! + + - 2023-09-04 \*霞 捐赠到 [发布工具] + - 2023-08-31 \*成 捐赠到 [发布工具] 感谢提供笔记发布工具,催更 + - 2023-08-31 \*? 捐赠到 [发布工具] 感谢提供思源笔记发布工具 + - 2023-08-14 \*? 捐赠到 [发布工具] + - 2023-08-10 \*f 捐赠到 [发布工具] 为发布插件点赞 + - 2023-08-10 \*2 捐赠到 [发布工具] 支持开发思源发布插件 + - 2023-07-13 \*亮 捐赠到 [文档别名] 有没有可能把功能扩展到 H1? + - 2023-07-09 \*z 捐赠到 [在线分享] 在线分享插件好用,感谢 + - 2023-06-14 \*俊 捐赠到 [文档漫游] 感谢文档漫游这个功能 + - 2023-01-16 \*站 捐赠到 [导入工具] 终于可以导入 epub 了 + + 如果您不想展示捐赠信息,可直接发邮件到 youweics@163.com 。 diff --git a/auto-imports.d.ts b/auto-imports.d.ts index 1d89ee8..d7d6df6 100644 --- a/auto-imports.d.ts +++ b/auto-imports.d.ts @@ -5,5 +5,6 @@ // Generated by unplugin-auto-import export {} declare global { - + const ElMessage: typeof import('element-plus/es')['ElMessage'] + const ElMessageBox: typeof import('element-plus/es')['ElMessageBox'] } diff --git a/cross/crossPageUtils.spec.ts b/cross/crossPageUtils.spec.ts new file mode 100644 index 0000000..e60916c --- /dev/null +++ b/cross/crossPageUtils.spec.ts @@ -0,0 +1,34 @@ +/* + * 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 { describe, it } from "vitest" +import CrossPageUtils from "./crossPageUtils" + +describe("test crossPageUtils", () => { + it("test subPlatformName", () => { + const result = CrossPageUtils.subPlatformName("Gitlabvuepress2", 11) + console.log(result) + }) +}) diff --git a/cross/crossPageUtils.ts b/cross/crossPageUtils.ts new file mode 100644 index 0000000..8d1e6dc --- /dev/null +++ b/cross/crossPageUtils.ts @@ -0,0 +1,82 @@ +/* + * 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 { StrUtil } from "zhi-common" + +/** + * 页面辅助函数 + * + * @author terwer + * @since 1.18.0 + */ +class CrossPageUtils { + /** + * 缩略展示平台名称 + * + * @param platformName + * @param length + */ + public static subPlatformName(platformName: string, length?: number) { + if (StrUtil.isEmptyString(platformName)) { + return "" + } + if (!platformName.includes("_")) { + return this.shortPlatformName(platformName, length ?? 9) + } + return StrUtil.upperFirst(StrUtil.getByLength(platformName.split("_")[1], length ?? 9)) + } + + /** + * 缩略展示平台名称 + * + * @param platformName + * @param length + */ + public static shortPlatformName(platformName: string, length?: number) { + if (StrUtil.isEmptyString(platformName)) { + return "" + } + return StrUtil.upperFirst(StrUtil.getByLength(platformName.replace("Gitlab", ""), length ?? 9)) + } + + /** + * 缩略展示平台名称 + * + * @param platformName + * @param length + */ + public static longPlatformName(platformName: string, length?: number) { + if (StrUtil.isEmptyString(platformName)) { + return "" + } + const shortName = StrUtil.upperFirst(StrUtil.getByLength(platformName.replace("Gitlab", ""), length ?? 9)) + if (platformName.includes("Gitlab")) { + return `Gitlab-${shortName}` + } + return shortName + } +} + +export default CrossPageUtils diff --git a/custom.d.ts b/custom.d.ts index 0b66d57..7376015 100644 --- a/custom.d.ts +++ b/custom.d.ts @@ -23,4 +23,7 @@ * questions. */ -declare module "zhi-notion-markdown" \ No newline at end of file +declare module "zhi-notion-markdown" +declare module "uuid" +declare module "cookie-parse" +declare module "telegraph.md" \ No newline at end of file diff --git "a/docs/\344\272\272\345\267\245\346\231\272\350\203\275.md" "b/docs/\344\272\272\345\267\245\346\231\272\350\203\275.md" index e69de29..8cbcef0 100644 --- "a/docs/\344\272\272\345\267\245\346\231\272\350\203\275.md" +++ "b/docs/\344\272\272\345\267\245\346\231\272\350\203\275.md" @@ -0,0 +1,3 @@ +## 人工智能 + +入口地址为:/#/manage \ No newline at end of file diff --git "a/docs/\344\275\277\347\224\250\346\214\207\345\215\227.md" "b/docs/\344\275\277\347\224\250\346\214\207\345\215\227.md" new file mode 100644 index 0000000..a6a59f8 --- /dev/null +++ "b/docs/\344\275\277\347\224\250\346\214\207\345\215\227.md" @@ -0,0 +1,3 @@ +# 使用指南 + +请参考 []() \ No newline at end of file diff --git "a/docs/\345\217\221\345\270\203\350\256\276\347\275\256.md" "b/docs/\345\217\221\345\270\203\350\256\276\347\275\256.md" new file mode 100644 index 0000000..3ae420a --- /dev/null +++ "b/docs/\345\217\221\345\270\203\350\256\276\347\275\256.md" @@ -0,0 +1,9 @@ +# 发布设置 + +## 发布设置 + +入口地址为:/#/manage + +## 偏好设置 + +入口地址为:/#/manage \ No newline at end of file diff --git "a/docs/\345\270\270\350\247\204\345\217\221\345\270\203.md" "b/docs/\345\270\270\350\247\204\345\217\221\345\270\203.md" index e69de29..f9dd709 100644 --- "a/docs/\345\270\270\350\247\204\345\217\221\345\270\203.md" +++ "b/docs/\345\270\270\350\247\204\345\217\221\345\270\203.md" @@ -0,0 +1,3 @@ +## 常规发布 + +入口地址为:/#/manage \ No newline at end of file diff --git "a/docs/\346\211\271\351\207\217\345\210\206\345\217\221.md" "b/docs/\346\211\271\351\207\217\345\210\206\345\217\221.md" index e69de29..6d2de54 100644 --- "a/docs/\346\211\271\351\207\217\345\210\206\345\217\221.md" +++ "b/docs/\346\211\271\351\207\217\345\210\206\345\217\221.md" @@ -0,0 +1,3 @@ +## 批量分发 + +入口地址为:/#/manage \ No newline at end of file diff --git "a/docs/\346\217\222\344\273\266\345\274\200\345\217\221.md" "b/docs/\346\217\222\344\273\266\345\274\200\345\217\221.md" index de97488..cff2dbb 100644 --- "a/docs/\346\217\222\344\273\266\345\274\200\345\217\221.md" +++ "b/docs/\346\217\222\344\273\266\345\274\200\345\217\221.md" @@ -10,21 +10,41 @@ - Custom - System -新增大类的时候需要维护 +## 新增大类的时候需要维护(内部维护) - DynamicJsonCfg - getSubtypeList - setDynamicJsonCfg -- src/utils/import/pre.ts +- src/platforms/pre.ts ## API授权插件开发指南 +1. 确定大类。例如:Halo属于Common +2. 新建子类别。例如:src/platforms/dynamicConfig.ts里面的SubPlatformType加一个Common_CSDN +3. 注册子类别,需要修改 + - getSubtypeList + - src/platforms/pre.ts +4. 新增适配器 + API授权需要再 src/adaptors/api 新建文件。例如 + - HaloApiAdaptor 需要继承 BaseBlogApi + - HaloConfig 需要继承 CommonBlogConfig + - HaloPlaceholder 需要继承 CommonBlogPlaceholder + - useHaloApi 定义 const useHaloApi = async (key: string, newCfg?: HaloConfig) => {} + +5. 注册适配器 + 适配器 src/adaptors/index.ts getCfg + 配置 src/adaptors/index.ts getAdaptor + YAML适配器(不一定有) +6. 开启配置页面 + 在 src/components/set/publish/singleplatform/SingleSettingIndex.vue 注册配置 +7. 修改图片上传逻辑,可选 + ## 网页授权插件开发指南 1. 确定大类。例如:CSDN属于Custom -2. 新建子类别。例如:SubPlatformType加一个Custom_CSDN +2. 新建子类别。例如:src/platforms/dynamicConfig.ts里面的SubPlatformType加一个Custom_CSDN 3. 注册子类别,需要修改 - getSubtypeList - - src/utils/import/pre.ts + - src/platforms/pre.ts 4. 新增适配器 网页授权需要再 src/adaptors/web 新建文件。例如 - csdnWebAdaptor 需要继承 BaseWebApi @@ -37,6 +57,4 @@ YAML适配器(不一定有) 6. 开启配置页面 在 src/components/set/publish/singleplatform/SingleSettingIndex.vue 注册配置 -7. 修改图片上传逻辑,可选 - src/utils/constants.ts - \ No newline at end of file +7. 修改图片上传逻辑,可选 \ No newline at end of file diff --git "a/docs/\346\226\207\347\253\240\347\256\241\347\220\206.md" "b/docs/\346\226\207\347\253\240\347\256\241\347\220\206.md" new file mode 100644 index 0000000..8175343 --- /dev/null +++ "b/docs/\346\226\207\347\253\240\347\256\241\347\220\206.md" @@ -0,0 +1,3 @@ +## 文章管理 + +入口地址为:/#/manage \ No newline at end of file diff --git "a/docs/\346\236\201\351\200\237\345\217\221\345\270\203.md" "b/docs/\346\236\201\351\200\237\345\217\221\345\270\203.md" index e69de29..2d39ab3 100644 --- "a/docs/\346\236\201\351\200\237\345\217\221\345\270\203.md" +++ "b/docs/\346\236\201\351\200\237\345\217\221\345\270\203.md" @@ -0,0 +1,3 @@ +## 极速发布 + +入口地址为:/#/manage \ No newline at end of file diff --git a/esbuild.config.cjs b/esbuild.config.cjs index 515cda5..dff2a3f 100644 --- a/esbuild.config.cjs +++ b/esbuild.config.cjs @@ -23,33 +23,18 @@ */ const path = require("path") -const os = require("os") const minimist = require("minimist") const stylePlugin = require("esbuild-style-plugin") const { copy } = require("esbuild-plugin-copy") const args = minimist(process.argv.slice(2)) const isWatch = args.watch || args.w || false -const isServe = args.serve || args.s || false -const isWindows = os.platform() === "win32" - -let baseDir -if (isWatch || isServe) { - baseDir = "/Users/terwer/Documents/mydocs/SiYuanWorkspace/test/data/plugins/siyuan-plugin-publisher" - // baseDir = "/Users/zhangyue/Documents/terwer/SiyuanWorkspace/test/data/plugins/siyuan-plugin-publisher" - // baseDir = "/Users/terwer/Documents/mydocs/SiYuanWorkspace/public/data/plugins/siyuan-plugin-publisher" - if (isWindows) { - baseDir = "C:\\Users\\terwer\\Documents\\mydocs\\SiyuanWorkspace\\test\\data\\plugins\\siyuan-plugin-publisher" - } -} else { - baseDir = "./" -} -const distDir = isWatch || isServe ? baseDir : path.join(baseDir, "dist") +const distDir = "./dist" module.exports = { esbuildConfig: { entryPoints: ["siyuan/index.ts"], - outfile: path.join(distDir, "index.js"), + outfile: "dist/index.js", bundle: true, format: "cjs", external: ["siyuan"], diff --git a/index.html b/index.html index b48fe15..d341992 100644 --- a/index.html +++ b/index.html @@ -1,14 +1,14 @@ - - - - - 发布工具挂件版 + + + + + 思源笔记发布工具 <%- injectScript %> - - -
- - + + +
+ + diff --git a/package.json b/package.json index 3787086..abd113b 100644 --- a/package.json +++ b/package.json @@ -1,86 +1,97 @@ { "name": "siyuan-plugin-publisher", - "version": "0.11.0", + "version": "1.20.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", "author": "terwer", "license": "MIT", "scripts": { + "makeLink": "python scripts/make_dev_link.py", "serve": "python scripts/serve.py", "dev": "python scripts/dev.py", "test": "vitest", "coverage": "vitest run --coverage", "build": "python scripts/build.py", - "pluginDev": "python scripts/plugin_dev.py", "pluginBuild": "python scripts/plugin_build.py", "siyuanBuild": "python scripts/siyuan_build.py", "vercelBuild": "python3 scripts/vercel_build.py", "nginxBuild": "python scripts/nginx_build.py", "widgetBuild": "python scripts/widget_build.py", - "widgetTest": "python scripts/widget_build.py -t", "extBuild": "python scripts/ext_build.py", "syncVersion": "python scripts/version.py", "parseChangelog": "python scripts/parse_changelog.py", "prepareRelease": "pnpm syncVersion && pnpm parseChangelog", - "package": "pnpm build && pnpm widgetBuild && pnpm extBuild && pnpm extBuild -t firefox", + "package": "pnpm build && pnpm widgetBuild && pnpm extBuild && pnpm extBuild -t firefox && pnpm nginxBuild", "syncWidgetRepo": "python scripts/sync_widget_repo.py" }, "devDependencies": { + "@halo-dev/api-client": "^2.13.0", + "@terwer/esbuild-config-custom": "2.0.0", "@terwer/eslint-config-custom": "^1.3.6", - "@types/crypto-js": "^4.1.2", - "@types/node": "^18.17.17", - "@vitejs/plugin-vue": "^4.3.4", - "@vitest/coverage-v8": "^0.34.4", - "@vue/test-utils": "^2.4.1", + "@types/crypto-js": "^4.2.2", + "@types/iframe-resizer": "^3.5.13", + "@types/katex": "^0.16.7", + "@types/minimist": "^1.2.5", + "@types/node": "^18.19.22", + "@vitejs/plugin-vue": "^5.0.4", + "@vitest/coverage-v8": "^1.3.1", + "@vue/test-utils": "^2.4.4", "esbuild-plugin-copy": "^2.1.1", - "esbuild-style-plugin": "^1.6.2", - "fast-glob": "^3.3.1", - "jsdom": "^22.1.0", + "esbuild-style-plugin": "^1.6.3", + "fast-glob": "^3.3.2", + "jsdom": "^24.0.0", "minimist": "^1.2.8", "rollup-plugin-livereload": "^2.0.5", - "stylus": "^0.59.0", - "typescript": "^5.2.2", - "unplugin-auto-import": "^0.16.6", - "unplugin-vue-components": "^0.25.2", - "vercel": "^32.2.4", - "vite": "^4.4.9", - "vite-plugin-html": "^3.2.0", - "vite-plugin-node-polyfills": "^0.14.1", - "vitest": "^0.34.4", - "vue-tsc": "^1.8.11" + "stylus": "^0.63.0", + "typescript": "^5.4.2", + "unplugin-auto-import": "^0.17.5", + "unplugin-vue-components": "^0.26.0", + "vercel": "^33.5.5", + "vite": "^5.1.5", + "vite-plugin-html": "^3.2.2", + "vite-plugin-node-polyfills": "^0.21.0", + "vitest": "^1.3.1", + "vue-tsc": "^2.0.6" }, "dependencies": { - "@element-plus/icons-vue": "^2.1.0", - "@terwer/esbuild-config-custom": "^2.0.0", - "@vueuse/components": "^10.4.1", - "@vueuse/core": "^10.4.1", + "@element-plus/icons-vue": "^2.3.1", + "@iconify/json": "^2.2.191", + "@vueuse/components": "^10.9.0", + "@vueuse/core": "^10.9.0", "chatgpt": "^5.2.5", "cheerio": "1.0.0-rc.12", + "cookie-parse": "^0.4.0", "cross-fetch": "^3.1.8", - "crypto-js": "^4.1.1", - "element-plus": "^2.3.14", - "js-base64": "^3.7.5", - "lodash": "^4.17.21", - "pinia": "^2.1.6", + "crypto-js": "^4.2.0", + "element-plus": "^2.6.1", + "gray-matter": "^4.0.3", + "iframe-resizer": "^4.3.9", + "js-base64": "^3.7.7", + "js-yaml": "^4.1.0", + "katex": "^0.16.9", + "lodash-es": "^4.17.21", + "pinia": "^2.1.7", "shorthash2": "^1.0.3", "simple-xmlrpc": "^1.4.2", - "siyuan": "^0.8.3", + "siyuan": "^0.9.5", "siyuan-plugin-picgo": "^1.4.4", + "telegraph.md": "^0.0.1", + "unplugin-icons": "^0.18.5", "uuid": "^9.0.1", - "vue": "^3.3.4", - "vue-i18n": "^9.4.1", - "vue-router": "^4.2.4", + "vue": "^3.4.21", + "vue-i18n": "^9.10.1", + "vue-router": "^4.3.0", "xmlbuilder2": "^3.1.1", - "zhi-blog-api": "^1.44.2", - "zhi-common": "^1.23.7", - "zhi-device": "^2.3.1", - "zhi-fetch-middleware": "^0.6.4", - "zhi-github-middleware": "^0.4.2", - "zhi-gitlab-middleware": "^0.6.4", - "zhi-lib-base": "^0.5.0", + "zhi-blog-api": "^1.56.2", + "zhi-common": "^1.31.0", + "zhi-device": "^2.11.0", + "zhi-fetch-middleware": "^0.8.0", + "zhi-github-middleware": "^0.4.15", + "zhi-gitlab-middleware": "^0.6.26", + "zhi-lib-base": "^0.8.0", "zhi-notion-markdown": "^0.1.4", - "zhi-siyuan-api": "^2.10.2", - "zhi-xmlrpc-middleware": "^0.5.11" + "zhi-siyuan-api": "^2.18.6", + "zhi-xmlrpc-middleware": "^0.6.19" } } diff --git a/plugin.json b/plugin.json index 6cf86cf..3acc6ff 100644 --- a/plugin.json +++ b/plugin.json @@ -2,24 +2,30 @@ "name": "siyuan-plugin-publisher", "author": "terwer", "url": "https://github.com/terwer/siyuan-plugin-publisher", - "version": "0.11.0", + "version": "1.20.0", "minAppVersion": "2.9.0", "backends": [ "windows", "linux", - "darwin" + "darwin", + "docker", + "android", + "ios" ], "frontends": [ "desktop", - "browser-desktop" + "desktop-window", + "mobile", + "browser-desktop", + "browser-mobile" ], "displayName": { "default": "Publisher", "zh_CN": "发布工具" }, "description": { - "default": "Publish articles from Siyuan Notes to platforms such as Yuque, Notion, Cnblogs, WordPress, Typecho, Hexo, Zhihu and more", - "zh_CN": "将思源笔记的文章发布到语雀、Notion、Cnblogs、WordPress、Typecho、Hexo、知乎 等平台,支持极速发布、图床管理、平台扩展、智能标签等特色功能" + "default": "Publish articles from siyuan-note to platforms like Yuque etc. Free and open source.", + "zh_CN": "将思源笔记的文章发布到语雀等平台,开源免费 。" }, "readme": { "default": "README.md", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e486523..259218e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,42 +1,61 @@ lockfileVersion: '6.0' +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + dependencies: '@element-plus/icons-vue': - specifier: ^2.1.0 - version: 2.1.0(vue@3.3.4) - '@terwer/esbuild-config-custom': - specifier: ^2.0.0 - version: 2.0.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) + specifier: ^2.3.1 + version: 2.3.1(vue@3.4.21) + '@iconify/json': + specifier: ^2.2.191 + version: 2.2.191 '@vueuse/components': - specifier: ^10.4.1 - version: 10.4.1(vue@3.3.4) + specifier: ^10.9.0 + version: 10.9.0(vue@3.4.21) '@vueuse/core': - specifier: ^10.4.1 - version: 10.4.1(vue@3.3.4) + specifier: ^10.9.0 + version: 10.9.0(vue@3.4.21) chatgpt: specifier: ^5.2.5 version: 5.2.5 cheerio: specifier: 1.0.0-rc.12 version: 1.0.0-rc.12 + cookie-parse: + specifier: ^0.4.0 + version: 0.4.0 cross-fetch: specifier: ^3.1.8 version: 3.1.8 crypto-js: - specifier: ^4.1.1 - version: 4.1.1 + specifier: ^4.2.0 + version: 4.2.0 element-plus: - specifier: ^2.3.14 - version: 2.3.14(vue@3.3.4) + specifier: ^2.6.1 + version: 2.6.1(vue@3.4.21) + gray-matter: + specifier: ^4.0.3 + version: 4.0.3 + iframe-resizer: + specifier: ^4.3.9 + version: 4.3.9 js-base64: - specifier: ^3.7.5 - version: 3.7.5 - lodash: + specifier: ^3.7.7 + version: 3.7.7 + js-yaml: + specifier: ^4.1.0 + version: 4.1.0 + katex: + specifier: ^0.16.9 + version: 0.16.9 + lodash-es: specifier: ^4.17.21 version: 4.17.21 pinia: - specifier: ^2.1.6 - version: 2.1.6(typescript@5.2.2)(vue@3.3.4) + specifier: ^2.1.7 + version: 2.1.7(typescript@5.4.2)(vue@3.4.21) shorthash2: specifier: ^1.0.3 version: 1.0.3 @@ -44,88 +63,109 @@ dependencies: specifier: ^1.4.2 version: 1.4.2 siyuan: - specifier: ^0.8.3 - version: 0.8.3 + specifier: ^0.9.5 + version: 0.9.5 siyuan-plugin-picgo: specifier: ^1.4.4 - version: 1.4.4(typescript@5.2.2) + version: 1.4.4(typescript@5.4.2) + telegraph.md: + specifier: ^0.0.1 + version: 0.0.1 + unplugin-icons: + specifier: ^0.18.5 + version: 0.18.5 uuid: specifier: ^9.0.1 version: 9.0.1 vue: - specifier: ^3.3.4 - version: 3.3.4 + specifier: ^3.4.21 + version: 3.4.21(typescript@5.4.2) vue-i18n: - specifier: ^9.4.1 - version: 9.4.1(vue@3.3.4) + specifier: ^9.10.1 + version: 9.10.1(vue@3.4.21) vue-router: - specifier: ^4.2.4 - version: 4.2.4(vue@3.3.4) + specifier: ^4.3.0 + version: 4.3.0(vue@3.4.21) xmlbuilder2: specifier: ^3.1.1 version: 3.1.1 zhi-blog-api: - specifier: ^1.44.2 - version: 1.44.2 + specifier: ^1.56.2 + version: 1.56.2(typescript@5.4.2) zhi-common: - specifier: ^1.23.7 - version: 1.23.7 + specifier: ^1.31.0 + version: 1.31.0(typescript@5.4.2) zhi-device: - specifier: ^2.3.1 - version: 2.3.1 + specifier: ^2.11.0 + version: 2.11.0 zhi-fetch-middleware: - specifier: ^0.6.4 - version: 0.6.4 + specifier: ^0.8.0 + version: 0.8.0(typescript@5.4.2) zhi-github-middleware: - specifier: ^0.4.2 - version: 0.4.2 + specifier: ^0.4.15 + version: 0.4.15(typescript@5.4.2) zhi-gitlab-middleware: - specifier: ^0.6.4 - version: 0.6.4 + specifier: ^0.6.26 + version: 0.6.26(typescript@5.4.2) zhi-lib-base: - specifier: ^0.5.0 - version: 0.5.0 + specifier: ^0.8.0 + version: 0.8.0 zhi-notion-markdown: specifier: ^0.1.4 version: 0.1.4 zhi-siyuan-api: - specifier: ^2.10.2 - version: 2.10.2 + specifier: ^2.18.6 + version: 2.18.6(typescript@5.4.2) zhi-xmlrpc-middleware: - specifier: ^0.5.11 - version: 0.5.11 + specifier: ^0.6.19 + version: 0.6.19(typescript@5.4.2) devDependencies: + '@halo-dev/api-client': + specifier: ^2.13.0 + version: 2.13.0 + '@terwer/esbuild-config-custom': + specifier: 2.0.0 + version: 2.0.0(@types/minimist@1.2.5)(dotenv@16.4.5)(esbuild-plugin-copy@2.1.1)(esbuild-plugin-d.ts@1.2.3)(esbuild-plugin-ifdef@1.0.1)(esbuild-plugin-inline-image@0.0.9)(esbuild-plugin-vue3@0.3.2)(esbuild-style-plugin@1.6.3)(esbuild@0.17.19)(minimist@1.2.8)(rimraf@4.4.1)(stylus@0.63.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.14)(eslint-plugin-prettier@4.2.1)(eslint-plugin-svelte@2.33.1)(eslint-plugin-vue@9.17.0)(eslint@8.49.0)(prettier-plugin-svelte@2.10.1)(prettier@2.8.8)(typescript@5.2.2) + 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.12.5)(eslint-plugin-prettier@4.2.1)(eslint-plugin-svelte@2.35.1)(eslint-plugin-vue@9.22.0)(eslint@8.57.0)(prettier-plugin-svelte@2.10.1)(prettier@2.8.8)(typescript@5.4.2) '@types/crypto-js': - specifier: ^4.1.2 - version: 4.1.2 + specifier: ^4.2.2 + version: 4.2.2 + '@types/iframe-resizer': + specifier: ^3.5.13 + version: 3.5.13 + '@types/katex': + specifier: ^0.16.7 + version: 0.16.7 + '@types/minimist': + specifier: ^1.2.5 + version: 1.2.5 '@types/node': - specifier: ^18.17.17 - version: 18.17.17 + specifier: ^18.19.22 + version: 18.19.22 '@vitejs/plugin-vue': - specifier: ^4.3.4 - version: 4.3.4(vite@4.4.9)(vue@3.3.4) + specifier: ^5.0.4 + version: 5.0.4(vite@5.1.5)(vue@3.4.21) '@vitest/coverage-v8': - specifier: ^0.34.4 - version: 0.34.4(vitest@0.34.4) + specifier: ^1.3.1 + version: 1.3.1(vitest@1.3.1) '@vue/test-utils': - specifier: ^2.4.1 - version: 2.4.1(vue@3.3.4) + specifier: ^2.4.4 + version: 2.4.4(vue@3.4.21) esbuild-plugin-copy: specifier: ^2.1.1 version: 2.1.1(esbuild@0.17.19) esbuild-style-plugin: - specifier: ^1.6.2 - version: 1.6.2 + specifier: ^1.6.3 + version: 1.6.3 fast-glob: - specifier: ^3.3.1 - version: 3.3.1 + specifier: ^3.3.2 + version: 3.3.2 jsdom: - specifier: ^22.1.0 - version: 22.1.0 + specifier: ^24.0.0 + version: 24.0.0 minimist: specifier: ^1.2.8 version: 1.2.8 @@ -133,35 +173,35 @@ devDependencies: specifier: ^2.0.5 version: 2.0.5 stylus: - specifier: ^0.59.0 - version: 0.59.0 + specifier: ^0.63.0 + version: 0.63.0 typescript: - specifier: ^5.2.2 - version: 5.2.2 + specifier: ^5.4.2 + version: 5.4.2 unplugin-auto-import: - specifier: ^0.16.6 - version: 0.16.6(@vueuse/core@10.4.1) + specifier: ^0.17.5 + version: 0.17.5(@vueuse/core@10.9.0) unplugin-vue-components: - specifier: ^0.25.2 - version: 0.25.2(vue@3.3.4) + specifier: ^0.26.0 + version: 0.26.0(vue@3.4.21) vercel: - specifier: ^32.2.4 - version: 32.2.4 + specifier: ^33.5.5 + version: 33.5.5 vite: - specifier: ^4.4.9 - version: 4.4.9(@types/node@18.17.17)(stylus@0.59.0) + specifier: ^5.1.5 + version: 5.1.5(@types/node@18.19.22)(stylus@0.63.0) vite-plugin-html: - specifier: ^3.2.0 - version: 3.2.0(vite@4.4.9) + specifier: ^3.2.2 + version: 3.2.2(vite@5.1.5) vite-plugin-node-polyfills: - specifier: ^0.14.1 - version: 0.14.1(vite@4.4.9) + specifier: ^0.21.0 + version: 0.21.0(vite@5.1.5) vitest: - specifier: ^0.34.4 - version: 0.34.4(jsdom@22.1.0)(stylus@0.59.0) + specifier: ^1.3.1 + version: 1.3.1(@types/node@18.19.22)(jsdom@24.0.0)(stylus@0.63.0) vue-tsc: - specifier: ^1.8.11 - version: 1.8.11(typescript@5.2.2) + specifier: ^2.0.6 + version: 2.0.6(typescript@5.4.2) packages: @@ -170,43 +210,56 @@ packages: engines: {node: '>=0.10.0'} dev: true - /@adobe/css-tools@4.3.1: - resolution: {integrity: sha512-/62yikz7NLScCGAAST5SHdnjaDJQBDq0M2muyRTpf2VQhw6StBg2ALiu73zSJQ4fMVLA+0uBhBHAle7Wg+2kSg==} + /@adobe/css-tools@4.3.3: + resolution: {integrity: sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==} + dev: true - /@ampproject/remapping@2.2.1: - resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + /@ampproject/remapping@2.3.0: + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.19 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 dev: true - /@antfu/utils@0.7.6: - resolution: {integrity: sha512-pvFiLP2BeOKA/ZOS6jxx4XhKzdVLHDhGlFEaZ2flWWYf2xOqVniqpk38I04DFRyz+L0ASggl7SkItTc+ZLju4w==} - dev: true + /@antfu/install-pkg@0.1.1: + resolution: {integrity: sha512-LyB/8+bSfa0DFGC06zpCEfs89/XoWZwws5ygEa5D+Xsm3OfI+aXQ86VgVG7Acyef+rSZ5HE7J8rrxzrQeM3PjQ==} + dependencies: + execa: 5.1.1 + find-up: 5.0.0 + dev: false + + /@antfu/install-pkg@0.3.1: + resolution: {integrity: sha512-A3zWY9VeTPnxlMiZtsGHw2lSd3ghwvL8s9RiGOtqvDxhhFfZ781ynsGBa/iUnDJ5zBrmTFQrJDud3TGgRISaxw==} + dependencies: + execa: 8.0.1 + dev: false + + /@antfu/utils@0.7.7: + resolution: {integrity: sha512-gFPqTG7otEJ8uP6wrhDv6mqwGWYZKNvAcCq6u9hOj0c+IKCEsY4L1oC9trPq2SaWIzAfHvqfBDxF591JkMf+kg==} /@astrojs/compiler@1.8.2: resolution: {integrity: sha512-o/ObKgtMzl8SlpIdzaxFnt7SATKPxu4oIP/1NL+HDJRzxfJcAkOTAb/ZKMRyULbz4q+1t2/DAebs2Z1QairkZw==} dev: true - /@babel/code-frame@7.22.13: - resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} + /@babel/code-frame@7.23.5: + resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/highlight': 7.22.20 + '@babel/highlight': 7.23.4 chalk: 2.4.2 dev: false - /@babel/helper-string-parser@7.22.5: - resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} + /@babel/helper-string-parser@7.23.4: + resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} engines: {node: '>=6.9.0'} /@babel/helper-validator-identifier@7.22.20: resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} - /@babel/highlight@7.22.20: - resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} + /@babel/highlight@7.23.4: + resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-validator-identifier': 7.22.20 @@ -214,24 +267,18 @@ packages: js-tokens: 4.0.0 dev: false - /@babel/parser@7.22.16: - resolution: {integrity: sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==} + /@babel/parser@7.24.0: + resolution: {integrity: sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.22.19 - - /@babel/runtime@7.12.1: - resolution: {integrity: sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==} - dependencies: - regenerator-runtime: 0.13.11 - dev: true + '@babel/types': 7.24.0 - /@babel/types@7.22.19: - resolution: {integrity: sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg==} + /@babel/types@7.24.0: + resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-string-parser': 7.22.5 + '@babel/helper-string-parser': 7.23.4 '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 @@ -251,53 +298,61 @@ packages: engines: {node: '>=10'} dev: false - /@edge-runtime/cookies@3.4.1: - resolution: {integrity: sha512-z27BvgPxI73CgSlxU/NAUf1Q/shnqi6cobHEowf6VuLdSjGR3NjI2Y5dZUIBbK2zOJVZbXcHsVzJjz8LklteFQ==} + /@edge-runtime/format@2.2.1: + resolution: {integrity: sha512-JQTRVuiusQLNNLe2W9tnzBlV/GvSVcozLl4XZHk5swnRZ/v6jp8TqR8P7sqmJsQqblDZ3EztcWmLDbhRje/+8g==} engines: {node: '>=16'} dev: true - /@edge-runtime/format@2.2.0: - resolution: {integrity: sha512-gPrS6AVw/qJJL0vcxMXv4kFXCU3ZTCD1uuJpwX15YxHV8BgU9OG5v9LrkkXcr96PBT/9epypfNJMhlWADuEziw==} + /@edge-runtime/node-utils@2.3.0: + resolution: {integrity: sha512-uUtx8BFoO1hNxtHjp3eqVPC/mWImGb2exOfGjMLUoipuWgjej+f4o/VP4bUI8U40gu7Teogd5VTeZUkGvJSPOQ==} engines: {node: '>=16'} dev: true - /@edge-runtime/node-utils@2.2.1: - resolution: {integrity: sha512-RUl/439BHKshkhSGFRlZ1kzy68wL4mn8VNKDSZr3p0tciyZ33Mjfpl+vofqnHqXRmDI6nLnZpfJvhY3D88o0pA==} + /@edge-runtime/ponyfill@2.4.2: + resolution: {integrity: sha512-oN17GjFr69chu6sDLvXxdhg0Qe8EZviGSuqzR9qOiKh4MhFYGdBBcqRNzdmYeAdeRzOW2mM9yil4RftUQ7sUOA==} engines: {node: '>=16'} - dependencies: - '@edge-runtime/cookies': 3.4.1 dev: true - /@edge-runtime/primitives@3.1.1: - resolution: {integrity: sha512-ROO22py+KdAfzqWZu6CtVMC4qV6mS0W1jPI51jGXE+uenyBUN7cQTWB9ReQc8Bm4cnjqmhajvpqEx3j7Y9iSOg==} + /@edge-runtime/primitives@4.1.0: + resolution: {integrity: sha512-Vw0lbJ2lvRUqc7/soqygUX216Xb8T3WBZ987oywz6aJqRxcwSVWwr9e+Nqo2m9bxobA9mdbWNNoRY6S9eko1EQ==} engines: {node: '>=16'} dev: true - /@edge-runtime/vm@3.1.1: - resolution: {integrity: sha512-6NJRRG04/91qnWLZj+wZm27q6fJkTbkZdIJdo/Ig++GTxkAv8Wh/45nIcz9Xg7AzIAMpAkflFdiCrCoZ3hp1Iw==} + /@edge-runtime/vm@3.2.0: + resolution: {integrity: sha512-0dEVyRLM/lG4gp1R/Ik5bfPl/1wX00xFwd5KcNH602tzBa09oF7pbTKETEhR1GjZ75K6OJnYFu8II2dyMhONMw==} engines: {node: '>=16'} dependencies: - '@edge-runtime/primitives': 3.1.1 + '@edge-runtime/primitives': 4.1.0 dev: true - /@element-plus/icons-vue@2.1.0(vue@3.3.4): - resolution: {integrity: sha512-PSBn3elNoanENc1vnCfh+3WA9fimRC7n+fWkf3rE5jvv+aBohNHABC/KAR5KWPecxWxDTVT1ERpRbOMRcOV/vA==} + /@element-plus/icons-vue@2.3.1(vue@3.4.21): + resolution: {integrity: sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==} peerDependencies: vue: ^3.2.0 dependencies: - vue: 3.3.4 + vue: 3.4.21(typescript@5.4.2) dev: false + /@esbuild/aix-ppc64@0.19.12: + resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: true + optional: true + /@esbuild/android-arm64@0.17.19: resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} engines: {node: '>=12'} cpu: [arm64] os: [android] requiresBuild: true + dev: true optional: true - /@esbuild/android-arm64@0.18.20: - resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + /@esbuild/android-arm64@0.19.12: + resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} engines: {node: '>=12'} cpu: [arm64] os: [android] @@ -311,10 +366,11 @@ packages: cpu: [arm] os: [android] requiresBuild: true + dev: true optional: true - /@esbuild/android-arm@0.18.20: - resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + /@esbuild/android-arm@0.19.12: + resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} engines: {node: '>=12'} cpu: [arm] os: [android] @@ -328,10 +384,11 @@ packages: cpu: [x64] os: [android] requiresBuild: true + dev: true optional: true - /@esbuild/android-x64@0.18.20: - resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + /@esbuild/android-x64@0.19.12: + resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} engines: {node: '>=12'} cpu: [x64] os: [android] @@ -345,10 +402,11 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true + dev: true optional: true - /@esbuild/darwin-arm64@0.18.20: - resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + /@esbuild/darwin-arm64@0.19.12: + resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] @@ -362,10 +420,11 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true + dev: true optional: true - /@esbuild/darwin-x64@0.18.20: - resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + /@esbuild/darwin-x64@0.19.12: + resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} engines: {node: '>=12'} cpu: [x64] os: [darwin] @@ -379,10 +438,11 @@ packages: cpu: [arm64] os: [freebsd] requiresBuild: true + dev: true optional: true - /@esbuild/freebsd-arm64@0.18.20: - resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + /@esbuild/freebsd-arm64@0.19.12: + resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] @@ -396,10 +456,11 @@ packages: cpu: [x64] os: [freebsd] requiresBuild: true + dev: true optional: true - /@esbuild/freebsd-x64@0.18.20: - resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + /@esbuild/freebsd-x64@0.19.12: + resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] @@ -413,10 +474,11 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true + dev: true optional: true - /@esbuild/linux-arm64@0.18.20: - resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + /@esbuild/linux-arm64@0.19.12: + resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} engines: {node: '>=12'} cpu: [arm64] os: [linux] @@ -430,10 +492,11 @@ packages: cpu: [arm] os: [linux] requiresBuild: true + dev: true optional: true - /@esbuild/linux-arm@0.18.20: - resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + /@esbuild/linux-arm@0.19.12: + resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} engines: {node: '>=12'} cpu: [arm] os: [linux] @@ -447,10 +510,11 @@ packages: cpu: [ia32] os: [linux] requiresBuild: true + dev: true optional: true - /@esbuild/linux-ia32@0.18.20: - resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + /@esbuild/linux-ia32@0.19.12: + resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -464,7 +528,7 @@ packages: cpu: [loong64] os: [linux] requiresBuild: true - dev: false + dev: true optional: true /@esbuild/linux-loong64@0.17.19: @@ -473,10 +537,11 @@ packages: cpu: [loong64] os: [linux] requiresBuild: true + dev: true optional: true - /@esbuild/linux-loong64@0.18.20: - resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + /@esbuild/linux-loong64@0.19.12: + resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} engines: {node: '>=12'} cpu: [loong64] os: [linux] @@ -490,10 +555,11 @@ packages: cpu: [mips64el] os: [linux] requiresBuild: true + dev: true optional: true - /@esbuild/linux-mips64el@0.18.20: - resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + /@esbuild/linux-mips64el@0.19.12: + resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] @@ -507,10 +573,11 @@ packages: cpu: [ppc64] os: [linux] requiresBuild: true + dev: true optional: true - /@esbuild/linux-ppc64@0.18.20: - resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + /@esbuild/linux-ppc64@0.19.12: + resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] @@ -524,10 +591,11 @@ packages: cpu: [riscv64] os: [linux] requiresBuild: true + dev: true optional: true - /@esbuild/linux-riscv64@0.18.20: - resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + /@esbuild/linux-riscv64@0.19.12: + resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] @@ -541,10 +609,11 @@ packages: cpu: [s390x] os: [linux] requiresBuild: true + dev: true optional: true - /@esbuild/linux-s390x@0.18.20: - resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + /@esbuild/linux-s390x@0.19.12: + resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -558,10 +627,11 @@ packages: cpu: [x64] os: [linux] requiresBuild: true + dev: true optional: true - /@esbuild/linux-x64@0.18.20: - resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + /@esbuild/linux-x64@0.19.12: + resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -575,10 +645,11 @@ packages: cpu: [x64] os: [netbsd] requiresBuild: true + dev: true optional: true - /@esbuild/netbsd-x64@0.18.20: - resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + /@esbuild/netbsd-x64@0.19.12: + resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -592,10 +663,11 @@ packages: cpu: [x64] os: [openbsd] requiresBuild: true + dev: true optional: true - /@esbuild/openbsd-x64@0.18.20: - resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + /@esbuild/openbsd-x64@0.19.12: + resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -609,10 +681,11 @@ packages: cpu: [x64] os: [sunos] requiresBuild: true + dev: true optional: true - /@esbuild/sunos-x64@0.18.20: - resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + /@esbuild/sunos-x64@0.19.12: + resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -626,10 +699,11 @@ packages: cpu: [arm64] os: [win32] requiresBuild: true + dev: true optional: true - /@esbuild/win32-arm64@0.18.20: - resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + /@esbuild/win32-arm64@0.19.12: + resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -643,10 +717,11 @@ packages: cpu: [ia32] os: [win32] requiresBuild: true + dev: true optional: true - /@esbuild/win32-ia32@0.18.20: - resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + /@esbuild/win32-ia32@0.19.12: + resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -660,10 +735,11 @@ packages: cpu: [x64] os: [win32] requiresBuild: true + dev: true optional: true - /@esbuild/win32-x64@0.18.20: - resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + /@esbuild/win32-x64@0.19.12: + resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -671,30 +747,30 @@ packages: dev: true optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.49.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.49.0 + eslint: 8.57.0 eslint-visitor-keys: 3.4.3 dev: true - /@eslint-community/regexpp@4.8.1: - resolution: {integrity: sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==} + /@eslint-community/regexpp@4.10.0: + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} dev: true - /@eslint/eslintrc@2.1.2: - resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} + /@eslint/eslintrc@2.1.4: + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 debug: 4.3.4 espree: 9.6.1 - globals: 13.21.0 - ignore: 5.2.4 + globals: 13.24.0 + ignore: 5.3.1 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 @@ -703,73 +779,82 @@ packages: - supports-color dev: true - /@eslint/js@8.49.0: - resolution: {integrity: sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==} + /@eslint/js@8.57.0: + resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@floating-ui/core@1.5.0: - resolution: {integrity: sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==} + /@fastify/busboy@2.1.1: + resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} + engines: {node: '>=14'} + dev: true + + /@floating-ui/core@1.6.0: + resolution: {integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==} dependencies: - '@floating-ui/utils': 0.1.4 + '@floating-ui/utils': 0.2.1 dev: false - /@floating-ui/dom@1.5.3: - resolution: {integrity: sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==} + /@floating-ui/dom@1.6.3: + resolution: {integrity: sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==} dependencies: - '@floating-ui/core': 1.5.0 - '@floating-ui/utils': 0.1.4 + '@floating-ui/core': 1.6.0 + '@floating-ui/utils': 0.2.1 dev: false - /@floating-ui/utils@0.1.4: - resolution: {integrity: sha512-qprfWkn82Iw821mcKofJ5Pk9wgioHicxcQMxx+5zt5GSKoqdWvgG5AxVmpmUUjzTLPVSH5auBrhI93Deayn/DA==} + /@floating-ui/utils@0.2.1: + resolution: {integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==} dev: false - /@fortawesome/fontawesome-common-types@6.4.2: - resolution: {integrity: sha512-1DgP7f+XQIJbLFCTX1V2QnxVmpLdKdzzo2k8EmvDOePfchaIGQ9eCHj2up3/jNEbZuBqel5OxiaOJf37TWauRA==} + /@fortawesome/fontawesome-common-types@6.5.1: + resolution: {integrity: sha512-GkWzv+L6d2bI5f/Vk6ikJ9xtl7dfXtoRu3YGE6nq0p/FFqA1ebMOAWg3XgRyb0I6LYyYkiAo+3/KrwuBp8xG7A==} engines: {node: '>=6'} requiresBuild: true dev: false - /@fortawesome/fontawesome-svg-core@6.4.2: - resolution: {integrity: sha512-gjYDSKv3TrM2sLTOKBc5rH9ckje8Wrwgx1CxAPbN5N3Fm4prfi7NsJVWd1jklp7i5uSCVwhZS5qlhMXqLrpAIg==} + /@fortawesome/fontawesome-svg-core@6.5.1: + resolution: {integrity: sha512-MfRCYlQPXoLlpem+egxjfkEuP9UQswTrlCOsknus/NcMoblTH2g0jPrapbcIb04KGA7E2GZxbAccGZfWoYgsrQ==} engines: {node: '>=6'} requiresBuild: true dependencies: - '@fortawesome/fontawesome-common-types': 6.4.2 + '@fortawesome/fontawesome-common-types': 6.5.1 dev: false - /@fortawesome/free-brands-svg-icons@6.4.2: - resolution: {integrity: sha512-LKOwJX0I7+mR/cvvf6qIiqcERbdnY+24zgpUSouySml+5w8B4BJOx8EhDR/FTKAu06W12fmUIcv6lzPSwYKGGg==} + /@fortawesome/free-brands-svg-icons@6.5.1: + resolution: {integrity: sha512-093l7DAkx0aEtBq66Sf19MgoZewv1zeY9/4C7vSKPO4qMwEsW/2VYTUTpBtLwfb9T2R73tXaRDPmE4UqLCYHfg==} engines: {node: '>=6'} requiresBuild: true dependencies: - '@fortawesome/fontawesome-common-types': 6.4.2 + '@fortawesome/fontawesome-common-types': 6.5.1 dev: false - /@fortawesome/free-solid-svg-icons@6.4.2: - resolution: {integrity: sha512-sYwXurXUEQS32fZz9hVCUUv/xu49PEJEyUOsA51l6PU/qVgfbTb2glsTEaJngVVT8VqBATRIdh7XVgV1JF1LkA==} + /@fortawesome/free-solid-svg-icons@6.5.1: + resolution: {integrity: sha512-S1PPfU3mIJa59biTtXJz1oI0+KAXW6bkAb31XKhxdxtuXDiUIFsih4JR1v5BbxY7hVHsD1RKq+jRkVRaf773NQ==} engines: {node: '>=6'} requiresBuild: true dependencies: - '@fortawesome/fontawesome-common-types': 6.4.2 + '@fortawesome/fontawesome-common-types': 6.5.1 dev: false - /@fortawesome/vue-fontawesome@3.0.3(@fortawesome/fontawesome-svg-core@6.4.2)(vue@3.3.4): - resolution: {integrity: sha512-KCPHi9QemVXGMrfuwf3nNnNo129resAIQWut9QTAMXmXqL2ErABC6ohd2yY5Ipq0CLWNbKHk8TMdTXL/Zf3ZhA==} + /@fortawesome/vue-fontawesome@3.0.6(@fortawesome/fontawesome-svg-core@6.5.1)(vue@3.4.21): + resolution: {integrity: sha512-akrL7lTroyNpPkoHtvK2UpsMzJr6jXdHaQ0YdcwqDsB8jdwlpNHZYijpOUd9KJsARr+VB3WXY4EyObepqJ4ytQ==} peerDependencies: '@fortawesome/fontawesome-svg-core': ~1 || ~6 vue: '>= 3.0.0 < 4' dependencies: - '@fortawesome/fontawesome-svg-core': 6.4.2 - vue: 3.3.4 + '@fortawesome/fontawesome-svg-core': 6.5.1 + vue: 3.4.21(typescript@5.4.2) dev: false - /@humanwhocodes/config-array@0.11.11: - resolution: {integrity: sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==} + /@halo-dev/api-client@2.13.0: + resolution: {integrity: sha512-BdUvu5IqoUdJ6JemHmp5bYNs8P/zth4oPm3qUy0aelWLh/hi3tHG2EVk0JZlgeamyxMD2SGGyh65ehntmPGVsQ==} + dev: true + + /@humanwhocodes/config-array@0.11.14: + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} dependencies: - '@humanwhocodes/object-schema': 1.2.1 + '@humanwhocodes/object-schema': 2.0.2 debug: 4.3.4 minimatch: 3.1.2 transitivePeerDependencies: @@ -781,28 +866,53 @@ packages: engines: {node: '>=12.22'} dev: true - /@humanwhocodes/object-schema@1.2.1: - resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + /@humanwhocodes/object-schema@2.0.2: + resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} dev: true - /@intlify/core-base@9.4.1: - resolution: {integrity: sha512-WIwx+elsZbxSMxRG5+LC+utRohFvmZMoDevfKOfnYMLbpCjCSavqTfHJAtfsY6ruowzqXeKkeLhRHbYbjoJx5g==} + /@iconify/json@2.2.191: + resolution: {integrity: sha512-s6gEvYgYCKce6qw6SXyLz7ChVKzhbCPiIsv3Fq/VLpYeYbU0ipFOeErIJP0dQwqTYydr9cxTvR6rPnHu6Sf3Fg==} + dependencies: + '@iconify/types': 2.0.0 + pathe: 1.1.2 + dev: false + + /@iconify/types@2.0.0: + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + dev: false + + /@iconify/utils@2.1.22: + resolution: {integrity: sha512-6UHVzTVXmvO8uS6xFF+L/QTSpTzA/JZxtgU+KYGFyDYMEObZ1bu/b5l+zNJjHy+0leWjHI+C0pXlzGvv3oXZMA==} + dependencies: + '@antfu/install-pkg': 0.1.1 + '@antfu/utils': 0.7.7 + '@iconify/types': 2.0.0 + debug: 4.3.4 + kolorist: 1.8.0 + local-pkg: 0.5.0 + mlly: 1.6.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@intlify/core-base@9.10.1: + resolution: {integrity: sha512-0+Wtjj04GIyglh5KKiNjRwgjpHrhqqGZhaKY/QVjjogWKZq5WHROrTi84pNVsRN18QynyPmjtsVUWqFKPQ45xQ==} engines: {node: '>= 16'} dependencies: - '@intlify/message-compiler': 9.4.1 - '@intlify/shared': 9.4.1 + '@intlify/message-compiler': 9.10.1 + '@intlify/shared': 9.10.1 dev: false - /@intlify/message-compiler@9.4.1: - resolution: {integrity: sha512-aN2N+dUx320108QhH51Ycd2LEpZ+NKbzyQ2kjjhqMcxhHdxtOnkgdx+MDBhOy/CObwBmhC3Nygzc6hNlfKvPNw==} + /@intlify/message-compiler@9.10.1: + resolution: {integrity: sha512-b68UTmRhgZfswJZI7VAgW6BXZK5JOpoi5swMLGr4j6ss2XbFY13kiw+Hu+xYAfulMPSapcHzdWHnq21VGnMCnA==} engines: {node: '>= 16'} dependencies: - '@intlify/shared': 9.4.1 + '@intlify/shared': 9.10.1 source-map-js: 1.0.2 dev: false - /@intlify/shared@9.4.1: - resolution: {integrity: sha512-A51elBmZWf1FS80inf/32diO9DeXoqg9GR9aUDHFcfHoNDuT46Q+fpPOdj8jiJnSHSBh8E1E+6qWRhAZXdK3Ng==} + /@intlify/shared@9.10.1: + resolution: {integrity: sha512-liyH3UMoglHBUn70iCYcy9CQlInx/lp50W2aeSxqqrvmG+LDj/Jj7tBJhBoQL4fECkldGhbmW0g2ommHfL6Wmw==} engines: {node: '>= 16'} dev: false @@ -816,6 +926,7 @@ packages: strip-ansi-cjs: /strip-ansi@6.0.1 wrap-ansi: 8.1.0 wrap-ansi-cjs: /wrap-ansi@7.0.0 + dev: true /@istanbuljs/schema@0.1.3: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} @@ -829,42 +940,46 @@ packages: '@sinclair/typebox': 0.27.8 dev: true - /@jridgewell/gen-mapping@0.3.3: - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + /@jridgewell/gen-mapping@0.3.5: + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} dependencies: - '@jridgewell/set-array': 1.1.2 + '@jridgewell/set-array': 1.2.1 '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.19 + '@jridgewell/trace-mapping': 0.3.25 + dev: true - /@jridgewell/resolve-uri@3.1.1: - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + /@jridgewell/resolve-uri@3.1.2: + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} + dev: true - /@jridgewell/set-array@1.1.2: - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + /@jridgewell/set-array@1.2.1: + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} + dev: true /@jridgewell/source-map@0.3.5: resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.19 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 dev: true /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - /@jridgewell/trace-mapping@0.3.19: - resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} + /@jridgewell/trace-mapping@0.3.25: + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} dependencies: - '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 + dev: true /@jridgewell/trace-mapping@0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} dependencies: - '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 dev: true @@ -879,7 +994,7 @@ packages: nopt: 5.0.0 npmlog: 5.0.1 rimraf: 3.0.2 - semver: 7.5.4 + semver: 7.6.0 tar: 6.2.0 transitivePeerDependencies: - encoding @@ -892,38 +1007,41 @@ packages: dependencies: '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 + dev: true /@nodelib/fs.stat@2.0.5: resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} + dev: true /@nodelib/fs.walk@1.2.8: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 + fastq: 1.17.1 + dev: true /@notionhq/client@1.0.4: resolution: {integrity: sha512-m7zZ5l3RUktayf1lRBV1XMb8HSKsmWTv/LZPqP7UGC1NMzOlc+bbTOPNQ4CP/c1P4cP61VWLb/zBq7a3c0nMaw==} engines: {node: '>=12'} dependencies: - '@types/node-fetch': 2.6.5 + '@types/node-fetch': 2.6.11 node-fetch: 2.7.0 transitivePeerDependencies: - encoding dev: false - /@nuxt/eslint-config@0.1.1(eslint@8.49.0): + /@nuxt/eslint-config@0.1.1(eslint@8.57.0): resolution: {integrity: sha512-znm1xlbhldUubB2XGx6Ca5uarwlIieKf0o8CtxtF6eEauDbpa3T2p3JnTcdguMW2nj1YPneoGmhshANfOlghiQ==} peerDependencies: eslint: ^8.29.0 dependencies: - '@rushstack/eslint-patch': 1.4.0 - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.49.0)(typescript@4.9.5) - '@typescript-eslint/parser': 5.62.0(eslint@8.49.0)(typescript@4.9.5) - eslint: 8.49.0 - eslint-plugin-vue: 9.17.0(eslint@8.49.0) + '@rushstack/eslint-patch': 1.7.2 + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@4.9.5) + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@4.9.5) + eslint: 8.57.0 + eslint-plugin-vue: 9.22.0(eslint@8.57.0) typescript: 4.9.5 transitivePeerDependencies: - supports-color @@ -934,65 +1052,63 @@ packages: engines: {node: '>= 18'} dev: false - /@octokit/core@5.0.0: - resolution: {integrity: sha512-YbAtMWIrbZ9FCXbLwT9wWB8TyLjq9mxpKdgB3dUNxQcIVTf9hJ70gRPwAcqGZdY6WdJPZ0I7jLaaNDCiloGN2A==} + /@octokit/core@5.1.0: + resolution: {integrity: sha512-BDa2VAMLSh3otEiaMJ/3Y36GU4qf6GI+VivQ/P41NC6GHcdxpKlqV0ikSZ5gdQsmS3ojXeRx5vasgNTinF0Q4g==} engines: {node: '>= 18'} dependencies: '@octokit/auth-token': 4.0.0 - '@octokit/graphql': 7.0.1 - '@octokit/request': 8.1.1 - '@octokit/request-error': 5.0.0 - '@octokit/types': 11.1.0 + '@octokit/graphql': 7.0.2 + '@octokit/request': 8.2.0 + '@octokit/request-error': 5.0.1 + '@octokit/types': 12.6.0 before-after-hook: 2.2.3 - universal-user-agent: 6.0.0 + universal-user-agent: 6.0.1 dev: false - /@octokit/endpoint@9.0.0: - resolution: {integrity: sha512-szrQhiqJ88gghWY2Htt8MqUDO6++E/EIXqJ2ZEp5ma3uGS46o7LZAzSLt49myB7rT+Hfw5Y6gO3LmOxGzHijAQ==} + /@octokit/endpoint@9.0.4: + resolution: {integrity: sha512-DWPLtr1Kz3tv8L0UvXTDP1fNwM0S+z6EJpRcvH66orY6Eld4XBMCSYsaWp4xIm61jTWxK68BrR7ibO+vSDnZqw==} engines: {node: '>= 18'} dependencies: - '@octokit/types': 11.1.0 - is-plain-object: 5.0.0 - universal-user-agent: 6.0.0 + '@octokit/types': 12.6.0 + universal-user-agent: 6.0.1 dev: false - /@octokit/graphql@7.0.1: - resolution: {integrity: sha512-T5S3oZ1JOE58gom6MIcrgwZXzTaxRnxBso58xhozxHpOqSTgDS6YNeEUvZ/kRvXgPrRz/KHnZhtb7jUMRi9E6w==} + /@octokit/graphql@7.0.2: + resolution: {integrity: sha512-OJ2iGMtj5Tg3s6RaXH22cJcxXRi7Y3EBqbHTBRq+PQAqfaS8f/236fUrWhfSn8P4jovyzqucxme7/vWSSZBX2Q==} engines: {node: '>= 18'} dependencies: - '@octokit/request': 8.1.1 - '@octokit/types': 11.1.0 - universal-user-agent: 6.0.0 + '@octokit/request': 8.2.0 + '@octokit/types': 12.6.0 + universal-user-agent: 6.0.1 dev: false - /@octokit/openapi-types@18.0.0: - resolution: {integrity: sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==} + /@octokit/openapi-types@20.0.0: + resolution: {integrity: sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==} dev: false - /@octokit/request-error@5.0.0: - resolution: {integrity: sha512-1ue0DH0Lif5iEqT52+Rf/hf0RmGO9NWFjrzmrkArpG9trFfDM/efx00BJHdLGuro4BR/gECxCU2Twf5OKrRFsQ==} + /@octokit/request-error@5.0.1: + resolution: {integrity: sha512-X7pnyTMV7MgtGmiXBwmO6M5kIPrntOXdyKZLigNfQWSEQzVxR4a4vo49vJjTWX70mPndj8KhfT4Dx+2Ng3vnBQ==} engines: {node: '>= 18'} dependencies: - '@octokit/types': 11.1.0 + '@octokit/types': 12.6.0 deprecation: 2.3.1 once: 1.4.0 dev: false - /@octokit/request@8.1.1: - resolution: {integrity: sha512-8N+tdUz4aCqQmXl8FpHYfKG9GelDFd7XGVzyN8rc6WxVlYcfpHECnuRkgquzz+WzvHTK62co5di8gSXnzASZPQ==} + /@octokit/request@8.2.0: + resolution: {integrity: sha512-exPif6x5uwLqv1N1irkLG1zZNJkOtj8bZxuVHd71U5Ftuxf2wGNvAJyNBcPbPC+EBzwYEbBDdSFb8EPcjpYxPQ==} engines: {node: '>= 18'} dependencies: - '@octokit/endpoint': 9.0.0 - '@octokit/request-error': 5.0.0 - '@octokit/types': 11.1.0 - is-plain-object: 5.0.0 - universal-user-agent: 6.0.0 + '@octokit/endpoint': 9.0.4 + '@octokit/request-error': 5.0.1 + '@octokit/types': 12.6.0 + universal-user-agent: 6.0.1 dev: false - /@octokit/types@11.1.0: - resolution: {integrity: sha512-Fz0+7GyLm/bHt8fwEqgvRBWwIV1S6wRRyq+V6exRKLVWaKGsuy6H9QFYeBVDV7rK6fO3XwHgQOPxv+cLj2zpXQ==} + /@octokit/types@12.6.0: + resolution: {integrity: sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==} dependencies: - '@octokit/openapi-types': 18.0.0 + '@octokit/openapi-types': 20.0.0 dev: false /@one-ini/wasm@0.1.1: @@ -1032,32 +1148,26 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} requiresBuild: true + dev: true optional: true - /@pkgr/utils@2.4.2: - resolution: {integrity: sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==} + /@pkgr/core@0.1.1: + resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - dependencies: - cross-spawn: 7.0.3 - fast-glob: 3.3.1 - is-glob: 4.0.3 - open: 9.1.0 - picocolors: 1.0.0 - tslib: 2.6.2 dev: true - /@rollup/plugin-inject@5.0.3: - resolution: {integrity: sha512-411QlbL+z2yXpRWFXSmw/teQRMkXcAAC8aYTemc15gwJRpvEVDQwoe+N/HTFD8RFG8+88Bme9DK2V9CVm7hJdA==} + /@rollup/plugin-inject@5.0.5: + resolution: {integrity: sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==} engines: {node: '>=14.0.0'} peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0 + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.4 + '@rollup/pluginutils': 5.1.0 estree-walker: 2.0.2 - magic-string: 0.27.0 + magic-string: 0.30.8 dev: true /@rollup/pluginutils@4.2.1: @@ -1068,22 +1178,126 @@ packages: picomatch: 2.3.1 dev: true - /@rollup/pluginutils@5.0.4: - resolution: {integrity: sha512-0KJnIoRI8A+a1dqOYLxH8vBf8bphDmty5QvIm2hqm7oFCFYKCAZWWd2hXgMibaPsNDhI0AtpYfQZJG47pt/k4g==} + /@rollup/pluginutils@5.1.0: + resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} engines: {node: '>=14.0.0'} peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0 + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true dependencies: - '@types/estree': 1.0.1 + '@types/estree': 1.0.5 estree-walker: 2.0.2 picomatch: 2.3.1 dev: true - /@rushstack/eslint-patch@1.4.0: - resolution: {integrity: sha512-cEjvTPU32OM9lUFegJagO0mRnIn+rbqrG89vV8/xLnLFX0DoR0r1oy5IlTga71Q7uT3Qus7qm7wgeiMT/+Irlg==} + /@rollup/rollup-android-arm-eabi@4.12.1: + resolution: {integrity: sha512-iU2Sya8hNn1LhsYyf0N+L4Gf9Qc+9eBTJJJsaOGUp+7x4n2M9dxTt8UvhJl3oeftSjblSlpCfvjA/IfP3g5VjQ==} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-android-arm64@4.12.1: + resolution: {integrity: sha512-wlzcWiH2Ir7rdMELxFE5vuM7D6TsOcJ2Yw0c3vaBR3VOsJFVTx9xvwnAvhgU5Ii8Gd6+I11qNHwndDscIm0HXg==} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-arm64@4.12.1: + resolution: {integrity: sha512-YRXa1+aZIFN5BaImK+84B3uNK8C6+ynKLPgvn29X9s0LTVCByp54TB7tdSMHDR7GTV39bz1lOmlLDuedgTwwHg==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-x64@4.12.1: + resolution: {integrity: sha512-opjWJ4MevxeA8FhlngQWPBOvVWYNPFkq6/25rGgG+KOy0r8clYwL1CFd+PGwRqqMFVQ4/Qd3sQu5t7ucP7C/Uw==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm-gnueabihf@4.12.1: + resolution: {integrity: sha512-uBkwaI+gBUlIe+EfbNnY5xNyXuhZbDSx2nzzW8tRMjUmpScd6lCQYKY2V9BATHtv5Ef2OBq6SChEP8h+/cxifQ==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-gnu@4.12.1: + resolution: {integrity: sha512-0bK9aG1kIg0Su7OcFTlexkVeNZ5IzEsnz1ept87a0TUgZ6HplSgkJAnFpEVRW7GRcikT4GlPV0pbtVedOaXHQQ==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-musl@4.12.1: + resolution: {integrity: sha512-qB6AFRXuP8bdkBI4D7UPUbE7OQf7u5OL+R94JE42Z2Qjmyj74FtDdLGeriRyBDhm4rQSvqAGCGC01b8Fu2LthQ==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-riscv64-gnu@4.12.1: + resolution: {integrity: sha512-sHig3LaGlpNgDj5o8uPEoGs98RII8HpNIqFtAI8/pYABO8i0nb1QzT0JDoXF/pxzqO+FkxvwkHZo9k0NJYDedg==} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-gnu@4.12.1: + resolution: {integrity: sha512-nD3YcUv6jBJbBNFvSbp0IV66+ba/1teuBcu+fBBPZ33sidxitc6ErhON3JNavaH8HlswhWMC3s5rgZpM4MtPqQ==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-musl@4.12.1: + resolution: {integrity: sha512-7/XVZqgBby2qp/cO0TQ8uJK+9xnSdJ9ct6gSDdEr4MfABrjTyrW6Bau7HQ73a2a5tPB7hno49A0y1jhWGDN9OQ==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-arm64-msvc@4.12.1: + resolution: {integrity: sha512-CYc64bnICG42UPL7TrhIwsJW4QcKkIt9gGlj21gq3VV0LL6XNb1yAdHVp1pIi9gkts9gGcT3OfUYHjGP7ETAiw==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-ia32-msvc@4.12.1: + resolution: {integrity: sha512-LN+vnlZ9g0qlHGlS920GR4zFCqAwbv2lULrR29yGaWP9u7wF5L7GqWu9Ah6/kFZPXPUkpdZwd//TNR+9XC9hvA==} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-x64-msvc@4.12.1: + resolution: {integrity: sha512-n+vkrSyphvmU0qkQ6QBNXCGr2mKjhP08mPRM/Xp5Ck2FV4NrHU+y6axzDeixUrCBHVUS51TZhjqrKBBsHLKb2Q==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rushstack/eslint-patch@1.7.2: + resolution: {integrity: sha512-RbhOOTCNoCrbfkRyoXODZp75MlpiHMgbE5MEBZAnnnLyQNgrigEj4p0lzsMDyc1zVsJDLrivB58tgg3emX0eEA==} dev: true /@sinclair/typebox@0.25.24: @@ -1098,7 +1312,7 @@ packages: resolution: {integrity: sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==} dev: false - /@terwer/esbuild-config-custom@2.0.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/esbuild-config-custom@2.0.0(@types/minimist@1.2.5)(dotenv@16.4.5)(esbuild-plugin-copy@2.1.1)(esbuild-plugin-d.ts@1.2.3)(esbuild-plugin-ifdef@1.0.1)(esbuild-plugin-inline-image@0.0.9)(esbuild-plugin-vue3@0.3.2)(esbuild-style-plugin@1.6.3)(esbuild@0.17.19)(minimist@1.2.8)(rimraf@4.4.1)(stylus@0.63.0): resolution: {integrity: sha512-Uyt/ccoxlnjtxQAL3poCvZVfRr4Img49Y+DDOHFO4qd9zmcYC2WH9f/kBobqxPBAdslHm3n++U85/or4gAZO4w==} hasBin: true peerDependencies: @@ -1115,21 +1329,21 @@ packages: rimraf: ^4.4.1 stylus: ^0.59.0 dependencies: - '@types/minimist': 1.2.2 - dotenv: 16.3.1 + '@types/minimist': 1.2.5 + dotenv: 16.4.5 esbuild: 0.17.19 esbuild-plugin-copy: 2.1.1(esbuild@0.17.19) - esbuild-plugin-d.ts: 1.1.0(postcss@8.4.29)(typescript@5.2.2) + esbuild-plugin-d.ts: 1.2.3(typescript@5.4.2) 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) - esbuild-style-plugin: 1.6.2 + esbuild-style-plugin: 1.6.3 minimist: 1.2.8 rimraf: 4.4.1 - stylus: 0.59.0 - dev: false + stylus: 0.63.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.14)(eslint-plugin-prettier@4.2.1)(eslint-plugin-svelte@2.33.1)(eslint-plugin-vue@9.17.0)(eslint@8.49.0)(prettier-plugin-svelte@2.10.1)(prettier@2.8.8)(typescript@5.2.2): + /@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.12.5)(eslint-plugin-prettier@4.2.1)(eslint-plugin-svelte@2.35.1)(eslint-plugin-vue@9.22.0)(eslint@8.57.0)(prettier-plugin-svelte@2.10.1)(prettier@2.8.8)(typescript@5.4.2): resolution: {integrity: sha512-W0dFSTYfkzpp71LW8cDZUgLrNa004KDctojbiQrJrF4FIDmlwND/LyPUqfe1Eg8sulB5qkNX9qMgFWZ4SAVXBQ==} peerDependencies: '@nuxt/eslint-config': ^0.1.1 @@ -1145,18 +1359,18 @@ packages: prettier-plugin-svelte: ^2.10.0 typescript: ^5.0.4 dependencies: - '@nuxt/eslint-config': 0.1.1(eslint@8.49.0) - '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.49.0)(typescript@5.2.2) + '@nuxt/eslint-config': 0.1.1(eslint@8.57.0) + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@5.4.2) astro-eslint-parser: 0.13.3 - eslint: 8.49.0 - eslint-config-prettier: 8.10.0(eslint@8.49.0) - eslint-config-turbo: 1.10.14(eslint@8.49.0) - eslint-plugin-prettier: 4.2.1(eslint-config-prettier@8.10.0)(eslint@8.49.0)(prettier@2.8.8) - eslint-plugin-svelte: 2.33.1(eslint@8.49.0)(svelte@4.2.0) - eslint-plugin-vue: 9.17.0(eslint@8.49.0) + eslint: 8.57.0 + eslint-config-prettier: 8.10.0(eslint@8.57.0) + eslint-config-turbo: 1.12.5(eslint@8.57.0) + eslint-plugin-prettier: 4.2.1(eslint-config-prettier@8.10.0)(eslint@8.57.0)(prettier@2.8.8) + eslint-plugin-svelte: 2.35.1(eslint@8.57.0)(svelte@4.2.12) + eslint-plugin-vue: 9.22.0(eslint@8.57.0) prettier: 2.8.8 - prettier-plugin-svelte: 2.10.1(prettier@2.8.8)(svelte@4.2.0) - typescript: 5.2.2 + prettier-plugin-svelte: 2.10.1(prettier@2.8.8)(svelte@4.2.12) + typescript: 5.4.2 dev: true /@tootallnate/once@2.0.0: @@ -1181,7 +1395,7 @@ packages: /@ts-morph/common@0.11.1: resolution: {integrity: sha512-7hWZS0NRpEsNV8vWJzg7FEz6V8MaLNeJOmwmghqUXTpzk16V1LLZhdo+4QvE/+zv4cVci0OviuJFnqhEfoV3+g==} dependencies: - fast-glob: 3.3.1 + fast-glob: 3.3.2 minimatch: 3.1.2 mkdirp: 1.0.4 path-browserify: 1.0.1 @@ -1203,59 +1417,58 @@ packages: resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} dev: true - /@types/chai-subset@1.3.3: - resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} - dependencies: - '@types/chai': 4.3.6 + /@types/crypto-js@4.2.2: + resolution: {integrity: sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ==} dev: true - /@types/chai@4.3.6: - resolution: {integrity: sha512-VOVRLM1mBxIRxydiViqPcKn6MIxZytrbMpd6RJLIWKxUNr3zux8no0Oc7kJx0WAPIitgZ0gkrDS+btlqQpubpw==} + /@types/estree@1.0.5: + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} dev: true - /@types/crypto-js@4.1.2: - resolution: {integrity: sha512-t33RNmTu5ufG/sorROIafiCVJMx3jz95bXUMoPAZcUD14fxMXnuTzqzXZoxpR0tNx2xpw11Dlmem9vGCsrSOfA==} + /@types/iframe-resizer@3.5.13: + resolution: {integrity: sha512-/Np2ntlOWd/NOHs23Mj7QlNEnZ6SL02AWWdYZLm4RQNukDdpqpagfMAdin5FvQDLngR8LWfh/qUnYxuDmR8BCg==} dev: true - /@types/estree@1.0.1: - resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} + /@types/istanbul-lib-coverage@2.0.6: + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} dev: true - /@types/istanbul-lib-coverage@2.0.4: - resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} + /@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} dev: true - /@types/json-schema@7.0.13: - resolution: {integrity: sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==} + /@types/katex@0.16.7: + resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==} dev: true - /@types/less@3.0.4: - resolution: {integrity: sha512-djlMpTdDF+tLaqVpK/0DWGNIr7BFjN8ykDLkgS0sQGYYLop51imRRE3foTjl+dMAH1zFE8bMZAG0VbYPEcSgsA==} + /@types/less@3.0.6: + resolution: {integrity: sha512-PecSzorDGdabF57OBeQO/xFbAkYWo88g4Xvnsx7LRwqLC17I7OoKtA3bQB9uXkY6UkMWCOsA8HSVpaoitscdXw==} + dev: true - /@types/lodash-es@4.17.9: - resolution: {integrity: sha512-ZTcmhiI3NNU7dEvWLZJkzG6ao49zOIjEgIE0RgV7wbPxU0f2xT3VSAHw2gmst8swH6V0YkLRGp4qPlX/6I90MQ==} + /@types/lodash-es@4.17.12: + resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} dependencies: - '@types/lodash': 4.14.198 + '@types/lodash': 4.14.202 dev: false - /@types/lodash@4.14.198: - resolution: {integrity: sha512-trNJ/vtMZYMLhfN45uLq4ShQSw0/S7xCTLLVM+WM1rmFpba/VS42jVUgaO3w/NOLiWR/09lnYk0yMaA/atdIsg==} + /@types/lodash@4.14.202: + resolution: {integrity: sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==} dev: false - /@types/mdast@3.0.12: - resolution: {integrity: sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg==} + /@types/mdast@3.0.15: + resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} dependencies: - '@types/unist': 2.0.8 + '@types/unist': 2.0.10 dev: false - /@types/minimist@1.2.2: - resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} - dev: false + /@types/minimist@1.2.5: + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + dev: true - /@types/node-fetch@2.6.5: - resolution: {integrity: sha512-OZsUlr2nxvkqUFLSaY2ZbA+P1q22q+KrlxWOn/38RX+u5kTkYL2mTujEpzUhGkS+K/QCYp9oagfXG39XOzyySg==} + /@types/node-fetch@2.6.11: + resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} dependencies: - '@types/node': 18.17.17 + '@types/node': 18.19.22 form-data: 4.0.0 dev: false @@ -1263,40 +1476,44 @@ packages: resolution: {integrity: sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg==} dev: true - /@types/node@18.17.17: - resolution: {integrity: sha512-cOxcXsQ2sxiwkykdJqvyFS+MLQPLvIdwh5l6gNg8qF6s+C7XSkEWOZjK+XhUZd+mYvHV/180g2cnCcIl4l06Pw==} + /@types/node@18.19.22: + resolution: {integrity: sha512-p3pDIfuMg/aXBmhkyanPshdfJuX5c5+bQjYLIikPLXAUycEogij/c50n/C+8XOA5L93cU4ZRXtn+dNQGi0IZqQ==} + dependencies: + undici-types: 5.26.5 - /@types/normalize-package-data@2.4.1: - resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} + /@types/normalize-package-data@2.4.4: + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} 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.67.0 + sass: 1.71.1 + dev: true - /@types/semver@7.5.2: - resolution: {integrity: sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw==} + /@types/semver@7.5.8: + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} dev: true - /@types/stylus@0.48.39: - resolution: {integrity: sha512-98a0QrJorrq8+Vsan9yfxol2Qr6nvUWBeV3oYnSMks4QdLMebAzZvRd9IuoZOcnB6Erfjcjn1J2J+63MPCxJnw==} + /@types/stylus@0.48.42: + resolution: {integrity: sha512-CPGlr5teL4sqdap+EOowMifLuNGeIoLwc0VQ7u/BPxo+ocqiNa5jeVt0H0IVBblEh6ZwX1sGpIQIFnSSr8NBQA==} dependencies: - '@types/node': 18.17.17 + '@types/node': 18.19.22 + dev: true - /@types/unist@2.0.8: - resolution: {integrity: sha512-d0XxK3YTObnWVp6rZuev3c49+j4Lo8g4L1ZRm9z5L0xpoZycUPshHgczK5gsUMaZOstjVYYi09p5gYvUtfChYw==} + /@types/unist@2.0.10: + resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} dev: false /@types/web-bluetooth@0.0.16: resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==} dev: false - /@types/web-bluetooth@0.0.17: - resolution: {integrity: sha512-4p9vcSmxAayx72yn70joFoL44c9MO/0+iVEBIQXe3v2h2SiAsEIo/G5v6ObFWvNKRFjbrVadNf9LqEEZeQPzdA==} + /@types/web-bluetooth@0.0.20: + resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} - /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.49.0)(typescript@4.9.5): + /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@4.9.5): resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -1307,24 +1524,24 @@ packages: typescript: optional: true dependencies: - '@eslint-community/regexpp': 4.8.1 - '@typescript-eslint/parser': 5.62.0(eslint@8.49.0)(typescript@4.9.5) + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@4.9.5) '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.49.0)(typescript@4.9.5) - '@typescript-eslint/utils': 5.62.0(eslint@8.49.0)(typescript@4.9.5) + '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.0)(typescript@4.9.5) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@4.9.5) debug: 4.3.4 - eslint: 8.49.0 + eslint: 8.57.0 graphemer: 1.4.0 - ignore: 5.2.4 + ignore: 5.3.1 natural-compare-lite: 1.4.0 - semver: 7.5.4 + semver: 7.6.0 tsutils: 3.21.0(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.49.0)(typescript@5.2.2): + /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@5.4.2): resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -1335,24 +1552,24 @@ packages: typescript: optional: true dependencies: - '@eslint-community/regexpp': 4.8.1 - '@typescript-eslint/parser': 5.62.0(eslint@8.49.0)(typescript@5.2.2) + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.4.2) '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.49.0)(typescript@5.2.2) - '@typescript-eslint/utils': 5.62.0(eslint@8.49.0)(typescript@5.2.2) + '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.0)(typescript@5.4.2) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.4.2) debug: 4.3.4 - eslint: 8.49.0 + eslint: 8.57.0 graphemer: 1.4.0 - ignore: 5.2.4 + ignore: 5.3.1 natural-compare-lite: 1.4.0 - semver: 7.5.4 - tsutils: 3.21.0(typescript@5.2.2) - typescript: 5.2.2 + semver: 7.6.0 + tsutils: 3.21.0(typescript@5.4.2) + typescript: 5.4.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@5.62.0(eslint@8.49.0)(typescript@4.9.5): + /@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@4.9.5): resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -1366,13 +1583,13 @@ packages: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) debug: 4.3.4 - eslint: 8.49.0 + eslint: 8.57.0 typescript: 4.9.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@5.62.0(eslint@8.49.0)(typescript@5.2.2): + /@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.2): resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -1384,10 +1601,10 @@ packages: dependencies: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2) + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.2) debug: 4.3.4 - eslint: 8.49.0 - typescript: 5.2.2 + eslint: 8.57.0 + typescript: 5.4.2 transitivePeerDependencies: - supports-color dev: true @@ -1400,7 +1617,7 @@ packages: '@typescript-eslint/visitor-keys': 5.62.0 dev: true - /@typescript-eslint/type-utils@5.62.0(eslint@8.49.0)(typescript@4.9.5): + /@typescript-eslint/type-utils@5.62.0(eslint@8.57.0)(typescript@4.9.5): resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -1411,16 +1628,16 @@ packages: optional: true dependencies: '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) - '@typescript-eslint/utils': 5.62.0(eslint@8.49.0)(typescript@4.9.5) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@4.9.5) debug: 4.3.4 - eslint: 8.49.0 + eslint: 8.57.0 tsutils: 3.21.0(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/type-utils@5.62.0(eslint@8.49.0)(typescript@5.2.2): + /@typescript-eslint/type-utils@5.62.0(eslint@8.57.0)(typescript@5.4.2): resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -1430,12 +1647,12 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2) - '@typescript-eslint/utils': 5.62.0(eslint@8.49.0)(typescript@5.2.2) + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.2) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.4.2) debug: 4.3.4 - eslint: 8.49.0 - tsutils: 3.21.0(typescript@5.2.2) - typescript: 5.2.2 + eslint: 8.57.0 + tsutils: 3.21.0(typescript@5.4.2) + typescript: 5.4.2 transitivePeerDependencies: - supports-color dev: true @@ -1459,14 +1676,14 @@ packages: debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.5.4 + semver: 7.6.0 tsutils: 3.21.0(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/typescript-estree@5.62.0(typescript@5.2.2): + /@typescript-eslint/typescript-estree@5.62.0(typescript@5.4.2): resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -1480,48 +1697,48 @@ packages: debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.5.4 - tsutils: 3.21.0(typescript@5.2.2) - typescript: 5.2.2 + semver: 7.6.0 + tsutils: 3.21.0(typescript@5.4.2) + typescript: 5.4.2 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils@5.62.0(eslint@8.49.0)(typescript@4.9.5): + /@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@4.9.5): resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.49.0) - '@types/json-schema': 7.0.13 - '@types/semver': 7.5.2 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.8 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) - eslint: 8.49.0 + eslint: 8.57.0 eslint-scope: 5.1.1 - semver: 7.5.4 + semver: 7.6.0 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/utils@5.62.0(eslint@8.49.0)(typescript@5.2.2): + /@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.4.2): resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.49.0) - '@types/json-schema': 7.0.13 - '@types/semver': 7.5.2 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.8 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2) - eslint: 8.49.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.2) + eslint: 8.57.0 eslint-scope: 5.1.1 - semver: 7.5.4 + semver: 7.6.0 transitivePeerDependencies: - supports-color - typescript @@ -1535,119 +1752,156 @@ packages: eslint-visitor-keys: 3.4.3 dev: true - /@vercel/build-utils@7.2.0: - resolution: {integrity: sha512-zLGXMuqRG/s++tqmui6MNRmHHi9phArug6XF5iRLVN8w/w3UxnnMVn3zXmnozrljrjwqSE43u8jLOVDqnk879Q==} + /@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + dev: true + + /@vercel/build-utils@7.8.0: + resolution: {integrity: sha512-kYABisJ/Fzn8eYX27nEKnUhtFvW/8oBGGzPWVSgiN9pwtAa0IYCqFGIsg9EbWiXvBSrVuiS7++k6KU+rEtKs1w==} + dev: true + + /@vercel/error-utils@2.0.2: + resolution: {integrity: sha512-Sj0LFafGpYr6pfCqrQ82X6ukRl5qpmVrHM/191kNYFqkkB9YkjlMAj6QcEsvCG259x4QZ7Tya++0AB85NDPbKQ==} dev: true - /@vercel/error-utils@2.0.1: - resolution: {integrity: sha512-ZUVpRFArh5eyKpJmdfEuCaMpZKQvZgUq0pQ7PdK8m5FgRYEvF4I0TMJH3JnkbYaMMUH82aYWZr+/hFJtEBcmTQ==} + /@vercel/fun@1.1.0: + resolution: {integrity: sha512-SpuPAo+MlAYMtcMcC0plx7Tv4Mp7SQhJJj1iIENlOnABL24kxHpL09XLQMGzZIzIW7upR8c3edwgfpRtp+dhVw==} + engines: {node: '>= 10'} + dependencies: + '@tootallnate/once': 2.0.0 + async-listen: 1.2.0 + debug: 4.1.1 + execa: 3.2.0 + fs-extra: 8.1.0 + generic-pool: 3.4.2 + micro: 9.3.5-canary.3 + ms: 2.1.1 + node-fetch: 2.6.7 + path-match: 1.2.4 + promisepipe: 3.0.0 + semver: 7.3.5 + stat-mode: 0.3.0 + stream-to-promise: 2.2.0 + tar: 4.4.18 + tree-kill: 1.2.2 + uid-promise: 1.0.0 + uuid: 3.3.2 + xdg-app-paths: 5.1.0 + yauzl-promise: 2.1.3 + transitivePeerDependencies: + - encoding + - supports-color dev: true - /@vercel/gatsby-plugin-vercel-analytics@1.0.10: - resolution: {integrity: sha512-v329WHdtIce+y7oAmaWRvEx59Xfo0FxlQqK4BJG0u6VWYoKWPaflohDAiehIZf/YHCRVb59ZxnzmMOcm/LR8YQ==} + /@vercel/gatsby-plugin-vercel-analytics@1.0.11: + resolution: {integrity: sha512-iTEA0vY6RBPuEzkwUTVzSHDATo1aF6bdLLspI68mQ/BTbi5UQEGjpjyzdKOVcSYApDtFU6M6vypZ1t4vIEnHvw==} dependencies: - '@babel/runtime': 7.12.1 web-vitals: 0.2.4 dev: true - /@vercel/gatsby-plugin-vercel-builder@2.0.5: - resolution: {integrity: sha512-NrApRLfSXOs2vJwuX1Hx3vRYM4n+F4LNQgajVW6NAwmWQeKUzfsinA0jduZLYFqpYPeTHXQhbStZL9T4gk8ong==} + /@vercel/gatsby-plugin-vercel-builder@2.0.20: + resolution: {integrity: sha512-CIc2AlXE3kSGnYfYDUgt6+Eha1kByFhhAM2TZNKFIW8AkjP4jly2YZxUoD2GpdRY+TfOlfDD5GzPjrjEa7pttw==} dependencies: '@sinclair/typebox': 0.25.24 - '@vercel/build-utils': 7.2.0 - '@vercel/node': 3.0.5 - '@vercel/routing-utils': 3.0.0 + '@vercel/build-utils': 7.8.0 + '@vercel/routing-utils': 3.1.0 esbuild: 0.14.47 etag: 1.8.1 fs-extra: 11.1.0 - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - - encoding dev: true - /@vercel/go@3.0.1: - resolution: {integrity: sha512-Bd0jdtNbvAeTadqCOHU5YW7f1nd44WplzETNGvAVijG3c2hDyrKIOQNKzBGyqVaca2HwVqtumxIjTS6rJDkMpA==} + /@vercel/go@3.0.5: + resolution: {integrity: sha512-+kEDI+hop3e8BuKisaEozxfzT6GBbp0OMBcgi0tlD5ZTmhGmpwi3vgK5mBQlB+RBXj7qlqDLW/uV2F1Y03FLcQ==} dev: true - /@vercel/hydrogen@1.0.1: - resolution: {integrity: sha512-4PYk4LeIWPTjGtgnxvB0Hdw7aqCau843/96K2xX3z9pa0Hn//pUnZBMz2jrs5MRseCm1Li1LdQAK3u8/vaUnVQ==} + /@vercel/hydrogen@1.0.2: + resolution: {integrity: sha512-/Q2MKk1GfOuZAnkE9jQexjtUQqanbY65R+xtJWd9yKIgwcfRI1hxiNH3uXyVM5AvLoY+fxxULkSuxDtUKpkJpQ==} dependencies: '@vercel/static-config': 3.0.0 ts-morph: 12.0.0 dev: true - /@vercel/next@4.0.5: - resolution: {integrity: sha512-wdRiMqfr//KPEzEJYlQ0Ri4SFbPdnoEJdpktdmaxAK7bREvkJeeCjFAkqBDGb1OiqjyKolxF1xwMewRvLj80MQ==} + /@vercel/next@4.1.5: + resolution: {integrity: sha512-7tylGnpMi5UIt+TUhGhfOcu8LYjJqZsTCjnzHMh1AMhl/tyl8xecxRKGrKxqxnQkqh2yO8tO5vg8KiFpCeGqPg==} + dependencies: + '@vercel/nft': 0.26.4 + transitivePeerDependencies: + - encoding + - supports-color dev: true - /@vercel/nft@0.22.5: - resolution: {integrity: sha512-mug57Wd1BL7GMj9gXMgMeKUjdqO0e4u+0QLPYMFE1rwdJ+55oPy6lp3nIBCS8gOvigT62UI4QKUL2sGqcoW4Hw==} - engines: {node: '>=14'} + /@vercel/nft@0.26.4: + resolution: {integrity: sha512-j4jCOOXke2t8cHZCIxu1dzKLHLcFmYzC3yqAK6MfZznOL1QIJKd0xcFsXK3zcqzU7ScsE2zWkiMMNHGMHgp+FA==} + engines: {node: '>=16'} hasBin: true dependencies: '@mapbox/node-pre-gyp': 1.0.11 '@rollup/pluginutils': 4.2.1 - acorn: 8.10.0 + acorn: 8.11.3 + acorn-import-attributes: 1.9.2(acorn@8.11.3) async-sema: 3.1.1 bindings: 1.5.0 estree-walker: 2.0.2 glob: 7.2.3 graceful-fs: 4.2.11 micromatch: 4.0.5 - node-gyp-build: 4.6.1 + node-gyp-build: 4.8.0 resolve-from: 5.0.0 transitivePeerDependencies: - encoding - supports-color dev: true - /@vercel/node@3.0.5: - resolution: {integrity: sha512-Ow98UMLuODqORNO34j+mbmTGimWD9BjM4onUKkuaSoLaHcl/CAlTTR4m71IdyJeoDBcf0bRURluseED0gmXCTA==} + /@vercel/node@3.0.22: + resolution: {integrity: sha512-opPu9PHiQBEUEnAJa6GPUgbNz2dEi6abkDGV27wjrHErOZemRr687U+SVFoR54CQ3soKASbp/HGHggCfow0SVQ==} dependencies: - '@edge-runtime/node-utils': 2.2.1 - '@edge-runtime/primitives': 3.1.1 - '@edge-runtime/vm': 3.1.1 + '@edge-runtime/node-utils': 2.3.0 + '@edge-runtime/primitives': 4.1.0 + '@edge-runtime/vm': 3.2.0 '@types/node': 14.18.33 - '@vercel/build-utils': 7.2.0 - '@vercel/error-utils': 2.0.1 + '@vercel/build-utils': 7.8.0 + '@vercel/error-utils': 2.0.2 + '@vercel/nft': 0.26.4 '@vercel/static-config': 3.0.0 async-listen: 3.0.0 - content-type: 1.0.5 - edge-runtime: 2.5.1 + cjs-module-lexer: 1.2.3 + edge-runtime: 2.5.9 + es-module-lexer: 1.4.1 esbuild: 0.14.47 - exit-hook: 2.2.1 + etag: 1.8.1 node-fetch: 2.6.9 path-to-regexp: 6.2.1 ts-morph: 12.0.0 ts-node: 10.9.1(@types/node@14.18.33)(typescript@4.9.5) typescript: 4.9.5 - undici: 5.23.0 + undici: 5.26.5 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' - encoding + - supports-color dev: true - /@vercel/python@4.0.1: - resolution: {integrity: sha512-3VfHbLBJ+JIQjUTjosveDM4Y8O6u9vkYWvJYg7BJIyv2TFzJcl8fhW5qurPb5Z7kMj2aRQaN1YRjDvElCOqwVA==} + /@vercel/python@4.1.1: + resolution: {integrity: sha512-EbAdKOZ0hPd5b59tLt7R3RQK1azNvuZTrCFRAVHNjqcIHNCmrSvjag5zBGn7Memkk8qWb3+CgBw9K/3LJKei0w==} dev: true - /@vercel/redwood@2.0.2: - resolution: {integrity: sha512-TyCloruHLi5kBrFPTPDVcQoDDYHG3VfA9ZngNBpqHXQqhR4VsymTh8wV0995faKMPiHcQFbJy7WArhxC/T0Png==} + /@vercel/redwood@2.0.8: + resolution: {integrity: sha512-hAu7SYXDt+W7kscjtQ5NsuNflXH+QB5/xAdA6FRSS/e41lG6Xq6pqLMDobqq4BR7E2PpppVDw2DUx9KzPNoeEw==} dependencies: - '@vercel/nft': 0.22.5 - '@vercel/routing-utils': 3.0.0 + '@vercel/nft': 0.26.4 + '@vercel/routing-utils': 3.1.0 semver: 6.3.1 transitivePeerDependencies: - encoding - supports-color dev: true - /@vercel/remix-builder@2.0.5: - resolution: {integrity: sha512-EzqyE/B4dNhKYmukOGBDrRl5Z/J7UkX8Q9DXOr0EBR1fs09l+T/qxLshk7rLU2ubl1oDHiIuxOYQWHVb2vtdFw==} + /@vercel/remix-builder@2.1.2: + resolution: {integrity: sha512-CLIwxxcgGw3BdoDCGV2c98+BdPnmdYotzvJQ+PQbL6u+Nbo3zIAAspwVPP7RhL8OIPzDiFTW4GjeaaIRI+7dbw==} dependencies: - '@vercel/nft': 0.22.5 + '@vercel/error-utils': 2.0.2 + '@vercel/nft': 0.26.4 '@vercel/static-config': 3.0.0 ts-morph: 12.0.0 transitivePeerDependencies: @@ -1655,27 +1909,25 @@ packages: - supports-color dev: true - /@vercel/routing-utils@3.0.0: - resolution: {integrity: sha512-u+SoHnL+RzRQIRP+YxvigzzKXQcbgYQF9qCTIuWuoLw5h9thIYWcDJvz3KxrUzxjGZ3dWboXA29KAlT6eeaeFw==} + /@vercel/routing-utils@3.1.0: + resolution: {integrity: sha512-Ci5xTjVTJY/JLZXpCXpLehMft97i9fH34nu9PGav6DtwkVUF6TOPX86U0W0niQjMZ5n6/ZP0BwcJK2LOozKaGw==} dependencies: path-to-regexp: 6.1.0 optionalDependencies: ajv: 6.12.6 dev: true - /@vercel/ruby@2.0.2: - resolution: {integrity: sha512-MqFynhtZ905L210DWAbgkiEQEK39LTtp9eL2Nm6PjzhjNzU6hV0UfK8Z24vU9CC6J4mrUTTZx396fH7XTYJWqg==} + /@vercel/ruby@2.0.5: + resolution: {integrity: sha512-Gfm8HDech41vf+EPleRzgoJUnDTJerKgckMm4KX0JT860gV9XBMSOWYH7eMWHmMza104+HRCWL7wT6OlpftF2Q==} dev: true - /@vercel/static-build@2.0.6: - resolution: {integrity: sha512-gMqSK+kR8WQupcHXFDnZvpt6z30p1tqRggU68xQP3aI9Spqk6tWT8hXscdPH6OOsQ+fJmis6STc4/4zWZO2WLw==} + /@vercel/static-build@2.4.2: + resolution: {integrity: sha512-TYEIzc33tsBFG3IhxmkTwonyhe0K7e951p4tvfoB6dkOQ6jRusHi5lxtJRiT+MQ8UzCmcaCrt8vEMYnakmH3qQ==} dependencies: - '@vercel/gatsby-plugin-vercel-analytics': 1.0.10 - '@vercel/gatsby-plugin-vercel-builder': 2.0.5 - transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - - encoding + '@vercel/gatsby-plugin-vercel-analytics': 1.0.11 + '@vercel/gatsby-plugin-vercel-builder': 2.0.20 + '@vercel/static-config': 3.0.0 + ts-morph: 12.0.0 dev: true /@vercel/static-config@3.0.0: @@ -1686,192 +1938,186 @@ packages: ts-morph: 12.0.0 dev: true - /@vitejs/plugin-vue@4.3.4(vite@4.4.9)(vue@3.3.4): - resolution: {integrity: sha512-ciXNIHKPriERBisHFBvnTbfKa6r9SAesOYXeGDzgegcvy9Q4xdScSHAmKbNT0M3O0S9LKhIf5/G+UYG4NnnzYw==} - engines: {node: ^14.18.0 || >=16.0.0} + /@vitejs/plugin-vue@5.0.4(vite@5.1.5)(vue@3.4.21): + resolution: {integrity: sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==} + engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: - vite: ^4.0.0 + vite: ^5.0.0 vue: ^3.2.25 dependencies: - vite: 4.4.9(@types/node@18.17.17)(stylus@0.59.0) - vue: 3.3.4 + vite: 5.1.5(@types/node@18.19.22)(stylus@0.63.0) + vue: 3.4.21(typescript@5.4.2) dev: true - /@vitest/coverage-v8@0.34.4(vitest@0.34.4): - resolution: {integrity: sha512-TZ5ghzhmg3COQqfBShL+zRQEInHmV9TSwghTdfkHpCTyTOr+rxo6x41vCNcVfWysWULtqtBVpY6YFNovxnESfA==} + /@vitest/coverage-v8@1.3.1(vitest@1.3.1): + resolution: {integrity: sha512-UuBnkSJUNE9rdHjDCPyJ4fYuMkoMtnghes1XohYa4At0MS3OQSAo97FrbwSLRshYsXThMZy1+ybD/byK5llyIg==} peerDependencies: - vitest: '>=0.32.0 <1' + vitest: 1.3.1 dependencies: - '@ampproject/remapping': 2.2.1 + '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 - istanbul-lib-coverage: 3.2.0 + debug: 4.3.4 + istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.6 - magic-string: 0.30.3 + istanbul-reports: 3.1.7 + magic-string: 0.30.8 + magicast: 0.3.3 picocolors: 1.0.0 - std-env: 3.4.3 + std-env: 3.7.0 test-exclude: 6.0.0 - v8-to-istanbul: 9.1.0 - vitest: 0.34.4(jsdom@22.1.0)(stylus@0.59.0) + v8-to-istanbul: 9.2.0 + vitest: 1.3.1(@types/node@18.19.22)(jsdom@24.0.0)(stylus@0.63.0) transitivePeerDependencies: - supports-color dev: true - /@vitest/expect@0.34.4: - resolution: {integrity: sha512-XlMKX8HyYUqB8dsY8Xxrc64J2Qs9pKMt2Z8vFTL4mBWXJsg4yoALHzJfDWi8h5nkO4Zua4zjqtapQ/IluVkSnA==} + /@vitest/expect@1.3.1: + resolution: {integrity: sha512-xofQFwIzfdmLLlHa6ag0dPV8YsnKOCP1KdAeVVh34vSjN2dcUiXYCD9htu/9eM7t8Xln4v03U9HLxLpPlsXdZw==} dependencies: - '@vitest/spy': 0.34.4 - '@vitest/utils': 0.34.4 - chai: 4.3.8 + '@vitest/spy': 1.3.1 + '@vitest/utils': 1.3.1 + chai: 4.4.1 dev: true - /@vitest/runner@0.34.4: - resolution: {integrity: sha512-hwwdB1StERqUls8oV8YcpmTIpVeJMe4WgYuDongVzixl5hlYLT2G8afhcdADeDeqCaAmZcSgLTLtqkjPQF7x+w==} + /@vitest/runner@1.3.1: + resolution: {integrity: sha512-5FzF9c3jG/z5bgCnjr8j9LNq/9OxV2uEBAITOXfoe3rdZJTdO7jzThth7FXv/6b+kdY65tpRQB7WaKhNZwX+Kg==} dependencies: - '@vitest/utils': 0.34.4 - p-limit: 4.0.0 - pathe: 1.1.1 + '@vitest/utils': 1.3.1 + p-limit: 5.0.0 + pathe: 1.1.2 dev: true - /@vitest/snapshot@0.34.4: - resolution: {integrity: sha512-GCsh4coc3YUSL/o+BPUo7lHQbzpdttTxL6f4q0jRx2qVGoYz/cyTRDJHbnwks6TILi6560bVWoBpYC10PuTLHw==} + /@vitest/snapshot@1.3.1: + resolution: {integrity: sha512-EF++BZbt6RZmOlE3SuTPu/NfwBF6q4ABS37HHXzs2LUVPBLx2QoY/K0fKpRChSo8eLiuxcbCVfqKgx/dplCDuQ==} dependencies: - magic-string: 0.30.3 - pathe: 1.1.1 + magic-string: 0.30.8 + pathe: 1.1.2 pretty-format: 29.7.0 dev: true - /@vitest/spy@0.34.4: - resolution: {integrity: sha512-PNU+fd7DUPgA3Ya924b1qKuQkonAW6hL7YUjkON3wmBwSTIlhOSpy04SJ0NrRsEbrXgMMj6Morh04BMf8k+w0g==} + /@vitest/spy@1.3.1: + resolution: {integrity: sha512-xAcW+S099ylC9VLU7eZfdT9myV67Nor9w9zhf0mGCYJSO+zM2839tOeROTdikOi/8Qeusffvxb/MyBSOja1Uig==} dependencies: - tinyspy: 2.1.1 + tinyspy: 2.2.1 dev: true - /@vitest/utils@0.34.4: - resolution: {integrity: sha512-yR2+5CHhp/K4ySY0Qtd+CAL9f5Yh1aXrKfAT42bq6CtlGPh92jIDDDSg7ydlRow1CP+dys4TrOrbELOyNInHSg==} + /@vitest/utils@1.3.1: + resolution: {integrity: sha512-d3Waie/299qqRyHTm2DjADeTaNdNSVsnwHPWrs20JMpjh6eiVq7ggggweO8rc4arhf6rRkWuHKwvxGvejUXZZQ==} dependencies: diff-sequences: 29.6.3 - loupe: 2.3.6 + estree-walker: 3.0.3 + loupe: 2.3.7 pretty-format: 29.7.0 dev: true - /@volar/language-core@1.10.1: - resolution: {integrity: sha512-JnsM1mIPdfGPxmoOcK1c7HYAsL6YOv0TCJ4aW3AXPZN/Jb4R77epDyMZIVudSGjWMbvv/JfUa+rQ+dGKTmgwBA==} + /@volar/language-core@2.1.2: + resolution: {integrity: sha512-5qsDp0Gf6fE09UWCeK7bkVn6NxMwC9OqFWQkMMkeej8h8XjyABPdRygC2RCrqDrfVdGijqlMQeXs6yRS+vfZYA==} dependencies: - '@volar/source-map': 1.10.1 + '@volar/source-map': 2.1.2 dev: true - /@volar/source-map@1.10.1: - resolution: {integrity: sha512-3/S6KQbqa7pGC8CxPrg69qHLpOvkiPHGJtWPkI/1AXCsktkJ6gIk/5z4hyuMp8Anvs6eS/Kvp/GZa3ut3votKA==} + /@volar/source-map@2.1.2: + resolution: {integrity: sha512-yFJqsuLm1OaWrsz9E3yd3bJcYIlHqdZ8MbmIoZLrAzMYQDcoF26/INIhgziEXSdyHc8xd7rd/tJdSnUyh0gH4Q==} dependencies: - muggle-string: 0.3.1 + muggle-string: 0.4.1 dev: true - /@volar/typescript@1.10.1: - resolution: {integrity: sha512-+iiO9yUSRHIYjlteT+QcdRq8b44qH19/eiUZtjNtuh6D9ailYM7DVR0zO2sEgJlvCaunw/CF9Ov2KooQBpR4VQ==} + /@volar/typescript@2.1.2: + resolution: {integrity: sha512-lhTancZqamvaLvoz0u/uth8dpudENNt2LFZOWCw9JZiX14xRFhdhfzmphiCRb7am9E6qAJSbdS/gMt1utXAoHQ==} dependencies: - '@volar/language-core': 1.10.1 + '@volar/language-core': 2.1.2 + path-browserify: 1.0.1 dev: true - /@vue/compiler-core@3.3.4: - resolution: {integrity: sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==} + /@vue/compiler-core@3.4.21: + resolution: {integrity: sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==} dependencies: - '@babel/parser': 7.22.16 - '@vue/shared': 3.3.4 + '@babel/parser': 7.24.0 + '@vue/shared': 3.4.21 + entities: 4.5.0 estree-walker: 2.0.2 source-map-js: 1.0.2 - /@vue/compiler-dom@3.3.4: - resolution: {integrity: sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==} + /@vue/compiler-dom@3.4.21: + resolution: {integrity: sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA==} dependencies: - '@vue/compiler-core': 3.3.4 - '@vue/shared': 3.3.4 + '@vue/compiler-core': 3.4.21 + '@vue/shared': 3.4.21 - /@vue/compiler-sfc@3.3.4: - resolution: {integrity: sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==} + /@vue/compiler-sfc@3.4.21: + resolution: {integrity: sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==} dependencies: - '@babel/parser': 7.22.16 - '@vue/compiler-core': 3.3.4 - '@vue/compiler-dom': 3.3.4 - '@vue/compiler-ssr': 3.3.4 - '@vue/reactivity-transform': 3.3.4 - '@vue/shared': 3.3.4 + '@babel/parser': 7.24.0 + '@vue/compiler-core': 3.4.21 + '@vue/compiler-dom': 3.4.21 + '@vue/compiler-ssr': 3.4.21 + '@vue/shared': 3.4.21 estree-walker: 2.0.2 - magic-string: 0.30.3 - postcss: 8.4.29 + magic-string: 0.30.8 + postcss: 8.4.35 source-map-js: 1.0.2 - /@vue/compiler-ssr@3.3.4: - resolution: {integrity: sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==} + /@vue/compiler-ssr@3.4.21: + resolution: {integrity: sha512-M5+9nI2lPpAsgXOGQobnIueVqc9sisBFexh5yMIMRAPYLa7+5wEJs8iqOZc1WAa9WQbx9GR2twgznU8LTIiZ4Q==} dependencies: - '@vue/compiler-dom': 3.3.4 - '@vue/shared': 3.3.4 + '@vue/compiler-dom': 3.4.21 + '@vue/shared': 3.4.21 - /@vue/devtools-api@6.5.0: - resolution: {integrity: sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==} + /@vue/devtools-api@6.6.1: + resolution: {integrity: sha512-LgPscpE3Vs0x96PzSSB4IGVSZXZBZHpfxs+ZA1d+VEPwHdOXowy/Y2CsvCAIFrf+ssVU1pD1jidj505EpUnfbA==} dev: false - /@vue/language-core@1.8.11(typescript@5.2.2): - resolution: {integrity: sha512-+MZOBGqGwfld6hpo0DB47x8eNM0dNqk15ZdfOhj19CpvuYuOWCeVdOEGZunKDyo3QLkTn3kLOSysJzg7FDOQBA==} + /@vue/language-core@2.0.6(typescript@5.4.2): + resolution: {integrity: sha512-UzqU12tzf9XLqRO3TiWPwRNpP4fyUzE6MAfOQWQNZ4jy6a30ARRUpmODDKq6O8C4goMc2AlPqTmjOHPjHkilSg==} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@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 + '@volar/language-core': 2.1.2 + '@vue/compiler-dom': 3.4.21 + '@vue/shared': 3.4.21 + computeds: 0.0.1 minimatch: 9.0.3 - muggle-string: 0.3.1 - typescript: 5.2.2 - vue-template-compiler: 2.7.14 + path-browserify: 1.0.1 + typescript: 5.4.2 + vue-template-compiler: 2.7.16 dev: true - /@vue/reactivity-transform@3.3.4: - resolution: {integrity: sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==} - dependencies: - '@babel/parser': 7.22.16 - '@vue/compiler-core': 3.3.4 - '@vue/shared': 3.3.4 - estree-walker: 2.0.2 - magic-string: 0.30.3 - - /@vue/reactivity@3.3.4: - resolution: {integrity: sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==} + /@vue/reactivity@3.4.21: + resolution: {integrity: sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==} dependencies: - '@vue/shared': 3.3.4 + '@vue/shared': 3.4.21 - /@vue/runtime-core@3.3.4: - resolution: {integrity: sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==} + /@vue/runtime-core@3.4.21: + resolution: {integrity: sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA==} dependencies: - '@vue/reactivity': 3.3.4 - '@vue/shared': 3.3.4 + '@vue/reactivity': 3.4.21 + '@vue/shared': 3.4.21 - /@vue/runtime-dom@3.3.4: - resolution: {integrity: sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==} + /@vue/runtime-dom@3.4.21: + resolution: {integrity: sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw==} dependencies: - '@vue/runtime-core': 3.3.4 - '@vue/shared': 3.3.4 - csstype: 3.1.2 + '@vue/runtime-core': 3.4.21 + '@vue/shared': 3.4.21 + csstype: 3.1.3 - /@vue/server-renderer@3.3.4(vue@3.3.4): - resolution: {integrity: sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==} + /@vue/server-renderer@3.4.21(vue@3.4.21): + resolution: {integrity: sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==} peerDependencies: - vue: 3.3.4 + vue: 3.4.21 dependencies: - '@vue/compiler-ssr': 3.3.4 - '@vue/shared': 3.3.4 - vue: 3.3.4 + '@vue/compiler-ssr': 3.4.21 + '@vue/shared': 3.4.21 + vue: 3.4.21(typescript@5.4.2) - /@vue/shared@3.3.4: - resolution: {integrity: sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==} + /@vue/shared@3.4.21: + resolution: {integrity: sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==} - /@vue/test-utils@2.4.1(vue@3.3.4): - resolution: {integrity: sha512-VO8nragneNzUZUah6kOjiFmD/gwRjUauG9DROh6oaOeFwX1cZRUNHhdeogE8635cISigXFTtGLUQWx5KCb0xeg==} + /@vue/test-utils@2.4.4(vue@3.4.21): + resolution: {integrity: sha512-8jkRxz8pNhClAf4Co4ZrpAoFISdvT3nuSkUlY6Ys6rmTpw3DMWG/X3mw3gQ7QJzgCZO9f+zuE2kW57fi09MW7Q==} peerDependencies: '@vue/server-renderer': ^3.0.1 vue: ^3.0.1 @@ -1879,104 +2125,103 @@ packages: '@vue/server-renderer': optional: true dependencies: - js-beautify: 1.14.9 - vue: 3.3.4 - vue-component-type-helpers: 1.8.4 + js-beautify: 1.15.1 + vue: 3.4.21(typescript@5.4.2) + vue-component-type-helpers: 1.8.27 dev: true - /@vue/typescript@1.8.11(typescript@5.2.2): - resolution: {integrity: sha512-skUmMDiPUUtu1flPmf2YybF+PX8IzBtMioQOaNn6Ck/RhdrPJGj1AX/7s3Buf9G6ln+/KHR1XQuti/FFxw5XVA==} + /@vueuse/components@10.9.0(vue@3.4.21): + resolution: {integrity: sha512-BHQpA0yIi3y7zKa1gYD0FUzLLkcRTqVhP8smnvsCK6GFpd94Nziq1XVPD7YpFeho0k5BzbBiNZF7V/DpkJ967A==} dependencies: - '@volar/typescript': 1.10.1 - '@vue/language-core': 1.8.11(typescript@5.2.2) - transitivePeerDependencies: - - typescript - dev: true - - /@vueuse/components@10.4.1(vue@3.3.4): - resolution: {integrity: sha512-hEWeumCfH394fkEYc/hng6T5VcjVkdqx7b75Sd6z4Uw3anjeo93Zp9qqtzFOv5bAmHls3Zy04Kowo1glrxDFRQ==} - dependencies: - '@vueuse/core': 10.4.1(vue@3.3.4) - '@vueuse/shared': 10.4.1(vue@3.3.4) - vue-demi: 0.14.6(vue@3.3.4) + '@vueuse/core': 10.9.0(vue@3.4.21) + '@vueuse/shared': 10.9.0(vue@3.4.21) + vue-demi: 0.14.7(vue@3.4.21) transitivePeerDependencies: - '@vue/composition-api' - vue dev: false - /@vueuse/core@10.4.1(vue@3.3.4): - resolution: {integrity: sha512-DkHIfMIoSIBjMgRRvdIvxsyboRZQmImofLyOHADqiVbQVilP8VVHDhBX2ZqoItOgu7dWa8oXiNnScOdPLhdEXg==} + /@vueuse/core@10.9.0(vue@3.4.21): + resolution: {integrity: sha512-/1vjTol8SXnx6xewDEKfS0Ra//ncg4Hb0DaZiwKf7drgfMsKFExQ+FnnENcN6efPen+1kIzhLQoGSy0eDUVOMg==} dependencies: - '@types/web-bluetooth': 0.0.17 - '@vueuse/metadata': 10.4.1 - '@vueuse/shared': 10.4.1(vue@3.3.4) - vue-demi: 0.14.6(vue@3.3.4) + '@types/web-bluetooth': 0.0.20 + '@vueuse/metadata': 10.9.0 + '@vueuse/shared': 10.9.0(vue@3.4.21) + vue-demi: 0.14.7(vue@3.4.21) transitivePeerDependencies: - '@vue/composition-api' - vue - /@vueuse/core@9.13.0(vue@3.3.4): + /@vueuse/core@9.13.0(vue@3.4.21): resolution: {integrity: sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==} dependencies: '@types/web-bluetooth': 0.0.16 '@vueuse/metadata': 9.13.0 - '@vueuse/shared': 9.13.0(vue@3.3.4) - vue-demi: 0.14.6(vue@3.3.4) + '@vueuse/shared': 9.13.0(vue@3.4.21) + vue-demi: 0.14.7(vue@3.4.21) transitivePeerDependencies: - '@vue/composition-api' - vue dev: false - /@vueuse/metadata@10.4.1: - resolution: {integrity: sha512-2Sc8X+iVzeuMGHr6O2j4gv/zxvQGGOYETYXEc41h0iZXIRnRbJZGmY/QP8dvzqUelf8vg0p/yEA5VpCEu+WpZg==} + /@vueuse/metadata@10.9.0: + resolution: {integrity: sha512-iddNbg3yZM0X7qFY2sAotomgdHK7YJ6sKUvQqbvwnf7TmaVPxS4EJydcNsVejNdS8iWCtDk+fYXr7E32nyTnGA==} /@vueuse/metadata@9.13.0: resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==} dev: false - /@vueuse/shared@10.4.1(vue@3.3.4): - resolution: {integrity: sha512-vz5hbAM4qA0lDKmcr2y3pPdU+2EVw/yzfRsBdu+6+USGa4PxqSQRYIUC9/NcT06y+ZgaTsyURw2I9qOFaaXHAg==} + /@vueuse/shared@10.9.0(vue@3.4.21): + resolution: {integrity: sha512-Uud2IWncmAfJvRaFYzv5OHDli+FbOzxiVEQdLCKQKLyhz94PIyFC3CHcH7EDMwIn8NPtD06+PNbC/PiO0LGLtw==} dependencies: - vue-demi: 0.14.6(vue@3.3.4) + vue-demi: 0.14.7(vue@3.4.21) transitivePeerDependencies: - '@vue/composition-api' - vue - /@vueuse/shared@9.13.0(vue@3.3.4): + /@vueuse/shared@9.13.0(vue@3.4.21): resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==} dependencies: - vue-demi: 0.14.6(vue@3.3.4) + vue-demi: 0.14.7(vue@3.4.21) transitivePeerDependencies: - '@vue/composition-api' - vue dev: false - /abab@2.0.6: - resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} - dev: true - /abbrev@1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} dev: true - /acorn-jsx@5.3.2(acorn@8.10.0): + /abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + + /acorn-import-attributes@1.9.2(acorn@8.11.3): + resolution: {integrity: sha512-O+nfJwNolEA771IYJaiLWK1UAwjNsQmZbTRqqwBYxCgVQTmpFEMvBw6LOIQV0Me339L5UMVYFyRohGnGlQDdIQ==} + peerDependencies: + acorn: ^8 + dependencies: + acorn: 8.11.3 + dev: true + + /acorn-jsx@5.3.2(acorn@8.11.3): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 8.10.0 + acorn: 8.11.3 dev: true - /acorn-walk@8.2.0: - resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + /acorn-walk@8.3.2: + resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} engines: {node: '>=0.4.0'} dev: true - /acorn@8.10.0: - resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} + /acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} engines: {node: '>=0.4.0'} hasBin: true - dev: true /agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} @@ -1987,6 +2232,15 @@ packages: - supports-color dev: true + /agent-base@7.1.0: + resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} + engines: {node: '>= 14'} + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + /ajv-formats@2.1.1(ajv@8.12.0): resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} peerDependencies: @@ -2032,6 +2286,7 @@ packages: /ansi-regex@6.0.1: resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} engines: {node: '>=12'} + dev: true /ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} @@ -2054,10 +2309,11 @@ packages: /ansi-styles@6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} + dev: true /any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - dev: false + dev: true /anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} @@ -2078,6 +2334,10 @@ packages: readable-stream: 3.6.2 dev: true + /arg@4.1.0: + resolution: {integrity: sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==} + dev: true + /arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} dev: true @@ -2100,23 +2360,23 @@ packages: /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} + dev: true - /asn1.js@5.4.1: - resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==} + /asn1.js@4.10.1: + resolution: {integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==} dependencies: bn.js: 4.12.0 inherits: 2.0.4 minimalistic-assert: 1.0.1 - safer-buffer: 2.1.2 dev: true /assert@2.1.0: resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.7 is-nan: 1.3.2 - object-is: 1.1.5 - object.assign: 4.1.4 + object-is: 1.1.6 + object.assign: 4.1.5 util: 0.12.5 dev: true @@ -2131,23 +2391,27 @@ packages: '@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.2) + astrojs-compiler-sync: 0.3.5(@astrojs/compiler@1.8.2) debug: 4.3.4 eslint-visitor-keys: 3.4.3 espree: 9.6.1 - semver: 7.5.4 + semver: 7.6.0 transitivePeerDependencies: - supports-color dev: true - /astrojs-compiler-sync@0.3.3(@astrojs/compiler@1.8.2): - resolution: {integrity: sha512-LbhchWgsvjvRBb5n5ez8/Q/f9ZKViuox27VxMDOdTUm8MRv9U7phzOiLue5KluqTmC0z1LId4gY2SekvoDrkuw==} + /astrojs-compiler-sync@0.3.5(@astrojs/compiler@1.8.2): + resolution: {integrity: sha512-y420rhIIJ2HHDkYeqKArBHSdJNIIGMztLH90KGIX3zjcJyt/cr9Z2wYA8CP5J1w6KE7xqMh0DAkhfjhNDpQb2Q==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: '@astrojs/compiler': '>=0.27.0' dependencies: '@astrojs/compiler': 1.8.2 - synckit: 0.8.5 + synckit: 0.9.0 + dev: true + + /async-listen@1.2.0: + resolution: {integrity: sha512-CcEtRh/oc9Jc4uWeUwdpG/+Mb2YUHKmdaTf0gUr7Wa+bfp4xx70HOb3RuSTJMvqKNB1TkdTfjLdrcz2X4rkkZA==} dev: true /async-listen@3.0.0: @@ -2168,8 +2432,8 @@ packages: resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==} dev: false - /async@3.2.4: - resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} + /async@3.2.5: + resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} dev: true /asynckit@0.4.0: @@ -2179,16 +2443,18 @@ packages: resolution: {integrity: sha512-Xfmb4q5QV7uqTlVdMSTtO5eF4DCHfNOdaPyKlbFShkzeNP+3lj3yjjcbdjSmEY4+pDBKJ9g26aP+ImTe88UHoQ==} dependencies: stubborn-fs: 1.2.5 - when-exit: 2.1.1 + when-exit: 2.1.2 dev: false - /available-typed-arrays@1.0.5: - resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + /available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} + dependencies: + possible-typed-array-names: 1.0.0 dev: true - /axobject-query@3.2.1: - resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} + /axobject-query@4.0.0: + resolution: {integrity: sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==} dependencies: dequal: 2.0.3 dev: true @@ -2199,6 +2465,7 @@ packages: /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -2207,11 +2474,6 @@ packages: resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} dev: false - /big-integer@1.6.51: - resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} - engines: {node: '>=0.6'} - dev: true - /binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} @@ -2237,23 +2499,18 @@ packages: /boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - /bplist-parser@0.2.0: - resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} - engines: {node: '>= 5.10.0'} - dependencies: - big-integer: 1.6.51 - dev: true - /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 + dev: true /brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} dependencies: balanced-match: 1.0.2 + dev: true /braces@3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} @@ -2272,7 +2529,7 @@ packages: /browser-resolve@2.0.0: resolution: {integrity: sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==} dependencies: - resolve: 1.22.6 + resolve: 1.22.8 dev: true /browserify-aes@1.2.0: @@ -2310,17 +2567,19 @@ packages: randombytes: 2.1.0 dev: true - /browserify-sign@4.2.1: - resolution: {integrity: sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==} + /browserify-sign@4.2.3: + resolution: {integrity: sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==} + engines: {node: '>= 0.12'} dependencies: bn.js: 5.2.1 browserify-rsa: 4.1.0 create-hash: 1.2.0 create-hmac: 1.1.7 - elliptic: 6.5.4 + elliptic: 6.5.5 + hash-base: 3.0.4 inherits: 2.0.4 - parse-asn1: 5.1.6 - readable-stream: 3.6.2 + parse-asn1: 5.1.7 + readable-stream: 2.3.8 safe-buffer: 5.2.1 dev: true @@ -2330,6 +2589,10 @@ packages: pako: 1.0.11 dev: true + /buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + dev: true + /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} dev: true @@ -2345,54 +2608,32 @@ packages: ieee754: 1.2.1 dev: true - /buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - dev: true - /builtin-status-codes@3.0.0: resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==} dev: true - /bundle-name@3.0.0: - resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} - engines: {node: '>=12'} - dependencies: - run-applescript: 5.0.0 - dev: true - - /bundle-require@3.1.2(esbuild@0.14.54): - resolution: {integrity: sha512-Of6l6JBAxiyQ5axFxUM6dYeP/W7X2Sozeo/4EYB9sJhL+dqL7TKjg+shwxp6jlu/6ZSERfsYtIpSJ1/x3XkAEA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - peerDependencies: - esbuild: '>=0.13' - dependencies: - esbuild: 0.14.54 - load-tsconfig: 0.2.5 - dev: false - - /busboy@1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} - dependencies: - streamsearch: 1.1.0 - dev: true - /byte-base64@1.1.0: resolution: {integrity: sha512-56cXelkJrVMdCY9V/3RfDxTh4VfMFCQ5km7B7GkIGfo4bcPL9aACyJLB0Ms3Ezu5rsHmLB2suis96z4fLM03DA==} dev: false + /bytes@3.1.0: + resolution: {integrity: sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==} + engines: {node: '>= 0.8'} + dev: true + /cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} - /call-bind@1.0.2: - resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + /call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} dependencies: - function-bind: 1.1.1 - get-intrinsic: 1.2.1 + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 dev: true /callsites@3.1.0: @@ -2411,15 +2652,15 @@ packages: resolution: {integrity: sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==} dev: false - /chai@4.3.8: - resolution: {integrity: sha512-vX4YvVVtxlfSZ2VecZgFUTU5qPCYsobVI2O9FmwEXBhDigYGQA6jRXCycIs1yJnnWbZ6/+a2zNIF5DfVCcJBFQ==} + /chai@4.4.1: + resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} engines: {node: '>=4'} dependencies: assertion-error: 1.1.0 - check-error: 1.0.2 + check-error: 1.0.3 deep-eql: 4.1.3 - get-func-name: 2.0.0 - loupe: 2.3.6 + get-func-name: 2.0.2 + loupe: 2.3.7 pathval: 1.1.1 type-detect: 4.0.8 dev: true @@ -2439,6 +2680,7 @@ packages: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 + dev: true /character-entities-legacy@1.1.4: resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} @@ -2459,17 +2701,19 @@ packages: dependencies: cac: 6.7.14 conf: 11.0.2 - eventsource-parser: 1.0.0 - js-tiktoken: 1.0.7 - keyv: 4.5.3 + eventsource-parser: 1.1.2 + js-tiktoken: 1.0.10 + keyv: 4.5.4 p-timeout: 6.1.2 quick-lru: 6.1.2 read-pkg-up: 9.1.0 uuid: 9.0.1 dev: false - /check-error@1.0.2: - resolution: {integrity: sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==} + /check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + dependencies: + get-func-name: 2.0.2 dev: true /cheerio-select@2.1.0: @@ -2481,7 +2725,6 @@ packages: domelementtype: 2.3.0 domhandler: 5.0.3 domutils: 3.1.0 - dev: false /cheerio@1.0.0-rc.12: resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} @@ -2494,10 +2737,24 @@ packages: htmlparser2: 8.0.2 parse5: 7.1.2 parse5-htmlparser2-tree-adapter: 7.0.0 - dev: false - /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + /chokidar@3.3.1: + resolution: {integrity: sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.3.0 + optionalDependencies: + fsevents: 2.1.3 + dev: true + + /chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} dependencies: anymatch: 3.1.3 @@ -2510,6 +2767,10 @@ packages: optionalDependencies: fsevents: 2.3.3 + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: true + /chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} @@ -2522,8 +2783,12 @@ packages: safe-buffer: 5.2.1 dev: true - /clean-css@5.3.2: - resolution: {integrity: sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==} + /cjs-module-lexer@1.2.3: + resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} + dev: true + + /clean-css@5.3.3: + resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} engines: {node: '>= 10.0'} dependencies: source-map: 0.6.1 @@ -2546,8 +2811,8 @@ packages: resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==} dependencies: '@jridgewell/sourcemap-codec': 1.4.15 - '@types/estree': 1.0.1 - acorn: 8.10.0 + '@types/estree': 1.0.5 + acorn: 8.11.3 estree-walker: 3.0.3 periscopic: 3.1.0 dev: true @@ -2594,18 +2859,27 @@ packages: /commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - /commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - dev: false - /commander@8.3.0: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} + + /commonmark@0.28.1: + resolution: {integrity: sha512-PklsZ9pgrfFQ5hQH9BRzoWnqI9db2LeR9MhvkNk8iz97kfaTNmhTU+IE8jKDHTEfivZZXoFqzGqzddXdk14EJw==} + hasBin: true + dependencies: + entities: 1.1.2 + mdurl: 1.0.1 + minimist: 1.2.8 + string.prototype.repeat: 0.2.0 + dev: false + + /computeds@0.0.1: + resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==} dev: true /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true /conf@11.0.2: resolution: {integrity: sha512-jjyhlQ0ew/iwmtwsS2RaB6s8DBifcE2GYBEaw2SJDUY/slJJbNfY4GlDVzOs/ff8cM/Wua5CikqXgbFl5eu85A==} @@ -2618,7 +2892,7 @@ packages: dot-prop: 7.2.0 env-paths: 3.0.0 json-schema-typed: 8.0.1 - semver: 7.5.4 + semver: 7.6.0 dev: false /config-chain@1.1.13: @@ -2649,8 +2923,8 @@ packages: resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==} dev: true - /content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + /content-type@1.0.4: + resolution: {integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==} engines: {node: '>= 0.6'} dev: true @@ -2659,15 +2933,24 @@ packages: engines: {node: '>=8'} dev: true - /convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + dev: true + + /cookie-parse@0.4.0: + resolution: {integrity: sha512-WichJHIaIzLrGkCbdup1SzJABOv/724MubsY2eaT5QkZz8ojNcZzn+gJ4Drrklm/le7lr0j/q0FaEgjooXhAog==} + engines: {node: '>= 0.6'} + dev: false + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} dev: true /create-ecdh@4.0.4: resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} dependencies: bn.js: 4.12.0 - elliptic: 6.5.4 + elliptic: 6.5.5 dev: true /create-hash@1.2.0: @@ -2715,7 +2998,7 @@ packages: resolution: {integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==} dependencies: browserify-cipher: 1.0.1 - browserify-sign: 4.2.1 + browserify-sign: 4.2.3 create-ecdh: 4.0.4 create-hash: 1.2.0 create-hmac: 1.1.7 @@ -2727,8 +3010,8 @@ packages: randomfill: 1.0.4 dev: true - /crypto-js@4.1.1: - resolution: {integrity: sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==} + /crypto-js@4.2.0: + resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} dev: false /css-select@4.3.0: @@ -2749,7 +3032,6 @@ packages: domhandler: 5.0.3 domutils: 3.1.0 nth-check: 2.1.1 - dev: false /css-tree@2.3.1: resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} @@ -2767,28 +3049,28 @@ packages: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} hasBin: true + dev: true - /cssstyle@3.0.0: - resolution: {integrity: sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==} - engines: {node: '>=14'} + /cssstyle@4.0.1: + resolution: {integrity: sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==} + engines: {node: '>=18'} dependencies: rrweb-cssom: 0.6.0 dev: true - /csstype@3.1.2: - resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + /csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - /data-urls@4.0.0: - resolution: {integrity: sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==} - engines: {node: '>=14'} + /data-urls@5.0.0: + resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} + engines: {node: '>=18'} dependencies: - abab: 2.0.6 - whatwg-mimetype: 3.0.0 - whatwg-url: 12.0.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 14.0.0 dev: true - /dayjs@1.11.9: - resolution: {integrity: sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA==} + /dayjs@1.11.10: + resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==} dev: false /de-indent@1.0.2: @@ -2802,6 +3084,18 @@ packages: mimic-fn: 4.0.0 dev: false + /debug@4.1.1: + resolution: {integrity: sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==} + deprecated: Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797) + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.1 + dev: true + /debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -2828,44 +3122,21 @@ packages: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true - /default-browser-id@3.0.0: - resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} - engines: {node: '>=12'} - dependencies: - bplist-parser: 0.2.0 - untildify: 4.0.0 - dev: true - - /default-browser@4.0.0: - resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} - engines: {node: '>=14.16'} - dependencies: - bundle-name: 3.0.0 - default-browser-id: 3.0.0 - execa: 7.2.0 - titleize: 3.0.0 - dev: true - - /define-data-property@1.1.0: - resolution: {integrity: sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g==} + /define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.2.1 + es-define-property: 1.0.0 + es-errors: 1.3.0 gopd: 1.0.1 - has-property-descriptors: 1.0.0 - dev: true - - /define-lazy-prop@3.0.0: - resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} - engines: {node: '>=12'} dev: true /define-properties@1.2.1: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} dependencies: - define-data-property: 1.1.0 - has-property-descriptors: 1.0.0 + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 object-keys: 1.1.1 dev: true @@ -2877,6 +3148,11 @@ packages: resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} dev: true + /depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + dev: true + /deprecation@2.3.1: resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} dev: false @@ -2921,6 +3197,7 @@ packages: engines: {node: '>=8'} dependencies: path-type: 4.0.0 + dev: true /doctrine@3.0.0: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} @@ -2943,23 +3220,15 @@ packages: domelementtype: 2.3.0 domhandler: 5.0.3 entities: 4.5.0 - dev: false - /domain-browser@4.22.0: - resolution: {integrity: sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw==} + /domain-browser@4.23.0: + resolution: {integrity: sha512-ArzcM/II1wCCujdCNyQjXrAFwS4mrLh4C7DZWlaI8mdh7h3BfKdNd3bKXITfl2PT9FtfQqaGvhi1vPRQPimjGA==} engines: {node: '>=10'} dev: true /domelementtype@2.3.0: resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - /domexception@4.0.0: - resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} - engines: {node: '>=12'} - dependencies: - webidl-conversions: 7.0.0 - dev: true - /domhandler@4.3.1: resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} engines: {node: '>= 4'} @@ -2972,7 +3241,6 @@ packages: engines: {node: '>= 4'} dependencies: domelementtype: 2.3.0 - dev: false /domutils@2.8.0: resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} @@ -2988,7 +3256,6 @@ packages: dom-serializer: 2.0.0 domelementtype: 2.3.0 domhandler: 5.0.3 - dev: false /dot-case@3.0.4: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} @@ -3014,24 +3281,26 @@ packages: engines: {node: '>=12'} dev: true - /dotenv@16.3.1: - resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} + /dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} + dev: true /eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: true - /edge-runtime@2.5.1: - resolution: {integrity: sha512-E0kY1Dqvwvk9yh7dvR56KnCjXf/dlbrrGjO5Sjnz9Ja3WqYT3csv2B8O4erxJiOWfWy9NTukBk4Kb3yrR66gBw==} + /edge-runtime@2.5.9: + resolution: {integrity: sha512-pk+k0oK0PVXdlT4oRp4lwh+unuKB7Ng4iZ2HB+EZ7QCEQizX360Rp/F4aRpgpRgdP2ufB35N+1KppHmYjqIGSg==} engines: {node: '>=16'} hasBin: true dependencies: - '@edge-runtime/format': 2.2.0 - '@edge-runtime/vm': 3.1.1 + '@edge-runtime/format': 2.2.1 + '@edge-runtime/ponyfill': 2.4.2 + '@edge-runtime/vm': 3.2.0 async-listen: 3.0.1 mri: 1.2.0 picocolors: 1.0.0 - pretty-bytes: 5.6.0 pretty-ms: 7.0.1 signal-exit: 4.0.2 time-span: 4.0.0 @@ -3045,7 +3314,7 @@ packages: '@one-ini/wasm': 0.1.1 commander: 10.0.1 minimatch: 9.0.1 - semver: 7.5.4 + semver: 7.6.0 dev: true /ejs@3.1.9: @@ -3056,33 +3325,33 @@ packages: jake: 10.8.7 dev: true - /element-plus@2.3.14(vue@3.3.4): - resolution: {integrity: sha512-9yvxUaU4jXf2ZNPdmIxoj/f8BG8CDcGM6oHa9JIqxLjQlfY4bpzR1E5CjNimnOX3rxO93w1TQ0jTVt0RSxh9kA==} + /element-plus@2.6.1(vue@3.4.21): + resolution: {integrity: sha512-6VRpLjwtIVdtUuITJPPKtpOH1NM6nuAkRE3q5O4Lrx0N1bYMhTkiqb2Jy7zfQuDPbOIkkF2OABTzegpNnzgsnQ==} peerDependencies: vue: ^3.2.0 dependencies: '@ctrl/tinycolor': 3.6.1 - '@element-plus/icons-vue': 2.1.0(vue@3.3.4) - '@floating-ui/dom': 1.5.3 + '@element-plus/icons-vue': 2.3.1(vue@3.4.21) + '@floating-ui/dom': 1.6.3 '@popperjs/core': /@sxzz/popperjs-es@2.11.7 - '@types/lodash': 4.14.198 - '@types/lodash-es': 4.17.9 - '@vueuse/core': 9.13.0(vue@3.3.4) + '@types/lodash': 4.14.202 + '@types/lodash-es': 4.17.12 + '@vueuse/core': 9.13.0(vue@3.4.21) async-validator: 4.2.5 - dayjs: 1.11.9 + dayjs: 1.11.10 escape-html: 1.0.3 lodash: 4.17.21 lodash-es: 4.17.21 - lodash-unified: 1.0.3(@types/lodash-es@4.17.9)(lodash-es@4.17.21)(lodash@4.17.21) + lodash-unified: 1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21) memoize-one: 6.0.0 normalize-wheel-es: 1.2.0 - vue: 3.3.4 + vue: 3.4.21(typescript@5.4.2) transitivePeerDependencies: - '@vue/composition-api' dev: false - /elliptic@6.5.4: - resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} + /elliptic@6.5.5: + resolution: {integrity: sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==} dependencies: bn.js: 4.12.0 brorand: 1.1.0 @@ -3098,6 +3367,23 @@ packages: /emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true + + /end-of-stream@1.1.0: + resolution: {integrity: sha512-EoulkdKF/1xa92q25PbjuDcgJ9RDHYU2Rs3SCIvs2/dSQ3BpmxneNHmA/M7fe60M3PrV7nNGTTNbkK62l6vXiQ==} + dependencies: + once: 1.3.3 + dev: true + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: true + + /entities@1.1.2: + resolution: {integrity: sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==} + dev: false /entities@2.2.0: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} @@ -3118,6 +3404,22 @@ packages: is-arrayish: 0.2.1 dev: false + /es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.4 + dev: true + + /es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + dev: true + + /es-module-lexer@1.4.1: + resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} + dev: true + /esbuild-android-64@0.14.47: resolution: {integrity: sha512-R13Bd9+tqLVFndncMHssZrPWe6/0Kpv2/dt4aA69soX4PRxlzsVpCvoJeFE8sOEoeVEiBkI0myjlkDodXlHa0g==} engines: {node: '>=12'} @@ -3133,7 +3435,7 @@ packages: cpu: [x64] os: [android] requiresBuild: true - dev: false + dev: true optional: true /esbuild-android-arm64@0.14.47: @@ -3151,7 +3453,7 @@ packages: cpu: [arm64] os: [android] requiresBuild: true - dev: false + dev: true optional: true /esbuild-darwin-64@0.14.47: @@ -3169,7 +3471,7 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true - dev: false + dev: true optional: true /esbuild-darwin-arm64@0.14.47: @@ -3187,7 +3489,7 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true - dev: false + dev: true optional: true /esbuild-freebsd-64@0.14.47: @@ -3205,7 +3507,7 @@ packages: cpu: [x64] os: [freebsd] requiresBuild: true - dev: false + dev: true optional: true /esbuild-freebsd-arm64@0.14.47: @@ -3223,7 +3525,7 @@ packages: cpu: [arm64] os: [freebsd] requiresBuild: true - dev: false + dev: true optional: true /esbuild-linux-32@0.14.47: @@ -3241,7 +3543,7 @@ packages: cpu: [ia32] os: [linux] requiresBuild: true - dev: false + dev: true optional: true /esbuild-linux-64@0.14.47: @@ -3259,7 +3561,7 @@ packages: cpu: [x64] os: [linux] requiresBuild: true - dev: false + dev: true optional: true /esbuild-linux-arm64@0.14.47: @@ -3277,7 +3579,7 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true - dev: false + dev: true optional: true /esbuild-linux-arm@0.14.47: @@ -3295,7 +3597,7 @@ packages: cpu: [arm] os: [linux] requiresBuild: true - dev: false + dev: true optional: true /esbuild-linux-mips64le@0.14.47: @@ -3313,7 +3615,7 @@ packages: cpu: [mips64el] os: [linux] requiresBuild: true - dev: false + dev: true optional: true /esbuild-linux-ppc64le@0.14.47: @@ -3331,7 +3633,7 @@ packages: cpu: [ppc64] os: [linux] requiresBuild: true - dev: false + dev: true optional: true /esbuild-linux-riscv64@0.14.47: @@ -3349,7 +3651,7 @@ packages: cpu: [riscv64] os: [linux] requiresBuild: true - dev: false + dev: true optional: true /esbuild-linux-s390x@0.14.47: @@ -3367,7 +3669,7 @@ packages: cpu: [s390x] os: [linux] requiresBuild: true - dev: false + dev: true optional: true /esbuild-netbsd-64@0.14.47: @@ -3385,7 +3687,7 @@ packages: cpu: [x64] os: [netbsd] requiresBuild: true - dev: false + dev: true optional: true /esbuild-openbsd-64@0.14.47: @@ -3403,7 +3705,7 @@ packages: cpu: [x64] os: [openbsd] requiresBuild: true - dev: false + dev: true optional: true /esbuild-plugin-copy@2.1.1(esbuild@0.17.19): @@ -3412,36 +3714,30 @@ packages: esbuild: '>= 0.14.0' dependencies: chalk: 4.1.2 - chokidar: 3.5.3 + chokidar: 3.6.0 esbuild: 0.17.19 fs-extra: 10.1.0 globby: 11.1.0 + dev: true - /esbuild-plugin-d.ts@1.1.0(postcss@8.4.29)(typescript@5.2.2): - resolution: {integrity: sha512-3oSR3kUS4fNdKHLYLcST9YOfD2dULe7/UbXnrnu/mRybJYW+jZlYNgklb9Pt7osg6B1qwAYMyr2jTC+Ijj2YbQ==} + /esbuild-plugin-d.ts@1.2.3(typescript@5.4.2): + resolution: {integrity: sha512-JkNqcCTkv0N39izAOLaiAQcFA6DfbhDkef1ZO6NvnHtTT+7i+4VHjCcAM2yFslRTBTK1TuF41FLSwWvGm88N7w==} engines: {node: '>=12.0.0'} peerDependencies: typescript: '*' dependencies: chalk: 4.1.2 - jju: 1.4.0 - tmp: 0.2.1 - tsup: 5.12.9(postcss@8.4.29)(typescript@5.2.2) - typescript: 5.2.2 - transitivePeerDependencies: - - '@swc/core' - - postcss - - supports-color - - ts-node - dev: false + lodash.merge: 4.6.2 + typescript: 5.4.2 + dev: true /esbuild-plugin-ifdef@1.0.1: resolution: {integrity: sha512-dn1sf+WGIUBp4kxN+rJRYIXrmGTwRLyhWASmhl8IKKKPfIlWFE8hloAVnI6mM5jPF3+abDvkndYe+RZDFXItbA==} - dev: false + dev: true /esbuild-plugin-inline-image@0.0.9: resolution: {integrity: sha512-pw3ZgN2phh32Z7BpKrhRDtmI+iVCl+Gc0BLOT9croXg1MnMjRuN7aXhIQirhLeK39erkIwfFlhy6xieroBGc1Q==} - dev: false + dev: true /esbuild-plugin-vue3@0.3.2(cheerio@1.0.0-rc.12): resolution: {integrity: sha512-KqZUPlIUS4vJLSexV3q5hgqIlsMWzlPtIuvZ1epZQvw/wJ/4vEPzEC1HQZduoHvUYvtnG703hsP1PsdpjTJ3ug==} @@ -3460,22 +3756,23 @@ packages: sass: optional: true dependencies: - '@vue/compiler-core': 3.3.4 - '@vue/compiler-sfc': 3.3.4 + '@vue/compiler-core': 3.4.21 + '@vue/compiler-sfc': 3.4.21 cheerio: 1.0.0-rc.12 esbuild: 0.14.54 typescript: 4.9.5 - dev: false + dev: true - /esbuild-style-plugin@1.6.2: - resolution: {integrity: sha512-aSzuIUwQTEVVy9gcE4xtXq8Cbq9RNDfJYZ3mYzWg6RJ8HoMydLT+LbGXYwL0DmgOt4eEg/4JrnNMMb02gXFutA==} + /esbuild-style-plugin@1.6.3: + resolution: {integrity: sha512-XPEKf4FjLjEVLv/dJH4UxDzXCrFHYpD93DBO8B+izdZARW5b7nNKQbnKv3J+7VDWJbgCU+hzfgIh2AuIZzlmXQ==} dependencies: - '@types/less': 3.0.4 + '@types/less': 3.0.6 '@types/sass': 1.45.0 - '@types/stylus': 0.48.39 - glob: 10.3.4 - postcss: 8.4.29 - postcss-modules: 6.0.0(postcss@8.4.29) + '@types/stylus': 0.48.42 + glob: 10.3.10 + postcss: 8.4.35 + postcss-modules: 6.0.0(postcss@8.4.35) + dev: true /esbuild-sunos-64@0.14.47: resolution: {integrity: sha512-uOeSgLUwukLioAJOiGYm3kNl+1wJjgJA8R671GYgcPgCx7QR73zfvYqXFFcIO93/nBdIbt5hd8RItqbbf3HtAQ==} @@ -3492,7 +3789,7 @@ packages: cpu: [x64] os: [sunos] requiresBuild: true - dev: false + dev: true optional: true /esbuild-windows-32@0.14.47: @@ -3510,7 +3807,7 @@ packages: cpu: [ia32] os: [win32] requiresBuild: true - dev: false + dev: true optional: true /esbuild-windows-64@0.14.47: @@ -3528,7 +3825,7 @@ packages: cpu: [x64] os: [win32] requiresBuild: true - dev: false + dev: true optional: true /esbuild-windows-arm64@0.14.47: @@ -3546,7 +3843,7 @@ packages: cpu: [arm64] os: [win32] requiresBuild: true - dev: false + dev: true optional: true /esbuild@0.14.47: @@ -3604,7 +3901,7 @@ packages: esbuild-windows-32: 0.14.54 esbuild-windows-64: 0.14.54 esbuild-windows-arm64: 0.14.54 - dev: false + dev: true /esbuild@0.17.19: resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} @@ -3634,39 +3931,41 @@ packages: '@esbuild/win32-arm64': 0.17.19 '@esbuild/win32-ia32': 0.17.19 '@esbuild/win32-x64': 0.17.19 + dev: true - /esbuild@0.18.20: - resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + /esbuild@0.19.12: + resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - '@esbuild/android-arm': 0.18.20 - '@esbuild/android-arm64': 0.18.20 - '@esbuild/android-x64': 0.18.20 - '@esbuild/darwin-arm64': 0.18.20 - '@esbuild/darwin-x64': 0.18.20 - '@esbuild/freebsd-arm64': 0.18.20 - '@esbuild/freebsd-x64': 0.18.20 - '@esbuild/linux-arm': 0.18.20 - '@esbuild/linux-arm64': 0.18.20 - '@esbuild/linux-ia32': 0.18.20 - '@esbuild/linux-loong64': 0.18.20 - '@esbuild/linux-mips64el': 0.18.20 - '@esbuild/linux-ppc64': 0.18.20 - '@esbuild/linux-riscv64': 0.18.20 - '@esbuild/linux-s390x': 0.18.20 - '@esbuild/linux-x64': 0.18.20 - '@esbuild/netbsd-x64': 0.18.20 - '@esbuild/openbsd-x64': 0.18.20 - '@esbuild/sunos-x64': 0.18.20 - '@esbuild/win32-arm64': 0.18.20 - '@esbuild/win32-ia32': 0.18.20 - '@esbuild/win32-x64': 0.18.20 - dev: true - - /escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + '@esbuild/aix-ppc64': 0.19.12 + '@esbuild/android-arm': 0.19.12 + '@esbuild/android-arm64': 0.19.12 + '@esbuild/android-x64': 0.19.12 + '@esbuild/darwin-arm64': 0.19.12 + '@esbuild/darwin-x64': 0.19.12 + '@esbuild/freebsd-arm64': 0.19.12 + '@esbuild/freebsd-x64': 0.19.12 + '@esbuild/linux-arm': 0.19.12 + '@esbuild/linux-arm64': 0.19.12 + '@esbuild/linux-ia32': 0.19.12 + '@esbuild/linux-loong64': 0.19.12 + '@esbuild/linux-mips64el': 0.19.12 + '@esbuild/linux-ppc64': 0.19.12 + '@esbuild/linux-riscv64': 0.19.12 + '@esbuild/linux-s390x': 0.19.12 + '@esbuild/linux-x64': 0.19.12 + '@esbuild/netbsd-x64': 0.19.12 + '@esbuild/openbsd-x64': 0.19.12 + '@esbuild/sunos-x64': 0.19.12 + '@esbuild/win32-arm64': 0.19.12 + '@esbuild/win32-ia32': 0.19.12 + '@esbuild/win32-x64': 0.19.12 + dev: true + + /escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} engines: {node: '>=6'} dev: false @@ -3688,25 +3987,34 @@ packages: engines: {node: '>=12'} dev: true - /eslint-config-prettier@8.10.0(eslint@8.49.0): + /eslint-compat-utils@0.1.2(eslint@8.57.0): + resolution: {integrity: sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==} + engines: {node: '>=12'} + peerDependencies: + eslint: '>=6.0.0' + dependencies: + eslint: 8.57.0 + dev: true + + /eslint-config-prettier@8.10.0(eslint@8.57.0): resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 8.49.0 + eslint: 8.57.0 dev: true - /eslint-config-turbo@1.10.14(eslint@8.49.0): - resolution: {integrity: sha512-ZeB+IcuFXy1OICkLuAplVa0euoYbhK+bMEQd0nH9+Lns18lgZRm33mVz/iSoH9VdUzl/1ZmFmoK+RpZc+8R80A==} + /eslint-config-turbo@1.12.5(eslint@8.57.0): + resolution: {integrity: sha512-wXytbX+vTzQ6rwgM6sIr447tjYJBlRj5V/eBFNGNXw5Xs1R715ppPYhbmxaFbkrWNQSGJsWRrYGAlyq0sT/OsQ==} peerDependencies: eslint: '>6.6.0' dependencies: - eslint: 8.49.0 - eslint-plugin-turbo: 1.10.14(eslint@8.49.0) + eslint: 8.57.0 + eslint-plugin-turbo: 1.12.5(eslint@8.57.0) dev: true - /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.10.0)(eslint@8.49.0)(prettier@2.8.8): + /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.10.0)(eslint@8.57.0)(prettier@2.8.8): resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} engines: {node: '>=12.0.0'} peerDependencies: @@ -3717,14 +4025,14 @@ packages: eslint-config-prettier: optional: true dependencies: - eslint: 8.49.0 - eslint-config-prettier: 8.10.0(eslint@8.49.0) + eslint: 8.57.0 + eslint-config-prettier: 8.10.0(eslint@8.57.0) prettier: 2.8.8 prettier-linter-helpers: 1.0.0 dev: true - /eslint-plugin-svelte@2.33.1(eslint@8.49.0)(svelte@4.2.0): - resolution: {integrity: sha512-veYmyjsbt8ikXdaa6pLsgytdlzJpZZKw9vRaQlRBNKaLNmrbsdJulwiWfcDZ7tYJdaVpRB4iDFn/fuPeebxUVg==} + /eslint-plugin-svelte@2.35.1(eslint@8.57.0)(svelte@4.2.12): + resolution: {integrity: sha512-IF8TpLnROSGy98Z3NrsKXWDSCbNY2ReHDcrYTuXZMbfX7VmESISR78TWgO9zdg4Dht1X8coub5jKwHzP0ExRug==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0-0 @@ -3733,46 +4041,47 @@ packages: svelte: optional: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.49.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@jridgewell/sourcemap-codec': 1.4.15 debug: 4.3.4 - eslint: 8.49.0 + eslint: 8.57.0 + eslint-compat-utils: 0.1.2(eslint@8.57.0) esutils: 2.0.3 - known-css-properties: 0.28.0 - postcss: 8.4.29 - postcss-load-config: 3.1.4(postcss@8.4.29) - postcss-safe-parser: 6.0.0(postcss@8.4.29) - postcss-selector-parser: 6.0.13 - semver: 7.5.4 - svelte: 4.2.0 - svelte-eslint-parser: 0.33.0(svelte@4.2.0) + known-css-properties: 0.29.0 + postcss: 8.4.35 + postcss-load-config: 3.1.4(postcss@8.4.35) + postcss-safe-parser: 6.0.0(postcss@8.4.35) + postcss-selector-parser: 6.0.15 + semver: 7.6.0 + svelte: 4.2.12 + svelte-eslint-parser: 0.33.1(svelte@4.2.12) transitivePeerDependencies: - supports-color - ts-node dev: true - /eslint-plugin-turbo@1.10.14(eslint@8.49.0): - resolution: {integrity: sha512-sBdBDnYr9AjT1g4lR3PBkZDonTrMnR4TvuGv5W0OiF7z9az1rI68yj2UHJZvjkwwcGu5mazWA1AfB0oaagpmfg==} + /eslint-plugin-turbo@1.12.5(eslint@8.57.0): + resolution: {integrity: sha512-cXy7mCzAdngBTJIWH4DASXHy0vQpujWDBqRTu0YYqCN/QEGsi3HWM+STZEbPYELdjtm5EsN2HshOSSqWnjdRHg==} peerDependencies: eslint: '>6.6.0' dependencies: dotenv: 16.0.3 - eslint: 8.49.0 + eslint: 8.57.0 dev: true - /eslint-plugin-vue@9.17.0(eslint@8.49.0): - resolution: {integrity: sha512-r7Bp79pxQk9I5XDP0k2dpUC7Ots3OSWgvGZNu3BxmKK6Zg7NgVtcOB6OCna5Kb9oQwJPl5hq183WD0SY5tZtIQ==} + /eslint-plugin-vue@9.22.0(eslint@8.57.0): + resolution: {integrity: sha512-7wCXv5zuVnBtZE/74z4yZ0CM8AjH6bk4MQGm7hZjUC2DBppKU5ioeOk5LGSg/s9a1ZJnIsdPLJpXnu1Rc+cVHg==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.49.0) - eslint: 8.49.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + eslint: 8.57.0 natural-compare: 1.4.0 nth-check: 2.1.1 - postcss-selector-parser: 6.0.13 - semver: 7.5.4 - vue-eslint-parser: 9.3.1(eslint@8.49.0) + postcss-selector-parser: 6.0.15 + semver: 7.6.0 + vue-eslint-parser: 9.4.2(eslint@8.57.0) xml-name-validator: 4.0.0 transitivePeerDependencies: - supports-color @@ -3799,18 +4108,19 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint@8.49.0: - resolution: {integrity: sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==} + /eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.49.0) - '@eslint-community/regexpp': 4.8.1 - '@eslint/eslintrc': 2.1.2 - '@eslint/js': 8.49.0 - '@humanwhocodes/config-array': 0.11.11 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.0 + '@humanwhocodes/config-array': 0.11.14 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 @@ -3826,9 +4136,9 @@ packages: file-entry-cache: 6.0.1 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.21.0 + globals: 13.24.0 graphemer: 1.4.0 - ignore: 5.2.4 + ignore: 5.3.1 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 @@ -3849,8 +4159,8 @@ packages: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.10.0 - acorn-jsx: 5.3.2(acorn@8.10.0) + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) eslint-visitor-keys: 3.4.3 dev: true @@ -3890,7 +4200,7 @@ packages: /estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} dependencies: - '@types/estree': 1.0.1 + '@types/estree': 1.0.5 dev: true /esutils@2.0.3: @@ -3903,13 +4213,17 @@ packages: engines: {node: '>= 0.6'} dev: true + /events-intercept@2.0.0: + resolution: {integrity: sha512-blk1va0zol9QOrdZt0rFXo5KMkNPVSp92Eju/Qz8THwKWKRKeE0T8Br/1aW6+Edkyq9xHYgYxn2QtOnUKPUp+Q==} + dev: true + /events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} dev: true - /eventsource-parser@1.0.0: - resolution: {integrity: sha512-9jgfSCa3dmEme2ES3mPByGXfgZ87VbP97tng1G2nWwWx6bV2nYxm2AWCrbQjXToSe+yYlqaZNtxffR9IeQr95g==} + /eventsource-parser@1.1.2: + resolution: {integrity: sha512-v0eOBUbiaFojBu2s2NPBfYUoRR9GjcDNvCXVaqEf5vVfpIAh9f8RCo4vXTP8c63QRKCFwoLpMpTdPwwhEKVgzA==} engines: {node: '>=14.18'} dev: false @@ -3920,6 +4234,22 @@ packages: safe-buffer: 5.2.1 dev: true + /execa@3.2.0: + resolution: {integrity: sha512-kJJfVbI/lZE1PZYDI5VPxp8zXPO9rtxOkhpZ0jMKha56AI9y2gGVC6bkukStQf0ka5Rh15BA5m7cCCH4jmHqkw==} + engines: {node: ^8.12.0 || >=9.7.0} + dependencies: + cross-spawn: 7.0.3 + get-stream: 5.2.0 + human-signals: 1.1.1 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + p-finally: 2.0.1 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + /execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -3933,26 +4263,28 @@ packages: onetime: 5.1.2 signal-exit: 3.0.7 strip-final-newline: 2.0.0 + dev: false - /execa@7.2.0: - resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} - engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + /execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} dependencies: cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 4.3.1 + get-stream: 8.0.1 + human-signals: 5.0.0 is-stream: 3.0.0 merge-stream: 2.0.0 - npm-run-path: 5.1.0 + npm-run-path: 5.3.0 onetime: 6.0.0 - signal-exit: 3.0.7 + signal-exit: 4.1.0 strip-final-newline: 3.0.0 - dev: true - /exit-hook@2.2.1: - resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} - engines: {node: '>=6'} - dev: true + /extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + dependencies: + is-extendable: 0.1.1 + dev: false /extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -3965,8 +4297,8 @@ packages: resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} dev: true - /fast-glob@3.3.1: - resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} dependencies: '@nodelib/fs.stat': 2.0.5 @@ -3974,6 +4306,7 @@ packages: glob-parent: 5.1.2 merge2: 1.4.1 micromatch: 4.0.5 + dev: true /fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} @@ -3984,16 +4317,23 @@ packages: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: true - /fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + /fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} dependencies: reusify: 1.0.4 + dev: true + + /fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + dependencies: + pend: 1.2.0 + dev: true /file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: - flat-cache: 3.1.0 + flat-cache: 3.2.0 dev: true /file-uri-to-path@1.0.0: @@ -4018,7 +4358,6 @@ packages: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 - dev: true /find-up@6.3.0: resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} @@ -4028,17 +4367,17 @@ packages: path-exists: 5.0.0 dev: false - /flat-cache@3.1.0: - resolution: {integrity: sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==} - engines: {node: '>=12.0.0'} + /flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} dependencies: - flatted: 3.2.9 - keyv: 4.5.3 + flatted: 3.3.1 + keyv: 4.5.4 rimraf: 3.0.2 dev: true - /flatted@3.2.9: - resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} + /flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} dev: true /for-each@0.3.3: @@ -4053,6 +4392,7 @@ packages: dependencies: cross-spawn: 7.0.3 signal-exit: 4.1.0 + dev: true /form-data@4.0.0: resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} @@ -4068,7 +4408,8 @@ packages: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 - universalify: 2.0.0 + universalify: 2.0.1 + dev: true /fs-extra@11.1.0: resolution: {integrity: sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==} @@ -4076,7 +4417,22 @@ packages: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 - universalify: 2.0.0 + universalify: 2.0.1 + dev: true + + /fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: true + + /fs-minipass@1.2.7: + resolution: {integrity: sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==} + dependencies: + minipass: 2.9.0 dev: true /fs-minipass@2.1.0: @@ -4088,6 +4444,16 @@ packages: /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents@2.1.3: + resolution: {integrity: sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + deprecated: '"Please update to latest v2.3 or v2.2"' + requiresBuild: true + dev: true + optional: true /fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} @@ -4096,8 +4462,8 @@ packages: requiresBuild: true optional: true - /function-bind@1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} /gauge@3.0.2: resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} @@ -4118,28 +4484,48 @@ packages: resolution: {integrity: sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==} dependencies: loader-utils: 3.2.1 + dev: true + + /generic-pool@3.4.2: + resolution: {integrity: sha512-H7cUpwCQSiJmAHM4c/aFu6fUfrhWXW1ncyh8ftxEPMu6AiYkHw9K8br720TGPZJbk5eOH2bynjZD1yPvdDAmag==} + engines: {node: '>= 4'} + dev: true /get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} dev: false - /get-func-name@2.0.0: - resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} + /get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} dev: true - /get-intrinsic@1.2.1: - resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} + /get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} dependencies: - function-bind: 1.1.1 - has: 1.0.3 - has-proto: 1.0.1 + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 has-symbols: 1.0.3 + hasown: 2.0.2 + dev: true + + /get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + dependencies: + pump: 3.0.0 dev: true /get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} + dev: false + + /get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} @@ -4154,27 +4540,17 @@ packages: is-glob: 4.0.3 dev: true - /glob@10.3.4: - resolution: {integrity: sha512-6LFElP3A+i/Q8XQKEvZjkEWEOTgAIALR9AO2rwT8bgPhDd1anmqDJDZ6lLddI4ehxxxR1S5RIqKe1uapMQfYaQ==} + /glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} engines: {node: '>=16 || 14 >=14.17'} hasBin: true dependencies: foreground-child: 3.1.1 - jackspeak: 2.3.3 + jackspeak: 2.3.6 minimatch: 9.0.3 - minipass: 7.0.3 + minipass: 7.0.4 path-scurry: 1.10.1 - - /glob@7.1.6: - resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: false + dev: true /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} @@ -4185,16 +4561,6 @@ packages: minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 - - /glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 dev: true /glob@9.3.5: @@ -4205,10 +4571,10 @@ packages: minimatch: 8.0.4 minipass: 4.2.8 path-scurry: 1.10.1 - dev: false + dev: true - /globals@13.21.0: - resolution: {integrity: sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==} + /globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} dependencies: type-fest: 0.20.2 @@ -4220,41 +4586,54 @@ packages: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.3.1 - ignore: 5.2.4 + fast-glob: 3.3.2 + ignore: 5.3.1 merge2: 1.4.1 slash: 3.0.0 + dev: true /gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: - get-intrinsic: 1.2.1 + get-intrinsic: 1.2.4 dev: true /graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: true /graphemer@1.4.0: 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 + /gray-matter@4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} + engines: {node: '>=6.0'} + dependencies: + js-yaml: 3.14.1 + kind-of: 6.0.3 + section-matter: 1.0.0 + strip-bom-string: 1.0.0 + dev: false + + /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'} + dev: true - /has-property-descriptors@1.0.0: - resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + /has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} dependencies: - get-intrinsic: 1.2.1 + es-define-property: 1.0.0 dev: true - /has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + /has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} engines: {node: '>= 0.4'} dev: true @@ -4263,8 +4642,8 @@ packages: engines: {node: '>= 0.4'} dev: true - /has-tostringtag@1.0.0: - resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + /has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 @@ -4274,11 +4653,13 @@ packages: resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} dev: true - /has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} + /hash-base@3.0.4: + resolution: {integrity: sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==} + engines: {node: '>=4'} dependencies: - function-bind: 1.1.1 + inherits: 2.0.4 + safe-buffer: 5.2.1 + dev: true /hash-base@3.1.0: resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} @@ -4296,6 +4677,12 @@ packages: minimalistic-assert: 1.0.1 dev: true + /hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + /he@1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true @@ -4316,11 +4703,11 @@ packages: lru-cache: 6.0.0 dev: false - /html-encoding-sniffer@3.0.0: - resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} - engines: {node: '>=12'} + /html-encoding-sniffer@4.0.0: + resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} + engines: {node: '>=18'} dependencies: - whatwg-encoding: 2.0.0 + whatwg-encoding: 3.1.1 dev: true /html-escaper@2.0.2: @@ -4333,12 +4720,12 @@ packages: hasBin: true dependencies: camel-case: 4.1.2 - clean-css: 5.3.2 + clean-css: 5.3.3 commander: 8.3.0 he: 1.2.0 param-case: 3.0.4 relateurl: 0.2.7 - terser: 5.19.4 + terser: 5.29.1 dev: true /htmlparser2@8.0.2: @@ -4348,14 +4735,31 @@ packages: domhandler: 5.0.3 domutils: 3.1.0 entities: 4.5.0 - dev: false - /http-proxy-agent@5.0.0: - resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} - engines: {node: '>= 6'} + /http-errors@1.4.0: + resolution: {integrity: sha512-oLjPqve1tuOl5aRhv8GK5eHpqP1C9fb+Ol+XTLjKfLltE44zdDbEdjPSbU7Ch5rSNsVFqZn97SrMmZLdu1/YMw==} + engines: {node: '>= 0.6'} dependencies: - '@tootallnate/once': 2.0.0 - agent-base: 6.0.2 + inherits: 2.0.1 + statuses: 1.5.0 + dev: true + + /http-errors@1.7.3: + resolution: {integrity: sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==} + engines: {node: '>= 0.6'} + dependencies: + depd: 1.1.2 + inherits: 2.0.4 + setprototypeof: 1.1.1 + statuses: 1.5.0 + toidentifier: 1.0.0 + dev: true + + /http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.0 debug: 4.3.4 transitivePeerDependencies: - supports-color @@ -4375,13 +4779,35 @@ packages: - supports-color dev: true + /https-proxy-agent@7.0.4: + resolution: {integrity: sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.0 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /human-signals@1.1.1: + resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} + engines: {node: '>=8.12.0'} + dev: true + /human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} + dev: false - /human-signals@4.3.1: - resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} - engines: {node: '>=14.18.0'} + /human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 dev: true /iconv-lite@0.6.3: @@ -4391,24 +4817,32 @@ packages: safer-buffer: 2.1.2 dev: true - /icss-utils@5.1.0(postcss@8.4.29): + /icss-utils@5.1.0(postcss@8.4.35): resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.29 + postcss: 8.4.35 + dev: true /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} dev: true - /ignore@5.2.4: - resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + /iframe-resizer@4.3.9: + resolution: {integrity: sha512-MCt+V/THB4a9OcAdrWo5NsI2CRpeMM4ijhTfiLtsdgDJXWYXf62Ve8yO8rKGmYNs991zty/EolYOxActlkfU+A==} + engines: {node: '>=0.8.0'} + dev: false + + /ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} engines: {node: '>= 4'} + dev: true - /immutable@4.3.4: - resolution: {integrity: sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==} + /immutable@4.3.5: + resolution: {integrity: sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==} + dev: true /import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} @@ -4428,9 +4862,15 @@ packages: dependencies: once: 1.4.0 wrappy: 1.0.2 + dev: true + + /inherits@2.0.1: + resolution: {integrity: sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==} + dev: true /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true /ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} @@ -4451,8 +4891,8 @@ packages: resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 + call-bind: 1.0.7 + has-tostringtag: 1.0.2 dev: true /is-arrayish@0.2.1: @@ -4475,26 +4915,19 @@ packages: engines: {node: '>= 0.4'} dev: true - /is-core-module@2.13.0: - resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} + /is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} dependencies: - has: 1.0.3 + hasown: 2.0.2 /is-decimal@1.0.4: resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} dev: false - /is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - dev: true - - /is-docker@3.0.0: - resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - hasBin: true - dev: true + /is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + dev: false /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} @@ -4508,7 +4941,7 @@ packages: resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} engines: {node: '>= 0.4'} dependencies: - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 dev: true /is-glob@4.0.3: @@ -4521,19 +4954,11 @@ packages: resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} dev: false - /is-inside-container@1.0.0: - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} - engines: {node: '>=14.16'} - hasBin: true - dependencies: - is-docker: 3.0.0 - dev: true - /is-nan@1.3.2: resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.7 define-properties: 1.2.1 dev: true @@ -4551,11 +4976,6 @@ packages: engines: {node: '>=8'} dev: false - /is-plain-object@5.0.0: - resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} - engines: {node: '>=0.10.0'} - dev: false - /is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} dev: true @@ -4563,7 +4983,7 @@ packages: /is-reference@3.0.2: resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} dependencies: - '@types/estree': 1.0.1 + '@types/estree': 1.0.5 dev: true /is-stream@2.0.1: @@ -4573,20 +4993,20 @@ packages: /is-stream@3.0.0: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true - /is-typed-array@1.1.12: - resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} + /is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} engines: {node: '>= 0.4'} dependencies: - which-typed-array: 1.1.11 + which-typed-array: 1.1.15 dev: true - /is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} - dependencies: - is-docker: 2.2.1 + /isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + dev: true + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} dev: true /isexe@2.0.0: @@ -4597,8 +5017,8 @@ packages: engines: {node: '>=10'} dev: true - /istanbul-lib-coverage@3.2.0: - resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} + /istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} dev: true @@ -4606,7 +5026,7 @@ packages: resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} engines: {node: '>=10'} dependencies: - istanbul-lib-coverage: 3.2.0 + istanbul-lib-coverage: 3.2.2 make-dir: 4.0.0 supports-color: 7.2.0 dev: true @@ -4616,65 +5036,63 @@ packages: engines: {node: '>=10'} dependencies: debug: 4.3.4 - istanbul-lib-coverage: 3.2.0 + istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: - supports-color dev: true - /istanbul-reports@3.1.6: - resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} + /istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} engines: {node: '>=8'} dependencies: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 dev: true - /jackspeak@2.3.3: - resolution: {integrity: sha512-R2bUw+kVZFS/h1AZqBKrSgDmdmjApzgY0AlCPumopFiAlbUxE2gf+SCuBzQ0cP5hHmUmFYF5yw55T97Th5Kstg==} + /jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} engines: {node: '>=14'} dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 + dev: true /jake@10.8.7: resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==} engines: {node: '>=10'} hasBin: true dependencies: - async: 3.2.4 + async: 3.2.5 chalk: 4.1.2 filelist: 1.0.4 minimatch: 3.1.2 dev: true - /jju@1.4.0: - resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + /js-base64@3.7.7: + resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} dev: false - /joycon@3.1.1: - resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} - engines: {node: '>=10'} - dev: false - - /js-base64@3.7.5: - resolution: {integrity: sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA==} - dev: false - - /js-beautify@1.14.9: - resolution: {integrity: sha512-coM7xq1syLcMyuVGyToxcj2AlzhkDjmfklL8r0JgJ7A76wyGMpJ1oA35mr4APdYNO/o/4YY8H54NQIJzhMbhBg==} - engines: {node: '>=12'} + /js-beautify@1.15.1: + resolution: {integrity: sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==} + engines: {node: '>=14'} hasBin: true dependencies: config-chain: 1.1.13 editorconfig: 1.0.4 - glob: 8.1.0 - nopt: 6.0.0 + glob: 10.3.10 + js-cookie: 3.0.5 + nopt: 7.2.0 + dev: true + + /js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} dev: true - /js-tiktoken@1.0.7: - resolution: {integrity: sha512-biba8u/clw7iesNEWLOLwrNGoBP2lA+hTaBLs/D45pJdUPFXyxD6nhcDVtADChghv4GgyAiMKYMiRx7x6h7Biw==} + /js-tiktoken@1.0.10: + resolution: {integrity: sha512-ZoSxbGjvGyMT13x6ACo9ebhDha/0FHdKA+OsQcMOWcm1Zs7r90Rhk5lhERLzji+3rA7EKpXCgwXcM5fF3DMpdA==} dependencies: base64-js: 1.5.1 dev: false @@ -4683,6 +5101,10 @@ packages: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} dev: false + /js-tokens@8.0.3: + resolution: {integrity: sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw==} + dev: true + /js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true @@ -4697,24 +5119,22 @@ packages: dependencies: argparse: 2.0.1 - /jsdom@22.1.0: - resolution: {integrity: sha512-/9AVW7xNbsBv6GfWho4TTNjEo9fe6Zhf9O7s0Fhhr3u+awPwAJMKwAMXnkk5vBxflqLW9hTHX/0cs+P3gW+cQw==} - engines: {node: '>=16'} + /jsdom@24.0.0: + resolution: {integrity: sha512-UDS2NayCvmXSXVP6mpTj+73JnNQadZlr9N68189xib2tx5Mls7swlTNao26IoHv46BZJFvXygyRtyXd1feAk1A==} + engines: {node: '>=18'} peerDependencies: - canvas: ^2.5.0 + canvas: ^2.11.2 peerDependenciesMeta: canvas: optional: true dependencies: - abab: 2.0.6 - cssstyle: 3.0.0 - data-urls: 4.0.0 + cssstyle: 4.0.1 + data-urls: 5.0.0 decimal.js: 10.4.3 - domexception: 4.0.0 form-data: 4.0.0 - html-encoding-sniffer: 3.0.0 - http-proxy-agent: 5.0.0 - https-proxy-agent: 5.0.1 + html-encoding-sniffer: 4.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.4 is-potential-custom-element-name: 1.0.1 nwsapi: 2.2.7 parse5: 7.1.2 @@ -4722,13 +5142,13 @@ packages: saxes: 6.0.0 symbol-tree: 3.2.4 tough-cookie: 4.1.3 - w3c-xmlserializer: 4.0.0 + w3c-xmlserializer: 5.0.0 webidl-conversions: 7.0.0 - whatwg-encoding: 2.0.0 - whatwg-mimetype: 3.0.0 - whatwg-url: 12.0.1 - ws: 8.14.1 - xml-name-validator: 4.0.0 + whatwg-encoding: 3.1.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 14.0.0 + ws: 8.16.0 + xml-name-validator: 5.0.0 transitivePeerDependencies: - bufferutil - supports-color @@ -4745,7 +5165,7 @@ packages: /json-schema-to-ts@1.6.4: resolution: {integrity: sha512-pR4yQ9DHz6itqswtHCm26mw45FSNfQ9rEQjosaZErhn5J3J2sIViQiz8rDaezjKAhFGpmsoczYVBgGHzFw/stA==} dependencies: - '@types/json-schema': 7.0.13 + '@types/json-schema': 7.0.15 ts-toolbelt: 6.15.5 dev: true @@ -4765,16 +5185,22 @@ packages: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} dev: true - /jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + /jsonc-parser@3.2.1: + resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} + + /jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + optionalDependencies: + graceful-fs: 4.2.11 dev: true /jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} dependencies: - universalify: 2.0.0 + universalify: 2.0.1 optionalDependencies: graceful-fs: 4.2.11 + dev: true /katex@0.12.0: resolution: {integrity: sha512-y+8btoc/CK70XqcHqjxiGWBOeIL8upbS0peTPXTvgrh21n1RiWWcIpSWM+4uXq+IAgNh9YYQWdc7LVDPDAEEAg==} @@ -4783,15 +5209,31 @@ packages: commander: 2.20.3 dev: false - /keyv@4.5.3: - resolution: {integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==} + /katex@0.16.9: + resolution: {integrity: sha512-fsSYjWS0EEOwvy81j3vRA8TEAhQhKiqO+FQaKWp0m39qwOzHVBgAUBIXWj1pB+O2W3fIpNa6Y9KSKCVbfPhyAQ==} + hasBin: true + dependencies: + commander: 8.3.0 + dev: false + + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} dependencies: json-buffer: 3.0.1 - /known-css-properties@0.28.0: - resolution: {integrity: sha512-9pSL5XB4J+ifHP0e0jmmC98OGC1nL8/JjS+fi6mnTlIf//yt/MfVLtKg7S6nCtj/8KTcWX7nRlY0XywoYY1ISQ==} + /kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + dev: false + + /known-css-properties@0.29.0: + resolution: {integrity: sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==} dev: true + /kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + dev: false + /levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -4803,6 +5245,7 @@ packages: /lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} + dev: true /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} @@ -4817,7 +5260,7 @@ packages: engines: {node: '>=8.0.0'} hasBin: true dependencies: - chokidar: 3.5.3 + chokidar: 3.6.0 livereload-js: 3.4.1 opts: 2.0.2 ws: 7.5.9 @@ -4826,20 +5269,23 @@ packages: - utf-8-validate dev: true - /load-tsconfig@0.2.5: - resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: false - /loader-utils@3.2.1: resolution: {integrity: sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==} engines: {node: '>= 12.13.0'} + dev: true /local-pkg@0.4.3: resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} engines: {node: '>=14'} dev: true + /local-pkg@0.5.0: + resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} + engines: {node: '>=14'} + dependencies: + mlly: 1.6.1 + pkg-types: 1.0.3 + /locate-character@3.0.0: resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} dev: true @@ -4849,7 +5295,6 @@ packages: engines: {node: '>=10'} dependencies: p-locate: 5.0.0 - dev: true /locate-path@7.2.0: resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} @@ -4862,29 +5307,26 @@ packages: resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} dev: false - /lodash-unified@1.0.3(@types/lodash-es@4.17.9)(lodash-es@4.17.21)(lodash@4.17.21): + /lodash-unified@1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21): resolution: {integrity: sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==} peerDependencies: '@types/lodash-es': '*' lodash: '*' lodash-es: '*' dependencies: - '@types/lodash-es': 4.17.9 + '@types/lodash-es': 4.17.12 lodash: 4.17.21 lodash-es: 4.17.21 dev: false /lodash.camelcase@4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + dev: true /lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true - /lodash.sortby@4.7.0: - resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} - dev: false - /lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} @@ -4892,10 +5334,10 @@ packages: resolution: {integrity: sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==} dev: false - /loupe@2.3.6: - resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} + /loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} dependencies: - get-func-name: 2.0.0 + get-func-name: 2.0.2 dev: true /lower-case@2.0.2: @@ -4904,9 +5346,10 @@ packages: tslib: 2.6.2 dev: true - /lru-cache@10.0.1: - resolution: {integrity: sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==} + /lru-cache@10.2.0: + resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} engines: {node: 14 || >=16.14} + dev: true /lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} @@ -4914,18 +5357,19 @@ packages: dependencies: yallist: 4.0.0 - /magic-string@0.27.0: - resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} + /magic-string@0.30.8: + resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} engines: {node: '>=12'} dependencies: '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - /magic-string@0.30.3: - resolution: {integrity: sha512-B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw==} - engines: {node: '>=12'} + /magicast@0.3.3: + resolution: {integrity: sha512-ZbrP1Qxnpoes8sz47AM0z08U+jW6TyRgZzcWy3Ma3vDhJttwMwAFDMMQFobwdBxByBD46JYmxRzeF7w2+wJEuw==} dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 + '@babel/parser': 7.24.0 + '@babel/types': 7.24.0 + source-map-js: 1.0.2 + dev: true /make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} @@ -4938,7 +5382,7 @@ packages: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} dependencies: - semver: 7.5.4 + semver: 7.6.0 dev: true /make-error@1.3.6: @@ -4970,7 +5414,7 @@ packages: /mdast-util-from-markdown@0.8.5: resolution: {integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==} dependencies: - '@types/mdast': 3.0.12 + '@types/mdast': 3.0.15 mdast-util-to-string: 2.0.0 micromark: 2.11.4 parse-entities: 2.0.0 @@ -5031,7 +5475,7 @@ packages: /mdast-util-to-markdown@0.6.5: resolution: {integrity: sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==} dependencies: - '@types/unist': 2.0.8 + '@types/unist': 2.0.10 longest-streak: 2.0.4 mdast-util-to-string: 2.0.0 parse-entities: 2.0.0 @@ -5047,6 +5491,10 @@ packages: resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} dev: true + /mdurl@1.0.1: + resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} + dev: false + /memoize-one@6.0.0: resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==} dev: false @@ -5057,6 +5505,17 @@ packages: /merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} + dev: true + + /micro@9.3.5-canary.3: + resolution: {integrity: sha512-viYIo9PefV+w9dvoIBh1gI44Mvx1BOk67B4BpC2QK77qdY0xZF0Q+vWLt/BII6cLkIc8rLmSIcJaB/OrXXKe1g==} + engines: {node: '>= 8.0.0'} + hasBin: true + dependencies: + arg: 4.1.0 + content-type: 1.0.4 + raw-body: 2.4.1 + dev: true /micromark-extension-gfm-autolink-literal@0.5.7: resolution: {integrity: sha512-ePiDGH0/lhcngCe8FtH4ARFoxKTUelMp4L7Gg2pujYD5CSMb9PbblnyL+AAMud/SNMyusbS2XDSiPIRcQoNFAw==} @@ -5131,6 +5590,7 @@ packages: dependencies: braces: 3.0.2 picomatch: 2.3.1 + dev: true /miller-rabin@4.0.1: resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} @@ -5170,6 +5630,7 @@ packages: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 + dev: true /minimatch@5.1.6: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} @@ -5183,7 +5644,7 @@ packages: engines: {node: '>=16 || 14 >=14.17'} dependencies: brace-expansion: 2.0.1 - dev: false + dev: true /minimatch@9.0.1: resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} @@ -5197,10 +5658,18 @@ packages: engines: {node: '>=16 || 14 >=14.17'} dependencies: brace-expansion: 2.0.1 + dev: true /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + /minipass@2.9.0: + resolution: {integrity: sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==} + dependencies: + safe-buffer: 5.2.1 + yallist: 3.1.1 + dev: true + /minipass@3.3.6: resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} engines: {node: '>=8'} @@ -5211,16 +5680,23 @@ packages: /minipass@4.2.8: resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} engines: {node: '>=8'} - dev: false + dev: true /minipass@5.0.0: resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} engines: {node: '>=8'} dev: true - /minipass@7.0.3: - resolution: {integrity: sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==} + /minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} engines: {node: '>=16 || 14 >=14.17'} + dev: true + + /minizlib@1.3.3: + resolution: {integrity: sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==} + dependencies: + minipass: 2.9.0 + dev: true /minizlib@2.1.2: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} @@ -5230,43 +5706,45 @@ packages: yallist: 4.0.0 dev: true + /mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + /mkdirp@1.0.4: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} hasBin: true dev: true - /mlly@1.4.2: - resolution: {integrity: sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==} + /mlly@1.6.1: + resolution: {integrity: sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==} dependencies: - acorn: 8.10.0 - pathe: 1.1.1 + acorn: 8.11.3 + pathe: 1.1.2 pkg-types: 1.0.3 - ufo: 1.3.0 - dev: true + ufo: 1.4.0 /mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} dev: true + /ms@2.1.1: + resolution: {integrity: sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==} + dev: true + /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - /muggle-string@0.3.1: - resolution: {integrity: sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==} + /muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} dev: true - /mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - dependencies: - any-promise: 1.3.0 - object-assign: 4.1.1 - thenify-all: 1.6.0 - dev: false - - /nanoid@3.3.6: - resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -5285,6 +5763,18 @@ packages: tslib: 2.6.2 dev: true + /node-fetch@2.6.7: + resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: true + /node-fetch@2.6.9: resolution: {integrity: sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==} engines: {node: 4.x || >=6.0.0} @@ -5308,8 +5798,8 @@ packages: dependencies: whatwg-url: 5.0.0 - /node-gyp-build@4.6.1: - resolution: {integrity: sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==} + /node-gyp-build@4.8.0: + resolution: {integrity: sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==} hasBin: true dev: true @@ -5332,7 +5822,7 @@ packages: constants-browserify: 1.0.0 create-require: 1.1.1 crypto-browserify: 3.12.0 - domain-browser: 4.22.0 + domain-browser: 4.23.0 events: 3.3.0 https-browserify: 1.0.0 isomorphic-timers-promises: 1.0.1 @@ -5361,12 +5851,12 @@ packages: abbrev: 1.1.1 dev: true - /nopt@6.0.0: - resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + /nopt@7.2.0: + resolution: {integrity: sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} hasBin: true dependencies: - abbrev: 1.1.1 + abbrev: 2.0.0 dev: true /normalize-package-data@3.0.3: @@ -5374,8 +5864,8 @@ packages: engines: {node: '>=10'} dependencies: hosted-git-info: 4.1.0 - is-core-module: 2.13.0 - semver: 7.5.4 + is-core-module: 2.13.1 + semver: 7.6.0 validate-npm-package-license: 3.0.4 dev: false @@ -5403,12 +5893,11 @@ packages: dependencies: path-key: 3.1.1 - /npm-run-path@5.1.0: - resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} + /npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: path-key: 4.0.0 - dev: true /npmlog@5.0.1: resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} @@ -5431,16 +5920,17 @@ packages: /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} + dev: true - /object-inspect@1.12.3: - resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + /object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} dev: true - /object-is@1.1.5: - resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} + /object-is@1.1.6: + resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.7 define-properties: 1.2.1 dev: true @@ -5449,16 +5939,22 @@ packages: engines: {node: '>= 0.4'} dev: true - /object.assign@4.1.4: - resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + /object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 + call-bind: 1.0.7 define-properties: 1.2.1 has-symbols: 1.0.3 object-keys: 1.1.1 dev: true + /once@1.3.3: + resolution: {integrity: sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==} + dependencies: + wrappy: 1.0.2 + dev: true + /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: @@ -5475,17 +5971,6 @@ packages: engines: {node: '>=12'} dependencies: mimic-fn: 4.0.0 - dev: true - - /open@9.1.0: - resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} - engines: {node: '>=14.16'} - dependencies: - default-browser: 4.0.0 - define-lazy-prop: 3.0.0 - is-inside-container: 1.0.0 - is-wsl: 2.2.0 - dev: true /optionator@0.9.3: resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} @@ -5507,25 +5992,41 @@ packages: resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==} dev: true + /os-paths@4.4.0: + resolution: {integrity: sha512-wrAwOeXp1RRMFfQY8Sy7VaGVmPocaLwSFOYCGKSyo8qmJ+/yaafCl5BCA1IQZWqFSRBrKDYFeR9d/VyQzfH/jg==} + engines: {node: '>= 6.0'} + dev: true + + /p-finally@2.0.1: + resolution: {integrity: sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==} + engines: {node: '>=8'} + dev: true + /p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} dependencies: yocto-queue: 0.1.0 - dev: true /p-limit@4.0.0: resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: yocto-queue: 1.0.0 + dev: false + + /p-limit@5.0.0: + resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} + engines: {node: '>=18'} + dependencies: + yocto-queue: 1.0.0 + dev: true /p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} dependencies: p-limit: 3.1.0 - dev: true /p-locate@6.0.0: resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} @@ -5557,12 +6058,14 @@ packages: callsites: 3.1.0 dev: true - /parse-asn1@5.1.6: - resolution: {integrity: sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==} + /parse-asn1@5.1.7: + resolution: {integrity: sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==} + engines: {node: '>= 0.10'} dependencies: - asn1.js: 5.4.1 + asn1.js: 4.10.1 browserify-aes: 1.2.0 evp_bytestokey: 1.0.3 + hash-base: 3.0.4 pbkdf2: 3.1.2 safe-buffer: 5.2.1 dev: true @@ -5582,7 +6085,7 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.22.13 + '@babel/code-frame': 7.23.5 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -5598,7 +6101,6 @@ packages: dependencies: domhandler: 5.0.3 parse5: 7.1.2 - dev: false /parse5@7.1.2: resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} @@ -5619,7 +6121,6 @@ packages: /path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} - dev: true /path-exists@5.0.0: resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} @@ -5629,6 +6130,7 @@ packages: /path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} + dev: true /path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} @@ -5637,6 +6139,12 @@ packages: /path-key@4.0.0: resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} engines: {node: '>=12'} + + /path-match@1.2.4: + resolution: {integrity: sha512-UWlehEdqu36jmh4h5CWJ7tARp1OEVKGHKm6+dg9qMq5RKUTV5WJrGgaZ3dN2m7WFAXDbjlHzvJvL/IUpy84Ktw==} + dependencies: + http-errors: 1.4.0 + path-to-regexp: 1.8.0 dev: true /path-parse@1.0.7: @@ -5647,8 +6155,15 @@ packages: resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} engines: {node: '>=16 || 14 >=14.17'} dependencies: - lru-cache: 10.0.1 - minipass: 7.0.3 + lru-cache: 10.2.0 + minipass: 7.0.4 + dev: true + + /path-to-regexp@1.8.0: + resolution: {integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==} + dependencies: + isarray: 0.0.1 + dev: true /path-to-regexp@6.1.0: resolution: {integrity: sha512-h9DqehX3zZZDCEm+xbfU0ZmwCGFCAAraPJWMXJ4+v32NjZJilVg3k1TcKsRgIb8IQ/izZSaydDc1OhJCZvs2Dw==} @@ -5661,14 +6176,14 @@ packages: /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} + dev: true /pathe@0.2.0: resolution: {integrity: sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==} dev: true - /pathe@1.1.1: - resolution: {integrity: sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==} - dev: true + /pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} /pathval@1.1.1: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} @@ -5685,10 +6200,14 @@ packages: sha.js: 2.4.11 dev: true + /pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + dev: true + /periscopic@3.1.0: resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} dependencies: - '@types/estree': 1.0.1 + '@types/estree': 1.0.5 estree-walker: 3.0.3 is-reference: 3.0.2 dev: true @@ -5700,8 +6219,8 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - /pinia@2.1.6(typescript@5.2.2)(vue@3.3.4): - resolution: {integrity: sha512-bIU6QuE5qZviMmct5XwCesXelb5VavdOWKWaB17ggk++NUwQWWbP5YnsONTk3b752QkW9sACiR81rorpeOMSvQ==} + /pinia@2.1.7(typescript@5.4.2)(vue@3.4.21): + resolution: {integrity: sha512-+C2AHFtcFqjPih0zpYuvof37SFxMQ7OEG2zV9jRI12i9BOy3YQVAHwdKtyyc8pDcDyIc33WCIsZaCFWU7WWxGQ==} peerDependencies: '@vue/composition-api': ^1.4.0 typescript: '>=4.4.4' @@ -5712,15 +6231,10 @@ packages: typescript: optional: true dependencies: - '@vue/devtools-api': 6.5.0 - typescript: 5.2.2 - vue: 3.3.4 - vue-demi: 0.14.6(vue@3.3.4) - dev: false - - /pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} + '@vue/devtools-api': 6.6.1 + typescript: 5.4.2 + vue: 3.4.21(typescript@5.4.2) + vue-demi: 0.14.7(vue@3.4.21) dev: false /pkg-dir@5.0.0: @@ -5733,12 +6247,16 @@ packages: /pkg-types@1.0.3: resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==} dependencies: - jsonc-parser: 3.2.0 - mlly: 1.4.2 - pathe: 1.1.1 + jsonc-parser: 3.2.1 + mlly: 1.6.1 + pathe: 1.1.2 + + /possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} dev: true - /postcss-load-config@3.1.4(postcss@8.4.29): + /postcss-load-config@3.1.4(postcss@8.4.35): resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} engines: {node: '>= 10'} peerDependencies: @@ -5751,94 +6269,102 @@ packages: optional: true dependencies: lilconfig: 2.1.0 - postcss: 8.4.29 + postcss: 8.4.35 yaml: 1.10.2 + dev: true - /postcss-modules-extract-imports@3.0.0(postcss@8.4.29): + /postcss-modules-extract-imports@3.0.0(postcss@8.4.35): resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.29 + postcss: 8.4.35 + dev: true - /postcss-modules-local-by-default@4.0.3(postcss@8.4.29): - resolution: {integrity: sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==} + /postcss-modules-local-by-default@4.0.4(postcss@8.4.35): + resolution: {integrity: sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.29) - postcss: 8.4.29 - postcss-selector-parser: 6.0.13 + icss-utils: 5.1.0(postcss@8.4.35) + postcss: 8.4.35 + postcss-selector-parser: 6.0.15 postcss-value-parser: 4.2.0 + dev: true - /postcss-modules-scope@3.0.0(postcss@8.4.29): - resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==} + /postcss-modules-scope@3.1.1(postcss@8.4.35): + resolution: {integrity: sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.29 - postcss-selector-parser: 6.0.13 + postcss: 8.4.35 + postcss-selector-parser: 6.0.15 + dev: true - /postcss-modules-values@4.0.0(postcss@8.4.29): + /postcss-modules-values@4.0.0(postcss@8.4.35): 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.29) - postcss: 8.4.29 + icss-utils: 5.1.0(postcss@8.4.35) + postcss: 8.4.35 + dev: true - /postcss-modules@6.0.0(postcss@8.4.29): + /postcss-modules@6.0.0(postcss@8.4.35): 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.29) + icss-utils: 5.1.0(postcss@8.4.35) lodash.camelcase: 4.3.0 - postcss: 8.4.29 - postcss-modules-extract-imports: 3.0.0(postcss@8.4.29) - postcss-modules-local-by-default: 4.0.3(postcss@8.4.29) - postcss-modules-scope: 3.0.0(postcss@8.4.29) - postcss-modules-values: 4.0.0(postcss@8.4.29) + postcss: 8.4.35 + postcss-modules-extract-imports: 3.0.0(postcss@8.4.35) + postcss-modules-local-by-default: 4.0.4(postcss@8.4.35) + postcss-modules-scope: 3.1.1(postcss@8.4.35) + postcss-modules-values: 4.0.0(postcss@8.4.35) string-hash: 1.1.3 + dev: true - /postcss-safe-parser@6.0.0(postcss@8.4.29): + /postcss-safe-parser@6.0.0(postcss@8.4.35): resolution: {integrity: sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==} engines: {node: '>=12.0'} peerDependencies: postcss: ^8.3.3 dependencies: - postcss: 8.4.29 + postcss: 8.4.35 dev: true - /postcss-scss@4.0.8(postcss@8.4.29): - resolution: {integrity: sha512-Cr0X8Eu7xMhE96PJck6ses/uVVXDtE5ghUTKNUYgm8ozgP2TkgV3LWs3WgLV1xaSSLq8ZFiXaUrj0LVgG1fGEA==} + /postcss-scss@4.0.9(postcss@8.4.35): + resolution: {integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==} engines: {node: '>=12.0'} peerDependencies: postcss: ^8.4.29 dependencies: - postcss: 8.4.29 + postcss: 8.4.35 dev: true - /postcss-selector-parser@6.0.13: - resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==} + /postcss-selector-parser@6.0.15: + resolution: {integrity: sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==} engines: {node: '>=4'} dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 + dev: true /postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + dev: true - /postcss@8.4.29: - resolution: {integrity: sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==} + /postcss@8.4.35: + resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} engines: {node: ^10 || ^12 || >=14} dependencies: - nanoid: 3.3.6 + nanoid: 3.3.7 picocolors: 1.0.0 source-map-js: 1.0.2 @@ -5854,14 +6380,14 @@ packages: fast-diff: 1.3.0 dev: true - /prettier-plugin-svelte@2.10.1(prettier@2.8.8)(svelte@4.2.0): + /prettier-plugin-svelte@2.10.1(prettier@2.8.8)(svelte@4.2.12): resolution: {integrity: sha512-Wlq7Z5v2ueCubWo0TZzKc9XHcm7TDxqcuzRuGd0gcENfzfT4JZ9yDlCbEgxWgiPmLHkBjfOtpAWkcT28MCDpUQ==} peerDependencies: prettier: ^1.16.4 || ^2.0.0 svelte: ^3.2.0 || ^4.0.0-next.0 dependencies: prettier: 2.8.8 - svelte: 4.2.0 + svelte: 4.2.12 dev: true /prettier@2.8.8: @@ -5870,11 +6396,6 @@ packages: hasBin: true dev: true - /pretty-bytes@5.6.0: - resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} - engines: {node: '>=6'} - dev: true - /pretty-format@29.7.0: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5891,11 +6412,19 @@ packages: parse-ms: 2.1.0 dev: true + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: true + /process@0.11.10: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} dev: true + /promisepipe@3.0.0: + resolution: {integrity: sha512-V6TbZDJ/ZswevgkDNpGt/YqNCiZP9ASfgU+p83uJE6NrGtvSGoOcHLiDCqkMs2+yg7F5qHdLV8d0aS8O26G/KA==} + dev: true + /proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} dev: true @@ -5910,24 +6439,31 @@ packages: bn.js: 4.12.0 browserify-rsa: 4.1.0 create-hash: 1.2.0 - parse-asn1: 5.1.6 + parse-asn1: 5.1.7 randombytes: 2.1.0 safe-buffer: 5.2.1 dev: true + /pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: true + /punycode@1.4.1: resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} dev: true - /punycode@2.3.0: - resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - /qs@6.11.2: - resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} + /qs@6.12.0: + resolution: {integrity: sha512-trVZiI6RMOkO476zLGaBIzszOdFPnCCXHPG9kn0yuS1uz6xdVxPfZdB3vUig9pxPFDM9BRAgz/YUIVQ1/vuiUg==} engines: {node: '>=0.6'} dependencies: - side-channel: 1.0.4 + side-channel: 1.0.6 dev: true /querystring-es3@0.2.1: @@ -5941,6 +6477,7 @@ packages: /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true /quick-lru@6.1.2: resolution: {integrity: sha512-AAFUA5O1d83pIHEhJwWCq/RQcRukCkn/NSm2QsTEMle5f2hP0ChI2+3Xb051PZCkLryI/Ir1MVKviT2FIloaTQ==} @@ -5960,6 +6497,16 @@ packages: safe-buffer: 5.2.1 dev: true + /raw-body@2.4.1: + resolution: {integrity: sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.0 + http-errors: 1.7.3 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: true + /react-is@18.2.0: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} dev: true @@ -5977,12 +6524,24 @@ packages: resolution: {integrity: sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==} engines: {node: '>=12.20'} dependencies: - '@types/normalize-package-data': 2.4.1 + '@types/normalize-package-data': 2.4.4 normalize-package-data: 3.0.3 parse-json: 5.2.0 type-fest: 2.19.0 dev: false + /readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + dev: true + /readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} @@ -5992,16 +6551,19 @@ packages: util-deprecate: 1.0.2 dev: true + /readdirp@3.3.0: + resolution: {integrity: sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + /readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} dependencies: picomatch: 2.3.1 - /regenerator-runtime@0.13.11: - resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} - dev: true - /relateurl@0.2.7: resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} engines: {node: '>= 0.10'} @@ -6059,12 +6621,13 @@ packages: /resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} + dev: true - /resolve@1.22.6: - resolution: {integrity: sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==} + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true dependencies: - is-core-module: 2.13.0 + is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 dev: true @@ -6072,12 +6635,14 @@ packages: /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true /rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} hasBin: true dependencies: glob: 7.2.3 + dev: true /rimraf@4.4.1: resolution: {integrity: sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==} @@ -6085,7 +6650,7 @@ packages: hasBin: true dependencies: glob: 9.3.5 - dev: false + dev: true /ripemd160@2.0.2: resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} @@ -6104,19 +6669,26 @@ packages: - utf-8-validate dev: true - /rollup@2.79.1: - resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==} - engines: {node: '>=10.0.0'} - hasBin: true - optionalDependencies: - fsevents: 2.3.3 - dev: false - - /rollup@3.29.2: - resolution: {integrity: sha512-CJouHoZ27v6siztc21eEQGo0kIcE5D1gVPA571ez0mMYb25LGYGKnVNXpEj5MGlepmDWGXNjDB5q7uNiPHC11A==} - engines: {node: '>=14.18.0', npm: '>=8.0.0'} + /rollup@4.12.1: + resolution: {integrity: sha512-ggqQKvx/PsB0FaWXhIvVkSWh7a/PCLQAsMjBc+nA2M8Rv2/HG0X6zvixAB7KyZBRtifBUhy5k8voQX/mRnABPg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + dependencies: + '@types/estree': 1.0.5 optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.12.1 + '@rollup/rollup-android-arm64': 4.12.1 + '@rollup/rollup-darwin-arm64': 4.12.1 + '@rollup/rollup-darwin-x64': 4.12.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.12.1 + '@rollup/rollup-linux-arm64-gnu': 4.12.1 + '@rollup/rollup-linux-arm64-musl': 4.12.1 + '@rollup/rollup-linux-riscv64-gnu': 4.12.1 + '@rollup/rollup-linux-x64-gnu': 4.12.1 + '@rollup/rollup-linux-x64-musl': 4.12.1 + '@rollup/rollup-win32-arm64-msvc': 4.12.1 + '@rollup/rollup-win32-ia32-msvc': 4.12.1 + '@rollup/rollup-win32-x64-msvc': 4.12.1 fsevents: 2.3.3 dev: true @@ -6124,17 +6696,15 @@ packages: resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} dev: true - /run-applescript@5.0.0: - resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} - engines: {node: '>=12'} - dependencies: - execa: 5.1.1 - dev: true - /run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: queue-microtask: 1.2.3 + dev: true + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: true /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -6144,17 +6714,18 @@ packages: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} dev: true - /sass@1.67.0: - resolution: {integrity: sha512-SVrO9ZeX/QQyEGtuZYCVxoeAL5vGlYjJ9p4i4HFuekWl8y/LtJ7tJc10Z+ck1c8xOuoBm2MYzcLfTAffD0pl/A==} + /sass@1.71.1: + resolution: {integrity: sha512-wovtnV2PxzteLlfNzbgm1tFXPLoZILYAMJtvoXXkD7/+1uP41eKkIt1ypWq5/q2uT94qHjXehEYfmjKOvjL9sg==} engines: {node: '>=14.0.0'} hasBin: true dependencies: - chokidar: 3.5.3 - immutable: 4.3.4 + chokidar: 3.6.0 + immutable: 4.3.5 source-map-js: 1.0.2 + dev: true - /sax@1.2.4: - resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} + /sax@1.3.0: + resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} /saxes@6.0.0: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} @@ -6163,17 +6734,33 @@ packages: xmlchars: 2.2.0 dev: true - /scule@1.0.0: - resolution: {integrity: sha512-4AsO/FrViE/iDNEPaAQlb77tf0csuq27EsVpy6ett584EcRTp6pTDLoGWVxCD77y5iU5FauOvhsI4o1APwPoSQ==} + /scule@1.3.0: + resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} dev: true + /section-matter@1.0.0: + resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} + engines: {node: '>=4'} + dependencies: + extend-shallow: 2.0.1 + kind-of: 6.0.3 + dev: false + /semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true dev: true - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + /semver@7.3.5: + resolution: {integrity: sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} engines: {node: '>=10'} hasBin: true dependencies: @@ -6183,10 +6770,26 @@ packages: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} dev: true + /set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + dev: true + /setimmediate@1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} dev: true + /setprototypeof@1.1.1: + resolution: {integrity: sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==} + dev: true + /sha.js@2.4.11: resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} hasBin: true @@ -6209,12 +6812,14 @@ packages: resolution: {integrity: sha512-oB8s64JsyJ2xhHJlnTwGg++Y3BTF6XnXeXMC7OygD8vtNcCRDiMxEGONvUOeZbxfwEXENmRlqPDouMR/OtGDsw==} dev: false - /side-channel@1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + /side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.2.1 - object-inspect: 1.12.3 + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.1 dev: true /siginfo@2.0.0: @@ -6237,34 +6842,34 @@ packages: resolution: {integrity: sha512-2gFNsEjudzyAqCYQ1XmsETHbmG2vp9jrIeqb+Mxnb/xgnESWfMlXrSEHh10lYIb1hXeco+vSWAAuk2NLl26yFw==} dependencies: byte-base64: 1.1.0 - sax: 1.2.4 + sax: 1.3.0 dev: false - /siyuan-plugin-picgo@1.4.4(typescript@5.2.2): + /siyuan-plugin-picgo@1.4.4(typescript@5.4.2): resolution: {integrity: sha512-ZUFHzoq1UEWpI3achLlDRnjtNmHULP1DnnIRQIGn7wJD3FBsbpXyleLlgjAoAz0QhsC79byKBqjTsUKVR+xaLQ==} dependencies: - '@element-plus/icons-vue': 2.1.0(vue@3.3.4) - '@fortawesome/fontawesome-svg-core': 6.4.2 - '@fortawesome/free-brands-svg-icons': 6.4.2 - '@fortawesome/free-solid-svg-icons': 6.4.2 - '@fortawesome/vue-fontawesome': 3.0.3(@fortawesome/fontawesome-svg-core@6.4.2)(vue@3.3.4) - '@vueuse/core': 10.4.1(vue@3.3.4) + '@element-plus/icons-vue': 2.3.1(vue@3.4.21) + '@fortawesome/fontawesome-svg-core': 6.5.1 + '@fortawesome/free-brands-svg-icons': 6.5.1 + '@fortawesome/free-solid-svg-icons': 6.5.1 + '@fortawesome/vue-fontawesome': 3.0.6(@fortawesome/fontawesome-svg-core@6.5.1)(vue@3.4.21) + '@vueuse/core': 10.9.0(vue@3.4.21) blueimp-md5-es6: 2.7.4 browser-fs-access: 0.34.1 - element-plus: 2.3.14(vue@3.3.4) + element-plus: 2.6.1(vue@3.4.21) lodash: 4.17.21 lodash-es: 4.17.21 - pinia: 2.1.6(typescript@5.2.2)(vue@3.3.4) + pinia: 2.1.7(typescript@5.4.2)(vue@3.4.21) siyuan: 0.7.9 uuid: 9.0.1 - vue: 3.3.4 - vue-i18n: 9.4.1(vue@3.3.4) - vue-router: 4.2.4(vue@3.3.4) - zhi-common: 1.23.7 - zhi-device: 2.3.1 - zhi-fetch-middleware: 0.2.29 + vue: 3.4.21(typescript@5.4.2) + vue-i18n: 9.10.1(vue@3.4.21) + vue-router: 4.3.0(vue@3.4.21) + zhi-common: 1.31.0(typescript@5.4.2) + zhi-device: 2.11.0 + zhi-fetch-middleware: 0.2.29(typescript@5.4.2) zhi-lib-base: 0.4.4 - zhi-siyuan-api: 2.10.2 + zhi-siyuan-api: 2.18.6(typescript@5.4.2) transitivePeerDependencies: - '@vue/composition-api' - typescript @@ -6274,13 +6879,14 @@ packages: resolution: {integrity: sha512-X5olBQhfkgyPRF+d8agpcbAaFnCSvSkN3LWX7XU9jApmCfpJ/4PAmK7mKPfR1YGBpjFLRa/xTrv11BQ3hxN15Q==} dev: false - /siyuan@0.8.3: - resolution: {integrity: sha512-bpYR2PNTzFbSz4aw4CPLltYnI1RWX0rh7pfID2UDJr9FdB1MRwK4DmfSE5qVI4GxZO2J+5PbSt6G+2SDM62iCw==} + /siyuan@0.9.5: + resolution: {integrity: sha512-txDJp+uSmnAoCz4aDw6a3lCz2h4eRhyx5wgInCmSglQx7aoOpMK57nU31N3FY1NVREQcNV0OG6fJZ0iJJOkrag==} dev: false /slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} + dev: true /source-map-js@1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} @@ -6301,34 +6907,28 @@ packages: /source-map@0.7.4: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} - - /source-map@0.8.0-beta.0: - resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} - engines: {node: '>= 8'} - dependencies: - whatwg-url: 7.1.0 - dev: false + 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 + spdx-license-ids: 3.0.17 dev: false - /spdx-exceptions@2.3.0: - resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + /spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} 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 + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.17 dev: false - /spdx-license-ids@3.0.13: - resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} + /spdx-license-ids@3.0.17: + resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} dev: false /sprintf-js@1.0.3: @@ -6339,8 +6939,17 @@ packages: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} dev: true - /std-env@3.4.3: - resolution: {integrity: sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q==} + /stat-mode@0.3.0: + resolution: {integrity: sha512-QjMLR0A3WwFY2aZdV0okfFEJB5TRjkggXZjxP3A1RsWsNHNu3YPv8btmtc6iCFZ0Rul3FE93OYogvhOUClU+ng==} + dev: true + + /statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + dev: true + + /std-env@3.7.0: + resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} dev: true /stream-browserify@3.0.0: @@ -6359,13 +6968,23 @@ packages: xtend: 4.0.2 dev: true - /streamsearch@1.1.0: - resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} - engines: {node: '>=10.0.0'} + /stream-to-array@2.3.0: + resolution: {integrity: sha512-UsZtOYEn4tWU2RGLOXr/o/xjRBftZRlG3dEWoaHr8j4GuypJ3isitGbVyjQKAuMu+xbiop8q224TjiZWc4XTZA==} + dependencies: + any-promise: 1.3.0 + dev: true + + /stream-to-promise@2.2.0: + resolution: {integrity: sha512-HAGUASw8NT0k8JvIVutB2Y/9iBk7gpgEyAudXwNJmZERdMITGdajOa4VJfD/kNiA3TppQpTP4J+CtcHwdzKBAw==} + dependencies: + any-promise: 1.3.0 + end-of-stream: 1.1.0 + stream-to-array: 2.3.0 dev: true /string-hash@1.1.3: resolution: {integrity: sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==} + dev: true /string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} @@ -6382,6 +7001,17 @@ packages: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 strip-ansi: 7.1.0 + dev: true + + /string.prototype.repeat@0.2.0: + resolution: {integrity: sha512-1BH+X+1hSthZFW+X+JaUkjkkUPwIlLEMJBLANN3hOob3RhEk5snLWNECDnYbgn/m5c5JV7Ersu1Yubaf+05cIA==} + dev: false + + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + dev: true /string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} @@ -6400,6 +7030,12 @@ packages: engines: {node: '>=12'} dependencies: ansi-regex: 6.0.1 + dev: true + + /strip-bom-string@1.0.0: + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} + engines: {node: '>=0.10.0'} + dev: false /strip-final-newline@2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} @@ -6408,7 +7044,6 @@ packages: /strip-final-newline@3.0.0: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} - dev: true /strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} @@ -6418,38 +7053,31 @@ packages: /strip-literal@1.3.0: resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} dependencies: - acorn: 8.10.0 + acorn: 8.11.3 + dev: true + + /strip-literal@2.0.0: + resolution: {integrity: sha512-f9vHgsCWBq2ugHAkGMiiYY+AYG0D/cbloKKg0nhaaaSNsujdGIpVXCNsrJpCKr5M0f4aI31mr13UjY6GAuXCKA==} + dependencies: + js-tokens: 8.0.3 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==} + /stylus@0.63.0: + resolution: {integrity: sha512-OMlgrTCPzE/ibtRMoeLVhOY0RcNuNWh0rhAVqeKnk/QwcuUKQbnqhZ1kg2vzD8VU/6h3FoPTq4RJPHgLBvX6Bw==} hasBin: true dependencies: - '@adobe/css-tools': 4.3.1 + '@adobe/css-tools': 4.3.3 debug: 4.3.4 glob: 7.2.3 - sax: 1.2.4 + sax: 1.3.0 source-map: 0.7.4 transitivePeerDependencies: - supports-color - - /sucrase@3.34.0: - resolution: {integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==} - engines: {node: '>=8'} - hasBin: true - dependencies: - '@jridgewell/gen-mapping': 0.3.3 - commander: 4.1.1 - glob: 7.1.6 - lines-and-columns: 1.2.4 - mz: 2.7.0 - pirates: 4.0.6 - ts-interface-checker: 0.1.13 - dev: false + dev: true /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} @@ -6463,14 +7091,15 @@ packages: engines: {node: '>=8'} dependencies: has-flag: 4.0.0 + dev: true /supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} dev: true - /svelte-eslint-parser@0.33.0(svelte@4.2.0): - resolution: {integrity: sha512-5awZ6Bs+Tb/zQwa41PSdcLynAVQTwW0HGyCBjtbAQ59taLZqDgQSMzRlDmapjZdDtzERm0oXDZNE0E+PKJ6ryg==} + /svelte-eslint-parser@0.33.1(svelte@4.2.12): + resolution: {integrity: sha512-vo7xPGTlKBGdLH8T5L64FipvTrqv3OQRx9d2z5X05KKZDlF4rQk8KViZO4flKERY+5BiVdOh7zZ7JGJWo5P0uA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: svelte: ^3.37.0 || ^4.0.0 @@ -6481,27 +7110,28 @@ packages: eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 - postcss: 8.4.29 - postcss-scss: 4.0.8(postcss@8.4.29) - svelte: 4.2.0 + postcss: 8.4.35 + postcss-scss: 4.0.9(postcss@8.4.35) + svelte: 4.2.12 dev: true - /svelte@4.2.0: - resolution: {integrity: sha512-kVsdPjDbLrv74SmLSUzAsBGquMs4MPgWGkGLpH+PjOYnFOziAvENVzgJmyOCV2gntxE32aNm8/sqNKD6LbIpeQ==} + /svelte@4.2.12: + resolution: {integrity: sha512-d8+wsh5TfPwqVzbm4/HCXC783/KPHV60NvwitJnyTA5lWn1elhXMNWhXGCJ7PwPa8qFUnyJNIyuIRt2mT0WMug==} engines: {node: '>=16'} dependencies: - '@ampproject/remapping': 2.2.1 + '@ampproject/remapping': 2.3.0 '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.19 - acorn: 8.10.0 + '@jridgewell/trace-mapping': 0.3.25 + '@types/estree': 1.0.5 + acorn: 8.11.3 aria-query: 5.3.0 - axobject-query: 3.2.1 + axobject-query: 4.0.0 code-red: 1.0.4 css-tree: 2.3.1 estree-walker: 3.0.3 is-reference: 3.0.2 locate-character: 3.0.0 - magic-string: 0.30.3 + magic-string: 0.30.8 periscopic: 3.1.0 dev: true @@ -6509,14 +7139,27 @@ packages: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} dev: true - /synckit@0.8.5: - resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==} + /synckit@0.9.0: + resolution: {integrity: sha512-7RnqIMq572L8PeEzKeBINYEJDDxpcH8JEgLwUqBd3TkofhFRbkq4QLR0u+36avGAhCRbk2nnmjcW9SE531hPDg==} engines: {node: ^14.18.0 || >=16.0.0} dependencies: - '@pkgr/utils': 2.4.2 + '@pkgr/core': 0.1.1 tslib: 2.6.2 dev: true + /tar@4.4.18: + resolution: {integrity: sha512-ZuOtqqmkV9RE1+4odd+MhBpibmCxNP6PJhH/h2OqNuotTX7/XHPZQJv2pKvWMplFH9SIZZhitehh6vBH6LO8Pg==} + engines: {node: '>=4.5'} + dependencies: + chownr: 1.1.4 + fs-minipass: 1.2.7 + minipass: 2.9.0 + minizlib: 1.3.3 + mkdirp: 0.5.6 + safe-buffer: 5.2.1 + yallist: 3.1.1 + dev: true + /tar@6.2.0: resolution: {integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==} engines: {node: '>=10'} @@ -6529,13 +7172,19 @@ packages: yallist: 4.0.0 dev: true - /terser@5.19.4: - resolution: {integrity: sha512-6p1DjHeuluwxDXcuT9VR8p64klWJKo1ILiy19s6C9+0Bh2+NWTX6nD9EPppiER4ICkHDVB1RkVpin/YW2nQn/g==} + /telegraph.md@0.0.1: + resolution: {integrity: sha512-jU4816CV//56Yja8ZmiKpPHPC5zlk/X9uXzHnwaA1R/Ohc2Glg76qDm94JfrPvMZj+Gvq7tKGJXZ76/kE4mjUw==} + dependencies: + commonmark: 0.28.1 + dev: false + + /terser@5.29.1: + resolution: {integrity: sha512-lZQ/fyaIGxsbGxApKmoPTODIzELy3++mXhS5hOqaAWZjQtpq/hFHAc+rm29NND1rYRxRWKcjuARNwULNXa5RtQ==} engines: {node: '>=10'} hasBin: true dependencies: '@jridgewell/source-map': 0.3.5 - acorn: 8.10.0 + acorn: 8.11.3 commander: 2.20.3 source-map-support: 0.5.21 dev: true @@ -6553,19 +7202,6 @@ packages: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: true - /thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} - dependencies: - thenify: 3.3.1 - dev: false - - /thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - dependencies: - any-promise: 1.3.0 - dev: false - /time-span@4.0.0: resolution: {integrity: sha512-MyqZCTGLDZ77u4k+jqg4UlrzPTPZ49NDlaekU6uuFaJLzPIN1woaRXCbGeqOfxwc3Y37ZROGAJ614Rdv7Olt+g==} engines: {node: '>=10'} @@ -6580,32 +7216,20 @@ packages: setimmediate: 1.0.5 dev: true - /tinybench@2.5.1: - resolution: {integrity: sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg==} + /tinybench@2.6.0: + resolution: {integrity: sha512-N8hW3PG/3aOoZAN5V/NSAEDz0ZixDSSt5b/a05iqtpgfLWMSVuCo7w0k2vVvEjdrIoeGqZzweX2WlyioNIHchA==} dev: true - /tinypool@0.7.0: - resolution: {integrity: sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww==} + /tinypool@0.8.2: + resolution: {integrity: sha512-SUszKYe5wgsxnNOVlBYO6IC+8VGWdVGZWAqUxp3UErNBtptZvWbwyUOyzNL59zigz2rCA92QiL3wvG+JDSdJdQ==} engines: {node: '>=14.0.0'} dev: true - /tinyspy@2.1.1: - resolution: {integrity: sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w==} + /tinyspy@2.2.1: + resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} engines: {node: '>=14.0.0'} dev: true - /titleize@3.0.0: - resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} - engines: {node: '>=12'} - dev: true - - /tmp@0.2.1: - resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} - engines: {node: '>=8.17.0'} - dependencies: - rimraf: 3.0.2 - dev: false - /to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} @@ -6616,12 +7240,17 @@ packages: dependencies: is-number: 7.0.0 + /toidentifier@1.0.0: + resolution: {integrity: sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==} + engines: {node: '>=0.6'} + dev: true + /tough-cookie@4.1.3: resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} engines: {node: '>=6'} dependencies: psl: 1.9.0 - punycode: 2.3.0 + punycode: 2.3.1 universalify: 0.2.0 url-parse: 1.5.10 dev: true @@ -6629,17 +7258,11 @@ packages: /tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - /tr46@1.0.1: - resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + /tr46@5.0.0: + resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} + engines: {node: '>=18'} dependencies: - punycode: 2.3.0 - dev: false - - /tr46@4.1.1: - resolution: {integrity: sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==} - engines: {node: '>=14'} - dependencies: - punycode: 2.3.0 + punycode: 2.3.1 dev: true /transliteration@2.3.5: @@ -6653,16 +7276,12 @@ packages: /tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true - dev: false + dev: true /trough@1.0.5: resolution: {integrity: sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==} dev: false - /ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - dev: false - /ts-morph@12.0.0: resolution: {integrity: sha512-VHC8XgU2fFW7yO1f/b3mxKDje1vmyzFXHWzOYmKEkCEwcLjDtbdLgBQviqj4ZwP4MJkQtRo6Ha2I29lq/B+VxA==} dependencies: @@ -6690,8 +7309,8 @@ packages: '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 '@types/node': 14.18.33 - acorn: 8.10.0 - acorn-walk: 8.2.0 + acorn: 8.11.3 + acorn-walk: 8.3.2 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 @@ -6713,42 +7332,6 @@ packages: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} dev: true - /tsup@5.12.9(postcss@8.4.29)(typescript@5.2.2): - resolution: {integrity: sha512-dUpuouWZYe40lLufo64qEhDpIDsWhRbr2expv5dHEMjwqeKJS2aXA/FPqs1dxO4T6mBojo7rvo3jP9NNzaKyDg==} - hasBin: true - peerDependencies: - '@swc/core': ^1 - postcss: ^8.4.12 - typescript: ^4.1.0 - peerDependenciesMeta: - '@swc/core': - optional: true - postcss: - optional: true - typescript: - optional: true - dependencies: - bundle-require: 3.1.2(esbuild@0.14.54) - cac: 6.7.14 - chokidar: 3.5.3 - debug: 4.3.4 - esbuild: 0.14.54 - execa: 5.1.1 - globby: 11.1.0 - joycon: 3.1.1 - postcss: 8.4.29 - postcss-load-config: 3.1.4(postcss@8.4.29) - resolve-from: 5.0.0 - rollup: 2.79.1 - source-map: 0.8.0-beta.0 - sucrase: 3.34.0 - tree-kill: 1.2.2 - typescript: 5.2.2 - transitivePeerDependencies: - - supports-color - - ts-node - dev: false - /tsutils@3.21.0(typescript@4.9.5): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} @@ -6759,14 +7342,14 @@ packages: typescript: 4.9.5 dev: true - /tsutils@3.21.0(typescript@5.2.2): + /tsutils@3.21.0(typescript@5.4.2): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' dependencies: tslib: 1.14.1 - typescript: 5.2.2 + typescript: 5.4.2 dev: true /tty-browserify@0.0.1: @@ -6799,27 +7382,34 @@ packages: resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} engines: {node: '>=4.2.0'} hasBin: true + dev: true - /typescript@5.2.2: - resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} + /typescript@5.4.2: + resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==} engines: {node: '>=14.17'} hasBin: true - /ufo@1.3.0: - resolution: {integrity: sha512-bRn3CsoojyNStCZe0BG0Mt4Nr/4KF+rhFlnNXybgqt5pXHNFRlqinSoQaTrGyzE4X8aHplSb+TorH+COin9Yxw==} + /ufo@1.4.0: + resolution: {integrity: sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==} + + /uid-promise@1.0.0: + resolution: {integrity: sha512-R8375j0qwXyIu/7R0tjdF06/sElHqbmdmWC9M2qQHpEVbvE4I5+38KJI7LUUmQMp7NVq4tKHiBMkT0NFM453Ig==} dev: true - /undici@5.23.0: - resolution: {integrity: sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg==} + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + /undici@5.26.5: + resolution: {integrity: sha512-cSb4bPFd5qgR7qr2jYAi0hlX9n5YKK2ONKkLFkxl+v/9BvC0sOpZjBHDBSXc5lWAf5ty9oZdRXytBIHzgUcerw==} engines: {node: '>=14.0'} dependencies: - busboy: 1.6.0 + '@fastify/busboy': 2.1.1 dev: true /unified@9.2.2: resolution: {integrity: sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==} dependencies: - '@types/unist': 2.0.8 + '@types/unist': 2.0.10 bail: 1.0.5 extend: 3.0.2 is-buffer: 2.0.5 @@ -6828,20 +7418,22 @@ packages: vfile: 4.2.1 dev: false - /unimport@3.3.0: - resolution: {integrity: sha512-3jhq3ZG5hFZzrWGDCpx83kjPzefP/EeuKkIO1T0MA4Zwj+dO/Og1mFvZ4aZ5WSDm0FVbbdVIRH1zKBG7c4wOpg==} + /unimport@3.7.1: + resolution: {integrity: sha512-V9HpXYfsZye5bPPYUgs0Otn3ODS1mDUciaBlXljI4C2fTwfFpvFZRywmlOu943puN9sncxROMZhsZCjNXEpzEQ==} dependencies: - '@rollup/pluginutils': 5.0.4 + '@rollup/pluginutils': 5.1.0 + acorn: 8.11.3 escape-string-regexp: 5.0.0 - fast-glob: 3.3.1 - local-pkg: 0.4.3 - magic-string: 0.30.3 - mlly: 1.4.2 - pathe: 1.1.1 + estree-walker: 3.0.3 + fast-glob: 3.3.2 + local-pkg: 0.5.0 + magic-string: 0.30.8 + mlly: 1.6.1 + pathe: 1.1.2 pkg-types: 1.0.3 - scule: 1.0.0 + scule: 1.3.0 strip-literal: 1.3.0 - unplugin: 1.5.0 + unplugin: 1.9.0 transitivePeerDependencies: - rollup dev: true @@ -6853,31 +7445,42 @@ packages: /unist-util-stringify-position@2.0.3: resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} dependencies: - '@types/unist': 2.0.8 + '@types/unist': 2.0.10 dev: false /unist-util-visit-parents@3.1.1: resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} dependencies: - '@types/unist': 2.0.8 + '@types/unist': 2.0.10 unist-util-is: 4.1.0 dev: false - /universal-user-agent@6.0.0: - resolution: {integrity: sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==} + /universal-user-agent@6.0.1: + resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==} dev: false + /universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + dev: true + /universalify@0.2.0: resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} engines: {node: '>= 4.0.0'} dev: true - /universalify@2.0.0: - resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + /universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} + dev: true + + /unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + dev: true - /unplugin-auto-import@0.16.6(@vueuse/core@10.4.1): - resolution: {integrity: sha512-M+YIITkx3C/Hg38hp8HmswP5mShUUyJOzpifv7RTlAbeFlO2Tyw0pwrogSSxnipHDPTtI8VHFBpkYkNKzYSuyA==} + /unplugin-auto-import@0.17.5(@vueuse/core@10.9.0): + resolution: {integrity: sha512-fHNDkDSxv3PGagX1wmKBYBkgaM4AKAgZmdJw/bxjhNljx9KSXSgHpGfX0MwUrq9qw6q1bhHIZVWyOwoY2koo4w==} engines: {node: '>=14'} peerDependencies: '@nuxt/kit': ^3.2.2 @@ -6888,21 +7491,52 @@ packages: '@vueuse/core': optional: true dependencies: - '@antfu/utils': 0.7.6 - '@rollup/pluginutils': 5.0.4 - '@vueuse/core': 10.4.1(vue@3.3.4) - fast-glob: 3.3.1 - local-pkg: 0.4.3 - magic-string: 0.30.3 + '@antfu/utils': 0.7.7 + '@rollup/pluginutils': 5.1.0 + '@vueuse/core': 10.9.0(vue@3.4.21) + fast-glob: 3.3.2 + local-pkg: 0.5.0 + magic-string: 0.30.8 minimatch: 9.0.3 - unimport: 3.3.0 - unplugin: 1.5.0 + unimport: 3.7.1 + unplugin: 1.9.0 transitivePeerDependencies: - rollup dev: true - /unplugin-vue-components@0.25.2(vue@3.3.4): - resolution: {integrity: sha512-OVmLFqILH6w+eM8fyt/d/eoJT9A6WO51NZLf1vC5c1FZ4rmq2bbGxTy8WP2Jm7xwFdukaIdv819+UI7RClPyCA==} + /unplugin-icons@0.18.5: + resolution: {integrity: sha512-KVNAohXbZ7tVcG1C3p6QaC7wU9Qrj7etv4XvsMMJAxr5LccQZ+Iuv5LOIv/7GtqXaGN1BuFCqRO1ErsHEgEXdQ==} + peerDependencies: + '@svgr/core': '>=7.0.0' + '@svgx/core': ^1.0.1 + '@vue/compiler-sfc': ^3.0.2 || ^2.7.0 + vue-template-compiler: ^2.6.12 + vue-template-es2015-compiler: ^1.9.0 + peerDependenciesMeta: + '@svgr/core': + optional: true + '@svgx/core': + optional: true + '@vue/compiler-sfc': + optional: true + vue-template-compiler: + optional: true + vue-template-es2015-compiler: + optional: true + dependencies: + '@antfu/install-pkg': 0.3.1 + '@antfu/utils': 0.7.7 + '@iconify/utils': 2.1.22 + debug: 4.3.4 + kolorist: 1.8.0 + local-pkg: 0.5.0 + unplugin: 1.9.0 + transitivePeerDependencies: + - supports-color + dev: false + + /unplugin-vue-components@0.26.0(vue@3.4.21): + resolution: {integrity: sha512-s7IdPDlnOvPamjunVxw8kNgKNK8A5KM1YpK5j/p97jEKTjlPNrA0nZBiSfAKKlK1gWZuyWXlKL5dk3EDw874LQ==} engines: {node: '>=14'} peerDependencies: '@babel/parser': ^7.15.8 @@ -6914,40 +7548,35 @@ packages: '@nuxt/kit': optional: true dependencies: - '@antfu/utils': 0.7.6 - '@rollup/pluginutils': 5.0.4 - chokidar: 3.5.3 + '@antfu/utils': 0.7.7 + '@rollup/pluginutils': 5.1.0 + chokidar: 3.6.0 debug: 4.3.4 - fast-glob: 3.3.1 + fast-glob: 3.3.2 local-pkg: 0.4.3 - magic-string: 0.30.3 + magic-string: 0.30.8 minimatch: 9.0.3 - resolve: 1.22.6 - unplugin: 1.5.0 - vue: 3.3.4 + resolve: 1.22.8 + unplugin: 1.9.0 + vue: 3.4.21(typescript@5.4.2) transitivePeerDependencies: - rollup - supports-color dev: true - /unplugin@1.5.0: - resolution: {integrity: sha512-9ZdRwbh/4gcm1JTOkp9lAkIDrtOyOxgHmY7cjuwI8L/2RTikMcVG25GsZwNAgRuap3iDw2jeq7eoqtAsz5rW3A==} + /unplugin@1.9.0: + resolution: {integrity: sha512-14PslvMY3gNbXnQtNIRB566Q057L5Fe7f5LDEamxVi0QQVxoz5hrveBwwZLcKyHtZ09ysmipxRRj5Lv+BGz2Iw==} + engines: {node: '>=14.0.0'} dependencies: - acorn: 8.10.0 - chokidar: 3.5.3 + acorn: 8.11.3 + chokidar: 3.6.0 webpack-sources: 3.2.3 - webpack-virtual-modules: 0.5.0 - dev: true - - /untildify@4.0.0: - resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} - engines: {node: '>=8'} - dev: true + webpack-virtual-modules: 0.6.1 /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: - punycode: 2.3.0 + punycode: 2.3.1 /url-parse@1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} @@ -6960,11 +7589,12 @@ packages: resolution: {integrity: sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==} dependencies: punycode: 1.4.1 - qs: 6.11.2 + qs: 6.12.0 dev: true /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true /util@0.12.5: resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} @@ -6972,8 +7602,14 @@ packages: inherits: 2.0.4 is-arguments: 1.1.1 is-generator-function: 1.0.10 - is-typed-array: 1.1.12 - which-typed-array: 1.1.11 + is-typed-array: 1.1.13 + which-typed-array: 1.1.15 + dev: true + + /uuid@3.3.2: + resolution: {integrity: sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true dev: true /uuid@9.0.1: @@ -6985,13 +7621,13 @@ packages: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true - /v8-to-istanbul@9.1.0: - resolution: {integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==} + /v8-to-istanbul@9.2.0: + resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} engines: {node: '>=10.12.0'} dependencies: - '@jridgewell/trace-mapping': 0.3.19 - '@types/istanbul-lib-coverage': 2.0.4 - convert-source-map: 1.9.0 + '@jridgewell/trace-mapping': 0.3.25 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 dev: true /validate-npm-package-license@3.0.4: @@ -7001,21 +7637,23 @@ packages: spdx-expression-parse: 3.0.1 dev: false - /vercel@32.2.4: - resolution: {integrity: sha512-Vdp/kglvpxcmY+yaQ+4/qZm8O8Hu9sn/JTpdfXNaxAcHP4Pt3GmHTZJmY0K6bQ2MoXjE0/Tp0h9BfHLUoNjRIw==} + /vercel@33.5.5: + resolution: {integrity: sha512-MsuUq6JCPGtRhrzHQ2MVRh8bxNkhVWDaYGPk3LGSEWKbJ0dkB1ic97s5uMEBSsp6QgUB8ZaGuosPDTDGgmPxXw==} engines: {node: '>= 16'} hasBin: true dependencies: - '@vercel/build-utils': 7.2.0 - '@vercel/go': 3.0.1 - '@vercel/hydrogen': 1.0.1 - '@vercel/next': 4.0.5 - '@vercel/node': 3.0.5 - '@vercel/python': 4.0.1 - '@vercel/redwood': 2.0.2 - '@vercel/remix-builder': 2.0.5 - '@vercel/ruby': 2.0.2 - '@vercel/static-build': 2.0.6 + '@vercel/build-utils': 7.8.0 + '@vercel/fun': 1.1.0 + '@vercel/go': 3.0.5 + '@vercel/hydrogen': 1.0.2 + '@vercel/next': 4.1.5 + '@vercel/node': 3.0.22 + '@vercel/python': 4.1.1 + '@vercel/redwood': 2.0.8 + '@vercel/remix-builder': 2.1.2 + '@vercel/ruby': 2.0.5 + '@vercel/static-build': 2.4.2 + chokidar: 3.3.1 transitivePeerDependencies: - '@swc/core' - '@swc/wasm' @@ -7026,30 +7664,29 @@ packages: /vfile-message@2.0.4: resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==} dependencies: - '@types/unist': 2.0.8 + '@types/unist': 2.0.10 unist-util-stringify-position: 2.0.3 dev: false /vfile@4.2.1: resolution: {integrity: sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==} dependencies: - '@types/unist': 2.0.8 + '@types/unist': 2.0.10 is-buffer: 2.0.5 unist-util-stringify-position: 2.0.3 vfile-message: 2.0.4 dev: false - /vite-node@0.34.4(@types/node@18.17.17)(stylus@0.59.0): - resolution: {integrity: sha512-ho8HtiLc+nsmbwZMw8SlghESEE3KxJNp04F/jPUCLVvaURwt0d+r9LxEqCX5hvrrOQ0GSyxbYr5ZfRYhQ0yVKQ==} - engines: {node: '>=v14.18.0'} + /vite-node@1.3.1(@types/node@18.19.22)(stylus@0.63.0): + resolution: {integrity: sha512-azbRrqRxlWTJEVbzInZCTchx0X69M/XPTCz4H+TLvlTcR/xH/3hkRqhOakT41fMJCMzXTu4UvegkZiEoJAWvng==} + engines: {node: ^18.0.0 || >=20.0.0} hasBin: true dependencies: cac: 6.7.14 debug: 4.3.4 - mlly: 1.4.2 - pathe: 1.1.1 + pathe: 1.1.2 picocolors: 1.0.0 - vite: 4.4.9(@types/node@18.17.17)(stylus@0.59.0) + vite: 5.1.5(@types/node@18.19.22)(stylus@0.63.0) transitivePeerDependencies: - '@types/node' - less @@ -7061,8 +7698,8 @@ packages: - terser dev: true - /vite-plugin-html@3.2.0(vite@4.4.9): - resolution: {integrity: sha512-2VLCeDiHmV/BqqNn5h2V+4280KRgQzCFN47cst3WiNK848klESPQnzuC3okH5XHtgwHH/6s1Ho/YV6yIO0pgoQ==} + /vite-plugin-html@3.2.2(vite@5.1.5): + resolution: {integrity: sha512-vb9C9kcdzcIo/Oc3CLZVS03dL5pDlOFuhGlZYDCJ840BhWl/0nGeZWf3Qy7NlOayscY4Cm/QRgULCQkEZige5Q==} peerDependencies: vite: '>=2.0.0' dependencies: @@ -7070,37 +7707,35 @@ packages: colorette: 2.0.20 connect-history-api-fallback: 1.6.0 consola: 2.15.3 - dotenv: 16.3.1 + dotenv: 16.4.5 dotenv-expand: 8.0.3 ejs: 3.1.9 - fast-glob: 3.3.1 + fast-glob: 3.3.2 fs-extra: 10.1.0 html-minifier-terser: 6.1.0 node-html-parser: 5.4.2 pathe: 0.2.0 - vite: 4.4.9(@types/node@18.17.17)(stylus@0.59.0) + vite: 5.1.5(@types/node@18.19.22)(stylus@0.63.0) dev: true - /vite-plugin-node-polyfills@0.14.1(vite@4.4.9): - resolution: {integrity: sha512-S5ofYUkXea/d94AHzDwiTA7Pv/yEwzagnjgVEuBZdy7E72GBfK17qpljAlyK3CD+CRcDzAwwl/4bEjKdvZmTGQ==} + /vite-plugin-node-polyfills@0.21.0(vite@5.1.5): + resolution: {integrity: sha512-Sk4DiKnmxN8E0vhgEhzLudfJQfaT8k4/gJ25xvUPG54KjLJ6HAmDKbr4rzDD/QWEY+Lwg80KE85fGYBQihEPQA==} peerDependencies: - vite: ^2.0.0 || ^3.0.0 || ^4.0.0 + vite: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 dependencies: - '@rollup/plugin-inject': 5.0.3 - buffer-polyfill: /buffer@6.0.3 + '@rollup/plugin-inject': 5.0.5 node-stdlib-browser: 1.2.0 - process: 0.11.10 - vite: 4.4.9(@types/node@18.17.17)(stylus@0.59.0) + vite: 5.1.5(@types/node@18.19.22)(stylus@0.63.0) transitivePeerDependencies: - rollup dev: true - /vite@4.4.9(@types/node@18.17.17)(stylus@0.59.0): - resolution: {integrity: sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==} - engines: {node: ^14.18.0 || >=16.0.0} + /vite@5.1.5(@types/node@18.19.22)(stylus@0.63.0): + resolution: {integrity: sha512-BdN1xh0Of/oQafhU+FvopafUp6WaYenLU/NFoL5WyJL++GxkNfieKzBhM24H3HVsPQrlAqB7iJYTHabzaRed5Q==} + engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: - '@types/node': '>= 14' + '@types/node': ^18.0.0 || >=20.0.0 less: '*' lightningcss: ^1.21.0 sass: '*' @@ -7123,31 +7758,31 @@ packages: terser: optional: true dependencies: - '@types/node': 18.17.17 - esbuild: 0.18.20 - postcss: 8.4.29 - rollup: 3.29.2 - stylus: 0.59.0 + '@types/node': 18.19.22 + esbuild: 0.19.12 + postcss: 8.4.35 + rollup: 4.12.1 + stylus: 0.63.0 optionalDependencies: fsevents: 2.3.3 dev: true - /vitest@0.34.4(jsdom@22.1.0)(stylus@0.59.0): - resolution: {integrity: sha512-SE/laOsB6995QlbSE6BtkpXDeVNLJc1u2LHRG/OpnN4RsRzM3GQm4nm3PQCK5OBtrsUqnhzLdnT7se3aeNGdlw==} - engines: {node: '>=v14.18.0'} + /vitest@1.3.1(@types/node@18.19.22)(jsdom@24.0.0)(stylus@0.63.0): + resolution: {integrity: sha512-/1QJqXs8YbCrfv/GPQ05wAZf2eakUPLPa18vkJAKE7RXOKfVHqMZZ1WlTjiwl6Gcn65M5vpNUB6EFLnEdRdEXQ==} + engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' - '@vitest/browser': '*' - '@vitest/ui': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 1.3.1 + '@vitest/ui': 1.3.1 happy-dom: '*' jsdom: '*' - playwright: '*' - safaridriver: '*' - webdriverio: '*' peerDependenciesMeta: '@edge-runtime/vm': optional: true + '@types/node': + optional: true '@vitest/browser': optional: true '@vitest/ui': @@ -7156,37 +7791,28 @@ packages: optional: true jsdom: optional: true - playwright: - optional: true - safaridriver: - optional: true - webdriverio: - optional: true dependencies: - '@types/chai': 4.3.6 - '@types/chai-subset': 1.3.3 - '@types/node': 18.17.17 - '@vitest/expect': 0.34.4 - '@vitest/runner': 0.34.4 - '@vitest/snapshot': 0.34.4 - '@vitest/spy': 0.34.4 - '@vitest/utils': 0.34.4 - acorn: 8.10.0 - acorn-walk: 8.2.0 - cac: 6.7.14 - chai: 4.3.8 + '@types/node': 18.19.22 + '@vitest/expect': 1.3.1 + '@vitest/runner': 1.3.1 + '@vitest/snapshot': 1.3.1 + '@vitest/spy': 1.3.1 + '@vitest/utils': 1.3.1 + acorn-walk: 8.3.2 + chai: 4.4.1 debug: 4.3.4 - jsdom: 22.1.0 - local-pkg: 0.4.3 - magic-string: 0.30.3 - pathe: 1.1.1 + execa: 8.0.1 + jsdom: 24.0.0 + local-pkg: 0.5.0 + magic-string: 0.30.8 + pathe: 1.1.2 picocolors: 1.0.0 - std-env: 3.4.3 - strip-literal: 1.3.0 - tinybench: 2.5.1 - tinypool: 0.7.0 - vite: 4.4.9(@types/node@18.17.17)(stylus@0.59.0) - vite-node: 0.34.4(@types/node@18.17.17)(stylus@0.59.0) + std-env: 3.7.0 + strip-literal: 2.0.0 + tinybench: 2.6.0 + tinypool: 0.8.2 + vite: 5.1.5(@types/node@18.19.22)(stylus@0.63.0) + vite-node: 1.3.1(@types/node@18.19.22)(stylus@0.63.0) why-is-node-running: 2.2.2 transitivePeerDependencies: - less @@ -7202,12 +7828,12 @@ packages: resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==} dev: true - /vue-component-type-helpers@1.8.4: - resolution: {integrity: sha512-6bnLkn8O0JJyiFSIF0EfCogzeqNXpnjJ0vW/SZzNHfe6sPx30lTtTXlE5TFs2qhJlAtDFybStVNpL73cPe3OMQ==} + /vue-component-type-helpers@1.8.27: + resolution: {integrity: sha512-0vOfAtI67UjeO1G6UiX5Kd76CqaQ67wrRZiOe7UAb9Jm6GzlUr/fC7CV90XfwapJRjpCMaZFhv1V0ajWRmE9Dg==} dev: true - /vue-demi@0.14.6(vue@3.3.4): - resolution: {integrity: sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==} + /vue-demi@0.14.7(vue@3.4.21): + resolution: {integrity: sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==} engines: {node: '>=12'} hasBin: true requiresBuild: true @@ -7218,80 +7844,86 @@ packages: '@vue/composition-api': optional: true dependencies: - vue: 3.3.4 + vue: 3.4.21(typescript@5.4.2) - /vue-eslint-parser@9.3.1(eslint@8.49.0): - resolution: {integrity: sha512-Clr85iD2XFZ3lJ52/ppmUDG/spxQu6+MAeHXjjyI4I1NUYZ9xmenQp4N0oaHJhrA8OOxltCVxMRfANGa70vU0g==} + /vue-eslint-parser@9.4.2(eslint@8.57.0): + resolution: {integrity: sha512-Ry9oiGmCAK91HrKMtCrKFWmSFWvYkpGglCeFAIqDdr9zdXmMMpJOmUJS7WWsW7fX81h6mwHmUZCQQ1E0PkSwYQ==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: '>=6.0.0' dependencies: debug: 4.3.4 - eslint: 8.49.0 + eslint: 8.57.0 eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 esquery: 1.5.0 lodash: 4.17.21 - semver: 7.5.4 + semver: 7.6.0 transitivePeerDependencies: - supports-color dev: true - /vue-i18n@9.4.1(vue@3.3.4): - resolution: {integrity: sha512-vnQyYE9LBuNOqPpETIcCaGnAyLEqfeIvDcyZ9T+WBCWFTqWw1J8FuF1jfeDwpHBi5JKgAwgXyq1mt8jp/x/GPA==} + /vue-i18n@9.10.1(vue@3.4.21): + resolution: {integrity: sha512-37HVJQZ/pZaRXGzFmmMomM1u1k7kndv3xCBPYHKEVfv5W3UVK67U/TpBug71ILYLNmjHLHdvTUPRF81pFT5fFg==} engines: {node: '>= 16'} peerDependencies: vue: ^3.0.0 dependencies: - '@intlify/core-base': 9.4.1 - '@intlify/shared': 9.4.1 - '@vue/devtools-api': 6.5.0 - vue: 3.3.4 + '@intlify/core-base': 9.10.1 + '@intlify/shared': 9.10.1 + '@vue/devtools-api': 6.6.1 + vue: 3.4.21(typescript@5.4.2) dev: false - /vue-router@4.2.4(vue@3.3.4): - resolution: {integrity: sha512-9PISkmaCO02OzPVOMq2w82ilty6+xJmQrarYZDkjZBfl4RvYAlt4PKnEX21oW4KTtWfa9OuO/b3qk1Od3AEdCQ==} + /vue-router@4.3.0(vue@3.4.21): + resolution: {integrity: sha512-dqUcs8tUeG+ssgWhcPbjHvazML16Oga5w34uCUmsk7i0BcnskoLGwjpa15fqMr2Fa5JgVBrdL2MEgqz6XZ/6IQ==} peerDependencies: vue: ^3.2.0 dependencies: - '@vue/devtools-api': 6.5.0 - vue: 3.3.4 + '@vue/devtools-api': 6.6.1 + vue: 3.4.21(typescript@5.4.2) dev: false - /vue-template-compiler@2.7.14: - resolution: {integrity: sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==} + /vue-template-compiler@2.7.16: + resolution: {integrity: sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==} dependencies: de-indent: 1.0.2 he: 1.2.0 dev: true - /vue-tsc@1.8.11(typescript@5.2.2): - resolution: {integrity: sha512-BzfiMdPqDHBlysx4g26NkfVHSQwGD/lTRausmxN9sFyjXz34OWfsbkh0YsVkX84Hu65In1fFlxHiG39Tr4Vojg==} + /vue-tsc@2.0.6(typescript@5.4.2): + resolution: {integrity: sha512-kK50W4XqQL34vHRkxlRWLicrT6+F9xfgCgJ4KSmCHcytKzc1u3c94XXgI+CjmhOSxyw0krpExF7Obo7y4+0dVQ==} hasBin: true peerDependencies: typescript: '*' dependencies: - '@vue/language-core': 1.8.11(typescript@5.2.2) - '@vue/typescript': 1.8.11(typescript@5.2.2) - semver: 7.5.4 - typescript: 5.2.2 + '@volar/typescript': 2.1.2 + '@vue/language-core': 2.0.6(typescript@5.4.2) + semver: 7.6.0 + typescript: 5.4.2 dev: true - /vue@3.3.4: - resolution: {integrity: sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==} + /vue@3.4.21(typescript@5.4.2): + resolution: {integrity: sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true dependencies: - '@vue/compiler-dom': 3.3.4 - '@vue/compiler-sfc': 3.3.4 - '@vue/runtime-dom': 3.3.4 - '@vue/server-renderer': 3.3.4(vue@3.3.4) - '@vue/shared': 3.3.4 + '@vue/compiler-dom': 3.4.21 + '@vue/compiler-sfc': 3.4.21 + '@vue/runtime-dom': 3.4.21 + '@vue/server-renderer': 3.4.21(vue@3.4.21) + '@vue/shared': 3.4.21 + typescript: 5.4.2 - /w3c-xmlserializer@4.0.0: - resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} - engines: {node: '>=14'} + /w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} dependencies: - xml-name-validator: 4.0.0 + xml-name-validator: 5.0.0 dev: true /web-vitals@0.2.4: @@ -7301,10 +7933,6 @@ packages: /webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - /webidl-conversions@4.0.2: - resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} - dev: false - /webidl-conversions@7.0.0: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} @@ -7313,29 +7941,27 @@ packages: /webpack-sources@3.2.3: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} - dev: true - /webpack-virtual-modules@0.5.0: - resolution: {integrity: sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==} - dev: true + /webpack-virtual-modules@0.6.1: + resolution: {integrity: sha512-poXpCylU7ExuvZK8z+On3kX+S8o/2dQ/SVYueKA0D4WEMXROXgY8Ez50/bQEUmvoSMMrWcrJqCHuhAbsiwg7Dg==} - /whatwg-encoding@2.0.0: - resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} - engines: {node: '>=12'} + /whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} dependencies: iconv-lite: 0.6.3 dev: true - /whatwg-mimetype@3.0.0: - resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} - engines: {node: '>=12'} + /whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} dev: true - /whatwg-url@12.0.1: - resolution: {integrity: sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==} - engines: {node: '>=14'} + /whatwg-url@14.0.0: + resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==} + engines: {node: '>=18'} dependencies: - tr46: 4.1.1 + tr46: 5.0.0 webidl-conversions: 7.0.0 dev: true @@ -7345,27 +7971,19 @@ packages: tr46: 0.0.3 webidl-conversions: 3.0.1 - /whatwg-url@7.1.0: - resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} - dependencies: - lodash.sortby: 4.7.0 - tr46: 1.0.1 - webidl-conversions: 4.0.2 - dev: false - - /when-exit@2.1.1: - resolution: {integrity: sha512-XLipGldz/UcleuGaoQjbYuWwD+ICRnzIjlldtwTaTWr7aZz8yQW49rXk6MHQnh+KxOiWiJpM1vIyaxprOnlW4g==} + /when-exit@2.1.2: + resolution: {integrity: sha512-u9J+toaf3CCxCAzM/484qNAxQE75rFdVgiFEEV8Xps2gzYhf0tx73s1WXDQhkwV17E3MxRMz40m7Ekd2/121Lg==} dev: false - /which-typed-array@1.1.11: - resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} + /which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} engines: {node: '>= 0.4'} dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 for-each: 0.3.3 gopd: 1.0.1 - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 dev: true /which@2.0.2: @@ -7405,6 +8023,7 @@ packages: ansi-styles: 6.2.1 string-width: 5.1.2 strip-ansi: 7.1.0 + dev: true /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} @@ -7422,8 +8041,8 @@ packages: optional: true dev: true - /ws@8.14.1: - resolution: {integrity: sha512-4OOseMUq8AzRBI/7SLMUwO+FEDnguetSk7KMb1sHwvF2w2Wv5Hoj0nlifx8vtGsftE/jWHojPy8sMMzYLJ2G/A==} + /ws@8.16.0: + resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -7435,11 +8054,30 @@ packages: optional: true dev: true + /xdg-app-paths@5.1.0: + resolution: {integrity: sha512-RAQ3WkPf4KTU1A8RtFx3gWywzVKe00tfOPFfl2NDGqbIFENQO4kqAJp7mhQjNj/33W5x5hiWWUdyfPq/5SU3QA==} + engines: {node: '>=6'} + dependencies: + xdg-portable: 7.3.0 + dev: true + + /xdg-portable@7.3.0: + resolution: {integrity: sha512-sqMMuL1rc0FmMBOzCpd0yuy9trqF2yTTVe+E9ogwCSWQCdDEtQUwrZPT6AxqtsFGRNxycgncbP/xmOOSPw5ZUw==} + engines: {node: '>= 6.0'} + dependencies: + os-paths: 4.4.0 + dev: true + /xml-name-validator@4.0.0: resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} engines: {node: '>=12'} dev: true + /xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} + dev: true + /xmlbuilder2@3.1.1: resolution: {integrity: sha512-WCSfbfZnQDdLQLiMdGUQpMxxckeQ4oZNMNhLVkcekTu7xhD4tuUDyAPoY8CwXvBYE6LwBHd6QW2WZXlOWr1vCw==} engines: {node: '>=12.0'} @@ -7464,12 +8102,17 @@ packages: engines: {node: '>=10'} dev: false + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: true + /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} /yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} + dev: true /yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} @@ -7481,7 +8124,7 @@ packages: engines: {node: '>=12'} dependencies: cliui: 8.0.1 - escalade: 3.1.1 + escalade: 3.1.2 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 @@ -7489,6 +8132,28 @@ packages: yargs-parser: 21.1.1 dev: false + /yauzl-clone@1.0.4: + resolution: {integrity: sha512-igM2RRCf3k8TvZoxR2oguuw4z1xasOnA31joCqHIyLkeWrvAc2Jgay5ISQ2ZplinkoGaJ6orCz56Ey456c5ESA==} + engines: {node: '>=6'} + dependencies: + events-intercept: 2.0.0 + dev: true + + /yauzl-promise@2.1.3: + resolution: {integrity: sha512-A1pf6fzh6eYkK0L4Qp7g9jzJSDrM6nN0bOn5T0IbY4Yo3w+YkWlHFkJP7mzknMXjqusHFHlKsK2N+4OLsK2MRA==} + engines: {node: '>=6'} + dependencies: + yauzl: 2.10.0 + yauzl-clone: 1.0.4 + dev: true + + /yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + dev: true + /yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} @@ -7497,81 +8162,98 @@ packages: /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - dev: true /yocto-queue@1.0.0: resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} engines: {node: '>=12.20'} - /zhi-blog-api@1.44.2: - resolution: {integrity: sha512-f/JQYZ4tKYNUf5ZXalt8TeiEFcLTQ2MaHp0heP3D4rZchkAC9wezQZD6DKQkIit3n+f7GbiMeOE2IeVt/BYiIQ==} + /zhi-blog-api@1.56.2(typescript@5.4.2): + resolution: {integrity: sha512-Nkly57hLPXvsmW6NWC0ZY70b1HTEOmblTu1eQVZAUw0lo3VcT+efhNp7e2GWaWsI2fw47LAYxDunKo116ndcYA==} dependencies: - zhi-common: 1.23.7 - zhi-lib-base: 0.5.0 + zhi-common: 1.31.0(typescript@5.4.2) + zhi-lib-base: 0.8.0 + transitivePeerDependencies: + - typescript dev: false - /zhi-common@1.18.0: + /zhi-common@1.18.0(typescript@5.4.2): resolution: {integrity: sha512-7m8uyV8+kZ0tJky0myjz8Nj1Ad0kNsMNsg4itixnoM0yIYo6VZ7uU+oMd3qmqyA9kcvszD2QXV4w8qlgIDBGfg==} dependencies: js-yaml: 4.1.0 shorthash2: 1.0.3 transliteration: 2.3.5 - vue: 3.3.4 + vue: 3.4.21(typescript@5.4.2) zhi-lib-base: 0.4.4 + transitivePeerDependencies: + - typescript dev: false - /zhi-common@1.23.7: - resolution: {integrity: sha512-wv8tuadOCD1/OzzRWX4wfac7mqyREXhOQQe5cD1xzTrJMriX5zYFQ51gM8uF6HQvxu9G2JzRuRE0kv4oMeahmw==} + /zhi-common@1.31.0(typescript@5.4.2): + resolution: {integrity: sha512-s9x5e3dLhFmh514yvT1JtP7xriWMVxQ11AyIjOgx5Xo2cKcDv5b6nKDaLj2Jkvms9iwZRSinDY8y/FK3jrfbrg==} dependencies: js-yaml: 4.1.0 shorthash2: 1.0.3 transliteration: 2.3.5 - vue: 3.3.4 - zhi-lib-base: 0.5.0 + vue: 3.4.21(typescript@5.4.2) + zhi-lib-base: 0.8.0 + transitivePeerDependencies: + - typescript + dev: false + + /zhi-device@2.11.0: + resolution: {integrity: sha512-HKcEHVULUcGboePoSBWJ6vDHYqXEiZS/xetzTRV8DRPkRTmeWzJWs5Xu3BTz21Iz3DGy43hFahpm2Yz2+MFUcA==} dev: false /zhi-device@2.3.1: resolution: {integrity: sha512-HLNroA/bIHrEPQTaOC0gZyR42FpaxSJb/lc+LqWvtlazsxeOiYAc9HhFHBwJFdbikMqCogFWVFtGG7OMLYmaKg==} dev: false - /zhi-fetch-middleware@0.2.29: + /zhi-fetch-middleware@0.2.29(typescript@5.4.2): resolution: {integrity: sha512-QUIwvOJ7Aa1EPVPwAflzpvQC8wXvUetdHrFIk+umdVa8L+wYCAF2QTWpCVe4wGe0JClR+V9J8iVlKu9coMZYWw==} dependencies: - zhi-common: 1.18.0 + zhi-common: 1.18.0(typescript@5.4.2) zhi-device: 2.3.1 zhi-lib-base: 0.4.4 + transitivePeerDependencies: + - typescript dev: false - /zhi-fetch-middleware@0.6.4: - resolution: {integrity: sha512-OdZILt6YqzYF+mNS4IRhB9aT6xmeA/LnCbuENmfjq7HmKw6f/hTTIxOJTfsJ5YZGJzeJ2vPCVn4oPDleWpFibw==} + /zhi-fetch-middleware@0.8.0(typescript@5.4.2): + resolution: {integrity: sha512-peaAG0hSXNvld3dd5RNKYXhuoGcBsOMyFlExGeS98k7ikDVY4JF3S6vTw3Xg0Feu61Jik84q7z4AYEGOVuV5Og==} dependencies: - zhi-common: 1.23.7 - zhi-device: 2.3.1 - zhi-lib-base: 0.5.0 + zhi-common: 1.31.0(typescript@5.4.2) + zhi-device: 2.11.0 + zhi-lib-base: 0.8.0 + transitivePeerDependencies: + - typescript dev: false - /zhi-github-middleware@0.4.2: - resolution: {integrity: sha512-P4ikdkdRO4I/SFvuNa2AaDghUC4bu2Y+Wv3i3A3K0hAz1wi/8AXn4suYWSoUbD8z+A1vtr9Xi3Tc84PJxqmxaQ==} + /zhi-github-middleware@0.4.15(typescript@5.4.2): + resolution: {integrity: sha512-D5bKdOwTHMUTZptR49Yt7l3NJstc7cp+Za7HwJknIqnPT11Xu2wOL3kj5fTuBHohY/zQLW5GV40a+Bo3pQYP7Q==} dependencies: - '@octokit/core': 5.0.0 - js-base64: 3.7.5 - zhi-common: 1.23.7 - zhi-lib-base: 0.5.0 + '@octokit/core': 5.1.0 + js-base64: 3.7.7 + zhi-common: 1.31.0(typescript@5.4.2) + zhi-lib-base: 0.8.0 + transitivePeerDependencies: + - typescript dev: false - /zhi-gitlab-middleware@0.6.4: - resolution: {integrity: sha512-ZUr9IfuFQ740nRnzJ/UnvpDs2Nat5iujyshm4Ci5ESyUa9ZRHv4wxU0Q6OXRJVvJ+r7Ml0hA03xxu8kpAHgSbA==} + /zhi-gitlab-middleware@0.6.26(typescript@5.4.2): + resolution: {integrity: sha512-uBsYtJKVWZ7Gml+MnsNfbgLbhLe1r02VKhKZxcHX1MRCejq5+RVQipzshb2KrvVViKl4yrqJEdmqYGxkjKoYkQ==} dependencies: - zhi-fetch-middleware: 0.6.4 - zhi-lib-base: 0.5.0 + zhi-fetch-middleware: 0.8.0(typescript@5.4.2) + zhi-lib-base: 0.8.0 + transitivePeerDependencies: + - typescript dev: false /zhi-lib-base@0.4.4: resolution: {integrity: sha512-adu1KXVDRjsE/tshAXUeRW62VkaNIb0AOcYXnjgHODsw2gJlkxbvVn2wISuboCiwKv1JsD5gbmxdzSkRyJiC5Q==} dev: false - /zhi-lib-base@0.5.0: - resolution: {integrity: sha512-56QfNhYA5HgmnTWRmOxD4UDpOplR0dcpmdq4ZxRFqBtr3eyHdEmm0qBITJt6kk7lzbPNPD2wgsuHq7pnz+9OQg==} + /zhi-lib-base@0.8.0: + resolution: {integrity: sha512-3Ky5p6KvLWpXy2tlb/JIfSEKLSe5w43PBLM6g+hNcWwpL9S62emgcpUAHzGWBbC0vlLBLungt2LOsmwAfhrZ0w==} dev: false /zhi-notion-markdown@0.1.4: @@ -7584,26 +8266,26 @@ packages: - supports-color dev: false - /zhi-siyuan-api@2.10.2: - resolution: {integrity: sha512-mSmjVf9wk7iAGrQG/zWPwHoKQ9OPz5J9Zjp4apoc07zTXuaVyQIwdggHK5383GIiB7fAAAUOuA6de9dazzXLug==} + /zhi-siyuan-api@2.18.6(typescript@5.4.2): + resolution: {integrity: sha512-iNekK4hZwW/gpD8Jxau107oGyPcVMgjApCMtW2WiCYBWsdasM2ITgUOLXSP7Jf2YsSuNT2kA5CBcFpPrAZ05vQ==} dependencies: - zhi-blog-api: 1.44.2 - zhi-common: 1.23.7 - zhi-lib-base: 0.5.0 + zhi-blog-api: 1.56.2(typescript@5.4.2) + zhi-common: 1.31.0(typescript@5.4.2) + zhi-lib-base: 0.8.0 + transitivePeerDependencies: + - typescript dev: false - /zhi-xmlrpc-middleware@0.5.11: - resolution: {integrity: sha512-1rFvkT+ysPDypRsC6C1h4ZU5jnEfL9+d2r05aMGCKp2kAsTSMoYZMtOKRAOcQJ4VY4dbtaeoN9mGF8f9+jTVSA==} + /zhi-xmlrpc-middleware@0.6.19(typescript@5.4.2): + resolution: {integrity: sha512-6ZhQj7tztCiLVnFVkNV014Jsdp1vCAEticONjdlMPzA+YpHxmfDgKcgZuffwl7E1jkR7CpPkwVV1CjdrC2LyJQ==} dependencies: - zhi-common: 1.23.7 - zhi-device: 2.3.1 - zhi-lib-base: 0.5.0 + zhi-common: 1.31.0(typescript@5.4.2) + zhi-device: 2.11.0 + zhi-lib-base: 0.8.0 + transitivePeerDependencies: + - typescript dev: false /zwitch@1.0.5: resolution: {integrity: sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==} dev: false - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false diff --git a/release-please-config.json b/release-please-config.json new file mode 100644 index 0000000..b7c3784 --- /dev/null +++ b/release-please-config.json @@ -0,0 +1,37 @@ +{ + "packages": { + ".": { + "changelog-path": "CHANGELOG.md", + "release-type": "node", + "target-branch": "main", + "bump-minor-pre-major": false, + "bump-patch-for-minor-pre-major": false, + "draft": false, + "prerelease": false + } + }, + "pull-request-header": ":robot: A new release will be created", + "changelog-sections": [ + { + "type": "feat", + "section": "Features" + }, + { + "type": "fix", + "section": "Bug Fixes" + }, + { + "type": "refactor", + "section": "Code Refactoring" + }, + { + "type": "chore", + "section": "Miscellaneous" + }, + { + "type": "perf", + "section": "Performance Improvements" + } + ], + "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json" +} diff --git a/scripts/build.py b/scripts/build.py index aba0fb3..f972315 100644 --- a/scripts/build.py +++ b/scripts/build.py @@ -36,6 +36,8 @@ print(os.getcwd()) os.system("pnpm pluginBuild && pnpm siyuanBuild") + + # 打包 dist_folder = "./dist" data = scriptutils.read_json_file(cwd + "package.json") v = data["version"] diff --git a/scripts/dev.py b/scripts/dev.py index 65a258d..b1cd204 100644 --- a/scripts/dev.py +++ b/scripts/dev.py @@ -20,6 +20,7 @@ # Please contact Terwer, Shenzhen, Guangdong, China, youweics@163.com # or visit www.terwer.space if you need additional information or have any # questions. +import argparse import os import scriptutils @@ -31,8 +32,75 @@ # Get the current working directory. cwd = scriptutils.get_workdir() + # Parse arguments. + parser = argparse.ArgumentParser() + parser.add_argument("-v", "--verbose", action="store_true", help="Enable verbose output.") + parser.add_argument("-p", "--platform", help="Build for different platforms, like siyuan, widget, static.") + parser.add_argument("-d", "--dist", required=False, help="the dist for building files") + args = parser.parse_args() + + if args.verbose: + print("Verbose mode enabled.") + # 设置环境变量 - os.environ['BUILD_TYPE'] = 'siyuan' + if not args.platform or args.platform == '': + args.platform = 'siyuan' + if not args.dist or args.dist == '': + args.dist = args.platform + dist_name = args.dist + os.environ['BUILD_TYPE'] = args.platform + + if args.platform == 'siyuan': + dist_name = 'dist' + # zhi-build + zhi_build_cmd = "zhi-build --production -d " + dist_name + print(zhi_build_cmd) + os.system(zhi_build_cmd) + elif args.platform == 'widget': + # 复制挂件需要的其他文件 + dist_folder = f"./{dist_name}/" + if not os.path.exists(dist_folder): + os.makedirs(dist_folder) + scriptutils.cp_file("./LICENSE", dist_folder) + scriptutils.cp_file("./src/assets/README.md", dist_folder) + scriptutils.cp_file("./src/assets/README_zh_CN.md", dist_folder) + scriptutils.cp_file("./widget.json", dist_folder) + scriptutils.cp_file("./src/assets/icon.png", dist_folder) + scriptutils.cp_file("./src/assets/preview.png", dist_folder) + scriptutils.cp_file("./policy.md", dist_folder) + print("复制挂件需要的其他文件.") + elif args.platform == 'chrome' or args.platform == 'edge' or args.platform == 'firefox': + dist_name = f"extension/{dist_name}" + dist_folder = "./" + dist_name + "/" + print("Building folder for " + dist_name) + print("Building folder path: " + dist_folder) + + # Copy necessary files. + scriptutils.cp_folder("./src/extensions", dist_folder) + scriptutils.cp_file("./LICENSE", dist_folder) + # scriptutils.cp_file("./src/assets/key.pem", dist_folder) + print("Copied required extension files.") + + # Make some adaptors + if args.platform == 'chrome' or args.platform == 'edge': + # Delete Firefox configuration. + scriptutils.rm_folder(dist_folder + "mv2") + print("Deleted Firefox configuration.") + elif args.platform == 'firefox': + scriptutils.mv_file(dist_folder + "mv2/manifest-v2-for-firefox.json", dist_folder + "manifest.json") + scriptutils.mv_file(dist_folder + "mv2/background-v2-for-firefox.js", dist_folder + "background.js") + scriptutils.rm_folder(dist_folder + "mv2") + print("Deleted Chrome configuration.") + else: + raise Exception("Not supported platform: " + args.platform) + + os.environ["VITE_SIYUAN_API_URL"] = "http://127.0.0.1:6806" + elif args.platform == 'nginx': + pass + else: + pass - os.system("zhi-build --serve --production") - os.system("vue-tsc --noEmit && vite build --watch") + # vite-build + vite_cmd = "vue-tsc --noEmit && vite build --watch --outDir " + dist_name + print(vite_cmd) + os.system(vite_cmd) diff --git a/scripts/ext_build.py b/scripts/ext_build.py index c8a3ed4..1271fea 100644 --- a/scripts/ext_build.py +++ b/scripts/ext_build.py @@ -37,10 +37,6 @@ def do_chrome_package(source_folder, is_chrome): scriptutils.rm_folder(source_folder + "mv2") print("Deleted Firefox configuration.") - # Copy the files to the chrome folder. - scriptutils.mkdir("./extension/chrome") - scriptutils.cp_folder(source_folder, "./extension/chrome") - # Package Chrome extension. data = scriptutils.read_json_file(cwd + "package.json") version = data["version"] @@ -75,14 +71,8 @@ def do_firefox_package(source_folder): scriptutils.mv_file(source_folder + "mv2/manifest-v2-for-firefox.json", source_folder + "manifest.json") scriptutils.mv_file(source_folder + "mv2/background-v2-for-firefox.js", source_folder + "background.js") scriptutils.rm_folder(source_folder + "mv2") - print("Deleted Chrome configuration.") - # Copy the files to the firefox folder. - scriptutils.mkdir("./extension/firefox") - scriptutils.cp_folder(source_folder, "./extension/firefox") - print("Published Firefox V2 extension.") - # Package Firefox extension. data = scriptutils.read_json_file(cwd + "package.json") version = data["version"] @@ -115,7 +105,9 @@ def do_firefox_package(source_folder): print("Verbose mode enabled.") # Build the project. - dist_name = "extension/dist" + if not args.type: + args.type = "chrome" + dist_name = f"extension/{args.type}" if args.dist is not None and args.dist != "": dist_name = str(args.dist) dist_folder = "./" + dist_name + "/" @@ -131,10 +123,10 @@ def do_firefox_package(source_folder): # scriptutils.cp_file("./src/assets/key.pem", dist_folder) print("Copied required extension files.") - # Set the BUILD_TYPE environment variable in node. - os.environ["BUILD_TYPE"] = "chrome" + # Set the BUILD_TYPE environment variable in node + os.environ["BUILD_TYPE"] = args.type os.environ["VITE_SIYUAN_API_URL"] = "http://127.0.0.1:6806" - print(f"BUILD_TYPE=>chrome") + print(f"BUILD_TYPE=>{args.type}") build_cmd = "vue-tsc --noEmit && vite build --outDir " + dist_name print("Build command: " + build_cmd) os.system(build_cmd) diff --git a/scripts/make_dev_link.py b/scripts/make_dev_link.py new file mode 100644 index 0000000..6ae6b8f --- /dev/null +++ b/scripts/make_dev_link.py @@ -0,0 +1,219 @@ +# Copyright (c) 2022-2023, terwer . All rights reserved. +# @author terwer on 2023/11/6 +import argparse +import json +import os +import sys +import urllib.parse +import urllib.request + +import scriptutils + +# ************************************ 在这里填写你的配置 ************************************ +# 请在这里写下你的 "workspace/data/plugins" 目录 +# 比如这样 targetDir = 'H:\\SiYuanDevSpace\\data\\plugins' +targetDir = '' +# dev 构建输出目录,相对于项目根路径 +devOutDir = 'dist' +# ****************************************************************************************** + +with open('cookie.txt', 'r', encoding='utf-8') as cookie_file, open('token.txt', 'r', encoding='utf-8') as token_file: + cookie = cookie_file.read().strip() + token = token_file.read().strip() +POST_HEADER = { + "Authorization": f"Token {token}", + "Cookie": cookie, + "Content-Type": "application/json", +} + + +def get_siyuan_dir(): + url = 'http://127.0.0.1:6806/api/system/getWorkspaces' + try: + response = _myfetch(url, { + 'method': 'POST', + 'headers': POST_HEADER + }) + if response['ok'] and 200 <= response['status'] < 300: + data = response['data'] + conf = json.loads(data) + else: + _error(f'\tget_siyuan_dir HTTP-Error: {response["status"]}') + return None + except Exception as e: + _error(f'\tError: {e}') + _error('\tPlease make sure SiYuan is running!!!') + return None + return conf['data'] + + +def choose_target(workspaces, plugin_type="plugin"): + count = len(workspaces) + _log(f'>>> Got {count} SiYuan {"workspaces" if count > 1 else "workspace"}') + for i, workspace in enumerate(workspaces): + _log(f'\t[{i}] {workspace["path"]}') + + if count == 1: + return f'{workspaces[0]["path"]}/data/{plugin_type}s' + else: + index = input(f'\tPlease select a workspace[0-{count - 1}]: ') + return f'{workspaces[int(index)]["path"]}/data/{plugin_type}s' + + +def get_plugin_name(plugin_type="plugin"): + # 检查 plugin.json 是否存在 + if not os.path.exists(f'./{plugin_type}.json'): + _error(f'失败!找不到 {plugin_type}.json') + sys.exit(1) + # 获取插件名称 + # 加载 plugin.json or widget.json + with open(f'./{plugin_type}.json', 'r') as file: + plugin = json.load(file) + plugin_name = plugin.get('name') + if not plugin_name or plugin_name == '': + _error('失败!请在 plugin.json 中设置插件名称') + sys.exit(1) + return plugin_name + + +def make_link(target_dir, plugin_name): + # dev 目录 + dev_dir = os.path.join(os.getcwd(), devOutDir) + # 如果不存在则创建 + if not os.path.exists(dev_dir): + os.makedirs(dev_dir) + + target_path = target_dir + if plugin_name.strip() != '': + target_path = os.path.join(target_dir, plugin_name) + + # 如果已存在,则退出 + if os.path.exists(target_path): + is_symbol = os.path.islink(target_path) + + if is_symbol: + src_path = os.readlink(target_path) + + if _cmp_path(src_path, dev_dir): + _log(f'Good! {target_path} 已经链接到 {dev_dir}') + else: + _error(f'Error! 符号链接 {target_path} 已存在\n但它链接到了 {src_path}') + else: + _error(f'失败!{target_path} 已经存在并且不是符号链接') + + else: + # 创建符号链接 + os.symlink(dev_dir, target_path, target_is_directory=True) + _log(f'Done! 创建符号链接 {target_path}') + + +# ===================== +# private methods +# ===================== +def _log(info): + print(f'\033[36m{info}\033[0m') + + +def _error(info): + print(f'\033[31m{info}\033[0m') + + +def _myfetch(url, options): + method = options['method'].upper() + headers = options['headers'] + + if method == 'GET': + query_params = options.get('params', {}) + query_string = urllib.parse.urlencode(query_params) + full_url = f"{url}?{query_string}" + req = urllib.request.Request(full_url, headers=headers) + elif method == 'POST': + data = options.get('data', {}) + encoded_data = urllib.parse.urlencode(data).encode('utf-8') + req = urllib.request.Request(url, data=encoded_data, headers=headers) + else: + raise ValueError(f"Unsupported method: {method}") + + with urllib.request.urlopen(req) as response: + data = response.read().decode('utf-8') + status = response.status + + return { + 'ok': True, + 'status': status, + 'data': data + } + + +def _cmp_path(path1, path2): + path1 = path1.replace('\\', '/') + path2 = path2.replace('\\', '/') + # 尾部添加分隔符 + if path1[-1] != '/': + path1 += '/' + if path2[-1] != '/': + path2 += '/' + return path1 == path2 + + +if __name__ == "__main__": + # 切换工作空间 + scriptutils.switch_workdir() + + # 获取当前路径 + cwd = scriptutils.get_workdir() + + # Parse arguments. + parser = argparse.ArgumentParser() + parser.add_argument("-f", "--forder", required=False, help="the targetDir for building files") + parser.add_argument("-v", "--verbose", action="store_true", help="Enable verbose output.") + parser.add_argument("-p", "--platform", help="Build for different platforms, like siyuan, widget, static.") + parser.add_argument("-d", "--dist", required=False, help="the dist for building files") + parser.add_argument("-t", "--type", help="Build plugin type, like plugins, widgets.") + args = parser.parse_args() + + if args.verbose: + print("Verbose mode enabled.") + # 设置环境变量 + if not args.platform: + args.platform = 'siyuan' + if not args.dist: + args.dist = 'dist' + if not args.type: + args.type = 'plugin' + devOutDir = args.dist + if args.forder: + # 用于其他模式 + targetDir = args.forder + name = '' + else: + # 获取插件名称,用于思源笔记插件、挂件 + name = get_plugin_name(args.type) + _log(f'>>> 成功获取到插件名称: {name}') + + # 获取插件目录 + _log('>>> 尝试访问 make_dev_link.js 中的常量 "targetDir"...') + if targetDir == '': + _log('>>> 常量 "targetDir" 为空,尝试自动获取 SiYuan 目录...') + res = get_siyuan_dir() + if res is None or len(res) == 0: + _log('>>> 无法自动获取 SiYuan 目录,尝试访问环境变量 "SIYUAN_PLUGIN_DIR"...') + + env = os.getenv('SIYUAN_PLUGIN_DIR') + if env is not None and env != '': + targetDir = env + _log(f'\t从环境变量 "SIYUAN_PLUGIN_DIR" 获取到目标目录: {targetDir}') + else: + _error('\t无法从环境变量 "SIYUAN_PLUGIN_DIR" 获取 SiYuan 目录,失败!') + sys.exit(1) + else: + targetDir = choose_target(res, args.type) + _log(f'>>> 成功获取到目标目录: {targetDir}') + # 检查目录是否存在 + if not os.path.exists(targetDir): + _error(f'失败!插件目录不存在: "{targetDir}"') + _error('请在 scripts/make_dev_link.py 中设置插件目录') + sys.exit(1) + + # 生成软连接 + make_link(targetDir, name) diff --git a/scripts/nginx_build.py b/scripts/nginx_build.py new file mode 100644 index 0000000..feafdf0 --- /dev/null +++ b/scripts/nginx_build.py @@ -0,0 +1,59 @@ +# 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 os + +import scriptutils + +if __name__ == "__main__": + # Switch to the working directory. + scriptutils.switch_workdir() + + # Get the current working directory. + cwd = scriptutils.get_workdir() + + # 获取当前工作目录 + print(os.getcwd()) + + # 设置环境变量 + os.environ['BUILD_TYPE'] = 'nginx' + + os.system("vue-tsc --noEmit && vite build --outDir nginx") + + # 打包 + dist_folder = "./nginx" + data = scriptutils.read_json_file(cwd + "package.json") + v = data["version"] + + src_folder = dist_folder + tmp_folder_name = "./siyuan-publisher-nginx" + build_zip_path = "./build" + build_zip_name = "siyuan-publisher-nginx-" + v + ".zip" + + try: + # 压缩dist为zip + scriptutils.zip_folder(src_folder, tmp_folder_name, build_zip_path, build_zip_name) + scriptutils.cp_file(os.path.join(build_zip_path, build_zip_name), os.path.join(build_zip_path, "package.zip")) + except Exception as e: + print(f"打包错误,{str(e)}") + print("nginx打包完毕.") diff --git a/scripts/serve.py b/scripts/serve.py index fabf0f9..79c6ea7 100644 --- a/scripts/serve.py +++ b/scripts/serve.py @@ -38,6 +38,7 @@ URL = 'http://127.0.0.1:6806' COOKIE = open('cookie.txt').read().strip() TOKEN = open('token.txt').read().strip() + DEV_PAGE_ID = open('pageId.txt').read().strip() # 设置环境变量 os.environ['IS_SERVE'] = 'true' @@ -45,5 +46,8 @@ os.environ['VITE_SIYUAN_API_URL'] = URL os.environ['VITE_SIYUAN_AUTH_TOKEN'] = TOKEN os.environ['VITE_SIYUAN_COOKIE'] = COOKIE + os.environ['VITE_SIYUAN_DEV_PAGE_ID'] = DEV_PAGE_ID + # os.environ['VITE_CJS_TRACE'] = 'true' + os.environ['VITE_CJS_IGNORE_WARNING'] = 'true' os.system("vite") diff --git a/scripts/widget_build.py b/scripts/widget_build.py index 9e3a296..c88303a 100644 --- a/scripts/widget_build.py +++ b/scripts/widget_build.py @@ -38,7 +38,6 @@ parser.add_argument("-d", "--dist", required=False, help="the dist for building files") parser.add_argument("-v", "--verbose", action="store_true", help="enable verbose output") parser.add_argument("-nb", "--nobuild", action="store_true", help="ignore build") - parser.add_argument("-t", "--test", action="store_true", help="copy files to public workspace for local testing") args = parser.parse_args() if args.verbose: @@ -49,6 +48,8 @@ if args.dist is not None and args.dist != "": dist_name = str(args.dist) dist_folder = "./" + dist_name + "/" + if not os.path.exists(dist_folder): + os.makedirs(dist_folder) print("dist_name:" + dist_name) print("dist_folder:" + dist_folder) @@ -57,9 +58,6 @@ else: # 在 node 里面可以通过 process.env.BUILD_TYPE 读取 os.environ["BUILD_TYPE"] = "widget" - build_cmd = "vue-tsc --noEmit && vite build --outDir " + dist_name - print("构建命令:" + build_cmd) - os.system(build_cmd) # 复制挂件需要的其他文件 scriptutils.cp_file("./LICENSE", dist_folder) @@ -70,6 +68,10 @@ scriptutils.cp_file("./src/assets/preview.png", dist_folder) scriptutils.cp_file("./policy.md", dist_folder) print("复制挂件需要的其他文件.") + + build_cmd = "vue-tsc --noEmit && vite build --outDir " + dist_name + print("构建命令:" + build_cmd) + os.system(build_cmd) print("项目构建完成.") # 挂件打包 @@ -84,13 +86,8 @@ # 压缩dist为zip scriptutils.zip_folder(src_folder, tmp_folder_name, build_zip_path, build_zip_name) - scriptutils.cp_file(os.path.join(build_zip_path, build_zip_name), os.path.join(build_zip_path, "package-widget.zip")) + scriptutils.cp_file(os.path.join(build_zip_path, build_zip_name), + os.path.join(build_zip_path, "package-widget.zip")) print("将dist文件打包成zip,用于挂件版本发布.") - if args.test: - # scriptutils.cp_folder(dist_folder, "/Users/terwer/Documents/mydocs/SiYuanWorkspace/public/data/widgets/sy-post-publisher/") - # print("拷贝文件到本地 public 工作空间测试.") - scriptutils.cp_folder(dist_folder, "/Users/terwer/Documents/mydocs/SiYuanWorkspace/test/data/widgets/sy-post-publisher/") - print("拷贝文件到本地 test 工作空间测试.") - - print("发布完毕.") \ No newline at end of file + print("发布完毕.") diff --git a/siyuan/i18n/en_US.json b/siyuan/i18n/en_US.json index a510743..fc70111 100644 --- a/siyuan/i18n/en_US.json +++ b/siyuan/i18n/en_US.json @@ -2,7 +2,9 @@ "publishTool": "Publisher", "publish": "Publish", "preview": "Preview", + "picmanage": "Picture manage", "picbed": "Upload picture to picbed", + "aitool": "AI tool", "setting": "Setting", "settingGeneral": "General setting", "settingPicbed": "Picbed manage", @@ -14,9 +16,11 @@ "cancel": "Cancel", "save": "Save", "publishTo": "Publish to...", + "publishToQuick": "Publish to..", "batchSync": "Batch sync", "publishNormal": "Publish normal", "extendFunction": "Extended functionality", + "articleManage": "Article manage", "aiChat": "AI chat", "aiChatTab": "AI chat tab" } \ No newline at end of file diff --git a/siyuan/i18n/zh_CN.json b/siyuan/i18n/zh_CN.json index b6d51f5..33f2786 100644 --- a/siyuan/i18n/zh_CN.json +++ b/siyuan/i18n/zh_CN.json @@ -2,21 +2,25 @@ "publishTool": "发布工具", "publish": "发布", "preview": "发布预览", + "picmanage": "图床管理", "picbed": "上传图片到图床", - "setting": "设置", + "aitool": "智能工具", + "setting": "通用设置", "settingGeneral": "偏好设置", "settingPicbed": "图床设置", "settingPublish": "发布设置", "settingPlatform": "平台设置", - "settingAbout": "关于", + "settingAbout": "关于作者", "copyPageId": "复制文档ID", "publisherWidget": "挂件版", "cancel": "取消", "save": "保存", "publishTo": "一键发布", + "publishToQuick": "发布到..", "batchSync": "批量分发", "publishNormal": "常规发布", "extendFunction": "扩展功能", + "articleManage": "仪表盘", "aiChat": "AI聊天", - "aiChatTab": "AI聊天(Tab版)" + "aiChatTab": "新页签AI聊天" } diff --git a/siyuan/index.styl b/siyuan/index.styl index a35e3ab..372d0da 100644 --- a/siyuan/index.styl +++ b/siyuan/index.styl @@ -36,4 +36,7 @@ .img-icon img width 16px !important height 16px !important - margin-right 8px \ No newline at end of file + margin-right 8px + +.red + color red \ No newline at end of file diff --git a/siyuan/index.ts b/siyuan/index.ts index 3ae6688..179bf5c 100644 --- a/siyuan/index.ts +++ b/siyuan/index.ts @@ -23,24 +23,41 @@ * questions. */ -import { App, getFrontend, IModel, IObject, Plugin } from "siyuan" +import { App, confirm, getFrontend, IMenuItemOption, IModel, IObject, Menu, Plugin, showMessage } from "siyuan" import { SiyuanConfig, SiyuanKernelApi } from "zhi-siyuan-api" import { createSiyuanAppLogger } from "./appLogger" import { WidgetInvoke } from "./invoke/widgetInvoke" import { Topbar } from "./topbar" +import { ILogger } from "zhi-lib-base" import "./index.styl" +import { ConfigManager } from "~/siyuan/store/config.ts" +import MenuUtils from "~/siyuan/utils/menuUtils.ts" +import { PluginInvoke } from "~/siyuan/invoke/pluginInvoke.ts" +import { icons } from "~/siyuan/utils/svg.ts" +import { PreferenceConfigManager } from "~/siyuan/store/preferenceConfigManager.ts" +/** + * 发布工具插件入口 + * + * @author terwer + * @since 0.1.0 + */ export default class PublisherPlugin extends Plugin { - private logger: any + private logger: ILogger private topbar: Topbar public isMobile: boolean public kernelApi: SiyuanKernelApi private widgetInvoke: WidgetInvoke + private pluginInvoke: PluginInvoke + customTabObject: () => IModel public tabInstance: any + private publishSetting: any + private prefSetting: any + constructor(options: { app: App; id: string; name: string; i18n: IObject }) { super(options) @@ -54,6 +71,7 @@ export default class PublisherPlugin extends Plugin { this.topbar = new Topbar(this) this.widgetInvoke = new WidgetInvoke(this) + this.pluginInvoke = new PluginInvoke(this) } openSetting(): void { @@ -65,8 +83,25 @@ export default class PublisherPlugin extends Plugin { this.topbar.initTopbar() // 初始化自定义Tab this.initCustomTab() + // mountFn + this.mountFn() + } + + onLayoutReady() { + // onEvent + this.onEvent() } + onunload() { + // unmountFn + this.unmountFn() + // offEvent + this.offEvent() + } + + // ================ + // private methods + // ================ private initCustomTab() { const that = this this.customTabObject = this.addTab({ @@ -80,4 +115,67 @@ export default class PublisherPlugin extends Plugin { }, }) } + + private mountFn() { + const elAlertBox = (msg: string) => { + confirm("⚠️错误提示", msg, () => {}) + } + + const win = window as any + win.syp = win.syp ?? {} + win.syp.alert = elAlertBox + } + + private unmountFn() { + const win = window as any + win.syp = undefined + } + + private async onEvent() { + // 预加载数据 + this.publishSetting = await ConfigManager.loadConfig(this) + this.prefSetting = await PreferenceConfigManager.loadConfig(this) + this.eventBus.on("click-editortitleicon", this.blockMenuEventListener) + } + + private offEvent() { + this.eventBus.off("click-editortitleicon", () => {}) + } + + /** + * 添加文档菜单项 + */ + protected readonly blockMenuEventListener = async (e: CustomEvent) => { + // 获取菜单信息 + const detail = e.detail + this.logger.info("detail =>", detail) + + // 获取块菜单上下文 + const context: any = detail?.menu?.menus + if (!context) { + this.logger.error("获取发布菜单失败") + return + } + this.logger.info("当前上下文 =>", context) + + const pageId = detail?.protyle?.block.rootID + if (!pageId) { + this.logger.error("无法获取文档 ID") + return + } + this.logger.info("当前文档 ID =>", detail) + + if (this.prefSetting.showDocQuickMenu === false) { + this.logger.warn("文档发布菜单已关闭") + return + } + + // 快速发布 + const quickMenus = MenuUtils.getQuickMenus(this, this.widgetInvoke, this.publishSetting, pageId) + context.push({ + iconHTML: `${icons.iconPlane}`, + label: this.i18n.publishToQuick, + submenu: quickMenus, + }) + } } diff --git a/siyuan/invoke/pluginInvoke.ts b/siyuan/invoke/pluginInvoke.ts index 2d3b9a7..1a5172f 100644 --- a/siyuan/invoke/pluginInvoke.ts +++ b/siyuan/invoke/pluginInvoke.ts @@ -26,7 +26,7 @@ import PublisherPlugin from "../index" import { createSiyuanAppLogger } from "../appLogger" import { showIframeDialog } from "../iframeDialog" -import PageUtil from "../utils/pageUtil" +import PageUtils from "../utils/pageUtils.ts" import { IObject } from "siyuan" import { isSiyuanFileExists } from "../utils/utils" @@ -45,7 +45,7 @@ export class PluginInvoke { } public async showBlogDialog() { - const pageId: string | undefined = PageUtil.getPageId() + const pageId: string | undefined = PageUtils.getPageId() const pageUrl = `${this.blogPluginBase}/post/${pageId}` // 临时开启预览权限 @@ -60,6 +60,7 @@ export class PluginInvoke { this.logger.info("The document is not shared, will temporarily turn on preview permissions") } + this.logger.info(`Will open page => ${pageUrl}`) showIframeDialog(this.pluginInstance, pageUrl, undefined, undefined, undefined, async (options?: IObject) => { // 回收预览权限 if (!isShared) { @@ -74,14 +75,16 @@ export class PluginInvoke { } public async showPicbedDialog() { - const pageId: string | undefined = PageUtil.getPageId() + const pageId: string | undefined = PageUtils.getPageId() const pageUrl = `${this.picgoPluginBase}/?pageId=${pageId}` + this.logger.info(`Will open page => ${pageUrl}`) showIframeDialog(this.pluginInstance, pageUrl) } public async showPicbedSettingDialog() { - const pageId: string | undefined = PageUtil.getPageId() + const pageId: string | undefined = PageUtils.getPageId() const pageUrl = `${this.picgoPluginBase}/setting?pageId=${pageId}` + this.logger.info(`Will open page => ${pageUrl}`) showIframeDialog(this.pluginInstance, pageUrl) } diff --git a/siyuan/invoke/widgetInvoke.ts b/siyuan/invoke/widgetInvoke.ts index bff1cc8..03fbb72 100644 --- a/siyuan/invoke/widgetInvoke.ts +++ b/siyuan/invoke/widgetInvoke.ts @@ -25,7 +25,7 @@ import { DeviceDetection, DeviceTypeEnum } from "zhi-device" import { createSiyuanAppLogger } from "../appLogger" -import PageUtil from "../utils/pageUtil" +import PageUtils from "../utils/pageUtils.ts" import { showIframeDialog } from "../iframeDialog" import PublisherPlugin from "../index" import { StrUtil } from "zhi-common" @@ -44,7 +44,7 @@ export class WidgetInvoke { } public async showPublisherBatchPublishDialog() { - let pageId: string | undefined = PageUtil.getPageId() + let pageId: string | undefined = PageUtils.getPageId() if (pageId == "") { pageId = undefined } @@ -53,11 +53,19 @@ export class WidgetInvoke { showMessage(`文档ID不能为空,注意:您必须打开当前文档才能进行发布操作`, 2000, "error") return } - await this.showPage(`/?id=${pageId}`) + await this.showPage(`/publish/batchPublish?id=${pageId}`) + } + + public async showPublisherArticleManegeDialog() { + await this.showPage(`/`) + } + + public async showPublisherArticleManegeTab() { + await this.showTab(`/`, this.pluginInstance.i18n.articleManage) } public async showPublisherAiChatDialog() { - let pageId: string | undefined = PageUtil.getPageId() + let pageId: string | undefined = PageUtils.getPageId() if (pageId == "") { pageId = undefined } @@ -65,15 +73,15 @@ export class WidgetInvoke { } public async showPublisherAiChatTab() { - let pageId: string | undefined = PageUtil.getPageId() + let pageId: string | undefined = PageUtils.getPageId() if (pageId == "") { pageId = undefined } - this.showTab(`/ai/chat?id=${pageId}`) + this.showTab(`/ai/chat?id=${pageId}`, this.pluginInstance.i18n.aiChatTab) } public async showPublisherSinglePublishDialog() { - let pageId: string | undefined = PageUtil.getPageId() + let pageId: string | undefined = PageUtils.getPageId() if (pageId == "") { pageId = undefined } @@ -85,11 +93,7 @@ export class WidgetInvoke { await this.showPage(`/publish/singlePublish?id=${pageId}`) } - public async showPublisherQuickPublishDialog(key: string) { - let pageId: string | undefined = PageUtil.getPageId() - if (pageId == "") { - pageId = undefined - } + public async showPublisherQuickPublishDialog(key: string, pageId?: string) { this.logger.debug("pageId=>", pageId) if (StrUtil.isEmptyString(key) || StrUtil.isEmptyString(pageId)) { showMessage(`平台key和文档ID不能为空,注意:您必须打开当前文档才能进行发布操作`, 2000, "error") @@ -103,7 +107,7 @@ export class WidgetInvoke { } public async showPublisherGeneralSettingDialog() { - let pageId: string | undefined = PageUtil.getPageId() + let pageId: string | undefined = PageUtils.getPageId() if (pageId == "") { pageId = undefined } @@ -112,7 +116,7 @@ export class WidgetInvoke { } public async showPublisherAboutDialog() { - let pageId: string | undefined = PageUtil.getPageId() + let pageId: string | undefined = PageUtils.getPageId() if (pageId == "") { pageId = undefined } @@ -137,27 +141,24 @@ export class WidgetInvoke { } } - private showTab(pageUrl: string, noscroll?: boolean) { + private async showTab(pageUrl: string, title: string, noscroll?: boolean) { // 自定义tab this.pluginInstance.tabInstance = openTab({ app: this.pluginInstance.app, custom: { id: "publisher-ai-tab", icon: "iconAccount", - title: this.pluginInstance.i18n.aiChatTab, + title: title, + // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error fn: this.pluginInstance.customTabObject, }, }) + if (this.pluginInstance.tabInstance instanceof Promise) { + this.pluginInstance.tabInstance = await this.pluginInstance.tabInstance + } const url = `/plugins/siyuan-plugin-publisher/#${pageUrl}` this.logger.info("will show webview page =>", url) - // 有高度问题,参考下面的 - // this.pluginInstance.tabInstance.panelElement.innerHTML = ` - //
- // - // - //
` // 参考 https://github.com/zuoez02/siyuan-plugin-webview-flomo/blob/main/index.js#L380C20-L382C29 this.pluginInstance.tabInstance.panelElement.innerHTML = ` diff --git a/siyuan/store/preferenceConfigManager.ts b/siyuan/store/preferenceConfigManager.ts new file mode 100644 index 0000000..56b4e8a --- /dev/null +++ b/siyuan/store/preferenceConfigManager.ts @@ -0,0 +1,51 @@ +/* + * 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 PublisherPlugin from "../index" +import { JsonUtil } from "zhi-common" + +/** + * 配置管理类 + * 提供配置的加载、保存和删除功能 + */ +export class PreferenceConfigManager { + private static storageKey = "/data/storage/syp/publish-preference-cfg.json" + private static cfgKey="publish-preference-cfg" + + /** + * 加载配置 + * + * @param pluginInstance PublisherPlugin的实例 + * @returns 返回配置对象 + */ + public static async loadConfig(pluginInstance: PublisherPlugin): Promise { + const configStr = await pluginInstance.kernelApi.getFile(this.storageKey, "text") + const config= JsonUtil.safeParse(configStr, {} as any) + if(!config[this.cfgKey]){ + return {} + } + return JsonUtil.safeParse(config[this.cfgKey],{} as any) + } +} diff --git a/siyuan/topbar.ts b/siyuan/topbar.ts index f41e061..b9938aa 100644 --- a/siyuan/topbar.ts +++ b/siyuan/topbar.ts @@ -26,14 +26,12 @@ import PublisherPlugin from "./index" import { icons } from "./utils/svg" import { IMenuItemOption, Menu, showMessage } from "siyuan" -import PageUtil from "./utils/pageUtil" -import HtmlUtils from "./utils/htmlUtils" import { createSiyuanAppLogger } from "./appLogger" import { WidgetInvoke } from "./invoke/widgetInvoke" import { PluginInvoke } from "./invoke/pluginInvoke" -import { ObjectUtil } from "zhi-common" -import { DYNAMIC_CONFIG_KEY } from "./Constants" import { ConfigManager } from "~/siyuan/store/config.ts" +import MenuUtils from "~/siyuan/utils/menuUtils.ts" +import { PreferenceConfigManager } from "~/siyuan/store/preferenceConfigManager.ts" /** * 顶部按钮 @@ -62,176 +60,160 @@ export class Topbar { topBarElement.addEventListener("click", async () => { // 预加载数据 const setting = await ConfigManager.loadConfig(self.pluginInstance) + const prefSetting = await PreferenceConfigManager.loadConfig(self.pluginInstance) + // 快速发布 - const quickMenus = self.getQuickMenus(setting) + const quickMenus = + prefSetting.showQuickMenu === false + ? [] + : MenuUtils.getQuickMenus(this.pluginInstance, this.widgetInvoke, setting) // 扩展菜单 - const extendMenus = await self.getExtendMenus() + const extendMenus = + prefSetting.showExtendMenu === false + ? [] + : await MenuUtils.getExtendMenus(this.pluginInstance, this.pluginInvoke) // 初始化菜单 - this.addMenu(topBarElement.getBoundingClientRect(), quickMenus, extendMenus) + await this.addMenu(topBarElement.getBoundingClientRect(), quickMenus, extendMenus, prefSetting) self.logger.info("publisher menu loaded") }) } - private getQuickMenus(setting: any) { - const submenus = [] - // 读取配置 - if (ObjectUtil.isEmptyObject(setting)) { - // 配置错误,直接返回空 - return submenus - } - const dynJsonCfg = setting[DYNAMIC_CONFIG_KEY] as any - this.logger.info("dynJsonCfg =>", dynJsonCfg.totalCfg) - // 构造发布菜单 - dynJsonCfg.totalCfg?.forEach((config: any) => { - let icon = `${config.platformIcon}` - // 修复图片不展示问题 - if (/^\ -1) { - icon = config.platformIcon.replace( - /\.\/images/g, - `${window.location.origin}/plugins/siyuan-plugin-publisher/images` - ) - icon = `${icon}` - } - if (config.isEnabled === true) { - // http://127.0.0.1:6806/plugins/siyuan-plugin-publisher/i - - const submenu = { - iconHTML: `${icon}`, - label: config.platformName, - disabled: !config.isAuth, - click: async () => { - const key = config.platformKey - await this.widgetInvoke.showPublisherQuickPublishDialog(key) - }, - } - submenus.push(submenu) - } - }) - - if (submenus.length == 0) { - return undefined - } - return submenus - } - - private async getExtendMenus() { - const isBlogInstalled = await this.pluginInvoke.preCheckBlogPlugin() - const isPicgoInstalled = await this.pluginInvoke.preCheckPicgoPlugin() - this.logger.info(`isBlogInstalled=>${isBlogInstalled}`) - this.logger.info(`isPicgoInstalled=>${isPicgoInstalled}`) + private async addMenu( + rect: DOMRect, + quickMenus: IMenuItemOption[], + extendMenus: IMenuItemOption[], + prefSetting: any + ) { + const menu = new Menu("publisherMenu") - const extmenus = [] - if (isBlogInstalled) { - // 发布预览 - const extPreviewMenu = { - iconHTML: icons.iconEye, - label: this.pluginInstance.i18n.preview, + // 仪表盘 + if (prefSetting.showArticleManageMenu !== false) { + menu.addItem({ + icon: `iconPaste`, + label: this.pluginInstance.i18n.articleManage + "new", click: () => { - this.pluginInvoke.showBlogDialog() + // this.widgetInvoke.showPublisherArticleManegeDialog() + this.widgetInvoke.showPublisherArticleManegeTab() }, - } - extmenus.push(extPreviewMenu) + }) + menu.addSeparator() } - if (isPicgoInstalled) { - // 图床 - const extPicBedMenu = { - iconHTML: icons.iconPicture, - label: this.pluginInstance.i18n.picbed, - click: async () => { - await this.pluginInvoke.showPicbedDialog() - }, - } - extmenus.push(extPicBedMenu) - const extPicBedSettingMenu = { - iconHTML: icons.iconPicbed, - label: this.pluginInstance.i18n.settingPicbed, - click: async () => { - await this.pluginInvoke.showPicbedSettingDialog() + // 一键发布 + if (prefSetting.showQuickMenu !== false) { + menu.addItem({ + icon: `iconRiffCard`, + label: this.pluginInstance.i18n.publishTo, + submenu: quickMenus, + click: () => { + if (!quickMenus) { + showMessage("请先在 设置->发布设置配置平台并启用", 7000, "error") + } }, - } - extmenus.push(extPicBedSettingMenu) - } - if (extmenus.length == 0) { - return undefined - } - return extmenus - } - - private addMenu(rect: DOMRect, quickMenus: IMenuItemOption[], extendMenus: IMenuItemOption[]) { - const menu = new Menu("publisherMenu") + }) - // 一键发布 - menu.addItem({ - icon: `iconRiffCard`, - label: this.pluginInstance.i18n.publishTo, - submenu: quickMenus, - click: () => { - if (!quickMenus) { - showMessage("请先在 设置->发布设置配置平台并启用", 7000, "error") - } - }, - }) + menu.addSeparator() + } // 常规发布 - menu.addSeparator() - menu.addItem({ - iconHTML: icons.iconPen, - label: this.pluginInstance.i18n.publishNormal, - click: () => { - this.widgetInvoke.showPublisherSinglePublishDialog() - }, - }) + if (prefSetting.showSingleMenu !== false) { + menu.addItem({ + iconHTML: icons.iconPen, + label: this.pluginInstance.i18n.publishNormal, + click: () => { + this.widgetInvoke.showPublisherSinglePublishDialog() + }, + }) + menu.addSeparator() + } // 批量分发 - menu.addSeparator() - menu.addItem({ - iconHTML: ``, - label: this.pluginInstance.i18n.batchSync, - click: () => { - this.widgetInvoke.showPublisherBatchPublishDialog() - }, - }) + if (prefSetting.showBatchMenu !== false) { + menu.addItem({ + iconHTML: ``, + label: this.pluginInstance.i18n.batchSync, + click: () => { + this.widgetInvoke.showPublisherBatchPublishDialog() + }, + }) + menu.addSeparator() + } - // AI聊天 - menu.addSeparator() - menu.addItem({ - iconHTML: ``, - label: this.pluginInstance.i18n.aiChat, - click: () => { - this.widgetInvoke.showPublisherAiChatDialog() - }, - }) + // 图床管理 + if (prefSetting.showExtendMenu !== false) { + const isPicgoInstalled = await this.pluginInvoke.preCheckPicgoPlugin() + this.logger.info(`isPicgoInstalled=>${isPicgoInstalled}`) + if (isPicgoInstalled) { + // 图床 + menu.addItem({ + iconHTML: icons.iconPicbed, + label: this.pluginInstance.i18n.picmanage, + submenu: [ + { + iconHTML: icons.iconPicture, + label: this.pluginInstance.i18n.picbed, + click: async () => { + await this.pluginInvoke.showPicbedDialog() + }, + }, + { + iconHTML: icons.iconPicbed, + label: this.pluginInstance.i18n.settingPicbed, + click: async () => { + await this.pluginInvoke.showPicbedSettingDialog() + }, + }, + ], + }) + menu.addSeparator() + } + } - // AI聊天Tab版 - menu.addSeparator() - menu.addItem({ - iconHTML: ``, - label: this.pluginInstance.i18n.aiChatTab, - click: () => { - this.widgetInvoke.showPublisherAiChatTab() - }, - }) + // AI工具 + if (prefSetting.showAIMenu !== false) { + menu.addItem({ + iconHTML: icons.iconPicbed, + label: this.pluginInstance.i18n.aitool, + submenu: [ + // { + // iconHTML: ``, + // label: this.pluginInstance.i18n.aiChat, + // click: () => { + // this.widgetInvoke.showPublisherAiChatDialog() + // }, + // }, + { + iconHTML: ``, + label: this.pluginInstance.i18n.aiChat, + click: () => { + this.widgetInvoke.showPublisherAiChatTab() + }, + }, + ], + }) + menu.addSeparator() + } // 扩展功能 - menu.addSeparator() - menu.addItem({ - icon: `iconBazaar`, - label: this.pluginInstance.i18n.extendFunction, - submenu: extendMenus, - click: () => { - if (!extendMenus) { - showMessage( - "扩展功能需配合其他插件使用,目前支持在线分享、PicGo插件。请先下载在并启用扩展插件。", - 7000, - "error" - ) - } - }, - }) + if (prefSetting.showExtendMenu !== false) { + menu.addItem({ + icon: `iconBazaar`, + label: this.pluginInstance.i18n.extendFunction, + submenu: extendMenus, + click: () => { + if (!extendMenus) { + showMessage( + "扩展功能需配合其他插件使用,目前支持在线分享、PicGo插件。请先下载在并启用扩展插件。", + 7000, + "error" + ) + } + }, + }) + menu.addSeparator() + } - // 设置 - menu.addSeparator() + // 通用设置 menu.addItem({ icon: "iconSettings", label: this.pluginInstance.i18n.setting, @@ -254,23 +236,7 @@ export class Topbar { ], }) - // 当前文档ID - const pageId = PageUtil.getPageId() - menu.addSeparator() - menu.addItem({ - iconHTML: icons.iconOl, - label: this.pluginInstance.i18n.copyPageId, - click: async () => { - await HtmlUtils.copyToClipboard(pageId) - this.pluginInstance.kernelApi.pushMsg({ - msg: `当前文档ID已复制=>${pageId}`, - timeout: 3000, - }) - this.logger.info("当前文档ID已复制", pageId) - }, - }) - - // slogan + // 关于作者 menu.addSeparator() menu.addItem({ icon: "iconSparkles", diff --git a/siyuan/utils/menuUtils.ts b/siyuan/utils/menuUtils.ts new file mode 100644 index 0000000..100cfb6 --- /dev/null +++ b/siyuan/utils/menuUtils.ts @@ -0,0 +1,133 @@ +/* + * 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 { IMenuItemOption } from "siyuan" +import { ObjectUtil } from "zhi-common" +import { DYNAMIC_CONFIG_KEY } from "../Constants.ts" +import CrossPageUtils from "../../cross/crossPageUtils.ts" +import { icons } from "./svg.ts" +import HtmlUtils from "./htmlUtils.ts" +import { WidgetInvoke } from "../invoke/widgetInvoke.ts" +import PublisherPlugin from "../index.ts" +import { PluginInvoke } from "../invoke/pluginInvoke.ts" +import PageUtils from "./pageUtils.ts" + +class MenuUtils { + public static getQuickMenus( + pluginInstance: PublisherPlugin, + widgetInvoke: WidgetInvoke, + setting: any, + pageId?: string + ) { + if (!pageId) { + pageId = PageUtils.getPageId() + if (pageId == "") { + pageId = undefined + } + } + + const submenus = [] + // 读取配置 + if (ObjectUtil.isEmptyObject(setting)) { + // 配置错误,直接返回空 + return submenus + } + const dynJsonCfg = setting[DYNAMIC_CONFIG_KEY] as any + // 构造发布菜单 + dynJsonCfg.totalCfg?.forEach((config: any) => { + let icon = `${config.platformIcon}` + // 修复图片不展示问题 + if (/^ -1) { + icon = config.platformIcon.replace( + /\.\/images/g, + `${window.location.origin}/plugins/siyuan-plugin-publisher/images` + ) + icon = `${icon}` + } + if (config.isEnabled === true) { + const submenu = { + iconHTML: `${icon}`, + label: CrossPageUtils.longPlatformName(config.platformName, 11), + disabled: !config.isAuth, + click: async () => { + const key = config.platformKey + await widgetInvoke.showPublisherQuickPublishDialog(key, pageId) + }, + } + submenus.push(submenu) + } + }) + + if (submenus.length == 0) { + return undefined + } + return submenus + } + + public static async getExtendMenus(pluginInstance: PublisherPlugin, pluginInvoke: PluginInvoke, pageId?: string) { + if (!pageId) { + pageId = PageUtils.getPageId() + if (pageId == "") { + pageId = undefined + } + } + + const isBlogInstalled = await pluginInvoke.preCheckBlogPlugin() + + const extmenus = [] + if (isBlogInstalled) { + // 发布预览 + const extPreviewMenu = { + iconHTML: icons.iconEye, + label: pluginInstance.i18n.preview, + click: () => { + pluginInvoke.showBlogDialog() + }, + } + extmenus.push(extPreviewMenu) + } + + // 当前文档ID + const docIdMenu = { + iconHTML: icons.iconOl, + label: pluginInstance.i18n.copyPageId, + click: async () => { + await HtmlUtils.copyToClipboard(pageId) + await pluginInstance.kernelApi.pushMsg({ + msg: `当前文档ID已复制=>${pageId}`, + timeout: 3000, + }) + }, + } + extmenus.push(docIdMenu) + + if (extmenus.length == 0) { + return undefined + } + return extmenus + } +} + +export default MenuUtils diff --git a/siyuan/utils/pageUtils.ts b/siyuan/utils/pageUtils.ts new file mode 100644 index 0000000..2da915d --- /dev/null +++ b/siyuan/utils/pageUtils.ts @@ -0,0 +1,40 @@ +/* + * 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. + */ + +/** + * 文档工具类 + */ +class PageUtils { + public static getPageId() { + // 查找包含 protyle 类但不包含 fn__none 的 div 元素 + const protyleElement = document.querySelector("div.protyle:not(.fn__none)") + // 在该 div 元素下查找包含 protyle-title 类的 div 元素,并查找 data-node-id 属性 + const protyleTitleElement = protyleElement?.querySelector("div.protyle-title") + // 如果该元素存在 data-node-id 属性,则获取其值并返回,否则返回空字符串 + return protyleTitleElement?.hasAttribute("data-node-id") ? protyleTitleElement.getAttribute("data-node-id") : "" + } +} + +export default PageUtils diff --git a/src/adaptors/api/antora/antoraConfig.ts b/src/adaptors/api/antora/antoraConfig.ts new file mode 100644 index 0000000..0b7285e --- /dev/null +++ b/src/adaptors/api/antora/antoraConfig.ts @@ -0,0 +1,66 @@ +/* + * 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 { CommonGithubConfig } from "~/src/adaptors/api/base/github/commonGithubConfig.ts" +import { CategoryTypeEnum, PageTypeEnum, PasswordType } from "zhi-blog-api" + +/** + * Antora 配置 + */ +class AntoraConfig extends CommonGithubConfig { + constructor( + githubUsername: string, + githubAuthToken: string, + githubRepo: string, + githubBranch: string, + middlewareUrl?: string + ) { + super(githubUsername, githubAuthToken, githubRepo, githubBranch, middlewareUrl) + + // 设置Antora的预览URL,使用文档ID作为文档预览的URL参数 + this.previewUrl = "/docs/[docid]" + // 设置页面类型为Markdown或其他适用的类型 + this.pageType = PageTypeEnum.Markdown + // 设置密码类型,使用GitHub令牌来管理密码 + this.passwordType = PasswordType.PasswordType_Token + // 是否启用标签 + this.tagEnabled = true + // 是否启用分类 + this.cateEnabled = true + // 是否启用知识空间 + this.knowledgeSpaceEnabled = true + // 知识空间的标题 + this.knowledgeSpaceTitle = "文档库" + // 知识空间的类型,可以根据实际情况选择 + this.knowledgeSpaceType = CategoryTypeEnum.CategoryType_Tree_Single + // 是否允许更改知识空间 + this.allowKnowledgeSpaceChange = false + // 设置知识空间只读模式的提示 + this.placeholder.knowledgeSpaceReadonlyModeTip = + "由于Antora平台的限制,暂时不支持编辑所属文档库。如需修改,请删除之后重新发布。" + } +} + +export { AntoraConfig } diff --git a/src/adaptors/api/base/baseBlogApi.ts b/src/adaptors/api/base/baseBlogApi.ts index 0bfb73a..4efb059 100644 --- a/src/adaptors/api/base/baseBlogApi.ts +++ b/src/adaptors/api/base/baseBlogApi.ts @@ -23,11 +23,13 @@ * questions. */ -import { BlogApi, BlogConfig, Post, YamlConvertAdaptor } from "zhi-blog-api" +import { BlogApi, BlogConfig, CategoryInfo, Post, TagInfo, YamlConvertAdaptor } from "zhi-blog-api" import { PublisherAppInstance } from "~/src/publisherAppInstance.ts" import { createAppLogger, ILogger } from "~/src/utils/appLogger.ts" import { useProxy } from "~/src/composables/useProxy.ts" import { BaseExtendApi } from "~/src/adaptors/base/baseExtendApi.ts" +import { JsonUtil, StrUtil } from "zhi-common" +import { useSiyuanDevice } from "~/src/composables/useSiyuanDevice.ts" /** * API授权统一封装基类 @@ -37,10 +39,12 @@ import { BaseExtendApi } from "~/src/adaptors/base/baseExtendApi.ts" * @since 0.9.0 */ export class BaseBlogApi extends BlogApi { + protected appInstance: PublisherAppInstance protected logger: ILogger protected cfg: BlogConfig - public readonly proxyFetch: any protected readonly baseExtendApi: BaseExtendApi + private readonly proxyFetch: any + private readonly corsFetch: any /** * 初始化API授权适配器 @@ -51,22 +55,124 @@ export class BaseBlogApi extends BlogApi { constructor(appInstance: PublisherAppInstance, cfg: BlogConfig) { super() + this.appInstance = appInstance this.cfg = cfg this.logger = createAppLogger("base-blog-api") - this.baseExtendApi = new BaseExtendApi(this) + this.baseExtendApi = new BaseExtendApi(this, cfg) - const { proxyFetch } = useProxy(cfg.middlewareUrl) + const { proxyFetch, corsFetch } = useProxy(cfg.middlewareUrl, cfg.corsAnywhereUrl) this.proxyFetch = proxyFetch + this.corsFetch = corsFetch + } + + public async checkAuth(): Promise { + return true } public getYamlAdaptor(): YamlConvertAdaptor { return null } + public getPostPreviewUrl(postid: string): Promise { + return this.getPreviewUrl(postid) + } + public async preEditPost(post: Post, id?: string, publishCfg?: any): Promise { return await this.baseExtendApi.preEditPost(post, id, publishCfg) } + public async getCategories(keyword?: string): Promise { + return this.baseExtendApi.getCategories(keyword) + } + + public async getTags(): Promise { + return this.baseExtendApi.getTags() + } + + // =================================================================================================================== + /** + * API 代理请求 + * + * @param url - 请求的 URL + * @param headers - 请求的头部信息,默认为空数组 + * @param params - 请求的参数,默认为 undefined + * @param method - 请求的 HTTP 方法,默认为 GET + * @param contentType - 请求的内容类型,默认为 application/json + * @param forceProxy - 是否强制使用代理,默认为 false + */ + public async apiProxyFetch( + url: string, + headers: any[] = [], + params: any = undefined, + method: "GET" | "POST" | "PUT" | "DELETE" | "PATCH" = "GET", + contentType: string = "application/json", + forceProxy: boolean = false + ) { + const isCorsProxyAvailable = !StrUtil.isEmptyString(this.cfg.corsAnywhereUrl) + // 如果没有可用的 CORS 代理或者没有强制使用代理,使用默认的自动检测机制 + if (!isCorsProxyAvailable || !forceProxy) { + this.logger.info("Using legency api fetch") + // const proxyFetch = async ( + // url: string, + // headers: any[] = [], + // params: any = {}, + // method: "GET" | "POST" | "PUT" | "DELETE" | "PATCH" = "GET", + // contentType: string = "application/json", + // forceProxy: boolean = false + // ) => { + this.logger.info("Using legency api fetch") + return this.proxyFetch(url, headers, params, method, contentType, forceProxy) + } else { + // const corsFetch = async ( + // url: string, + // headers: any[] = [], + // params: BodyInit = undefined, + // method: "GET" | "POST" | "PUT" | "DELETE" = "GET" + // ) + this.logger.info("Using cors api fetch") + return this.corsFetch(url, headers, params, method) + } + } + + /** + * API 表单请求 + * + * @param url - 请求的 URL + * @param headers - 请求的头部信息,默认为空数组 + * @param formData - 表单数据 + * @param forceProxy - 是否强制使用代理,默认为 false + */ + public async apiFormFetch(url: string, headers: any[], formData: FormData, forceProxy: boolean = false) { + const isCorsProxyAvailable = !StrUtil.isEmptyString(this.cfg.corsAnywhereUrl) + // 如果没有可用的 CORS 代理或者没有强制使用代理,使用默认的自动检测机制 + if (!isCorsProxyAvailable || !forceProxy) { + this.logger.info("Using legency api formFetch") + const { isInSiyuanOrSiyuanNewWin } = useSiyuanDevice() + if (!isInSiyuanOrSiyuanNewWin()) { + throw new Error( + "检测到当前为非 electron 环境并且未设置 cors 代理,此功能将不可用!请设置 cors 代理或者使用PC 客户端" + ) + } + const win = this.appInstance.win + const doFetch = win.require(`${this.appInstance.moduleBase}libs/zhi-formdata-fetch/index.cjs`) + + // headers + const header = headers.length > 0 ? headers[0] : {} + this.logger.debug("before zhi-formdata-fetch, headers =>", headers) + this.logger.debug("before zhi-formdata-fetch, url =>", url) + + const resText = await doFetch(this.appInstance.moduleBase, url, header, formData) + this.logger.debug("apiForm doFetch success, resText =>", resText) + const resJson = JsonUtil.safeParse(resText, {} as any) + this.logger.debug("apiForm doFetch success, resJson=>", resJson) + + return resJson + } else { + this.logger.info("Using cors-anywhere api formFetch") + return this.corsFetch(url, headers, formData, "POST") + } + } + // ================ // private methods // ================ diff --git a/src/adaptors/api/base/commonBlogConfig.ts b/src/adaptors/api/base/commonBlogConfig.ts index 4942e7c..60c98dd 100644 --- a/src/adaptors/api/base/commonBlogConfig.ts +++ b/src/adaptors/api/base/commonBlogConfig.ts @@ -27,7 +27,6 @@ import { BlogConfig, PageTypeEnum } from "zhi-blog-api" import { CommonBlogPlaceholder } from "~/src/adaptors/api/base/commonBlogPlaceholder.ts" export class CommonBlogConfig extends BlogConfig { - /** * 操作提示 */ @@ -39,6 +38,7 @@ export class CommonBlogConfig extends BlogConfig { this.apiUrl = apiUrl this.username = username this.password = password + this.tokenSettingUrl = undefined this.apiStatus = false this.blogid = "" this.blogName = "" @@ -46,12 +46,12 @@ export class CommonBlogConfig extends BlogConfig { this.previewUrl = "" this.pageType = PageTypeEnum.Markdown this.middlewareUrl = middlewareUrl + // this.corsAnywhereUrl = "" + // this.corsCookieArray = [] this.usernameEnabled = false this.allowPreviewUrlChange = true this.showTokenTip = false this.yamlLinkEnabled = true - this.useMdFilename = false - this.usePathCategory = false this.placeholder = new CommonBlogPlaceholder() } } diff --git a/src/adaptors/api/base/github/commonGithubApiAdaptor.ts b/src/adaptors/api/base/github/commonGithubApiAdaptor.ts index a24a7e1..26255f3 100644 --- a/src/adaptors/api/base/github/commonGithubApiAdaptor.ts +++ b/src/adaptors/api/base/github/commonGithubApiAdaptor.ts @@ -28,11 +28,10 @@ import { createAppLogger } from "~/src/utils/appLogger.ts" 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 { DateUtil, HtmlUtil, StrUtil, YamlUtil } from "zhi-common" +import { StrUtil, YamlUtil } from "zhi-common" import { toRaw } from "vue" import { Base64 } from "js-base64" -import { CommonGitlabConfig } from "~/src/adaptors/api/base/gitlab/commonGitlabConfig.ts" -import IdUtil from "~/src/utils/idUtil.ts" +import sypIdUtil from "~/src/utils/sypIdUtil.ts" /** * Github API 适配器 @@ -62,6 +61,23 @@ class CommonGithubApiAdaptor extends BaseBlogApi { this.githubClient = new CommonGithubClient(githubConfig) } + public async checkAuth(): Promise { + let flag: boolean + try { + const testFilePath = `test.md` + await this.safeDeletePost(testFilePath) + const res = await this.githubClient.publishGithubPage(testFilePath, "Hello, World!") + await this.safeDeletePost(testFilePath) + flag = !StrUtil.isEmptyString(res?.content?.path) + } catch (e) { + this.logger.info(`checkAuth error =>`, e) + flag = false + } + + this.logger.info(`checkAuth finished => ${flag}`) + return flag + } + public async getUsersBlogs(): Promise { const result: UserBlog[] = [] @@ -88,17 +104,36 @@ class CommonGithubApiAdaptor extends BaseBlogApi { // 路径处理 const savePath = post.cate_slugs?.[0] ?? cfg.blogid - const filename = post.mdFilename ?? "auto-" + IdUtil.newID() - const docPath = `${savePath}/${filename}.md` + const filename = post.mdFilename ?? "auto-" + sypIdUtil.newID() + ".md" + const docPath = StrUtil.pathJoin(savePath, filename) this.logger.info("将要最终发送到以下目录 =>", docPath) // 开始发布 - const res = await this.githubClient.publishGithubPage(docPath, post.description) + let finalRes: any + try { + const res = await this.githubClient.publishGithubPage(docPath, post.description) - if (!res?.content?.path) { - throw new Error("Github 调用API异常") + if (!res?.content?.path) { + throw new Error("Github 调用API异常") + } + + finalRes = res + } catch (e) { + // 失败之后尝试删除旧数据再发一次 + try { + await this.deletePost(docPath) + } catch (e) { + this.logger.warn("尝试删除失败,忽略", e) + } + const res2 = await this.githubClient.publishGithubPage(docPath, post.description) + if (!res2?.content?.path) { + throw new Error("重发依旧失败,Github 调用API异常") + } + + finalRes = res2 } - return res.content.path + + return finalRes.content.path } public async getPost(postid: string, useSlug?: boolean): Promise { @@ -154,10 +189,6 @@ class CommonGithubApiAdaptor extends BaseBlogApi { return true } - public async getCategories(): Promise { - return Promise.resolve([]) - } - public async getCategoryTreeNodes(docPath: string): Promise { const res = await this.githubClient.getGithubPageTreeNode(docPath) return res @@ -172,16 +203,16 @@ class CommonGithubApiAdaptor extends BaseBlogApi { .replace("[branch]", cfg.githubBranch) .replace("[docpath]", postid) // 路径组合 - previewUrl = StrUtil.pathJoin(this.cfg.home, previewUrl) + // previewUrl = StrUtil.pathJoin(this.cfg.home, previewUrl) return previewUrl } - public async getPostPreviewUrl(postid: string): Promise { + public override async getPostPreviewUrl(postid: string): Promise { let previewUrl: string const newPostid = postid.substring(postid.lastIndexOf("/") + 1).replace(".md", "") - previewUrl = this.cfg.previewUrl.replace("[postid]", newPostid) + previewUrl = this.cfg.previewPostUrl.replace("[postid]", newPostid) // 路径组合 - previewUrl = StrUtil.pathJoin(StrUtil.pathJoin(this.cfg.home, this.cfg.username), previewUrl) + // previewUrl = StrUtil.pathJoin(this.cfg.postHome, previewUrl) return previewUrl } @@ -189,47 +220,12 @@ class CommonGithubApiAdaptor extends BaseBlogApi { // ================ // private methods // ================ - private processFilename(post: Post, cfg: CommonGitlabConfig) { - // 处理文件规则 - const created = DateUtil.formatIsoToZhDate(post.dateCreated.toISOString(), true) - const datearr = created.split(" ")[0] - const numarr = datearr.split("-") - const y = numarr[0] - const m = numarr[1] - const d = numarr[2] - this.logger.debug("created numarr=>", numarr) - let filename = cfg.mdFilenameRule.replace(/\.md/g, "") - if (cfg.useMdFilename) { - // 使用真实文件名作为MD文件名 - filename = filename.replace(/\[filename\]/g, post.title) - } else { - // 使用别名作为MD文件名 - filename = filename.replace(/\[slug\]/g, post.wp_slug) - } - // 年月日 - filename = filename - .replace(/\[yyyy\]/g, y) - .replace(/\[MM\]/g, m) - .replace(/\[mm\]/g, m) - .replace(/\[dd\]/g, d) - - return filename - } + public async safeDeletePost(postid: string): Promise { + try { + await this.githubClient.deleteGithubPage(postid) + } catch (e) {} - private processPathCategory(savePath: string, cfg: CommonGitlabConfig) { - let categories = [] - if (cfg.usePathCategory) { - this.logger.debug("savePath=>", savePath) - const docPathArray = savePath.split("/") - if (docPathArray.length > 1) { - for (let i = 1; i < docPathArray.length - 1; i++) { - const docCate = HtmlUtil.removeTitleNumber(docPathArray[i]) - categories.push(docCate) - } - } - } - - return categories + return true } } diff --git a/src/adaptors/api/base/github/commonGithubConfig.ts b/src/adaptors/api/base/github/commonGithubConfig.ts index df5afcd..57c4a1f 100644 --- a/src/adaptors/api/base/github/commonGithubConfig.ts +++ b/src/adaptors/api/base/github/commonGithubConfig.ts @@ -25,6 +25,7 @@ import { PasswordType } from "zhi-blog-api" import { CommonBlogConfig } from "~/src/adaptors/api/base/commonBlogConfig.ts" +import { StrUtil } from "zhi-common" /** * CommonGithubConfig 类用于存储 GitHub 相关配置信息 @@ -60,6 +61,11 @@ class CommonGithubConfig extends CommonBlogConfig { */ public email: string + /** + * 作者主页 + */ + public site: string + /** * Markdown文件名规则(占位符:[yyyy] [MM] [dd] [slug] [filename] ) */ @@ -68,7 +74,7 @@ class CommonGithubConfig extends CommonBlogConfig { /** * 预览规则(占位符:[yyyy] [MM] [dd] [postid]) */ - public previewPostUrl: string + public override previewPostUrl: string = "" /** * MD文件预览规则(占位符:[user] [repo] [branch] [docpath]) @@ -111,9 +117,8 @@ class CommonGithubConfig extends CommonBlogConfig { this.defaultMsg = "auto published by siyuan-plugin-publisher" this.author = "terwer" this.email = "youweics@163.com" + this.site = StrUtil.pathJoin(this.home, "/" + this.username) this.mdFilenameRule = "[filename].md" - this.useMdFilename = false - this.usePathCategory = false this.middlewareUrl = middlewareUrl } diff --git a/src/adaptors/api/base/gitlab/commonGitlabApiAdaptor.ts b/src/adaptors/api/base/gitlab/commonGitlabApiAdaptor.ts index b5e658c..3747aa3 100644 --- a/src/adaptors/api/base/gitlab/commonGitlabApiAdaptor.ts +++ b/src/adaptors/api/base/gitlab/commonGitlabApiAdaptor.ts @@ -29,11 +29,11 @@ import { CommonGitlabConfig } from "~/src/adaptors/api/base/gitlab/commonGitlabC import { createAppLogger } from "~/src/utils/appLogger.ts" import { CommonGitlabClient } from "zhi-gitlab-middleware" import { CategoryInfo, Post, UserBlog, YamlConvertAdaptor, YamlFormatObj } from "zhi-blog-api" -import { DateUtil, HtmlUtil, StrUtil, YamlUtil } from "zhi-common" +import { StrUtil, YamlUtil } from "zhi-common" import { toRaw } from "vue" import { Base64 } from "js-base64" import { isDev } from "~/src/utils/constants.ts" -import IdUtil from "~/src/utils/idUtil.ts" +import sypIdUtil from "~/src/utils/sypIdUtil.ts" /** * Gitlab API 适配器 @@ -64,6 +64,23 @@ class CommonGitlabApiAdaptor extends BaseBlogApi { ) } + public async checkAuth(): Promise { + let flag: boolean + try { + const testFilePath = `test.md` + await this.safeDeletePost(testFilePath) + const res = await this.gitlabClient.createRepositoryFile(testFilePath, "Hello, World!") + await this.safeDeletePost(testFilePath) + flag = !StrUtil.isEmptyString(res?.file_path) + } catch (e) { + this.logger.info(`checkAuth error =>`, e) + flag = false + } + + this.logger.info(`checkAuth finished => ${flag}`) + return flag + } + public async getUsersBlogs(): Promise { const result: UserBlog[] = [] @@ -90,18 +107,36 @@ class CommonGitlabApiAdaptor extends BaseBlogApi { // 路径处理 const savePath = post.cate_slugs?.[0] ?? cfg.blogid - const filename = post.mdFilename ?? "auto-" + IdUtil.newID() - const docPath = `${savePath}/${filename}.md` + const filename = post.mdFilename ?? "auto-" + sypIdUtil.newID() + ".md" + const docPath = StrUtil.pathJoin(savePath, filename) this.logger.info("将要最终发送到以下目录 =>", docPath) // 开始发布 - const res = await this.gitlabClient.createRepositoryFile(docPath, post.description) - this.logger.debug("gitlab newPost finished =>", res) + let finalRes: any + try { + const res = await this.gitlabClient.createRepositoryFile(docPath, post.description) + this.logger.debug("gitlab newPost finished =>", res) + if (!res?.file_path) { + throw new Error("Gitlab 调用API异常 =>" + res?.message) + } - if (!res?.file_path) { - throw new Error("Gitlab 调用API异常 =>" + res?.message) + finalRes = res + } catch (e) { + // 失败之后尝试删除旧数据再发一次 + try { + await this.deletePost(docPath) + } catch (e) { + this.logger.warn("尝试删除失败,忽略", e) + } + const res2 = await this.gitlabClient.createRepositoryFile(docPath, post.description) + if (!res2?.file_path) { + throw new Error("重发依旧失败,Gitlab 调用API异常 =>" + res2?.message) + } + + finalRes = res2 } - return res.file_path + + return finalRes.file_path } public async getPost(postid: string, useSlug?: boolean): Promise { @@ -162,10 +197,6 @@ class CommonGitlabApiAdaptor extends BaseBlogApi { return true } - public async getCategories(): Promise { - return Promise.resolve([]) - } - public async getCategoryTreeNodes(docPath: string): Promise { const res = await this.gitlabClient.getRepositoryTree(docPath) return res @@ -180,19 +211,30 @@ class CommonGitlabApiAdaptor extends BaseBlogApi { .replace("[branch]", cfg.githubBranch) .replace("[docpath]", postid) // 路径组合 - previewUrl = StrUtil.pathJoin(this.cfg.home, previewUrl) + // previewUrl = StrUtil.pathJoin(this.cfg.home, previewUrl) return previewUrl } public async getPostPreviewUrl(postid: string): Promise { let previewUrl: string const newPostid = postid.substring(postid.lastIndexOf("/") + 1).replace(".md", "") - previewUrl = this.cfg.previewUrl.replace("[postid]", newPostid) + previewUrl = this.cfg.previewPostUrl.replace("[postid]", newPostid) // 路径组合 - previewUrl = StrUtil.pathJoin(StrUtil.pathJoin(this.cfg.home, this.cfg.username), previewUrl) + // previewUrl = StrUtil.pathJoin(this.cfg.postHome, previewUrl) return previewUrl } + + // ================ + // private methods + // ================ + private async safeDeletePost(postid: string): Promise { + try { + await this.gitlabClient.deleteRepositoryFile(postid) + } catch (e) {} + + return true + } } export { CommonGitlabApiAdaptor } diff --git a/src/adaptors/api/base/metaweblog/metaweblogBlogApiAdaptor.ts b/src/adaptors/api/base/metaweblog/metaweblogBlogApiAdaptor.ts index badb9f5..40b7446 100644 --- a/src/adaptors/api/base/metaweblog/metaweblogBlogApiAdaptor.ts +++ b/src/adaptors/api/base/metaweblog/metaweblogBlogApiAdaptor.ts @@ -57,6 +57,10 @@ class MetaweblogBlogApiAdaptor extends BaseBlogApi { this.proxyXmlrpc = proxyXmlrpc } + public async checkAuth(): Promise { + return true + } + public override async getUsersBlogs(): Promise> { let result: UserBlog[] = [] result = await this.metaweblogCall(MetaweblogConstants.METHOD_GET_USERS_BLOGS, [ @@ -183,7 +187,8 @@ class MetaweblogBlogApiAdaptor extends BaseBlogApi { public async getPreviewUrl(postid: string): Promise { const previewUrl = this.cfg.previewUrl.replace(/\[postid\]/g, postid) - return StrUtil.pathJoin(this.cfg.home ?? "", previewUrl) + // return StrUtil.pathJoin(this.cfg.home ?? "", previewUrl) + return previewUrl } public async getCategories(): Promise { diff --git a/src/adaptors/api/base/metaweblog/metaweblogConfig.ts b/src/adaptors/api/base/metaweblog/metaweblogConfig.ts index 6dca19c..c2a209a 100644 --- a/src/adaptors/api/base/metaweblog/metaweblogConfig.ts +++ b/src/adaptors/api/base/metaweblog/metaweblogConfig.ts @@ -112,7 +112,5 @@ export class MetaweblogConfig extends CommonBlogConfig { this.categoryType = CategoryTypeEnum.CategoryType_Multi this.allowCateChange = true this.knowledgeSpaceEnabled = false - this.useMdFilename = false - this.usePathCategory = false } } diff --git a/src/adaptors/api/cnblogs/cnblogsApiAdaptor.ts b/src/adaptors/api/cnblogs/cnblogsApiAdaptor.ts index cea99f3..9883d5a 100644 --- a/src/adaptors/api/cnblogs/cnblogsApiAdaptor.ts +++ b/src/adaptors/api/cnblogs/cnblogsApiAdaptor.ts @@ -124,6 +124,16 @@ class CnblogsApiAdaptor extends MetaweblogBlogApiAdaptor { return result } + public async getPreviewUrl(postid: string): Promise { + const userid = this.cfg.apiUrl ? this.cfg.apiUrl.match(/[^/]+$/)?.[0] ?? "" : "" + const previewUrl = this.cfg.previewUrl.replace(/\[userid]/g, userid).replace(/\[postid]/g, postid) + // return StrUtil.pathJoin(this.cfg.home ?? "", previewUrl) + return previewUrl + } + + // ================ + // private methods + // ================ private assignMdCategory(post: Post) { const cates = post.categories ?? [] if (!cates.some((cate) => cate.toLowerCase() === this.MD_CATEGORY.toLowerCase())) { diff --git a/src/adaptors/api/cnblogs/cnblogsConfig.ts b/src/adaptors/api/cnblogs/cnblogsConfig.ts index fa605e8..41545a5 100644 --- a/src/adaptors/api/cnblogs/cnblogsConfig.ts +++ b/src/adaptors/api/cnblogs/cnblogsConfig.ts @@ -42,10 +42,10 @@ class CnblogsConfig extends MetaweblogConfig { * @param middlewareUrl 代理地址 */ constructor(apiUrl: string, username: string, password: string, middlewareUrl?: string) { - super("https://www.cnblogs.com/[your-blog-name]", apiUrl, username, password, middlewareUrl) + super("https://www.cnblogs.com/", apiUrl, username, password, middlewareUrl) this.tokenSettingUrl = "https://i.cnblogs.com/settings" - this.previewUrl = "/p/[postid].html" + this.previewUrl = "/[userid]/p/[postid].html" this.pageType = PageTypeEnum.Markdown this.usernameEnabled = true this.passwordType = PasswordType.PasswordType_Token diff --git a/src/adaptors/api/cnblogs/useCnblogsApi.ts b/src/adaptors/api/cnblogs/useCnblogsApi.ts index 2d4e15e..51219d5 100644 --- a/src/adaptors/api/cnblogs/useCnblogsApi.ts +++ b/src/adaptors/api/cnblogs/useCnblogsApi.ts @@ -28,10 +28,11 @@ import { Utils } from "~/src/utils/utils.ts" import { CnblogsConfig } from "~/src/adaptors/api/cnblogs/cnblogsConfig.ts" import { CnblogsApiAdaptor } from "~/src/adaptors/api/cnblogs/cnblogsApiAdaptor.ts" import { PublisherAppInstance } from "~/src/publisherAppInstance.ts" -import { useSettingStore } from "~/src/stores/useSettingStore.ts" +import { usePublishSettingStore } from "~/src/stores/usePublishSettingStore.ts" import { JsonUtil, ObjectUtil, StrUtil } from "zhi-common" import { getDynPostidKey } from "~/src/platforms/dynamicConfig.ts" import { CategoryTypeEnum } from "zhi-blog-api" +import { LEGENCY_SHARED_PROXT_MIDDLEWARE } from "~/src/utils/constants.ts" /** * 使用Cnblogs API的自定义hook @@ -58,7 +59,7 @@ export const useCnblogsApi = async (key?: string, newCfg?: CnblogsConfig) => { cfg = newCfg } else { // 从配置中获取数据 - const { getSetting } = useSettingStore() + const { getSetting } = usePublishSettingStore() const setting = await getSetting() cfg = JsonUtil.safeParse(setting[key], {} as CnblogsConfig) // 如果配置为空,则使用默认的环境变量值,并记录日志 @@ -70,10 +71,7 @@ export const useCnblogsApi = async (key?: string, newCfg?: CnblogsConfig) => { ) const cnblogsUsername = Utils.emptyOrDefault(process.env.VITE_CNBLOGS_USERNAME, "") const cnblogsAuthToken = Utils.emptyOrDefault(process.env.VITE_CNBLOGS_AUTH_TOKEN, "") - const middlewareUrl = Utils.emptyOrDefault( - process.env.VITE_MIDDLEWARE_URL, - "https://api.terwer.space/api/middleware" - ) + const middlewareUrl = Utils.emptyOrDefault(process.env.VITE_MIDDLEWARE_URL, LEGENCY_SHARED_PROXT_MIDDLEWARE) cfg = new CnblogsConfig(cnblogsApiUrl, cnblogsUsername, cnblogsAuthToken, middlewareUrl) logger.debug("Configuration is empty, using default environment variables.") diff --git a/src/adaptors/api/docsify/docsifyConfig.ts b/src/adaptors/api/docsify/docsifyConfig.ts new file mode 100644 index 0000000..041f972 --- /dev/null +++ b/src/adaptors/api/docsify/docsifyConfig.ts @@ -0,0 +1,58 @@ +/* + * 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 { CommonGithubConfig } from "~/src/adaptors/api/base/github/commonGithubConfig.ts" +import { CategoryTypeEnum, PageTypeEnum, PasswordType } from "zhi-blog-api" + +/** + * Docsify 配置 + */ +class DocsifyConfig extends CommonGithubConfig { + constructor( + githubUsername: string, + githubAuthToken: string, + githubRepo: string, + githubBranch: string, + middlewareUrl?: string + ) { + super(githubUsername, githubAuthToken, githubRepo, githubBranch, middlewareUrl) + + // 修改 Docsify 配置特有的属性 + this.previewUrl = "/[user]/[repo]/blob/[branch]/[docpath]" + this.pageType = PageTypeEnum.Markdown + this.passwordType = PasswordType.PasswordType_Token + this.allowPreviewUrlChange = false + this.tagEnabled = true + this.cateEnabled = true + this.allowCateChange = true + this.categoryType = CategoryTypeEnum.CategoryType_Multi + this.knowledgeSpaceEnabled = true + this.allowKnowledgeSpaceChange = false + this.placeholder.knowledgeSpaceReadonlyModeTip = "Docsify 平台暂不支持修改发布目录,如需修改,请删除之后重新发布" + this.knowledgeSpaceType = CategoryTypeEnum.CategoryType_Tree_Single + } +} + +export { DocsifyConfig } diff --git a/src/adaptors/api/gitlab-antora/gitlabantoraConfig.ts b/src/adaptors/api/gitlab-antora/gitlabantoraConfig.ts new file mode 100644 index 0000000..21e148b --- /dev/null +++ b/src/adaptors/api/gitlab-antora/gitlabantoraConfig.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 { CategoryTypeEnum, PageTypeEnum, PasswordType } from "zhi-blog-api" +import { HexoConfig } from "~/src/adaptors/api/hexo/hexoConfig.ts" + +/** + * Gitlab Antora 配置 + */ +class GitlabantoraConfig extends HexoConfig { + constructor( + githubUsername: string, + githubAuthToken: string, + githubRepo: string, + githubBranch: string, + middlewareUrl?: string + ) { + super(githubUsername, githubAuthToken, githubRepo, githubBranch, middlewareUrl) + + // 设置Gitlab Antora的预览URL,使用文档ID作为文档预览的URL参数 + this.previewUrl = "/docs/[docid]" + // 设置页面类型为Markdown或其他适用的类型 + this.pageType = PageTypeEnum.Markdown + // 设置密码类型,使用Gitlab令牌来管理密码 + this.passwordType = PasswordType.PasswordType_Token + // 是否启用标签 + this.tagEnabled = true + // 是否启用分类 + this.cateEnabled = true + // 是否启用知识空间 + this.knowledgeSpaceEnabled = true + // Gitlab Antora的主页URL + this.home = "[your-gitlab-antora-home]" + // Gitlab Antora的API URL + this.apiUrl = "[your-gitlab-antora-api-url]" + // Gitlab Antora令牌设置URL + this.tokenSettingUrl = "[your-gitlab-antora-host]/-/profile/personal_access_tokens" + // 是否显示令牌提示 + this.showTokenTip = true + // 设置默认发布路径 + this.defaultPath = "source/_posts" + // 设置知识空间只读模式的提示 + this.placeholder.knowledgeSpaceReadonlyModeTip = + "Gitlab Antora 平台暂不支持修改发布目录,如需修改,请删除之后重新发布" + // 知识空间的类型,可以根据实际情况选择 + this.knowledgeSpaceType = CategoryTypeEnum.CategoryType_Tree_Single + } +} + +export { GitlabantoraConfig } diff --git a/src/adaptors/api/gitlab-docsify/GitlabdocsifyConfig.ts b/src/adaptors/api/gitlab-docsify/GitlabdocsifyConfig.ts new file mode 100644 index 0000000..c6b91f9 --- /dev/null +++ b/src/adaptors/api/gitlab-docsify/GitlabdocsifyConfig.ts @@ -0,0 +1,65 @@ +/* + * 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 { CategoryTypeEnum, PageTypeEnum, PasswordType } from "zhi-blog-api" +import { CommonGithubConfig } from "~/src/adaptors/api/base/github/commonGithubConfig.ts" + +/** + * Gitlab Docsify 配置 + */ +class GitlabdocsifyConfig extends CommonGithubConfig { + constructor( + githubUsername: string, + githubAuthToken: string, + githubRepo: string, + githubBranch: string, + middlewareUrl?: string + ) { + super(githubUsername, githubAuthToken, githubRepo, githubBranch, middlewareUrl) + + this.home = "[your-gitlab-home]" + this.apiUrl = "[your-gitlab-api-url]" + this.tokenSettingUrl = "[your-gitlab-host]/-/profile/personal_access_tokens" + this.showTokenTip = true + this.defaultPath = "source/_posts" + this.previewUrl = "/[user]/[repo]/blob/[branch]/[docpath]" + this.previewPostUrl = "/post/[postid].html" + this.mdFilenameRule = "[slug].md" + this.pageType = PageTypeEnum.Markdown + this.passwordType = PasswordType.PasswordType_Token + this.allowPreviewUrlChange = false + this.tagEnabled = true + this.cateEnabled = true + this.allowCateChange = true + this.categoryType = CategoryTypeEnum.CategoryType_Multi + this.knowledgeSpaceEnabled = true + this.allowKnowledgeSpaceChange = false + this.placeholder.knowledgeSpaceReadonlyModeTip = + "Gitlab Docsify 平台暂不支持修改发布目录,如需修改,请删除之后重新发布" + this.knowledgeSpaceType = CategoryTypeEnum.CategoryType_Tree_Single + } +} + +export { GitlabdocsifyConfig } diff --git a/src/adaptors/api/gitlab-hexo/gitlabhexoApiAdaptor.ts b/src/adaptors/api/gitlab-hexo/gitlabhexoApiAdaptor.ts index 7c57c47..47b2b49 100644 --- a/src/adaptors/api/gitlab-hexo/gitlabhexoApiAdaptor.ts +++ b/src/adaptors/api/gitlab-hexo/gitlabhexoApiAdaptor.ts @@ -26,8 +26,8 @@ import { BlogConfig, PageTypeEnum, Post, YamlConvertAdaptor } from "zhi-blog-api" import { GitlabhexoYamlConverterAdaptor } from "~/src/adaptors/api/gitlab-hexo/gitlabhexoYamlConverterAdaptor.ts" import { CommonGitlabApiAdaptor } from "~/src/adaptors/api/base/gitlab/commonGitlabApiAdaptor.ts" -import _ from "lodash" -import {YamlUtil} from "zhi-common"; +import _ from "lodash-es" +import { YamlUtil } from "zhi-common" /** * Gitlabhexo API 适配器 diff --git a/src/adaptors/api/gitlab-hexo/gitlabhexoConfig.ts b/src/adaptors/api/gitlab-hexo/gitlabhexoConfig.ts index 04cfee4..2d17aec 100644 --- a/src/adaptors/api/gitlab-hexo/gitlabhexoConfig.ts +++ b/src/adaptors/api/gitlab-hexo/gitlabhexoConfig.ts @@ -61,8 +61,6 @@ class GitlabhexoConfig extends HexoConfig { this.allowKnowledgeSpaceChange = false this.placeholder.knowledgeSpaceReadonlyModeTip = "Githubhexo 平台暂不支持修改发布目录,如需修改,请删除之后重新发布" this.knowledgeSpaceType = CategoryTypeEnum.CategoryType_Tree_Single - this.useMdFilename = false - this.usePathCategory = false } } diff --git a/src/adaptors/api/gitlab-hexo/gitlabhexoPlaceHolder.ts b/src/adaptors/api/gitlab-hexo/gitlabhexoPlaceHolder.ts index 04e077f..1428ed8 100644 --- a/src/adaptors/api/gitlab-hexo/gitlabhexoPlaceHolder.ts +++ b/src/adaptors/api/gitlab-hexo/gitlabhexoPlaceHolder.ts @@ -23,8 +23,8 @@ * questions. */ -import { HexoPlaceHolder } from "~/src/adaptors/api/hexo/hexoPlaceHolder.ts" +import { HexoPlaceholder } from "~/src/adaptors/api/hexo/hexoPlaceholder.ts" -class GitlabhexoPlaceHolder extends HexoPlaceHolder {} +class GitlabhexoPlaceholder extends HexoPlaceholder {} -export { GitlabhexoPlaceHolder } \ No newline at end of file +export { GitlabhexoPlaceholder } \ No newline at end of file diff --git a/src/adaptors/api/gitlab-hexo/useGitlabhexoApi.ts b/src/adaptors/api/gitlab-hexo/useGitlabhexoApi.ts index aba1c7f..38e52e2 100644 --- a/src/adaptors/api/gitlab-hexo/useGitlabhexoApi.ts +++ b/src/adaptors/api/gitlab-hexo/useGitlabhexoApi.ts @@ -25,7 +25,7 @@ import { createAppLogger } from "~/src/utils/appLogger.ts" import { PublisherAppInstance } from "~/src/publisherAppInstance.ts" -import { useSettingStore } from "~/src/stores/useSettingStore.ts" +import { usePublishSettingStore } from "~/src/stores/usePublishSettingStore.ts" import { JsonUtil, ObjectUtil, StrUtil } from "zhi-common" import { Utils } from "~/src/utils/utils.ts" import { getDynPostidKey } from "~/src/platforms/dynamicConfig.ts" @@ -33,6 +33,7 @@ import { CategoryTypeEnum } from "zhi-blog-api" import { GitlabhexoConfig } from "~/src/adaptors/api/gitlab-hexo/gitlabhexoConfig.ts" import { GitlabhexoYamlConverterAdaptor } from "~/src/adaptors/api/gitlab-hexo/gitlabhexoYamlConverterAdaptor.ts" import { GitlabhexoApiAdaptor } from "~/src/adaptors/api/gitlab-hexo/gitlabhexoApiAdaptor.ts" +import { LEGENCY_SHARED_PROXT_MIDDLEWARE } from "~/src/utils/constants.ts" const useGitlabhexoApi = async (key: string, newCfg?: GitlabhexoConfig) => { // 创建应用日志记录器 @@ -50,7 +51,7 @@ const useGitlabhexoApi = async (key: string, newCfg?: GitlabhexoConfig) => { cfg = newCfg } else { // 从配置中获取数据 - const { getSetting } = useSettingStore() + const { getSetting } = usePublishSettingStore() const setting = await getSetting() cfg = JsonUtil.safeParse(setting[key], {} as GitlabhexoConfig) @@ -61,10 +62,7 @@ const useGitlabhexoApi = async (key: string, newCfg?: GitlabhexoConfig) => { const githubAuthToken = Utils.emptyOrDefault(process.env.VITE_GITLAB_AUTH_TOKEN, "") const githubRepo = Utils.emptyOrDefault(process.env.VITE_GITLAB_REPO, "") const githubBranch = Utils.emptyOrDefault(process.env.VITE_GITLAB_BRANCH, "main") - const middlewareUrl = Utils.emptyOrDefault( - process.env.VITE_MIDDLEWARE_URL, - "https://api.terwer.space/api/middleware" - ) + const middlewareUrl = Utils.emptyOrDefault(process.env.VITE_MIDDLEWARE_URL, LEGENCY_SHARED_PROXT_MIDDLEWARE) cfg = new GitlabhexoConfig(githubUsername, githubAuthToken, githubRepo, githubBranch, middlewareUrl) logger.info("Configuration is empty, using default environment variables.") } else { @@ -79,8 +77,6 @@ const useGitlabhexoApi = async (key: string, newCfg?: GitlabhexoConfig) => { // 文件规则 cfg.mdFilenameRule = "[slug].md" - cfg.useMdFilename = false - cfg.usePathCategory = false // 标签 cfg.tagEnabled = true // 分类 diff --git a/src/adaptors/api/gitlab-hugo/gitlabhugoApiAdaptor.ts b/src/adaptors/api/gitlab-hugo/gitlabhugoApiAdaptor.ts index 9b73ab2..72fb1d6 100644 --- a/src/adaptors/api/gitlab-hugo/gitlabhugoApiAdaptor.ts +++ b/src/adaptors/api/gitlab-hugo/gitlabhugoApiAdaptor.ts @@ -25,7 +25,7 @@ import { BlogConfig, PageTypeEnum, Post, YamlConvertAdaptor } from "zhi-blog-api" import { CommonGitlabApiAdaptor } from "~/src/adaptors/api/base/gitlab/commonGitlabApiAdaptor.ts" -import _ from "lodash" +import _ from "lodash-es" import { GitlabhugoYamlConverterAdaptor } from "~/src/adaptors/api/gitlab-hugo/gitlabhugoYamlConverterAdaptor.ts" import { YamlUtil } from "zhi-common" @@ -45,7 +45,7 @@ class GitlabhugoApiAdaptor extends CommonGitlabApiAdaptor { // 公共的属性预处理 const doc = await super.preEditPost(post, id, publishCfg) - // HEXO 自带的处理 + // HUGO 自带的处理 const cfg: BlogConfig = publishCfg?.cfg const updatedPost = _.cloneDeep(doc) as Post diff --git a/src/adaptors/api/gitlab-hugo/gitlabhugoConfig.ts b/src/adaptors/api/gitlab-hugo/gitlabhugoConfig.ts index 7de554f..e0cdded 100644 --- a/src/adaptors/api/gitlab-hugo/gitlabhugoConfig.ts +++ b/src/adaptors/api/gitlab-hugo/gitlabhugoConfig.ts @@ -61,8 +61,6 @@ class GitlabhugoConfig extends HugoConfig { this.allowKnowledgeSpaceChange = false this.placeholder.knowledgeSpaceReadonlyModeTip = "Githubhugo 平台暂不支持修改发布目录,如需修改,请删除之后重新发布" this.knowledgeSpaceType = CategoryTypeEnum.CategoryType_Tree_Single - this.useMdFilename = false - this.usePathCategory = false } } diff --git a/src/adaptors/api/gitlab-hugo/gitlabhugoPlaceHolder.ts b/src/adaptors/api/gitlab-hugo/gitlabhugoPlaceHolder.ts index 3697a99..dd50d0c 100644 --- a/src/adaptors/api/gitlab-hugo/gitlabhugoPlaceHolder.ts +++ b/src/adaptors/api/gitlab-hugo/gitlabhugoPlaceHolder.ts @@ -23,8 +23,8 @@ * questions. */ -import { HugoPlaceHolder } from "~/src/adaptors/api/hugo/hugoPlaceHolder.ts" +import { HugoPlaceholder } from "~/src/adaptors/api/hugo/hugoPlaceholder.ts" -class GitlabhugoPlaceHolder extends HugoPlaceHolder {} +class GitlabhugoPlaceholder extends HugoPlaceholder {} -export { GitlabhugoPlaceHolder } +export { GitlabhugoPlaceholder } diff --git a/src/adaptors/api/gitlab-hugo/useGitlabhugoApi.ts b/src/adaptors/api/gitlab-hugo/useGitlabhugoApi.ts index 8612834..0fe416a 100644 --- a/src/adaptors/api/gitlab-hugo/useGitlabhugoApi.ts +++ b/src/adaptors/api/gitlab-hugo/useGitlabhugoApi.ts @@ -25,7 +25,7 @@ import { createAppLogger } from "~/src/utils/appLogger.ts" import { PublisherAppInstance } from "~/src/publisherAppInstance.ts" -import { useSettingStore } from "~/src/stores/useSettingStore.ts" +import { usePublishSettingStore } from "~/src/stores/usePublishSettingStore.ts" import { JsonUtil, ObjectUtil, StrUtil } from "zhi-common" import { Utils } from "~/src/utils/utils.ts" import { getDynPostidKey } from "~/src/platforms/dynamicConfig.ts" @@ -33,6 +33,7 @@ import { CategoryTypeEnum } from "zhi-blog-api" import { GitlabhugoConfig } from "~/src/adaptors/api/gitlab-hugo/gitlabhugoConfig.ts" import { GitlabhugoYamlConverterAdaptor } from "~/src/adaptors/api/gitlab-hugo/gitlabhugoYamlConverterAdaptor.ts" import { GitlabhugoApiAdaptor } from "~/src/adaptors/api/gitlab-hugo/gitlabhugoApiAdaptor.ts" +import { LEGENCY_SHARED_PROXT_MIDDLEWARE } from "~/src/utils/constants.ts" const useGitlabhugoApi = async (key: string, newCfg?: GitlabhugoConfig) => { // 创建应用日志记录器 @@ -50,7 +51,7 @@ const useGitlabhugoApi = async (key: string, newCfg?: GitlabhugoConfig) => { cfg = newCfg } else { // 从配置中获取数据 - const { getSetting } = useSettingStore() + const { getSetting } = usePublishSettingStore() const setting = await getSetting() cfg = JsonUtil.safeParse(setting[key], {} as GitlabhugoConfig) @@ -61,10 +62,7 @@ const useGitlabhugoApi = async (key: string, newCfg?: GitlabhugoConfig) => { const githubAuthToken = Utils.emptyOrDefault(process.env.VITE_GITLAB_AUTH_TOKEN, "") const githubRepo = Utils.emptyOrDefault(process.env.VITE_GITLAB_REPO, "") const githubBranch = Utils.emptyOrDefault(process.env.VITE_GITLAB_BRANCH, "main") - const middlewareUrl = Utils.emptyOrDefault( - process.env.VITE_MIDDLEWARE_URL, - "https://api.terwer.space/api/middleware" - ) + const middlewareUrl = Utils.emptyOrDefault(process.env.VITE_MIDDLEWARE_URL, LEGENCY_SHARED_PROXT_MIDDLEWARE) cfg = new GitlabhugoConfig(githubUsername, githubAuthToken, githubRepo, githubBranch, middlewareUrl) logger.info("Configuration is empty, using default environment variables.") } else { @@ -79,12 +77,8 @@ const useGitlabhugoApi = async (key: string, newCfg?: GitlabhugoConfig) => { // 文件规则 cfg.mdFilenameRule = "[slug].md" - cfg.useMdFilename = false - cfg.usePathCategory = false // 标签 cfg.tagEnabled = true - cfg.useMdFilename = false - cfg.usePathCategory = false // 分类 cfg.cateEnabled = true cfg.allowCateChange = true diff --git a/src/adaptors/api/gitlab-jekyll/gitlabjekyllApiAdaptor.ts b/src/adaptors/api/gitlab-jekyll/gitlabjekyllApiAdaptor.ts index 14c7a96..8ce8e0c 100644 --- a/src/adaptors/api/gitlab-jekyll/gitlabjekyllApiAdaptor.ts +++ b/src/adaptors/api/gitlab-jekyll/gitlabjekyllApiAdaptor.ts @@ -25,7 +25,7 @@ import { BlogConfig, PageTypeEnum, Post, YamlConvertAdaptor } from "zhi-blog-api" import { CommonGitlabApiAdaptor } from "~/src/adaptors/api/base/gitlab/commonGitlabApiAdaptor.ts" -import _ from "lodash" +import _ from "lodash-es" import { GitlabjekyllYamlConverterAdaptor } from "~/src/adaptors/api/gitlab-jekyll/gitlabjekyllYamlConverterAdaptor.ts" import { YamlUtil } from "zhi-common" @@ -45,7 +45,7 @@ class GitlabjekyllApiAdaptor extends CommonGitlabApiAdaptor { // 公共的属性预处理 const doc = await super.preEditPost(post, id, publishCfg) - // HEXO 自带的处理 + // Jekyll 自带的处理 const cfg: BlogConfig = publishCfg?.cfg const updatedPost = _.cloneDeep(doc) as Post diff --git a/src/adaptors/api/gitlab-jekyll/gitlabjekyllConfig.ts b/src/adaptors/api/gitlab-jekyll/gitlabjekyllConfig.ts index fa1505d..24afa36 100644 --- a/src/adaptors/api/gitlab-jekyll/gitlabjekyllConfig.ts +++ b/src/adaptors/api/gitlab-jekyll/gitlabjekyllConfig.ts @@ -62,8 +62,6 @@ class GitlabjekyllConfig extends JekyllConfig { this.allowKnowledgeSpaceChange = false this.placeholder.knowledgeSpaceReadonlyModeTip = "Gitlabjekyll 平台暂不支持修改发布目录,如需修改,请删除之后重新发布" this.knowledgeSpaceType = CategoryTypeEnum.CategoryType_Tree_Single - this.useMdFilename = false - this.usePathCategory = false } } diff --git a/src/adaptors/api/gitlab-jekyll/gitlabjekyllPlaceHolder.ts b/src/adaptors/api/gitlab-jekyll/gitlabjekyllPlaceHolder.ts index 47a4efb..4164a0a 100644 --- a/src/adaptors/api/gitlab-jekyll/gitlabjekyllPlaceHolder.ts +++ b/src/adaptors/api/gitlab-jekyll/gitlabjekyllPlaceHolder.ts @@ -23,8 +23,8 @@ * questions. */ -import { JekyllPlaceHolder } from "~/src/adaptors/api/jekyll/jekyllPlaceHolder.ts" +import { JekyllPlaceholder } from "~/src/adaptors/api/jekyll/jekyllPlaceholder.ts" -class GitlabjekyllPlaceHolder extends JekyllPlaceHolder {} +class GitlabjekyllPlaceholder extends JekyllPlaceholder {} -export { GitlabjekyllPlaceHolder } +export { GitlabjekyllPlaceholder } diff --git a/src/adaptors/api/gitlab-jekyll/useGitlabjekyllApi.ts b/src/adaptors/api/gitlab-jekyll/useGitlabjekyllApi.ts index c341b97..46a60a4 100644 --- a/src/adaptors/api/gitlab-jekyll/useGitlabjekyllApi.ts +++ b/src/adaptors/api/gitlab-jekyll/useGitlabjekyllApi.ts @@ -25,7 +25,7 @@ import { createAppLogger } from "~/src/utils/appLogger.ts" import { PublisherAppInstance } from "~/src/publisherAppInstance.ts" -import { useSettingStore } from "~/src/stores/useSettingStore.ts" +import { usePublishSettingStore } from "~/src/stores/usePublishSettingStore.ts" import { JsonUtil, ObjectUtil, StrUtil } from "zhi-common" import { Utils } from "~/src/utils/utils.ts" import { getDynPostidKey } from "~/src/platforms/dynamicConfig.ts" @@ -33,6 +33,7 @@ import { CategoryTypeEnum } from "zhi-blog-api" import { GitlabjekyllConfig } from "~/src/adaptors/api/gitlab-jekyll/gitlabjekyllConfig.ts" import { GitlabjekyllYamlConverterAdaptor } from "~/src/adaptors/api/gitlab-jekyll/gitlabjekyllYamlConverterAdaptor.ts" import { GitlabjekyllApiAdaptor } from "~/src/adaptors/api/gitlab-jekyll/gitlabjekyllApiAdaptor.ts" +import { LEGENCY_SHARED_PROXT_MIDDLEWARE } from "~/src/utils/constants.ts" const useGitlabjekyllApi = async (key: string, newCfg?: GitlabjekyllConfig) => { // 创建应用日志记录器 @@ -50,7 +51,7 @@ const useGitlabjekyllApi = async (key: string, newCfg?: GitlabjekyllConfig) => { cfg = newCfg } else { // 从配置中获取数据 - const { getSetting } = useSettingStore() + const { getSetting } = usePublishSettingStore() const setting = await getSetting() cfg = JsonUtil.safeParse(setting[key], {} as GitlabjekyllConfig) @@ -61,10 +62,7 @@ const useGitlabjekyllApi = async (key: string, newCfg?: GitlabjekyllConfig) => { const githubAuthToken = Utils.emptyOrDefault(process.env.VITE_GITLAB_AUTH_TOKEN, "") const githubRepo = Utils.emptyOrDefault(process.env.VITE_GITLAB_REPO, "") const githubBranch = Utils.emptyOrDefault(process.env.VITE_GITLAB_BRANCH, "main") - const middlewareUrl = Utils.emptyOrDefault( - process.env.VITE_MIDDLEWARE_URL, - "https://api.terwer.space/api/middleware" - ) + const middlewareUrl = Utils.emptyOrDefault(process.env.VITE_MIDDLEWARE_URL, LEGENCY_SHARED_PROXT_MIDDLEWARE) cfg = new GitlabjekyllConfig(githubUsername, githubAuthToken, githubRepo, githubBranch, middlewareUrl) logger.info("Configuration is empty, using default environment variables.") } else { @@ -79,8 +77,6 @@ const useGitlabjekyllApi = async (key: string, newCfg?: GitlabjekyllConfig) => { // 文件规则 cfg.mdFilenameRule = "[yyyy]-[mm]-[dd]-[slug].md" - cfg.useMdFilename = false - cfg.usePathCategory = false // 标签 cfg.tagEnabled = true // 分类 diff --git a/src/adaptors/api/gitlab-vitepress/gitlabvitepressApiAdaptor.ts b/src/adaptors/api/gitlab-vitepress/gitlabvitepressApiAdaptor.ts index 519eb0f..6792479 100644 --- a/src/adaptors/api/gitlab-vitepress/gitlabvitepressApiAdaptor.ts +++ b/src/adaptors/api/gitlab-vitepress/gitlabvitepressApiAdaptor.ts @@ -26,7 +26,7 @@ import { BlogConfig, PageTypeEnum, Post, YamlConvertAdaptor } from "zhi-blog-api" import { GitlabvitepressYamlConverterAdaptor } from "~/src/adaptors/api/gitlab-vitepress/gitlabvitepressYamlConverterAdaptor.ts" import { CommonGitlabApiAdaptor } from "~/src/adaptors/api/base/gitlab/commonGitlabApiAdaptor.ts" -import _ from "lodash" +import _ from "lodash-es" import { YamlUtil } from "zhi-common" /** @@ -45,7 +45,7 @@ class GitlabvitepressApiAdaptor extends CommonGitlabApiAdaptor { // 公共的属性预处理 const doc = await super.preEditPost(post, id, publishCfg) - // HEXO 自带的处理 + // Vitepress 自带的处理 const cfg: BlogConfig = publishCfg?.cfg const updatedPost = _.cloneDeep(doc) as Post diff --git a/src/adaptors/api/gitlab-vitepress/gitlabvitepressConfig.ts b/src/adaptors/api/gitlab-vitepress/gitlabvitepressConfig.ts index 778b3f9..f29f324 100644 --- a/src/adaptors/api/gitlab-vitepress/gitlabvitepressConfig.ts +++ b/src/adaptors/api/gitlab-vitepress/gitlabvitepressConfig.ts @@ -61,8 +61,6 @@ class GitlabvitepressConfig extends VitepressConfig { this.allowKnowledgeSpaceChange = false this.placeholder.knowledgeSpaceReadonlyModeTip = "Gitlabvitepress 平台暂不支持修改发布目录,如需修改,请删除之后重新发布" this.knowledgeSpaceType = CategoryTypeEnum.CategoryType_Tree_Single - this.useMdFilename = false - this.usePathCategory = false } } diff --git a/src/adaptors/api/gitlab-vitepress/gitlabvitepressPlaceHolder.ts b/src/adaptors/api/gitlab-vitepress/gitlabvitepressPlaceHolder.ts index a51b8d0..ec4729c 100644 --- a/src/adaptors/api/gitlab-vitepress/gitlabvitepressPlaceHolder.ts +++ b/src/adaptors/api/gitlab-vitepress/gitlabvitepressPlaceHolder.ts @@ -23,8 +23,8 @@ * questions. */ -import { VitepressPlaceHolder } from "~/src/adaptors/api/vitepress/vitepressPlaceHolder.ts" +import { VitepressPlaceholder } from "~/src/adaptors/api/vitepress/vitepressPlaceholder.ts" -class GitlabvitepressPlaceHolder extends VitepressPlaceHolder {} +class GitlabvitepressPlaceholder extends VitepressPlaceholder {} -export { GitlabvitepressPlaceHolder } +export { GitlabvitepressPlaceholder } diff --git a/src/adaptors/api/gitlab-vitepress/useGitlabvitepressApi.ts b/src/adaptors/api/gitlab-vitepress/useGitlabvitepressApi.ts index 86ad365..3313998 100644 --- a/src/adaptors/api/gitlab-vitepress/useGitlabvitepressApi.ts +++ b/src/adaptors/api/gitlab-vitepress/useGitlabvitepressApi.ts @@ -25,7 +25,7 @@ import { createAppLogger } from "~/src/utils/appLogger.ts" import { PublisherAppInstance } from "~/src/publisherAppInstance.ts" -import { useSettingStore } from "~/src/stores/useSettingStore.ts" +import { usePublishSettingStore } from "~/src/stores/usePublishSettingStore.ts" import { JsonUtil, ObjectUtil, StrUtil } from "zhi-common" import { Utils } from "~/src/utils/utils.ts" import { getDynPostidKey } from "~/src/platforms/dynamicConfig.ts" @@ -33,6 +33,7 @@ import { CategoryTypeEnum } from "zhi-blog-api" import { GitlabvitepressConfig } from "~/src/adaptors/api/gitlab-vitepress/gitlabvitepressConfig.ts" import { GitlabvitepressYamlConverterAdaptor } from "~/src/adaptors/api/gitlab-vitepress/gitlabvitepressYamlConverterAdaptor.ts" import { GitlabvitepressApiAdaptor } from "~/src/adaptors/api/gitlab-vitepress/gitlabvitepressApiAdaptor.ts" +import { LEGENCY_SHARED_PROXT_MIDDLEWARE } from "~/src/utils/constants.ts" const useGitlabvitepressApi = async (key: string, newCfg?: GitlabvitepressConfig) => { // 创建应用日志记录器 @@ -50,7 +51,7 @@ const useGitlabvitepressApi = async (key: string, newCfg?: GitlabvitepressConfig cfg = newCfg } else { // 从配置中获取数据 - const { getSetting } = useSettingStore() + const { getSetting } = usePublishSettingStore() const setting = await getSetting() cfg = JsonUtil.safeParse(setting[key], {} as GitlabvitepressConfig) @@ -61,10 +62,7 @@ const useGitlabvitepressApi = async (key: string, newCfg?: GitlabvitepressConfig const githubAuthToken = Utils.emptyOrDefault(process.env.VITE_GITLAB_AUTH_TOKEN, "") const githubRepo = Utils.emptyOrDefault(process.env.VITE_GITLAB_REPO, "") const githubBranch = Utils.emptyOrDefault(process.env.VITE_GITLAB_BRANCH, "main") - const middlewareUrl = Utils.emptyOrDefault( - process.env.VITE_MIDDLEWARE_URL, - "https://api.terwer.space/api/middleware" - ) + const middlewareUrl = Utils.emptyOrDefault(process.env.VITE_MIDDLEWARE_URL, LEGENCY_SHARED_PROXT_MIDDLEWARE) cfg = new GitlabvitepressConfig(githubUsername, githubAuthToken, githubRepo, githubBranch, middlewareUrl) logger.info("Configuration is empty, using default environment variables.") } else { @@ -79,8 +77,6 @@ const useGitlabvitepressApi = async (key: string, newCfg?: GitlabvitepressConfig // 文件规则 cfg.mdFilenameRule = "[slug].md" - cfg.useMdFilename = false - cfg.usePathCategory = false // 标签 cfg.tagEnabled = true // 分类 diff --git a/src/adaptors/api/gitlab-vuepress/gitlabvuepressApiAdaptor.ts b/src/adaptors/api/gitlab-vuepress/gitlabvuepressApiAdaptor.ts index 040f05c..2cbc322 100644 --- a/src/adaptors/api/gitlab-vuepress/gitlabvuepressApiAdaptor.ts +++ b/src/adaptors/api/gitlab-vuepress/gitlabvuepressApiAdaptor.ts @@ -25,7 +25,7 @@ import { BlogConfig, PageTypeEnum, Post, YamlConvertAdaptor } from "zhi-blog-api" import { CommonGitlabApiAdaptor } from "~/src/adaptors/api/base/gitlab/commonGitlabApiAdaptor.ts" -import _ from "lodash" +import _ from "lodash-es" import { GitlabvuepressYamlConverterAdaptor } from "~/src/adaptors/api/gitlab-vuepress/gitlabvuepressYamlConverterAdaptor.ts" import { YamlUtil } from "zhi-common" @@ -45,7 +45,7 @@ class GitlabvuepressApiAdaptor extends CommonGitlabApiAdaptor { // 公共的属性预处理 const doc = await super.preEditPost(post, id, publishCfg) - // HEXO 自带的处理 + // Vuepress 自带的处理 const cfg: BlogConfig = publishCfg?.cfg const updatedPost = _.cloneDeep(doc) as Post diff --git a/src/adaptors/api/gitlab-vuepress/gitlabvuepressConfig.ts b/src/adaptors/api/gitlab-vuepress/gitlabvuepressConfig.ts index 9f6c002..8101a25 100644 --- a/src/adaptors/api/gitlab-vuepress/gitlabvuepressConfig.ts +++ b/src/adaptors/api/gitlab-vuepress/gitlabvuepressConfig.ts @@ -61,8 +61,6 @@ class GitlabvuepressConfig extends VuepressConfig { this.allowKnowledgeSpaceChange = false this.placeholder.knowledgeSpaceReadonlyModeTip = "Gitlabvuepress 平台暂不支持修改发布目录,如需修改,请删除之后重新发布" this.knowledgeSpaceType = CategoryTypeEnum.CategoryType_Tree_Single - this.useMdFilename = true - this.usePathCategory = true } } diff --git a/src/adaptors/api/gitlab-vuepress/gitlabvuepressPlaceHolder.ts b/src/adaptors/api/gitlab-vuepress/gitlabvuepressPlaceHolder.ts index 21403e1..75709e4 100644 --- a/src/adaptors/api/gitlab-vuepress/gitlabvuepressPlaceHolder.ts +++ b/src/adaptors/api/gitlab-vuepress/gitlabvuepressPlaceHolder.ts @@ -23,8 +23,8 @@ * questions. */ -import { VuepressPlaceHolder } from "~/src/adaptors/api/vuepress/vuepressPlaceHolder.ts" +import { VuepressPlaceholder } from "~/src/adaptors/api/vuepress/vuepressPlaceholder.ts" -class GitlabvuepressPlaceHolder extends VuepressPlaceHolder {} +class GitlabvuepressPlaceholder extends VuepressPlaceholder {} -export { GitlabvuepressPlaceHolder } +export { GitlabvuepressPlaceholder } diff --git a/src/adaptors/api/gitlab-vuepress/useGitlabvuepressApi.ts b/src/adaptors/api/gitlab-vuepress/useGitlabvuepressApi.ts index 11b8b25..e29da1a 100644 --- a/src/adaptors/api/gitlab-vuepress/useGitlabvuepressApi.ts +++ b/src/adaptors/api/gitlab-vuepress/useGitlabvuepressApi.ts @@ -25,7 +25,7 @@ import { createAppLogger } from "~/src/utils/appLogger.ts" import { PublisherAppInstance } from "~/src/publisherAppInstance.ts" -import { useSettingStore } from "~/src/stores/useSettingStore.ts" +import { usePublishSettingStore } from "~/src/stores/usePublishSettingStore.ts" import { JsonUtil, ObjectUtil, StrUtil } from "zhi-common" import { Utils } from "~/src/utils/utils.ts" import { getDynPostidKey } from "~/src/platforms/dynamicConfig.ts" @@ -33,6 +33,7 @@ import { CategoryTypeEnum } from "zhi-blog-api" import { GitlabvuepressConfig } from "~/src/adaptors/api/gitlab-vuepress/gitlabvuepressConfig.ts" import { GitlabvuepressYamlConverterAdaptor } from "~/src/adaptors/api/gitlab-vuepress/gitlabvuepressYamlConverterAdaptor.ts" import { GitlabvuepressApiAdaptor } from "~/src/adaptors/api/gitlab-vuepress/gitlabvuepressApiAdaptor.ts" +import { LEGENCY_SHARED_PROXT_MIDDLEWARE } from "~/src/utils/constants.ts" const useGitlabvuepressApi = async (key: string, newCfg?: GitlabvuepressConfig) => { // 创建应用日志记录器 @@ -50,7 +51,7 @@ const useGitlabvuepressApi = async (key: string, newCfg?: GitlabvuepressConfig) cfg = newCfg } else { // 从配置中获取数据 - const { getSetting } = useSettingStore() + const { getSetting } = usePublishSettingStore() const setting = await getSetting() cfg = JsonUtil.safeParse(setting[key], {} as GitlabvuepressConfig) @@ -61,10 +62,7 @@ const useGitlabvuepressApi = async (key: string, newCfg?: GitlabvuepressConfig) const githubAuthToken = Utils.emptyOrDefault(process.env.VITE_GITLAB_AUTH_TOKEN, "") const githubRepo = Utils.emptyOrDefault(process.env.VITE_GITLAB_REPO, "") const githubBranch = Utils.emptyOrDefault(process.env.VITE_GITLAB_BRANCH, "main") - const middlewareUrl = Utils.emptyOrDefault( - process.env.VITE_MIDDLEWARE_URL, - "https://api.terwer.space/api/middleware" - ) + const middlewareUrl = Utils.emptyOrDefault(process.env.VITE_MIDDLEWARE_URL, LEGENCY_SHARED_PROXT_MIDDLEWARE) cfg = new GitlabvuepressConfig(githubUsername, githubAuthToken, githubRepo, githubBranch, middlewareUrl) logger.info("Configuration is empty, using default environment variables.") } else { @@ -79,8 +77,6 @@ const useGitlabvuepressApi = async (key: string, newCfg?: GitlabvuepressConfig) // 文件规则 cfg.mdFilenameRule = "[filename].md" - cfg.useMdFilename = true - cfg.usePathCategory = true // 标签 cfg.tagEnabled = true // 分类 diff --git a/src/adaptors/api/gitlab-vuepress2/gitlabvuepress2ApiAdaptor.ts b/src/adaptors/api/gitlab-vuepress2/gitlabvuepress2ApiAdaptor.ts index 25faf0e..c5ad015 100644 --- a/src/adaptors/api/gitlab-vuepress2/gitlabvuepress2ApiAdaptor.ts +++ b/src/adaptors/api/gitlab-vuepress2/gitlabvuepress2ApiAdaptor.ts @@ -26,7 +26,7 @@ import { BlogConfig, PageTypeEnum, Post, YamlConvertAdaptor } from "zhi-blog-api" import { Gitlabvuepress2YamlConverterAdaptor } from "~/src/adaptors/api/gitlab-vuepress2/gitlabvuepress2YamlConverterAdaptor.ts" import { CommonGitlabApiAdaptor } from "~/src/adaptors/api/base/gitlab/commonGitlabApiAdaptor.ts" -import _ from "lodash" +import _ from "lodash-es" import { YamlUtil } from "zhi-common" /** @@ -45,7 +45,7 @@ class Gitlabvuepress2ApiAdaptor extends CommonGitlabApiAdaptor { // 公共的属性预处理 const doc = await super.preEditPost(post, id, publishCfg) - // HEXO 自带的处理 + // Vuepress2 自带的处理 const cfg: BlogConfig = publishCfg?.cfg const updatedPost = _.cloneDeep(doc) as Post diff --git a/src/adaptors/api/gitlab-vuepress2/gitlabvuepress2Config.ts b/src/adaptors/api/gitlab-vuepress2/gitlabvuepress2Config.ts index d832cc2..eaf6803 100644 --- a/src/adaptors/api/gitlab-vuepress2/gitlabvuepress2Config.ts +++ b/src/adaptors/api/gitlab-vuepress2/gitlabvuepress2Config.ts @@ -61,8 +61,6 @@ class Gitlabvuepress2Config extends Vuepress2Config { this.allowKnowledgeSpaceChange = false this.placeholder.knowledgeSpaceReadonlyModeTip = "Gitlabvuepress2 平台暂不支持修改发布目录,如需修改,请删除之后重新发布" this.knowledgeSpaceType = CategoryTypeEnum.CategoryType_Tree_Single - this.useMdFilename = false - this.usePathCategory = false } } diff --git a/src/adaptors/api/gitlab-vuepress2/gitlabvuepress2PlaceHolder.ts b/src/adaptors/api/gitlab-vuepress2/gitlabvuepress2PlaceHolder.ts index 0a20238..649c462 100644 --- a/src/adaptors/api/gitlab-vuepress2/gitlabvuepress2PlaceHolder.ts +++ b/src/adaptors/api/gitlab-vuepress2/gitlabvuepress2PlaceHolder.ts @@ -23,8 +23,8 @@ * questions. */ -import { Vuepress2PlaceHolder } from "~/src/adaptors/api/vuepress2/vuepress2PlaceHolder.ts" +import { Vuepress2Placeholder } from "~/src/adaptors/api/vuepress2/vuepress2Placeholder.ts" -class Gitlabvuepress2PlaceHolder extends Vuepress2PlaceHolder {} +class Gitlabvuepress2Placeholder extends Vuepress2Placeholder {} -export { Gitlabvuepress2PlaceHolder } +export { Gitlabvuepress2Placeholder } diff --git a/src/adaptors/api/gitlab-vuepress2/useGitlabvuepress2Api.ts b/src/adaptors/api/gitlab-vuepress2/useGitlabvuepress2Api.ts index 48f6610..8ca685a 100644 --- a/src/adaptors/api/gitlab-vuepress2/useGitlabvuepress2Api.ts +++ b/src/adaptors/api/gitlab-vuepress2/useGitlabvuepress2Api.ts @@ -25,7 +25,7 @@ import { createAppLogger } from "~/src/utils/appLogger.ts" import { PublisherAppInstance } from "~/src/publisherAppInstance.ts" -import { useSettingStore } from "~/src/stores/useSettingStore.ts" +import { usePublishSettingStore } from "~/src/stores/usePublishSettingStore.ts" import { JsonUtil, ObjectUtil, StrUtil } from "zhi-common" import { Utils } from "~/src/utils/utils.ts" import { getDynPostidKey } from "~/src/platforms/dynamicConfig.ts" @@ -33,6 +33,7 @@ import { CategoryTypeEnum } from "zhi-blog-api" import { Gitlabvuepress2Config } from "~/src/adaptors/api/gitlab-vuepress2/gitlabvuepress2Config.ts" import { Gitlabvuepress2YamlConverterAdaptor } from "~/src/adaptors/api/gitlab-vuepress2/gitlabvuepress2YamlConverterAdaptor.ts" import { Gitlabvuepress2ApiAdaptor } from "~/src/adaptors/api/gitlab-vuepress2/gitlabvuepress2ApiAdaptor.ts" +import { LEGENCY_SHARED_PROXT_MIDDLEWARE } from "~/src/utils/constants.ts" const useGitlabvuepress2Api = async (key: string, newCfg?: Gitlabvuepress2Config) => { // 创建应用日志记录器 @@ -50,7 +51,7 @@ const useGitlabvuepress2Api = async (key: string, newCfg?: Gitlabvuepress2Config cfg = newCfg } else { // 从配置中获取数据 - const { getSetting } = useSettingStore() + const { getSetting } = usePublishSettingStore() const setting = await getSetting() cfg = JsonUtil.safeParse(setting[key], {} as Gitlabvuepress2Config) @@ -61,10 +62,7 @@ const useGitlabvuepress2Api = async (key: string, newCfg?: Gitlabvuepress2Config const githubAuthToken = Utils.emptyOrDefault(process.env.VITE_GITLAB_AUTH_TOKEN, "") const githubRepo = Utils.emptyOrDefault(process.env.VITE_GITLAB_REPO, "") const githubBranch = Utils.emptyOrDefault(process.env.VITE_GITLAB_BRANCH, "main") - const middlewareUrl = Utils.emptyOrDefault( - process.env.VITE_MIDDLEWARE_URL, - "https://api.terwer.space/api/middleware" - ) + const middlewareUrl = Utils.emptyOrDefault(process.env.VITE_MIDDLEWARE_URL, LEGENCY_SHARED_PROXT_MIDDLEWARE) cfg = new Gitlabvuepress2Config(githubUsername, githubAuthToken, githubRepo, githubBranch, middlewareUrl) logger.info("Configuration is empty, using default environment variables.") } else { @@ -79,8 +77,6 @@ const useGitlabvuepress2Api = async (key: string, newCfg?: Gitlabvuepress2Config // 文件规则 cfg.mdFilenameRule = "[slug].md" - cfg.useMdFilename = false - cfg.usePathCategory = false // 标签 cfg.tagEnabled = true // 分类 diff --git a/src/adaptors/api/halo/HaloApiAdaptor.ts b/src/adaptors/api/halo/HaloApiAdaptor.ts new file mode 100644 index 0000000..c6acf9b --- /dev/null +++ b/src/adaptors/api/halo/HaloApiAdaptor.ts @@ -0,0 +1,516 @@ +/* + * 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 { HaloConfig } from "~/src/adaptors/api/halo/HaloConfig.ts" +import { BaseBlogApi } from "~/src/adaptors/api/base/baseBlogApi.ts" +import { createAppLogger } from "~/src/utils/appLogger.ts" +import { Attachment, CategoryInfo, MediaObject, Post, UserBlog } from "zhi-blog-api" +import { AliasTranslator, JsonUtil, ObjectUtil, StrUtil } from "zhi-common" +import { Base64 } from "js-base64" +import sypIdUtil from "~/src/utils/sypIdUtil.ts" +import { PostRequest } from "@halo-dev/api-client" +import { HaloPostMeta } from "~/src/adaptors/api/halo/HaloPostMeta.ts" + +/** + * Halo API 适配器 + * @see [Halo API](https://github.com/halo-sigs/vscode-extension-halo/blob/main/src/service/index.ts) + * @see [Halo docs](https://docs.halo.run/getting-started/install/docker-compose/) + */ +class HaloApiAdaptor extends BaseBlogApi { + constructor(appInstance: any, cfg: HaloConfig) { + super(appInstance, cfg) + this.logger = createAppLogger("halo-api-adaptor") + } + + public async getUsersBlogs(): Promise { + const result: UserBlog[] = [] + + const cates = await this.getHaloCategories() + // 数据适配 + cates.forEach((item: any) => { + const userblog: UserBlog = new UserBlog() + userblog.blogid = item.spec.slug + userblog.blogName = item.spec.displayName + userblog.url = item.status.permalink + result.push(userblog) + }) + this.logger.debug("get halo categories =>", result) + + return result + } + + public async newPost(post: Post, publish?: boolean): Promise { + const params: PostRequest = { + post: { + spec: { + title: "", + slug: "", + template: "", + cover: "", + deleted: false, + publish: false, + publishTime: undefined, + pinned: false, + allowComment: true, + visible: "PUBLIC", + priority: 0, + excerpt: { + autoGenerate: true, + raw: "", + }, + categories: [], + tags: [], + htmlMetas: [], + }, + apiVersion: "content.halo.run/v1alpha1", + kind: "Post", + metadata: { + name: "", + annotations: {}, + }, + }, + content: { + raw: "", + content: "", + rawType: "HTML", + }, + } + + params.content.raw = post.html + params.content.content = post.description + + if (StrUtil.isEmptyString(post.shortDesc)) { + params.post.spec.excerpt.autoGenerate = true + } else { + params.post.spec.excerpt.autoGenerate = false + params.post.spec.excerpt.raw = post.shortDesc + } + + params.post.metadata.name = sypIdUtil.randomUuid() + params.post.spec.title = post.title + params.post.spec.slug = post.wp_slug + + // 标签和分类 + try { + if (post.categories && post.categories.length > 0) { + const categoryNames = await this.getCategoryNames(post.categories) + params.post.spec.categories = categoryNames + } + if (!StrUtil.isEmptyString(post.mt_keywords)) { + const tags = post.mt_keywords.split(",") + const tagNames = await this.getTagNames(tags) + params.post.spec.tags = tagNames + } + } catch (e) { + throw e + } + + // 发布时间 + params.post.spec.publishTime = post.dateCreated.toISOString() + + // 草稿 + const res = await this.haloFetch("/apis/api.console.halo.run/v1alpha1/posts", params, "POST") + this.logger.debug("halo newPost res =>", res) + if (!res?.metadata?.name) { + throw new Error("Halo 文章发布失败") + } + this.logger.debug("halo 文章草稿完成") + + // 发布 + await this.haloFetch(`/apis/api.console.halo.run/v1alpha1/posts/${params.post.metadata.name}/publish`, {}, "PUT") + this.logger.debug("halo 文章发布完成") + + // 生成文章ID + const postidMeta = new HaloPostMeta(res.spec.slug, res.metadata.name, post.dateCreated) + this.logger.debug("postidMeta =>", postidMeta) + + // 需要更新一次,否则 + + return JSON.stringify(postidMeta) + } + + public async editPost(postid: string, post: Post, publish?: boolean): Promise { + let flag = false + try { + const haloPostKey = this.getHaloPostidKey(postid) + const name = haloPostKey.name + + // 加载最新 + let params: PostRequest = await this.getHaloPost(name) + this.logger.debug("get latest halo post =>", { name: name, haloPost: params }) + + if (!params.post) { + throw new Error("获取文章信息失败,如果文章删除,请强制删除解除关联") + } + + params.content.raw = post.html + params.content.content = post.description + + if (StrUtil.isEmptyString(post.shortDesc)) { + params.post.spec.excerpt.autoGenerate = true + } else { + params.post.spec.excerpt.autoGenerate = false + params.post.spec.excerpt.raw = post.shortDesc + } + + params.post.metadata.name = name + params.post.spec.title = post.title + params.post.spec.slug = post.wp_slug + + // 标签和分类 + if (post.categories && post.categories.length > 0) { + const categoryNames = await this.getCategoryNames(post.categories) + params.post.spec.categories = categoryNames + } + if (!StrUtil.isEmptyString(post.mt_keywords)) { + const tags = post.mt_keywords.split(",") + const tagNames = await this.getTagNames(tags) + params.post.spec.tags = tagNames + } + + // 发布时间 + params.post.spec.publishTime = post.dateCreated.toISOString() + + // 更新文章信息 + await this.haloFetch(`/apis/content.halo.run/v1alpha1/posts/${name}`, params.post, "PUT") + await this.haloFetch(`/apis/api.console.halo.run/v1alpha1/posts/${name}/content`, params.content, "PUT") + + // 重新发布 + await this.haloFetch( + `/apis/api.console.halo.run/v1alpha1/posts/${params.post.metadata.name}/publish`, + {}, + "PUT" + ) + this.logger.debug("halo 文章发布完成") + } catch (e) { + this.logger.error("Halo文章更新失败", e) + } + + return flag + } + + public async getPost(postid: string, useSlug?: boolean): Promise { + const haloPostKey = this.getHaloPostidKey(postid) + const name = haloPostKey.name + + // 加载最新 + const haloPost = await this.getHaloPost(name) + this.logger.debug("getPost haloPost =>", { name: name, haloPost: haloPost }) + + const commonPost = new Post() + commonPost.title = haloPost.post.spec.title + commonPost.wp_slug = haloPost.post.spec.slug + commonPost.shortDesc = haloPost.post.spec.excerpt.raw + + commonPost.tags_slugs = haloPost.post.spec.tags.join(",") + commonPost.cate_slugs = haloPost.post.spec.categories + + return commonPost + } + + public async getPreviewUrl(postid: string): Promise { + const haloPostKey = this.getHaloPostidKey(postid) + const postUrl = this.cfg.previewUrl + .replace("{slug}", haloPostKey.slug) + .replace("{name}", haloPostKey.name) + .replace("{year}", haloPostKey.year) + .replace("{month}", haloPostKey.month) + .replace("{day}", haloPostKey.day) + return postUrl + // return StrUtil.pathJoin(this.cfg.home ?? "", postUrl) + } + + public async deletePost(postid: string): Promise { + const haloPostKey = this.getHaloPostidKey(postid) + // const unPublishUrl = `/apis/api.console.halo.run/v1alpha1/posts/${haloPostKey.name}/unpublish` + const recycleUrl = `/apis/api.console.halo.run/v1alpha1/posts/${haloPostKey.name}/recycle` + const res = await this.haloFetch(recycleUrl, {}, "PUT") + this.logger.debug("halo deletePost res =>", res) + + if (!res?.metadata?.name) { + throw new Error("Halo 文章删除失败") + } + return true + } + + public async getCategories(): Promise { + const cats = [] as CategoryInfo[] + + const hcs: any[] = await this.getHaloCategories() + if (hcs && hcs.length > 0) { + // 数据适配 + hcs.forEach((item: any) => { + const cat = new CategoryInfo() + cat.categoryId = item.spec.slug + cat.categoryName = item.spec.displayName + cat.description = item.spec.displayName + cat.categoryDescription = item.spec.description + cats.push(cat) + }) + this.logger.debug("get halo categories =>", cats) + } + + return cats + } + + public async newMediaObject(mediaObject: MediaObject, customHandler?: any): Promise { + let res: any + try { + const bits = mediaObject.bits + this.logger.debug("newMediaObject on halo =>", mediaObject) + + // import + const win = this.appInstance.win + if (!win.require) { + throw new Error("非常抱歉,目前仅思源笔记PC客户端支持上传图片") + } + const { FormData, Blob } = win.require(`${this.appInstance.moduleBase}libs/node-fetch-cjs/dist/index.js`) + const blob = new Blob([bits], { type: mediaObject.type }) + + // uploadUrl + const uploadUrl = `${this.cfg.apiUrl}/apis/api.console.halo.run/v1alpha1/attachments/upload` + + // formData + const formData = new FormData() + formData.append("file", blob, mediaObject.name) + formData.append("policyName", "default-policy") + formData.append("groupName", "") + formData.append("file", blob, mediaObject.name) + + // 发送请求 + res = await this.haloFormFetch(uploadUrl, formData) + this.logger.debug("halo upload success, res =>", res) + if (!res.metadata) { + throw new Error("Halo图片上传失败 =>" + mediaObject.name) + } + } catch (e) { + this.logger.error("Error uploading image to halo:", e) + } + + const siteImgId = res?.spec?.displayName + const siteArticleId = res?.metadata?.name + const siteImgUrl = this.cfg.home + (res?.metadata?.annotations["storage.halo.run/uri"] ?? "") + return { + attachment_id: siteImgId, + date_created_gmt: new Date(), + parent: 0, + link: siteImgUrl, + title: mediaObject.name, + caption: "", + description: "", + metadata: { + width: 0, + height: 0, + file: "", + filesize: 0, + sizes: [], + }, + type: mediaObject.type, + thumbnail: "", + id: siteArticleId, + file: mediaObject.name, + url: siteImgUrl, + } + } + + // ================ + // private methods + // ================ + /** + * 获取封装的postid + * + * @param postid + * @private postid + */ + private getHaloPostidKey(postid: string): HaloPostMeta { + const postidJson = JsonUtil.safeParse(postid, {} as HaloPostMeta) + return postidJson + } + + private async getHaloPost(name: string): Promise { + try { + const post = await this.haloFetch(`/apis/content.halo.run/v1alpha1/posts/${name}`, {}, "GET") + + const content = await this.haloFetch( + `/apis/api.console.halo.run/v1alpha1/posts/${name}/head-content`, + {}, + "GET" + ) + + return Promise.resolve({ + post: post, + content: content, + }) + } catch (error) { + return Promise.resolve(undefined) + } + } + + public async getCategoryNames(displayNames: string[]): Promise { + const allCategories = await this.getHaloCategories() + + const notExistDisplayNames = displayNames.filter( + (name) => !allCategories.find((item) => item.spec.displayName === name) + ) + + const newCategories = await Promise.all( + notExistDisplayNames.map(async (name, index) => { + const slug = await AliasTranslator.getPageSlug(name, true) + const category = await this.haloFetch( + "/apis/content.halo.run/v1alpha1/categories", + { + spec: { + displayName: name, + slug: slug, + description: "", + cover: "", + template: "", + priority: allCategories.length + index, + children: [], + }, + apiVersion: "content.halo.run/v1alpha1", + kind: "Category", + metadata: { name: "", generateName: "category-" }, + }, + "POST" + ) + return category + }) + ) + + const existNames = displayNames + .map((name) => { + const found = allCategories.find((item) => item.spec.displayName === name) + return found ? found.metadata.name : undefined + }) + .filter(Boolean) as string[] + + this.logger.debug("newCategories =>", newCategories) + return [...existNames, ...newCategories.map((item) => item.metadata.name)] + } + + private async getHaloCategories() { + const categories = await this.haloFetch("/apis/content.halo.run/v1alpha1/categories", {}, "GET") + return Promise.resolve(categories.items) + } + + public async getTagNames(displayNames: string[]): Promise { + const allTags = await this.getHaloTags() + + const notExistDisplayNames = displayNames.filter((name) => !allTags.find((item) => item.spec.displayName === name)) + + const newTags = await Promise.all( + notExistDisplayNames.map(async (name) => { + const slug = await AliasTranslator.getPageSlug(name, true) + const tag = await this.haloFetch( + "/apis/content.halo.run/v1alpha1/tags", + { + spec: { + displayName: name, + slug: slug, + color: "#ffffff", + cover: "", + }, + apiVersion: "content.halo.run/v1alpha1", + kind: "Tag", + metadata: { name: "", generateName: "tag-" }, + }, + "POST" + ) + return tag + }) + ) + + const existNames = displayNames + .map((name) => { + const found = allTags.find((item) => item.spec.displayName === name) + return found ? found.metadata.name : undefined + }) + .filter(Boolean) as string[] + + this.logger.debug("newTags =>", newTags) + return [...existNames, ...newTags.map((item) => item.metadata.name)] + } + + private async getHaloTags() { + const categories = await this.haloFetch("/apis/content.halo.run/v1alpha1/tags", {}, "GET") + return Promise.resolve(categories.items) + } + + /** + * 向 Halo 请求数据 + * + * @param url 请求地址 + * @param params 数据 + * @param method 请求方法 GET | POST | PUT | DELETE + * @param header 请求头 + * @private + */ + private async haloFetch( + url: string, + params?: any, + method: "GET" | "POST" | "PUT" | "DELETE" = "POST", + header: Record = {} + ): Promise { + const contentType = "application/json" + const basicAuth = "Basic " + Base64.btoa(this.cfg.username + ":" + this.cfg.password) + const headers = { + "Content-Type": contentType, + Authorization: basicAuth, + ...header, + } + + // 打印日志 + const apiUrl = `${this.cfg.apiUrl}${url}` + this.logger.debug("向 Halo 请求数据,apiUrl =>", apiUrl) + this.logger.debug("向 Halo 请求数据,params =>", params) + + // 使用兼容的fetch调用并返回统一的JSON数据 + const body = ObjectUtil.isEmptyObject(params) ? "" : JSON.stringify(params) + const resJson = await this.apiProxyFetch(apiUrl, [headers], body, method, contentType) + this.logger.debug("向 Halo 请求数据,resJson =>", resJson) + + return resJson ?? null + } + + /** + * 向 Halo 发送表单数据 + * + * @param url 请求地址 + * @param formData 表单数据 + * @private + */ + private async haloFormFetch(url: string, formData: FormData) { + const basicAuth = "Basic " + Base64.btoa(this.cfg.username + ":" + this.cfg.password) + const header = { + Authorization: basicAuth, + } + + const resJson = await this.apiFormFetch(url, [header], formData) + return resJson + } +} + +export { HaloApiAdaptor } diff --git a/src/adaptors/api/halo/HaloConfig.ts b/src/adaptors/api/halo/HaloConfig.ts new file mode 100644 index 0000000..6a332c6 --- /dev/null +++ b/src/adaptors/api/halo/HaloConfig.ts @@ -0,0 +1,58 @@ +/* + * 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 { CommonBlogConfig } from "~/src/adaptors/api/base/commonBlogConfig.ts" +import { CategoryTypeEnum, PageTypeEnum } from "zhi-blog-api" + +/** + * Halo 配置 + */ +class HaloConfig extends CommonBlogConfig { + /** + * Halo 配置项 + * + * @param username 用户名 + * @param password 密码 + * @param middlewareUrl 代理地址 + */ + constructor(username: string, password: string, middlewareUrl?: string) { + super("", "", username, password, middlewareUrl) + + this.home = "[your-halo-home]" + this.apiUrl = "[your-halo-api-url]" + this.previewUrl = "/archives/{slug}" + this.pageType = PageTypeEnum.Html + this.usernameEnabled = true + this.showTokenTip = false + this.allowPreviewUrlChange = true + this.tagEnabled = true + this.cateEnabled = true + this.categoryType = CategoryTypeEnum.CategoryType_Multi + this.allowCateChange = true + this.knowledgeSpaceEnabled = false + } +} + +export { HaloConfig } diff --git a/src/adaptors/api/halo/HaloPlaceholder.ts b/src/adaptors/api/halo/HaloPlaceholder.ts new file mode 100644 index 0000000..c743c0c --- /dev/null +++ b/src/adaptors/api/halo/HaloPlaceholder.ts @@ -0,0 +1,33 @@ +/* + * 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 { CommonBlogPlaceholder } from "~/src/adaptors/api/base/commonBlogPlaceholder.ts" + +/** + * Halo 配置提示 + */ +class HaloPlaceholder extends CommonBlogPlaceholder {} + +export { HaloPlaceholder } diff --git a/src/adaptors/api/halo/HaloPostMeta.ts b/src/adaptors/api/halo/HaloPostMeta.ts new file mode 100644 index 0000000..d364e2f --- /dev/null +++ b/src/adaptors/api/halo/HaloPostMeta.ts @@ -0,0 +1,55 @@ +/* + * 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 { DateUtil } from "zhi-common" + +/** + * Halo 平台的一些元数据 + * + * @author terwer + * @version 1.15.0 + * @since 1.15.0 + */ +class HaloPostMeta { + public slug: string + public name: string + public year: string + public month: string + public day: string + + constructor(slug: string, name: string, dateCreated: Date) { + this.slug = slug + this.name = name + + const created = DateUtil.formatIsoToZhDate(dateCreated.toISOString(), true) + const datearr = created.split(" ")[0] + const numarr = datearr.split("-") + this.year = numarr[0] + this.month = numarr[1] + this.day = numarr[2] + } +} + +export { HaloPostMeta } diff --git a/src/adaptors/api/halo/haloUtils.ts b/src/adaptors/api/halo/haloUtils.ts new file mode 100644 index 0000000..8a420ec --- /dev/null +++ b/src/adaptors/api/halo/haloUtils.ts @@ -0,0 +1,59 @@ +/* + * 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 * as yaml from "js-yaml" +import * as matter from "gray-matter" + +/** + * Halo 平台工具类 + * + * @author terwer + * @version 1.15.0 + * @since 1.15.0 + */ +class HaloUtils { + private static options = { + engines: { + yaml: { + parse: (input: string) => yaml.load(input) as object, + stringify: (data: object) => { + return yaml.dump(data, { + styles: { "!!null": "empty" }, + }) + }, + }, + }, + } + + public static readMatter(content: string) { + return matter(content, this.options) + } + + public static mergeMatter(content: string, data: object) { + return matter.stringify(content, data, this.options) + } +} + +export default HaloUtils diff --git a/src/adaptors/api/halo/useHaloApi.ts b/src/adaptors/api/halo/useHaloApi.ts new file mode 100644 index 0000000..b54c75f --- /dev/null +++ b/src/adaptors/api/halo/useHaloApi.ts @@ -0,0 +1,94 @@ +/* + * 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 { HaloConfig } from "~/src/adaptors/api/halo/HaloConfig.ts" +import { createAppLogger } from "~/src/utils/appLogger.ts" +import { PublisherAppInstance } from "~/src/publisherAppInstance.ts" +import { usePublishSettingStore } from "~/src/stores/usePublishSettingStore.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" +import { HaloApiAdaptor } from "~/src/adaptors/api/halo/HaloApiAdaptor.ts" +import { LEGENCY_SHARED_PROXT_MIDDLEWARE } from "~/src/utils/constants.ts" + +const useHaloApi = async (key: string, newCfg?: HaloConfig) => { + // 创建应用日志记录器 + const logger = createAppLogger("use-halo-api") + + // 记录开始使用 Halo API + logger.info("Start using Halo API...") + + // 创建应用实例 + const appInstance = new PublisherAppInstance() + + let cfg: HaloConfig + if (newCfg) { + logger.info("Initialize with the latest newCfg passed in...") + cfg = newCfg + } else { + // 从配置中获取数据 + const { getSetting } = usePublishSettingStore() + const setting = await getSetting() + cfg = JsonUtil.safeParse(setting[key], {} as HaloConfig) + + // 如果配置为空,则使用默认的环境变量值,并记录日志 + if (ObjectUtil.isEmptyObject(cfg)) { + // 从环境变量获取 Halo API 的 URL、认证令牌和其他配置信息 + const haloUsername = Utils.emptyOrDefault(process.env.VITE_YUQUE_USERNAME, "") + const haloAuthToken = Utils.emptyOrDefault(process.env.VITE_YUQUE_AUTH_TOKEN, "") + const middlewareUrl = Utils.emptyOrDefault(process.env.VITE_MIDDLEWARE_URL, LEGENCY_SHARED_PROXT_MIDDLEWARE) + cfg = new HaloConfig(haloUsername, haloAuthToken, middlewareUrl) + logger.info("Configuration is empty, using default environment variables.") + } else { + logger.info("Using configuration from settings...") + } + // 初始化posidKey + if (StrUtil.isEmptyString(cfg.posidKey)) { + // 默认值 + cfg.posidKey = getDynPostidKey(key) + } + } + + cfg.usernameEnabled = true + // 标签 + cfg.tagEnabled = true + // Halo 使用多选分类 + cfg.cateEnabled = true + cfg.categoryType = CategoryTypeEnum.CategoryType_Multi + cfg.allowCateChange = true + cfg.knowledgeSpaceEnabled = false + + // 创建 Halo API 适配器 + const blogApi = new HaloApiAdaptor(appInstance, cfg) + logger.info("Halo API created successfully.", cfg) + + return { + cfg, + blogApi, + } +} + +export { useHaloApi } diff --git a/src/adaptors/api/hexo/hexoApiAdaptor.ts b/src/adaptors/api/hexo/hexoApiAdaptor.ts index dbaa644..4684fee 100644 --- a/src/adaptors/api/hexo/hexoApiAdaptor.ts +++ b/src/adaptors/api/hexo/hexoApiAdaptor.ts @@ -26,7 +26,7 @@ import { CommonGithubApiAdaptor } from "~/src/adaptors/api/base/github/commonGithubApiAdaptor.ts" import { BlogConfig, PageTypeEnum, Post, YamlConvertAdaptor } from "zhi-blog-api" import { HexoYamlConverterAdaptor } from "~/src/adaptors/api/hexo/hexoYamlConverterAdaptor.ts" -import _ from "lodash" +import _ from "lodash-es" import { YamlUtil } from "zhi-common" /** diff --git a/src/adaptors/api/hexo/hexoConfig.ts b/src/adaptors/api/hexo/hexoConfig.ts index f600b56..38448ad 100644 --- a/src/adaptors/api/hexo/hexoConfig.ts +++ b/src/adaptors/api/hexo/hexoConfig.ts @@ -59,8 +59,6 @@ class HexoConfig extends CommonGithubConfig { this.allowKnowledgeSpaceChange = false this.placeholder.knowledgeSpaceReadonlyModeTip = "Hexo 平台暂不支持修改发布目录,如需修改,请删除之后重新发布" this.knowledgeSpaceType = CategoryTypeEnum.CategoryType_Tree_Single - this.useMdFilename = false - this.usePathCategory = false } } diff --git a/src/adaptors/api/hexo/hexoPlaceHolder.ts b/src/adaptors/api/hexo/hexoPlaceHolder.ts index dcc85f9..c8c7be6 100644 --- a/src/adaptors/api/hexo/hexoPlaceHolder.ts +++ b/src/adaptors/api/hexo/hexoPlaceHolder.ts @@ -25,6 +25,6 @@ import { CommonGithubPlaceholder } from "~/src/adaptors/api/base/github/commonGithubPlaceholder.ts" -class HexoPlaceHolder extends CommonGithubPlaceholder {} +class HexoPlaceholder extends CommonGithubPlaceholder {} -export { HexoPlaceHolder } +export { HexoPlaceholder } diff --git a/src/adaptors/api/hexo/hexoYamlConverterAdaptor.ts b/src/adaptors/api/hexo/hexoYamlConverterAdaptor.ts index abf472a..1f625cd 100644 --- a/src/adaptors/api/hexo/hexoYamlConverterAdaptor.ts +++ b/src/adaptors/api/hexo/hexoYamlConverterAdaptor.ts @@ -39,9 +39,13 @@ import { toRaw } from "vue" class HexoYamlConverterAdaptor extends YamlConvertAdaptor { private readonly logger = createAppLogger("hexo-yaml-converter-adaptor") - public convertToYaml(post: Post, cfg?: BlogConfig): YamlFormatObj { + public convertToYaml(post: Post, yamlFormatObj?: YamlFormatObj, cfg?: BlogConfig): YamlFormatObj { this.logger.debug("您正在使用 Hexo Yaml Converter", { post: toRaw(post) }) - let yamlFormatObj: YamlFormatObj = new YamlFormatObj() + // 没有的情况默认初始化一个 + if (!yamlFormatObj) { + yamlFormatObj = new YamlFormatObj() + } + // title yamlFormatObj.yamlObj.title = post.title diff --git a/src/adaptors/api/hexo/useHexoApi.ts b/src/adaptors/api/hexo/useHexoApi.ts index 74a41ad..138d12d 100644 --- a/src/adaptors/api/hexo/useHexoApi.ts +++ b/src/adaptors/api/hexo/useHexoApi.ts @@ -25,7 +25,7 @@ import { createAppLogger } from "~/src/utils/appLogger.ts" import { PublisherAppInstance } from "~/src/publisherAppInstance.ts" -import { useSettingStore } from "~/src/stores/useSettingStore.ts" +import { usePublishSettingStore } from "~/src/stores/usePublishSettingStore.ts" import { JsonUtil, ObjectUtil, StrUtil } from "zhi-common" import { Utils } from "~/src/utils/utils.ts" import { getDynPostidKey } from "~/src/platforms/dynamicConfig.ts" @@ -33,6 +33,7 @@ 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" +import { LEGENCY_SHARED_PROXT_MIDDLEWARE } from "~/src/utils/constants.ts" const useHexoApi = async (key: string, newCfg?: HexoConfig) => { // 创建应用日志记录器 @@ -50,7 +51,7 @@ const useHexoApi = async (key: string, newCfg?: HexoConfig) => { cfg = newCfg } else { // 从配置中获取数据 - const { getSetting } = useSettingStore() + const { getSetting } = usePublishSettingStore() const setting = await getSetting() cfg = JsonUtil.safeParse(setting[key], {} as HexoConfig) @@ -61,10 +62,7 @@ const useHexoApi = async (key: string, newCfg?: HexoConfig) => { const githubAuthToken = Utils.emptyOrDefault(process.env.VITE_GITHUB_AUTH_TOKEN, "") const githubRepo = Utils.emptyOrDefault(process.env.VITE_GITHUB_REPO, "") const githubBranch = Utils.emptyOrDefault(process.env.VITE_GITHUB_BRANCH, "main") - const middlewareUrl = Utils.emptyOrDefault( - process.env.VITE_MIDDLEWARE_URL, - "https://api.terwer.space/api/middleware" - ) + const middlewareUrl = Utils.emptyOrDefault(process.env.VITE_MIDDLEWARE_URL, LEGENCY_SHARED_PROXT_MIDDLEWARE) cfg = new HexoConfig(githubUsername, githubAuthToken, githubRepo, githubBranch, middlewareUrl) logger.info("Configuration is empty, using default environment variables.") } else { @@ -84,8 +82,6 @@ const useHexoApi = async (key: string, newCfg?: HexoConfig) => { // [mm] 月 // [dd] 日 cfg.mdFilenameRule = "[slug].md" - cfg.useMdFilename = false - cfg.usePathCategory = false // 标签 cfg.tagEnabled = true // 分类 diff --git a/src/adaptors/api/hugo/hugoApiAdaptor.ts b/src/adaptors/api/hugo/hugoApiAdaptor.ts index 08ecb38..beb39af 100644 --- a/src/adaptors/api/hugo/hugoApiAdaptor.ts +++ b/src/adaptors/api/hugo/hugoApiAdaptor.ts @@ -25,7 +25,7 @@ import { CommonGithubApiAdaptor } from "~/src/adaptors/api/base/github/commonGithubApiAdaptor.ts" import { BlogConfig, PageTypeEnum, Post, YamlConvertAdaptor } from "zhi-blog-api" -import _ from "lodash" +import _ from "lodash-es" import { HugoYamlConverterAdaptor } from "~/src/adaptors/api/hugo/hugoYamlConverterAdaptor.ts" import {YamlUtil} from "zhi-common"; @@ -45,7 +45,7 @@ class HugoApiAdaptor extends CommonGithubApiAdaptor { // 公共的属性预处理 const doc = await super.preEditPost(post, id, publishCfg) - // HEXO 自带的处理 + // HUGO 自带的处理 const cfg: BlogConfig = publishCfg?.cfg const updatedPost = _.cloneDeep(doc) as Post diff --git a/src/adaptors/api/hugo/hugoConfig.ts b/src/adaptors/api/hugo/hugoConfig.ts index bb27ddf..4142285 100644 --- a/src/adaptors/api/hugo/hugoConfig.ts +++ b/src/adaptors/api/hugo/hugoConfig.ts @@ -59,8 +59,6 @@ class HugoConfig extends CommonGithubConfig { this.allowKnowledgeSpaceChange = false this.placeholder.knowledgeSpaceReadonlyModeTip = "Hugo 平台暂不支持修改发布目录,如需修改,请删除之后重新发布" this.knowledgeSpaceType = CategoryTypeEnum.CategoryType_Tree_Single - this.useMdFilename = false - this.usePathCategory = false } } diff --git a/src/adaptors/api/hugo/hugoPlaceHolder.ts b/src/adaptors/api/hugo/hugoPlaceHolder.ts index 57edcfc..45e109b 100644 --- a/src/adaptors/api/hugo/hugoPlaceHolder.ts +++ b/src/adaptors/api/hugo/hugoPlaceHolder.ts @@ -25,6 +25,6 @@ import { CommonGithubPlaceholder } from "~/src/adaptors/api/base/github/commonGithubPlaceholder.ts" -class HugoPlaceHolder extends CommonGithubPlaceholder {} +class HugoPlaceholder extends CommonGithubPlaceholder {} -export { HugoPlaceHolder } +export { HugoPlaceholder } diff --git a/src/adaptors/api/hugo/hugoYamlConverterAdaptor.ts b/src/adaptors/api/hugo/hugoYamlConverterAdaptor.ts index 2fa4e1b..87f9b64 100644 --- a/src/adaptors/api/hugo/hugoYamlConverterAdaptor.ts +++ b/src/adaptors/api/hugo/hugoYamlConverterAdaptor.ts @@ -38,9 +38,12 @@ import { toRaw } from "vue" class HugoYamlConverterAdaptor extends YamlConvertAdaptor { private readonly logger = createAppLogger("hugo-yaml-converter-adaptor") - public convertToYaml(post: Post, cfg?: BlogConfig): YamlFormatObj { + public convertToYaml(post: Post, yamlFormatObj?: YamlFormatObj, cfg?: BlogConfig): YamlFormatObj { this.logger.debug("您正在使用 Hugo Yaml Converter", { post: toRaw(post) }) - let yamlFormatObj: YamlFormatObj = new YamlFormatObj() + // 没有的情况默认初始化一个 + if (!yamlFormatObj) { + yamlFormatObj = new YamlFormatObj() + } // title yamlFormatObj.yamlObj.title = post.title diff --git a/src/adaptors/api/hugo/useHugoApi.ts b/src/adaptors/api/hugo/useHugoApi.ts index aa190d4..3de0fc1 100644 --- a/src/adaptors/api/hugo/useHugoApi.ts +++ b/src/adaptors/api/hugo/useHugoApi.ts @@ -25,7 +25,7 @@ import { createAppLogger } from "~/src/utils/appLogger.ts" import { PublisherAppInstance } from "~/src/publisherAppInstance.ts" -import { useSettingStore } from "~/src/stores/useSettingStore.ts" +import { usePublishSettingStore } from "~/src/stores/usePublishSettingStore.ts" import { JsonUtil, ObjectUtil, StrUtil } from "zhi-common" import { Utils } from "~/src/utils/utils.ts" import { getDynPostidKey } from "~/src/platforms/dynamicConfig.ts" @@ -33,6 +33,7 @@ import { CategoryTypeEnum } from "zhi-blog-api" import { HugoConfig } from "~/src/adaptors/api/hugo/hugoConfig.ts" import { HugoYamlConverterAdaptor } from "~/src/adaptors/api/hugo/hugoYamlConverterAdaptor.ts" import { HugoApiAdaptor } from "~/src/adaptors/api/hugo/hugoApiAdaptor.ts" +import { LEGENCY_SHARED_PROXT_MIDDLEWARE } from "~/src/utils/constants.ts" const useHugoApi = async (key: string, newCfg?: HugoConfig) => { // 创建应用日志记录器 @@ -50,7 +51,7 @@ const useHugoApi = async (key: string, newCfg?: HugoConfig) => { cfg = newCfg } else { // 从配置中获取数据 - const { getSetting } = useSettingStore() + const { getSetting } = usePublishSettingStore() const setting = await getSetting() cfg = JsonUtil.safeParse(setting[key], {} as HugoConfig) @@ -61,10 +62,7 @@ const useHugoApi = async (key: string, newCfg?: HugoConfig) => { const githubAuthToken = Utils.emptyOrDefault(process.env.VITE_GITHUB_AUTH_TOKEN, "") const githubRepo = Utils.emptyOrDefault(process.env.VITE_GITHUB_REPO, "") const githubBranch = Utils.emptyOrDefault(process.env.VITE_GITHUB_BRANCH, "main") - const middlewareUrl = Utils.emptyOrDefault( - process.env.VITE_MIDDLEWARE_URL, - "https://api.terwer.space/api/middleware" - ) + const middlewareUrl = Utils.emptyOrDefault(process.env.VITE_MIDDLEWARE_URL, LEGENCY_SHARED_PROXT_MIDDLEWARE) cfg = new HugoConfig(githubUsername, githubAuthToken, githubRepo, githubBranch, middlewareUrl) logger.info("Configuration is empty, using default environment variables.") } else { @@ -79,8 +77,6 @@ const useHugoApi = async (key: string, newCfg?: HugoConfig) => { // 文件规则 cfg.mdFilenameRule = "[slug].md" - cfg.useMdFilename = false - cfg.usePathCategory = false // 标签 cfg.tagEnabled = true // 分类 diff --git a/src/adaptors/api/jekyll/jekyllApiAdaptor.ts b/src/adaptors/api/jekyll/jekyllApiAdaptor.ts index 70f64bc..ec26d52 100644 --- a/src/adaptors/api/jekyll/jekyllApiAdaptor.ts +++ b/src/adaptors/api/jekyll/jekyllApiAdaptor.ts @@ -25,7 +25,7 @@ import { CommonGithubApiAdaptor } from "~/src/adaptors/api/base/github/commonGithubApiAdaptor.ts" import { BlogConfig, PageTypeEnum, Post, YamlConvertAdaptor } from "zhi-blog-api" -import _ from "lodash" +import _ from "lodash-es" import { JekyllYamlConverterAdaptor } from "~/src/adaptors/api/jekyll/jekyllYamlConverterAdaptor.ts" import { YamlUtil } from "zhi-common" @@ -45,7 +45,7 @@ class JekyllApiAdaptor extends CommonGithubApiAdaptor { // 公共的属性预处理 const doc = await super.preEditPost(post, id, publishCfg) - // HEXO 自带的处理 + // Jekyll 自带的处理 const cfg: BlogConfig = publishCfg?.cfg const updatedPost = _.cloneDeep(doc) as Post diff --git a/src/adaptors/api/jekyll/jekyllConfig.ts b/src/adaptors/api/jekyll/jekyllConfig.ts index 3916a2f..0cf0397 100644 --- a/src/adaptors/api/jekyll/jekyllConfig.ts +++ b/src/adaptors/api/jekyll/jekyllConfig.ts @@ -60,8 +60,6 @@ class JekyllConfig extends CommonGithubConfig { this.allowKnowledgeSpaceChange = false this.placeholder.knowledgeSpaceReadonlyModeTip = "Jekyll 平台暂不支持修改发布目录,如需修改,请删除之后重新发布" this.knowledgeSpaceType = CategoryTypeEnum.CategoryType_Tree_Single - this.useMdFilename = false - this.usePathCategory = false } } diff --git a/src/adaptors/api/jekyll/jekyllPlaceHolder.ts b/src/adaptors/api/jekyll/jekyllPlaceHolder.ts index 517f638..33826f7 100644 --- a/src/adaptors/api/jekyll/jekyllPlaceHolder.ts +++ b/src/adaptors/api/jekyll/jekyllPlaceHolder.ts @@ -25,6 +25,6 @@ import { CommonGithubPlaceholder } from "~/src/adaptors/api/base/github/commonGithubPlaceholder.ts" -class JekyllPlaceHolder extends CommonGithubPlaceholder {} +class JekyllPlaceholder extends CommonGithubPlaceholder {} -export { JekyllPlaceHolder } +export { JekyllPlaceholder } diff --git a/src/adaptors/api/jekyll/jekyllYamlConverterAdaptor.ts b/src/adaptors/api/jekyll/jekyllYamlConverterAdaptor.ts index 2333a2d..b9df97e 100644 --- a/src/adaptors/api/jekyll/jekyllYamlConverterAdaptor.ts +++ b/src/adaptors/api/jekyll/jekyllYamlConverterAdaptor.ts @@ -39,9 +39,12 @@ import {CommonGithubConfig} from "~/src/adaptors/api/base/github/commonGithubCon class JekyllYamlConverterAdaptor extends YamlConvertAdaptor { private readonly logger = createAppLogger("hexo-yaml-converter-adaptor") - public convertToYaml(post: Post, cfg?: BlogConfig): YamlFormatObj { + public convertToYaml(post: Post, yamlFormatObj?: YamlFormatObj, cfg?: BlogConfig): YamlFormatObj { this.logger.debug("您正在使用 Jekyll Yaml Converter", { post: toRaw(post) }) - let yamlFormatObj: YamlFormatObj = new YamlFormatObj() + // 没有的情况默认初始化一个 + if (!yamlFormatObj) { + yamlFormatObj = new YamlFormatObj() + } // layout yamlFormatObj.yamlObj.layout = "post" diff --git a/src/adaptors/api/jekyll/useJekyllApi.ts b/src/adaptors/api/jekyll/useJekyllApi.ts index bff659f..3724b88 100644 --- a/src/adaptors/api/jekyll/useJekyllApi.ts +++ b/src/adaptors/api/jekyll/useJekyllApi.ts @@ -25,7 +25,7 @@ import { createAppLogger } from "~/src/utils/appLogger.ts" import { PublisherAppInstance } from "~/src/publisherAppInstance.ts" -import { useSettingStore } from "~/src/stores/useSettingStore.ts" +import { usePublishSettingStore } from "~/src/stores/usePublishSettingStore.ts" import { JsonUtil, ObjectUtil, StrUtil } from "zhi-common" import { Utils } from "~/src/utils/utils.ts" import { getDynPostidKey } from "~/src/platforms/dynamicConfig.ts" @@ -33,6 +33,7 @@ import { CategoryTypeEnum } from "zhi-blog-api" import { JekyllConfig } from "~/src/adaptors/api/jekyll/jekyllConfig.ts" import { JekyllYamlConverterAdaptor } from "~/src/adaptors/api/jekyll/jekyllYamlConverterAdaptor.ts" import { JekyllApiAdaptor } from "~/src/adaptors/api/jekyll/jekyllApiAdaptor.ts" +import { LEGENCY_SHARED_PROXT_MIDDLEWARE } from "~/src/utils/constants.ts" const useJekyllApi = async (key: string, newCfg?: JekyllConfig) => { // 创建应用日志记录器 @@ -50,7 +51,7 @@ const useJekyllApi = async (key: string, newCfg?: JekyllConfig) => { cfg = newCfg } else { // 从配置中获取数据 - const { getSetting } = useSettingStore() + const { getSetting } = usePublishSettingStore() const setting = await getSetting() cfg = JsonUtil.safeParse(setting[key], {} as JekyllConfig) @@ -61,10 +62,7 @@ const useJekyllApi = async (key: string, newCfg?: JekyllConfig) => { const githubAuthToken = Utils.emptyOrDefault(process.env.VITE_GITHUB_AUTH_TOKEN, "") const githubRepo = Utils.emptyOrDefault(process.env.VITE_GITHUB_REPO, "") const githubBranch = Utils.emptyOrDefault(process.env.VITE_GITHUB_BRANCH, "main") - const middlewareUrl = Utils.emptyOrDefault( - process.env.VITE_MIDDLEWARE_URL, - "https://api.terwer.space/api/middleware" - ) + const middlewareUrl = Utils.emptyOrDefault(process.env.VITE_MIDDLEWARE_URL, LEGENCY_SHARED_PROXT_MIDDLEWARE) cfg = new JekyllConfig(githubUsername, githubAuthToken, githubRepo, githubBranch, middlewareUrl) logger.info("Configuration is empty, using default environment variables.") } else { @@ -79,8 +77,6 @@ const useJekyllApi = async (key: string, newCfg?: JekyllConfig) => { // 文件规则 cfg.mdFilenameRule = "[yyyy]-[mm]-[dd]-[slug].md" - cfg.useMdFilename = false - cfg.usePathCategory = false // 标签 cfg.tagEnabled = true // 分类 diff --git a/src/adaptors/api/jvue/jvueApiAdaptor.ts b/src/adaptors/api/jvue/jvueApiAdaptor.ts new file mode 100644 index 0000000..7464f4b --- /dev/null +++ b/src/adaptors/api/jvue/jvueApiAdaptor.ts @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2024, 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 { MetaweblogBlogApiAdaptor } from "~/src/adaptors/api/base/metaweblog/metaweblogBlogApiAdaptor.ts" +import { PublisherAppInstance } from "~/src/publisherAppInstance.ts" +import { JvueConfig } from "~/src/adaptors/api/jvue/jvueConfig.ts" +import { createAppLogger } from "~/src/utils/appLogger.ts" + +/** + * Typecho API 适配器 + * + * @author terwer + * @version 0.9.0 + * @since 0.9.0 + */ +class JvueApiAdaptor extends MetaweblogBlogApiAdaptor { + /** + * 初始化 Typecho API 适配器 + * + * @param appInstance 应用实例 + * @param cfg 配置项 + */ + constructor(appInstance: PublisherAppInstance, cfg: JvueConfig) { + super(appInstance, cfg) + this.logger = createAppLogger("typecho-api-adaptor") + this.cfg.blogid = "jvue" + } +} + +export { JvueApiAdaptor } diff --git a/src/adaptors/api/jvue/jvueConfig.ts b/src/adaptors/api/jvue/jvueConfig.ts new file mode 100644 index 0000000..19f7d08 --- /dev/null +++ b/src/adaptors/api/jvue/jvueConfig.ts @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2024, 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 { MetaweblogConfig } from "~/src/adaptors/api/base/metaweblog/metaweblogConfig.ts" +import {CategoryTypeEnum, PageTypeEnum} from "zhi-blog-api"; + +/** + * Jvue 配置 + * + * @author terwer + * @since 1.20.0 + */ +class JvueConfig extends MetaweblogConfig { + /** + * Jvue 配置项 + * + * @param homeAddr 博客地址 + * @param apiUrl 博客api地址 + * @param username 用户名 + * @param password 密码 + * @param middlewareUrl 中间件地址 + */ + constructor(homeAddr: string, apiUrl: string, username: string, password: string, middlewareUrl?: string) { + super(homeAddr, apiUrl, username, password, middlewareUrl) + + this.home = homeAddr + this.apiUrl = apiUrl + this.previewUrl = "/post/[postid].html" + this.pageType = PageTypeEnum.Markdown + this.showTokenTip = false + this.allowPreviewUrlChange = false + this.tagEnabled = true + this.cateEnabled = true + this.categoryType = CategoryTypeEnum.CategoryType_Multi + this.allowCateChange = true + this.knowledgeSpaceEnabled = false + } +} + +export { JvueConfig } diff --git a/src/adaptors/api/jvue/jvuePlaceHolder.ts b/src/adaptors/api/jvue/jvuePlaceHolder.ts new file mode 100644 index 0000000..87b7c22 --- /dev/null +++ b/src/adaptors/api/jvue/jvuePlaceHolder.ts @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2024, 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 { MetaweblogPlaceholder } from "~/src/adaptors/api/base/metaweblog/metaweblogPlaceholder.ts" + +/** + * Jvue 操作提示 + */ +class JvuePlaceHolder extends MetaweblogPlaceholder {} + +export { JvuePlaceHolder } diff --git a/src/adaptors/api/jvue/useJvueApi.ts b/src/adaptors/api/jvue/useJvueApi.ts new file mode 100644 index 0000000..b471056 --- /dev/null +++ b/src/adaptors/api/jvue/useJvueApi.ts @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2024, 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 { JvueConfig } from "~/src/adaptors/api/jvue/jvueConfig.ts" +import { createAppLogger } from "~/src/utils/appLogger.ts" +import { PublisherAppInstance } from "~/src/publisherAppInstance.ts" +import { usePublishSettingStore } from "~/src/stores/usePublishSettingStore.ts" +import { JsonUtil, ObjectUtil, StrUtil } from "zhi-common" +import { Utils } from "~/src/utils/utils.ts" +import { LEGENCY_SHARED_PROXT_MIDDLEWARE } from "~/src/utils/constants.ts" +import { getDynPostidKey } from "~/src/platforms/dynamicConfig.ts" +import { CategoryTypeEnum } from "zhi-blog-api" +import { JvueApiAdaptor } from "~/src/adaptors/api/jvue/jvueApiAdaptor.ts" + +/** + * 使用Jvue API的自定义hook + * + * @param key 配置键值,可选参数 + * @param newCfg 新配置信息 + * @author terwer + * @version 1.20.0 + * @since 1.20.0 + */ +export const useJvueApi = async (key?: string, newCfg?: JvueConfig) => { + // 创建应用日志记录器 + const logger = createAppLogger("use-jvue-api") + + // 记录开始使用Jvue API + logger.info("Start using Jvue API...") + + // 创建应用实例 + const appInstance = new PublisherAppInstance() + + let cfg: JvueConfig + if (newCfg) { + logger.info("Initialize with the latest newCfg passed in...") + cfg = newCfg + } else { + // 从配置中获取数据 + const { getSetting } = usePublishSettingStore() + const setting = await getSetting() + cfg = JsonUtil.safeParse(setting[key], {} as JvueConfig) + // 如果配置为空,则使用默认的环境变量值,并记录日志 + if (ObjectUtil.isEmptyObject(cfg)) { + // 从环境变量获取Jvue API的URL、用户名、认证令牌和中间件URL + const jvueHome = Utils.emptyOrDefault(process.env.VITE_JVUE_HOME, "") + const jvueApiUrl = Utils.emptyOrDefault(process.env.VITE_JVUE_API_URL, "") + const jvueUsername = Utils.emptyOrDefault(process.env.VITE_JVUE_USERNAME, "") + const jvueAuthToken = Utils.emptyOrDefault(process.env.VITE_JVUE_PASSWORD, "") + const middlewareUrl = Utils.emptyOrDefault(process.env.VITE_MIDDLEWARE_URL, LEGENCY_SHARED_PROXT_MIDDLEWARE) + cfg = new JvueConfig(jvueHome, jvueApiUrl, jvueUsername, jvueAuthToken, middlewareUrl) + logger.info("Configuration is empty, using default environment variables.") + } else { + logger.info("Using configuration from settings...") + } + // 初始化posidKey + if (StrUtil.isEmptyString(cfg.posidKey)) { + // 默认值 + cfg.posidKey = getDynPostidKey(key) + } + } + + // 标签 + cfg.tagEnabled = true + // Jvue使用多选分类 + cfg.cateEnabled = true + cfg.categoryType = CategoryTypeEnum.CategoryType_Multi + cfg.allowCateChange = true + cfg.knowledgeSpaceEnabled = false + + // 创建Jvue API适配器 + const blogApi = new JvueApiAdaptor(appInstance, cfg) + logger.info("Jvue API created successfully.", cfg) + + return { + cfg, + blogApi, + } +} diff --git a/src/adaptors/api/metaweblog/useMetaweblogApi.ts b/src/adaptors/api/metaweblog/useMetaweblogApi.ts index 23f2970..e53f63e 100644 --- a/src/adaptors/api/metaweblog/useMetaweblogApi.ts +++ b/src/adaptors/api/metaweblog/useMetaweblogApi.ts @@ -23,15 +23,16 @@ * questions. */ -import { MetaweblogConfig } from "~/src/adaptors/api/base/metaweblog/metaweblogConfig.ts" -import { createAppLogger } from "~/src/utils/appLogger.ts" -import { PublisherAppInstance } from "~/src/publisherAppInstance.ts" -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 { MetaweblogBlogApiAdaptor } from "~/src/adaptors/api/base/metaweblog/metaweblogBlogApiAdaptor.ts" -import { CategoryTypeEnum } from "zhi-blog-api" +import {MetaweblogConfig} from "~/src/adaptors/api/base/metaweblog/metaweblogConfig.ts" +import {createAppLogger} from "~/src/utils/appLogger.ts" +import {PublisherAppInstance} from "~/src/publisherAppInstance.ts" +import {usePublishSettingStore} from "~/src/stores/usePublishSettingStore.ts" +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" +import {LEGENCY_SHARED_PROXT_MIDDLEWARE} from "~/src/utils/constants.ts"; /** * 使用Metaweblog API的自定义hook @@ -58,7 +59,7 @@ export const useMetaweblogApi = async (key?: string, newCfg?: MetaweblogConfig) cfg = newCfg } else { // 从配置中获取数据 - const { getSetting } = useSettingStore() + const { getSetting } = usePublishSettingStore() const setting = await getSetting() cfg = JsonUtil.safeParse(setting[key], {} as MetaweblogConfig) // 如果配置为空,则使用默认的环境变量值,并记录日志 @@ -67,10 +68,7 @@ export const useMetaweblogApi = async (key?: string, newCfg?: MetaweblogConfig) const metaweblogApiUrl = "" const metaweblogUsername = "" const metaweblogAuthToken = "" - const middlewareUrl = Utils.emptyOrDefault( - process.env.VITE_MIDDLEWARE_URL, - "https://api.terwer.space/api/middleware" - ) + const middlewareUrl = Utils.emptyOrDefault(process.env.VITE_MIDDLEWARE_URL, LEGENCY_SHARED_PROXT_MIDDLEWARE) cfg = new MetaweblogConfig("", metaweblogApiUrl, metaweblogUsername, metaweblogAuthToken, middlewareUrl) logger.debug("Configuration is empty, using default environment variables.") diff --git a/src/adaptors/api/notion/notionApiAdaptor.ts b/src/adaptors/api/notion/notionApiAdaptor.ts index 57bba2e..c626c12 100644 --- a/src/adaptors/api/notion/notionApiAdaptor.ts +++ b/src/adaptors/api/notion/notionApiAdaptor.ts @@ -27,8 +27,9 @@ import { CategoryInfo, Post, UserBlog } from "zhi-blog-api" import { BaseBlogApi } from "~/src/adaptors/api/base/baseBlogApi.ts" import { NotionConfig } from "~/src/adaptors/api/notion/notionConfig.ts" import { createAppLogger } from "~/src/utils/appLogger.ts" -import { ObjectUtil, StrUtil } from "zhi-common" +import { ObjectUtil } from "zhi-common" import { NotionMarkdownConverter } from "zhi-notion-markdown" +import { usePublishSettingStore } from "~/src/stores/usePublishSettingStore.ts" /** * Notion API 适配器 @@ -62,8 +63,25 @@ class NotionApiAdaptor extends BaseBlogApi { return await this.createPage(post.title, post.description, pageId) } - public async editPost(postid: string, post: Post, publish?: boolean): Promise { - return await this.updatePage(postid, post.title, post.description) + public async editPost(oldPostid: string, post: Post, publish?: boolean): Promise { + await this.deletePost(oldPostid) + const newPostid = await this.newPost(post) + // ================================ + // 下面这一段是更新postid,需要注意适配 + // 写入属性到配置 + const { getSetting, updateSetting } = usePublishSettingStore() + const setting = await getSetting() + const posidKey = this.cfg.posidKey + const id = post.originalId + const postMeta = ObjectUtil.getProperty(setting, id, {}) + postMeta[posidKey] = newPostid + setting[id] = postMeta + await updateSetting(setting) + // ============================== + return true + + // Notion的原生更新不支持 + // return await this.updatePage(postid, post.title, post.description) } public async deletePost(postid: string): Promise { @@ -116,7 +134,7 @@ class NotionApiAdaptor extends BaseBlogApi { // const pageId = notionPostKey.pageId const endUrl = notionPostKey.endUrl const postUrl = purl.replace("[postid]", endUrl) - return StrUtil.pathJoin(this.cfg.home ?? "", postUrl) + return postUrl } // ================ @@ -257,7 +275,7 @@ class NotionApiAdaptor extends BaseBlogApi { // 使用兼容的fetch调用并返回统一的JSON数据 const body = ObjectUtil.isEmptyObject(params) ? {} : params - const resJson = await this.proxyFetch(apiUrl, [headers], body, method, contentType) + const resJson = await this.apiProxyFetch(apiUrl, [headers], body, method, contentType) this.logger.debug("向Notion请求数据,resJson =>", resJson) if (resJson?.status === 400 || resJson?.status === 401 || resJson?.status === 404 || resJson?.status === 429) { diff --git a/src/adaptors/api/notion/notionPlaceHolder.ts b/src/adaptors/api/notion/notionPlaceHolder.ts index 254d675..5792598 100644 --- a/src/adaptors/api/notion/notionPlaceHolder.ts +++ b/src/adaptors/api/notion/notionPlaceHolder.ts @@ -28,6 +28,6 @@ import { CommonBlogPlaceholder } from "~/src/adaptors/api/base/commonBlogPlaceho /** * Notion 配置提示 */ -class NotionPlaceHolder extends CommonBlogPlaceholder {} +class NotionPlaceholder extends CommonBlogPlaceholder {} -export { NotionPlaceHolder } +export { NotionPlaceholder } diff --git a/src/adaptors/api/notion/useNotionApi.ts b/src/adaptors/api/notion/useNotionApi.ts index d224270..35cc9b1 100644 --- a/src/adaptors/api/notion/useNotionApi.ts +++ b/src/adaptors/api/notion/useNotionApi.ts @@ -27,11 +27,12 @@ import { createAppLogger } from "~/src/utils/appLogger.ts" import { PublisherAppInstance } from "~/src/publisherAppInstance.ts" import { Utils } from "~/src/utils/utils.ts" import { NotionConfig } from "~/src/adaptors/api/notion/notionConfig.ts" -import { useSettingStore } from "~/src/stores/useSettingStore.ts" +import { usePublishSettingStore } from "~/src/stores/usePublishSettingStore.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" +import { LEGENCY_SHARED_PROXT_MIDDLEWARE } from "~/src/utils/constants.ts" const useNotionApi = async (key: string, newCfg?: NotionConfig) => { // 创建应用日志记录器 @@ -49,7 +50,7 @@ const useNotionApi = async (key: string, newCfg?: NotionConfig) => { cfg = newCfg } else { // 从配置中获取数据 - const { getSetting } = useSettingStore() + const { getSetting } = usePublishSettingStore() const setting = await getSetting() cfg = JsonUtil.safeParse(setting[key], {} as NotionConfig) @@ -57,10 +58,7 @@ const useNotionApi = async (key: string, newCfg?: NotionConfig) => { if (ObjectUtil.isEmptyObject(cfg)) { // 从环境变量获取 Notion API 的 URL、认证令牌和其他配置信息 const notionAuthToken = Utils.emptyOrDefault(process.env.VITE_NOTION_AUTH_TOKEN, "") - const middlewareUrl = Utils.emptyOrDefault( - process.env.VITE_MIDDLEWARE_URL, - "https://api.terwer.space/api/middleware" - ) + const middlewareUrl = Utils.emptyOrDefault(process.env.VITE_MIDDLEWARE_URL, LEGENCY_SHARED_PROXT_MIDDLEWARE) cfg = new NotionConfig(notionAuthToken, middlewareUrl) logger.info("Configuration is empty, using default environment variables.") } else { diff --git a/src/adaptors/api/telegraph/telegraphApiAdaptor.ts b/src/adaptors/api/telegraph/telegraphApiAdaptor.ts new file mode 100644 index 0000000..42ce02e --- /dev/null +++ b/src/adaptors/api/telegraph/telegraphApiAdaptor.ts @@ -0,0 +1,226 @@ +/* + * Copyright (c) 2024, 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 { BaseBlogApi } from "~/src/adaptors/api/base/baseBlogApi.ts" +import { Post, UserBlog } from "zhi-blog-api" +import { TelegraphConfig } from "~/src/adaptors/api/telegraph/telegraphConfig.ts" +import { JsonUtil, StrUtil } from "zhi-common" +import CookieUtils from "~/src/utils/cookieUtils.ts" +import md from "telegraph.md" + +/** + * Telegraph API 适配器 + * + * @see https://telegra.ph/ telegra.ph + */ +class TelegraphApiAdaptor extends BaseBlogApi { + private TPH_UUID_KEY = "tph_uuid" + + public async getUsersBlogs(): Promise { + const result: UserBlog[] = [] + + const checkJson = await this.telegraphFetch("/check", "page_id=0", "POST") + if (checkJson.error) { + throw new Error("telegra.ph request error =>" + checkJson.error) + } + const corsHeaders = JsonUtil.safeParse(checkJson["cors-received-headers"], {}) + const cookies = corsHeaders["Set-Cookie-Array"] + this.logger.debug("checkJson =>", checkJson) + + // 数据适配 + const userblog: UserBlog = new UserBlog() + const cfg = this.cfg as TelegraphConfig + userblog.blogid = checkJson.save_hash + userblog.blogName = "telegra.ph" + userblog.url = cfg.apiUrl + // 元数据映射 + // @since 1.20.0 + userblog.metadataMap = { + password: checkJson.save_hash, + corsCookieArray: CookieUtils.addCookieArray(this.cfg?.corsCookieArray ?? [], cookies), + } + result.push(userblog) + this.logger.debug("get telegraph cfg =>", result) + + return result + } + + public async newPost(post: Post, _publish?: boolean): Promise { + const formData = new FormData() + const content = md(post.description) + const blobData = new Blob([JSON.stringify(content)], { type: "text/plain" }) + formData.append("Data", blobData, "content.html") + formData.append("title", post.title) + formData.append("author", this.cfg.username) + formData.append("save_hash", this.cfg.password) + formData.append("page_id", "0") + + const res = await this.telegraphFormFetch("/save", formData) + if (res.error) { + throw new Error( + "telegra.ph 发布错误,注意:切换设备(包括从PC到浏览器环境)需要重新验证,并且获取新token。详细错误 =>" + + res.error + ) + } + this.logger.debug("telegraph newPost resJson =>", res) + + const postMeta = { + page_id: res.page_id, + path: res.path, + } + const postid = JSON.stringify(postMeta) + return postid + } + + public async editPost(postid: string, post: Post, publish?: boolean): Promise { + const postMeta = JsonUtil.safeParse(postid, {}) + + const formData = new FormData() + const content = md(post.description) + const blobData = new Blob([JSON.stringify(content)], { type: "text/plain" }) + formData.append("Data", blobData, "content.html") + formData.append("title", post.title) + formData.append("author", this.cfg.username) + formData.append("save_hash", this.cfg.password) + formData.append("page_id", postMeta.page_id) + + const res = await this.telegraphFormFetch("/save", formData) + if (res.error) { + throw new Error( + "telegra.ph 更新失败,注意:切换设备(包括从PC到浏览器环境)需要重新验证,并且获取新token。详细错误 =>" + + res.error + ) + } + this.logger.debug("telegraph editPost resJson =>", res) + + return true + } + + public async deletePost(postid: string): Promise { + throw new Error("telegra.ph 暂不支持删除文章功能") + } + + public async getPost(postid: string, useSlug?: boolean): Promise { + const commonPost = new Post() + commonPost.postid = postid + return commonPost + } + + public async getPreviewUrl(postid: string): Promise { + const postMeta = JsonUtil.safeParse(postid, {}) + const purl = this.cfg.previewUrl ?? "" + const postUrl = purl.replace("[postid]", postMeta?.path ?? "") + const useProxyPreview = true + if (useProxyPreview && !StrUtil.isEmptyString(this.cfg.corsAnywhereUrl)) { + const proxyHome = StrUtil.pathJoin(this.cfg.corsAnywhereUrl, this.cfg.home ?? "") + return StrUtil.pathJoin(`${proxyHome}`, postUrl) + } + return postUrl + } + + // ================ + // private methods + // ================ + /** + * 向 Telegraph 请求数据 + */ + private async telegraphFetch( + url: string, + params?: any, + method: "GET" | "POST" | "PUT" | "DELETE" = "GET", + header: Record = {} + ) { + const contentType = "text/plain" + const tphUuidObj = CookieUtils.getCookieObject(this.cfg.corsCookieArray, this.TPH_UUID_KEY) + if (!StrUtil.isEmptyString(tphUuidObj[this.TPH_UUID_KEY])) { + header["Cookie"] = `${this.TPH_UUID_KEY}=${tphUuidObj[this.TPH_UUID_KEY]}` + } + const headers = { + "Content-Type": contentType, + origin: "https://telegra.ph", + referer: "https://telegra.ph/", + ...header, + } + const body = params + + // 输出日志 + const apiUrl = `${this.cfg.apiUrl}${url}` + this.logger.debug("向 Telegraph 请求数据,apiUrl =>", apiUrl) + // 使用兼容的fetch调用并返回统一的JSON数据 + this.logger.debug("向 Telegraph 请求数据,headers =>", headers) + this.logger.debug("向 Telegraph 请求数据,body =>", body) + + const resJson = await this.apiProxyFetch(apiUrl, [headers], body, method, contentType, true) + this.logger.debug("向 Telegraph 请求数据,resJson =>", resJson) + + return resJson ?? null + } + + /** + * 向 Telegraph 发送表单数据 + * + * @param url 请求地址 + * @param formData 表单数据,默认为undefined,支持 ReadableStream、Blob | BufferSource | FormData | URLSearchParams | string。这里只需要 FormData + */ + private async telegraphFormFetch(url: string, formData: FormData) { + const apiUrl = `${this.cfg.apiUrl}${url}` + let xCorsHeaders: Record = {} + + // header + + // x-cors-headers + const tphUuidObj = CookieUtils.getCookieObject(this.cfg.corsCookieArray, this.TPH_UUID_KEY) + if (!StrUtil.isEmptyString(tphUuidObj[this.TPH_UUID_KEY])) { + xCorsHeaders["Cookie"] = `${this.TPH_UUID_KEY}=${tphUuidObj[this.TPH_UUID_KEY]}` + } + xCorsHeaders["origin"] = "https://telegra.ph" + xCorsHeaders["referer"] = "https://telegra.ph/" + + const headers = { + "x-cors-headers": JSON.stringify(xCorsHeaders), + } + const options: RequestInit = { + method: "POST", + headers: headers, + body: formData, + } + + this.logger.debug("向 Telegraph 发送表单数据,apiUrl =>", apiUrl) + this.logger.debug("向 Telegraph 发送表单数据,options =>", options) + + const resJson = await this.apiFormFetch(apiUrl, [headers], formData, true) + if (resJson.error) { + throw new Error( + "telegra.ph 发布错误,注意:切换设备(包括从PC到浏览器环境)需要重新验证,并且获取新token。详细错误 =>" + + resJson.error + ) + } + this.logger.debug("向 Telegraph 发送表单数据,resJson =>", resJson) + + return resJson + } +} + +export { TelegraphApiAdaptor } diff --git a/src/adaptors/api/telegraph/telegraphConfig.ts b/src/adaptors/api/telegraph/telegraphConfig.ts new file mode 100644 index 0000000..0f4481d --- /dev/null +++ b/src/adaptors/api/telegraph/telegraphConfig.ts @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2024, 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 { CommonBlogConfig } from "~/src/adaptors/api/base/commonBlogConfig.ts" +import { PasswordType } from "zhi-blog-api" + +/** + * Telegraph 配置 + */ +class TelegraphConfig extends CommonBlogConfig { + constructor(telegraphUrl: string, telegraphToken: string, middlewareUrl?: string) { + super(telegraphUrl, "https://edit.telegra.ph", "", telegraphToken, middlewareUrl) + + this.passwordType = PasswordType.PasswordType_Token + this.previewUrl = "/[postid]" + this.allowPreviewUrlChange = false + } +} + +export { TelegraphConfig } diff --git a/src/adaptors/api/telegraph/telegraphPlaceholder.ts b/src/adaptors/api/telegraph/telegraphPlaceholder.ts new file mode 100644 index 0000000..f37e20c --- /dev/null +++ b/src/adaptors/api/telegraph/telegraphPlaceholder.ts @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2024, 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 { CommonBlogPlaceholder } from "~/src/adaptors/api/base/commonBlogPlaceholder.ts" + +/** + * Telegraph 配置提示 + */ +class TelegraphPlaceholder extends CommonBlogPlaceholder {} + +export { TelegraphPlaceholder } diff --git a/src/adaptors/api/telegraph/useTelegraphApi.ts b/src/adaptors/api/telegraph/useTelegraphApi.ts new file mode 100644 index 0000000..c7c0123 --- /dev/null +++ b/src/adaptors/api/telegraph/useTelegraphApi.ts @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2024, 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 { TelegraphConfig } from "~/src/adaptors/api/telegraph/telegraphConfig.ts" +import { createAppLogger } from "~/src/utils/appLogger.ts" +import { PublisherAppInstance } from "~/src/publisherAppInstance.ts" +import { usePublishSettingStore } from "~/src/stores/usePublishSettingStore.ts" +import { JsonUtil, ObjectUtil, StrUtil } from "zhi-common" +import { Utils } from "~/src/utils/utils.ts" +import { getDynPostidKey } from "~/src/platforms/dynamicConfig.ts" +import { TelegraphApiAdaptor } from "~/src/adaptors/api/telegraph/telegraphApiAdaptor.ts" +import { CORS_PROXT_URL, LEGENCY_SHARED_PROXT_MIDDLEWARE } from "~/src/utils/constants.ts" + +const useTelegraphApi = async (key: string, newCfg?: TelegraphConfig) => { + const logger = createAppLogger("use-telegraph-api") + logger.info("Start using Telegraph API...") + + const appInstance = new PublisherAppInstance() + + let cfg: TelegraphConfig + if (newCfg) { + logger.info("Initialize with the latest newCfg passed in...") + cfg = newCfg + } else { + const { getSetting } = usePublishSettingStore() + const setting = await getSetting() + cfg = JsonUtil.safeParse(setting[key], {} as TelegraphConfig) + + if (ObjectUtil.isEmptyObject(cfg)) { + const telegraphUrl = Utils.emptyOrDefault(process.env.VITE_TELEGRAPH_URL, "https://telegra.ph") + const middlewareUrl = Utils.emptyOrDefault(process.env.VITE_MIDDLEWARE_URL, LEGENCY_SHARED_PROXT_MIDDLEWARE) + const telegraphToken = Utils.emptyOrDefault(process.env.VITE_TELEGRAPH_TOKEN, CORS_PROXT_URL) + cfg = new TelegraphConfig(telegraphUrl, telegraphToken, middlewareUrl) + logger.info("Configuration is empty, using default environment variables.") + } else { + logger.info("Using configuration from settings...") + } + + // 初始化posidKey + if (StrUtil.isEmptyString(cfg.posidKey)) { + // 默认值 + cfg.posidKey = getDynPostidKey(key) + } + // 初始化corsAnywhereUrl + if (StrUtil.isEmptyString(cfg.corsAnywhereUrl)) { + // 默认值 + cfg.corsAnywhereUrl = Utils.emptyOrDefault(process.env.VITE_CORS_ANYWHERE_URL, CORS_PROXT_URL) + } + } + + cfg.usernameEnabled = true + cfg.cateEnabled = false + cfg.tagEnabled = false + + const blogApi = new TelegraphApiAdaptor(appInstance, cfg) + logger.info("Telegraph API created successfully.", cfg) + + return { + cfg, + blogApi, + } +} + +export { useTelegraphApi } diff --git a/src/adaptors/api/typecho/typechoPlaceholder.ts b/src/adaptors/api/typecho/typechoPlaceholder.ts index 0394dea..fa4c9fc 100644 --- a/src/adaptors/api/typecho/typechoPlaceholder.ts +++ b/src/adaptors/api/typecho/typechoPlaceholder.ts @@ -26,7 +26,7 @@ import { MetaweblogPlaceholder } from "~/src/adaptors/api/base/metaweblog/metaweblogPlaceholder.ts" /** - * WordPress 操作提示 + * Typecho 操作提示 */ class TypechoPlaceholder extends MetaweblogPlaceholder {} diff --git a/src/adaptors/api/typecho/useTypechoApi.ts b/src/adaptors/api/typecho/useTypechoApi.ts index 9bd8d9b..08e9ab6 100644 --- a/src/adaptors/api/typecho/useTypechoApi.ts +++ b/src/adaptors/api/typecho/useTypechoApi.ts @@ -26,12 +26,13 @@ import { createAppLogger } from "~/src/utils/appLogger.ts" import { PublisherAppInstance } from "~/src/publisherAppInstance.ts" import { Utils } from "~/src/utils/utils.ts" -import { useSettingStore } from "~/src/stores/useSettingStore.ts" +import { usePublishSettingStore } from "~/src/stores/usePublishSettingStore.ts" 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" +import { LEGENCY_SHARED_PROXT_MIDDLEWARE } from "~/src/utils/constants.ts" /** * 使用Typecho API的自定义hook @@ -58,7 +59,7 @@ export const useTypechoApi = async (key?: string, newCfg?: TypechoConfig) => { cfg = newCfg } else { // 从配置中获取数据 - const { getSetting } = useSettingStore() + const { getSetting } = usePublishSettingStore() const setting = await getSetting() cfg = JsonUtil.safeParse(setting[key], {} as TypechoConfig) // 如果配置为空,则使用默认的环境变量值,并记录日志 @@ -67,10 +68,7 @@ export const useTypechoApi = async (key?: string, newCfg?: TypechoConfig) => { const typechoApiUrl = Utils.emptyOrDefault(process.env.VITE_TYPECHO_API_URL, "http://your-typecho-home.com/") const typechoUsername = Utils.emptyOrDefault(process.env.VITE_TYPECHO_USERNAME, "") const typechoAuthToken = Utils.emptyOrDefault(process.env.VITE_TYPECHO_AUTH_TOKEN, "") - const middlewareUrl = Utils.emptyOrDefault( - process.env.VITE_MIDDLEWARE_URL, - "https://api.terwer.space/api/middleware" - ) + const middlewareUrl = Utils.emptyOrDefault(process.env.VITE_MIDDLEWARE_URL, LEGENCY_SHARED_PROXT_MIDDLEWARE) cfg = new TypechoConfig(typechoApiUrl, typechoUsername, typechoAuthToken, middlewareUrl) logger.info("Configuration is empty, using default environment variables.") } else { diff --git a/src/adaptors/api/vitepress/useVitepressApi.ts b/src/adaptors/api/vitepress/useVitepressApi.ts index 60d23f2..a0688a7 100644 --- a/src/adaptors/api/vitepress/useVitepressApi.ts +++ b/src/adaptors/api/vitepress/useVitepressApi.ts @@ -25,7 +25,7 @@ import { createAppLogger } from "~/src/utils/appLogger.ts" import { PublisherAppInstance } from "~/src/publisherAppInstance.ts" -import { useSettingStore } from "~/src/stores/useSettingStore.ts" +import { usePublishSettingStore } from "~/src/stores/usePublishSettingStore.ts" import { JsonUtil, ObjectUtil, StrUtil } from "zhi-common" import { Utils } from "~/src/utils/utils.ts" import { getDynPostidKey } from "~/src/platforms/dynamicConfig.ts" @@ -33,6 +33,7 @@ import { VitepressConfig } from "~/src/adaptors/api/vitepress/vitepressConfig.ts import { VitepressApiAdaptor } from "~/src/adaptors/api/vitepress/vitepressApiAdaptor.ts" import { VitepressYamlConverterAdaptor } from "~/src/adaptors/api/vitepress/vitepressYamlConverterAdaptor.ts" import { CategoryTypeEnum } from "zhi-blog-api" +import { LEGENCY_SHARED_PROXT_MIDDLEWARE } from "~/src/utils/constants.ts" const useVitepressApi = async (key: string, newCfg?: VitepressConfig) => { // 创建应用日志记录器 @@ -50,7 +51,7 @@ const useVitepressApi = async (key: string, newCfg?: VitepressConfig) => { cfg = newCfg } else { // 从配置中获取数据 - const { getSetting } = useSettingStore() + const { getSetting } = usePublishSettingStore() const setting = await getSetting() cfg = JsonUtil.safeParse(setting[key], {} as VitepressConfig) @@ -61,10 +62,7 @@ const useVitepressApi = async (key: string, newCfg?: VitepressConfig) => { const githubAuthToken = Utils.emptyOrDefault(process.env.VITE_GITHUB_AUTH_TOKEN, "") const githubRepo = Utils.emptyOrDefault(process.env.VITE_GITHUB_REPO, "") const githubBranch = Utils.emptyOrDefault(process.env.VITE_GITHUB_BRANCH, "main") - const middlewareUrl = Utils.emptyOrDefault( - process.env.VITE_MIDDLEWARE_URL, - "https://api.terwer.space/api/middleware" - ) + const middlewareUrl = Utils.emptyOrDefault(process.env.VITE_MIDDLEWARE_URL, LEGENCY_SHARED_PROXT_MIDDLEWARE) cfg = new VitepressConfig(githubUsername, githubAuthToken, githubRepo, githubBranch, middlewareUrl) logger.info("Configuration is empty, using default environment variables.") } else { @@ -79,8 +77,6 @@ const useVitepressApi = async (key: string, newCfg?: VitepressConfig) => { // 文件规则,占位符 cfg.mdFilenameRule = "[slug].md" - cfg.useMdFilename = false - cfg.usePathCategory = false // 标签 cfg.tagEnabled = true // 分类 diff --git a/src/adaptors/api/vitepress/vitepressApiAdaptor.ts b/src/adaptors/api/vitepress/vitepressApiAdaptor.ts index 30ae332..a95488b 100644 --- a/src/adaptors/api/vitepress/vitepressApiAdaptor.ts +++ b/src/adaptors/api/vitepress/vitepressApiAdaptor.ts @@ -26,7 +26,7 @@ import { CommonGithubApiAdaptor } from "~/src/adaptors/api/base/github/commonGithubApiAdaptor.ts" import { BlogConfig, PageTypeEnum, Post, YamlConvertAdaptor } from "zhi-blog-api" import { VitepressYamlConverterAdaptor } from "~/src/adaptors/api/vitepress/vitepressYamlConverterAdaptor.ts" -import _ from "lodash" +import _ from "lodash-es" import { YamlUtil } from "zhi-common" /** @@ -45,7 +45,7 @@ class VitepressApiAdaptor extends CommonGithubApiAdaptor { // 公共的属性预处理 const doc = await super.preEditPost(post, id, publishCfg) - // HEXO 自带的处理 + // Vitepress 自带的处理 const cfg: BlogConfig = publishCfg?.cfg const updatedPost = _.cloneDeep(doc) as Post diff --git a/src/adaptors/api/vitepress/vitepressConfig.ts b/src/adaptors/api/vitepress/vitepressConfig.ts index 802ab31..dae2f38 100644 --- a/src/adaptors/api/vitepress/vitepressConfig.ts +++ b/src/adaptors/api/vitepress/vitepressConfig.ts @@ -59,8 +59,6 @@ class VitepressConfig extends CommonGithubConfig { this.allowKnowledgeSpaceChange = false this.placeholder.knowledgeSpaceReadonlyModeTip = "Vitepress 平台暂不支持修改发布目录,如需修改,请删除之后重新发布" this.knowledgeSpaceType = CategoryTypeEnum.CategoryType_Tree_Single - this.useMdFilename = false - this.usePathCategory = false } } diff --git a/src/adaptors/api/vitepress/vitepressPlaceHolder.ts b/src/adaptors/api/vitepress/vitepressPlaceHolder.ts index e07458d..d6020e5 100644 --- a/src/adaptors/api/vitepress/vitepressPlaceHolder.ts +++ b/src/adaptors/api/vitepress/vitepressPlaceHolder.ts @@ -25,6 +25,6 @@ import { CommonGithubPlaceholder } from "~/src/adaptors/api/base/github/commonGithubPlaceholder.ts" -class VitepressPlaceHolder extends CommonGithubPlaceholder {} +class VitepressPlaceholder extends CommonGithubPlaceholder {} -export { VitepressPlaceHolder } +export { VitepressPlaceholder } diff --git a/src/adaptors/api/vitepress/vitepressYamlConverterAdaptor.ts b/src/adaptors/api/vitepress/vitepressYamlConverterAdaptor.ts index d003e7e..b888eb1 100644 --- a/src/adaptors/api/vitepress/vitepressYamlConverterAdaptor.ts +++ b/src/adaptors/api/vitepress/vitepressYamlConverterAdaptor.ts @@ -38,9 +38,13 @@ import { toRaw } from "vue" class VitepressYamlConverterAdaptor extends YamlConvertAdaptor { private readonly logger = createAppLogger("vitepress-yaml-converter-adaptor") - public convertToYaml(post: Post, cfg?: BlogConfig): YamlFormatObj { + public convertToYaml(post: Post, yamlFormatObj?: YamlFormatObj, cfg?: BlogConfig): YamlFormatObj { this.logger.debug("您正在使用 Vitepress Yaml Converter", { post: toRaw(post) }) - let yamlFormatObj: YamlFormatObj = new YamlFormatObj() + // 没有的情况默认初始化一个 + if (!yamlFormatObj) { + yamlFormatObj = new YamlFormatObj() + } + // title yamlFormatObj.yamlObj.title = post.title @@ -56,20 +60,19 @@ class VitepressYamlConverterAdaptor extends YamlConvertAdaptor { yamlFormatObj.yamlObj.date = DateUtil.formatIsoToZh(post.dateCreated.toISOString(), true) // head - yamlFormatObj.yamlObj.head = [ - [ - "meta", - { - name: "description", - content: post?.shortDesc ?? "", - }, - "meta", - { - name: "keywords", - content: post?.mt_keywords?.split(",").join(" "), - }, - ], - ] + yamlFormatObj.yamlObj.head = [] + if (!StrUtil.isEmptyString(post.mt_keywords)) { + yamlFormatObj.yamlObj.head.push({ + name: "keywords", + content: post.mt_keywords.split(",").join(" "), + }) + } + if (!StrUtil.isEmptyString(post.shortDesc)) { + yamlFormatObj.yamlObj.head.push({ + name: "description", + content: post.shortDesc, + }) + } // categories if (post.categories?.length > 0) { diff --git a/src/adaptors/api/vuepress/useVuepressApi.ts b/src/adaptors/api/vuepress/useVuepressApi.ts index c564995..738324e 100644 --- a/src/adaptors/api/vuepress/useVuepressApi.ts +++ b/src/adaptors/api/vuepress/useVuepressApi.ts @@ -25,7 +25,7 @@ import { createAppLogger } from "~/src/utils/appLogger.ts" import { PublisherAppInstance } from "~/src/publisherAppInstance.ts" -import { useSettingStore } from "~/src/stores/useSettingStore.ts" +import { usePublishSettingStore } from "~/src/stores/usePublishSettingStore.ts" import { JsonUtil, ObjectUtil, StrUtil } from "zhi-common" import { Utils } from "~/src/utils/utils.ts" import { getDynPostidKey } from "~/src/platforms/dynamicConfig.ts" @@ -33,6 +33,7 @@ import { CategoryTypeEnum } from "zhi-blog-api" import { VuepressConfig } from "~/src/adaptors/api/vuepress/vuepressConfig.ts" import { VuepressYamlConverterAdaptor } from "~/src/adaptors/api/vuepress/vuepressYamlConverterAdaptor.ts" import { VuepressApiAdaptor } from "~/src/adaptors/api/vuepress/vuepressApiAdaptor.ts" +import { LEGENCY_SHARED_PROXT_MIDDLEWARE } from "~/src/utils/constants.ts" const useVuepressApi = async (key: string, newCfg?: VuepressConfig) => { // 创建应用日志记录器 @@ -50,7 +51,7 @@ const useVuepressApi = async (key: string, newCfg?: VuepressConfig) => { cfg = newCfg } else { // 从配置中获取数据 - const { getSetting } = useSettingStore() + const { getSetting } = usePublishSettingStore() const setting = await getSetting() cfg = JsonUtil.safeParse(setting[key], {} as VuepressConfig) @@ -61,10 +62,7 @@ const useVuepressApi = async (key: string, newCfg?: VuepressConfig) => { const githubAuthToken = Utils.emptyOrDefault(process.env.VITE_GITHUB_AUTH_TOKEN, "") const githubRepo = Utils.emptyOrDefault(process.env.VITE_GITHUB_REPO, "") const githubBranch = Utils.emptyOrDefault(process.env.VITE_GITHUB_BRANCH, "main") - const middlewareUrl = Utils.emptyOrDefault( - process.env.VITE_MIDDLEWARE_URL, - "https://api.terwer.space/api/middleware" - ) + const middlewareUrl = Utils.emptyOrDefault(process.env.VITE_MIDDLEWARE_URL, LEGENCY_SHARED_PROXT_MIDDLEWARE) cfg = new VuepressConfig(githubUsername, githubAuthToken, githubRepo, githubBranch, middlewareUrl) logger.info("Configuration is empty, using default environment variables.") } else { @@ -79,8 +77,6 @@ const useVuepressApi = async (key: string, newCfg?: VuepressConfig) => { // 文件规则,占位符 cfg.mdFilenameRule = "[filename].md" - cfg.useMdFilename = true - cfg.usePathCategory = true // 标签 cfg.tagEnabled = true // 分类 diff --git a/src/adaptors/api/vuepress/vuepressApiAdaptor.ts b/src/adaptors/api/vuepress/vuepressApiAdaptor.ts index bf09348..860bcf2 100644 --- a/src/adaptors/api/vuepress/vuepressApiAdaptor.ts +++ b/src/adaptors/api/vuepress/vuepressApiAdaptor.ts @@ -25,7 +25,7 @@ import { CommonGithubApiAdaptor } from "~/src/adaptors/api/base/github/commonGithubApiAdaptor.ts" import { BlogConfig, PageTypeEnum, Post, YamlConvertAdaptor } from "zhi-blog-api" -import _ from "lodash" +import _ from "lodash-es" import { VuepressYamlConverterAdaptor } from "~/src/adaptors/api/vuepress/vuepressYamlConverterAdaptor.ts" import { YamlUtil } from "zhi-common" @@ -45,7 +45,7 @@ class VuepressApiAdaptor extends CommonGithubApiAdaptor { // 公共的属性预处理 const doc = await super.preEditPost(post, id, publishCfg) - // HEXO 自带的处理 + // Vuepress 自带的处理 const cfg: BlogConfig = publishCfg?.cfg const updatedPost = _.cloneDeep(doc) as Post diff --git a/src/adaptors/api/vuepress/vuepressConfig.ts b/src/adaptors/api/vuepress/vuepressConfig.ts index c21aba7..00fc414 100644 --- a/src/adaptors/api/vuepress/vuepressConfig.ts +++ b/src/adaptors/api/vuepress/vuepressConfig.ts @@ -59,8 +59,6 @@ class VuepressConfig extends CommonGithubConfig { this.allowKnowledgeSpaceChange = false this.placeholder.knowledgeSpaceReadonlyModeTip = "Vuepress 平台暂不支持修改发布目录,如需修改,请删除之后重新发布" this.knowledgeSpaceType = CategoryTypeEnum.CategoryType_Tree_Single - this.useMdFilename = true - this.usePathCategory = true } } diff --git a/src/adaptors/api/vuepress/vuepressPlaceHolder.ts b/src/adaptors/api/vuepress/vuepressPlaceHolder.ts index ca8dd4f..2087274 100644 --- a/src/adaptors/api/vuepress/vuepressPlaceHolder.ts +++ b/src/adaptors/api/vuepress/vuepressPlaceHolder.ts @@ -25,6 +25,6 @@ import { CommonGithubPlaceholder } from "~/src/adaptors/api/base/github/commonGithubPlaceholder.ts" -class VuepressPlaceHolder extends CommonGithubPlaceholder {} +class VuepressPlaceholder extends CommonGithubPlaceholder {} -export { VuepressPlaceHolder } +export { VuepressPlaceholder } diff --git a/src/adaptors/api/vuepress/vuepressYamlConverterAdaptor.ts b/src/adaptors/api/vuepress/vuepressYamlConverterAdaptor.ts index 6f12858..ddc5016 100644 --- a/src/adaptors/api/vuepress/vuepressYamlConverterAdaptor.ts +++ b/src/adaptors/api/vuepress/vuepressYamlConverterAdaptor.ts @@ -39,9 +39,13 @@ import { toRaw } from "vue" class VuepressYamlConverterAdaptor extends YamlConvertAdaptor { private readonly logger = createAppLogger("vuepress-yaml-converter-adaptor") - public convertToYaml(post: Post, cfg?: BlogConfig): YamlFormatObj { + public convertToYaml(post: Post, yamlFormatObj?: YamlFormatObj, cfg?: BlogConfig): YamlFormatObj { this.logger.debug("您正在使用 Vuepress Yaml Converter", { post: toRaw(post) }) - let yamlFormatObj: YamlFormatObj = new YamlFormatObj() + // 没有的情况默认初始化一个 + if (!yamlFormatObj) { + yamlFormatObj = new YamlFormatObj() + } + // title yamlFormatObj.yamlObj.title = post.title @@ -49,16 +53,19 @@ class VuepressYamlConverterAdaptor extends YamlConvertAdaptor { yamlFormatObj.yamlObj.date = DateUtil.formatIsoToZh(post.dateCreated.toISOString(), true) // meta - yamlFormatObj.yamlObj.meta = [ - { + yamlFormatObj.yamlObj.meta = [] + if (!StrUtil.isEmptyString(post.mt_keywords)) { + yamlFormatObj.yamlObj.meta.push({ name: "keywords", - content: post.mt_keywords.split(",").join(" "), - }, - { + content: post.mt_keywords.split(",").join(" ") || "", + }) + } + if (!StrUtil.isEmptyString(post.shortDesc)) { + yamlFormatObj.yamlObj.meta.push({ name: "description", - content: post.shortDesc ?? "", - }, - ] + content: post.shortDesc, + }) + } // tags if (!StrUtil.isEmptyString(post.mt_keywords)) { @@ -78,9 +85,9 @@ class VuepressYamlConverterAdaptor extends YamlConvertAdaptor { } // author - let githubUrl = "https://github.com/terwer" const githubCfg = cfg as CommonGithubConfig - if (githubCfg.home) { + let githubUrl = githubCfg.site + if (StrUtil.isEmptyString(githubCfg.site)) { githubUrl = StrUtil.pathJoin(githubCfg.home, "/" + githubCfg.username) } yamlFormatObj.yamlObj.author = { @@ -88,6 +95,11 @@ class VuepressYamlConverterAdaptor extends YamlConvertAdaptor { link: githubUrl, } + // 日记 + if (post?.title?.includes("[日记]")) { + yamlFormatObj.yamlObj.article = false + } + // formatter let yaml = YamlUtil.obj2Yaml(yamlFormatObj.yamlObj) this.logger.debug("yaml=>", yaml) diff --git a/src/adaptors/api/vuepress2/useVuepress2Api.ts b/src/adaptors/api/vuepress2/useVuepress2Api.ts index 7fd7375..7ad38a8 100644 --- a/src/adaptors/api/vuepress2/useVuepress2Api.ts +++ b/src/adaptors/api/vuepress2/useVuepress2Api.ts @@ -25,7 +25,7 @@ import { createAppLogger } from "~/src/utils/appLogger.ts" import { PublisherAppInstance } from "~/src/publisherAppInstance.ts" -import { useSettingStore } from "~/src/stores/useSettingStore.ts" +import { usePublishSettingStore } from "~/src/stores/usePublishSettingStore.ts" import { JsonUtil, ObjectUtil, StrUtil } from "zhi-common" import { Utils } from "~/src/utils/utils.ts" import { getDynPostidKey } from "~/src/platforms/dynamicConfig.ts" @@ -33,6 +33,7 @@ import { Vuepress2Config } from "~/src/adaptors/api/vuepress2/vuepress2Config.ts import { Vuepress2ApiAdaptor } from "~/src/adaptors/api/vuepress2/vuepress2ApiAdaptor.ts" import { Vuepress2YamlConverterAdaptor } from "~/src/adaptors/api/vuepress2/vuepress2YamlConverterAdaptor.ts" import { CategoryTypeEnum } from "zhi-blog-api" +import { LEGENCY_SHARED_PROXT_MIDDLEWARE } from "~/src/utils/constants.ts" const useVuepress2Api = async (key: string, newCfg?: Vuepress2Config) => { // 创建应用日志记录器 @@ -50,7 +51,7 @@ const useVuepress2Api = async (key: string, newCfg?: Vuepress2Config) => { cfg = newCfg } else { // 从配置中获取数据 - const { getSetting } = useSettingStore() + const { getSetting } = usePublishSettingStore() const setting = await getSetting() cfg = JsonUtil.safeParse(setting[key], {} as Vuepress2Config) @@ -61,10 +62,7 @@ const useVuepress2Api = async (key: string, newCfg?: Vuepress2Config) => { const githubAuthToken = Utils.emptyOrDefault(process.env.VITE_GITHUB_AUTH_TOKEN, "") const githubRepo = Utils.emptyOrDefault(process.env.VITE_GITHUB_REPO, "") const githubBranch = Utils.emptyOrDefault(process.env.VITE_GITHUB_BRANCH, "main") - const middlewareUrl = Utils.emptyOrDefault( - process.env.VITE_MIDDLEWARE_URL, - "https://api.terwer.space/api/middleware" - ) + const middlewareUrl = Utils.emptyOrDefault(process.env.VITE_MIDDLEWARE_URL, LEGENCY_SHARED_PROXT_MIDDLEWARE) cfg = new Vuepress2Config(githubUsername, githubAuthToken, githubRepo, githubBranch, middlewareUrl) logger.info("Configuration is empty, using default environment variables.") } else { @@ -79,8 +77,6 @@ const useVuepress2Api = async (key: string, newCfg?: Vuepress2Config) => { // 文件规则,占位符 cfg.mdFilenameRule = "[slug].md" - cfg.useMdFilename = false - cfg.usePathCategory = false // 标签 cfg.tagEnabled = true // 分类 diff --git a/src/adaptors/api/vuepress2/vuepress2ApiAdaptor.ts b/src/adaptors/api/vuepress2/vuepress2ApiAdaptor.ts index e78ab7d..961b5d5 100644 --- a/src/adaptors/api/vuepress2/vuepress2ApiAdaptor.ts +++ b/src/adaptors/api/vuepress2/vuepress2ApiAdaptor.ts @@ -26,7 +26,7 @@ import { CommonGithubApiAdaptor } from "~/src/adaptors/api/base/github/commonGithubApiAdaptor.ts" import { BlogConfig, PageTypeEnum, Post, YamlConvertAdaptor } from "zhi-blog-api" import { Vuepress2YamlConverterAdaptor } from "~/src/adaptors/api/vuepress2/vuepress2YamlConverterAdaptor.ts" -import _ from "lodash" +import _ from "lodash-es" import { YamlUtil } from "zhi-common" /** @@ -45,7 +45,7 @@ class Vuepress2ApiAdaptor extends CommonGithubApiAdaptor { // 公共的属性预处理 const doc = await super.preEditPost(post, id, publishCfg) - // HEXO 自带的处理 + // Vuepress2 自带的处理 const cfg: BlogConfig = publishCfg?.cfg const updatedPost = _.cloneDeep(doc) as Post diff --git a/src/adaptors/api/vuepress2/vuepress2Config.ts b/src/adaptors/api/vuepress2/vuepress2Config.ts index b84db2f..a8c4114 100644 --- a/src/adaptors/api/vuepress2/vuepress2Config.ts +++ b/src/adaptors/api/vuepress2/vuepress2Config.ts @@ -59,8 +59,6 @@ class Vuepress2Config extends CommonGithubConfig { this.allowKnowledgeSpaceChange = false this.placeholder.knowledgeSpaceReadonlyModeTip = "Vuepress2 平台暂不支持修改发布目录,如需修改,请删除之后重新发布" this.knowledgeSpaceType = CategoryTypeEnum.CategoryType_Tree_Single - this.useMdFilename = false - this.usePathCategory = false } } diff --git a/src/adaptors/api/vuepress2/vuepress2PlaceHolder.ts b/src/adaptors/api/vuepress2/vuepress2PlaceHolder.ts index 0d75478..c6ee30d 100644 --- a/src/adaptors/api/vuepress2/vuepress2PlaceHolder.ts +++ b/src/adaptors/api/vuepress2/vuepress2PlaceHolder.ts @@ -25,6 +25,6 @@ import { CommonGithubPlaceholder } from "~/src/adaptors/api/base/github/commonGithubPlaceholder.ts" -class Vuepress2PlaceHolder extends CommonGithubPlaceholder {} +class Vuepress2Placeholder extends CommonGithubPlaceholder {} -export { Vuepress2PlaceHolder } +export { Vuepress2Placeholder } diff --git a/src/adaptors/api/vuepress2/vuepress2YamlConverterAdaptor.ts b/src/adaptors/api/vuepress2/vuepress2YamlConverterAdaptor.ts index 9f3e0a4..47ef45f 100644 --- a/src/adaptors/api/vuepress2/vuepress2YamlConverterAdaptor.ts +++ b/src/adaptors/api/vuepress2/vuepress2YamlConverterAdaptor.ts @@ -42,12 +42,17 @@ class Vuepress2YamlConverterAdaptor extends YamlConvertAdaptor { * 将文章转换为YAML格式对象 * * @param post - 要转换的文章对象 + * @param yamlFormatObj (可选) * @param cfg - 博客配置(可选) * @returns 返回YAML格式对象 */ - public convertToYaml(post: Post, cfg?: BlogConfig): YamlFormatObj { + public convertToYaml(post: Post, yamlFormatObj?: YamlFormatObj, cfg?: BlogConfig): YamlFormatObj { this.logger.debug("您正在使用 Vuepress2 Yaml Converter", { post: toRaw(post) }) - let yamlFormatObj: YamlFormatObj = new YamlFormatObj() + // 没有的情况默认初始化一个 + if (!yamlFormatObj) { + yamlFormatObj = new YamlFormatObj() + } + // title yamlFormatObj.yamlObj.title = post.title diff --git a/src/adaptors/api/wordpress/useWordpressApi.ts b/src/adaptors/api/wordpress/useWordpressApi.ts index 5aea424..a5086ab 100644 --- a/src/adaptors/api/wordpress/useWordpressApi.ts +++ b/src/adaptors/api/wordpress/useWordpressApi.ts @@ -26,12 +26,13 @@ import { createAppLogger } from "~/src/utils/appLogger.ts" import { PublisherAppInstance } from "~/src/publisherAppInstance.ts" import { Utils } from "~/src/utils/utils.ts" -import { useSettingStore } from "~/src/stores/useSettingStore.ts" +import { usePublishSettingStore } from "~/src/stores/usePublishSettingStore.ts" 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" +import { LEGENCY_SHARED_PROXT_MIDDLEWARE } from "~/src/utils/constants.ts" /** * 使用Wordpress API的自定义hook @@ -58,7 +59,7 @@ export const useWordpressApi = async (key?: string, newCfg?: WordpressConfig) => cfg = newCfg } else { // 从配置中获取数据 - const { getSetting } = useSettingStore() + const { getSetting } = usePublishSettingStore() const setting = await getSetting() cfg = JsonUtil.safeParse(setting[key], {} as WordpressConfig) // 如果配置为空,则使用默认的环境变量值,并记录日志 @@ -67,10 +68,7 @@ export const useWordpressApi = async (key?: string, newCfg?: WordpressConfig) => const wordpressApiUrl = Utils.emptyOrDefault(process.env.VITE_WORDPRESS_API_URL, "http://your-wordpress-home.com") const wordpressUsername = Utils.emptyOrDefault(process.env.VITE_WORDPRESS_USERNAME, "") const wordpressAuthToken = Utils.emptyOrDefault(process.env.VITE_WORDPRESS_AUTH_TOKEN, "") - const middlewareUrl = Utils.emptyOrDefault( - process.env.VITE_MIDDLEWARE_URL, - "https://api.terwer.space/api/middleware" - ) + const middlewareUrl = Utils.emptyOrDefault(process.env.VITE_MIDDLEWARE_URL, LEGENCY_SHARED_PROXT_MIDDLEWARE) cfg = new WordpressConfig(wordpressApiUrl, wordpressUsername, wordpressAuthToken, middlewareUrl) logger.info("Configuration is empty, using default environment variables.") } else { diff --git a/src/adaptors/api/yinxiang/yinxiangConfig.ts b/src/adaptors/api/yinxiang/yinxiangConfig.ts new file mode 100644 index 0000000..565da02 --- /dev/null +++ b/src/adaptors/api/yinxiang/yinxiangConfig.ts @@ -0,0 +1,53 @@ +/* + * 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 { PageTypeEnum, PasswordType } from "zhi-blog-api" +import { CommonBlogConfig } from "~/src/adaptors/api/base/commonBlogConfig.ts" + +/** + * 印象笔记配置 + */ +class YinxiangConfig extends CommonBlogConfig { + constructor(username: string, password: string, middlewareUrl?: string) { + super("https://dev.yinxiang.com/doc/", "https://dev.yinxiang.com/doc/api/v2", username, password, middlewareUrl) + + this.tokenSettingUrl = "https://dev.yinxiang.com/doc/settings/tokens" + this.showTokenTip = true + this.previewUrl = "/notebook/[notebook]/note/[noteid]" + this.pageType = PageTypeEnum.Html + this.usernameEnabled = true + this.passwordType = PasswordType.PasswordType_Cookie + this.allowPreviewUrlChange = false + this.tagEnabled = false + this.cateEnabled = false + this.knowledgeSpaceEnabled = true + this.knowledgeSpaceTitle = "笔记本" + this.allowKnowledgeSpaceChange = false + this.placeholder.knowledgeSpaceReadonlyModeTip = + "由于印象笔记平台的限制,暂时不支持编辑所属笔记本。如果您想移动笔记,请先取消删除该笔记,然后重新选择新的笔记本发布" + } +} + +export { YinxiangConfig } diff --git a/src/adaptors/api/yuque/useYuqueApi.ts b/src/adaptors/api/yuque/useYuqueApi.ts index e627360..6377c82 100644 --- a/src/adaptors/api/yuque/useYuqueApi.ts +++ b/src/adaptors/api/yuque/useYuqueApi.ts @@ -27,11 +27,12 @@ import { createAppLogger } from "~/src/utils/appLogger.ts" import { PublisherAppInstance } from "~/src/publisherAppInstance.ts" import { Utils } from "~/src/utils/utils.ts" import { YuqueConfig } from "~/src/adaptors/api/yuque/yuqueConfig.ts" -import { useSettingStore } from "~/src/stores/useSettingStore.ts" +import { usePublishSettingStore } from "~/src/stores/usePublishSettingStore.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" +import { LEGENCY_SHARED_PROXT_MIDDLEWARE } from "~/src/utils/constants.ts" const useYuqueApi = async (key: string, newCfg?: YuqueConfig) => { // 创建应用日志记录器 @@ -49,7 +50,7 @@ const useYuqueApi = async (key: string, newCfg?: YuqueConfig) => { cfg = newCfg } else { // 从配置中获取数据 - const { getSetting } = useSettingStore() + const { getSetting } = usePublishSettingStore() const setting = await getSetting() cfg = JsonUtil.safeParse(setting[key], {} as YuqueConfig) @@ -58,10 +59,7 @@ const useYuqueApi = async (key: string, newCfg?: YuqueConfig) => { // 从环境变量获取 Yuque API 的 URL、认证令牌和其他配置信息 const yuqueUsername = Utils.emptyOrDefault(process.env.VITE_YUQUE_USERNAME, "") const yuqueAuthToken = Utils.emptyOrDefault(process.env.VITE_YUQUE_AUTH_TOKEN, "") - const middlewareUrl = Utils.emptyOrDefault( - process.env.VITE_MIDDLEWARE_URL, - "https://api.terwer.space/api/middleware" - ) + const middlewareUrl = Utils.emptyOrDefault(process.env.VITE_MIDDLEWARE_URL, LEGENCY_SHARED_PROXT_MIDDLEWARE) cfg = new YuqueConfig(yuqueUsername, yuqueAuthToken, middlewareUrl) logger.info("Configuration is empty, using default environment variables.") } else { diff --git a/src/adaptors/api/yuque/yuqueApiAdaptor.ts b/src/adaptors/api/yuque/yuqueApiAdaptor.ts index af16894..a94a09a 100644 --- a/src/adaptors/api/yuque/yuqueApiAdaptor.ts +++ b/src/adaptors/api/yuque/yuqueApiAdaptor.ts @@ -124,7 +124,7 @@ class YuqueApiAdaptor extends BaseBlogApi { const docId = yuquePostidKey.docId const repo = yuquePostidKey.docRepo ?? this.cfg.blogid ?? "" const postUrl = purl.replace("[postid]", docId).replace("[notebook]", repo) - return StrUtil.pathJoin(this.cfg.home ?? "", postUrl) + return postUrl } // ================ @@ -299,7 +299,7 @@ class YuqueApiAdaptor extends BaseBlogApi { // 使用兼容的fetch调用并返回统一的JSON数据 const body = ObjectUtil.isEmptyObject(params) ? "" : JSON.stringify(params) - const resJson = await this.proxyFetch(apiUrl, [headers], body, method, contentType) + const resJson = await this.apiProxyFetch(apiUrl, [headers], body, method, contentType) this.logger.debug("向语雀请求数据,resJson =>", resJson) if (resJson?.status === 401) { diff --git a/src/adaptors/api/yuque/yuquePlaceHolder.ts b/src/adaptors/api/yuque/yuquePlaceHolder.ts index b370f49..e64d3a5 100644 --- a/src/adaptors/api/yuque/yuquePlaceHolder.ts +++ b/src/adaptors/api/yuque/yuquePlaceHolder.ts @@ -28,6 +28,6 @@ import { CommonBlogPlaceholder } from "~/src/adaptors/api/base/commonBlogPlaceho /** * Yuque 配置提示 */ -class YuquePlaceHolder extends CommonBlogPlaceholder {} +class YuquePlaceholder extends CommonBlogPlaceholder {} -export { YuquePlaceHolder } +export { YuquePlaceholder } diff --git a/src/adaptors/base/baseExtendApi.ts b/src/adaptors/base/baseExtendApi.ts index 204f7b9..9cd6b65 100644 --- a/src/adaptors/base/baseExtendApi.ts +++ b/src/adaptors/base/baseExtendApi.ts @@ -29,28 +29,40 @@ import { BaseBlogApi } from "~/src/adaptors/api/base/baseBlogApi.ts" import { BaseWebApi } from "~/src/adaptors/web/base/baseWebApi.ts" import { BlogConfig, + CategoryInfo, MediaObject, + PageEditMode, PageTypeEnum, Post, PostUtil, + TagInfo, WebApi, + WebConfig, YamlConvertAdaptor, YamlFormatObj, + YamlStrategy, } from "zhi-blog-api" import { createAppLogger, ILogger } from "~/src/utils/appLogger.ts" import { LuteUtil } from "~/src/utils/luteUtil.ts" import { usePicgoBridge } from "~/src/composables/usePicgoBridge.ts" -import { base64ToBuffer, remoteImageToBase64Info, toBase64Info } from "~/src/utils/polyfillUtils.ts" -import { DateUtil, HtmlUtil, StrUtil, YamlUtil } from "zhi-common" +import { base64ToBuffer, path, remoteImageToBase64Info, toBase64Info } from "~/src/utils/polyfillUtils.ts" +import { DateUtil, HtmlUtil, ObjectUtil, StrUtil, YamlUtil } from "zhi-common" import { useSiyuanDevice } from "~/src/composables/useSiyuanDevice.ts" import { isFileExists } from "~/src/utils/siyuanUtils.ts" import { useSiyuanApi } from "~/src/composables/useSiyuanApi.ts" -import { SiyuanKernelApi } from "zhi-siyuan-api" -import { DynamicConfig } from "~/src/platforms/dynamicConfig.ts" -import { MUST_USE_OWN_PLATFORM, MUST_USE_PICBED_PLATFORM } from "~/src/utils/constants.ts" +import { SiyuanAttr, SiyuanKernelApi } from "zhi-siyuan-api" +import { DynamicConfig, getDynPlatformKeyFromPostidKey } from "~/src/platforms/dynamicConfig.ts" +import { + CATE_AUTO_NAME, + LEGENCY_SHARED_PROXT_MIDDLEWARE, + MUST_USE_OWN_PLATFORM, + MUST_USE_PICBED_PLATFORM, +} from "~/src/utils/constants.ts" import { toRaw } from "vue" -import _ from "lodash" -import { usePublishPreferenceSetting } from "~/src/stores/usePublishPreferenceSetting.ts" +import _ from "lodash-es" +import { usePreferenceSettingStore } from "~/src/stores/usePreferenceSettingStore.ts" +import { SypConfig } from "~/syp.config.ts" +import { usePlatformMetadataStore } from "~/src/stores/usePlatformMetadataStore.ts" /** * 各种模式共享的扩展基类 @@ -61,19 +73,22 @@ import { usePublishPreferenceSetting } from "~/src/stores/usePublishPreferenceSe class BaseExtendApi extends WebApi implements IBlogApi, IWebApi { private readonly logger: ILogger private readonly api: BaseBlogApi | BaseWebApi + private readonly cfg: BlogConfig | WebConfig protected readonly picgoBridge: any private readonly isSiyuanOrSiyuanNewWin: boolean - private readonly kernelApi: SiyuanKernelApi + public readonly kernelApi: SiyuanKernelApi /** * 构造函数用于创建一个新的实例 * * @param api - 一个 BaseBlogApi 或 BaseWebApi 实例,用于与 API 进行通信 + * @param cfg - 一个 BlogConfig 或 WebConfig 实例,用于配置 */ - constructor(api: BaseBlogApi | BaseWebApi) { + constructor(api: BaseBlogApi | BaseWebApi, cfg: BlogConfig | WebConfig) { super() this.logger = createAppLogger("base-extend-api") this.api = api + this.cfg = cfg this.picgoBridge = usePicgoBridge() const { isInSiyuanOrSiyuanNewWin } = useSiyuanDevice() @@ -108,6 +123,37 @@ class BaseExtendApi extends WebApi implements IBlogApi, IWebApi { return post } + public async getCategories(keyword?: string): Promise { + const cats = [] as CategoryInfo[] + const { getPlatformMetadata } = usePlatformMetadataStore() + const platformKey = getDynPlatformKeyFromPostidKey(this.cfg.posidKey) + const { categories } = getPlatformMetadata(platformKey) + + categories.forEach((item: any) => { + const cat = new CategoryInfo() + cat.categoryId = item + cat.categoryName = item + cats.push(cat) + }) + return cats + } + + public async getTags(): Promise { + const tagInfos = [] as TagInfo[] + const { getPlatformMetadata } = usePlatformMetadataStore() + const platformKey = getDynPlatformKeyFromPostidKey(this.cfg.posidKey) + const { tags } = getPlatformMetadata(platformKey) + + tags.forEach((item: any) => { + const tag = new TagInfo() + tag.tagId = item + tag.tagName = item + tagInfos.push(tag) + }) + + return tagInfos + } + // ================ // private methods // ================ @@ -124,6 +170,9 @@ class BaseExtendApi extends WebApi implements IBlogApi, IWebApi { const post = _.cloneDeep(doc) as Post if (cfg?.mdFilenameRule) { + if (cfg?.mdFilenameRule?.includes("[filename]")) { + cfg.useMdFilename = true + } // 处理文件规则 const created = DateUtil.formatIsoToZhDate(post.dateCreated.toISOString(), true) const datearr = created.split(" ")[0] @@ -133,27 +182,27 @@ class BaseExtendApi extends WebApi implements IBlogApi, IWebApi { const d = numarr[2] this.logger.debug("created numarr=>", numarr) - let filename = cfg.mdFilenameRule.replace(/\.md/g, "") + let filename = cfg.mdFilenameRule if (cfg.useMdFilename) { // 使用真实文件名作为MD文件名 - filename = filename.replace(/\[filename\]/g, post.title) + filename = filename.replace(/\[filename]/g, post.originalTitle) } else { // 使用别名作为MD文件名 - filename = filename.replace(/\[slug\]/g, post.wp_slug) + filename = filename.replace(/\[slug]/g, post.wp_slug) } // 年月日 filename = filename - .replace(/\[yyyy\]/g, y) - .replace(/\[MM\]/g, m) - .replace(/\[mm\]/g, m) - .replace(/\[dd\]/g, d) + .replace(/\[yyyy]/g, y) + .replace(/\[MM]/g, m) + .replace(/\[mm]/g, m) + .replace(/\[dd]/g, d) post.mdFilename = filename } - const { getReadOnlyPublishPreferenceSetting } = usePublishPreferenceSetting() + const { getReadOnlyPublishPreferenceSetting } = usePreferenceSettingStore() const pref = getReadOnlyPublishPreferenceSetting() if (pref.value.fixTitle) { - post.title = HtmlUtil.removeTitleNumber(post.title) + post.title = HtmlUtil.removeTitleNumber(post.title).replace(/\.md/g, "") } this.logger.debug("处理MD文件名完成,post", { post: toRaw(post) }) @@ -192,11 +241,28 @@ class BaseExtendApi extends WebApi implements IBlogApi, IWebApi { const savePath = post.cate_slugs?.[0] ?? cfg.blogid const pathCates = [] + + // 笔记层级作为文件路径 + if (savePath?.toString().includes(CATE_AUTO_NAME)) { + cfg.usePathCategory = true + } + // 获取笔记层级 + const save_dir = path.dirname(post.link) + // 使用层级作为文件保存路径 if (cfg.usePathCategory) { - const docPathArray = savePath.split("/") + // 自动映射分类 + const autoDir = path.join(savePath.replace(CATE_AUTO_NAME, ""), save_dir) + post.cate_slugs = [autoDir] + + // 笔记层级作为分类 + const docPathArray = save_dir.split("/") if (docPathArray.length > 1) { for (let i = 1; i < docPathArray.length; i++) { - const docCate = HtmlUtil.removeTitleNumber(docPathArray[i]) + const docPath = docPathArray[i] + if (StrUtil.isEmptyString(docPath)) { + continue + } + const docCate = HtmlUtil.removeTitleNumber(docPath) pathCates.push(docCate) } } @@ -223,6 +289,7 @@ class BaseExtendApi extends WebApi implements IBlogApi, IWebApi { */ private async handleMd(doc: Post, id?: string, publishCfg?: any) { const cfg: BlogConfig = publishCfg?.cfg + const setting: typeof SypConfig = publishCfg?.setting const post = _.cloneDeep(doc) as Post // 处理MD @@ -233,14 +300,121 @@ class BaseExtendApi extends WebApi implements IBlogApi, IWebApi { // 处理标记 // #691 闪卡标记渲染成Markdown之后去除== - md = md.replace(/==([^=]+)==/g, '$1') + // md = md.replace(/==([^=]+)==/g, '$1') + md = this.replaceMarks(md) + + // 处理加粗 + // #821 html发布的时候会出现有些格式没有转化 + // **这里是加粗** + // 这里是加粗 + // md = md.replace(/\*\*(.*?)\*\*/g, '$1') + md = this.replaceBold(md) + + // 处理外链 + const { getReadOnlyPublishPreferenceSetting } = usePreferenceSettingStore() + const pref = getReadOnlyPublishPreferenceSetting() + const outerLinkRegex = /\[(.+?)]\(siyuan:\/\/blocks\/(\d+-\w+)\)/g + md = await this.replaceOuterLinks(md, outerLinkRegex, { pref, cfg, setting }) // 汇总结果 post.markdown = md this.logger.debug("markdown处理完毕,post", { post: toRaw(post) }) + return post } + /** + * 替换标记 + * + * @param md + * @protected + */ + private replaceMarks(md: string) { + // 匹配代码块 + let codeBlockRegex = /```[\s\S]*?```/g + + // 将代码块替换为占位符,避免在后续处理中受到影响 + let placeholders = [] + md = md.replace(codeBlockRegex, function (match) { + let placeholder = `CODE_BLOCK_${placeholders.length}` + placeholders.push(match) + return placeholder + }) + + // 匹配行内代码块 + let inlineCodeRegex = /`[^`]*`/g + let inlineCodePlaceholders = [] + md = md.replace(inlineCodeRegex, function (match) { + let placeholder = `INLINE_CODE_${inlineCodePlaceholders.length}` + inlineCodePlaceholders.push(match) + return placeholder + }) + + // 正则表达式,匹配严格符合 == 开始和结束的部分,但不在代码块和行内代码块内 + let regex = /(?$1') + + // 将代码块恢复回去 + for (let i = 0; i < placeholders.length; i++) { + md = md.replace(`CODE_BLOCK_${i}`, placeholders[i]) + } + + // 将行内代码块恢复回去 + for (let i = 0; i < inlineCodePlaceholders.length; i++) { + md = md.replace(`INLINE_CODE_${i}`, inlineCodePlaceholders[i]) + } + + return md + } + + /** + * 处理加粗 + * + * @param md + * @private + */ + private replaceBold(md: string) { + // 匹配代码块 + let codeBlockRegex = /```[\s\S]*?```/g + + // 将代码块替换为占位符,避免在后续处理中受到影响 + let placeholders = [] + md = md.replace(codeBlockRegex, function (match) { + let placeholder = `CODE_BLOCK_${placeholders.length}` + placeholders.push(match) + return placeholder + }) + + // 匹配行内代码块 + let inlineCodeRegex = /`[^`]*`/g + let inlineCodePlaceholders = [] + md = md.replace(inlineCodeRegex, function (match) { + let placeholder = `INLINE_CODE_${inlineCodePlaceholders.length}` + inlineCodePlaceholders.push(match) + return placeholder + }) + + // 正则表达式,匹配严格符合 ** 开始和结束的部分,但不在代码块和行内代码块内 + let regex = /(?$1') + + // 将代码块恢复回去 + for (let i = 0; i < placeholders.length; i++) { + md = md.replace(`CODE_BLOCK_${i}`, placeholders[i]) + } + + // 将行内代码块恢复回去 + for (let i = 0; i < inlineCodePlaceholders.length; i++) { + md = md.replace(`INLINE_CODE_${i}`, inlineCodePlaceholders[i]) + } + + return md + } + /** * 处理其他属性 * @@ -278,35 +452,90 @@ class BaseExtendApi extends WebApi implements IBlogApi, IWebApi { this.logger.debug("开始处理yaml,post", { post: toRaw(post) }) - // 前面改过属性,需要再生成一次 const yamlAdaptor: YamlConvertAdaptor = this.api.getYamlAdaptor() - if (null !== yamlAdaptor) { - // 先生成对应平台的yaml - const yamlObj: YamlFormatObj = yamlAdaptor.convertToYaml(post, cfg) - // 同步发布内容 - post.yaml = yamlObj.formatter - post.markdown = yamlObj.mdFullContent - post.html = yamlObj.htmlContent - this.logger.info("rehandled yaml using YamlConverterAdaptor") - } else { - // 同步发布内容 - const yamlObj = PostUtil.toYamlObj(post) - const yaml = YamlUtil.obj2Yaml(yamlObj) - const md = YamlUtil.extractMarkdown(post.markdown) - post.yaml = yaml - post.markdown = md - post.html = LuteUtil.mdToHtml(md) - this.logger.info("yaml adaptor not found, using default") + switch (post.yamlType) { + case YamlStrategy.Yaml_custom_auto: { + // 先生成对应平台的yaml + const yfmObj = yamlAdaptor.convertToYaml(post, undefined, cfg) + // 同步发布内容 + post.yaml = yfmObj.formatter + post.markdown = yfmObj.mdFullContent + post.html = yfmObj.htmlContent + this.logger.info("rehandled yaml using YamlConverterAdaptor") + break + } + case YamlStrategy.Yaml_custom_hand: { + const defaultYaml = post.yaml + if ( + this.checkPropertiesStartsWith(defaultYaml, "siyuan://") || + post.editMode !== PageEditMode.EditMode_source + ) { + // 属性合并 + const newYfmObj = new YamlFormatObj() + const newYamlObj = await YamlUtil.yaml2ObjAsync(post.yaml) + newYfmObj.yamlObj = newYamlObj + const yfmObj = yamlAdaptor.convertToYaml(post, newYfmObj, cfg) + // 同步发布内容 + post.yaml = yfmObj.formatter + post.markdown = yfmObj.mdFullContent + post.html = yfmObj.htmlContent + this.logger.info("assign latest custom yaml to md") + } else { + this.logger.info("assert yaml is saved by source mode, ignore") + } + break + } + default: { + // 1、批量分发,此时 apiType 为空 + // 2、某些平台没有适配器 + // 这些情况生成默认的 + // 最新发布内容 + const yamlObj = PostUtil.toYamlObj(post) + const yaml = YamlUtil.obj2Yaml(yamlObj) + const md = YamlUtil.extractMarkdown(post.markdown) + post.yaml = yaml + post.markdown = md + post.html = LuteUtil.mdToHtml(md) + this.logger.info("yaml adaptor not found, using default") + break + } } - // YAML与MD的处理,旧的逻辑,不考虑属性变更的情况 + // // 前面改过属性,需要再生成一次 + // const yamlAdaptor: YamlConvertAdaptor = this.api.getYamlAdaptor() // if (null !== yamlAdaptor) { - // const md = YamlUtil.extractMarkdown(post.markdown) - // const yaml = post.yaml - // post.markdown = YamlUtil.addYamlToMd(yaml, md) - // this.logger.info("检测到该平台已开启YAML适配器,已附加YAML到Markdown正文") + // let yamlObj: YamlFormatObj + // const defaultYaml = await YamlUtil.yaml2ObjAsync(post.yaml) + // // 不确定那个字段才代表,所以全部检测一遍 + // // 非源码模式还是需要转换的 + // if ( + // this.checkPropertiesStartsWith(defaultYaml, "siyuan://") || + // post.editMode === PageEditMode.EditMode_simple || + // post.editMode === PageEditMode.EditMode_complex + // ) { + // // 先生成对应平台的yaml + // yamlObj = yamlAdaptor.convertToYaml(post,undefined, cfg) + // // 同步发布内容 + // post.yaml = yamlObj.formatter + // post.markdown = yamlObj.mdFullContent + // post.html = yamlObj.htmlContent + // this.logger.info("rehandled yaml using YamlConverterAdaptor") + // } else { + // const md = YamlUtil.extractMarkdown(post.markdown) + // // post.yaml 始终保持最新 + // post.markdown = YamlUtil.addYamlToMd(post.yaml, md) + // post.html = LuteUtil.mdToHtml(md) + // this.logger.info("assign latest custom yaml to md") + // } // } else { - // this.logger.info("未找到YAML适配器,不作处理") + // // 同步发布内容 + // const yamlObj = PostUtil.toYamlObj(post) + // const yaml = YamlUtil.obj2Yaml(yamlObj) + // const md = YamlUtil.extractMarkdown(post.markdown) + // post.yaml = yaml + // post.markdown = md + // post.html = LuteUtil.mdToHtml(md) + // this.logger.info("yaml adaptor not found, using default") // } this.logger.debug("yaml处理之后,post", { post: toRaw(post) }) @@ -337,8 +566,8 @@ class BaseExtendApi extends WebApi implements IBlogApi, IWebApi { this.logger.warn("未安装 PicGO 插件,将使用平台上传图片") } - let mustUseOwn: boolean = false - let mustUsePicbed: boolean = false + let mustUseOwn = false + let mustUsePicbed = false if (dynCfg?.platformKey) { // 注意如果 platformKey=custom_Zhihu 或者 custom_Zhihu-xxx custom_Notion-xxx 也算 可以参考 /custom_Zhihu-\w+/ mustUseOwn = mustUseOwnPlatform.some((platform) => { @@ -461,8 +690,17 @@ class BaseExtendApi extends WebApi implements IBlogApi, IWebApi { base64Info = await remoteImageToBase64Info(url) } else { this.logger.info("Outside the browser, use an image proxy") - const proxyUrl = StrUtil.isEmptyString(middlewareUrl) ? "https://api.terwer.space/api/middleware" : middlewareUrl - const response = await this.api.proxyFetch(`${proxyUrl}/image`, [], { url: url }, "POST") + const proxyUrl = StrUtil.isEmptyString(middlewareUrl) ? LEGENCY_SHARED_PROXT_MIDDLEWARE : middlewareUrl + let response: any + if (response instanceof BaseBlogApi) { + const blogApi = this.api as BaseBlogApi + response = await blogApi.apiProxyFetch(`${proxyUrl}/image`, [], { url: url }, "POST") + } else if (response instanceof BaseWebApi) { + const webApi = this.api as BaseWebApi + response = await webApi.webProxyFetch(`${proxyUrl}/image`, [], { url: url }, "POST") + } else { + throw new Error("proxyFetch is not valid") + } this.logger.debug("readFileToBase64 proxyFetch response =>", response) const resBody = response.body const base64String = resBody.base64 @@ -472,6 +710,88 @@ class BaseExtendApi extends WebApi implements IBlogApi, IWebApi { this.logger.debug("readFileToBase64 proxyFetch base64Info =>", { base64Info }) return base64Info } + + /** + * 替换链接 + * + * @param text 文本 + * @param regex 正则 + * @param options 选项 + * @private + */ + private async replaceOuterLinks( + text: string, + regex: RegExp, + options: { pref: any; cfg: any; setting: typeof SypConfig } + ) { + const { pref, cfg, setting } = options + const that = this + const matches = Array.from(text.matchAll(regex)) + + let replacedText = text + for (const match of matches) { + const [fullMatch, title, id] = match + + // processedTitle + let processedTitle = title + if (pref.value.fixTitle) { + processedTitle = HtmlUtil.removeTitleNumber(processedTitle) + } + + // outerLink + let outerLink: string + // 获取预览链接 + // 如果已发布替换成别名 + const postMeta = ObjectUtil.getProperty(setting, id, {}) + const posidKey = cfg.posidKey + // eslint-disable-next-line no-prototype-builtins + if (!postMeta.hasOwnProperty(posidKey)) { + outerLink = `siyuan://blocks/${id}` + this.logger.error("引用的文档尚未发布,您可以删除此外链再发布,或者先发布外链文章 =>", id) + throw new Error(`引用的文档 ${id} 尚未发布,您可以删除此外链再发布,或者先发布外链文章`) + } else { + let previewUrl: string + const postid = postMeta[posidKey] + previewUrl = await that.api.getPostPreviewUrl(postid) + if (cfg?.mdFilenameRule?.includes("[filename]")) { + const slug = postMeta[SiyuanAttr.Custom_slug] + const filename = path.basename(postid).replace(/\.md/g, "") + previewUrl = previewUrl.replace(filename, slug) + } + // 路径保持原样 + if (!previewUrl.startsWith("http") && !previewUrl.startsWith("/")) { + previewUrl = `/${previewUrl}` + } + outerLink = previewUrl + } + + replacedText = replacedText.replace(fullMatch, `[${processedTitle}](${outerLink})`) + } + + return replacedText + } + + /** + * 检测属性是否包含某个字符串 + * + * @param obj object + * @param prefix 前缀 + * @private + */ + private checkPropertiesStartsWith(obj: any, prefix: string) { + if (ObjectUtil.isEmptyObject(obj)) { + return false + } + + for (const key in obj) { + if (obj.hasOwnProperty(key) && !StrUtil.isEmptyString(obj[key])) { + if (obj[key].startsWith(prefix)) { + return true + } + } + } + return false + } } export { BaseExtendApi } diff --git a/src/adaptors/index.ts b/src/adaptors/index.ts index e7ca834..57a998f 100644 --- a/src/adaptors/index.ts +++ b/src/adaptors/index.ts @@ -50,6 +50,9 @@ import { useVuepress2Api } from "~/src/adaptors/api/vuepress2/useVuepress2Api.ts import { useVitepressApi } from "~/src/adaptors/api/vitepress/useVitepressApi.ts" import { useGitlabvuepress2Api } from "~/src/adaptors/api/gitlab-vuepress2/useGitlabvuepress2Api.ts" import { useGitlabvitepressApi } from "~/src/adaptors/api/gitlab-vitepress/useGitlabvitepressApi.ts" +import { useHaloApi } from "~/src/adaptors/api/halo/useHaloApi.ts" +import { useTelegraphApi } from "~/src/adaptors/api/telegraph/useTelegraphApi.ts" +import { useJvueApi } from "~/src/adaptors/api/jvue/useJvueApi.ts" /** * 适配器统一入口 @@ -81,6 +84,16 @@ class Adaptors { conf = cfg break } + case SubPlatformType.Common_Halo: { + const { cfg } = await useHaloApi(key, newCfg) + conf = cfg + break + } + case SubPlatformType.Common_Telegraph: { + const { cfg } = await useTelegraphApi(key, newCfg) + conf = cfg + break + } case SubPlatformType.Github_Hexo: { const { cfg } = await useHexoApi(key, newCfg) conf = cfg @@ -156,6 +169,11 @@ class Adaptors { conf = cfg break } + case SubPlatformType.Metaweblog_Jvue: { + const { cfg } = await useJvueApi(key, newCfg) + conf = cfg + break + } case SubPlatformType.Wordpress_Wordpress: { const { cfg } = await useWordpressApi(key, newCfg) conf = cfg @@ -186,6 +204,11 @@ class Adaptors { conf = cfg break } + // case SubPlatformType.Custom_Flowus: { + // const { cfg } = await useFlowusWeb(key) + // conf = cfg + // break + // } case SubPlatformType.System_Siyuan: { const { siyuanConfig } = useSiyuanApi() conf = siyuanConfig @@ -221,6 +244,16 @@ class Adaptors { blogAdaptor = blogApi break } + case SubPlatformType.Common_Halo: { + const { blogApi } = await useHaloApi(key, newCfg) + blogAdaptor = blogApi + break + } + case SubPlatformType.Common_Telegraph: { + const { blogApi } = await useTelegraphApi(key, newCfg) + blogAdaptor = blogApi + break + } case SubPlatformType.Github_Hexo: { const { blogApi } = await useHexoApi(key, newCfg) blogAdaptor = blogApi @@ -296,6 +329,11 @@ class Adaptors { blogAdaptor = blogApi break } + case SubPlatformType.Metaweblog_Jvue: { + const { blogApi } = await useJvueApi(key, newCfg) + blogAdaptor = blogApi + break + } case SubPlatformType.Wordpress_Wordpress: { const { blogApi } = await useWordpressApi(key, newCfg) blogAdaptor = blogApi @@ -326,6 +364,11 @@ class Adaptors { blogAdaptor = webApi break } + // case SubPlatformType.Custom_Flowus: { + // const { webApi } = await useFlowusWeb(key, newCfg) + // blogAdaptor = webApi + // break + // } case SubPlatformType.System_Siyuan: { const { blogApi } = useSiyuanApi() blogAdaptor = blogApi diff --git a/src/adaptors/web/base/baseWebApi.ts b/src/adaptors/web/base/baseWebApi.ts index 6da8040..a234ad1 100644 --- a/src/adaptors/web/base/baseWebApi.ts +++ b/src/adaptors/web/base/baseWebApi.ts @@ -22,12 +22,23 @@ * or visit www.terwer.space if you need additional information or have any * questions. */ -import { Attachment, ElectronCookie, MediaObject, Post, WebApi, WebConfig, YamlConvertAdaptor } from "zhi-blog-api" +import { + Attachment, + CategoryInfo, + ElectronCookie, + MediaObject, + Post, + TagInfo, + WebApi, + WebConfig, + YamlConvertAdaptor, +} from "zhi-blog-api" import { PublisherAppInstance } from "~/src/publisherAppInstance.ts" import { createAppLogger, ILogger } from "~/src/utils/appLogger.ts" import { useProxy } from "~/src/composables/useProxy.ts" import { BaseExtendApi } from "~/src/adaptors/base/baseExtendApi.ts" -import { JsonUtil } from "zhi-common" +import { JsonUtil, StrUtil } from "zhi-common" +import { useSiyuanDevice } from "~/src/composables/useSiyuanDevice.ts" /** * 网页授权统一封装基类 @@ -41,7 +52,8 @@ class BaseWebApi extends WebApi { protected logger: ILogger protected cfg: WebConfig protected readonly baseExtendApi: BaseExtendApi - public readonly proxyFetch: any + private readonly proxyFetch: any + private readonly corsFetch: any /** * 初始化网页授权 API 适配器 @@ -55,14 +67,30 @@ class BaseWebApi extends WebApi { this.appInstance = appInstance this.cfg = cfg this.logger = createAppLogger("base-web-api") - this.baseExtendApi = new BaseExtendApi(this) + this.baseExtendApi = new BaseExtendApi(this, cfg) - const { proxyFetch } = useProxy(cfg.middlewareUrl) + const { proxyFetch, corsFetch } = useProxy(cfg.middlewareUrl, cfg.corsAnywhereUrl) this.proxyFetch = proxyFetch + this.corsFetch = corsFetch } - // web 适配器专有 + public async checkAuth(): Promise { + return true + } + + public getPostPreviewUrl(postid: string): Promise { + return this.getPreviewUrl(postid) + } + + public async getCategories(keyword?: string): Promise { + return this.baseExtendApi.getCategories(keyword) + } + + public async getTags(): Promise { + return this.baseExtendApi.getTags() + } + // web 适配器专有 public updateCfg(cfg: WebConfig) { this.cfg = cfg } @@ -120,9 +148,7 @@ class BaseWebApi extends WebApi { } } - // ================ - // private methods - // ================ + // =================================================================================================================== /** * 默认添加 Cookie 的网页授权代理 * @@ -131,6 +157,7 @@ class BaseWebApi extends WebApi { * @param params - 请求的参数 * @param method - 请求的 HTTP 方法 * @param contentType - 请求的内容类型 + * @param forceProxy - 是否强制使用代理 * @returns 返回一个 Promise,解析为响应结果 */ public async webProxyFetch( @@ -138,7 +165,8 @@ class BaseWebApi extends WebApi { headers: any[] = [], params: any = {}, method: "GET" | "POST" | "PUT" | "DELETE" | "PATCH" = "GET", - contentType: string = "application/json" + contentType: string = "application/json", + forceProxy: boolean = false ) { const header = headers.length > 0 ? headers[0] : {} const webHeaders = [ @@ -147,25 +175,62 @@ class BaseWebApi extends WebApi { Cookie: this.cfg.password, }, ] - return await this.proxyFetch(url, webHeaders, params, method, contentType) + + const isCorsProxyAvailable = !StrUtil.isEmptyString(this.cfg.corsAnywhereUrl) + // 如果没有可用的 CORS 代理或者没有强制使用代理,使用默认的自动检测机制 + if (!isCorsProxyAvailable || !forceProxy) { + this.logger.info("Using legency web fetch") + return await this.proxyFetch(url, webHeaders, params, method, contentType, forceProxy) + } else { + this.logger.info("Using cors web fetch") + return this.corsFetch(url, headers, params, method) + } } - public async webFormFetch(url: string, headers: any[], formData: FormData) { - const win = this.appInstance.win - const doFetch = win.require(`${this.appInstance.moduleBase}libs/zhi-formdata-fetch/index.cjs`) + /** + * 默认添加 Cookie 的网页授权代理 + * + * @param url - 请求的 URL + * @param headers - 请求的头部信息 + * @param formData - 表单数据 + * @param forceProxy - 是否强制使用代理 + * @returns 返回一个 Promise,解析为响应结果 + */ + public async webFormFetch(url: string, headers: any[], formData: FormData, forceProxy: boolean = false) { + const isCorsProxyAvailable = !StrUtil.isEmptyString(this.cfg.corsAnywhereUrl) + // 如果没有可用的 CORS 代理或者没有强制使用代理,使用默认的自动检测机制 + if (!isCorsProxyAvailable || !forceProxy) { + this.logger.info("Using legency web formFetch") + const { isInSiyuanOrSiyuanNewWin } = useSiyuanDevice() + if (!isInSiyuanOrSiyuanNewWin()) { + throw new Error( + "检测到当前为非 electron 环境并且未设置 cors 代理,此功能将不可用!请设置 cors 代理或者使用PC 客户端" + ) + } - // headers - const header = headers.length > 0 ? headers[0] : {} - this.logger.debug("before zhi-formdata-fetch, headers =>", headers) - this.logger.debug("before zhi-formdata-fetch, url =>", url) + const win = this.appInstance.win + const doFetch = win.require(`${this.appInstance.moduleBase}libs/zhi-formdata-fetch/index.cjs`) + + // headers + const header = headers.length > 0 ? headers[0] : {} + this.logger.debug("before zhi-formdata-fetch, headers =>", headers) + this.logger.debug("before zhi-formdata-fetch, url =>", url) - const resText = await doFetch(this.appInstance.moduleBase, url, header, formData) - this.logger.debug("webForm doFetch success, resText =>", resText) - const resJson = JsonUtil.safeParse(resText, {} as any) - this.logger.debug("webForm doFetch success, resJson=>", resJson) + const resText = await doFetch(this.appInstance.moduleBase, url, header, formData) + this.logger.debug("webForm doFetch success, resText =>", resText) + const resJson = JsonUtil.safeParse(resText, {} as any) + this.logger.debug("webForm doFetch success, resJson=>", resJson) - return resJson + return resJson + } else { + this.logger.info("Using cors-anywhere web formFetch") + return this.corsFetch(url, headers, formData, "POST") + } } + + // ================ + // private methods + // ================ } export { BaseWebApi } diff --git a/src/adaptors/web/bilibili/bilibiliConfig.ts b/src/adaptors/web/bilibili/bilibiliConfig.ts new file mode 100644 index 0000000..2544443 --- /dev/null +++ b/src/adaptors/web/bilibili/bilibiliConfig.ts @@ -0,0 +1,59 @@ +/* + * 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 { CommonWebConfig } from "~/src/adaptors/web/base/commonWebConfig.ts" +import { PageTypeEnum, PasswordType } from "zhi-blog-api" + +/** + * B站配置 + */ +class BilibiliConfig extends CommonWebConfig { + constructor(username: string, password: string, middlewareUrl?: string) { + super( + "https://member.bilibili.com/platform/upload/text/edit", + "https://member.bilibili.com/platform/upload/text/edit", + username, + password, + middlewareUrl + ) + + // 设置B站的预览URL,使用博客ID作为博客预览的URL参数 + this.previewUrl = "/[postid]" + // 设置页面类型为Markdown或其他适用的类型 + this.pageType = PageTypeEnum.Markdown + // 设置密码类型,使用Cookie来管理密码 + this.passwordType = PasswordType.PasswordType_Cookie + // 是否启用用户名 + this.usernameEnabled = true + // 是否启用标签 + this.tagEnabled = false + // 是否启用分类 + this.cateEnabled = true + // 是否启用知识空间 + this.knowledgeSpaceEnabled = false + } +} + +export { BilibiliConfig } diff --git a/src/adaptors/web/csdn/csdnConfig.ts b/src/adaptors/web/csdn/csdnConfig.ts index ed16a13..d29b9d7 100644 --- a/src/adaptors/web/csdn/csdnConfig.ts +++ b/src/adaptors/web/csdn/csdnConfig.ts @@ -32,7 +32,7 @@ import { CategoryTypeEnum, PageTypeEnum, PasswordType } from "zhi-blog-api" export class CsdnConfig extends CommonWebConfig { constructor(username: string, password: string, middlewareUrl?: string) { super("https://blog.csdn.net", "https://bizapi.csdn.net", username, password, middlewareUrl) - this.previewUrl = "[userid]/article/details/[postid]" + this.previewUrl = "/[userid]/article/details/[postid]" this.pageType = PageTypeEnum.Markdown this.usernameEnabled = false this.passwordType = PasswordType.PasswordType_Cookie diff --git a/src/adaptors/web/csdn/csdnUtils.ts b/src/adaptors/web/csdn/csdnUtils.ts index c8bda3a..8cb6276 100644 --- a/src/adaptors/web/csdn/csdnUtils.ts +++ b/src/adaptors/web/csdn/csdnUtils.ts @@ -26,6 +26,8 @@ import Utf8 from "crypto-js/enc-utf8" import CryptoJS from "crypto-js" import Base64 from "crypto-js/enc-base64" +import * as cheerio from "cheerio" +import KatexUtils from "~/src/utils/katexUtils.ts" /** * CSDN工具类,用于生成UUID和签名 @@ -82,6 +84,36 @@ class CsdnUtils { // console.log(sign) return sign } + + public static processCsdnMath(html: string): string { + // 使用Cheerio加载HTML + const $ = cheerio.load(html, { xmlMode: true, decodeEntities: false }) + + // 处理两个$符号包裹的公式 + const doubleDollarRegex = /\$\$([^$]+)\$\$/g + $("*:not(pre)").each((index, element) => { + const content = $(element).html() + const newContent = content.replace(doubleDollarRegex, (match, mathContent) => { + const mathHtml = KatexUtils.renderToString(mathContent) + return `${mathHtml}` + }) + $(element).html(newContent) + }) + + // 处理一个$符号包裹的公式 + const singleDollarRegex = /\$([^$]+)\$/g + $("*:not(pre)").each((index, element) => { + const content = $(element).html() + const newContent = content.replace(singleDollarRegex, (match, mathContent) => { + const mathHtml = KatexUtils.renderToString(mathContent) + return `${mathHtml}` + }) + $(element).html(newContent) + }) + + // 输出修改后的HTML + return $.html() + } } export default CsdnUtils diff --git a/src/adaptors/web/csdn/csdnWebAdaptor.ts b/src/adaptors/web/csdn/csdnWebAdaptor.ts index ed8e68e..956534b 100644 --- a/src/adaptors/web/csdn/csdnWebAdaptor.ts +++ b/src/adaptors/web/csdn/csdnWebAdaptor.ts @@ -25,9 +25,10 @@ import { BaseWebApi } from "~/src/adaptors/web/base/baseWebApi.ts" import CsdnUtils from "~/src/adaptors/web/csdn/csdnUtils.ts" -import { CategoryInfo, Post, UserBlog } from "zhi-blog-api" -import { JsonUtil, StrUtil } from "zhi-common" +import { BlogConfig, CategoryInfo, PageTypeEnum, Post, UserBlog } from "zhi-blog-api" +import { JsonUtil } from "zhi-common" import WebUtils from "~/src/adaptors/web/base/webUtils.ts" +import _ from "lodash-es" /** * CSDN网页授权适配器 @@ -139,6 +140,36 @@ class CsdnWebAdaptor extends BaseWebApi { return cats } + public override async preEditPost(post: Post, id?: string, publishCfg?: any): Promise { + // 公共的属性预处理 + const doc = await super.preEditPost(post, id, publishCfg) + + // CSDN自定义的处理 + const cfg: BlogConfig = publishCfg?.cfg + const updatedPost = _.cloneDeep(doc) as Post + const html = updatedPost.html + this.logger.info("准备处理CSDN正文") + this.logger.debug("html =>", { html: html }) + let updatedHtml = html + + // 处理数学公式 + updatedHtml = CsdnUtils.processCsdnMath(updatedHtml) + + // 处理完毕 + updatedPost.html = updatedHtml + this.logger.info("CSDN正文处理完毕") + this.logger.debug("updatedHtml =>", { updatedHtml: updatedHtml }) + + // 发布格式 + if (cfg?.pageType == PageTypeEnum.Markdown) { + updatedPost.description = updatedPost.markdown + } else { + updatedPost.description = updatedPost.html + } + + return updatedPost + } + public async addPost(post: Post) { // 仅支持MD const params = JSON.stringify({ @@ -220,7 +251,7 @@ class CsdnWebAdaptor extends BaseWebApi { this.logger.debug("save csdn post res=>", res) if (res?.code !== 200) { - throw new Error("CSDN文章更新失败,可能是等级不够导致,如过等级不够,请去掉文章标签") + throw new Error("CSDN文章更新失败,可能是等级不够导致,如果等级不够,请去掉文章标签") } this.logger.debug("edit csdn post res=>", res) @@ -386,9 +417,6 @@ class CsdnWebAdaptor extends BaseWebApi { this.logger.debug("csdn url =>", url) this.logger.debug("csdn requestOptions =>", requestOptions) const res = await this.webProxyFetch(url, [mergedHeaders], params, method, contentType) - if (res?.code !== 200) { - throw new Error(res?.body?.message) - } return res } @@ -396,7 +424,8 @@ class CsdnWebAdaptor extends BaseWebApi { const token = this.cfg.password const userid = WebUtils.readCookie("UserName", token) const previewUrl = this.cfg.previewUrl.replace(/\[userid\]/g, userid).replace(/\[postid\]/g, postid) - return StrUtil.pathJoin(this.cfg.home ?? "", previewUrl) + return previewUrl + // return StrUtil.pathJoin(this.cfg.home ?? "", previewUrl) } } diff --git a/src/adaptors/web/csdn/useCsdnWeb.ts b/src/adaptors/web/csdn/useCsdnWeb.ts index 7d4ade8..07d4f56 100644 --- a/src/adaptors/web/csdn/useCsdnWeb.ts +++ b/src/adaptors/web/csdn/useCsdnWeb.ts @@ -26,12 +26,13 @@ import { CsdnConfig } from "~/src/adaptors/web/csdn/csdnConfig.ts" import { createAppLogger } from "~/src/utils/appLogger.ts" import { PublisherAppInstance } from "~/src/publisherAppInstance.ts" -import { useSettingStore } from "~/src/stores/useSettingStore.ts" +import { usePublishSettingStore } from "~/src/stores/usePublishSettingStore.ts" import { JsonUtil, ObjectUtil, StrUtil } from "zhi-common" import { Utils } from "~/src/utils/utils.ts" import { getDynPostidKey } from "~/src/platforms/dynamicConfig.ts" import { CsdnWebAdaptor } from "~/src/adaptors/web/csdn/csdnWebAdaptor.ts" import { CategoryTypeEnum } from "zhi-blog-api" +import { LEGENCY_SHARED_PROXT_MIDDLEWARE } from "~/src/utils/constants.ts" /** * 用于获取CsdnWeb的API的自定义Hook @@ -51,26 +52,20 @@ const useCsdnWeb = async (key?: string, newCfg?: CsdnConfig) => { cfg = newCfg } else { // 从配置中获取数据 - const { getSetting } = useSettingStore() + const { getSetting } = usePublishSettingStore() const setting = await getSetting() cfg = JsonUtil.safeParse(setting[key], {} as CsdnConfig) // 如果配置为空,则使用默认的环境变量值,并记录日志 if (ObjectUtil.isEmptyObject(cfg)) { // 从环境变量获取Csdn的cookie - const middlewareUrl = Utils.emptyOrDefault( - process.env.VITE_MIDDLEWARE_URL, - "https://api.terwer.space/api/middleware" - ) + const middlewareUrl = Utils.emptyOrDefault(process.env.VITE_MIDDLEWARE_URL, LEGENCY_SHARED_PROXT_MIDDLEWARE) const csdnCookie = Utils.emptyOrDefault(process.env.VITE_CSDN_AUTH_TOKEN, "") cfg = new CsdnConfig("", csdnCookie, middlewareUrl) logger.debug("Configuration is empty, using default environment variables.") } else { logger.info("Using configuration from settings...") } - const middlewareUrl = Utils.emptyOrDefault( - process.env.VITE_MIDDLEWARE_URL, - "https://api.terwer.space/api/middleware" - ) + const middlewareUrl = Utils.emptyOrDefault(process.env.VITE_MIDDLEWARE_URL, LEGENCY_SHARED_PROXT_MIDDLEWARE) if (StrUtil.isEmptyString(cfg.middlewareUrl)) { cfg.middlewareUrl = middlewareUrl } diff --git a/src/adaptors/web/douban/doubanConfig.ts b/src/adaptors/web/douban/doubanConfig.ts new file mode 100644 index 0000000..5a20c36 --- /dev/null +++ b/src/adaptors/web/douban/doubanConfig.ts @@ -0,0 +1,53 @@ +/* + * 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 { CommonWebConfig } from "~/src/adaptors/web/base/commonWebConfig.ts" +import { CategoryTypeEnum, PageTypeEnum, PasswordType } from "zhi-blog-api" + +/** + * 豆瓣配置 + */ +class DoubanConfig extends CommonWebConfig { + constructor(username: string, password: string, middlewareUrl?: string) { + super("https://www.douban.com", "https://www.douban.com", username, password, middlewareUrl) + + // 设置豆瓣的预览URL,使用博客ID作为博客预览的URL参数 + this.previewUrl = "/note/[noteid]" + // 设置页面类型为Markdown或其他适用的类型 + this.pageType = PageTypeEnum.Markdown + // 设置密码类型,使用Cookie来管理密码 + this.passwordType = PasswordType.PasswordType_Cookie + // 是否启用用户名 + this.usernameEnabled = true + // 是否启用标签 + this.tagEnabled = true + // 是否启用分类 + this.cateEnabled = true + // 是否启用知识空间 + this.knowledgeSpaceEnabled = false + } +} + +export { DoubanConfig } diff --git a/src/adaptors/web/flowus/flowusConfig.ts b/src/adaptors/web/flowus/flowusConfig.ts new file mode 100644 index 0000000..89e90d9 --- /dev/null +++ b/src/adaptors/web/flowus/flowusConfig.ts @@ -0,0 +1,50 @@ +/* + * 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 { CommonWebConfig } from "~/src/adaptors/web/base/commonWebConfig.ts" +import { CategoryTypeEnum, PageTypeEnum, PasswordType } from "zhi-blog-api" + +/** + * Flowus 配置 + */ +class FlowusConfig extends CommonWebConfig { + constructor(username, password, middlewareUrl) { + super("https://flowus.cn", "https://flowus.cn/api", username, password, middlewareUrl) + this.previewUrl = "/p/[postid]" + this.pageType = PageTypeEnum.Markdown + this.passwordType = PasswordType.PasswordType_Cookie + this.usernameEnabled = false + this.tagEnabled = false + this.cateEnabled = false + this.knowledgeSpaceEnabled = true + this.knowledgeSpaceTitle = "Flowus根页面" + this.knowledgeSpaceType = CategoryTypeEnum.CategoryType_Single + this.allowKnowledgeSpaceChange = false + this.placeholder.knowledgeSpaceReadonlyModeTip = + "由于Flowus平台的限制,暂时不支持编辑所属专栏。如果您想移动文档,请先点击取消删除该文档,然后重新选择新的专栏发布" + } +} + +export { FlowusConfig } diff --git a/src/adaptors/web/flowus/flowusPlaceholder.ts b/src/adaptors/web/flowus/flowusPlaceholder.ts new file mode 100644 index 0000000..494742e --- /dev/null +++ b/src/adaptors/web/flowus/flowusPlaceholder.ts @@ -0,0 +1,30 @@ +/* + * 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 { CommonWebPlaceholder } from "~/src/adaptors/web/base/commonWebPlaceholder.ts" + +class FlowusPlaceholder extends CommonWebPlaceholder {} + +export { FlowusPlaceholder } diff --git a/src/adaptors/web/flowus/flowusWebAdaptor.ts b/src/adaptors/web/flowus/flowusWebAdaptor.ts new file mode 100644 index 0000000..dbebd62 --- /dev/null +++ b/src/adaptors/web/flowus/flowusWebAdaptor.ts @@ -0,0 +1,68 @@ +/* + * 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 { BaseWebApi } from "~/src/adaptors/web/base/baseWebApi.ts" +import { CategoryInfo } from "zhi-blog-api" + +/** + * Flowus网页授权适配器 + * + * @see [Flowus](https://flowus.cn/) + * @author terwer + * @version 0.16.0 + * @since 0.16.0 + */ +class FlowusWebAdaptor extends BaseWebApi { + public async getMetaData(): Promise { + const res = await this.webProxyFetch("https://flowus.cn/api/users/me") + const flag = res?.code === 200 + this.logger.info(`get flowus metadata finished, flag => ${flag}`) + return { + flag: flag, + uid: res?.data?.uuid, + title: res?.data?.nickname, + avatar: res?.data?.avatar, + spaceViews: res?.data?.spaceViews, + supportTypes: ["html"], + type: "flowus", + displayName: "Flowus 息流", + home: "https://flowus.cn", + icon: "https://cdn.allflow.cn/assets/favicon.png", + } + } + + // public async getCategories(keyword?: string): Promise { + // const cats = [] as CategoryInfo[] + // + // // const pages: any[] = await this.getPages(keyword) + // } + + + // ================ + // private methods + // ================ +} + +export { FlowusWebAdaptor } diff --git a/src/adaptors/web/flowus/useFlowusWeb.ts b/src/adaptors/web/flowus/useFlowusWeb.ts new file mode 100644 index 0000000..1e9db86 --- /dev/null +++ b/src/adaptors/web/flowus/useFlowusWeb.ts @@ -0,0 +1,102 @@ +/* + * 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 { FlowusWebAdaptor } from "~/src/adaptors/web/flowus/flowusWebAdaptor.ts" +import { FlowusConfig } from "~/src/adaptors/web/flowus/flowusConfig.ts" +import { createAppLogger } from "~/src/utils/appLogger.ts" +import { PublisherAppInstance } from "~/src/publisherAppInstance.ts" +import { usePublishSettingStore } from "~/src/stores/usePublishSettingStore.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" + +/** + * 用于获取Flowus的API的自定义Hook + */ +const useFlowusWeb = async (key?: string, newCfg?: FlowusConfig) => { + // 创建应用日志记录器 + const logger = createAppLogger("use-flowus-web") + + // 记录开始使用Flowus WebAuth + logger.info("Start using Flowus WebAuth...") + + // 创建应用实例 + const appInstance = new PublisherAppInstance() + let cfg: FlowusConfig + if (newCfg) { + logger.info("Initialize with the latest newCfg passed in...") + cfg = newCfg + } else { + // 从配置中获取数据 + const { getSetting } = usePublishSettingStore() + const setting = await getSetting() + cfg = JsonUtil.safeParse(setting[key], {} as FlowusConfig) + // 如果配置为空,则使用默认的环境变量值,并记录日志 + if (ObjectUtil.isEmptyObject(cfg)) { + const middlewareUrl = Utils.emptyOrDefault( + process.env.VITE_MIDDLEWARE_URL, + "https://api.flowus.space/api/middleware" + ) + // 从环境变量获取Flowus的cookie + const flowusCookie = Utils.emptyOrDefault(process.env.VITE_FLOWUS_AUTH_TOKEN, "") + cfg = new FlowusConfig("", flowusCookie, middlewareUrl) + logger.debug("Configuration is empty, using default environment variables.") + } else { + logger.info("Using configuration from settings...") + } + const middlewareUrl = Utils.emptyOrDefault( + process.env.VITE_MIDDLEWARE_URL, + "https://api.flowus.space/api/middleware" + ) + if (StrUtil.isEmptyString(cfg.middlewareUrl)) { + cfg.middlewareUrl = middlewareUrl + } + // 初始化posidKey + if (StrUtil.isEmptyString(cfg.posidKey)) { + // 默认值 + cfg.posidKey = getDynPostidKey(key) + } + } + + // 适应Flowus的配置 + // 标签 + cfg.tagEnabled = false + // 知乎使用单选分类作为根页面 + cfg.cateEnabled = false + cfg.knowledgeSpaceEnabled = true + cfg.knowledgeSpaceType = CategoryTypeEnum.CategoryType_Single + cfg.allowKnowledgeSpaceChange = false + cfg.placeholder.knowledgeSpaceReadonlyModeTip = + "由于Flowus平台的限制,暂时不支持编辑所属专栏。如果您想移动文档,请先点击取消删除该文档,然后重新选择新的专栏发布" + + const webApi = new FlowusWebAdaptor(appInstance, cfg) + return { + cfg, + webApi, + } +} + +export { useFlowusWeb } diff --git a/src/adaptors/web/jianshu/jianshuConfig.ts b/src/adaptors/web/jianshu/jianshuConfig.ts index 229dd79..cbc951d 100644 --- a/src/adaptors/web/jianshu/jianshuConfig.ts +++ b/src/adaptors/web/jianshu/jianshuConfig.ts @@ -29,7 +29,7 @@ import { CategoryTypeEnum, PageTypeEnum, PasswordType } from "zhi-blog-api" /** * 简书配置 */ -export class JianshuConfig extends CommonWebConfig { +class JianshuConfig extends CommonWebConfig { constructor(username: string, password: string, middlewareUrl?: string) { super("https://www.jianshu.com", "https://www.jianshu.com", username, password, middlewareUrl) @@ -47,3 +47,5 @@ export class JianshuConfig extends CommonWebConfig { "由于简书平台的限制,暂时不支持编辑所属笔记本。如果您想移动文档,请先点击取消删除该文档,然后重新选择新的笔记本发布" } } + +export { JianshuConfig } diff --git a/src/adaptors/web/jianshu/jianshuWebAdaptor.ts b/src/adaptors/web/jianshu/jianshuWebAdaptor.ts index fdb3941..727e4fe 100644 --- a/src/adaptors/web/jianshu/jianshuWebAdaptor.ts +++ b/src/adaptors/web/jianshu/jianshuWebAdaptor.ts @@ -134,7 +134,8 @@ class JianshuWebAdaptor extends BaseWebApi { // const pageId = jianshuPostKey.pageId const endUrl = jianshuPostKey.endUrl const postUrl = purl.replace("[postid]", endUrl) - return StrUtil.pathJoin(this.cfg.home ?? "", postUrl) + return postUrl + // return StrUtil.pathJoin(this.cfg.home ?? "", postUrl) } public async deletePost(postid: string): Promise { diff --git a/src/adaptors/web/jianshu/useJianshuWeb.ts b/src/adaptors/web/jianshu/useJianshuWeb.ts index 2d4f306..61ce1cf 100644 --- a/src/adaptors/web/jianshu/useJianshuWeb.ts +++ b/src/adaptors/web/jianshu/useJianshuWeb.ts @@ -26,12 +26,13 @@ import { JianshuConfig } from "~/src/adaptors/web/jianshu/jianshuConfig.ts" import { createAppLogger } from "~/src/utils/appLogger.ts" import { PublisherAppInstance } from "~/src/publisherAppInstance.ts" -import { useSettingStore } from "~/src/stores/useSettingStore.ts" +import { usePublishSettingStore } from "~/src/stores/usePublishSettingStore.ts" import { JsonUtil, ObjectUtil, StrUtil } from "zhi-common" import { Utils } from "~/src/utils/utils.ts" import { getDynPostidKey } from "~/src/platforms/dynamicConfig.ts" import { JianshuWebAdaptor } from "~/src/adaptors/web/jianshu/jianshuWebAdaptor.ts" -import {CategoryTypeEnum} from "zhi-blog-api"; +import { CategoryTypeEnum } from "zhi-blog-api" +import { LEGENCY_SHARED_PROXT_MIDDLEWARE } from "~/src/utils/constants.ts" /** * 用于获取JianshuWeb的API的自定义Hook @@ -51,15 +52,12 @@ const useJianshuWeb = async (key?: string, newCfg?: JianshuConfig) => { cfg = newCfg } else { // 从配置中获取数据 - const { getSetting } = useSettingStore() + const { getSetting } = usePublishSettingStore() const setting = await getSetting() cfg = JsonUtil.safeParse(setting[key], {} as JianshuConfig) // 如果配置为空,则使用默认的环境变量值,并记录日志 if (ObjectUtil.isEmptyObject(cfg)) { - const middlewareUrl = Utils.emptyOrDefault( - process.env.VITE_MIDDLEWARE_URL, - "https://api.terwer.space/api/middleware" - ) + const middlewareUrl = Utils.emptyOrDefault(process.env.VITE_MIDDLEWARE_URL, LEGENCY_SHARED_PROXT_MIDDLEWARE) // 从环境变量获取Jianshu的cookie const jianshuCookie = Utils.emptyOrDefault(process.env.VITE_JIANSHU_AUTH_TOKEN, "") cfg = new JianshuConfig("", jianshuCookie, middlewareUrl) @@ -67,10 +65,7 @@ const useJianshuWeb = async (key?: string, newCfg?: JianshuConfig) => { } else { logger.info("Using configuration from settings...") } - const middlewareUrl = Utils.emptyOrDefault( - process.env.VITE_MIDDLEWARE_URL, - "https://api.terwer.space/api/middleware" - ) + const middlewareUrl = Utils.emptyOrDefault(process.env.VITE_MIDDLEWARE_URL, LEGENCY_SHARED_PROXT_MIDDLEWARE) if (StrUtil.isEmptyString(cfg.middlewareUrl)) { cfg.middlewareUrl = middlewareUrl } diff --git a/src/adaptors/web/juejin/juejinWebAdaptor.ts b/src/adaptors/web/juejin/juejinWebAdaptor.ts index 08fd48b..98530de 100644 --- a/src/adaptors/web/juejin/juejinWebAdaptor.ts +++ b/src/adaptors/web/juejin/juejinWebAdaptor.ts @@ -96,6 +96,23 @@ class JuejinWebAdaptor extends BaseWebApi { // throw new Error("掘金平台必须选择一个标签") } + const DEFAULT_DESC = + "由于掘金平台的摘要有强制字数要求,这里需要给一下默认文字作为摘要。这里是掘金平台的默认摘要,您可以稍后自行修改。" + if (StrUtil.isEmptyString(post.shortDesc) || post.shortDesc.length < DEFAULT_DESC.length) { + post.shortDesc = DEFAULT_DESC + this.logger.error("掘金平台未设置摘要或者摘要字数,将使用默认摘要") + } + + // 摘要控制在 50 - 100 + if (post.shortDesc.length < 50) { + while (post.shortDesc.length < 50) { + post.shortDesc += post.shortDesc + } + post.shortDesc = post.shortDesc.slice(0, 100) + } else if (post.shortDesc.length > 100) { + post.shortDesc = post.shortDesc.slice(0, 100) + } + // 保存草稿 const draftUrl = "https://api.juejin.cn/content_api/v1/article_draft/create" const draftParams = { @@ -173,13 +190,16 @@ class JuejinWebAdaptor extends BaseWebApi { const juejinPostKey = this.getJuejinPostidKey(postid) const pageId = juejinPostKey.pageId const postUrl = this.cfg.previewUrl.replace("[postid]", pageId) - return StrUtil.pathJoin(this.cfg.home ?? "", postUrl) + return postUrl + // return StrUtil.pathJoin(this.cfg.home ?? "", postUrl) } public async deletePost(postid: string): Promise { const url = "https://api.juejin.cn/content_api/v1/article/delete" + const juejinPostKey = this.getJuejinPostidKey(postid) + const pageId = juejinPostKey.pageId const params = { - article_id: postid, + article_id: pageId, } const res = await this.webProxyFetch(url, [], params, "POST") this.logger.debug("juejin delete post res =>", res) @@ -270,6 +290,7 @@ class JuejinWebAdaptor extends BaseWebApi { return tags } + // ================ // private methods // ================ @@ -308,7 +329,7 @@ class JuejinWebAdaptor extends BaseWebApi { const res = await this.webProxyFetch(url, [], params, "POST") this.logger.debug("juejin publish post res =>", res) if (res.err_no !== 0) { - throw new Error("掘金文章发布失败 =>" + res?.err_msg ?? res) + throw new Error("掘金文章发布失败 =>" + (res?.err_msg ?? res)) } return res.data.article_id.toString() diff --git a/src/adaptors/web/juejin/useJuejinWeb.ts b/src/adaptors/web/juejin/useJuejinWeb.ts index f68b4a5..3e5e913 100644 --- a/src/adaptors/web/juejin/useJuejinWeb.ts +++ b/src/adaptors/web/juejin/useJuejinWeb.ts @@ -26,12 +26,13 @@ import { JuejinConfig } from "~/src/adaptors/web/juejin/juejinConfig.ts" import { createAppLogger } from "~/src/utils/appLogger.ts" import { PublisherAppInstance } from "~/src/publisherAppInstance.ts" -import { useSettingStore } from "~/src/stores/useSettingStore.ts" +import { usePublishSettingStore } from "~/src/stores/usePublishSettingStore.ts" import { JsonUtil, ObjectUtil, StrUtil } from "zhi-common" import { Utils } from "~/src/utils/utils.ts" import { getDynPostidKey } from "~/src/platforms/dynamicConfig.ts" import { JuejinWebAdaptor } from "~/src/adaptors/web/juejin/juejinWebAdaptor.ts" import { CategoryTypeEnum } from "zhi-blog-api" +import { LEGENCY_SHARED_PROXT_MIDDLEWARE } from "~/src/utils/constants.ts" /** * 用于获取JuejinWeb的API的自定义Hook @@ -51,15 +52,12 @@ const useJuejinWeb = async (key?: string, newCfg?: JuejinConfig) => { cfg = newCfg } else { // 从配置中获取数据 - const { getSetting } = useSettingStore() + const { getSetting } = usePublishSettingStore() const setting = await getSetting() cfg = JsonUtil.safeParse(setting[key], {} as JuejinConfig) // 如果配置为空,则使用默认的环境变量值,并记录日志 if (ObjectUtil.isEmptyObject(cfg)) { - const middlewareUrl = Utils.emptyOrDefault( - process.env.VITE_MIDDLEWARE_URL, - "https://api.terwer.space/api/middleware" - ) + const middlewareUrl = Utils.emptyOrDefault(process.env.VITE_MIDDLEWARE_URL, LEGENCY_SHARED_PROXT_MIDDLEWARE) // 从环境变量获取Juejin的cookie const juejinCookie = Utils.emptyOrDefault(process.env.VITE_JUEJIN_AUTH_TOKEN, "") cfg = new JuejinConfig("", juejinCookie, middlewareUrl) @@ -67,10 +65,7 @@ const useJuejinWeb = async (key?: string, newCfg?: JuejinConfig) => { } else { logger.info("Using configuration from settings...") } - const middlewareUrl = Utils.emptyOrDefault( - process.env.VITE_MIDDLEWARE_URL, - "https://api.terwer.space/api/middleware" - ) + const middlewareUrl = Utils.emptyOrDefault(process.env.VITE_MIDDLEWARE_URL, LEGENCY_SHARED_PROXT_MIDDLEWARE) if (StrUtil.isEmptyString(cfg.middlewareUrl)) { cfg.middlewareUrl = middlewareUrl } diff --git a/src/adaptors/web/mdnice/mdniceConfig.ts b/src/adaptors/web/mdnice/mdniceConfig.ts new file mode 100644 index 0000000..16cff6a --- /dev/null +++ b/src/adaptors/web/mdnice/mdniceConfig.ts @@ -0,0 +1,50 @@ +/* + * 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 { CommonWebConfig } from "~/src/adaptors/web/base/commonWebConfig.ts" +import { CategoryTypeEnum, PageTypeEnum, PasswordType } from "zhi-blog-api" + +/** + * 墨滴配置 + */ +class MdniceConfig extends CommonWebConfig { + constructor(username: string, password: string, middlewareUrl?: string) { + super("https://mdnice.com", "https://mdnice.com/api", username, password, middlewareUrl) + this.previewUrl = "/post/[postid]" + this.pageType = PageTypeEnum.Html + this.passwordType = PasswordType.PasswordType_Cookie + this.usernameEnabled = true + this.tagEnabled = true // Assuming tags are supported on Mdnice + this.cateEnabled = false + this.knowledgeSpaceEnabled = true + this.knowledgeSpaceTitle = "文章" + this.knowledgeSpaceType = CategoryTypeEnum.CategoryType_Single + this.allowKnowledgeSpaceChange = false + this.placeholder.knowledgeSpaceReadonlyModeTip = + "由于墨滴平台的限制,暂时不支持编辑所属文章。如果您想移动文档,请先取消删除该文档,然后重新选择新的文章发布" + } +} + +export { MdniceConfig } diff --git a/src/adaptors/web/wechat/useWechatWeb.ts b/src/adaptors/web/wechat/useWechatWeb.ts index d42446d..c80f637 100644 --- a/src/adaptors/web/wechat/useWechatWeb.ts +++ b/src/adaptors/web/wechat/useWechatWeb.ts @@ -26,11 +26,12 @@ import { WechatConfig } from "~/src/adaptors/web/wechat/wechatConfig.ts" import { PublisherAppInstance } from "~/src/publisherAppInstance.ts" import { createAppLogger } from "~/src/utils/appLogger.ts" -import { useSettingStore } from "~/src/stores/useSettingStore.ts" +import { usePublishSettingStore } from "~/src/stores/usePublishSettingStore.ts" import { JsonUtil, ObjectUtil, StrUtil } from "zhi-common" import { Utils } from "~/src/utils/utils.ts" import { getDynPostidKey } from "~/src/platforms/dynamicConfig.ts" import { WechatWebAdaptor } from "~/src/adaptors/web/wechat/wechatWebAdaptor.ts" +import { LEGENCY_SHARED_PROXT_MIDDLEWARE } from "~/src/utils/constants.ts" /** * 用于获取WechatWeb的API的自定义Hook @@ -50,15 +51,12 @@ const useWechatWeb = async (key?: string, newCfg?: WechatConfig) => { cfg = newCfg } else { // 从配置中获取数据 - const { getSetting } = useSettingStore() + const { getSetting } = usePublishSettingStore() const setting = await getSetting() cfg = JsonUtil.safeParse(setting[key], {} as WechatConfig) // 如果配置为空,则使用默认的环境变量值,并记录日志 if (ObjectUtil.isEmptyObject(cfg)) { - const middlewareUrl = Utils.emptyOrDefault( - process.env.VITE_MIDDLEWARE_URL, - "https://api.terwer.space/api/middleware" - ) + const middlewareUrl = Utils.emptyOrDefault(process.env.VITE_MIDDLEWARE_URL, LEGENCY_SHARED_PROXT_MIDDLEWARE) // 从环境变量获取Wechat的cookie const wechatCookie = Utils.emptyOrDefault(process.env.VITE_WECHAT_AUTH_TOKEN, "") cfg = new WechatConfig("", wechatCookie, middlewareUrl) @@ -66,10 +64,7 @@ const useWechatWeb = async (key?: string, newCfg?: WechatConfig) => { } else { logger.info("Using configuration from settings...") } - const middlewareUrl = Utils.emptyOrDefault( - process.env.VITE_MIDDLEWARE_URL, - "https://api.terwer.space/api/middleware" - ) + const middlewareUrl = Utils.emptyOrDefault(process.env.VITE_MIDDLEWARE_URL, LEGENCY_SHARED_PROXT_MIDDLEWARE) if (StrUtil.isEmptyString(cfg.middlewareUrl)) { cfg.middlewareUrl = middlewareUrl } diff --git a/src/adaptors/web/wechat/wechatWebAdaptor.ts b/src/adaptors/web/wechat/wechatWebAdaptor.ts index 441676c..cf32255 100644 --- a/src/adaptors/web/wechat/wechatWebAdaptor.ts +++ b/src/adaptors/web/wechat/wechatWebAdaptor.ts @@ -28,10 +28,8 @@ import * as cheerio from "cheerio" import { HtmlUtil, JsonUtil, ObjectUtil, StrUtil } from "zhi-common" import { BlogConfig, PageTypeEnum, Post, UserBlog } from "zhi-blog-api" import { toRaw } from "vue" -import _ from "lodash" -import { SiyuanDevice } from "zhi-device" +import _ from "lodash-es" import { fileToBuffer } from "~/src/utils/polyfillUtils.ts" -import { CategoryAIResult } from "~/src/utils/ai/prompt.ts" /** * 微信公众号网页授权适配器 @@ -516,9 +514,9 @@ class WechatWebAdaptor extends BaseWebApi { // 发布格式 if (cfg?.pageType == PageTypeEnum.Markdown) { - post.description = post.markdown + updatedPost.description = updatedPost.markdown } else { - post.description = post.html + updatedPost.description = updatedPost.html } return updatedPost diff --git a/src/adaptors/web/wuaipojie/wuaipojieConfig.ts b/src/adaptors/web/wuaipojie/wuaipojieConfig.ts new file mode 100644 index 0000000..6b0d7ef --- /dev/null +++ b/src/adaptors/web/wuaipojie/wuaipojieConfig.ts @@ -0,0 +1,50 @@ +/* + * 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 { CommonWebConfig } from "~/src/adaptors/web/base/commonWebConfig.ts" +import { CategoryTypeEnum, PageTypeEnum, PasswordType } from "zhi-blog-api" + +/** + * 吾爱破解配置 + */ +class WuaipojieConfig extends CommonWebConfig { + constructor(username: string, password: string, middlewareUrl?: string) { + super("https://www.52pojie.cn", "https://www.52pojie.cn/api", username, password, middlewareUrl) + this.previewUrl = "/thread-[threadid]-1-1.html" + this.pageType = PageTypeEnum.Html + this.passwordType = PasswordType.PasswordType_Cookie + this.usernameEnabled = true + this.tagEnabled = false + this.cateEnabled = false + this.knowledgeSpaceEnabled = true + this.knowledgeSpaceTitle = "帖子" + this.knowledgeSpaceType = CategoryTypeEnum.CategoryType_Single + this.allowKnowledgeSpaceChange = false + this.placeholder.knowledgeSpaceReadonlyModeTip = + "由于吾爱破解平台的限制,暂时不支持编辑所属帖子。如果您想移动帖子,请先取消删除该帖子,然后重新选择新的帖子发布" + } +} + +export { WuaipojieConfig } diff --git a/src/adaptors/web/xiaohongshu/xiaohongshuConfig.ts b/src/adaptors/web/xiaohongshu/xiaohongshuConfig.ts new file mode 100644 index 0000000..daced64 --- /dev/null +++ b/src/adaptors/web/xiaohongshu/xiaohongshuConfig.ts @@ -0,0 +1,49 @@ +/* + * 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 { CommonWebConfig } from "~/src/adaptors/web/base/commonWebConfig.ts" +import { PageTypeEnum, PasswordType } from "zhi-blog-api" + +/** + * 小红书配置 + */ +class XiaohongshuConfig extends CommonWebConfig { + constructor(username: string, password: string, middlewareUrl?: string) { + super("https://creator.xiaohongshu.com", "https://creator.xiaohongshu.com", username, password, middlewareUrl) + + this.previewUrl = "/p/[postid]" + this.pageType = PageTypeEnum.Markdown + this.passwordType = PasswordType.PasswordType_Cookie + this.usernameEnabled = false + // 小红书不支持标签 + this.tagEnabled = false + // 小红书不支持分类 + this.cateEnabled = false + // 小红书没有知识空间 + this.knowledgeSpaceEnabled = false + } +} + +export { XiaohongshuConfig } diff --git a/src/adaptors/web/zhihu/useZhihuWeb.ts b/src/adaptors/web/zhihu/useZhihuWeb.ts index 6ee7e9d..2164e24 100644 --- a/src/adaptors/web/zhihu/useZhihuWeb.ts +++ b/src/adaptors/web/zhihu/useZhihuWeb.ts @@ -27,14 +27,15 @@ import { ZhihuWebAdaptor } from "~/src/adaptors/web/zhihu/zhihuWebAdaptor.ts" import { ZhihuConfig } from "~/src/adaptors/web/zhihu/zhihuConfig.ts" import { createAppLogger } from "~/src/utils/appLogger.ts" import { PublisherAppInstance } from "~/src/publisherAppInstance.ts" -import { useSettingStore } from "~/src/stores/useSettingStore.ts" +import { usePublishSettingStore } from "~/src/stores/usePublishSettingStore.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" +import { LEGENCY_SHARED_PROXT_MIDDLEWARE } from "~/src/utils/constants.ts" /** - * 用于获取ZhihuWeb的API的自定义Hook + * 用于获取Zhihu的API的自定义Hook */ const useZhihuWeb = async (key?: string, newCfg?: ZhihuConfig) => { // 创建应用日志记录器 @@ -51,15 +52,12 @@ const useZhihuWeb = async (key?: string, newCfg?: ZhihuConfig) => { cfg = newCfg } else { // 从配置中获取数据 - const { getSetting } = useSettingStore() + const { getSetting } = usePublishSettingStore() const setting = await getSetting() cfg = JsonUtil.safeParse(setting[key], {} as ZhihuConfig) // 如果配置为空,则使用默认的环境变量值,并记录日志 if (ObjectUtil.isEmptyObject(cfg)) { - const middlewareUrl = Utils.emptyOrDefault( - process.env.VITE_MIDDLEWARE_URL, - "https://api.terwer.space/api/middleware" - ) + const middlewareUrl = Utils.emptyOrDefault(process.env.VITE_MIDDLEWARE_URL, LEGENCY_SHARED_PROXT_MIDDLEWARE) // 从环境变量获取Zhihu的cookie const zhihuCookie = Utils.emptyOrDefault(process.env.VITE_ZHIHU_AUTH_TOKEN, "") cfg = new ZhihuConfig("", zhihuCookie, middlewareUrl) @@ -67,10 +65,7 @@ const useZhihuWeb = async (key?: string, newCfg?: ZhihuConfig) => { } else { logger.info("Using configuration from settings...") } - const middlewareUrl = Utils.emptyOrDefault( - process.env.VITE_MIDDLEWARE_URL, - "https://api.terwer.space/api/middleware" - ) + const middlewareUrl = Utils.emptyOrDefault(process.env.VITE_MIDDLEWARE_URL, LEGENCY_SHARED_PROXT_MIDDLEWARE) if (StrUtil.isEmptyString(cfg.middlewareUrl)) { cfg.middlewareUrl = middlewareUrl } diff --git a/src/adaptors/web/zhihu/zhihuConfig.ts b/src/adaptors/web/zhihu/zhihuConfig.ts index e66d84f..c9a6e84 100644 --- a/src/adaptors/web/zhihu/zhihuConfig.ts +++ b/src/adaptors/web/zhihu/zhihuConfig.ts @@ -29,7 +29,7 @@ import { CategoryTypeEnum, PageTypeEnum, PasswordType } from "zhi-blog-api" /** * 知乎配置 */ -export class ZhihuConfig extends CommonWebConfig { +class ZhihuConfig extends CommonWebConfig { constructor(username: string, password: string, middlewareUrl?: string) { super("https://zhuanlan.zhihu.com", "https://zhuanlan.zhihu.com/api", username, password, middlewareUrl) this.previewUrl = "/p/[postid]" @@ -46,3 +46,5 @@ export class ZhihuConfig extends CommonWebConfig { "由于知乎平台的限制,暂时不支持编辑所属专栏。如果您想移动文档,请先点击取消删除该文档,然后重新选择新的专栏发布" } } + +export { ZhihuConfig } diff --git a/src/adaptors/web/zhihu/zhihuUtils.ts b/src/adaptors/web/zhihu/zhihuUtils.ts new file mode 100644 index 0000000..428b112 --- /dev/null +++ b/src/adaptors/web/zhihu/zhihuUtils.ts @@ -0,0 +1,140 @@ +/* + * 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 * as cheerio from "cheerio" + +/** + * 知乎工具类 + * + * @author terwer + * @since 1.6.0 + */ +class ZhihuUtils { + /** + * 处理HTML中的表格,将表格头部移动到表格体部分 + * + * @param html - 包含表格的HTML字符串 + * @returns 处理后的HTML字符串 + */ + public static processZHTable(html: string): string { + // 使用Cheerio加载HTML + const $ = cheerio.load(html) + + // 获取thead内容 + const theadContent = $("table thead").html() + // 移除thead + $("table thead").remove() + // 将thead内容添加到tbody的第一个位置 + $("table tbody tr:first-child").before(theadContent) + + // 选择表格元素并修改属性 + const table = $("table") + table + .attr("data-draft-node", "block") + .attr("data-draft-type", "table") + .attr("data-size", "normal") + .attr("data-row-style", "normal") + + return $.html() + } + + public static processZHMath(html: string): string { + // 使用Cheerio加载HTML + const $ = cheerio.load(html, { xmlMode: true, decodeEntities: false }) + + // 处理两个$符号和一个$符号包裹的公式 + const mathRegex = /\$\$([^\$]+)\$\$|\$([^\$]+)\$/g + + const elems = $("*:not(pre)") + elems.each((_index, element) => { + const content = $(element).html() ?? "" + const newContent = content.replace(mathRegex, (_match, doubleDollarContent, singleDollarContent) => { + const mathContent = doubleDollarContent || singleDollarContent + return `${mathContent}` + }) + $(element).html(newContent) + }) + + // 输出修改后的HTML + return $.html() + + // // 使用Cheerio加载HTML + // const $ = cheerio.load(html, { xmlMode: true }) + // + // // // 选择所有带有类名"language-math"的元素 + // // $("span.language-math").each((index, element) => { + // // // 获取元素的文本内容 + // // const mathContent = $(element).text() + // // + // // // 创建替代的标签 + // // const imgTag = `${mathContent}` + // // + // // // 用新的标签替换原始元素 + // // $(element).replaceWith(imgTag) + // // }) + // // + // // // 选择所有带有类名"language-math"的
元素 + // // $("div.language-math").each((index, element) => { + // // // 获取元素的文本内容 + // // const mathContent = $(element).text() + // // + // // // 创建替代的标签 + // // const imgTag = `

${mathContent}

` + // // + // // // 用新的标签替换原始元素 + // // $(element).replaceWith(imgTag) + // // }) + // + // // 处理两个$符号包裹的公式 + // const doubleDollarRegex = /\$\$([^$]+)\$\$/g + // $("*:not(pre)").each((index, element) => { + // const content = $(element).html() + // const newContent = content.replace(doubleDollarRegex, (match, mathContent) => { + // return `${mathContent}` + // }) + // $(element).html(newContent) + // }) + // + // // 处理一个$符号包裹的公式 + // const singleDollarRegex = /\$([^$]+)\$/g + // $("*:not(pre)").each((index, element) => { + // const content = $(element).html() + // const newContent = content.replace(singleDollarRegex, (match, mathContent) => { + // return `${mathContent}` + // }) + // $(element).html(newContent) + // }) + // + // // 输出修改后的HTML + // return $.html() + } +} + +export default ZhihuUtils diff --git a/src/adaptors/web/zhihu/zhihuWebAdaptor.ts b/src/adaptors/web/zhihu/zhihuWebAdaptor.ts index 8ce21f9..31a5c27 100644 --- a/src/adaptors/web/zhihu/zhihuWebAdaptor.ts +++ b/src/adaptors/web/zhihu/zhihuWebAdaptor.ts @@ -24,12 +24,14 @@ */ import { BaseWebApi } from "~/src/adaptors/web/base/baseWebApi.ts" -import { CategoryInfo, Post, UserBlog } from "zhi-blog-api" +import { BlogConfig, CategoryInfo, PageTypeEnum, Post, UserBlog } from "zhi-blog-api" import * as cheerio from "cheerio" import { JsonUtil, StrUtil } from "zhi-common" import CryptoJS from "crypto-js" import { arrayToBuffer } from "~/src/utils/polyfillUtils.ts" import { getAliOssClient } from "~/src/vendors/alioss/s3oss.ts" +import _ from "lodash-es" +import ZhihuUtils from "~/src/adaptors/web/zhihu/zhihuUtils.ts" /** * 知乎网页授权适配器 @@ -98,6 +100,38 @@ class ZhihuWebAdaptor extends BaseWebApi { return result } + public override async preEditPost(post: Post, id?: string, publishCfg?: any): Promise { + // 公共的属性预处理 + const doc = await super.preEditPost(post, id, publishCfg) + + // 知乎自定义的处理 + const cfg: BlogConfig = publishCfg?.cfg + const updatedPost = _.cloneDeep(doc) as Post + const html = updatedPost.html + this.logger.info("准备处理知乎正文") + this.logger.debug("html =>", { html: html }) + let updatedHtml = html + + // 处理表格 + updatedHtml = ZhihuUtils.processZHTable(updatedHtml) + // 处理数学公式 + updatedHtml = ZhihuUtils.processZHMath(updatedHtml) + + // 处理完毕 + updatedPost.html = updatedHtml + this.logger.info("知乎正文处理完毕") + this.logger.debug("updatedHtml =>", { updatedHtml: updatedHtml }) + + // 发布格式 + if (cfg?.pageType == PageTypeEnum.Markdown) { + updatedPost.description = updatedPost.markdown + } else { + updatedPost.description = updatedPost.html + } + + return updatedPost + } + public async addPost(post: Post) { const params = JSON.stringify({ title: post.title, diff --git a/src/ai/AiConstants.ts b/src/ai/AiConstants.ts new file mode 100644 index 0000000..ea74968 --- /dev/null +++ b/src/ai/AiConstants.ts @@ -0,0 +1,51 @@ +/* + * 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. + */ + +/** + * AI 常量 + * + * https://github.com/transitive-bullshit/chatgpt-api/blob/main/src/chatgpt-api.ts#L443 + * + * Use up to 4096 tokens (prompt + response), but try to leave 1000 tokens + * for the response. + */ +enum AiConstants { + /** + * 最大输入长度 + */ + MAX_INPUT_TOKEN_LENGTH = 3000, + + /** + * 最大指令长度 + */ + // MAX_PROMPT_LENGTH = 96, + + /** + * 标题返回字符限制 + */ + // MAX_RESP_TITLE_LENGTH = 255, +} + +export { AiConstants } diff --git a/src/ai/prompt.ts b/src/ai/prompt.ts new file mode 100644 index 0000000..d176aa6 --- /dev/null +++ b/src/ai/prompt.ts @@ -0,0 +1,113 @@ +/* + * 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 { AiPrompt } from "~/src/models/aiPrompt.ts" + +/** + * 智能提取信息的自动化工具 + */ + +/** + * 提取标题的配置信息 + */ +const titlePrompt = { + title: "自动提取标题", + description: "从文章内容中生成有意义的标题", + key: "title", + content: + "请为这篇文章生成简洁且完整概括的标题,只处理文本,尽量返回中文标题。" + + "标题长度不超过100个中文字符或255个英文字符。" + + "输出为 JSON 格式,键名为 title,结果需放在 {} 内。" + + "完整结果必须是合法JSON,不得包含非法 JSON 字符。", +} +export type TitleAIResult = { + title: string +} + +/** + * 提取摘要的配置信息 + */ +const shortDescPrompt = { + title: "自动提取摘要", + description: "从文章内容生成文章摘要", + key: "desc", + content: + "请为这篇文章生成简明扼要的摘要,只处理文本,尽量返回中文摘要。" + + "摘要长度不超过255个中文字符或512个英文字符。" + + "输出为 JSON 格式,键名为 desc,结果需放在 {} 内。" + + "完整结果必须是合法JSON,不得包含非法 JSON 字符。", +} +export type ShortDescAIResult = { + desc: string +} + +/** + * 提取标签的配置信息 + */ +const tagPrompt = { + title: "自动提取标签", + description: "为文章添加标签", + key: "tags", + content: + "请为这篇文章生成标签,只处理文本,尽量返回中文标签。" + + "单个标签不超过6个字符,多个标签用英文逗号分隔,最多返回5个标签。" + + "如果单个标签是英文,英文字母必须全部小写并且每个单词之间用-拼接。" + + "标签名称不能重复,不能包含任何除英文字母、-以及汉字以外的字符。" + + "输出为 JSON 格式,键名为 tags,指令放在数组内,结果需放在 {} 内。" + + "完整结果必须是合法JSON,不得包含非法 JSON 字符。", +} +export type TagAIResult = { + tags: string[] +} + +/** + * 提取分类的配置信息 + */ +const categoryPrompt = { + title: "自动提取分类", + description: "对文章内容进行分类", + key: "categories", + content: + "请为这篇文章文章内容进行分类,只处理文本,尽量返回中文分类。" + + "每个分类名称不超过6个字符,最多返回3个分类。" + + "如果分类是英文,需要使用驼峰命名并且首字母大写。" + + "输出为 JSON 格式,键名为 categories,结果需放在 {} 内。" + + "完整结果必须是合法JSON,不得包含非法 JSON 字符。", +} +export type CategoryAIResult = { + categories: string[] +} + +/** + * 自动提取工具的配置集合 + */ +const prompt = { + titlePrompt, + shortDescPrompt, + tagPrompt, + categoryPrompt, +} + +export { prompt } diff --git a/src/assets/style.css b/src/assets/style.css index 5d8da85..afdfdbb 100644 --- a/src/assets/style.css +++ b/src/assets/style.css @@ -36,15 +36,16 @@ html { body { margin: 0; font-size: 100%; - height: 97.5%; + height: 100%; } #app { color: var(--custom-app-color); background: var(--custom-app-bg-color); padding: 10px 0; - min-width: 600px; + min-width: 768px; min-height: 99%; + font-family: var(--g-font-family); } a { diff --git a/src/bootstrap.ts b/src/bootstrap.ts new file mode 100644 index 0000000..fd7b779 --- /dev/null +++ b/src/bootstrap.ts @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2023-2024, 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 { createApp } from "vue" +import App from "./App.vue" +import { createAppLogger } from "./utils/appLogger.ts" +import { useVueRouter } from "./composables/useVueRouter.ts" +import i18n from "./locales" +import { createPinia } from "pinia" +import iframeResize from "./utils/directives/iframeResize.ts"; + +/** + * Vue 入口 + * + * @author terwer + * @version 0.9.0 + * @since 0.0.1 + */ +const createVueApp = async (isMount?: boolean) => { + const logger = createAppLogger("vue-main-entry") + + // https://stackoverflow.com/a/62383325/4037224 + const app = createApp(App) + + // 国际化 + app.use(i18n) + + // pinia + const pinia = createPinia() + app.use(pinia) + + // router + const router = useVueRouter() + app.use(router) + + // ElementPlus 包太大,需要改成按需引入 + // https://element-plus.org/zh-CN/guide/quickstart.html#%E6%8C%89%E9%9C%80%E5%AF%BC%E5%85%A5 + // app.use(ElementPlus) + + // ifreme resizere + app.directive('resize', iframeResize) + + return { i18n, router, app } +} + +export { createVueApp } diff --git a/src/components/common/DrawerBoxBridge.vue b/src/components/common/DrawerBoxBridge.vue new file mode 100644 index 0000000..cda348e --- /dev/null +++ b/src/components/common/DrawerBoxBridge.vue @@ -0,0 +1,51 @@ + + + + + + \ No newline at end of file diff --git a/src/components/common/LoadingTimer.vue b/src/components/common/LoadingTimer.vue new file mode 100644 index 0000000..552275a --- /dev/null +++ b/src/components/common/LoadingTimer.vue @@ -0,0 +1,25 @@ + + + diff --git a/src/components/publish/BatchPublishIndex.vue b/src/components/publish/BatchPublishIndex.vue index 526375a..97a2c4c 100644 --- a/src/components/publish/BatchPublishIndex.vue +++ b/src/components/publish/BatchPublishIndex.vue @@ -27,27 +27,27 @@ 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, toRaw } from "vue" +import { markRaw, onMounted, reactive, ref, toRaw } from "vue" import { usePublish } from "~/src/composables/usePublish.ts" import { useSiyuanApi } from "~/src/composables/useSiyuanApi.ts" import { useVueI18n } from "~/src/composables/useVueI18n.ts" import { ElMessage, ElMessageBox } from "element-plus" import { StrUtil } from "zhi-common" -import { pre } from "~/src/utils/import/pre.ts" +import { pre } from "~/src/platforms/pre.ts" import { Delete } from "@element-plus/icons-vue" import { BrowserUtil } from "zhi-device" import { usePublishConfig } from "~/src/composables/usePublishConfig.ts" -import { Post } from "zhi-blog-api" +import { PageEditMode, 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 { ICategoryConfig } from "~/src/types/ICategoryConfig.ts" import { SiyuanAttr } from "zhi-siyuan-api" import { DistributionPattern } from "~/src/models/distributionPattern.ts" -import _ from "lodash" +import _ from "lodash-es" import PublishTitle from "~/src/components/publish/form/PublishTitle.vue" import { useChatGPT } from "~/src/composables/useChatGPT.ts" +import { useLoadingTimer } from "~/src/composables/useLoadingTimer.ts" const logger = createAppLogger("publisher-index") @@ -72,6 +72,8 @@ const sysKeys = pre.systemCfg.map((item) => { }) const id = StrUtil.isEmptyString(props.id) ? process.env.VITE_DEV_PAGE_ID : props.id const formData = reactive({ + isInit: false, + // loading isPublishLoading: false, isDeleteLoading: false, @@ -79,8 +81,8 @@ const formData = reactive({ // process showProcessResult: false, errCount: 0, - successBatchResults: [], - failBatchResults: [], + successBatchResults: [] as any[], + failBatchResults: [] as any[], // 单个平台信息 siyuanPost: {} as Post, @@ -111,6 +113,8 @@ const formData = reactive({ const handlePublish = async () => { try { formData.isPublishLoading = true + isTimerInit.value = false + if (formData.dynList.length === 0) { throw new Error("必须选择一个分发平台") } @@ -177,6 +181,7 @@ const handlePublish = async () => { }) } finally { formData.isPublishLoading = false + isTimerInit.value = true } } @@ -330,6 +335,10 @@ const checkChatGPTEnabled = () => { return flag } +// 计时器 +const isTimerInit = ref(false) +const { loadingTime } = useLoadingTimer(isTimerInit) + onMounted(async () => { // ================== // 初始化开始 @@ -348,16 +357,24 @@ onMounted(async () => { // 这里可以控制一些功能开关 formData.useAi = checkChatGPTEnabled() formData.editType = PageEditMode.EditMode_simple + + formData.isInit = true + isTimerInit.value = true })