From cabbc66b67f5f447b2b32e2c02f0fb6c1fb03e1c Mon Sep 17 00:00:00 2001 From: yliu Date: Tue, 28 Jul 2026 13:59:30 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=AE=8C=E5=96=84=E5=BC=80=E6=BA=90?= =?UTF-8?q?=E6=96=87=E6=A1=A3=E4=B8=8E=20npm=20=E5=8F=91=E5=B8=83=E6=B5=81?= =?UTF-8?q?=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../skills/chinese-article-writing/SKILL.md | 88 + .../agents/openai.yaml | 4 + .../references/marks.md | 165 + .../references/number.md | 68 + .../references/paragraph.md | 30 + .../references/sample-article.md | 458 +++ .../references/structure.md | 56 + .../references/text.md | 183 + .../references/title.md | 84 + .agents/skills/git-step-commit/SKILL.md | 122 + .../skills/git-step-commit/agents/openai.yaml | 4 + .agents/skills/publish-npm-packages/SKILL.md | 15 + .../publish-npm-packages/agents/openai.yaml | 4 + .../references/minimal-example.md | 115 + .../references/monorepo.md | 134 + .../references/npm-configuration.md | 287 ++ .../references/organization-packages.md | 120 + .../references/policy-and-prerequisites.md | 86 + .../references/verification.md | 66 + .gitattributes | 2 + .github/ISSUE_TEMPLATE/bug-report.yml | 43 + .github/ISSUE_TEMPLATE/config.yml | 8 + .github/ISSUE_TEMPLATE/feature-request.yml | 23 + .github/pull_request_template.md | 10 + .github/workflows/ci.yml | 32 + .github/workflows/docs.yml | 63 + .github/workflows/release-please.yml | 89 +- .gitignore | 3 + .prettierignore | 8 + .prettierrc.mjs | 1 - .release-please-manifest.json | 3 + CHANGELOG.md | 24 - CODE_OF_CONDUCT.md | 16 + CONTRIBUTING.md | 32 + License => LICENSE.txt | 2 +- README.md | 121 +- SECURITY.md | 16 + SUPPORT.md | 5 + __test__/rule.test.ts | 45 - docs/.gitignore | 14 + docs/README.md | 8 + docs/docs/_nav.json | 15 + docs/docs/guide/_meta.json | 1 + docs/docs/guide/configuration.md | 53 + docs/docs/guide/getting-started.mdx | 50 + docs/docs/guide/introduction.md | 21 + docs/docs/guide/node-api.md | 42 + docs/docs/guide/rules.md | 24 + docs/docs/index.md | 31 + {img => docs/docs/public/images}/image-1.png | Bin {img => docs/docs/public/images}/image-2.png | Bin {img => docs/docs/public/images}/image.png | Bin {img => docs/docs/public/images}/logo.png | Bin docs/package.json | 22 + docs/rspress.config.ts | 23 + docs/tsconfig.json | 29 + eslint.config.mjs | 15 +- package.json | 84 +- packages/prettier-plugin-lint-md/CHANGELOG.md | 21 + packages/prettier-plugin-lint-md/LICENSE.txt | 21 + packages/prettier-plugin-lint-md/README.md | 25 + .../__test__}/index.test.ts | 55 +- .../__test__/rule.test.ts | 82 + .../__test__}/utils.test.ts | 5 +- packages/prettier-plugin-lint-md/package.json | 69 + .../prettier-plugin-lint-md/src}/index.ts | 24 +- .../prettier-plugin-lint-md/src}/rules.ts | 15 +- .../prettier-plugin-lint-md/src}/types.ts | 11 +- .../prettier-plugin-lint-md/src}/utils.ts | 52 +- .../tsconfig.build.json | 0 .../prettier-plugin-lint-md/tsconfig.json | 0 .../tsconfig.options.json | 0 .../prettier-plugin-lint-md/vite.config.ts | 6 +- pnpm-lock.yaml | 2943 ++++++++++++----- pnpm-workspace.yaml | 7 + release-please-config.json | 8 + skills-lock.json | 23 + 77 files changed, 5303 insertions(+), 1131 deletions(-) create mode 100644 .agents/skills/chinese-article-writing/SKILL.md create mode 100644 .agents/skills/chinese-article-writing/agents/openai.yaml create mode 100644 .agents/skills/chinese-article-writing/references/marks.md create mode 100644 .agents/skills/chinese-article-writing/references/number.md create mode 100644 .agents/skills/chinese-article-writing/references/paragraph.md create mode 100644 .agents/skills/chinese-article-writing/references/sample-article.md create mode 100644 .agents/skills/chinese-article-writing/references/structure.md create mode 100644 .agents/skills/chinese-article-writing/references/text.md create mode 100644 .agents/skills/chinese-article-writing/references/title.md create mode 100644 .agents/skills/git-step-commit/SKILL.md create mode 100644 .agents/skills/git-step-commit/agents/openai.yaml create mode 100644 .agents/skills/publish-npm-packages/SKILL.md create mode 100644 .agents/skills/publish-npm-packages/agents/openai.yaml create mode 100644 .agents/skills/publish-npm-packages/references/minimal-example.md create mode 100644 .agents/skills/publish-npm-packages/references/monorepo.md create mode 100644 .agents/skills/publish-npm-packages/references/npm-configuration.md create mode 100644 .agents/skills/publish-npm-packages/references/organization-packages.md create mode 100644 .agents/skills/publish-npm-packages/references/policy-and-prerequisites.md create mode 100644 .agents/skills/publish-npm-packages/references/verification.md create mode 100644 .gitattributes create mode 100644 .github/ISSUE_TEMPLATE/bug-report.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/feature-request.yml create mode 100644 .github/pull_request_template.md create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/docs.yml create mode 100644 .prettierignore create mode 100644 .release-please-manifest.json delete mode 100644 CHANGELOG.md create mode 100644 CODE_OF_CONDUCT.md create mode 100644 CONTRIBUTING.md rename License => LICENSE.txt (96%) create mode 100644 SECURITY.md create mode 100644 SUPPORT.md delete mode 100644 __test__/rule.test.ts create mode 100644 docs/.gitignore create mode 100644 docs/README.md create mode 100644 docs/docs/_nav.json create mode 100644 docs/docs/guide/_meta.json create mode 100644 docs/docs/guide/configuration.md create mode 100644 docs/docs/guide/getting-started.mdx create mode 100644 docs/docs/guide/introduction.md create mode 100644 docs/docs/guide/node-api.md create mode 100644 docs/docs/guide/rules.md create mode 100644 docs/docs/index.md rename {img => docs/docs/public/images}/image-1.png (100%) rename {img => docs/docs/public/images}/image-2.png (100%) rename {img => docs/docs/public/images}/image.png (100%) rename {img => docs/docs/public/images}/logo.png (100%) create mode 100644 docs/package.json create mode 100644 docs/rspress.config.ts create mode 100644 docs/tsconfig.json create mode 100644 packages/prettier-plugin-lint-md/CHANGELOG.md create mode 100644 packages/prettier-plugin-lint-md/LICENSE.txt create mode 100644 packages/prettier-plugin-lint-md/README.md rename {__test__ => packages/prettier-plugin-lint-md/__test__}/index.test.ts (61%) create mode 100644 packages/prettier-plugin-lint-md/__test__/rule.test.ts rename {__test__ => packages/prettier-plugin-lint-md/__test__}/utils.test.ts (57%) create mode 100644 packages/prettier-plugin-lint-md/package.json rename {src => packages/prettier-plugin-lint-md/src}/index.ts (50%) rename {src => packages/prettier-plugin-lint-md/src}/rules.ts (83%) rename {src => packages/prettier-plugin-lint-md/src}/types.ts (90%) rename {src => packages/prettier-plugin-lint-md/src}/utils.ts (62%) rename tsconfig.build.json => packages/prettier-plugin-lint-md/tsconfig.build.json (100%) rename tsconfig.json => packages/prettier-plugin-lint-md/tsconfig.json (100%) rename tsconfig.options.json => packages/prettier-plugin-lint-md/tsconfig.options.json (100%) rename vite.config.ts => packages/prettier-plugin-lint-md/vite.config.ts (86%) create mode 100644 release-please-config.json create mode 100644 skills-lock.json diff --git a/.agents/skills/chinese-article-writing/SKILL.md b/.agents/skills/chinese-article-writing/SKILL.md new file mode 100644 index 0000000..7a44b15 --- /dev/null +++ b/.agents/skills/chinese-article-writing/SKILL.md @@ -0,0 +1,88 @@ +--- +name: chinese-article-writing +description: Create, rewrite, polish, and proofread Chinese articles, technical blogs, documentation, and technical talks. Use when the user asks for Chinese writing help, Chinese technical article structure, tone consistency, proofreading, terminology consistency, punctuation, spacing, formatting, or fixing awkward Chinese prose. +--- + +# 中文文章书写助手 + +本技能用于指导中文文章的书写,解决“不知道如何写、只能凭感觉写”的问题。 +内容分为写作语气、写作流程和写作规范。请根据任务按需读取参考文件,不要默认加载全部 references。 + +## 适用场景 + +当用户需要以下任务时,使用本技能: + +- 编写中文技术文章、博客或技术分享 +- 规范或润色已有中文文档 +- 统一文章风格与结构 +- 提高文章的专业性与可读性 +- **修复文章中的语气不一致问题** +- **修正错别字、病句、用词不当** +- **统一英文大小写、术语与格式** + +## 使用流程 + +根据用户需求,选择以下执行方式: + +### 生成或重写模式 + +1. 明确文章类型与目标读者 +2. 判断是否需要读取语气示例 +3. 按任务类型读取对应写作规范 +4. 生成完整文章或重写指定内容 + +### 修复与校对模式 + +1. 通读用户提供的全文或指定段落 +2. 统一整体语气,避免前后风格不一致 +3. 修复以下常见问题: + - 错别字与明显病句 + - 英文与缩写的大小写不一致 + - 技术术语前后不统一 + - 口语化、模糊或不精确表达 +4. 在不改变原意的前提下提升清晰度与专业度 + +## 参考文件选择 + +按任务选择参考文件,不要为了普通润色或短文本修复加载全部文件: + +- 标题、层级、目录命名:读取 [标题规范](./references/title.md) +- 句子、字间距、英文处理、表达风格:读取 [文本规范](./references/text.md) +- 段落组织、引用、段落长度:读取 [段落规范](./references/paragraph.md) +- 数字、百分比、货币、范围表达:读取 [数值规范](./references/number.md) +- 标点、引号、括号、破折号、省略号:读取 [标点符号规范](./references/marks.md) +- 技术文档、手册、知识库结构:读取 [文档体系规范](./references/structure.md) +- 长文写作、技术分享、需要模仿语气时:读取 [语气示例](./references/sample-article.md) + +`sample-article.md` 只用于参考表达节奏、段落组织和技术叙述语气,不要复用其中的主题、观点或具体内容。 + +## 中文写作规范 + +中文技术文档应优先保证清晰、准确、克制和一致。修改文章时,先保持原意,再优化结构和表达。 + +## 常见写作问题修复规范 + +在修复与校对模式下,请遵循以下原则: + +### 语气 + +- 保持全文语气一致(技术理性 / 分享叙述 / 教学说明) +- 避免同一篇文章中混用口语与正式书面语 +- 避免情绪化或夸张表达(除非是分享类文章) + +### 错别字与病句 + +- 修正明显错别字 +- 调整语序不通顺的句子 +- 删除重复或冗余表达 + +### 大小写与格式 + +- 英文缩写统一大小写(如 API、HTTP、i18n) +- 中英文之间保留适当空格 +- 数字与单位格式保持一致 + +### 术语一致性 + +- 同一概念只使用一种表述 +- 首次出现时可给出全称,后续使用简称 diff --git a/.agents/skills/chinese-article-writing/agents/openai.yaml b/.agents/skills/chinese-article-writing/agents/openai.yaml new file mode 100644 index 0000000..f9314c8 --- /dev/null +++ b/.agents/skills/chinese-article-writing/agents/openai.yaml @@ -0,0 +1,4 @@ +interface: + display_name: "Chinese Article Writing" + short_description: "Polish Chinese technical writing" + default_prompt: "Use $chinese-article-writing to polish this Chinese technical article for clarity, tone, and formatting." diff --git a/.agents/skills/chinese-article-writing/references/marks.md b/.agents/skills/chinese-article-writing/references/marks.md new file mode 100644 index 0000000..a46d236 --- /dev/null +++ b/.agents/skills/chinese-article-writing/references/marks.md @@ -0,0 +1,165 @@ +# 标点符号 + +## 原则 + +(1)中文语句的标点符号,均应该采取全角符号,这样可以与全角文字保持视觉的一致。 + +(2)如果整句为英文,则该句使用英文/半角标点。 + +(3)句号、问号、叹号、逗号、顿号、分号和冒号不得出现在一行之首。 + +(4)点号(句号、逗号、顿号、分号、冒号)不得出现在标题的末尾,而标号(引号、括号、破折号、省略号、书名号、着重号、间隔号、叹号、问号)可以。 + +## 句号 + +(1)中文语句的结尾处应该用全角句号(`。`)。 + +(2)句子末尾用括号加注时,句号应在括号之外。 + +``` +错误:关于文件的输出,请参照第 1.3 节(见第 26 页。) + +正确:关于文件的输出,请参照第 1.3 节(见第 26 页)。 +``` + +## 逗号 + +(1)逗号(`,`)表示句子内部的一般性停顿。 + +(2)注意避免“一逗到底”,即整个段落除了结尾,全部停顿都使用逗号。 + +## 顿号 + +(1)句子内部的并列词,应该用全角顿号(`、`) 分隔,而不用逗号,即使并列词是英语也是如此。 + +``` +错误:我最欣赏的科技公司有 Google, Facebook, 腾讯, 阿里和百度等。 + +正确:我最欣赏的科技公司有 Google、Facebook、腾讯、阿里和百度等。 +``` + +(2)英文句子中,并列词语之间使用半角逗号(`,`)分隔。 + +``` +例句:Microsoft Office includes Word, Excel, PowerPoint, Outlook and other components. +``` + +(3)中文句子内部的并列词,最后一个尽量使用(`和`)来连接,使句子读起来更加连贯,下面两个句子都可以,第二个更优。 + +``` +正确:我最欣赏的科技公司有 Google、Facebook、腾讯、阿里,以及百度等。 + +正确:我最欣赏的科技公司有 Google、Facebook、腾讯、阿里和百度等。 +``` + +## 分号 + +(1)分号(`;`)表示复句内部并列分句之间的停顿。 + +## 引号 + +(1)引用时,应该使用全角双引号(`“ ”`),注意前后双引号不同。 + +``` +例句:许多人都认为客户服务的核心是“友好”和“专业”。 +``` + +(2)引号里面还要用引号时,外面一层用双引号,里面一层用单引号(`‘ ’`),注意前后单引号不同。 + +``` +例句:鲍勃解释道:“我要放音乐,可萨利说,‘不行!’。” +``` + +## 括号 + +(1)补充说明时,使用全角圆括号(`()`),括号前后不加空格。 + +``` +例句:请确认所有的连接(电缆和接插件)均安装牢固。 +``` + +(2)几种括号的中英文名称。 + +| | 英文 | 中文 | +| ----- | :-------------------------: | :----: | +| `{ }` | braces 或 curly brackets | 大括号 | +| `[ ]` | square brackets 或 brackets | 方括号 | +| `< >` | angled brackets | 尖括号 | +| `( )` | parentheses | 圆括号 | + +## 冒号 + +(1)全角冒号(`:`)常用在需要解释的词语后边,引出解释和说明。 + +``` +例句:请确认以下几项内容:时间、地点、活动名称和来宾数量。 +``` + +(2)表示时间时,应使用半角冒号(`:`)。 + +``` +例句:早上 8:00 +``` + +## 省略号 + +(1)省略号(`⋯⋯`)表示语句未完、或者语气的不连续。 + +(2)省略号占两个汉字空间、包含六个省略点,不要使用`。。。`或`...`等非标准形式。 + +(3)省略号不应与“等”这个词一起使用。 + +``` +错误:我们为会餐准备了香蕉、苹果、梨…等各色水果。 + +正确:我们为会餐准备了各色水果,有香蕉、苹果、梨⋯⋯ + +正确:我们为会餐准备了香蕉、苹果、梨等各色水果。 +``` + +## 感叹号 + +(1)应该使用平静的语气叙述,尽量避免使用感叹号(`!`)。 + +(2)不得多个感叹号连用,比如`!!`和`!!!`。 + +## 破折号 + +(1)破折号`————`一般用于进一步解释。 + +(2)破折号应占两个汉字的位置。如果破折号本身只占一个汉字的位置,那么前后应该留出一个半角空格。 + +``` +例句:直觉————尽管它并不总是可靠的————告诉我,这事可能出了些问题。 + +例句:直觉 —— 尽管它并不总是可靠的 —— 告诉我,这事可能出了些问题。 +``` + +## 连接号 + +(1)连接号用于连接两个类似的词。 + +(2)以下场合应该使用直线连接号(`-`),占一个半角字符的位置。 + +- 两个名词的复合 +- 图表编号 + +``` +例句:氧化-还原反应 + +例句:图 1-1 +``` + +(3)数值范围(例如日期、时间或数字)应该使用波浪连接号(`~`)或一字号(`—`),占一个全角字符的位置。 + +``` +例句:2009 年~2011 年 +``` + +注意,波浪连接号前后两个值都建议加上单位。 + +(4)波浪连接号也可以用汉字“至”代替。 + +``` +例句:周围温度:-20 °C 至 -10 °C +``` diff --git a/.agents/skills/chinese-article-writing/references/number.md b/.agents/skills/chinese-article-writing/references/number.md new file mode 100644 index 0000000..20006cf --- /dev/null +++ b/.agents/skills/chinese-article-writing/references/number.md @@ -0,0 +1,68 @@ +# 数值 + +## 半角数字 + +阿拉伯数字一律使用半角形式,不得使用全角形式。 + +``` +错误:这件商品的价格是1000元。 + +正确:这件商品的价格是 1000 元。 +``` + +## 千分号 + +数值为千位以上,应添加千分号(半角逗号)。 + +``` +XXX 公司的实收资本为 ¥1,258,000 人民币。 +``` + +对于 4 位的数值,千分号是选用的,比如`1000`和`1,000`都可以接受。对于 4 位以上的数值,应添加千分号。 + +## 货币 + +货币应为阿拉伯数字,并在数字前写出货币符号,或在数字后写出货币中文名称。 + +``` +$1,000 +1,000 美元 +``` + +英文的货币名称,建议参考国际标准 [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217)。 + +## 数值范围 + +表示数值范围时,用波浪线(`~`)或一字线(`—`)连接。参见《标点符号》一节的“连接号”部分。 + +带有单位或百分号时,两个数字建议都要加上单位或百分号。 + +``` +132 kg~234 kg + +67%~89% +``` + +## 变化程度的表示法 + +数字的增加要使用“增加了”、“增加到”。“了”表示增量,“到”表示定量。 + +``` +增加到过去的两倍 +(过去为一,现在为二) + +增加了两倍 +(过去为一,现在为三) +``` + +数字的减少要使用“降低了”、“降低到”。“了”表示增量,“到”表示定量。 + +``` +降低到百分之八十 +(定额是一百,现在是八十) + +降低了百分之八十 +(原来是一百,现在是二十) +``` + +不能用“降低 N 倍”或“减少 N 倍”的表示法,要用“降低百分之几”或“减少百分之几”。因为减少(或降低)一倍表示数值原来为一百,现在等于零。 diff --git a/.agents/skills/chinese-article-writing/references/paragraph.md b/.agents/skills/chinese-article-writing/references/paragraph.md new file mode 100644 index 0000000..02b32d8 --- /dev/null +++ b/.agents/skills/chinese-article-writing/references/paragraph.md @@ -0,0 +1,30 @@ +# 段落 + +## 原则 + +- 一个段落只能有一个主题,或一个中心句子。 +- 段落的中心句子放在段首,对全段内容进行概述。后面陈述的句子为中心句子服务。 +- 一个段落的长度不能超过七行,最佳段落长度小于等于四行。 +- 段落的句子语气要使用陈述和肯定语气,避免使用感叹语气。 +- 段落之间使用一个空行隔开。 +- 段落开头不要留出空白字符。 + +## 引用 + +引用第三方内容时,应注明出处。 + +``` +One man’s constant is another man’s variable. — Alan Perlis +``` + +如果是全篇转载,请在全文开头显著位置注明作者和出处,并链接至原文。 + +``` +本文转载自 WikiQuote +``` + +使用外部图片时,必须在图片下方或文末标明来源。 + +``` +本文部分图片来自 Wikipedia +``` diff --git a/.agents/skills/chinese-article-writing/references/sample-article.md b/.agents/skills/chinese-article-writing/references/sample-article.md new file mode 100644 index 0000000..1a018bd --- /dev/null +++ b/.agents/skills/chinese-article-writing/references/sample-article.md @@ -0,0 +1,458 @@ +# 探索现代化 i18n 方案:从工程自动化到 AI 驱动的演进 + +在最近参与的一个中大型前端项目中,随着业务需求的快速变化和代码的频繁重构,国际化(i18n)逐渐从“基础设施”演变成了一个明显的工程负担。 + +一个非常典型的场景是:**组件逻辑已经修改完成,但 `locales` 目录下的 JSON 文件却长期处于滞后状态**。新增的文案没有及时补齐,删除的页面却遗留了一堆无人使用的 Key。随着项目规模扩大,这类问题会被不断放大。 + +这背后其实暴露的是一个更本质的问题:**传统 i18n 的工作流,与现代前端开发节奏并不匹配**。 + +在深入探讨改进方案之前,我们有必要先回顾一下当前主流 i18n 方案的设计思路及其局限。 + +## 1. 传统基石:vue-i18n 的设计取舍 + +在 Vue 生态中,`vue-i18n` 几乎是事实标准。它成熟、稳定,并且覆盖了大多数国际化场景。 + +从实现机制上看,`vue-i18n` 的核心是 **运行时(Runtime)替换**: + +- 开发者在模板或脚本中通过 `$t('key')` 访问文案 +- 运行时根据当前语言环境,从预先加载的 JSON 语言包中查找并返回对应字符串 +- 同时支持复数规则、日期/数字格式化等高级能力 + +从“框架插件”的角度来看,这样的设计并没有问题,但在真实工程实践中,它也带来了一些长期被忽视的成本。 + +**常见痛点包括:** + +- **Key 设计成本高** + 为每一条文案设计一个“语义清晰、层级合理、可长期维护”的 Key,本身就是一项隐性工作量。 +- **代码与文案强解耦** + Key 分散在业务代码中,真实文案却集中在 JSON 文件里,删除或重构页面时,很容易留下大量“无效翻译”。 +- **上下文缺失导致翻译质量不稳定** + 无论是人工翻译还是机器翻译,单独面对一个 Key,很难准确理解其真实使用场景。 + 这些问题并非 `vue-i18n` 本身的缺陷,而是 **“Key 驱动”这一设计范式的天然代价**。 + +## 2. 自动化方向的探索:基于 AST 的 i18n 工具 + +为了降低 Key 维护和手工同步的成本,社区中逐渐出现了一类自动化工具,例如 +[auto-i18n-translation-plugins](https://github.com/auto-i18n/auto-i18n-translation-plugins)。 + +这类方案的核心思想是:**让工具理解代码,而不是让人维护映射关系**。 + +其典型流程如下: + +1. **静态扫描** + 基于 AST 分析源代码,提取其中的中文字符串 +2. **自动替换** + 将源码中的中文替换为生成的 Key(通常是 Hash 值) +3. **自动翻译** + 调用 Google / 百度等翻译 API,生成多语言文案 +4. **配置写入** + 自动维护语言包文件 + 在工程效率层面,这一步已经是一次明显的跃迁: + **开发者几乎可以忽略 i18n 的存在,先完成业务,再由工具兜底。** + +但当项目进入更复杂的业务领域后,新的问题也随之出现。 + +**主要瓶颈在于翻译质量:** + +- 通用翻译 API 缺乏领域上下文 +- 无法区分业务语义(如金融、医疗、后台系统等) +- 仍然需要大量人工校对 + +这类工具解决了“效率问题”,但并没有真正解决“准确性问题”。 + +## 3. 进一步演进:AI 驱动的 i18n 设计思路 + +在当前 LLM 已经高度成熟的背景下,我认为 i18n 方案的设计目标可以进一步升级: + +> **以 Developer Experience 为核心,尽可能贴近自然语言,并把翻译质量交给更“理解上下文”的模型。** + +### 3.1 语法层面的取舍:回归自然语言 + +首先,一个关键决策是:**不再强制开发者手动定义 Key**。 + +代码中的国际化调用,应该尽量接近自然语言本身: + +```js +// 基础用法:直接使用中文 +const msg = t`你好`; + +// 带上下文的用法 +const status = t("待审核", "金融风控业务状态"); +``` + +这样的语法带来几个直接收益: + +- 文案在代码中是可读的,而不是抽象的 Key +- Code Review 时无需在 JSON 文件和业务代码之间来回切换 +- 上下文信息可以显式传递给翻译系统 + +### 3.2 更合理的 Key 生成策略 + +在生成语言包时,我们同样可以放弃不可读的 Hash Key,而采用: + +> **「中文原文 + 上下文注释」作为唯一标识** + +示例: + +```json +{ + "待审核#金融风控业务状态": { + "english": "Pending Review" + } +} +``` + +这种设计的优势在于: + +- **天然避免语义冲突** 同样是“取消”,在“订单操作”和“账户注销”场景下可以通过上下文区分 +- **Key 本身即文档** 语言包文件在人工审核时非常直观 +- **更适合多语言扩展** 在后续生成日文、法文、韩文等语言时,可以复用同一套 Key 体系,无需额外维护映射关系 + +### 3.3 虚拟模块:让翻译数据成为构建产物 + +为了避免手动管理中间文件,可以利用 Vite / Rollup 的 **Virtual Module(虚拟模块)** 能力。 + +简单来说,插件可以在构建阶段动态生成一个模块,例如: + +```ts +import { t } from "virtual:ai-i18n"; +``` + +构建工具会拦截该导入,并返回由插件实时生成的运行时代码,其中已经包含: + +- 当前语言包 +- `t`、`setLang` 等辅助函数 + +这样一来: + +- 翻译数据成为构建流程的一部分 +- 不需要关心 JSON 文件的加载和同步问题 +- 工程结构更加清晰 + +**虚拟模块的设计意义**: + +1. **语言包属于构建产物,而不是源码文件** +2. **无需生成中间文件,也无需 commit** +3. **极大提升开发者体验**,让文案写作像原生语言特性一样自然 + +### 3.4 自动导入,进一步压缩心智负担 + +配合 `unplugin-auto-import`,甚至可以省略显式的 import: + +```ts +t`你好`; +``` + +从开发体验上看,这已经接近“原生写文案”的感觉。 + +## 4. 插件选项:目标语言与默认语言 + +插件提供灵活配置: + +```ts +aiI18nPlugin({ + targetLangs: ["english", "ja", "fr"], // 所有需要生成的目标语言 + defaultLang: "english", // 默认翻译语言 +}); +``` + +- 如果未传 `defaultLang`,默认使用 `'english'` +- `targetLangs` 至少包含默认语言 +- 后续生成语言包的结构统一为单文件 JSON + +## 5. 插件输出文件:单 JSON + 可人工校准 + +为了最大化可维护性,输出语言包为: + +``` +locales/i18n.json +``` + +格式示例: + +```json +{ + "提交#表单操作": { + "english": "Submit", + "ja": "", + "fr": "" + }, + "待审核#金融风控业务状态": { + "english": "Pending Review" + } +} +``` + +**特点:** + +- **单文件管理**:避免多语言文件分散,方便查找与审核 +- **只处理未翻译 Key**:插件不会覆盖已有翻译 +- **支持人工校准**:你可以在 `locales/i18n.json` 中直接修改或补充翻译 +- **增量更新**:每次构建只生成缺失翻译,保证历史翻译安全 + +## 6. 为什么这里选择 LLM,而不是传统翻译 API? + +引入 LLM 并不是为了追逐概念,而是为了解决传统翻译 API 的结构性短板。 + +### 6.1 领域语义的理解能力 + +通过 Prompt Engineering,可以显式告诉模型当前的业务背景,例如: + +- 金融风控系统 +- SaaS 管理后台 +- 电商交易流程 + +配合 Few-Shot 示例或术语表注入,生成的翻译在**准确性和专业度**上,明显优于通用 API。 + +### 6.2 成本与隐私的可控性 + +翻译任务本身是低复杂度任务,非常适合: + +- 本地运行 4B~8B 级别模型(如 Qwen、Llama 系列) +- 通过 Ollama 等工具进行部署 +- 结合 LangChain 进行批处理调用 + +这种方式的优势包括: + +- 无网络依赖,隐私可控 +- 无调用费用 +- 批量翻译效率高 + +在企业环境中,也可以直接替换为 GPT-4、DeepSeek 等商业 API,方案本身并不受限。 + +## 7. 插件实现要点(Vite Plugin) + +插件的核心职责可以归纳为两点: + +1. **收集需要翻译的文案** +2. **在合适的时机批量调用 LLM,并持久化结果到单文件 JSON** + +关键实现细节包括: + +- 翻译队列与批处理机制 +- 本地缓存与持久化 +- 避免重复翻译已存在 Key + +```ts +/** + * vite-plugin-ai-i18n.ts + * + * 说明: + * 这是一个用于解释 AI i18n 插件核心流程的伪代码示例。 + * 重点在于架构、数据流和设计思路,而非具体 API 或可运行实现。 + */ + +import fs from "fs"; +import path from "path"; + +// ------------------------- +// 虚拟模块定义 +// ------------------------- +const VIRTUAL_MODULE_ID = "virtual:ai-i18n"; +const RESOLVED_VIRTUAL_MODULE_ID = "\0" + VIRTUAL_MODULE_ID; + +// ------------------------- +// 输出文件与默认语言 +// ------------------------- +const LOCALES_DIR = path.resolve(process.cwd(), "locales"); +const LOCALE_FILE = path.join(LOCALES_DIR, "i18n.json"); +const DEFAULT_LANG = "english"; + +// ------------------------- +// 类型定义(简化) +// ------------------------- +type Lang = string; +type TranslationKey = string; + +interface PendingItem { + key: TranslationKey; // 唯一标识:原文#上下文 + text: string; // 原文 + context?: string; // 可选上下文信息 +} + +type LangMessages = Record; +type AllMessages = Record; + +// ------------------------- +// 工具函数(伪实现) +// ------------------------- + +/** + * 读取已有 JSON 语言包 + * 如果文件不存在,返回空对象 + */ +function loadLocales(): AllMessages { + if (!fs.existsSync(LOCALE_FILE)) return {}; + return JSON.parse(fs.readFileSync(LOCALE_FILE, "utf-8")); +} + +/** + * 将最终语言包写入本地 JSON + * 自动创建目录 + */ +function saveLocales(messages: AllMessages) { + if (!fs.existsSync(LOCALES_DIR)) fs.mkdirSync(LOCALES_DIR); + fs.writeFileSync(LOCALE_FILE, JSON.stringify(messages, null, 2)); +} + +/** + * 扫描源码中所有 t(...) / t`...` 的调用 + * 实际实现应使用 AST + */ +function scanForI18nTexts(code: string): PendingItem[] { + // 伪逻辑示意: + // 1. 遍历代码 AST + // 2. 找到 t`xxx` 或 t('xxx', 'context') + // 3. 返回 PendingItem 列表 + return []; +} + +// ------------------------- +// 插件主逻辑 +// ------------------------- +export default function aiI18nPlugin(options: { + targetLangs?: Lang[]; // 目标语言列表 + defaultLang?: Lang; // 默认语言 +}) { + const defaultLang = options.defaultLang || DEFAULT_LANG; + const targetLangs = options.targetLangs || [defaultLang]; + + // 加载已有翻译(人工可校准) + const allMessages: AllMessages = loadLocales(); + + // 待翻译队列,只收集尚未存在的 Key + const pendingQueue: Map = new Map(); + + return { + name: "vite-plugin-ai-i18n", + + // ------------------------- + // 虚拟模块解析 + // ------------------------- + resolveId(id: string) { + if (id === VIRTUAL_MODULE_ID) return RESOLVED_VIRTUAL_MODULE_ID; + }, + + // ------------------------- + // 虚拟模块加载 + // ------------------------- + load(id: string) { + if (id === RESOLVED_VIRTUAL_MODULE_ID) { + // 这里返回运行时代码: + // - messages: 当前语言包 + // - t: 翻译函数 + // - setLang/getCurrentLang: 语言切换函数 + return ` + const messages = ${JSON.stringify(allMessages)}; + let currentLang = '${defaultLang}'; + + export function t(text, context = '') { + const key = context ? \`\${text}#\${context}\` : text; + return messages[key]?.[currentLang] || text; + } + + export function setLang(lang) { currentLang = lang; } + export function getCurrentLang() { return currentLang; } + `; + } + }, + + // ------------------------- + // 源码扫描阶段 + // ------------------------- + transform(code: string, id: string) { + // 忽略 node_modules + if (id.includes("node_modules")) return; + + // 扫描源码,收集 t(...) / t`...` 调用 + const foundItems = scanForI18nTexts(code); + + for (const item of foundItems) { + // key = 原文 + 可选上下文 + const key = item.context ? `${item.text}#${item.context}` : item.text; + + // 针对每个目标语言,判断是否已存在翻译 + for (const lang of targetLangs) { + const langMessages = allMessages[key] || {}; + if (!langMessages[lang]) { + // 尚未存在翻译,加入待翻译队列 + pendingQueue.set(`${lang}:${key}`, { ...item, key }); + } + } + } + + // 返回原始代码,不修改 + return code; + }, + + // ------------------------- + // 构建结束 / 批量翻译 + // ------------------------- + async buildEnd() { + if (!pendingQueue.size) return; + + // 按语言分组 + const groupedByLang: Record = {}; + for (const [compoundKey, item] of pendingQueue) { + const [lang] = compoundKey.split(":"); + groupedByLang[lang] ||= []; + groupedByLang[lang].push(item); + } + + // 对每个目标语言调用 LLM 翻译(伪逻辑) + for (const lang in groupedByLang) { + const items = groupedByLang[lang]; + + // === 这里可以调用 LLM API === + // const results = await llm.translateBatch(items) + + // 伪结果示例 + const results: { key: string; value: string }[] = []; + + // 将翻译结果写入内存缓存 + for (const { key, value } of results) { + allMessages[key] ||= {}; + allMessages[key][lang] = value; + } + } + + // 持久化到单 JSON 文件,人工可校准 + saveLocales(allMessages); + + // 清空队列,避免重复翻译 + pendingQueue.clear(); + }, + }; +} +``` + +## 8. 实际使用体验 + +封装后,开发侧使用方式非常简单: + +```vue +
{{ t`你好` }}
+ +``` + +切换语言: + +```ts +setLang("english"); +``` + +扩展新语言(如日文、法文、韩文)时,只需调整插件配置中的 `targetLangs`,**无需额外维护 Key 或复制文案文件**。 + +## 9. 总结 + +这套 i18n 方案的核心价值不在于“AI 翻译”本身,而在于: + +1. **文案回归自然语言,而不是 Key** +2. **翻译与维护成本前移到工具链** +3. **通过上下文 + LLM 提升翻译质量** +4. **单 JSON 文件 + 虚拟模块 + 增量翻译降低多语言长期成本** +5. **支持人工校准,只处理未翻译 Key,安全可靠** + +目前这仍是一个持续演进中的实践方案,但在复杂业务、多语言项目中,已经展现出明显的工程价值。 + +如果你对 i18n、工程自动化或 AI 在前端工具链中的应用有不同看法,欢迎一起交流和探讨。 diff --git a/.agents/skills/chinese-article-writing/references/structure.md b/.agents/skills/chinese-article-writing/references/structure.md new file mode 100644 index 0000000..6d645c6 --- /dev/null +++ b/.agents/skills/chinese-article-writing/references/structure.md @@ -0,0 +1,56 @@ +# 文档体系 + +## 结构 + +软件手册是一部完整的书,建议采用下面的结构。 + +- **简介**(Introduction):[必备] [文件] 提供对产品和文档本身的总体的、扼要的说明 +- **快速上手**(Getting Started):[可选] [文件] 如何最快速地使用产品 +- **入门篇**(Basics):[必备] [目录] 又称“使用篇”,提供初级的使用教程 + - **环境准备**(Prerequisite):[必备] [文件] 软件使用需要满足的前置条件 + - **安装**(Installation):[可选] [文件] 软件的安装方法 + - **设置**(Configuration):[必备] [文件] 软件的设置 +- **进阶篇**(Advanced):[可选] [目录] 又称“开发篇”,提供中高级的开发教程 +- **API**(Reference):[可选] [目录|文件] 软件 API 的逐一介绍 +- **FAQ**:[可选] [文件] 常见问题解答 +- **附录**(Appendix):[可选] [目录] 不属于教程本身、但对阅读教程有帮助的内容 + - **Glossary**:[可选] [文件] 名词解释 + - **Recipes**:[可选] [文件] 最佳实践 + - **Troubleshooting**:[可选] [文件] 故障处理 + - **ChangeLog**:[可选] [文件] 版本说明 + - **Feedback**:[可选] [文件] 反馈方式 + +下面是两个真实范例,可参考。 + +- [Redux 手册](https://redux.js.org/introduction/getting-started) +- [Atom 手册](http://flight-manual.atom.io/) + +## 文件名 + +文档的文件名不得含有空格。 + +文件名必须使用半角字符,不得使用全角字符。这也意味着,中文不能用于文件名。 + +``` +错误:名词解释.md + +正确:glossary.md +``` + +文件名建议只使用小写字母,不使用大写字母。 + +``` +错误:TroubleShooting.md + +正确:troubleshooting.md +``` + +为了醒目,某些说明文件的文件名,可以使用大写字母,比如`README`、`LICENSE`。 + +文件名包含多个单词时,单词之间建议使用半角的连词线(`-`)分隔。 + +``` +不佳:advanced_usage.md + +正确:advanced-usage.md +``` diff --git a/.agents/skills/chinese-article-writing/references/text.md b/.agents/skills/chinese-article-writing/references/text.md new file mode 100644 index 0000000..284bd66 --- /dev/null +++ b/.agents/skills/chinese-article-writing/references/text.md @@ -0,0 +1,183 @@ +# 文本 + +## 字间距 + +(1)全角中文字符与半角英文字符之间,应有一个半角空格。 + +``` +错误:本文介绍如何快速启动Windows系统。 + +正确:本文介绍如何快速启动 Windows 系统。 +``` + +(2)全角中文字符与半角阿拉伯数字之间,有没有半角空格都可,但必须保证风格统一,不能两种风格混杂。 + +``` +正确:2011年5月15日,我订购了5台笔记本电脑与10台平板电脑。 + +正确:2011 年 5 月 15 日,我订购了 5 台笔记本电脑与 10 台平板电脑。 +``` + +半角的百分号,视同阿拉伯数字。 + +``` +正确:今年我国经济增长率是6.5%。 + +正确:今年我国经济增长率是 6.5%。 +``` + +(3)英文单位若不翻译,单位前的阿拉伯数字与单位符号之间,应留出适当的空隙。 + +``` +例1:一部容量为 16 GB 的智能手机 + +例2:1 h = 60 min = 3,600 s +``` + +(4)半角英文字符和半角阿拉伯数字,与全角标点符号之间不留空格。 + +``` +错误:他的电脑是 MacBook Air 。 + +正确:他的电脑是 MacBook Air。 +``` + +## 句子 + +(1)避免使用长句。 + +不包含任何标点符号的单个句子,或者以逗号分隔的句子构件,长度尽量保持在 20 个字以内;20~29 个字的句子,可以接受;30~39 个字的句子,语义必须明确,才能接受;多于 40 个字的句子,任何情况下都不能接受。 + +``` +错误:本产品适用于从由一台服务器进行动作控制的单一节点结构到由多台服务器进行动作控制的并行处理程序结构等多种体系结构。 + +正确:本产品适用于多种体系结构。无论是由一台服务器(单一节点结构),还是由多台服务器(并行处理结构)进行动作控制,均可以使用本产品。 +``` + +逗号分割的长句,总长度不应该超过 100 字或者正文的 3 行。 + +(2)尽量使用简单句和并列句,避免使用复合句。 + +``` +并列句:他昨天生病了,没有参加会议。 + +复合句:那个昨天生病的人没有参加会议。 +``` + +(3)同样一个意思,尽量使用肯定句表达,不使用否定句表达。 + +``` +错误:请确认没有接通装置的电源。 + +正确:请确认装置的电源已关闭。 +``` + +(4)避免使用双重否定句。 + +``` +错误:没有删除权限的用户,不能删除此文件。 + +正确:用户必须拥有删除权限,才能删除此文件。 +``` + +## 写作风格 + +(1)尽量不使用被动语态,改为使用主动语态。 + +``` +错误:假如此软件尚未被安装, + +正确:假如尚未安装这个软件, +``` + +(2)不使用非正式的语言风格。 + +``` +错误:Lady Gaga 的演唱会真是酷毙了,从没看过这么给力的表演!!! + +正确:无法参加本次活动,我深感遗憾。 +``` + +(3)不使用冷僻、生造或者文言文的词语,而要使用现代汉语的常用表达方式。 + +``` +错误:这是唯二的快速启动的方法。 + +正确:这是仅有的两种快速启动的方法。 +``` + +(4)用对“的”、“地”、“得”。 + +``` +她露出了开心的笑容。 +(形容词+的+名词) + +她开心地笑了。 +(副词+地+动词) + +她笑得很开心。 +(动词+得+副词) +``` + +(5)使用代词时(比如“其”、“该”、“此”、“这”等词),必须明确指代的内容,保证只有一个含义。 + +``` +错误:从管理系统可以监视中继系统和受其直接控制的分配系统。 + +正确:从管理系统可以监视两个系统:中继系统和受中继系统直接控制的分配系统。 +``` + +(6)名词前不要使用过多的形容词。 + +``` +错误:此设备的使用必须在接受过本公司举办的正式的设备培训的技师的指导下进行。 + +正确:此设备必须在技师的指导下使用,且指导技师必须接受过由本公司举办的正式设备培训。 +``` + +## 英文处理 + +(1)英文原文如果使用了复数形式,翻译成中文时,应该将其还原为单数形式。 + +``` +英文:...information stored in random access memory (RAMs)... + +中文:⋯⋯存储在随机存取存储器(RAM)里的信息⋯⋯ +``` + +(2)外文缩写可以使用半角圆点(`.`)表示缩写。 + +``` +U.S.A. +Apple, Inc. +``` + +(3)表示中文时,英文省略号(`...`)应改为中文省略号(`⋯⋯`)。 + +``` +英文:5 minutes later... + +中文:5 分钟过去了⋯⋯ +``` + +(4)英文书名或电影名改用中文表达时,双引号应改为书名号。 + +``` +英文:He published an article entitled "The Future of the Aviation". + +中文:他发表了一篇名为《航空业的未来》的文章。 +``` + +(5)第一次出现英文词汇时,在括号中给出中文标注。此后再次出现时,直接使用英文缩写即可。 + +``` +IOC(International Olympic Committee,国际奥林匹克委员会)。这样定义后,便可以直接使用“IOC”了。 +``` + +(6)专有名词中每个词第一个字母均应大写,非专有名词则不需要大写。 + +``` +“American Association of Physicists in Medicine”(美国医学物理学家协会)是专有名词,需要大写。 + +“online transaction processing”(在线事务处理)不是专有名词,不应大写。 +``` diff --git a/.agents/skills/chinese-article-writing/references/title.md b/.agents/skills/chinese-article-writing/references/title.md new file mode 100644 index 0000000..dc736d4 --- /dev/null +++ b/.agents/skills/chinese-article-writing/references/title.md @@ -0,0 +1,84 @@ +# 标题 + +## 层级 + +标题分为四级。 + +- 一级标题:文章的标题 +- 二级标题:文章主要部分的大标题 +- 三级标题:二级标题下面一级的小标题 +- 四级标题:三级标题下面某一方面的小标题 + +下面是示例。 + +```markdown +# 一级标题 + +## 二级标题 + +### 三级标题 + +#### 四级标题 +``` + +## 原则 + +(1)一级标题下,不能直接出现三级标题。 + +示例:下面的文章结构,缺少二级标题。 + +```markdown +# 一级标题 + +### 三级标题 +``` + +(2)标题要避免孤立编号(即同级标题只有一个)。 + +示例:下面的文章结构,`二级标题 A`只包含一个三级标题,完全可以省略`三级标题 A`。 + +```markdown +## 二级标题 A + +### 三级标题 A + +## 二级标题 B +``` + +(3)下级标题不重复上一级标题的名字。 + +示例:下面的文章结构,二级标题与下属的三级标题同名,建议避免。 + +```markdown +## 概述 + +### 概述 +``` + +(4)谨慎使用四级标题,尽量避免出现,保持层级的简单,防止出现过于复杂的章节。 + +如果三级标题下有并列性的内容,建议只使用项目列表(Item list)。 + +示例:下面的结构二要好于结构一。结构一适用的场景,主要是较长篇幅的内容。 + +```markdown +结构一 + +### 三级标题 + +#### 四级标题 A + +#### 四级标题 B + +#### 四级标题 C + +结构二 + +### 三级标题 + +**(1)A** + +**(2)B** + +**(3)C** +``` diff --git a/.agents/skills/git-step-commit/SKILL.md b/.agents/skills/git-step-commit/SKILL.md new file mode 100644 index 0000000..bec4ef8 --- /dev/null +++ b/.agents/skills/git-step-commit/SKILL.md @@ -0,0 +1,122 @@ +--- +name: git-step-commit +description: Analyze Git working tree and staged changes, split them into coherent commits, infer message style from repository history, and execute safely. By default propose a plan and wait for approval; when the user explicitly delegates with phrases such as “按推荐提交”, “你决定并直接提交”, or “无需确认”, skip the displayed plan and make all recommended commits directly. Use when the user asks for git commit, commit changes, git 分步提交, 分批提交, staged commit cleanup, or wants current changes committed with sensible messages. +--- + +# Git Step Commit + +把当前 Git 更改整理成清晰、可审查、可回滚的提交。 + +## 选择模式 + +- **默认模式**:对“帮我提交”“git commit”“分步提交”等普通请求,先输出计划并等待确认。 +- **推荐直提模式**:当用户明确说“按推荐提交”“你决定并直接提交”“无需确认”等,把批次和消息交给 agent 决定时,内部完成同样的分析,不展示计划,直接提交全部推荐批次。 +- 如果用户只询问“推荐怎么提交”或“给我建议”,只输出计划。 + +推荐直提只省略确认。遇到疑似凭据、合并冲突、失败的必要测试或无法判断归属的文件时,停止并说明,不要擅自提交。 + +## 一次性分析 + +默认把初始检查放进**一次 shell/tool 调用**,不要拆成多个往返: + +```bash +set -e +git rev-parse --show-toplevel +git status --short --untracked-files=all +git diff --stat +git diff --cached --stat +git log -12 --pretty=format:%s 2>/dev/null || true +``` + +如果没有更改,直接说明并停止。规划阶段保持只读,不要执行 `git restore --staged .`。 + +根据状态输出同时分析暂存区、工作区和未跟踪文件: + +- 已明确是本轮 agent 完成且修改意图已知时,不重复阅读正文。 +- 来源不明、包含用户已有修改、同一文件同时有暂存和未暂存更改,或意图不清时,再按需查看 `git diff -- `、`git diff --cached -- ` 和相关文件。普通 diff 不显示未跟踪文件,准备提交前要直接检查其内容。 +- 从历史提交推断语言、前缀、scope、大小写和语气;历史不明确时使用简洁的 Conventional Commit(`feat`、`fix`、`refactor`、`test`、`docs`、`chore`)。用户指定的风格优先。 +- 复用本轮已完成的测试结果;否则只运行必要且成本合理的验证。未运行时说明原因。 +- 默认不添加 `Co-authored-by:` 或任何 AI 署名;仅按用户本轮明确提供的署名添加。 + +## 默认模式:提交计划 + +输出计划后等待确认,不要提前运行 `git add` 或 `git commit`: + +```text +建议提交计划: +变更来源:本轮 agent 修改 / 用户已有修改 / 混合 / 不确定 +验证状态:已运行 / 建议先运行 / 未运行,原因:... +协作者:默认不添加 +执行方式:确认后用一次命令链完成全部批次 + +1. + - 文件:path/a, path/b + - 目的:... +2. + - 文件:path/c + - 目的:... + +请确认:全部提交、只提交某几批,或调整批次/消息。 +``` + +用户确认全部或说“按推荐提交”后直接执行;只确认部分时只提交指定批次,其他更改保持不动。 + +## 划分批次 + +按意图分组,使每批能独立审查和回滚: + +- 同一目的、必须一起成立的更改通常只做一个提交。 +- 独立功能或问题、可单独审查的测试/文档/工具配置、遮挡源码的大型生成产物应拆分。 +- 通常按“基础设施 → 实现 → 测试 → 文档 → 生成产物”排序,但优先遵循仓库历史;必要的测试或生成产物可与实现同批。 +- 不要顺手提交无关脏文件。 + +## 快速执行 + +当每个文件整体只属于一个批次、路径明确且无需选择 hunk 时,把所有批次放进**一次 shell 调用、一条 `&&` 命令链**: + +```bash +git add -A -- \ + && git commit --only -m "" -- \ + && git add -A -- \ + && git commit --only -m "" -- \ + && git status --short \ + && git log -2 --pretty=format:'%h %s' +``` + +按批次数量调整 `git log -N`。正确引用所有路径和消息,在 pathspec 前使用 `--`;不要使用无 pathspec 的 `git add .` 或 `git add -A`。 + +`git commit --only -- ` 只提交指定路径,并保留其他已暂存文件。前置的精确 `git add -A -- ` 会提交这些路径的完整当前状态,因此仅在整文件属于本批时使用。 + +`&&` 会在失败时停止后续提交。失败后先用只读的 `git status --short` 和 `git log` 判断完成到哪一批;不要盲目续跑。PowerShell 使用等价的单次调用并检查 `$LASTEXITCODE`。 + +## 逐批执行 + +只有在以下情况使用慢速路径:需要 `git add -p`、同一路径的暂存/未暂存内容不应一起提交、用户与 agent 修改混在同一文件、路径很多难以确认、用户要求预览,或 hook/状态异常。 + +整文件仍属于同一批时,逐步暂存、检查并提交精确路径: + +```bash +git add -A -- ... +git diff --cached --stat -- ... +git diff --cached --name-status -- ... +git commit --only -m "" -- ... +git status --short +``` + +需要选择 hunk 时,先确保当前提交能独占暂存区: + +```bash +git add -p -- ... +git diff --cached +git commit -m "" +git status --short +``` + +不要给 hunk 提交添加 pathspec 或 `--only`,否则会忽略 hunk 选择并提交指定路径的完整工作区内容。若暂存区还有需要保留的其他更改,不要静默清空;先征求用户同意再重组,或使用临时 index。 + +## 安全与结果 + +- 不要使用会丢弃内容的 `git reset --hard`、`git checkout -- `、`git clean`,也不要 amend、rebase、改写历史或 force push,除非用户明确要求。 +- 不要提交密钥、凭据、本地缓存、编辑器文件或非预期构建产物。 +- 如果 hook 修改文件,检查新增 diff;属于当前批次时重新暂存并重试,否则保持未提交。 +- 完成后列出每个提交的短 hash 和消息,并说明剩余未提交文件、是否只提交了部分批次,以及测试结果或未运行原因。 diff --git a/.agents/skills/git-step-commit/agents/openai.yaml b/.agents/skills/git-step-commit/agents/openai.yaml new file mode 100644 index 0000000..9bbe731 --- /dev/null +++ b/.agents/skills/git-step-commit/agents/openai.yaml @@ -0,0 +1,4 @@ +interface: + display_name: "Git Step Commit" + short_description: "Plan or create coherent Git commits" + default_prompt: "Use $git-step-commit to review my Git changes and propose sensible commit batches before committing." diff --git a/.agents/skills/publish-npm-packages/SKILL.md b/.agents/skills/publish-npm-packages/SKILL.md new file mode 100644 index 0000000..b808366 --- /dev/null +++ b/.agents/skills/publish-npm-packages/SKILL.md @@ -0,0 +1,15 @@ +--- +name: publish-npm-packages +description: Configure, audit, or migrate npm package publishing to current secure practices. Use when Codex needs to publish or prepare an npm package, fill npm Trusted Publisher settings, create a GitHub Actions/GitLab/CircleCI release workflow, adopt OIDC, replace npm tokens, publish organization-scoped public or private packages, or release multiple packages from a monorepo/npm workspaces repository. +--- + +# Publish npm Packages + +按任务读取对应章节,不要一次加载无关内容: + +- [政策、版本、token 与执行边界](references/policy-and-prerequisites.md):开始任何发布工作前读取。 +- [npm 配置项与 CI 字段映射](references/npm-configuration.md):填写 npmjs.com、`package.json`、`.npmrc`、`npm trust` 或 CI 配置时读取。 +- [推荐最小示例](references/minimal-example.md):为单个包建立最小 GitHub Actions OIDC 发布流程时读取。 +- [组织公共包与私有包](references/organization-packages.md):处理 npm organization、scope、visibility、Teams 或私有依赖时读取。 +- [Monorepo 多包发布](references/monorepo.md):处理 workspaces、批量 Trusted Publisher 或独立版本发布时读取。 +- [发布前验证与排错](references/verification.md):完成配置后或发布失败时读取。 diff --git a/.agents/skills/publish-npm-packages/agents/openai.yaml b/.agents/skills/publish-npm-packages/agents/openai.yaml new file mode 100644 index 0000000..c71962c --- /dev/null +++ b/.agents/skills/publish-npm-packages/agents/openai.yaml @@ -0,0 +1,4 @@ +interface: + display_name: "Publish npm Packages" + short_description: "Publish npm packages securely with current OIDC policy" + default_prompt: "Use $publish-npm-packages to configure secure npm publishing for this repository." diff --git a/.agents/skills/publish-npm-packages/references/minimal-example.md b/.agents/skills/publish-npm-packages/references/minimal-example.md new file mode 100644 index 0000000..d282a61 --- /dev/null +++ b/.agents/skills/publish-npm-packages/references/minimal-example.md @@ -0,0 +1,115 @@ +# 推荐最小示例 + +## 目录 + +- 前置假设 +- package.json +- npm 网站 +- GitHub Actions workflow +- 首次发布 +- Staged Publishing +- 其他 package manager + +## 前置假设 + +本示例假设: + +- 包已经完成首次发布。 +- npm 包已绑定 GitHub Actions Trusted Publisher。 +- 发布 job 使用 GitHub-hosted runner。 +- 仓库使用 npm lockfile。 + +## package.json + +```json +{ + "name": "@acme/example", + "version": "1.0.0", + "files": ["dist"], + "repository": { + "type": "git", + "url": "git+https://github.com/acme/example.git" + }, + "publishConfig": { + "access": "public", + "registry": "https://registry.npmjs.org/" + } +} +``` + +## npm 网站 + +进入 `@acme/example → Settings → Trusted publishing`,填写: + +| 字段 | 值 | +|---|---| +| Provider | GitHub Actions | +| Organization or user | `acme` | +| Repository | `example` | +| Workflow filename | `publish.yml` | +| Environment name | 留空 | +| Allowed actions | `npm publish` | + +## `.github/workflows/publish.yml` + +```yaml +name: Publish package + +on: + push: + tags: + - "v*" + +permissions: + contents: read + id-token: write + +jobs: + publish: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + + - uses: actions/setup-node@v6 + with: + node-version: "24" + registry-url: "https://registry.npmjs.org" + package-manager-cache: false + + - run: npm ci + - run: npm run build --if-present + - run: npm run test --if-present + - run: npm pack --dry-run + - run: npm publish +``` + +不要给最后一步传 `NPM_TOKEN` 或 `NODE_AUTH_TOKEN`。 + +## 首次发布 + +Trusted Publisher 不能绑定尚不存在的包。对全新公共 scoped 包: + +```bash +npm login +npm pack --dry-run +npm publish --access public +``` + +使用两小时登录会话和 2FA 完成首发,再填写 npm Trusted Publisher。私有包将 `public` 改为 `restricted`,并确保账户或 organization 已启用付费私有包。 + +## Staged Publishing 变体 + +希望发布前人工审批时: + +1. npm Allowed actions 选择 `npm stage publish`。 +2. workflow 最后一步改为: + +```yaml +- run: npm stage publish +``` + +3. 维护者在 npmjs.com 或 CLI 审核并使用 2FA 批准。 + +## 其他 package manager + +pnpm/Yarn 仓库继续使用原 package manager 安装和构建。确保最终发布由支持 OIDC 的 npm CLI 执行,或在采用现有发布工具前核对其 Trusted Publishing 支持;不要因为发布流程擅自替换 lockfile。 diff --git a/.agents/skills/publish-npm-packages/references/monorepo.md b/.agents/skills/publish-npm-packages/references/monorepo.md new file mode 100644 index 0000000..ff7baf4 --- /dev/null +++ b/.agents/skills/publish-npm-packages/references/monorepo.md @@ -0,0 +1,134 @@ +# Monorepo 多包发布 + +## 目录 + +- 根目录和 workspace +- Trusted Publisher 模型 +- 批量配置 +- 选择发布范围 +- 非原子性 + +## 根目录和 workspace + +阻止根包发布: + +```json +{ + "private": true, + "workspaces": ["packages/*"] +} +``` + +每个可发布 workspace 独立设置: + +- 唯一 `name` 和 `version` +- `files`、入口和 exports +- `repository.url` +- `repository.directory` +- `publishConfig.registry` +- `publishConfig.access` +- npm 权限和 Trusted Publisher + +示例: + +```json +{ + "name": "@acme/core", + "version": "1.2.0", + "files": ["dist"], + "repository": { + "type": "git", + "url": "git+https://github.com/acme/monorepo.git", + "directory": "packages/core" + }, + "publishConfig": { + "access": "public", + "registry": "https://registry.npmjs.org/" + } +} +``` + +不要给准备发布到 npm 的私有 workspace 设置 `private: true`;使用 `publishConfig.access: "restricted"`。 + +## Trusted Publisher 模型 + +npm 按包保存 Trusted Publisher,不按 organization、scope 或仓库保存。多个包可以全部绑定同一个: + +```text +Repository: acme/monorepo +Workflow: release.yml +Environment: npm +``` + +但每个 npm 包都必须单独建立配置。新 workspace 的包必须先完成首次发布。 + +## 批量配置 + +`npm trust` 不感知 workspaces。使用 npm `>=11.15.0`,显式列出已经存在的包: + +```bash +packages=( + "@acme/core" + "@acme/react" + "@acme/utils" +) + +for package in "${packages[@]}"; do + npm trust github "$package" \ + --repo acme/monorepo \ + --file release.yml \ + --env npm \ + --allow-publish \ + --yes + sleep 2 +done +``` + +第一次请求完成 2FA;保留短暂间隔避免限流。需要人工审批时把 `--allow-publish` 换成 `--allow-stage-publish`。 + +只有用户明确授权时执行批量 trust 变更。 + +## 选择发布范围 + +所有 workspace 同步升级且全部发布: + +```bash +npm publish --workspaces +``` + +只发布明确包: + +```bash +npm publish \ + --workspace=@acme/core \ + --workspace=@acme/react +``` + +独立版本或只发布变化包: + +- 优先复用仓库已有 Changesets、Lerna 或发布脚本。 +- 只有确实需要版本计算、依赖联动和 changelog 自动化时才新增工具。 +- 确认工具最终调用支持 OIDC 的 npm CLI。 +- 不要用 `npm whoami` 判断 OIDC 是否可用;OIDC 只在 publish/stage 操作期间生效。 + +## 非原子性 + +`npm publish --workspaces` 不是原子事务。后续 workspace 失败不会回滚已经发布的包。 + +发布前: + +1. build 和 test 全部目标包。 +2. 对每个包运行或等价执行 `npm pack --dry-run`。 +3. 确认每个 `name@version` 尚未存在。 +4. 排除 `private: true` 和本次不发布的 workspace。 +5. 按内部依赖顺序发布,或让现有 release 工具选择变化包。 +6. 确认每个包的 `publishConfig.access`,允许同一 monorepo 混合公共包和私有包。 + +私有包的版本查询和依赖安装可能需要只读 granular token;不要因此给发布步骤写 token。 + +## 官方来源 + +- [`npm trust`](https://docs.npmjs.com/cli/v11/commands/npm-trust/) +- [`npm publish`](https://docs.npmjs.com/cli/publish/) +- [npm workspaces](https://docs.npmjs.com/misc/workspaces/) +- [`package.json`](https://docs.npmjs.com/cli/configuring-npm/package-json/) diff --git a/.agents/skills/publish-npm-packages/references/npm-configuration.md b/.agents/skills/publish-npm-packages/references/npm-configuration.md new file mode 100644 index 0000000..666c29e --- /dev/null +++ b/.agents/skills/publish-npm-packages/references/npm-configuration.md @@ -0,0 +1,287 @@ +# npm 配置项与 CI 字段映射 + +## 目录 + +- npmjs.com 通用入口 +- GitHub Actions 字段映射 +- GitLab CI/CD 字段映射 +- CircleCI 字段映射 +- `npm trust` 命令映射 +- Publishing access +- `package.json` +- `.npmrc` 与 CI secrets + +## npmjs.com 通用入口 + +对每个已经存在的包进入: + +```text +npmjs.com → Packages → → Settings → Trusted publishing +``` + +先满足: + +- 当前 npm 用户对包具有 write 权限。 +- npm 账户已启用 2FA。 +- 包已经发布过至少一个版本。 +- 准备使用受支持的 cloud-hosted CI runner。 + +新建配置时必须选择一个 provider,并至少允许 `npm publish` 或 `npm stage publish` 之一。一个包只能保留一个 Trusted Publisher。 + +## GitHub Actions 字段映射 + +假设仓库为 `acme/widgets`,入口 workflow 为 `.github/workflows/release.yml`,发布 job 使用 GitHub Environment `npm`: + +| npm 网站字段 | 填写示例 | 对应来源 | 填写规则 | +|---|---|---|---| +| Provider | `GitHub Actions` | workflow 所在平台 | 选择 GitHub Actions | +| Organization or user | `acme` | `github.repository_owner` | 只填 owner,不带 `@` | +| Repository | `widgets` | `github.event.repository.name` | 只填仓库名,不填 `acme/widgets` 或 URL | +| Workflow filename | `release.yml` | `.github/workflows/release.yml` | 只填文件名;保留 `.yml`/`.yaml`;大小写完全一致 | +| Environment name | `npm` | `jobs.publish.environment` | 可选;使用时两边完全一致,不使用就留空 | +| Allowed actions | `npm publish` | workflow 中的 `npm publish` | 直接上线时选择 | +| Allowed actions | `npm stage publish` | workflow 中的 `npm stage publish` | 先暂存、再由维护者 2FA 审批时选择 | + +对应 workflow: + +```yaml +permissions: + contents: read + id-token: write + +jobs: + publish: + runs-on: ubuntu-latest + environment: npm + steps: + - uses: actions/checkout@v6 + - uses: actions/setup-node@v6 + with: + node-version: "24" + registry-url: "https://registry.npmjs.org" + package-manager-cache: false + - run: npm ci + - run: npm publish +``` + +必须对应: + +- `permissions.id-token: write` 允许 GitHub 签发 OIDC token。 +- `environment: npm` 对应 npm 网站的 Environment name;若网站留空,workflow 不必设置 environment。 +- `repository.url` 精确指向 `acme/widgets`。 +- 使用 `workflow_call` 或 `workflow_dispatch` 时,npm 会校验入口/calling workflow。填写调用入口文件名,并让父子 workflow 都有 `id-token: write`。 +- workflow 文件必须位于 `.github/workflows/`。 + +## GitLab CI/CD 字段映射 + +假设项目为 `acme/platform/widgets`,顶层 CI 文件为 `.gitlab-ci.yml`,environment 为 `npm`: + +| npm 网站字段 | 填写示例 | 对应来源 | 填写规则 | +|---|---|---|---| +| Provider | `GitLab CI/CD` | pipeline 所在平台 | 选择 GitLab CI/CD | +| Namespace | `acme/platform` | GitLab project namespace | 填用户、group 或 subgroup 路径,不含项目名 | +| Project name | `widgets` | GitLab project name/path | 只填项目名 | +| Top-level CI file path | `.gitlab-ci.yml` | 项目实际顶层 CI 配置 | 填完整相对路径,必须以 `.yml` 结尾 | +| Environment name | `npm` | publish job 的 `environment.name` | 可选;使用时完全一致 | +| Allowed actions | `npm publish` / `npm stage publish` | publish job 命令 | 至少选择一个 | + +对应 publish job: + +```yaml +publish: + stage: publish + image: node:24 + environment: + name: npm + id_tokens: + NPM_ID_TOKEN: + aud: "npm:registry.npmjs.org" + SIGSTORE_ID_TOKEN: + aud: sigstore + script: + - npm ci + - npm run build --if-present + - npm publish + only: + - tags +``` + +必须对应: + +- `NPM_ID_TOKEN.aud` 精确为 `npm:registry.npmjs.org`。 +- `SIGSTORE_ID_TOKEN.aud` 为 `sigstore`,供受支持的 provenance 流程使用。 +- 使用 GitLab.com shared runner;self-hosted runner 当前不受支持。 +- Top-level CI file path 对应顶层配置,不是被 include 的子文件。 + +## CircleCI 字段映射 + +| npm 网站字段 | 填写内容 | 获取位置 | 填写规则 | +|---|---|---|---| +| Provider | `CircleCI` | pipeline 所在平台 | 选择 CircleCI | +| Organization ID | UUID | CircleCI Organization Settings Overview | 填 organization UUID,不填名称 | +| Project ID | UUID | CircleCI Project Settings | 填 project UUID | +| Pipeline definition ID | UUID | Project Settings → Project Setup | 填 pipeline definition UUID | +| VCS origin | `github.com/acme/widgets` | 项目的 VCS origin | 不带 `https://`,与项目来源一致 | +| Context IDs | 一个或多个 UUID | Organization Settings → Contexts | 可选;用于限制只有指定 context 的 job 能发布 | +| Allowed actions | `npm publish` / `npm stage publish` | publish job 命令 | 至少选择一个 | + +publish 步骤必须产生 `NPM_ID_TOKEN`: + +```yaml +- run: + name: Publish to npm with OIDC + command: | + export NPM_ID_TOKEN=$(circleci run oidc get --claims '{"aud":"npm:registry.npmjs.org"}') + npm publish +``` + +使用 CircleCI cloud。CircleCI Trusted Publishing 当前不生成 npm provenance。 + +## `npm trust` 命令映射 + +使用 npm `>=11.15.0`,从已登录且启用 2FA 的维护者环境执行。`npm trust` 不接受启用 Bypass 2FA 的 granular access token,也不接受旧式用户名/密码 basic auth。 + +### GitHub + +```bash +npm trust github @acme/widgets \ + --repo acme/widgets \ + --file release.yml \ + --env npm \ + --allow-publish +``` + +| CLI 参数 | npm 网站字段 | +|---|---| +| package 参数 | 当前 npm 包 | +| `--repo acme/widgets` | Organization or user + Repository | +| `--file release.yml` | Workflow filename | +| `--env npm` | Environment name | +| `--allow-publish` | Allowed actions: `npm publish` | +| `--allow-stage-publish` | Allowed actions: `npm stage publish` | +| `--registry` | npm registry;默认 `https://registry.npmjs.org/` | +| `--yes` | 跳过 CLI 确认,不改变权限含义 | + +### GitLab + +```bash +npm trust gitlab @acme/widgets \ + --project acme/platform/widgets \ + --file .gitlab-ci.yml \ + --env npm \ + --allow-publish +``` + +`--project` 使用完整 `group/subgroup/project`;网站将其拆成 Namespace 和 Project name。 + +### CircleCI + +```bash +npm trust circleci @acme/widgets \ + --org-id \ + --project-id \ + --pipeline-definition-id \ + --vcs-origin github.com/acme/widgets \ + --context-id \ + --allow-publish +``` + +查看和替换配置: + +```bash +npm trust list @acme/widgets +npm trust revoke @acme/widgets --id +``` + +删除配置会立即改变后续发布认证;没有用户明确授权不要执行 revoke。 + +## Publishing access + +先验证一次 OIDC 发布,再进入: + +```text +Package → Settings → Publishing access +``` + +选择: + +```text +Require two-factor authentication and disallow tokens +``` + +此设置禁止传统 token 发布,但不会阻止 Trusted Publisher。更严格时同时: + +- Trusted Publisher 只允许 `npm stage publish`。 +- CI 执行 `npm stage publish`。 +- 维护者通过 npmjs.com 或 CLI 使用 2FA 审批。 + +## `package.json` + +推荐逐包核对: + +| 字段 | 示例 | 用途与规则 | +|---|---|---| +| `name` | `@acme/widgets` | 组织包必须使用 organization scope | +| `version` | `1.2.3` | `name@version` 必须从未发布过 | +| `files` | `["dist"]` | 限制 tarball 内容 | +| `repository.type` | `"git"` | 使用 Git 仓库 | +| `repository.url` | `"git+https://github.com/acme/widgets.git"` | 必须与 Trusted Publisher 仓库精确对应 | +| `repository.directory` | `"packages/widgets"` | monorepo 包填写 package 所在相对目录 | +| `private` | `true` | 阻止发布;不要用它表示 npm 私有包 | +| `publishConfig.registry` | `"https://registry.npmjs.org/"` | 锁定发布 registry | +| `publishConfig.access` | `"public"` / `"restricted"` | 公共包/私有包 | +| `publishConfig.tag` | `"latest"` / `"next"` | 可选;控制 dist-tag | +| `publishConfig.provenance` | `false` | 仅在明确需要关闭 provenance 时使用;OIDC 默认不要设置 | + +公共包示例: + +```json +{ + "name": "@acme/widgets", + "version": "1.0.0", + "files": ["dist"], + "repository": { + "type": "git", + "url": "git+https://github.com/acme/widgets.git" + }, + "publishConfig": { + "access": "public", + "registry": "https://registry.npmjs.org/" + } +} +``` + +私有 npm 包使用 `access: "restricted"`,不要设置 `"private": true`。 + +## `.npmrc` 与 CI secrets + +仓库需要明确 registry 时,只写非敏感配置: + +```ini +registry=https://registry.npmjs.org/ +@acme:registry=https://registry.npmjs.org/ +``` + +规则: + +- 不要提交 `//registry.npmjs.org/:_authToken=...`。 +- 不要全局设置 `access=public`;它可能影响其他 scope。优先逐包使用 `publishConfig.access`。 +- 不要为 Trusted Publishing 添加 `NPM_TOKEN` 或 `NODE_AUTH_TOKEN`。 +- 私有依赖使用只读 granular token,并只放在读取步骤: + +```yaml +- run: npm ci + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_READ_TOKEN }} + +- run: npm publish +``` + +发布步骤不继承该 token。 + +## 官方来源 + +- [Trusted Publishing](https://docs.npmjs.com/trusted-publishers/) +- [`npm trust`](https://docs.npmjs.com/cli/v11/commands/npm-trust/) +- [`package.json`](https://docs.npmjs.com/cli/configuring-npm/package-json/) +- [npm config](https://docs.npmjs.com/cli/using-npm/config/) diff --git a/.agents/skills/publish-npm-packages/references/organization-packages.md b/.agents/skills/publish-npm-packages/references/organization-packages.md new file mode 100644 index 0000000..9ea8222 --- /dev/null +++ b/.agents/skills/publish-npm-packages/references/organization-packages.md @@ -0,0 +1,120 @@ +# 组织公共包与私有包 + +## 目录 + +- 组织和 scope +- 公共包 +- 私有包 +- Trusted Publishing +- 私有依赖 +- Provenance + +## 组织和 scope + +组织只能管理 scoped 包: + +```text +@organization/package +``` + +创建包前确认: + +- npm organization 已存在。 +- 发布者属于 organization 并有对应包的 write 权限。 +- 包的 `name` 使用正确 organization scope。 + +## 公共包 + +- npm organization 可免费发布公共包。 +- 所有人可以查看和安装。 +- 只有拥有 read-write 权限的 organization team 成员或受信 workflow 可以发布。 +- 设置: + +```json +{ + "name": "@acme/public-package", + "publishConfig": { + "access": "public", + "registry": "https://registry.npmjs.org/" + } +} +``` + +- 首次发布明确运行: + +```bash +npm publish --access public +``` + +## 私有包 + +- 需要付费 npm user/organization plan。 +- 只有获得 organization team read 权限的成员可以安装。 +- 只有获得 read-write 权限的成员或受信 workflow 可以发布。 +- 设置: + +```json +{ + "name": "@acme/private-package", + "publishConfig": { + "access": "restricted", + "registry": "https://registry.npmjs.org/" + } +} +``` + +- 首次发布运行: + +```bash +npm publish --access restricted +``` + +不要使用: + +```json +{ + "private": true +} +``` + +`private: true` 会让 npm 拒绝发布。它适用于 monorepo 根目录或永不发布的内部 workspace,不代表 npm registry 上的私有可见性。 + +## Trusted Publishing + +公共包和私有包都可以使用 OIDC Trusted Publishing。每个包分别配置 Trusted Publisher,即使它们属于同一个 organization。 + +配置成功并验证后,进入包的 Publishing access,选择: + +```text +Require two-factor authentication and disallow tokens +``` + +## 私有依赖 + +Trusted Publishing 只认证 publish/stage 操作。CI 安装私有包仍需只读 granular token: + +```yaml +- run: npm ci + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_READ_TOKEN }} + +- run: npm publish +``` + +将 token 限制到必要 scope/package,并只传给读取步骤。不要给发布步骤写 token。 + +## Provenance + +自动 provenance 需要同时满足: + +- 使用 GitHub Actions 或 GitLab Trusted Publishing。 +- 源码仓库公开。 +- npm 包公开。 + +私有包、私有源码仓库和 CircleCI Trusted Publishing 当前不会生成 npm provenance,但仍可使用 OIDC 发布。 + +## 官方来源 + +- [Organization scoped packages](https://docs.npmjs.com/creating-and-publishing-an-organization-scoped-package/) +- [Package access matrix](https://docs.npmjs.com/package-scope-access-level-and-visibility/) +- [Private packages](https://docs.npmjs.com/about-private-packages/) diff --git a/.agents/skills/publish-npm-packages/references/policy-and-prerequisites.md b/.agents/skills/publish-npm-packages/references/policy-and-prerequisites.md new file mode 100644 index 0000000..fa745eb --- /dev/null +++ b/.agents/skills/publish-npm-packages/references/policy-and-prerequisites.md @@ -0,0 +1,86 @@ +# 政策、版本、token 与执行边界 + +## 执行边界 + +- 把检查和修改发布配置视为可执行工作。 +- 只有用户明确要求实际发布时,才运行 `npm publish`、`npm stage publish`、修改 npm 包可见性或创建/撤销 Trusted Publisher。 +- 发布前展示包名、版本、registry、访问级别和实际命令。 +- 不要读取、输出、记录或提交 token。不要把真实 token 写进 `.npmrc`、workflow 或仓库文件。 + +## 每次重新核对 + +发布政策会变化。修改配置前查询 npm 官方文档: + +- [Trusted Publishing](https://docs.npmjs.com/trusted-publishers/) +- [`npm trust`](https://docs.npmjs.com/cli/v11/commands/npm-trust/) +- [`npm publish`](https://docs.npmjs.com/cli/publish/) +- [npm authentication changes](https://github.blog/changelog/2025-12-09-npm-classic-tokens-revoked-session-based-auth-and-cli-token-management-now-available/) + +以下基线核对于 2026-07-28: + +- Trusted Publishing 要求 npm `>=11.5.1`、Node.js `>=22.14.0`。 +- `npm trust` 和 Staged Publishing 使用 npm `>=11.15.0`。 +- GitHub Actions GitHub-hosted runners、GitLab.com shared runners 和 CircleCI cloud 支持 Trusted Publishing。 +- Self-hosted runners 当前不受支持;不要假设企业或自建 runner 可以使用 npm OIDC。 +- 每个 npm 包只能配置一个 Trusted Publisher。 +- Trusted Publisher 只能为已经存在于 registry 的包配置。 + +## 为什么推荐 Node.js 24 + +OIDC 能否工作取决于 npm CLI,而不只取决于 Node.js: + +- Node.js 24 通常自带满足 OIDC 要求的 npm 11,因此官方示例使用 Node 24。 +- Node.js 22 虽满足最低 Node 要求,但常自带 npm 10;npm 10 不会执行 Trusted Publishing 的 OIDC exchange。 +- 使用 Node 22 时,显式安装 npm `>=11.5.1`;若还使用 `npm trust` 或 Staged Publishing,安装 npm `>=11.15.0`。 +- 不存在能让 npm 10 支持 Trusted Publishing 的兼容 env。给旧 npm 设置 `NODE_AUTH_TOKEN` 只是改用 token 认证。 + +推荐发布 job 使用: + +```yaml +- uses: actions/setup-node@v6 + with: + node-version: "24" + registry-url: "https://registry.npmjs.org" + package-manager-cache: false +``` + +必须使用 Node 22 时: + +```yaml +- uses: actions/setup-node@v6 + with: + node-version: "22.14" + registry-url: "https://registry.npmjs.org" + +- run: npm install --global npm@^11.15.0 +- run: node --version && npm --version +``` + +## Token 政策 + +准确区分: + +- **Classic npm token**:已于 2025-12-09 永久撤销,不能恢复、继续使用或重新生成。 +- **Granular access token**:仍受支持;写 token 最长 90 天,可配置 Bypass 2FA。只在 Trusted Publishing 不受支持时把写 token 作为 CI 后备方案。 +- **只读 granular token**:允许用于安装或查询私有包;限制到必要 package/scope,并只传给读取步骤。 +- **`npm login` session**:本地登录产生约两小时会话,适合首次发布或交互式管理,不适合作为长期 CI secret。 + +不要写“所有 npm token 都已废弃”。应写: + +> npm classic token 已永久撤销;granular token 仍存在,但 CI 写 token 需要轮换且暴露面更大。支持的平台优先使用绑定具体 workflow 的 OIDC Trusted Publishing。 + +## OIDC 的权限范围 + +OIDC 支持: + +- `npm publish` +- `npm stage publish` + +OIDC 不替代以下操作的普通认证: + +- `npm install` / `npm ci` 读取私有依赖 +- `npm view` / `npm access` +- `npm whoami` +- `npm stage list/view/approve/reject` + +私有依赖只给读取步骤只读 token;发布步骤不要传 token。 diff --git a/.agents/skills/publish-npm-packages/references/verification.md b/.agents/skills/publish-npm-packages/references/verification.md new file mode 100644 index 0000000..8246aa2 --- /dev/null +++ b/.agents/skills/publish-npm-packages/references/verification.md @@ -0,0 +1,66 @@ +# 发布前验证与排错 + +## 配置验证 + +- 检查 `node --version` 和 `npm --version`。 +- Trusted Publishing 使用 npm `>=11.5.1`;`npm trust`/stage 使用 npm `>=11.15.0`。 +- 检查 registry 为 `https://registry.npmjs.org/`,不要写成 `.com`。 +- 检查包名、version、scope、access、repository 和打包文件。 +- 运行 `npm pack --dry-run` 并检查 tarball 清单。 +- 检查 npm Trusted Publisher 的 repo、workflow、environment 和 allowed action 完全匹配。 +- 检查 CI 使用受支持的 cloud-hosted runner。 +- 检查 GitHub workflow 有 `id-token: write`。 +- 检查发布步骤没有写 token。 +- 私有依赖只在读取步骤使用只读 token。 +- 确认新包已经完成首次发布。 +- 确认 monorepo 每个目标包都有独立 Trusted Publisher。 + +`npm publish --dry-run` 和 `npm pack --dry-run` 不会验证真实 OIDC 认证。不要把 dry run 成功当作 Trusted Publisher 已验证。 + +## 常见错误 + +### `ENEEDAUTH`、token expired/revoked 或 404 + +依次检查: + +1. npm 是否低于 11.5.1。 +2. registry 是否误写为 `https://registry.npmjs.com`。 +3. npm 网站的 owner、repository、workflow 文件名和 environment 是否完全匹配。 +4. workflow 文件名是否包含 `.yml`/`.yaml`,且只填文件名。 +5. GitHub 是否有 `permissions.id-token: write`。 +6. 是否使用 self-hosted runner。 +7. `workflow_call` 是否错误绑定了被调用文件而不是入口 workflow。 +8. `package.json.repository.url` 是否指向实际发布仓库。 + +npm 可能用 404 隐藏无权限资源,不要只按“包不存在”处理。 + +### 403 或 access 错误 + +- 检查 organization team 的 read-write 权限。 +- 检查公共 scoped 包首次发布是否设置 `--access public`。 +- 检查私有包是否有付费计划并使用 `access: restricted`。 +- 检查 Trusted Publisher Allowed actions 与实际 `npm publish`/`npm stage publish` 是否一致。 + +### 私有依赖安装失败 + +OIDC 不认证 `npm ci`、`npm install` 或 `npm view`。给对应读取步骤配置 scope 受限的只读 granular token,不要传给发布步骤。 + +### Provenance 缺失 + +确认: + +- provider 是 GitHub Actions 或 GitLab。 +- 源码仓库公开。 +- npm 包公开。 + +CircleCI、私有源码仓库或私有 npm 包当前不会生成自动 provenance。不要为了隐藏配置错误随意设置 `NPM_CONFIG_PROVENANCE=false`。 + +## 完成报告 + +说明: + +- 修改了哪些本地文件。 +- npm 网站仍需用户填写或已经明确授权完成哪些配置。 +- 是否只运行 dry run。 +- 是否实际创建 Trusted Publisher 或发布版本。 +- 哪些限制仍存在,例如首次发布、付费私有包、self-hosted runner 或私有依赖 token。 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..318dbeb --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Normalize text files and keep LF across platforms. +* text=auto eol=lf diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml new file mode 100644 index 0000000..ab97dd4 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -0,0 +1,43 @@ +name: 缺陷报告 +description: 报告可以稳定复现的问题 +title: 'fix: ' +body: + - type: markdown + attributes: + value: 请先搜索现有 Issue,并准备一个最小复现示例。 + - type: input + id: versions + attributes: + label: 版本 + description: 请填写 Node.js、Prettier 和 prettier-plugin-lint-md 版本。 + placeholder: Node.js 22.x,Prettier 3.x,prettier-plugin-lint-md 1.x + validations: + required: true + - type: textarea + id: reproduction + attributes: + label: 最小复现 + description: 请提供输入文本、Prettier 配置和执行命令。 + validations: + required: true + - type: textarea + id: expected + attributes: + label: 预期结果 + validations: + required: true + - type: textarea + id: actual + attributes: + label: 实际结果 + validations: + required: true + - type: checkboxes + id: checks + attributes: + label: 提交前检查 + options: + - label: 我已搜索现有 Issue。 + required: true + - label: 这不是需要私下报告的安全漏洞。 + required: true diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..e372338 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,8 @@ +blank_issues_enabled: false +contact_links: + - name: 使用文档 + url: https://lint-md.github.io/prettier-plugin/ + about: 提交问题前,请先查阅安装、配置和规则文档。 + - name: 安全策略 + url: https://github.com/lint-md/prettier-plugin/security/policy + about: 安全漏洞请按照安全策略私下报告。 diff --git a/.github/ISSUE_TEMPLATE/feature-request.yml b/.github/ISSUE_TEMPLATE/feature-request.yml new file mode 100644 index 0000000..c168c7e --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature-request.yml @@ -0,0 +1,23 @@ +name: 功能建议 +description: 建议新增规则或改进行为 +title: 'feat: ' +body: + - type: textarea + id: problem + attributes: + label: 使用场景 + description: 请说明当前遇到的问题,而不只是描述解决方案。 + validations: + required: true + - type: textarea + id: proposal + attributes: + label: 建议方案 + description: 请说明期望的输入、输出和配置方式。 + validations: + required: true + - type: textarea + id: alternatives + attributes: + label: 其他方案 + description: 请说明已经尝试的替代方法。 diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..65e5b92 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,10 @@ +## 修改内容 + +请简要说明修改内容和原因。 + +## 检查清单 + +- [ ] 修改只包含一个主题 +- [ ] 已运行 `pnpm check` +- [ ] 行为变更已补充测试 +- [ ] 用户可见的变更已补充文档 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..1d1da62 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,32 @@ +name: CI + +on: + push: + branches: + - master + pull_request: + +permissions: + contents: read + +jobs: + check: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 + + - name: Setup pnpm + uses: pnpm/action-setup@b0f76dfb45f55f8421693e4803ac7bb65143bd34 # v6 + + - name: Setup Node.js + uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7 + with: + node-version: 22 + cache: pnpm + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Check + run: pnpm check diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 0000000..8422bcc --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,63 @@ +name: Deploy Docs + +on: + push: + branches: + - master + paths: + - docs/** + - .github/workflows/docs.yml + - package.json + - pnpm-lock.yaml + - pnpm-workspace.yaml + workflow_dispatch: + +concurrency: + group: pages + cancel-in-progress: true + +jobs: + build: + runs-on: ubuntu-latest + permissions: + contents: read + steps: + - name: Checkout + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 + + - name: Setup pnpm + uses: pnpm/action-setup@b0f76dfb45f55f8421693e4803ac7bb65143bd34 # v6 + + - name: Setup Node.js + uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7 + with: + node-version: 22 + cache: pnpm + + - name: Configure GitHub Pages + uses: actions/configure-pages@45bfe0192ca1faeb007ade9deae92b16b8254a0d # v6 + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Build documentation + run: pnpm docs:build + + - name: Upload GitHub Pages artifact + uses: actions/upload-pages-artifact@fc324d3547104276b827a68afc52ff2a11cc49c9 # v5 + with: + path: docs/doc_build + + deploy: + needs: build + runs-on: ubuntu-latest + permissions: + pages: write + id-token: write + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@cd2ce8fcbc39b97be8ca5fce6e763baed58fa128 # v5 diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml index 6062c5c..3e58f75 100644 --- a/.github/workflows/release-please.yml +++ b/.github/workflows/release-please.yml @@ -1,50 +1,61 @@ name: Release Please + on: push: branches: - master -permissions: - contents: write - pull-requests: write - jobs: - release-please: + release: runs-on: ubuntu-latest + permissions: + contents: write + issues: write + pull-requests: write + outputs: + created: ${{ steps.release.outputs['packages/prettier-plugin-lint-md--release_created'] }} steps: - - uses: googleapis/release-please-action@v5.0.0 + - name: Create or update release pull request id: release + uses: googleapis/release-please-action@45996ed1f6d02564a971a2fa1b5860e934307cf7 # v5.0.0 with: - release-type: node - - # - name: Checkout repository - # uses: actions/checkout@v4 - # with: - # fetch-depth: 0 - # if: ${{ steps.release.outputs.release_created }} - - # - uses: pnpm/action-setup@v3 - # with: - # version: 10 - # if: ${{ steps.release.outputs.release_created }} - - # - name: Setup Node - # uses: actions/setup-node@v4 - # with: - # node-version: 22 - # cache: pnpm - # registry-url: 'https://registry.npmjs.org' - # if: ${{ steps.release.outputs.release_created }} - - # - name: Install dependencies - # run: pnpm install - # if: ${{ steps.release.outputs.release_created }} - - # - name: Build project - # run: pnpm run build - # if: ${{ steps.release.outputs.release_created }} - - # - run: npm publish - # env: - # NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} - # if: ${{ steps.release.outputs.release_created }} + config-file: release-please-config.json + manifest-file: .release-please-manifest.json + + publish: + needs: release + if: ${{ needs.release.outputs.created == 'true' }} + runs-on: ubuntu-latest + permissions: + contents: read + id-token: write + steps: + - name: Checkout + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 + + - name: Setup pnpm + uses: pnpm/action-setup@b0f76dfb45f55f8421693e4803ac7bb65143bd34 # v6 + + - name: Setup Node.js + uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7 + with: + node-version: 24 + package-manager-cache: false + registry-url: https://registry.npmjs.org + + - name: Check publishing tools + run: node --version && npm --version + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Verify package + run: pnpm check + + - name: Inspect package contents + run: npm pack --dry-run + working-directory: packages/prettier-plugin-lint-md + + - name: Publish package + run: npm publish + working-directory: packages/prettier-plugin-lint-md diff --git a/.gitignore b/.gitignore index 0ca39c0..b2dcc7f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ node_modules dist +doc_build +coverage +.rspress .DS_Store diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..61fbe9a --- /dev/null +++ b/.prettierignore @@ -0,0 +1,8 @@ +node_modules +dist +doc_build +coverage +.rspress +pnpm-lock.yaml +CHANGELOG.md +.agents diff --git a/.prettierrc.mjs b/.prettierrc.mjs index f442755..2f5c5b4 100644 --- a/.prettierrc.mjs +++ b/.prettierrc.mjs @@ -10,7 +10,6 @@ const config = { quoteProps: 'as-needed', bracketSpacing: true, arrowParens: 'always', - plugins: [`./dist/prettier-plugin-lint-md.js`], }; export default config; diff --git a/.release-please-manifest.json b/.release-please-manifest.json new file mode 100644 index 0000000..e078b22 --- /dev/null +++ b/.release-please-manifest.json @@ -0,0 +1,3 @@ +{ + "packages/prettier-plugin-lint-md": "1.0.2" +} diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index 8c1f072..0000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,24 +0,0 @@ -# Changelog - -All notable changes to this project will be documented in this file. See [commit-and-tag-version](https://github.com/absolute-version/commit-and-tag-version) for commit guidelines. - -## [1.0.2](https://github.com/lint-md/prettier-plugin/compare/v1.0.1...v1.0.2) (2025-03-20) - - -### Bug Fixes - -* 修复package文件指向不正确问题 ([a6603f0](https://github.com/lint-md/prettier-plugin/commit/a6603f049a59446ec7ee158002941bfe30996081)) - -## [1.0.1](https://github.com/bosens-China/prettier-plugin-lint-md/compare/v1.0.0...v1.0.1) (2024-07-08) - - -### Bug Fixes - -* 修复package暴露cjs导致prettier默认不可用情况 ([2b8653b](https://github.com/bosens-China/prettier-plugin-lint-md/commit/2b8653b68d7c829cd9e1b4c5db15e869423b6e51)) - -## 1.0.0 (2024-07-04) - - -### Features - -* 完成插件开发,测试用例补充和文档编写 ([95d8598](https://github.com/bosens-China/prettier-plugin-lint-md/commit/95d8598c34522ca2f2e465623e9e6cc0eb456fdb)) diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..c278eb5 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,16 @@ +# 社区行为准则 + +我们希望所有参与者都能在友好、尊重和专业的环境中协作。 + +## 基本要求 + +- 尊重不同经验、背景和观点。 +- 针对代码和事实讨论问题,不攻击个人。 +- 接受建设性反馈,也为自己的言行负责。 +- 不骚扰、歧视、威胁他人,不公开他人的私人信息。 + +## 处理方式 + +维护者可以删除不当内容,并根据行为严重程度给予提醒、临时限制或永久禁止参与等处理。 + +如需报告违反行为准则的问题,请发送邮件至 `yangboses@gmail.com`。维护者会谨慎处理报告,并尽量保护报告人的隐私。 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..e72899d --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,32 @@ +# 参与贡献 + +感谢你为 `prettier-plugin-lint-md` 提交改进。 + +## 开始之前 + +- 修复缺陷或新增功能前,请先搜索现有 Issue。 +- 安全漏洞不要提交公开 Issue,请按照[安全策略](./SECURITY.md)报告。 +- 一个 Pull Request 只处理一个主题,避免混入无关改动。 + +## 本地开发 + +项目需要 Node.js 22 或更高版本,并使用 pnpm 管理依赖。 + +```sh +pnpm install +pnpm check +``` + +提交 Pull Request 前,请确保类型检查、测试、代码检查、格式检查和构建全部通过。 + +## 提交信息 + +项目使用 Conventional Commits 生成版本和更新日志。常用类型如下: + +- `feat:` 新增功能 +- `fix:` 修复缺陷 +- `docs:` 修改文档 +- `test:` 修改测试 +- `chore:` 维护项目 + +请说明修改原因,并为行为变更补充测试或文档。 diff --git a/License b/LICENSE.txt similarity index 96% rename from License rename to LICENSE.txt index 8b7cd46..b512c2e 100644 --- a/License +++ b/LICENSE.txt @@ -1,6 +1,6 @@ MIT License -Copyright (c) [2024 - present] [yliu] +Copyright (c) 2024 yliu Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 6c55c71..885691b 100644 --- a/README.md +++ b/README.md @@ -1,126 +1,41 @@ # prettier-plugin-lint-md -![Static Badge](https://img.shields.io/badge/MIT-License-blue) ![Static Badge](https://img.shields.io/badge/vitest-100%25-green) +[![npm version](https://img.shields.io/npm/v/prettier-plugin-lint-md)](https://www.npmjs.com/package/prettier-plugin-lint-md) +[![CI](https://img.shields.io/github/actions/workflow/status/lint-md/prettier-plugin/ci.yml?branch=master&label=CI)](https://github.com/lint-md/prettier-plugin/actions/workflows/ci.yml) +[![MIT License](https://img.shields.io/badge/license-MIT-blue.svg)](./LICENSE.txt) -![logo](./img/logo.png) +![prettier-plugin-lint-md](./docs/docs/public/images/logo.png) -why? +让 Prettier 格式化后的 Markdown 符合中文排版规范。 -[Prettier 3.0](https://prettier.io/blog/2023/07/05/3.0.0.html#stop-inserting-spaces-between-chinese-or-japanese-and-western-characters) 有许多变动,其中有一条将不会自动在中英文符号插入空格提高可读性。 +## 为什么需要这个插件? -![alt text](img/image.png) +[Prettier 3](https://prettier.io/blog/2023/07/05/3.0.0.html#stop-inserting-spaces-between-chinese-or-japanese-and-western-characters) 不再自动在中文、日文与西文字符之间插入空格。这个决定适合 Prettier 的整体用户群体。中文技术文档通常仍希望保留这类排版规则。 -虽然从使用群体来说 Prettier 这个决定没有什么问题,不过确实也会导致编写起来会存在很多不便,所有就有了这个插件。 +![Prettier 3 关于中西文空格的变更说明](./docs/docs/public/images/image.png) -> 还有一些其他讨论: -> [Markdown: Add an option to re-enable Prettier 2.x's automatic space insertion in CJK](https://github.com/prettier/prettier/issues/15015) +这个插件会在 Prettier 格式化前调用 `@lint-md/core`,自动修复相关的中文排版问题。 -## 工作原理 +> 相关讨论:[Markdown: Add an option to re-enable Prettier 2.x's automatic space insertion in CJK](https://github.com/prettier/prettier/issues/15015) -[lint-md](https://github.com/lint-md/lint-md) 是检查中文 Markdown 编写格式的工具,让你的文档更加优雅规范。 +## 快速开始 -它内置了许多检查: - -![alt text](img/image-1.png) - -具体配置就是[阮一峰写的中文技术文档的写作规范](https://github.com/ruanyf/document-style-guide) - -这个插件就是结合 Prettier 让你在编写的过程中实时修订错误。 - -```txt -编写 markdown => 发现问题 => lint-md 修订 => prettier 格式化 => 输出 -``` - -## 使用 +安装插件: ```sh -npm i prettier-plugin-lint-md prettier -D -# or -yarn add prettier-plugin-lint-md prettier -D -# pnpm -pnpm add prettier-plugin-lint-md prettier -D +pnpm add -D prettier prettier-plugin-lint-md ``` -在 Prettier 支持的[配置文件](https://prettier.io/docs/en/configuration),例如 `.prettierrc.mjs` +在 Prettier 配置中启用插件: ```js export default { - // ... - plugins: [`prettier-plugin-lint-md`], + plugins: ['prettier-plugin-lint-md'], }; ``` -> 上面的配置是 prettier 3.0 的配置,对于低版本的 prettier 不太清楚上面配置是否有效。 -> 如果需要导入 cjs 模板的可以使用 `prettier-plugin-lint-md/dist/prettier-plugin-lint-md.cjs`。 - -### Node 调用 - -```ts -import prettierPluginLintMd, { PARSER_NAME } from 'prettier-plugin-lint-md'; -import { format } from 'prettier'; - -const result = await format(code, { - parser: PARSER_NAME, - plugins: [prettierPluginLintMd], -}); -``` - -更多示例可以参考 [\_\_test\_\_](./__test__/) 目录。 - -> 默认 import 导入的是 es 模块,但是 cjs 模块也是在构建列表中,如果想要使用,可以通过下面的形式导入。 -> -> ```js -> const prettierPluginLintMd = require('prettier-plugin-lint-md/dist/prettier-plugin-lint-md.cjs'); -> // prettierPluginLintMd 有可能需要结合 prettierPluginLintMd.default 来使用,具体看构建工具实现。 -> // 具体参考 [rollupjs.org/configuration-options](https://rollupjs.org/configuration-options/#output-exports) -> ``` - -## 配置 - -初始情况下开箱即用,如果需要对规则细致调整可以继续往下阅读。 - -lint-md 支持 `.lintmdrc` JSON 配置文件,`prettier-plugin-lint-md` 同样也支持,默认情况下会自动启用 `.lintmdrc` 文件内的配置。 - -如果想启用其他文件名称可以在配置文件传递 `configFile` 字段。 - -```js -// .prettierrc.mjs -export default { - // ... - plugins: [`prettier-plugin-lint-md`], - configFile: '.lintmdrc', -}; -``` - -> configFile 可以是一个绝对路径也可以是相对路径,如果是相对路径会根据根目录来计算,如果绝对路径则直接启用。 - -### 具体配置项 - -完整配置项内容[点击查看](https://github.com/lint-md/lint-md?tab=readme-ov-file#%E8%A7%84%E5%88%99%E6%A6%82%E8%BF%B0) - -![alt text](img/image-1.png) - -之后在 `.prettierrc.mjs` 写入需要调整的配置项即可,例如禁止 `中文与英文之间需要增加空格` - -```js -// .prettierrc.mjs -export default { - // ... - plugins: [`prettier-plugin-lint-md`], - 'space-around-alphabet': false, -}; -``` - -不过需要额外注意两点: - -**1.** 除了 `configFile` 其他都是 `boolean`,虽然规则值本身是 `0, 1, 2` 这样的字段 -![alt text](img/image-2.png) -但是这些是 CLI 中使用的,在 prettier 中不需要警告,只需要修复所以是 `true` 和 `false` 。 - -**2.** 不支持 `no-long-code`,因为不支持自动修复,所以没必要存在。 - -> configFile 配置会被手动传递的规则覆盖。 +这就是完整的基础配置。插件默认启用全部 16 条可自动修复规则,包括中西文空格、数字空格、中文标点、省略号、空链接和代码块等常见问题。只有需要调整个别规则时,才需要添加额外配置。 -## 协议 +安装、配置、默认规则和 Node.js API 请阅读[完整文档](https://lint-md.github.io/prettier-plugin/)。 -MIT License +[GitHub](https://github.com/lint-md/prettier-plugin) · [问题反馈](https://github.com/lint-md/prettier-plugin/issues) · [参与贡献](./CONTRIBUTING.md) · [安全策略](./SECURITY.md) · [MIT License](./LICENSE.txt) diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..78de082 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,16 @@ +# 安全策略 + +## 支持范围 + +项目只为 npm 上最新发布的版本提供安全更新。旧版本发现安全问题后,请先升级到最新版本并重新确认。 + +## 报告漏洞 + +请勿通过公开 Issue 披露尚未修复的漏洞。请发送邮件至 `yangboses@gmail.com`,并尽量提供以下信息: + +- 受影响的版本 +- 复现步骤或最小示例 +- 可能造成的影响 +- 已知的缓解方式 + +在修复发布前,请避免公开漏洞细节。 diff --git a/SUPPORT.md b/SUPPORT.md new file mode 100644 index 0000000..ea6eeab --- /dev/null +++ b/SUPPORT.md @@ -0,0 +1,5 @@ +# 获取帮助 + +使用前请先阅读[在线文档](https://lint-md.github.io/prettier-plugin/)和现有 [Issue](https://github.com/lint-md/prettier-plugin/issues)。 + +如果问题仍未解决,请提交 Issue,并提供 Node.js、Prettier、插件版本、配置和最小复现示例。安全漏洞请按照[安全策略](./SECURITY.md)私下报告。 diff --git a/__test__/rule.test.ts b/__test__/rule.test.ts deleted file mode 100644 index b652bc6..0000000 --- a/__test__/rule.test.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { expect, test } from 'vitest'; -import { format } from 'prettier'; -import { prettierLintMd, PARSER_NAME } from '../src/index'; -import fs from 'node:fs'; -import path from 'node:path'; - -test(`no-space-in-inline-code`, async () => { - const md = '- right ` const a = 1 ` 你好'; - - await expect( - format(md, { - parser: PARSER_NAME, - plugins: [ - prettierLintMd({ - 'no-space-in-inline-code': true, - }), - ], - }), - ).resolves.toBe('- right `const a = 1` 你好\n'); -}); - -test(`no-space-in-inline-code 配置文件`, async () => { - const configPath = path.join(process.cwd(), '.test'); - - fs.writeFileSync( - configPath, - JSON.stringify({ 'no-space-in-inline-code': true }), - 'utf-8', - ); - - const md = '- right ` const a = 1 ` 你好'; - - await expect( - format(md, { - parser: PARSER_NAME, - plugins: [ - prettierLintMd({ - configFile: configPath, - }), - ], - }), - ).resolves.toBe('- right `const a = 1` 你好\n'); - - fs.rmSync(configPath); -}); diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 0000000..23a4bc9 --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,14 @@ +# Local +.DS_Store +*.local +*.log* + +# Dist +node_modules +dist/ +doc_build/ + +# IDE +.vscode/* +!.vscode/extensions.json +.idea diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..dc4613a --- /dev/null +++ b/docs/README.md @@ -0,0 +1,8 @@ +# 文档站 + +在仓库根目录运行: + +```sh +pnpm install +pnpm docs:dev +``` diff --git a/docs/docs/_nav.json b/docs/docs/_nav.json new file mode 100644 index 0000000..0f9d63a --- /dev/null +++ b/docs/docs/_nav.json @@ -0,0 +1,15 @@ +[ + { + "text": "指南", + "link": "/guide/getting-started", + "activeMatch": "/guide/" + }, + { + "text": "npm", + "link": "https://www.npmjs.com/package/prettier-plugin-lint-md" + }, + { + "text": "GitHub", + "link": "https://github.com/lint-md/prettier-plugin" + } +] diff --git a/docs/docs/guide/_meta.json b/docs/docs/guide/_meta.json new file mode 100644 index 0000000..5a0ccc9 --- /dev/null +++ b/docs/docs/guide/_meta.json @@ -0,0 +1 @@ +["introduction", "getting-started", "configuration", "rules", "node-api"] diff --git a/docs/docs/guide/configuration.md b/docs/docs/guide/configuration.md new file mode 100644 index 0000000..430966e --- /dev/null +++ b/docs/docs/guide/configuration.md @@ -0,0 +1,53 @@ +# 配置 + +插件默认启用全部可自动修复规则,无需额外配置。你可以通过 Prettier 配置或 `.lintmdrc` 关闭或调整个别规则。 + +## Prettier 配置 + +除 `configFile` 外,插件规则在 Prettier 中都使用布尔值: + +```js title=".prettierrc.mjs" +export default { + plugins: ['prettier-plugin-lint-md'], + 'space-around-alphabet': false, + 'space-around-number': true, +}; +``` + +`true` 表示启用,`false` 表示关闭。命令行也可以使用 Prettier 自动生成的选项,例如: + +```sh +prettier --plugin=prettier-plugin-lint-md --no-space-around-alphabet --write README.md +``` + +## `.lintmdrc` + +插件默认从当前工作目录读取 `.lintmdrc`: + +```json title=".lintmdrc" +{ + "space-around-alphabet": 0, + "space-around-number": 2 +} +``` + +`.lintmdrc` 使用 lint-md 的严重级别:`0` 表示关闭、`1` 表示警告、`2` 表示错误。 + +![lint-md 严重级别配置](/images/image-2.png) + +也可以在 Prettier 配置中指定其他文件: + +```js title=".prettierrc.mjs" +export default { + plugins: ['prettier-plugin-lint-md'], + configFile: 'config/lint-md.json', +}; +``` + +相对路径以当前工作目录为基准,绝对路径会直接使用。 + +规则优先级依次为 `.lintmdrc`、`prettierLintMd()` 的工厂配置、本次 Prettier 配置或 `format()` 选项。后面的配置会覆盖前面的配置。 + +## 不支持的规则 + +插件只暴露可自动修复的规则,因此不包含无法自动修复的 `no-long-code`。 diff --git a/docs/docs/guide/getting-started.mdx b/docs/docs/guide/getting-started.mdx new file mode 100644 index 0000000..4aeb6be --- /dev/null +++ b/docs/docs/guide/getting-started.mdx @@ -0,0 +1,50 @@ +import { PackageManagerTabs } from '@rspress/core/theme'; + +# 快速开始 + +## 环境要求 + +- Node.js 22 或更高版本 +- Prettier 3 + +## 安装 + + + +## 配置 + +在 Prettier 配置中显式加载插件: + +```js title=".prettierrc.mjs" +export default { + plugins: ['prettier-plugin-lint-md'], +}; +``` + +以上就是完整的基础配置。无需逐条启用规则。 + +此后按平常方式格式化 Markdown: + +```sh +prettier --write "**/*.md" +``` + +插件会先调用 `@lint-md/core`,按照默认规则修正 Markdown 文本,再交给 Prettier 内置的 Markdown 解析器完成格式化。 + +## 默认规则 + +插件默认启用全部 16 条可自动修复规则。这套默认配置覆盖中西文空格、数字空格、中文标点、省略号、空链接、空列表、代码块和标题标点等常见问题。 + +默认配置适合直接用于中文技术文档。只有需要关闭或调整个别规则时,才需要添加额外配置。所有默认规则请查看[规则](./rules)。 + +## 下一步 + +- 需要启用或关闭单条规则,请阅读[配置](./configuration)。 +- 需要查看所有默认规则,请阅读[规则](./rules)。 +- 需要在程序中调用,请阅读 [Node.js API](./node-api)。 diff --git a/docs/docs/guide/introduction.md b/docs/docs/guide/introduction.md new file mode 100644 index 0000000..518c136 --- /dev/null +++ b/docs/docs/guide/introduction.md @@ -0,0 +1,21 @@ +# 介绍 + +## 为什么需要这个插件 + +[Prettier 3](https://prettier.io/blog/2023/07/05/3.0.0.html#stop-inserting-spaces-between-chinese-or-japanese-and-western-characters) 不再自动在中文、日文与西文之间插入空格。这个决定适合 Prettier 的整体用户群体。中文技术文档往往仍希望保留这类排版规则。 + +![Prettier 3 关于中西文空格的变更说明](/images/image.png) + +相关讨论可参考 [Markdown: Add an option to re-enable Prettier 2.x's automatic space insertion in CJK](https://github.com/prettier/prettier/issues/15015)。 + +## 工作原理 + +插件复用 Prettier 内置的 Markdown 解析器,并在解析前调用 [`@lint-md/core`](https://github.com/lint-md/lint-md) 修复中文排版: + +```text +Markdown 源文档 → lint-md 修复 → Prettier 格式化 → 输出 +``` + +lint-md 的规则参考了[中文技术文档的写作规范](https://github.com/ruanyf/document-style-guide)。插件只暴露能够自动修复的规则,避免在格式化流程中加入仅报告、无法修正的问题。 + +![lint-md 规则示例](/images/image-1.png) diff --git a/docs/docs/guide/node-api.md b/docs/docs/guide/node-api.md new file mode 100644 index 0000000..d55357b --- /dev/null +++ b/docs/docs/guide/node-api.md @@ -0,0 +1,42 @@ +# Node.js API + +## 直接使用默认插件 + +```ts +import { format } from 'prettier'; +import prettierPluginLintMd from 'prettier-plugin-lint-md'; + +const result = await format('中文abc', { + parser: 'markdown', + plugins: [prettierPluginLintMd], +}); +``` + +## 创建固定配置的插件 + +`prettierLintMd()` 可以创建带有固定规则的插件实例: + +```ts +import { format } from 'prettier'; +import { prettierLintMd } from 'prettier-plugin-lint-md'; + +const plugin = prettierLintMd({ + 'space-around-alphabet': false, +}); + +const result = await format('中文abc', { + parser: 'markdown', + plugins: [plugin], +}); +``` + +调用 `prettierLintMd()` 时传入的规则会覆盖 `.lintmdrc`;本次 `format()` 调用中的同名插件选项仍具有最高优先级。 + +## CommonJS + +构建产物也包含 CommonJS 版本: + +```js +const prettierPluginLintMd = + require('prettier-plugin-lint-md/dist/prettier-plugin-lint-md.cjs').default; +``` diff --git a/docs/docs/guide/rules.md b/docs/docs/guide/rules.md new file mode 100644 index 0000000..ed66255 --- /dev/null +++ b/docs/docs/guide/rules.md @@ -0,0 +1,24 @@ +# 规则 + +下面 16 条规则全部默认启用,无需逐条配置。需要关闭某条规则时,可以在 Prettier 配置中将其设置为 `false`。 + +| 规则 | 默认启用 | 说明 | +| ------------------------------------ | -------- | ------------------------------ | +| `space-around-alphabet` | 是 | 中文与英文之间增加空格 | +| `space-around-number` | 是 | 中文与数字之间增加空格 | +| `no-empty-code-lang` | 是 | 代码块语言不能为空 | +| `no-empty-url` | 是 | 链接和图片地址不能为空 | +| `no-empty-list` | 是 | 列表内容不能为空 | +| `no-empty-code` | 是 | 代码块内容不能为空 | +| `no-empty-inline-code` | 是 | 行内代码内容不能为空 | +| `no-empty-blockquote` | 是 | 引用块内容不能为空 | +| `no-special-characters` | 是 | 文本中不能有特殊字符 | +| `use-standard-ellipsis` | 是 | 使用标准省略号 | +| `no-full-width-number` | 是 | 不能使用全角数字 | +| `no-half-width-punctuation` | 是 | 中文语境下不能使用半角标点 | +| `no-space-in-link` | 是 | 链接前后不能有空格 | +| `no-multiple-space-blockquote` | 是 | 引用标记和内容间只能有一个空格 | +| `correct-title-trailing-punctuation` | 是 | 标题末尾只使用合适的标点 | +| `no-space-in-inline-code` | 是 | 行内代码内容前后不能有空格 | + +规则的具体行为由 [`@lint-md/core`](https://github.com/lint-md/lint-md) 提供。 diff --git a/docs/docs/index.md b/docs/docs/index.md new file mode 100644 index 0000000..fd77209 --- /dev/null +++ b/docs/docs/index.md @@ -0,0 +1,31 @@ +--- +pageType: home + +hero: + name: prettier-plugin-lint-md + text: 用 Prettier 自动修正中文 Markdown 排版 + tagline: 基于 @lint-md/core,兼容 Prettier 3 + actions: + - theme: brand + text: 快速开始 + link: /guide/getting-started + - theme: alt + text: GitHub + link: https://github.com/lint-md/prettier-plugin + image: + src: /images/logo.png + alt: prettier-plugin-lint-md +features: + - title: 开箱即用 + details: 安装并启用插件,即可使用全部可自动修复的默认规则。 + icon: ✨ + link: /guide/getting-started + - title: 规则可配置 + details: 可通过 Prettier 配置或 .lintmdrc 精细控制规则。 + icon: ⚙️ + link: /guide/configuration + - title: 支持 Node.js API + details: 可直接传入 Prettier,也可创建带有固定规则的插件实例。 + icon: 📦 + link: /guide/node-api +--- diff --git a/img/image-1.png b/docs/docs/public/images/image-1.png similarity index 100% rename from img/image-1.png rename to docs/docs/public/images/image-1.png diff --git a/img/image-2.png b/docs/docs/public/images/image-2.png similarity index 100% rename from img/image-2.png rename to docs/docs/public/images/image-2.png diff --git a/img/image.png b/docs/docs/public/images/image.png similarity index 100% rename from img/image.png rename to docs/docs/public/images/image.png diff --git a/img/logo.png b/docs/docs/public/images/logo.png similarity index 100% rename from img/logo.png rename to docs/docs/public/images/logo.png diff --git a/docs/package.json b/docs/package.json new file mode 100644 index 0000000..07a44ba --- /dev/null +++ b/docs/package.json @@ -0,0 +1,22 @@ +{ + "name": "prettier-plugin-lint-md-docs", + "private": true, + "type": "module", + "scripts": { + "build": "rspress build", + "dev": "rspress dev", + "preview": "rspress preview", + "typecheck": "tsc --noEmit" + }, + "dependencies": { + "@rspress/core": "^2.0.18" + }, + "devDependencies": { + "@types/node": "^22.20.1", + "@types/react": "^19.2.17", + "@types/react-dom": "^19.2.3", + "react": "^19.2.8", + "react-dom": "^19.2.8", + "typescript": "^6.0.3" + } +} diff --git a/docs/rspress.config.ts b/docs/rspress.config.ts new file mode 100644 index 0000000..23aee2a --- /dev/null +++ b/docs/rspress.config.ts @@ -0,0 +1,23 @@ +import * as path from 'node:path'; +import { defineConfig } from '@rspress/core'; + +export default defineConfig({ + root: path.join(__dirname, 'docs'), + base: process.env.GITHUB_ACTIONS ? '/prettier-plugin/' : '/', + siteOrigin: 'https://lint-md.github.io', + lang: 'zh', + title: 'prettier-plugin-lint-md', + description: '让 Prettier 格式化后的 Markdown 符合中文排版规范', + icon: '/images/logo.png', + logo: '/images/logo.png', + logoText: 'prettier-plugin-lint-md', + themeConfig: { + socialLinks: [ + { + icon: 'github', + mode: 'link', + content: 'https://github.com/lint-md/prettier-plugin', + }, + ], + }, +}); diff --git a/docs/tsconfig.json b/docs/tsconfig.json new file mode 100644 index 0000000..b7a653b --- /dev/null +++ b/docs/tsconfig.json @@ -0,0 +1,29 @@ +{ + "compilerOptions": { + "lib": ["DOM", "ES2023"], + "jsx": "react-jsx", + "target": "ES2023", + "noEmit": true, + "skipLibCheck": true, + "useDefineForClassFields": true, + + /* modules */ + "module": "ESNext", + "moduleDetection": "force", + "moduleResolution": "bundler", + "verbatimModuleSyntax": true, + "resolveJsonModule": true, + "allowImportingTsExtensions": true, + "noUncheckedSideEffectImports": true, + "isolatedModules": true, + + /* type checking */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true + }, + "include": ["docs", "theme", "rspress.config.ts"], + "mdx": { + "checkMdx": true + } +} diff --git a/eslint.config.mjs b/eslint.config.mjs index df4525b..cb86422 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -3,11 +3,18 @@ import pluginJs from '@eslint/js'; import tseslint from 'typescript-eslint'; export default [ + { + ignores: [ + '**/coverage/**', + '**/dist/**', + '**/doc_build/**', + '**/node_modules/**', + '**/.rspress/**', + './.agents/**', + ], + }, { files: ['**/*.{js,mjs,cjs,ts}'] }, - { languageOptions: { globals: { ...globals.browser, ...globals.node } } }, + { languageOptions: { globals: globals.node } }, pluginJs.configs.recommended, ...tseslint.configs.recommended, - { - ignores: ['dist'], - }, ]; diff --git a/package.json b/package.json index d434abe..08c0d35 100644 --- a/package.json +++ b/package.json @@ -1,63 +1,37 @@ { - "name": "prettier-plugin-lint-md", - "version": "1.0.2", - "description": "prettier 格式化插件,让其符合中文编写规范。", - "contributors": [ - "yliu " - ], - "keywords": [ - "lint", - "markdown", - "lint-md", - "chinese", - "prettier" - ], - "author": "yliu", - "publishConfig": { - "registry": "https://registry.npmjs.org" - }, - "bugs": { - "url": "https://github.com/bosens-China/prettier-plugin-lint-md/issues" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/bosens-China/prettier-plugin-lint-md" - }, - "license": "MIT", + "name": "prettier-plugin-lint-md-monorepo", + "private": true, "type": "module", - "main": "./dist/prettier-plugin-lint-md.js", - "module": "./dist/prettier-plugin-lint-md.js", - "types": "./dist/index.d.ts", - "files": [ - "dist" - ], - "devDependencies": { - "@eslint/js": "^10.0.1", - "@types/node": "^25.9.3", - "eslint": "~10.5.0", - "globals": "^17.6.0", - "prettier": "^3.8.4", - "tsx": "^4.22.4", - "typescript": "^6.0.3", - "typescript-eslint": "^8.61.1", - "vite": "^8.0.16", - "vite-plugin-dts": "^5.0.2", - "vitest": "^4.1.9" + "engines": { + "node": ">=22.12.0" }, + "packageManager": "pnpm@11.17.0", "scripts": { - "build": "vite build", - "build-watch": "vite build -w", - "test": "vitest" + "build": "pnpm --recursive --if-present run build", + "check": "pnpm lint && pnpm format:check && pnpm typecheck && pnpm test && pnpm build", + "docs:build": "pnpm --filter prettier-plugin-lint-md-docs build", + "docs:dev": "pnpm --filter prettier-plugin-lint-md-docs dev", + "docs:preview": "pnpm --filter prettier-plugin-lint-md-docs preview", + "format": "prettier --write .", + "format:check": "prettier --check .", + "lint": "eslint .", + "prepare": "simple-git-hooks", + "test": "pnpm --filter prettier-plugin-lint-md test", + "typecheck": "pnpm --recursive --if-present run typecheck" }, - "dependencies": { - "@lint-md/core": "^2.0.0" + "lint-staged": { + "*": "prettier --write --ignore-unknown" }, - "peerDependencies": { - "prettier": ">= 3" + "simple-git-hooks": { + "pre-commit": "pnpm exec lint-staged" }, - "pnpm": { - "onlyBuiltDependencies": [ - "esbuild" - ] + "devDependencies": { + "@eslint/js": "^10.0.1", + "eslint": "~10.8.0", + "globals": "^17.8.0", + "lint-staged": "^17.2.0", + "prettier": "^3.9.6", + "simple-git-hooks": "^2.13.1", + "typescript-eslint": "^8.65.0" } -} \ No newline at end of file +} diff --git a/packages/prettier-plugin-lint-md/CHANGELOG.md b/packages/prettier-plugin-lint-md/CHANGELOG.md new file mode 100644 index 0000000..70317e2 --- /dev/null +++ b/packages/prettier-plugin-lint-md/CHANGELOG.md @@ -0,0 +1,21 @@ +# 更新日志 + +本项目的重要变更都会记录在此文件中。`1.0.2` 只创建了 GitHub Release,没有发布到 npm。 + +## [1.0.2](https://github.com/lint-md/prettier-plugin/compare/v1.0.1...v1.0.2) (2025-03-20) + +### 问题修复 + +- 修复 `package.json` 入口指向错误的问题([a6603f0](https://github.com/lint-md/prettier-plugin/commit/a6603f049a59446ec7ee158002941bfe30996081)) + +## [1.0.1](https://github.com/lint-md/prettier-plugin/compare/v1.0.0...v1.0.1) (2024-07-08) + +### 问题修复 + +- 修复 `package.json` 暴露 CommonJS 入口后导致 Prettier 默认不可用的问题([2b8653b](https://github.com/lint-md/prettier-plugin/commit/2b8653b68d7c829cd9e1b4c5db15e869423b6e51)) + +## 1.0.0 (2024-07-04) + +### 新增功能 + +- 完成插件开发、测试用例补充和文档编写([95d8598](https://github.com/lint-md/prettier-plugin/commit/95d8598c34522ca2f2e465623e9e6cc0eb456fdb)) diff --git a/packages/prettier-plugin-lint-md/LICENSE.txt b/packages/prettier-plugin-lint-md/LICENSE.txt new file mode 100644 index 0000000..b512c2e --- /dev/null +++ b/packages/prettier-plugin-lint-md/LICENSE.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 yliu + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/prettier-plugin-lint-md/README.md b/packages/prettier-plugin-lint-md/README.md new file mode 100644 index 0000000..e8011e4 --- /dev/null +++ b/packages/prettier-plugin-lint-md/README.md @@ -0,0 +1,25 @@ +# prettier-plugin-lint-md + +让 Prettier 格式化后的 Markdown 符合中文排版规范。 + +## 安装 + +```sh +npm install --save-dev prettier prettier-plugin-lint-md +``` + +## 配置 + +在 Prettier 配置中启用插件: + +```js +export default { + plugins: ['prettier-plugin-lint-md'], +}; +``` + +无需逐条配置规则。插件默认启用全部 16 条可自动修复规则,覆盖中西文空格、数字空格、中文标点、省略号、空链接和代码块等常见问题。 + +完整的规则列表和高级配置请阅读[在线文档](https://lint-md.github.io/prettier-plugin/)。 + +[GitHub](https://github.com/lint-md/prettier-plugin) · [问题反馈](https://github.com/lint-md/prettier-plugin/issues) · [MIT License](./LICENSE.txt) diff --git a/__test__/index.test.ts b/packages/prettier-plugin-lint-md/__test__/index.test.ts similarity index 61% rename from __test__/index.test.ts rename to packages/prettier-plugin-lint-md/__test__/index.test.ts index 1b2e895..5746523 100644 --- a/__test__/index.test.ts +++ b/packages/prettier-plugin-lint-md/__test__/index.test.ts @@ -30,6 +30,10 @@ test(`格式化英文`, async () => { await expect(formatCode(code)).resolves.toBe(`${code}\n`); }); +test(`保留 lint-md 修复后的空字符串`, async () => { + await expect(formatCode('```\n```')).resolves.toBe(''); +}); + test(`验证配置`, async () => { const code = `测试abc`; await expect( @@ -44,6 +48,41 @@ test(`验证配置`, async () => { ).resolves.toBe(`${code}\n`); }); +test(`读取 Prettier 插件选项`, async () => { + const code = `测试abc`; + await expect( + format(code, { + parser: PARSER_NAME, + plugins: [prettierPluginLintMd], + 'space-around-alphabet': false, + }), + ).resolves.toBe(`${code}\n`); +}); + +test(`Prettier 插件选项覆盖工厂配置`, async () => { + const code = `测试abc`; + await expect( + format(code, { + parser: PARSER_NAME, + plugins: [ + prettierLintMd({ + 'space-around-alphabet': true, + }), + ], + 'space-around-alphabet': false, + }), + ).resolves.toBe(`${code}\n`); +}); + +test(`根据 Markdown 文件名推断解析器`, async () => { + await expect( + format(`测试abc`, { + filepath: 'README.md', + plugins: [prettierPluginLintMd], + }), + ).resolves.toBe(`测试 abc\n`); +}); + describe('配置文件', () => { const configFile = '.config'; beforeEach(() => { @@ -62,11 +101,8 @@ describe('配置文件', () => { await expect( format(code, { parser: PARSER_NAME, - plugins: [ - prettierLintMd({ - configFile: configFile, - }), - ], + plugins: [prettierPluginLintMd], + configFile: configFile, }), ).resolves.toBe(`${code}\n`); }); @@ -75,12 +111,9 @@ describe('配置文件', () => { await expect( format(code, { parser: PARSER_NAME, - plugins: [ - prettierLintMd({ - configFile: configFile, - 'space-around-alphabet': true, - }), - ], + plugins: [prettierPluginLintMd], + configFile: configFile, + 'space-around-alphabet': true, }), ).resolves.toBe(`测试 abc\n`); }); diff --git a/packages/prettier-plugin-lint-md/__test__/rule.test.ts b/packages/prettier-plugin-lint-md/__test__/rule.test.ts new file mode 100644 index 0000000..1d8535e --- /dev/null +++ b/packages/prettier-plugin-lint-md/__test__/rule.test.ts @@ -0,0 +1,82 @@ +import { afterEach, expect, test } from 'vitest'; +import { format } from 'prettier'; +import { prettierLintMd, PARSER_NAME } from '../src/index'; +import fs from 'node:fs'; +import path from 'node:path'; + +const configPath = path.join(process.cwd(), '.test'); + +afterEach(() => { + fs.rmSync(configPath, { force: true }); +}); + +test(`no-space-in-inline-code`, async () => { + const md = '- right ` const a = 1 ` 你好'; + + await expect( + format(md, { + parser: PARSER_NAME, + plugins: [ + prettierLintMd({ + 'no-space-in-inline-code': true, + }), + ], + }), + ).resolves.toBe('- right `const a = 1` 你好\n'); +}); + +test(`no-full-width-number 可以关闭`, async () => { + await expect( + format('全角1数字', { + parser: PARSER_NAME, + plugins: [ + prettierLintMd({ + 'no-full-width-number': false, + }), + ], + }), + ).resolves.toBe('全角1数字\n'); +}); + +test(`no-half-width-punctuation`, async () => { + await expect( + format('中文,中文', { + parser: PARSER_NAME, + plugins: [prettierLintMd()], + }), + ).resolves.toBe('中文,中文\n'); +}); + +test(`no-half-width-punctuation 可以关闭`, async () => { + await expect( + format('中文,中文', { + parser: PARSER_NAME, + plugins: [ + prettierLintMd({ + 'no-half-width-punctuation': false, + }), + ], + }), + ).resolves.toBe('中文,中文\n'); +}); + +test(`no-space-in-inline-code 配置文件`, async () => { + fs.writeFileSync( + configPath, + JSON.stringify({ 'no-space-in-inline-code': true }), + 'utf-8', + ); + + const md = '- right ` const a = 1 ` 你好'; + + await expect( + format(md, { + parser: PARSER_NAME, + plugins: [ + prettierLintMd({ + configFile: configPath, + }), + ], + }), + ).resolves.toBe('- right `const a = 1` 你好\n'); +}); diff --git a/__test__/utils.test.ts b/packages/prettier-plugin-lint-md/__test__/utils.test.ts similarity index 57% rename from __test__/utils.test.ts rename to packages/prettier-plugin-lint-md/__test__/utils.test.ts index 056cafa..d92d13c 100644 --- a/__test__/utils.test.ts +++ b/packages/prettier-plugin-lint-md/__test__/utils.test.ts @@ -8,5 +8,8 @@ test(`readJson`, () => { test(`getRules`, () => { expect(getRules()).toHaveProperty('no-space-in-inline-code'); - expect(Object.keys(getRules())).toHaveLength(16); + expect(getRules()).toHaveProperty('no-full-width-number'); + expect(getRules()).toHaveProperty('no-half-width-punctuation'); + expect(getRules()).not.toHaveProperty('no-fullwidth-number'); + expect(Object.keys(getRules())).toHaveLength(17); }); diff --git a/packages/prettier-plugin-lint-md/package.json b/packages/prettier-plugin-lint-md/package.json new file mode 100644 index 0000000..6202e83 --- /dev/null +++ b/packages/prettier-plugin-lint-md/package.json @@ -0,0 +1,69 @@ +{ + "name": "prettier-plugin-lint-md", + "version": "1.0.2", + "description": "Prettier 插件,让 Markdown 符合中文排版规范。", + "contributors": [ + "yliu " + ], + "keywords": [ + "lint", + "markdown", + "lint-md", + "chinese", + "prettier" + ], + "author": "yliu", + "publishConfig": { + "access": "public", + "registry": "https://registry.npmjs.org/" + }, + "homepage": "https://lint-md.github.io/prettier-plugin/", + "bugs": { + "url": "https://github.com/lint-md/prettier-plugin/issues" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/lint-md/prettier-plugin.git", + "directory": "packages/prettier-plugin-lint-md" + }, + "license": "MIT", + "type": "module", + "engines": { + "node": ">=22" + }, + "main": "./dist/prettier-plugin-lint-md.cjs", + "module": "./dist/prettier-plugin-lint-md.js", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/prettier-plugin-lint-md.js", + "require": "./dist/prettier-plugin-lint-md.cjs", + "default": "./dist/prettier-plugin-lint-md.js" + } + }, + "files": [ + "dist" + ], + "devDependencies": { + "@types/node": "^22.20.1", + "prettier": "^3.9.6", + "typescript": "^6.0.3", + "vite": "^8.1.5", + "vite-plugin-dts": "^5.0.3", + "vitest": "^4.1.10" + }, + "scripts": { + "build": "vite build", + "build-watch": "vite build -w", + "prepack": "pnpm run build", + "test": "vitest run", + "typecheck": "tsc --noEmit" + }, + "dependencies": { + "@lint-md/core": "^2.1.6" + }, + "peerDependencies": { + "prettier": ">= 3" + } +} diff --git a/src/index.ts b/packages/prettier-plugin-lint-md/src/index.ts similarity index 50% rename from src/index.ts rename to packages/prettier-plugin-lint-md/src/index.ts index 00eb749..60bca37 100644 --- a/src/index.ts +++ b/packages/prettier-plugin-lint-md/src/index.ts @@ -1,27 +1,15 @@ import type { Plugin } from 'prettier'; import markdown from 'prettier/plugins/markdown.js'; import { lintMarkdown } from '@lint-md/core'; -import { getRules, readConfig } from './utils'; -import { LintOptions } from './types'; +import { getPluginOptions, getRules, readConfig } from './utils'; +import type { LintOptions } from './types'; export const PARSER_NAME = 'markdown'; -/** - * 如果不想传递prettier options,可以在函数内部传递参数,同样也是支持的 - * - * @param {Partial} [ruleOptions={}] - * @return {*} {Plugin} - */ export const prettierLintMd = ( ruleOptions: Partial = {}, ): Plugin => { return { - languages: [ - { - name: 'prettier-plugin-lint-md', - parsers: [PARSER_NAME], - }, - ], options: getRules(), parsers: { [PARSER_NAME]: { @@ -29,10 +17,12 @@ export const prettierLintMd = ( preprocess: (text, options) => { const lint = readConfig({ ...ruleOptions, - configFile: options.configFile || ruleOptions.configFile, + ...getPluginOptions(options), + }); + const result = lintMarkdown(text, lint, true, { + ruleErrorPolicy: 'strict', }); - const result = lintMarkdown(text, lint, true); - return result.fixedResult?.result || text; + return result.fixedResult.result; }, }, }, diff --git a/src/rules.ts b/packages/prettier-plugin-lint-md/src/rules.ts similarity index 83% rename from src/rules.ts rename to packages/prettier-plugin-lint-md/src/rules.ts index 076f078..86e58e2 100644 --- a/src/rules.ts +++ b/packages/prettier-plugin-lint-md/src/rules.ts @@ -26,7 +26,7 @@ export const NO_EMPTY_URL = { export const NO_EMPTY_LIST = { name: 'no-empty-list', - description: 'list 内容不能为空', + description: '列表内容不能为空', }; export const NO_EMPTY_CODE = { @@ -36,7 +36,7 @@ export const NO_EMPTY_CODE = { export const NO_EMPTY_INLINE_CODE = { name: 'no-empty-inline-code', - description: '行内代码块内容不能为空', + description: '行内代码内容不能为空', }; export const NO_EMPTY_BLOCKQUOTE = { @@ -51,14 +51,19 @@ export const NO_SPECIAL_CHARACTERS = { export const USE_STANDARD_ELLIPSIS = { name: 'use-standard-ellipsis', - description: '使用标准规范的省略号', + description: '使用标准省略号', }; -export const NO_FULLWIDTH_NUMBER = { - name: 'no-fullwidth-number', +export const NO_FULL_WIDTH_NUMBER = { + name: 'no-full-width-number', description: '不能用全角数字', }; +export const NO_HALF_WIDTH_PUNCTUATION = { + name: 'no-half-width-punctuation', + description: '中文语境下不能使用半角标点符号', +}; + export const NO_SPACE_IN_LINK = { name: 'no-space-in-link', description: '链接前后不能有空格', diff --git a/src/types.ts b/packages/prettier-plugin-lint-md/src/types.ts similarity index 90% rename from src/types.ts rename to packages/prettier-plugin-lint-md/src/types.ts index 210d4af..e200dee 100644 --- a/src/types.ts +++ b/packages/prettier-plugin-lint-md/src/types.ts @@ -94,7 +94,15 @@ export interface LintOptions { * @type {boolean} * @memberof LintOptions */ - 'no-fullwidth-number'?: boolean; + 'no-full-width-number'?: boolean; + + /** + * 中文语境下不能使用半角标点符号 + * + * @type {boolean} + * @memberof LintOptions + */ + 'no-half-width-punctuation'?: boolean; /** * 链接前后不能有空格 @@ -130,6 +138,7 @@ export interface LintOptions { } declare module 'prettier' { + // eslint-disable-next-line @typescript-eslint/no-empty-object-type interface RequiredOptions extends LintOptions {} } diff --git a/src/utils.ts b/packages/prettier-plugin-lint-md/src/utils.ts similarity index 62% rename from src/utils.ts rename to packages/prettier-plugin-lint-md/src/utils.ts index a53e326..dc986e0 100644 --- a/src/utils.ts +++ b/packages/prettier-plugin-lint-md/src/utils.ts @@ -1,8 +1,8 @@ import path from 'node:path'; import fs from 'node:fs'; import * as rules from './rules'; -import { LintOptions } from './types'; -import { SupportOptions } from 'prettier'; +import type { LintOptions } from './types'; +import type { SupportOptions } from 'prettier'; /** * 读取 JSON 文件 @@ -39,14 +39,14 @@ export const readConfig = (config: Partial = {}) => { ...rest, }; /* - * 对 lint进行转换 + * 对 lint 进行转换 * 如果是一个数字,那么表示规则的等级: * 0:忽略(off),不检查该规则 * 1:警告(warning),仅出现警告,程序正常退出,不会阻断 CI * 2:错误(error),出现错误,程序异常退出,会阻断 CI */ for (const [key, value] of Object.entries(lint)) { - if (typeof value == 'boolean') { + if (typeof value === 'boolean') { lint[key] = value ? 1 : 0; } } @@ -55,27 +55,35 @@ export const readConfig = (config: Partial = {}) => { export const getRules = () => { const obj: SupportOptions = {}; - /* - * ts 写法问题,目前只有 string - */ - for (const iterator of Object.values(rules)) { - if ('type' in iterator) { - switch (iterator.type) { - case 'string': - obj[iterator.name] = { + for (const rule of Object.values(rules)) { + obj[rule.name] = + 'type' in rule + ? { type: 'string', - description: iterator.description, + description: rule.description, + category: 'Global', + } + : { + type: 'boolean', + description: rule.description, category: 'Global', }; - break; - } - } else { - obj[iterator.name] = { - type: 'boolean', - description: iterator.description, - category: 'Global', - }; - } } return obj; }; + +export const getPluginOptions = ( + options: Record, +): Partial => { + const pluginOptions: Partial = {}; + + for (const rule of Object.values(rules)) { + const value = options[rule.name]; + const type = 'type' in rule ? 'string' : 'boolean'; + if (typeof value === type) { + Object.assign(pluginOptions, { [rule.name]: value }); + } + } + + return pluginOptions; +}; diff --git a/tsconfig.build.json b/packages/prettier-plugin-lint-md/tsconfig.build.json similarity index 100% rename from tsconfig.build.json rename to packages/prettier-plugin-lint-md/tsconfig.build.json diff --git a/tsconfig.json b/packages/prettier-plugin-lint-md/tsconfig.json similarity index 100% rename from tsconfig.json rename to packages/prettier-plugin-lint-md/tsconfig.json diff --git a/tsconfig.options.json b/packages/prettier-plugin-lint-md/tsconfig.options.json similarity index 100% rename from tsconfig.options.json rename to packages/prettier-plugin-lint-md/tsconfig.options.json diff --git a/vite.config.ts b/packages/prettier-plugin-lint-md/vite.config.ts similarity index 86% rename from vite.config.ts rename to packages/prettier-plugin-lint-md/vite.config.ts index c9a68b9..4d5313e 100644 --- a/vite.config.ts +++ b/packages/prettier-plugin-lint-md/vite.config.ts @@ -1,17 +1,17 @@ import { defineConfig } from 'vite'; import { dependencies } from './package.json'; -import { builtinModules } from 'module'; +import { builtinModules } from 'node:module'; import dts from 'vite-plugin-dts'; export default defineConfig({ plugins: [ dts({ - rollupTypes: true, + entryRoot: './src', tsconfigPath: './tsconfig.build.json', }), ], build: { - target: 'es2015', + target: 'node22', minify: true, sourcemap: true, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 227377b..c2bd5ac 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,55 +7,95 @@ settings: importers: .: - dependencies: - '@lint-md/core': - specifier: ^2.0.0 - version: 2.0.0 devDependencies: '@eslint/js': specifier: ^10.0.1 - version: 10.0.1(eslint@10.5.0) - '@types/node': - specifier: ^25.9.3 - version: 25.9.3 + version: 10.0.1(eslint@10.8.0) eslint: - specifier: ~10.5.0 - version: 10.5.0 + specifier: ~10.8.0 + version: 10.8.0 globals: - specifier: ^17.6.0 - version: 17.6.0 + specifier: ^17.8.0 + version: 17.8.0 + lint-staged: + specifier: ^17.2.0 + version: 17.2.0 prettier: - specifier: ^3.8.4 - version: 3.8.4 - tsx: - specifier: ^4.22.4 - version: 4.22.4 + specifier: ^3.9.6 + version: 3.9.6 + simple-git-hooks: + specifier: ^2.13.1 + version: 2.13.1 + typescript-eslint: + specifier: ^8.65.0 + version: 8.65.0(eslint@10.8.0)(typescript@6.0.3) + + docs: + dependencies: + '@rspress/core': + specifier: ^2.0.18 + version: 2.0.18(@rspack/core@2.1.5(@swc/helpers@0.5.23))(@types/mdast@4.0.4)(@types/react@19.2.17)(micromark-util-types@2.0.2)(micromark@4.0.2) + devDependencies: + '@types/node': + specifier: ^22.20.1 + version: 22.20.1 + '@types/react': + specifier: ^19.2.17 + version: 19.2.17 + '@types/react-dom': + specifier: ^19.2.3 + version: 19.2.3(@types/react@19.2.17) + react: + specifier: ^19.2.8 + version: 19.2.8 + react-dom: + specifier: ^19.2.8 + version: 19.2.8(react@19.2.8) + typescript: + specifier: ^6.0.3 + version: 6.0.3 + + packages/prettier-plugin-lint-md: + dependencies: + '@lint-md/core': + specifier: ^2.1.6 + version: 2.1.6 + devDependencies: + '@types/node': + specifier: ^22.20.1 + version: 22.20.1 + prettier: + specifier: ^3.9.6 + version: 3.9.6 typescript: specifier: ^6.0.3 version: 6.0.3 - typescript-eslint: - specifier: ^8.61.1 - version: 8.61.1(eslint@10.5.0)(typescript@6.0.3) vite: - specifier: ^8.0.16 - version: 8.0.16(@types/node@25.9.3)(esbuild@0.28.1)(tsx@4.22.4) + specifier: ^8.1.5 + version: 8.1.5(@types/node@22.20.1)(esbuild@0.28.1)(tsx@4.23.1)(yaml@2.9.0) vite-plugin-dts: - specifier: ^5.0.2 - version: 5.0.2(esbuild@0.28.1)(rolldown@1.0.3)(typescript@6.0.3)(vite@8.0.16(@types/node@25.9.3)(esbuild@0.28.1)(tsx@4.22.4)) + specifier: ^5.0.3 + version: 5.0.3(esbuild@0.28.1)(rolldown@1.1.5)(typescript@6.0.3)(vite@8.1.5(@types/node@22.20.1)(esbuild@0.28.1)(tsx@4.23.1)(yaml@2.9.0)) vitest: - specifier: ^4.1.9 - version: 4.1.9(@types/node@25.9.3)(vite@8.0.16(@types/node@25.9.3)(esbuild@0.28.1)(tsx@4.22.4)) + specifier: ^4.1.10 + version: 4.1.10(@types/node@22.20.1)(vite@8.1.5(@types/node@22.20.1)(esbuild@0.28.1)(tsx@4.23.1)(yaml@2.9.0)) packages: - '@emnapi/core@1.10.0': - resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + '@emnapi/core@1.11.1': + resolution: {integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==} + + '@emnapi/core@1.11.2': + resolution: {integrity: sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA==} - '@emnapi/runtime@1.10.0': - resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + '@emnapi/runtime@1.11.1': + resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==} - '@emnapi/wasi-threads@1.2.1': - resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + '@emnapi/runtime@1.11.2': + resolution: {integrity: sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==} + + '@emnapi/wasi-threads@1.2.2': + resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} '@esbuild/aix-ppc64@0.28.1': resolution: {integrity: sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==} @@ -227,8 +267,8 @@ packages: resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/config-helpers@0.6.0': - resolution: {integrity: sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==} + '@eslint/config-helpers@0.7.0': + resolution: {integrity: sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@eslint/core@1.2.1': @@ -288,112 +328,123 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - '@lint-md/core@2.0.0': - resolution: {integrity: sha512-DbjU4NhmddVM2GaeUz+f+urFLt0IoTomwJglrRGuUKBCr4udpVe/rnh26R02zQKXm/+ocQ5WfU0iLCCWBsXoYA==} + '@lint-md/core@2.1.6': + resolution: {integrity: sha512-i53bb4F75wkMgiexBH3aT088qCAzKQ0fPtUn1dYTt30qvROSmasgtqw1+wc2YemdZegyqpTmMhK/Kp0XKhxu1g==} + engines: {node: '>=20'} + + '@lint-md/parser@0.2.0': + resolution: {integrity: sha512-goi4GlmfgCfpk26u5MMLwc8qi1StdXc7/VzC2zLsME4d3hprvXAJXYkRCc4b6b9QSGViM3gBb4CmSRqyPWjW9w==} + engines: {node: '>=20'} - '@lint-md/parser@0.0.14': - resolution: {integrity: sha512-kFFq6TowN2MBe+EFctnn6VluPWHV/9i/mHGQG/d5qGcR7EnA7JSURaxw9kQDHG11bwUK+pHOoXjSOp/6VzM/1w==} + '@mdx-js/mdx@3.1.1': + resolution: {integrity: sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==} + + '@mdx-js/react@3.1.1': + resolution: {integrity: sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==} + peerDependencies: + '@types/react': '>=16' + react: '>=16' - '@napi-rs/wasm-runtime@1.1.5': - resolution: {integrity: sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q==} + '@napi-rs/wasm-runtime@1.1.6': + resolution: {integrity: sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==} peerDependencies: '@emnapi/core': ^1.7.1 '@emnapi/runtime': ^1.7.1 - '@oxc-project/types@0.133.0': - resolution: {integrity: sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==} + '@oxc-project/types@0.139.0': + resolution: {integrity: sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==} - '@rolldown/binding-android-arm64@1.0.3': - resolution: {integrity: sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==} + '@rolldown/binding-android-arm64@1.1.5': + resolution: {integrity: sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.0.3': - resolution: {integrity: sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA==} + '@rolldown/binding-darwin-arm64@1.1.5': + resolution: {integrity: sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.3': - resolution: {integrity: sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg==} + '@rolldown/binding-darwin-x64@1.1.5': + resolution: {integrity: sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.0.3': - resolution: {integrity: sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g==} + '@rolldown/binding-freebsd-x64@1.1.5': + resolution: {integrity: sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.0.3': - resolution: {integrity: sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw==} + '@rolldown/binding-linux-arm-gnueabihf@1.1.5': + resolution: {integrity: sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.3': - resolution: {integrity: sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw==} + '@rolldown/binding-linux-arm64-gnu@1.1.5': + resolution: {integrity: sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-musl@1.0.3': - resolution: {integrity: sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==} + '@rolldown/binding-linux-arm64-musl@1.1.5': + resolution: {integrity: sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@rolldown/binding-linux-ppc64-gnu@1.0.3': - resolution: {integrity: sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==} + '@rolldown/binding-linux-ppc64-gnu@1.1.5': + resolution: {integrity: sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.0.3': - resolution: {integrity: sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==} + '@rolldown/binding-linux-s390x-gnu@1.1.5': + resolution: {integrity: sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.0.3': - resolution: {integrity: sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==} + '@rolldown/binding-linux-x64-gnu@1.1.5': + resolution: {integrity: sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-musl@1.0.3': - resolution: {integrity: sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==} + '@rolldown/binding-linux-x64-musl@1.1.5': + resolution: {integrity: sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@rolldown/binding-openharmony-arm64@1.0.3': - resolution: {integrity: sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==} + '@rolldown/binding-openharmony-arm64@1.1.5': + resolution: {integrity: sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-wasm32-wasi@1.0.3': - resolution: {integrity: sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg==} + '@rolldown/binding-wasm32-wasi@1.1.5': + resolution: {integrity: sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [wasm32] - '@rolldown/binding-win32-arm64-msvc@1.0.3': - resolution: {integrity: sha512-gEdFFEN70A/jxb2svrWsN3aDL7OUtmvlOy+6fa2jxG8K0wQ1ZbdeLGnidov6Yu5/733dI5ySfzFlQ/cb0bSz1g==} + '@rolldown/binding-win32-arm64-msvc@1.1.5': + resolution: {integrity: sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.3': - resolution: {integrity: sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA==} + '@rolldown/binding-win32-x64-msvc@1.1.5': + resolution: {integrity: sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -410,11 +461,164 @@ packages: rollup: optional: true + '@rsbuild/core@2.1.8': + resolution: {integrity: sha512-Y70LMcCZspVoQ7Oip1W2Agu5wVhWZ2x3cYl4s9GLQG4VYphBud53DY/jkrqkyQF8ASYZDDDrW2KWNFj0kNLLuA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + core-js: '>= 3.0.0' + peerDependenciesMeta: + core-js: + optional: true + + '@rsbuild/plugin-react@2.1.0': + resolution: {integrity: sha512-RQTIAWB/CwPjoWt9iAl+8HixeQVgZ7kEIBrWPCixfITyHdiD84h0YpUTpEUuz6kGHw1KXT9mHZ3Rwy6WG7aRDA==} + peerDependencies: + '@rsbuild/core': ^2.0.0 + peerDependenciesMeta: + '@rsbuild/core': + optional: true + + '@rspack/binding-darwin-arm64@2.1.5': + resolution: {integrity: sha512-XLAN6YSU36qkciJtV9DY9z57pdHOjKy/f1HyoqpZenRg8p46jnXPziV45lfrTZpG+FF6g/jtTUc4dKbeyoWqPw==} + cpu: [arm64] + os: [darwin] + + '@rspack/binding-darwin-x64@2.1.5': + resolution: {integrity: sha512-KLW7PV86jyCOyqJSqrkZdvYUWYCFX/Q4LsGmVc8tyDA8jBYLMHJDewC/lNf9ot3rU2SoLDZKhDUh7q7dX0FRmg==} + cpu: [x64] + os: [darwin] + + '@rspack/binding-linux-arm64-gnu@2.1.5': + resolution: {integrity: sha512-KOooAC8L+Ljx5sY7ZuMeaXCQ310FNWaPWXcYQJpFPApF3qyLeSfuOftUGwxcxeo5U0mS5OY3zxp7/5CaHWKYjg==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rspack/binding-linux-arm64-musl@2.1.5': + resolution: {integrity: sha512-0GFc07gT71+uRbHtejDecBfSL0fs7dQAwCtXYieXboACauL7UvS3Hwr6v8A91aGtAcvLotnCaIa3CWWYwtYlYQ==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rspack/binding-linux-riscv64-gnu@2.1.5': + resolution: {integrity: sha512-isQQDp3fBzPSZpLVFzPqVXIVA4I9b9mKs58TfUgOzDP/1g1582YSV3iFopgFogvEliihXDuuXvM6aAkP+w8Z+Q==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rspack/binding-linux-riscv64-musl@2.1.5': + resolution: {integrity: sha512-/SP6VknY4kH60BYplI2FDNAJCo4U4DUszLxhKsgVlgA5ImgHC8Ew2AsKgidk7ceiYV9OcKzYuWYe9tVpysBYVA==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@rspack/binding-linux-x64-gnu@2.1.5': + resolution: {integrity: sha512-/GJmS+buA4pilT10gs5mfAhAZxSHXpDD8veZ3QpYvNUuoU9gvempAq9TgjbyNN/vc5pf76GdXPXKFMiehudYSA==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rspack/binding-linux-x64-musl@2.1.5': + resolution: {integrity: sha512-iwS3t75nZ2TnUjB05KtvpvjpdkOy/nLxbaOnwjbdnNZZXpUaMadLbllGAWayHPGCMsL2yKBEhVEESZpR7tK3SA==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rspack/binding-wasm32-wasi@2.1.5': + resolution: {integrity: sha512-jOhW69t1H/jcRaSMB5U8jVzWP18j0YQIlo0nT8W+KvNVScJeyOze4FFc+5RIS7VmuT8/jid7hUyydZOfm6UgqA==} + cpu: [wasm32] + + '@rspack/binding-win32-arm64-msvc@2.1.5': + resolution: {integrity: sha512-OLfMXmtFBcrWr9BRGKXJYrWgYR0JSaoAWr3EVFDjKGi/YR5aUwQSGc3AJPBph9g0YsdSqRuUhtQGtCk84DeeEA==} + cpu: [arm64] + os: [win32] + + '@rspack/binding-win32-ia32-msvc@2.1.5': + resolution: {integrity: sha512-p4OSmnj21+AY8vpIADveLEBXfXJRXonOTYim2VLVWV4TbXfhYNMLiX3qESHCdNnn6lVJM0q6zxxzEUfTyAKydw==} + cpu: [ia32] + os: [win32] + + '@rspack/binding-win32-x64-msvc@2.1.5': + resolution: {integrity: sha512-YCkLLDGMkHsw5CpcsFtFhzCu+JZEsNrcH9O1GpWMkyxR2ku2Fq1i2wEHYSm26HyW+PJ3+Fv347MPWMFZIz9q2g==} + cpu: [x64] + os: [win32] + + '@rspack/binding@2.1.5': + resolution: {integrity: sha512-lF3ZLeeyV0AN3BL0m2jAmNZD5pP9IHsQ8gUXN7mo0g4xsW6nf6hsN7o9CnEHECz5uUZb+EoWsuWzAAmnA9Ip8Q==} + + '@rspack/core@2.1.5': + resolution: {integrity: sha512-YHjL7xVXycAWsjJtF39cRZ2u+ddiNFxY+FcNgEBe6Y8OaLeUfMfjba3gK+B1Oj32UcKD6BmXGsPfu9p+OII/Yw==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + '@module-federation/runtime-tools': ^0.24.1 || ^2.0.0 + '@swc/helpers': ^0.5.23 + peerDependenciesMeta: + '@module-federation/runtime-tools': + optional: true + '@swc/helpers': + optional: true + + '@rspack/plugin-react-refresh@2.0.2': + resolution: {integrity: sha512-dGNZiCxQxgAUI9sah7gd8u+O7OJZRCmqtEJNDOd8xW5RqcieC86F7p5qcShyw6onH5pKf57evpr2VjGbaFGkZg==} + peerDependencies: + '@rspack/core': ^2.0.0 + react-refresh: '>=0.10.0 <1.0.0' + peerDependenciesMeta: + '@rspack/core': + optional: true + + '@rspress/core@2.0.18': + resolution: {integrity: sha512-DBpsr/6XAItQkZPL5FSjthLGuzdG9ks/7EOxkqaaXp93uAT54LO0PD5Dkoy6ydup1PnvkpHyiHpUyDcnHHTVhg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + '@rspress/shared@2.0.18': + resolution: {integrity: sha512-GJswqJQCPSxvBt5r+gJzz8Em8EEK/sOmCQjTpemTvldvxr1Lva85BGVnSQZOgofnM0nrjt18kn4mmnuuSstbpA==} + + '@shikijs/core@4.3.1': + resolution: {integrity: sha512-ANMDxuaPsNMdDC1m4vfvhlDmJweMwkE5XitTwrq2rWHx5jM+dlm4MmHt2PP6t0uejfR77SuhrhJ0zEijIF/uhA==} + engines: {node: '>=20'} + + '@shikijs/engine-javascript@4.3.1': + resolution: {integrity: sha512-JBItcnPuYq7jVJdZo/vMj94r+szT7XEjHFX+mvFDGSEIbVAXAGyHAHzhbWzpGOwYidCZrErJLLgn2PVeiokHnQ==} + engines: {node: '>=20'} + + '@shikijs/engine-oniguruma@4.3.1': + resolution: {integrity: sha512-OXyNMzg0pews+msMj4cHeqT4xiYKKvbnn6VbdAXxfoFl3SSx4fJTc8FadECuc5/H9p3BzhNAoAUXKwAu9rWYhg==} + engines: {node: '>=20'} + + '@shikijs/langs@4.3.1': + resolution: {integrity: sha512-m0l9nsDqgBHvbZbk7A0/kXz/impK3uB/c6rAn6Gpg/uPtdZRQ+alsN/17MU5thb68XTj/4DxkZAotrM0GGSpDQ==} + engines: {node: '>=20'} + + '@shikijs/primitive@4.3.1': + resolution: {integrity: sha512-CXQRQOYy1leqQ8ceTeJdmXv/bsUY++6QyLpXJ94LZAAYj5X2SKRdc5ipguv4NPyGVKItB2PPwUpRNe0Sjh5S1A==} + engines: {node: '>=20'} + + '@shikijs/rehype@4.3.1': + resolution: {integrity: sha512-oshrlfUF3VPUJfnp5K1lLwsS/SRBKrIxONpdWebSKZXdBE3UsZnxgqpvRUA8UsofS7vmjFOCAHIT71ECbmOxTw==} + engines: {node: '>=20'} + + '@shikijs/themes@4.3.1': + resolution: {integrity: sha512-dgpoJ4WqNi2yTmizQHBJ5zcX6j2lE6icN/0yt4l1kkf16jrY/pwPLoTb1ETsWMz0OBLf9ZNvwmxft+cH+N9qSA==} + engines: {node: '>=20'} + + '@shikijs/types@4.3.1': + resolution: {integrity: sha512-CHFxE0jztBIZRHH6gxXE7DXUCFXjReEGxZ/j0rfSLGKZuwp2xBYycEP14875DSa9KLL/6700oxIq6oO6ef9K2g==} + engines: {node: '>=20'} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} - '@tybys/wasm-util@0.10.2': - resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} + '@swc/helpers@0.5.23': + resolution: {integrity: sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==} + + '@tybys/wasm-util@0.10.3': + resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} @@ -428,91 +632,119 @@ packages: '@types/esrecurse@4.3.1': resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} + '@types/estree-jsx@1.0.5': + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + '@types/estree@1.0.9': resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} + '@types/hast@3.0.5': + resolution: {integrity: sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==} + '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/katex@0.16.8': - resolution: {integrity: sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg==} - '@types/mdast@3.0.15': resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} + '@types/mdast@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/mdx@2.0.14': + resolution: {integrity: sha512-T48PeuJtvLosNTPVhfnIp3i/n3a4g4Bad7YCq5k64D4u7NwDrAotikQ+5+sjtUvBmxCMlbo3dVL+C2dP0rWHzg==} + '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} - '@types/node@25.9.3': - resolution: {integrity: sha512-603BddQMv3pUcr4U2dhujk83N2tTDVr/34wII2B6bJy6g+8WD6yUb11jszNs0gdi4PesVWl7ABt8nYMVpnLUcg==} + '@types/node@22.20.1': + resolution: {integrity: sha512-EANqOCF9QFyra+4pfxUcX9STKJpCLjMbObVzljIJomAWSnuSIEAvyzEU53GaajbXJEgdh0iEcPL+DGvpUd4k1Q==} + + '@types/react-dom@19.2.3': + resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} + peerDependencies: + '@types/react': ^19.2.0 + + '@types/react@19.2.17': + resolution: {integrity: sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==} '@types/unist@2.0.11': resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} - '@typescript-eslint/eslint-plugin@8.61.1': - resolution: {integrity: sha512-ZPlVl3PB3et/59Ne0fv/sci6ZXz4T4Hp4nTJ56i/Y0gR89ARb+KphojTq6j+56E5PIezmOIOOWyY+aWQFd+IkQ==} + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@typescript-eslint/eslint-plugin@8.65.0': + resolution: {integrity: sha512-IEgob78X12rHpUmtcwFsXhZdVGJtwTVP8FiCLZkR6GlYVrl2PcuB+KhCE5BlVC/eQpQnu8WXRtkHZuPar+gCRA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.61.1 + '@typescript-eslint/parser': ^8.65.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.61.1': - resolution: {integrity: sha512-PJ5vePq5/ognBbrIcoC5+SHO5dfpeLPzP9FpLkzWrguoYQEeeSjlJpVwOpo1JRSTEi7dRcwNy4h4dzV70PqHcg==} + '@typescript-eslint/parser@8.65.0': + resolution: {integrity: sha512-CZ4nMxWwgu1HEEFNkeaCptra9QCtkmKdgf3sWh1rl1trIhmxLilgTV4cwcbQ4wemnT4sWQN8CaKOmdYx+g2gMA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.61.1': - resolution: {integrity: sha512-PrC4JYGmR241lYnfhmKGTXkFqv8+ymbTFgSAY0fVXpY82/QkMw5TZPl+vGzuDDU2QYJk9fIDOBTntF+yDv9LEA==} + '@typescript-eslint/project-service@8.65.0': + resolution: {integrity: sha512-SxnPhbTsGahizDgbu7oqFH/xVtzIqMd/s+WtnSxNxJZJpLbdT5IPdzg8EZxO3+PoKahXmwJLeNQOpKJb3/bi7Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/scope-manager@8.61.1': - resolution: {integrity: sha512-L2bdIeoQS8FlKAvONAr20w6OcLXeB+qiDKbAooS9A0Ben+iSIkBef0FxqwKWYqt5sa0i4KJtxVyVmhMylKzF5w==} + '@typescript-eslint/scope-manager@8.65.0': + resolution: {integrity: sha512-Esbl8OSYiVxBokYgWPf7VVWg/BE798wXhimnn9ML9Pt5qoDf8bfQlgjlKXR/k98+AcNzlLKYrpCcrcuZ9DZLgg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.61.1': - resolution: {integrity: sha512-UN/H4di+OO7EWx2ovME+8t31YO+KVnK0RRKEHR3kOt21/Ay8BOq3M1OMvWs5vNiqcFCYGYoxK3MXPZzmMUE+yg==} + '@typescript-eslint/tsconfig-utils@8.65.0': + resolution: {integrity: sha512-j6GzGqCiRdA7Qhur2VVmKZAkBLfnHFQfx4TaJGL9RMveZqCo48jSHHO0DTgizEnGhtWnqmbtCUSrqSkdiY/0Hg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.61.1': - resolution: {integrity: sha512-GYRicKmVK0C4fsKgaACaknOUAq9Oa2kwsjnpFhFcS/5p4Ht5IP9OVLbgIgcK4SRk92nVHFluurg1lumD9dBcLw==} + '@typescript-eslint/type-utils@8.65.0': + resolution: {integrity: sha512-YjaZ7PRI5qY7ax2L3PbvX0rRyGtipAReCWs0mhhDBHjH/vl0g0BonaGXrKdKpMbIIsMIwDgbk/xzkBTyAltS5g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/types@8.61.1': - resolution: {integrity: sha512-G+CRlPqLv7Bz1IZVs03x5K59F1veqL0EJUROAdGhKsEq8qOiRiZbI+HUojPq5l0fEGOKModD9br6lObhB8zkoA==} + '@typescript-eslint/types@8.65.0': + resolution: {integrity: sha512-JSSwWNy+H0E/01jJEM+hrX6N0OFDzFzeIhHFSAS01tlVaevpG8cFyYRPhS5yjGOvBUx3sqQHVMjCL1CAZZMxBg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.61.1': - resolution: {integrity: sha512-u+oQD3BqYWPc8YV9Zab4vaJElJuwOLPRc10Jm1o/qS+6Qwen14HCWwx0Seo4LnSn2wxea2Ik8DxPt2/FHmuhrg==} + '@typescript-eslint/typescript-estree@8.65.0': + resolution: {integrity: sha512-JboAE2swaYt4tb1fHhHTABE2K+OLy09XfcTbhnk4Pw96f9dd2e9iYsJ28gBggHlo5z5x1rkyWvcPoTuNTd4oGg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.61.1': - resolution: {integrity: sha512-1+P/3Dj6jvtybE1q0HQ6yBt/gq+oKJyLdEv4HdnqasaEXRSYCAsD59mXEVQnM/ULNdQxbX77tdG4jPRjIS6knA==} + '@typescript-eslint/utils@8.65.0': + resolution: {integrity: sha512-gXiwIHsYreboxeJucHKPvgwl7dXt50mF8s1/c00cP/WoVTyWKFdtfhRWwZiXYFU5H2O8vVoSLNrexFZjYS/SGA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/visitor-keys@8.61.1': - resolution: {integrity: sha512-6fJ9MHWtK14C1DSkiMlHUSOmrVebL7150xZJBlJiL62jjhIA4JmOq6flwBgDxIdBKKdoiZRel+dfPD5MLfny3w==} + '@typescript-eslint/visitor-keys@8.65.0': + resolution: {integrity: sha512-8C71BQkGjiMmXtop7pHVJu1l2NNShFdkCyD6a2ezzs5vU/L3LRtb69EtcteFwz0mYMPzIgOw0n6OV4VBUWZd7A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@vitest/expect@4.1.9': - resolution: {integrity: sha512-vl/rYsUKcBr3SnQn166+XR5ZQcgMx3DQhFWdfli/cWpLnLUmbxZvyrJZotLFUryib+LtArYMSTJ5RbQ57ZqrlA==} + '@ungap/structured-clone@1.3.3': + resolution: {integrity: sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==} + + '@unhead/react@2.1.16': + resolution: {integrity: sha512-FhKVVHAsHbiD24yNAklQIAbjGmcVLTJjKFx1YEhOzGmiZaH2q6CzbwxboJYK6oasepio8Qap9UqHhudJ98wTbA==} + peerDependencies: + react: '>=18.3.1' + + '@vitest/expect@4.1.10': + resolution: {integrity: sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==} - '@vitest/mocker@4.1.9': - resolution: {integrity: sha512-EVkXzBjrPGM+cK8/ANWgBrkUCfJfb38/EfTSO8h7pWvKkyPkpWxvR7BkD2MyItMF62C97zAEoqdpUixwR/e+Rw==} + '@vitest/mocker@4.1.10': + resolution: {integrity: sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow==} peerDependencies: msw: ^2.4.9 vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -522,20 +754,20 @@ packages: vite: optional: true - '@vitest/pretty-format@4.1.9': - resolution: {integrity: sha512-s0iufns3iIFitdgm+YR7g1whCAaGtXz459VS9/PqyKDEEFgYIhsHOQmXgIgDuYCt7DeQmiZT0Qe2OA2p4ZPu5A==} + '@vitest/pretty-format@4.1.10': + resolution: {integrity: sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q==} - '@vitest/runner@4.1.9': - resolution: {integrity: sha512-KXLMDtc7oe70+3mJfGrPUWPesswH+3sTxAMAMl8DG7I8IUQT4XW718dY5ID3vPUcmlu27CcKfY4P3h3I29SLJg==} + '@vitest/runner@4.1.10': + resolution: {integrity: sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg==} - '@vitest/snapshot@4.1.9': - resolution: {integrity: sha512-Jc7RKGNBo8Z28WYIm0Niej4xdSPByRf6mU58VpHQkd6Zh05rlnA+twjbK5HyeIGHxrzsc3mJgS43uM0CZKzaIA==} + '@vitest/snapshot@4.1.10': + resolution: {integrity: sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw==} - '@vitest/spy@4.1.9': - resolution: {integrity: sha512-fHpsS6mIi+PiEW+vcRVOMkX1oSaPKne3VOclSFICPcGOmfKgXPU5iAah+wcNcj2xPrCCmfq99IDGf+EojhhvhA==} + '@vitest/spy@4.1.10': + resolution: {integrity: sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==} - '@vitest/utils@4.1.9': - resolution: {integrity: sha512-A51o8ymO5PpqlWNnBP9ZHPXDIpuMtTLlGSjN7la4US+LJzoUMyhwjA5QXlm39JexgwHKW4Xjs8Z2d3dLCXOeuA==} + '@vitest/utils@4.1.10': + resolution: {integrity: sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==} '@volar/language-core@2.4.28': resolution: {integrity: sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==} @@ -563,6 +795,10 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} + astring@1.9.0: + resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==} + hasBin: true + bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} @@ -570,9 +806,12 @@ packages: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} - brace-expansion@5.0.6: - resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} - engines: {node: 18 || 20 || >=22} + body-scroll-lock@4.0.0-beta.0: + resolution: {integrity: sha512-a7tP5+0Mw3YlUJcGAKUqIBkYYGlYxk2fnCasq/FUph1hadxlTRjF+gAcZksxANnaMnALjxEddmSi/H3OR8ugcQ==} + + brace-expansion@5.0.8: + resolution: {integrity: sha512-JZyDyq3D4AUifKTPOB7DELf6XsB3WdPuNxCtob1vFXPsSXhdAiHBWJ/tJ8HAc9aH84BK+5JFZLNkJKx3G9kzQg==} + engines: {node: 20 || >=22} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -593,13 +832,22 @@ packages: character-reference-invalid@2.0.1: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} - commander@8.3.0: - resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} - engines: {node: '>= 12'} + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + collapse-white-space@2.1.0: + resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} compare-versions@6.1.1: resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} + compute-scroll-into-view@3.1.1: + resolution: {integrity: sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==} + confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} @@ -609,10 +857,20 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + cookie@1.1.1: + resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} + engines: {node: '>=18'} + + copy-to-clipboard@3.3.3: + resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -636,13 +894,22 @@ packages: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} - diff@5.2.2: - resolution: {integrity: sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==} - engines: {node: '>=0.3.1'} + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} es-module-lexer@2.1.0: resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==} + esast-util-from-estree@2.0.0: + resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==} + + esast-util-from-js@2.0.1: + resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==} + esbuild@0.28.1: resolution: {integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==} engines: {node: '>=18'} @@ -668,8 +935,8 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.5.0: - resolution: {integrity: sha512-1y+7C+vi12bUK1IpZeaV3gsH9fHLBmPvYmPx42pvT/E9yG0IC8g3PUZZgp0+JLJl7ZDK0flc2gc+Aw9dpCvIsQ==} + eslint@10.8.0: + resolution: {integrity: sha512-nuKKvN+oIBO0koN7Tm7dlkmnkc21mtt0QJLwAKzjLq14y6lRTdVG36MZHJ8eQHwdJMwZbQNMlPOYedMq/oVJvQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: @@ -694,6 +961,24 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} + estree-util-attach-comments@3.0.0: + resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} + + estree-util-build-jsx@3.0.1: + resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==} + + estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + + estree-util-scope@1.0.0: + resolution: {integrity: sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==} + + estree-util-to-js@2.0.0: + resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} + + estree-util-visit@2.0.0: + resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} + estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} @@ -723,9 +1008,6 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fault@2.0.1: - resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} - fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -750,23 +1032,68 @@ packages: flatted@3.4.2: resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} - format@0.2.2: - resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} - engines: {node: '>=0.4.x'} + flexsearch@0.8.212: + resolution: {integrity: sha512-wSyJr1GUWoOOIISRu+X2IXiOcVfg9qqBRyCPRUdLMIGJqPzMo+jMRlvE83t14v1j0dRMEaBbER/adQjp6Du2pw==} fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] + get-east-asian-width@1.6.0: + resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==} + engines: {node: '>=18'} + glob-parent@6.0.2: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - globals@17.6.0: - resolution: {integrity: sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==} + globals@17.8.0: + resolution: {integrity: sha512-Zz/LMDZScFmkakeL2cTHzf+PbWKdpU3uclqkZT7TjDG58j5WPt0PpA+n9uPI24fZtlw07q0OtEi84K+umsRzqQ==} engines: {node: '>=18'} + hast-util-from-parse5@8.0.3: + resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==} + + hast-util-heading-rank@3.0.0: + resolution: {integrity: sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==} + + hast-util-is-element@3.0.0: + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + + hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + + hast-util-raw@9.1.0: + resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==} + + hast-util-to-estree@3.1.3: + resolution: {integrity: sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==} + + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + + hast-util-to-jsx-runtime@2.3.6: + resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==} + + hast-util-to-parse5@8.0.1: + resolution: {integrity: sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==} + + hast-util-to-string@3.0.1: + resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + hastscript@9.0.1: + resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} + + hookable@6.1.1: + resolution: {integrity: sha512-U9LYDy1CwhMCnprUfeAZWZGByVbhd54hwepegYTK7Pi5NvqEj63ifz5z+xukznehT7i6NIZRu89Ay1AZmRsLEQ==} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -779,16 +1106,19 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} + inline-style-parser@0.2.7: + resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} + + is-absolute-url@4.0.1: + resolution: {integrity: sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-alphabetical@2.0.1: resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} is-alphanumerical@2.0.1: resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} - is-buffer@2.0.5: - resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} - engines: {node: '>=4'} - is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} @@ -819,17 +1149,9 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - katex@0.16.47: - resolution: {integrity: sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg==} - hasBin: true - keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} - kolorist@1.8.0: resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} @@ -911,6 +1233,11 @@ packages: resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} engines: {node: '>= 12.0.0'} + lint-staged@17.2.0: + resolution: {integrity: sha512-FchGnFe4i4B1C/a35SPU9bNGPEHSC1+1iV0plLjzBmKVe9klZrlRfSgK6Cw4VeHyqOXbJUXP0vON61uRftNQ0A==} + engines: {node: '>=22.22.1'} + hasBin: true + local-pkg@1.2.1: resolution: {integrity: sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==} engines: {node: '>=14'} @@ -919,152 +1246,221 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} - lodash@4.18.1: - resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} - longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + markdown-extensions@2.0.0: + resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} + engines: {node: '>=16'} + markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} - mdast-util-directive@2.2.4: - resolution: {integrity: sha512-sK3ojFP+jpj1n7Zo5ZKvoxP1MvLyzVG63+gm40Z/qI00avzdPCYxt7RBMgofwAva9gBjbDBWVRB/i+UD+fUCzQ==} + mdast-util-find-and-replace@3.0.2: + resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} + + mdast-util-from-markdown@2.0.3: + resolution: {integrity: sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==} + + mdast-util-gfm-autolink-literal@2.0.1: + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} + + mdast-util-gfm-footnote@2.1.0: + resolution: {integrity: sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.1.0: + resolution: {integrity: sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==} + + mdast-util-mdx-expression@2.0.1: + resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} + + mdast-util-mdx-jsx@3.2.0: + resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==} + + mdast-util-mdx@3.0.0: + resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} + + mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} - mdast-util-find-and-replace@2.2.2: - resolution: {integrity: sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==} + mdast-util-to-hast@13.2.1: + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} - mdast-util-from-markdown@1.3.1: - resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} + mdast-util-to-markdown-cjk-friendly-gfm-strikethrough@1.0.0: + resolution: {integrity: sha512-1ePVfB4P/vz3xSsm6H3D32r6VYGErxclnuLLFK02/2ReF+UdEKm7caulK6Vm0LBIp5gPRtB2Z1OYDznCkX3k2w==} + engines: {node: '>=18'} + peerDependencies: + '@types/mdast': '*' + peerDependenciesMeta: + '@types/mdast': + optional: true - mdast-util-frontmatter@1.0.1: - resolution: {integrity: sha512-JjA2OjxRqAa8wEG8hloD0uTU0kdn8kbtOWpPP94NBkfAlbxn4S8gCGf/9DwFtEeGPXrDcNXdiDjVaRdUFqYokw==} + mdast-util-to-markdown-cjk-friendly@1.0.0: + resolution: {integrity: sha512-BoaAm8mlJ+LAYz0Qs532Y3ciTuQYgBUPZcSFbvC/ZKmEMAKgulw84YvQK1gI34t/vL2euSfuaWlqczkTBgamkw==} + engines: {node: '>=18'} + peerDependencies: + '@types/mdast': '*' + peerDependenciesMeta: + '@types/mdast': + optional: true - mdast-util-gfm-autolink-literal@1.0.3: - resolution: {integrity: sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==} + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} - mdast-util-gfm-footnote@1.0.2: - resolution: {integrity: sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==} + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} - mdast-util-gfm-strikethrough@1.0.3: - resolution: {integrity: sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==} + medium-zoom@1.1.0: + resolution: {integrity: sha512-ewyDsp7k4InCUp3jRmwHBRFGyjBimKps/AJLjRSox+2q/2H4p/PNpQf+pwONWlJiOudkBXtbdmVbFjqyybfTmQ==} - mdast-util-gfm-table@1.0.7: - resolution: {integrity: sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==} + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} - mdast-util-gfm-task-list-item@1.0.2: - resolution: {integrity: sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==} + micromark-extension-cjk-friendly-gfm-strikethrough@2.0.1: + resolution: {integrity: sha512-wVC0zwjJNqQeX+bb07YTPu/CvSAyCTafyYb7sMhX1r62/Lw5M/df3JyYaANyp8g15c1ypJRFSsookTqA1IDsUg==} + engines: {node: '>=18'} + peerDependencies: + micromark: ^4.0.0 + micromark-util-types: ^2.0.0 + peerDependenciesMeta: + micromark-util-types: + optional: true - mdast-util-gfm@2.0.2: - resolution: {integrity: sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==} + micromark-extension-cjk-friendly-util@3.0.1: + resolution: {integrity: sha512-GcbXqTTHOsiZHyF753oIddP/J2eH8j9zpyQPhkof6B2JNxfEJabnQqxbCgzJNuNes0Y2jTNJ3LiYPSXr6eJA8w==} + engines: {node: '>=18'} + peerDependencies: + micromark-util-types: '*' + peerDependenciesMeta: + micromark-util-types: + optional: true - mdast-util-math@2.0.2: - resolution: {integrity: sha512-8gmkKVp9v6+Tgjtq6SYx9kGPpTf6FVYRa53/DLh479aldR9AyP48qeVOgNZ5X7QUK7nOy4yw7vg6mbiGcs9jWQ==} + micromark-extension-cjk-friendly@2.0.1: + resolution: {integrity: sha512-OkzoYVTL1ChbvQ8Cc1ayTIz7paFQz8iS9oIYmewncweUSwmWR+hkJF9spJ1lxB90XldJl26A1F4IkPOKS3bDXw==} + engines: {node: '>=18'} + peerDependencies: + micromark: ^4.0.0 + micromark-util-types: ^2.0.0 + peerDependenciesMeta: + micromark-util-types: + optional: true - mdast-util-phrasing@3.0.1: - resolution: {integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==} + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} - mdast-util-to-markdown@1.5.0: - resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==} + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} - mdast-util-to-string@3.2.0: - resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} - micromark-core-commonmark@1.1.0: - resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} + micromark-extension-gfm-table@2.1.1: + resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} - micromark-extension-directive@2.2.1: - resolution: {integrity: sha512-ZFKZkNaEqAP86IghX1X7sE8NNnx6kFNq9mSBRvEHjArutTCJZ3LYg6VH151lXVb1JHpmIcW/7rX25oMoIHuSug==} + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} - micromark-extension-frontmatter@1.1.1: - resolution: {integrity: sha512-m2UH9a7n3W8VAH9JO9y01APpPKmNNNs71P0RbknEmYSaZU5Ghogv38BYO94AI5Xw6OYfxZRdHZZ2nYjs/Z+SZQ==} + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} - micromark-extension-gfm-autolink-literal@1.0.5: - resolution: {integrity: sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==} + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} - micromark-extension-gfm-footnote@1.1.2: - resolution: {integrity: sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==} + micromark-extension-mdx-expression@3.0.1: + resolution: {integrity: sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==} - micromark-extension-gfm-strikethrough@1.0.7: - resolution: {integrity: sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==} + micromark-extension-mdx-jsx@3.0.2: + resolution: {integrity: sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==} - micromark-extension-gfm-table@1.0.7: - resolution: {integrity: sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==} + micromark-extension-mdx-md@2.0.0: + resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} - micromark-extension-gfm-tagfilter@1.0.2: - resolution: {integrity: sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==} + micromark-extension-mdxjs-esm@3.0.0: + resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} - micromark-extension-gfm-task-list-item@1.0.5: - resolution: {integrity: sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==} + micromark-extension-mdxjs@3.0.0: + resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} - micromark-extension-gfm@2.0.3: - resolution: {integrity: sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==} + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} - micromark-extension-math@2.1.2: - resolution: {integrity: sha512-es0CcOV89VNS9wFmyn+wyFTKweXGW4CEvdaAca6SWRWPyYCbBisnjaHLjWO4Nszuiud84jCpkHsqAJoa768Pvg==} + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} - micromark-factory-destination@1.1.0: - resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} + micromark-factory-mdx-expression@2.0.3: + resolution: {integrity: sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==} - micromark-factory-label@1.1.0: - resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} - micromark-factory-space@1.1.0: - resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} - micromark-factory-title@1.1.0: - resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} - micromark-factory-whitespace@1.1.0: - resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} - micromark-util-character@1.2.0: - resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} - micromark-util-chunked@1.1.0: - resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} - micromark-util-classify-character@1.1.0: - resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} - micromark-util-combine-extensions@1.1.0: - resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} - micromark-util-decode-numeric-character-reference@1.1.0: - resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} - micromark-util-decode-string@1.1.0: - resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} - micromark-util-encode@1.1.0: - resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} + micromark-util-events-to-acorn@2.0.3: + resolution: {integrity: sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==} - micromark-util-html-tag-name@1.2.0: - resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} - micromark-util-normalize-identifier@1.1.0: - resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} - micromark-util-resolve-all@1.1.0: - resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} - micromark-util-sanitize-uri@1.2.0: - resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} - micromark-util-subtokenize@1.1.0: - resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} - micromark-util-symbol@1.1.0: - resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} - micromark-util-types@1.1.0: - resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} - micromark@3.2.0: - resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} minimatch@10.2.5: resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} @@ -1073,25 +1469,30 @@ packages: mlly@1.8.2: resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} - mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - nanoid@3.3.12: - resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} + nanoid@3.3.16: + resolution: {integrity: sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + nprogress@0.2.0: + resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==} + obug@2.1.3: resolution: {integrity: sha512-9miFgM2OFba7hB+pRgvtV84pYTBaoTHohvmIgiRt6dRIzbwEOIaNaP+dIlGs2fNFoB0SeISs0Jz5WFVRid6Xyg==} engines: {node: '>=12.20.0'} + oniguruma-parser@0.12.2: + resolution: {integrity: sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==} + + oniguruma-to-es@4.3.6: + resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==} + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -1107,6 +1508,9 @@ packages: parse-entities@4.0.2: resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + parse5@7.3.0: + resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} + path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} @@ -1124,8 +1528,8 @@ packages: picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picomatch@4.0.4: - resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + picomatch@4.0.5: + resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} engines: {node: '>=12'} pkg-types@1.3.1: @@ -1134,19 +1538,22 @@ packages: pkg-types@2.3.1: resolution: {integrity: sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==} - postcss@8.5.15: - resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==} + postcss@8.5.23: + resolution: {integrity: sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier@3.8.4: - resolution: {integrity: sha512-N2MylSdi48+5N/6S5j+maeHbUSIzzZ5uOcX5Hm4QpV8Dkb1HFjfAKTKX6yNPJQD9AhcT3ifHNB66tWTTJDi11Q==} + prettier@3.9.6: + resolution: {integrity: sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==} engines: {node: '>=14'} hasBin: true + property-information@7.2.0: + resolution: {integrity: sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -1154,41 +1561,136 @@ packages: quansync@0.2.11: resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} - remark-directive@2.0.1: - resolution: {integrity: sha512-oosbsUAkU/qmUE78anLaJePnPis4ihsE7Agp0T/oqTzvTea8pOiaYEtfInU/+xMOVTS9PN5AhGOiaIVe4GD8gw==} + react-dom@19.2.8: + resolution: {integrity: sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==} + peerDependencies: + react: ^19.2.8 + + react-lazy-with-preload@2.2.1: + resolution: {integrity: sha512-ONSb8gizLE5jFpdHAclZ6EAAKuFX2JydnFXPPPjoUImZlLjGtKzyBS8SJgJq7CpLgsGKh9QCZdugJyEEOVC16Q==} + + react-reconciler@0.33.0: + resolution: {integrity: sha512-KetWRytFv1epdpJc3J4G75I4WrplZE5jOL7Yq0p34+OVOKF4Se7WrdIdVC45XsSSmUTlht2FM/fM1FZb1mfQeA==} + engines: {node: '>=0.10.0'} + peerDependencies: + react: ^19.2.0 + + react-refresh@0.18.0: + resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==} + engines: {node: '>=0.10.0'} + + react-render-to-markdown@19.1.0: + resolution: {integrity: sha512-dF9b3tO41ezqdmHP8X92kbHbMexJ6iC7iHw4ykC8fwiO7DgpFc9PhMoKlI+BcPzRxGcWgQSdrixVB9RykhjJpQ==} + peerDependencies: + react: '>=19' + + react-router-dom@7.18.1: + resolution: {integrity: sha512-KaZh+X/6UtEp28x51AUYZDMg9NGoz2ja3dNHa+ta/tk40vCzKhQ/RypCWBMLbmDr6//E24Vv5uPsrqXFozdkAg==} + engines: {node: '>=20.0.0'} + peerDependencies: + react: '>=18' + react-dom: '>=18' + + react-router@7.18.1: + resolution: {integrity: sha512-GDLgg3i3uM0aeJO3Fm+TCS+sDQ7gu12T6x0qdTEzcwqEfleci7JwugVNIF3U//0FWKnJT7ptG+20B2jfDqnZAg==} + engines: {node: '>=20.0.0'} + peerDependencies: + react: '>=18' + react-dom: '>=18' + peerDependenciesMeta: + react-dom: + optional: true + + react@19.2.8: + resolution: {integrity: sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==} + engines: {node: '>=0.10.0'} + + recma-build-jsx@1.0.0: + resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==} + + recma-jsx@1.0.1: + resolution: {integrity: sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + recma-parse@1.0.0: + resolution: {integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==} - remark-frontmatter@4.0.1: - resolution: {integrity: sha512-38fJrB0KnmD3E33a5jZC/5+gGAC2WKNiPw1/fdXJvijBlhA7RCsvJklrYJakS0HedninvaCYW8lQGf9C918GfA==} + recma-stringify@1.0.0: + resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==} - remark-gfm@3.0.1: - resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==} + regex-recursion@6.0.2: + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} - remark-math@5.1.1: - resolution: {integrity: sha512-cE5T2R/xLVtfFI4cCePtiRn+e6jKMtFDR3P8V3qpv8wpKjwvHoBA4eJzvX+nVrnlNy0911bdGmuspCSwetfYHw==} + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} - remark-parse@10.0.2: - resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==} + regex@6.1.0: + resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} - remark-stringify@10.0.3: - resolution: {integrity: sha512-koyOzCMYoUHudypbj4XpnAKFbkddRMYZHwghnxd7ue5210WzGw6kOBwauJTRUMq16jsovXx8dYNvSSWP89kZ3A==} + rehype-external-links@3.0.0: + resolution: {integrity: sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==} - remark@14.0.3: - resolution: {integrity: sha512-bfmJW1dmR2LvaMJuAnE88pZP9DktIFYXazkTfOIKZzi3Knk9lT0roItIA24ydOucI3bV/g/tXBA6hzqq3FV9Ew==} + rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} - rolldown@1.0.3: - resolution: {integrity: sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==} + rehype-recma@1.0.0: + resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==} + + remark-cjk-friendly-gfm-strikethrough@2.3.1: + resolution: {integrity: sha512-JE3TGgouk/sy92SemNMEUhO5mNP4on04cmzOV3s3R5Dbk160ewmpM4tgPiinKKvoJ5UW2fTu7FOYsjVbusSA9w==} + engines: {node: '>=18'} + peerDependencies: + '@types/mdast': ^4.0.0 + unified: ^11.0.0 + peerDependenciesMeta: + '@types/mdast': + optional: true + + remark-cjk-friendly@2.3.1: + resolution: {integrity: sha512-f+pKZRxCRwNEGFBKNRAZAqU91GIK1SAo3ZyFHWRUgC9zcxRR0BXKd6YwqgSsxtW0rNpUDtONj7H5nje2WL3fcA==} + engines: {node: '>=18'} + peerDependencies: + '@types/mdast': ^4.0.0 + unified: ^11.0.0 + peerDependenciesMeta: + '@types/mdast': + optional: true + + remark-gfm@4.0.1: + resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==} + + remark-mdx@3.1.1: + resolution: {integrity: sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-rehype@11.1.2: + resolution: {integrity: sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + + rolldown@1.1.5: + resolution: {integrity: sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - sade@1.8.1: - resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} - engines: {node: '>=6'} + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + + scroll-into-view-if-needed@3.1.0: + resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==} semver@7.8.4: resolution: {integrity: sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==} engines: {node: '>=10'} hasBin: true + set-cookie-parser@2.7.2: + resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -1197,22 +1699,47 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + shiki@4.3.1: + resolution: {integrity: sha512-oR+qDVi2OjX1tmDpyv+3KviX01KzO6Af+0NNnKnsp9491UEGz2YpxTuJboS/6VhYpTdqzmuJBuiTlrAWWJAssw==} + engines: {node: '>=20'} + siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + simple-git-hooks@2.13.1: + resolution: {integrity: sha512-WszCLXwT4h2k1ufIXAgsbiTOazqqevFCIncOuUBZJ91DdvWcC5+OFkluWRQPrcuSYd8fjq+o2y1QfWqYMoAToQ==} + hasBin: true + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} std-env@4.1.0: resolution: {integrity: sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==} + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + stringify-entities@4.0.4: resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + style-to-js@1.1.21: + resolution: {integrity: sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==} + + style-to-object@1.0.14: + resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==} + tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -1228,6 +1755,12 @@ packages: resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} engines: {node: '>=14.0.0'} + toggle-selection@1.0.6: + resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} @@ -1240,8 +1773,8 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsx@4.22.4: - resolution: {integrity: sha512-X8EX+XV4QR5xCsrgxaED954zTDfY8KqlDtskKEL0cHhyS/P8b4IFOvGDQpsC9Q1XnLq915wEfwwY/zzskCtmhg==} + tsx@4.23.1: + resolution: {integrity: sha512-GQHnkIfxyx1wYCOS/wonik5MVRZU9hi1TEZmzGZSCJB1y9YgoZ8H6itNE/u4suE+yLmOzuE4E5S4TZ/ZX2wcWQ==} engines: {node: '>=18.0.0'} hasBin: true @@ -1249,8 +1782,8 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - typescript-eslint@8.61.1: - resolution: {integrity: sha512-V7PayAfJokV3pEHgN7/v03D1SpujhRfQtYLbLIiBfDDncdg4PAiRBfoS4cnCANK4jmAPncczi59QO3afiXUlNw==} + typescript-eslint@8.65.0: + resolution: {integrity: sha512-/ggrHAwyjENDusvyxbuqxAC2dTnZg/Z8F+fgQtYIz+L6n/9HfSlEZcFGV/NsMNa6CkGk0xUjUAFwC0vHOflvIA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -1264,30 +1797,45 @@ packages: ufo@1.6.4: resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} - undici-types@7.24.6: - resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - unified@10.1.2: - resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} + unhead@2.1.16: + resolution: {integrity: sha512-cD2Q4a6SQHhW9/bPp17NT4GJ1yS0DSLe75WEHKQ8bKa/wjB6cIki3KeL86hhllNBcpv8i6bxdwtwQunneXPqKQ==} - unist-util-is@5.2.1: - resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} + unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} - unist-util-stringify-position@3.0.3: - resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} + unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} - unist-util-visit-parents@5.1.3: - resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} + unist-util-position-from-estree@2.0.0: + resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} - unist-util-visit@4.1.2: - resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} - unplugin-dts@1.0.2: - resolution: {integrity: sha512-VbNiMD0LMl/t6nJueGtrCp79N7ZO1nquxj/FUybJDnKwZGsnW2wjdwBSzA3QEHujoxmxZIptsG43hL7LzXE96w==} - peerDependencies: - '@microsoft/api-extractor': '>=7' + unist-util-remove@4.0.0: + resolution: {integrity: sha512-b4gokeGId57UVRX/eVKej5gXqGlc9+trkORhFJpu9raqZkZhU0zm8Doi05+HaiBsMEIJowL+2WtQ5ItjsngPXg==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-children@3.0.0: + resolution: {integrity: sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==} + + unist-util-visit-parents@6.0.2: + resolution: {integrity: sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==} + + unist-util-visit@5.1.0: + resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} + + unplugin-dts@1.0.3: + resolution: {integrity: sha512-/GR887wfG4r1cWyt1UZsLRuMIjsmEbGkS9yJrz+0dsToHAYUD5CTyP3JMGVLv25j9K0mJcwAVvZno/aTuSUvNg==} + peerDependencies: + '@microsoft/api-extractor': '>=7' '@rspack/core': ^1 - '@vue/language-core': ~3.1.5 + '@vue/language-core': ^3.1.5 esbuild: '*' rolldown: '*' rollup: '>=3' @@ -1319,19 +1867,17 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - uvu@0.5.6: - resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} - engines: {node: '>=8'} - hasBin: true + vfile-location@5.0.3: + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} - vfile-message@3.1.4: - resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} - vfile@5.3.7: - resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite-plugin-dts@5.0.2: - resolution: {integrity: sha512-lNeHS+dwGju6eRmNvZQt8Shwv9j3m98hbHse/lIbLq9q3yE2DcIOBBYQEVUF6tS0kOmv+VA9Z5FqmzFnGe4U8g==} + vite-plugin-dts@5.0.3: + resolution: {integrity: sha512-gIth6NdCEHWPiiRMCK3N6C8WjvdsrtEQrmsiG8h6Ov+lFP+b07Y+wcs9H0H7n146l0PDTYK4cQN1vgeG1pMdRQ==} peerDependencies: '@microsoft/api-extractor': '>=7' rollup: '>=3' @@ -1344,13 +1890,13 @@ packages: vite: optional: true - vite@8.0.16: - resolution: {integrity: sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==} + vite@8.1.5: + resolution: {integrity: sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: '@types/node': ^20.19.0 || >=22.12.0 - '@vitejs/devtools': ^0.1.18 + '@vitejs/devtools': ^0.3.0 esbuild: ^0.27.0 || ^0.28.0 jiti: '>=1.21.0' less: ^4.0.0 @@ -1387,20 +1933,20 @@ packages: yaml: optional: true - vitest@4.1.9: - resolution: {integrity: sha512-nE3/LEyc0z87uHYLZebqCUOaJr2hdtuPp7BQ4BosVFnfltxgAvMG08NyrSGlPpOUWvR27c5flSmYFTNr78L9GQ==} + vitest@4.1.10: + resolution: {integrity: sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@opentelemetry/api': ^1.9.0 '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.1.9 - '@vitest/browser-preview': 4.1.9 - '@vitest/browser-webdriverio': 4.1.9 - '@vitest/coverage-istanbul': 4.1.9 - '@vitest/coverage-v8': 4.1.9 - '@vitest/ui': 4.1.9 + '@vitest/browser-playwright': 4.1.10 + '@vitest/browser-preview': 4.1.10 + '@vitest/browser-webdriverio': 4.1.10 + '@vitest/coverage-istanbul': 4.1.10 + '@vitest/coverage-v8': 4.1.10 + '@vitest/ui': 4.1.10 happy-dom: '*' jsdom: '*' vite: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -1431,6 +1977,9 @@ packages: vscode-uri@3.1.0: resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} @@ -1448,6 +1997,11 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} + yaml@2.9.0: + resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} + engines: {node: '>= 14.6'} + hasBin: true + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -1457,18 +2011,29 @@ packages: snapshots: - '@emnapi/core@1.10.0': + '@emnapi/core@1.11.1': dependencies: - '@emnapi/wasi-threads': 1.2.1 + '@emnapi/wasi-threads': 1.2.2 tslib: 2.8.1 optional: true - '@emnapi/runtime@1.10.0': + '@emnapi/core@1.11.2': dependencies: + '@emnapi/wasi-threads': 1.2.2 tslib: 2.8.1 optional: true - '@emnapi/wasi-threads@1.2.1': + '@emnapi/runtime@1.11.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.11.2': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.2.2': dependencies: tslib: 2.8.1 optional: true @@ -1551,9 +2116,9 @@ snapshots: '@esbuild/win32-x64@0.28.1': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@10.5.0)': + '@eslint-community/eslint-utils@4.9.1(eslint@10.8.0)': dependencies: - eslint: 10.5.0 + eslint: 10.8.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} @@ -1566,7 +2131,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.6.0': + '@eslint/config-helpers@0.7.0': dependencies: '@eslint/core': 1.2.1 @@ -1574,9 +2139,9 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/js@10.0.1(eslint@10.5.0)': + '@eslint/js@10.0.1(eslint@10.8.0)': optionalDependencies: - eslint: 10.5.0 + eslint: 10.8.0 '@eslint/object-schema@3.0.5': {} @@ -1620,81 +2185,113 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@lint-md/core@2.0.0': + '@lint-md/core@2.1.6': dependencies: - '@lint-md/parser': 0.0.14 - lodash: 4.18.1 - transitivePeerDependencies: - - supports-color + '@lint-md/parser': 0.2.0 - '@lint-md/parser@0.0.14': + '@lint-md/parser@0.2.0': dependencies: - '@types/unist': 2.0.11 - mdast-util-gfm-autolink-literal: 1.0.3 - remark: 14.0.3 - remark-directive: 2.0.1 - remark-frontmatter: 4.0.1 - remark-gfm: 3.0.1 - remark-math: 5.1.1 + '@types/mdast': 3.0.15 + + '@mdx-js/mdx@3.1.1': + dependencies: + '@types/estree': 1.0.9 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.5 + '@types/mdx': 2.0.14 + acorn: 8.17.0 + collapse-white-space: 2.1.0 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-util-scope: 1.0.0 + estree-walker: 3.0.3 + hast-util-to-jsx-runtime: 2.3.6 + markdown-extensions: 2.0.0 + recma-build-jsx: 1.0.0 + recma-jsx: 1.0.1(acorn@8.17.0) + recma-stringify: 1.0.0 + rehype-recma: 1.0.0 + remark-mdx: 3.1.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.2 + source-map: 0.7.6 + unified: 11.0.5 + unist-util-position-from-estree: 2.0.0 + unist-util-stringify-position: 4.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 transitivePeerDependencies: - supports-color - '@napi-rs/wasm-runtime@1.1.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + '@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8)': + dependencies: + '@types/mdx': 2.0.14 + '@types/react': 19.2.17 + react: 19.2.8 + + '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': + dependencies: + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.1 + '@tybys/wasm-util': 0.10.3 + optional: true + + '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)': dependencies: - '@emnapi/core': 1.10.0 - '@emnapi/runtime': 1.10.0 - '@tybys/wasm-util': 0.10.2 + '@emnapi/core': 1.11.2 + '@emnapi/runtime': 1.11.2 + '@tybys/wasm-util': 0.10.3 optional: true - '@oxc-project/types@0.133.0': {} + '@oxc-project/types@0.139.0': {} - '@rolldown/binding-android-arm64@1.0.3': + '@rolldown/binding-android-arm64@1.1.5': optional: true - '@rolldown/binding-darwin-arm64@1.0.3': + '@rolldown/binding-darwin-arm64@1.1.5': optional: true - '@rolldown/binding-darwin-x64@1.0.3': + '@rolldown/binding-darwin-x64@1.1.5': optional: true - '@rolldown/binding-freebsd-x64@1.0.3': + '@rolldown/binding-freebsd-x64@1.1.5': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.3': + '@rolldown/binding-linux-arm-gnueabihf@1.1.5': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.3': + '@rolldown/binding-linux-arm64-gnu@1.1.5': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.3': + '@rolldown/binding-linux-arm64-musl@1.1.5': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.0.3': + '@rolldown/binding-linux-ppc64-gnu@1.1.5': optional: true - '@rolldown/binding-linux-s390x-gnu@1.0.3': + '@rolldown/binding-linux-s390x-gnu@1.1.5': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.3': + '@rolldown/binding-linux-x64-gnu@1.1.5': optional: true - '@rolldown/binding-linux-x64-musl@1.0.3': + '@rolldown/binding-linux-x64-musl@1.1.5': optional: true - '@rolldown/binding-openharmony-arm64@1.0.3': + '@rolldown/binding-openharmony-arm64@1.1.5': optional: true - '@rolldown/binding-wasm32-wasi@1.0.3': + '@rolldown/binding-wasm32-wasi@1.1.5': dependencies: - '@emnapi/core': 1.10.0 - '@emnapi/runtime': 1.10.0 - '@napi-rs/wasm-runtime': 1.1.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.1 + '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.3': + '@rolldown/binding-win32-arm64-msvc@1.1.5': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.3': + '@rolldown/binding-win32-x64-msvc@1.1.5': optional: true '@rolldown/pluginutils@1.0.1': {} @@ -1703,11 +2300,206 @@ snapshots: dependencies: '@types/estree': 1.0.9 estree-walker: 2.0.2 - picomatch: 4.0.4 + picomatch: 4.0.5 + + '@rsbuild/core@2.1.8': + dependencies: + '@rspack/core': 2.1.5(@swc/helpers@0.5.23) + '@swc/helpers': 0.5.23 + transitivePeerDependencies: + - '@module-federation/runtime-tools' + + '@rsbuild/plugin-react@2.1.0(@rsbuild/core@2.1.8)(@rspack/core@2.1.5(@swc/helpers@0.5.23))': + dependencies: + '@rspack/plugin-react-refresh': 2.0.2(@rspack/core@2.1.5(@swc/helpers@0.5.23))(react-refresh@0.18.0) + react-refresh: 0.18.0 + optionalDependencies: + '@rsbuild/core': 2.1.8 + transitivePeerDependencies: + - '@rspack/core' + + '@rspack/binding-darwin-arm64@2.1.5': + optional: true + + '@rspack/binding-darwin-x64@2.1.5': + optional: true + + '@rspack/binding-linux-arm64-gnu@2.1.5': + optional: true + + '@rspack/binding-linux-arm64-musl@2.1.5': + optional: true + + '@rspack/binding-linux-riscv64-gnu@2.1.5': + optional: true + + '@rspack/binding-linux-riscv64-musl@2.1.5': + optional: true + + '@rspack/binding-linux-x64-gnu@2.1.5': + optional: true + + '@rspack/binding-linux-x64-musl@2.1.5': + optional: true + + '@rspack/binding-wasm32-wasi@2.1.5': + dependencies: + '@emnapi/core': 1.11.2 + '@emnapi/runtime': 1.11.2 + '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) + optional: true + + '@rspack/binding-win32-arm64-msvc@2.1.5': + optional: true + + '@rspack/binding-win32-ia32-msvc@2.1.5': + optional: true + + '@rspack/binding-win32-x64-msvc@2.1.5': + optional: true + + '@rspack/binding@2.1.5': + optionalDependencies: + '@rspack/binding-darwin-arm64': 2.1.5 + '@rspack/binding-darwin-x64': 2.1.5 + '@rspack/binding-linux-arm64-gnu': 2.1.5 + '@rspack/binding-linux-arm64-musl': 2.1.5 + '@rspack/binding-linux-riscv64-gnu': 2.1.5 + '@rspack/binding-linux-riscv64-musl': 2.1.5 + '@rspack/binding-linux-x64-gnu': 2.1.5 + '@rspack/binding-linux-x64-musl': 2.1.5 + '@rspack/binding-wasm32-wasi': 2.1.5 + '@rspack/binding-win32-arm64-msvc': 2.1.5 + '@rspack/binding-win32-ia32-msvc': 2.1.5 + '@rspack/binding-win32-x64-msvc': 2.1.5 + + '@rspack/core@2.1.5(@swc/helpers@0.5.23)': + dependencies: + '@rspack/binding': 2.1.5 + optionalDependencies: + '@swc/helpers': 0.5.23 + + '@rspack/plugin-react-refresh@2.0.2(@rspack/core@2.1.5(@swc/helpers@0.5.23))(react-refresh@0.18.0)': + dependencies: + react-refresh: 0.18.0 + optionalDependencies: + '@rspack/core': 2.1.5(@swc/helpers@0.5.23) + + '@rspress/core@2.0.18(@rspack/core@2.1.5(@swc/helpers@0.5.23))(@types/mdast@4.0.4)(@types/react@19.2.17)(micromark-util-types@2.0.2)(micromark@4.0.2)': + dependencies: + '@mdx-js/mdx': 3.1.1 + '@mdx-js/react': 3.1.1(@types/react@19.2.17)(react@19.2.8) + '@rsbuild/core': 2.1.8 + '@rsbuild/plugin-react': 2.1.0(@rsbuild/core@2.1.8)(@rspack/core@2.1.5(@swc/helpers@0.5.23)) + '@rspress/shared': 2.0.18 + '@shikijs/rehype': 4.3.1 + '@types/unist': 3.0.3 + '@unhead/react': 2.1.16(react@19.2.8) + body-scroll-lock: 4.0.0-beta.0 + clsx: 2.1.1 + copy-to-clipboard: 3.3.3 + flexsearch: 0.8.212 + hast-util-heading-rank: 3.0.0 + hast-util-to-jsx-runtime: 2.3.6 + mdast-util-mdx: 3.0.0 + mdast-util-mdxjs-esm: 2.0.1 + medium-zoom: 1.1.0 + nprogress: 0.2.0 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + react-lazy-with-preload: 2.2.1 + react-reconciler: 0.33.0(react@19.2.8) + react-render-to-markdown: 19.1.0(react@19.2.8) + react-router-dom: 7.18.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + rehype-external-links: 3.0.0 + rehype-raw: 7.0.0 + remark-cjk-friendly: 2.3.1(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2)(unified@11.0.5) + remark-cjk-friendly-gfm-strikethrough: 2.3.1(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2)(unified@11.0.5) + remark-gfm: 4.0.1 + remark-mdx: 3.1.1 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + scroll-into-view-if-needed: 3.1.0 + shiki: 4.3.1 + unified: 11.0.5 + unist-util-remove: 4.0.0 + unist-util-visit: 5.1.0 + unist-util-visit-children: 3.0.0 + transitivePeerDependencies: + - '@module-federation/runtime-tools' + - '@rspack/core' + - '@types/mdast' + - '@types/react' + - core-js + - micromark + - micromark-util-types + - supports-color + + '@rspress/shared@2.0.18': + dependencies: + '@rsbuild/core': 2.1.8 + '@shikijs/rehype': 4.3.1 + unified: 11.0.5 + transitivePeerDependencies: + - '@module-federation/runtime-tools' + - core-js + + '@shikijs/core@4.3.1': + dependencies: + '@shikijs/primitive': 4.3.1 + '@shikijs/types': 4.3.1 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.5 + hast-util-to-html: 9.0.5 + + '@shikijs/engine-javascript@4.3.1': + dependencies: + '@shikijs/types': 4.3.1 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 4.3.6 + + '@shikijs/engine-oniguruma@4.3.1': + dependencies: + '@shikijs/types': 4.3.1 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@4.3.1': + dependencies: + '@shikijs/types': 4.3.1 + + '@shikijs/primitive@4.3.1': + dependencies: + '@shikijs/types': 4.3.1 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.5 + + '@shikijs/rehype@4.3.1': + dependencies: + '@shikijs/types': 4.3.1 + '@types/hast': 3.0.5 + hast-util-to-string: 3.0.1 + shiki: 4.3.1 + unified: 11.0.5 + unist-util-visit: 5.1.0 + + '@shikijs/themes@4.3.1': + dependencies: + '@shikijs/types': 4.3.1 + + '@shikijs/types@4.3.1': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.5 + + '@shikijs/vscode-textmate@10.0.2': {} '@standard-schema/spec@1.1.0': {} - '@tybys/wasm-util@0.10.2': + '@swc/helpers@0.5.23': + dependencies: + tslib: 2.8.1 + + '@tybys/wasm-util@0.10.3': dependencies: tslib: 2.8.1 optional: true @@ -1725,33 +2517,55 @@ snapshots: '@types/esrecurse@4.3.1': {} + '@types/estree-jsx@1.0.5': + dependencies: + '@types/estree': 1.0.9 + '@types/estree@1.0.9': {} - '@types/json-schema@7.0.15': {} + '@types/hast@3.0.5': + dependencies: + '@types/unist': 3.0.3 - '@types/katex@0.16.8': {} + '@types/json-schema@7.0.15': {} '@types/mdast@3.0.15': dependencies: '@types/unist': 2.0.11 + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/mdx@2.0.14': {} + '@types/ms@2.1.0': {} - '@types/node@25.9.3': + '@types/node@22.20.1': dependencies: - undici-types: 7.24.6 + undici-types: 6.21.0 + + '@types/react-dom@19.2.3(@types/react@19.2.17)': + dependencies: + '@types/react': 19.2.17 + + '@types/react@19.2.17': + dependencies: + csstype: 3.2.3 '@types/unist@2.0.11': {} - '@typescript-eslint/eslint-plugin@8.61.1(@typescript-eslint/parser@8.61.1(eslint@10.5.0)(typescript@6.0.3))(eslint@10.5.0)(typescript@6.0.3)': + '@types/unist@3.0.3': {} + + '@typescript-eslint/eslint-plugin@8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.8.0)(typescript@6.0.3))(eslint@10.8.0)(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.61.1(eslint@10.5.0)(typescript@6.0.3) - '@typescript-eslint/scope-manager': 8.61.1 - '@typescript-eslint/type-utils': 8.61.1(eslint@10.5.0)(typescript@6.0.3) - '@typescript-eslint/utils': 8.61.1(eslint@10.5.0)(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.61.1 - eslint: 10.5.0 + '@typescript-eslint/parser': 8.65.0(eslint@10.8.0)(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.65.0 + '@typescript-eslint/type-utils': 8.65.0(eslint@10.8.0)(typescript@6.0.3) + '@typescript-eslint/utils': 8.65.0(eslint@10.8.0)(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.65.0 + eslint: 10.8.0 ignore: 7.0.5 natural-compare: 1.4.0 ts-api-utils: 2.5.0(typescript@6.0.3) @@ -1759,56 +2573,56 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.61.1(eslint@10.5.0)(typescript@6.0.3)': + '@typescript-eslint/parser@8.65.0(eslint@10.8.0)(typescript@6.0.3)': dependencies: - '@typescript-eslint/scope-manager': 8.61.1 - '@typescript-eslint/types': 8.61.1 - '@typescript-eslint/typescript-estree': 8.61.1(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.61.1 + '@typescript-eslint/scope-manager': 8.65.0 + '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/typescript-estree': 8.65.0(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.65.0 debug: 4.4.3 - eslint: 10.5.0 + eslint: 10.8.0 typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.61.1(typescript@6.0.3)': + '@typescript-eslint/project-service@8.65.0(typescript@6.0.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.61.1(typescript@6.0.3) - '@typescript-eslint/types': 8.61.1 + '@typescript-eslint/tsconfig-utils': 8.65.0(typescript@6.0.3) + '@typescript-eslint/types': 8.65.0 debug: 4.4.3 typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.61.1': + '@typescript-eslint/scope-manager@8.65.0': dependencies: - '@typescript-eslint/types': 8.61.1 - '@typescript-eslint/visitor-keys': 8.61.1 + '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/visitor-keys': 8.65.0 - '@typescript-eslint/tsconfig-utils@8.61.1(typescript@6.0.3)': + '@typescript-eslint/tsconfig-utils@8.65.0(typescript@6.0.3)': dependencies: typescript: 6.0.3 - '@typescript-eslint/type-utils@8.61.1(eslint@10.5.0)(typescript@6.0.3)': + '@typescript-eslint/type-utils@8.65.0(eslint@10.8.0)(typescript@6.0.3)': dependencies: - '@typescript-eslint/types': 8.61.1 - '@typescript-eslint/typescript-estree': 8.61.1(typescript@6.0.3) - '@typescript-eslint/utils': 8.61.1(eslint@10.5.0)(typescript@6.0.3) + '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/typescript-estree': 8.65.0(typescript@6.0.3) + '@typescript-eslint/utils': 8.65.0(eslint@10.8.0)(typescript@6.0.3) debug: 4.4.3 - eslint: 10.5.0 + eslint: 10.8.0 ts-api-utils: 2.5.0(typescript@6.0.3) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.61.1': {} + '@typescript-eslint/types@8.65.0': {} - '@typescript-eslint/typescript-estree@8.61.1(typescript@6.0.3)': + '@typescript-eslint/typescript-estree@8.65.0(typescript@6.0.3)': dependencies: - '@typescript-eslint/project-service': 8.61.1(typescript@6.0.3) - '@typescript-eslint/tsconfig-utils': 8.61.1(typescript@6.0.3) - '@typescript-eslint/types': 8.61.1 - '@typescript-eslint/visitor-keys': 8.61.1 + '@typescript-eslint/project-service': 8.65.0(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.65.0(typescript@6.0.3) + '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/visitor-keys': 8.65.0 debug: 4.4.3 minimatch: 10.2.5 semver: 7.8.4 @@ -1818,60 +2632,67 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.61.1(eslint@10.5.0)(typescript@6.0.3)': + '@typescript-eslint/utils@8.65.0(eslint@10.8.0)(typescript@6.0.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.5.0) - '@typescript-eslint/scope-manager': 8.61.1 - '@typescript-eslint/types': 8.61.1 - '@typescript-eslint/typescript-estree': 8.61.1(typescript@6.0.3) - eslint: 10.5.0 + '@eslint-community/eslint-utils': 4.9.1(eslint@10.8.0) + '@typescript-eslint/scope-manager': 8.65.0 + '@typescript-eslint/types': 8.65.0 + '@typescript-eslint/typescript-estree': 8.65.0(typescript@6.0.3) + eslint: 10.8.0 typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.61.1': + '@typescript-eslint/visitor-keys@8.65.0': dependencies: - '@typescript-eslint/types': 8.61.1 + '@typescript-eslint/types': 8.65.0 eslint-visitor-keys: 5.0.1 - '@vitest/expect@4.1.9': + '@ungap/structured-clone@1.3.3': {} + + '@unhead/react@2.1.16(react@19.2.8)': + dependencies: + react: 19.2.8 + unhead: 2.1.16 + + '@vitest/expect@4.1.10': dependencies: '@standard-schema/spec': 1.1.0 '@types/chai': 5.2.3 - '@vitest/spy': 4.1.9 - '@vitest/utils': 4.1.9 + '@vitest/spy': 4.1.10 + '@vitest/utils': 4.1.10 chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.9(vite@8.0.16(@types/node@25.9.3)(esbuild@0.28.1)(tsx@4.22.4))': + '@vitest/mocker@4.1.10(vite@8.1.5(@types/node@22.20.1)(esbuild@0.28.1)(tsx@4.23.1)(yaml@2.9.0))': dependencies: - '@vitest/spy': 4.1.9 + '@vitest/spy': 4.1.10 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.0.16(@types/node@25.9.3)(esbuild@0.28.1)(tsx@4.22.4) + vite: 8.1.5(@types/node@22.20.1)(esbuild@0.28.1)(tsx@4.23.1)(yaml@2.9.0) - '@vitest/pretty-format@4.1.9': + '@vitest/pretty-format@4.1.10': dependencies: tinyrainbow: 3.1.0 - '@vitest/runner@4.1.9': + '@vitest/runner@4.1.10': dependencies: - '@vitest/utils': 4.1.9 + '@vitest/utils': 4.1.10 pathe: 2.0.3 - '@vitest/snapshot@4.1.9': + '@vitest/snapshot@4.1.10': dependencies: - '@vitest/pretty-format': 4.1.9 - '@vitest/utils': 4.1.9 + '@vitest/pretty-format': 4.1.10 + '@vitest/utils': 4.1.10 magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@4.1.9': {} + '@vitest/spy@4.1.10': {} - '@vitest/utils@4.1.9': + '@vitest/utils@4.1.10': dependencies: - '@vitest/pretty-format': 4.1.9 + '@vitest/pretty-format': 4.1.10 convert-source-map: 2.0.0 tinyrainbow: 3.1.0 @@ -1902,11 +2723,15 @@ snapshots: assertion-error@2.0.1: {} + astring@1.9.0: {} + bail@2.0.2: {} balanced-match@4.0.4: {} - brace-expansion@5.0.6: + body-scroll-lock@4.0.0-beta.0: {} + + brace-expansion@5.0.8: dependencies: balanced-match: 4.0.4 @@ -1922,22 +2747,36 @@ snapshots: character-reference-invalid@2.0.1: {} - commander@8.3.0: {} + clsx@2.1.1: {} + + collapse-white-space@2.1.0: {} + + comma-separated-tokens@2.0.3: {} compare-versions@6.1.1: {} + compute-scroll-into-view@3.1.1: {} + confbox@0.1.8: {} confbox@0.2.4: {} convert-source-map@2.0.0: {} + cookie@1.1.1: {} + + copy-to-clipboard@3.3.3: + dependencies: + toggle-selection: 1.0.6 + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 + csstype@3.2.3: {} + debug@4.4.3: dependencies: ms: 2.1.3 @@ -1952,10 +2791,28 @@ snapshots: detect-libc@2.1.2: {} - diff@5.2.2: {} + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + entities@6.0.1: {} es-module-lexer@2.1.0: {} + esast-util-from-estree@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + unist-util-position-from-estree: 2.0.0 + + esast-util-from-js@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + acorn: 8.17.0 + esast-util-from-estree: 2.0.0 + vfile-message: 4.0.3 + esbuild@0.28.1: optionalDependencies: '@esbuild/aix-ppc64': 0.28.1 @@ -1984,6 +2841,7 @@ snapshots: '@esbuild/win32-arm64': 0.28.1 '@esbuild/win32-ia32': 0.28.1 '@esbuild/win32-x64': 0.28.1 + optional: true escape-string-regexp@4.0.0: {} @@ -2000,12 +2858,12 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.5.0: + eslint@10.8.0: dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.5.0) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.8.0) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.23.5 - '@eslint/config-helpers': 0.6.0 + '@eslint/config-helpers': 0.7.0 '@eslint/core': 1.2.1 '@eslint/plugin-kit': 0.7.2 '@humanfs/node': 0.16.8 @@ -2051,6 +2909,35 @@ snapshots: estraverse@5.3.0: {} + estree-util-attach-comments@3.0.0: + dependencies: + '@types/estree': 1.0.9 + + estree-util-build-jsx@3.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-walker: 3.0.3 + + estree-util-is-identifier-name@3.0.0: {} + + estree-util-scope@1.0.0: + dependencies: + '@types/estree': 1.0.9 + devlop: 1.1.0 + + estree-util-to-js@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + astring: 1.9.0 + source-map: 0.7.6 + + estree-util-visit@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/unist': 3.0.3 + estree-walker@2.0.2: {} estree-walker@3.0.3: @@ -2071,13 +2958,9 @@ snapshots: fast-levenshtein@2.0.6: {} - fault@2.0.1: - dependencies: - format: 0.2.2 - - fdir@6.5.0(picomatch@4.0.4): + fdir@6.5.0(picomatch@4.0.5): optionalDependencies: - picomatch: 4.0.4 + picomatch: 4.0.5 file-entry-cache@8.0.0: dependencies: @@ -2095,16 +2978,142 @@ snapshots: flatted@3.4.2: {} - format@0.2.2: {} + flexsearch@0.8.212: {} fsevents@2.3.3: optional: true + get-east-asian-width@1.6.0: {} + glob-parent@6.0.2: dependencies: is-glob: 4.0.3 - globals@17.6.0: {} + globals@17.8.0: {} + + hast-util-from-parse5@8.0.3: + dependencies: + '@types/hast': 3.0.5 + '@types/unist': 3.0.3 + devlop: 1.1.0 + hastscript: 9.0.1 + property-information: 7.2.0 + vfile: 6.0.3 + vfile-location: 5.0.3 + web-namespaces: 2.0.1 + + hast-util-heading-rank@3.0.0: + dependencies: + '@types/hast': 3.0.5 + + hast-util-is-element@3.0.0: + dependencies: + '@types/hast': 3.0.5 + + hast-util-parse-selector@4.0.0: + dependencies: + '@types/hast': 3.0.5 + + hast-util-raw@9.1.0: + dependencies: + '@types/hast': 3.0.5 + '@types/unist': 3.0.3 + '@ungap/structured-clone': 1.3.3 + hast-util-from-parse5: 8.0.3 + hast-util-to-parse5: 8.0.1 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + parse5: 7.3.0 + unist-util-position: 5.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-to-estree@3.1.3: + dependencies: + '@types/estree': 1.0.9 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.5 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-attach-comments: 3.0.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.2.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.21 + unist-util-position: 5.0.0 + zwitch: 2.0.4 + transitivePeerDependencies: + - supports-color + + hast-util-to-html@9.0.5: + dependencies: + '@types/hast': 3.0.5 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.1 + property-information: 7.2.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + + hast-util-to-jsx-runtime@2.3.6: + dependencies: + '@types/estree': 1.0.9 + '@types/hast': 3.0.5 + '@types/unist': 3.0.3 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 7.2.0 + space-separated-tokens: 2.0.2 + style-to-js: 1.1.21 + unist-util-position: 5.0.0 + vfile-message: 4.0.3 + transitivePeerDependencies: + - supports-color + + hast-util-to-parse5@8.0.1: + dependencies: + '@types/hast': 3.0.5 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 7.2.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + + hast-util-to-string@3.0.1: + dependencies: + '@types/hast': 3.0.5 + + hast-util-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.5 + + hastscript@9.0.1: + dependencies: + '@types/hast': 3.0.5 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 7.2.0 + space-separated-tokens: 2.0.2 + + hookable@6.1.1: {} + + html-void-elements@3.0.0: {} ignore@5.3.2: {} @@ -2112,6 +3121,10 @@ snapshots: imurmurhash@0.1.4: {} + inline-style-parser@0.2.7: {} + + is-absolute-url@4.0.1: {} + is-alphabetical@2.0.1: {} is-alphanumerical@2.0.1: @@ -2119,8 +3132,6 @@ snapshots: is-alphabetical: 2.0.1 is-decimal: 2.0.1 - is-buffer@2.0.5: {} - is-decimal@2.0.1: {} is-extglob@2.1.1: {} @@ -2141,16 +3152,10 @@ snapshots: json-stable-stringify-without-jsonify@1.0.1: {} - katex@0.16.47: - dependencies: - commander: 8.3.0 - keyv@4.5.4: dependencies: json-buffer: 3.0.1 - kleur@4.1.5: {} - kolorist@1.8.0: {} levn@0.4.1: @@ -2207,6 +3212,14 @@ snapshots: lightningcss-win32-arm64-msvc: 1.32.0 lightningcss-win32-x64-msvc: 1.32.0 + lint-staged@17.2.0: + dependencies: + picomatch: 4.0.5 + string-argv: 0.3.2 + tinyexec: 1.2.4 + optionalDependencies: + yaml: 2.9.0 + local-pkg@1.2.1: dependencies: mlly: 1.8.2 @@ -2217,349 +3230,502 @@ snapshots: dependencies: p-locate: 5.0.0 - lodash@4.18.1: {} - longest-streak@3.1.0: {} magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 + markdown-extensions@2.0.0: {} + markdown-table@3.0.4: {} - mdast-util-directive@2.2.4: + mdast-util-find-and-replace@3.0.2: dependencies: - '@types/mdast': 3.0.15 - '@types/unist': 2.0.11 - mdast-util-from-markdown: 1.3.1 - mdast-util-to-markdown: 1.5.0 - parse-entities: 4.0.2 - stringify-entities: 4.0.4 - unist-util-visit-parents: 5.1.3 + '@types/mdast': 4.0.4 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + mdast-util-from-markdown@2.0.3: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.3.0 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.2 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-decode-string: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-stringify-position: 4.0.0 transitivePeerDependencies: - supports-color - mdast-util-find-and-replace@2.2.2: + mdast-util-gfm-autolink-literal@2.0.1: dependencies: - '@types/mdast': 3.0.15 - escape-string-regexp: 5.0.0 - unist-util-is: 5.2.1 - unist-util-visit-parents: 5.1.3 + '@types/mdast': 4.0.4 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.2 + micromark-util-character: 2.1.1 - mdast-util-from-markdown@1.3.1: + mdast-util-gfm-footnote@2.1.0: dependencies: - '@types/mdast': 3.0.15 - '@types/unist': 2.0.11 - decode-named-character-reference: 1.3.0 - mdast-util-to-string: 3.2.0 - micromark: 3.2.0 - micromark-util-decode-numeric-character-reference: 1.1.0 - micromark-util-decode-string: 1.1.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - unist-util-stringify-position: 3.0.3 - uvu: 0.5.6 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + micromark-util-normalize-identifier: 2.0.1 transitivePeerDependencies: - supports-color - mdast-util-frontmatter@1.0.1: + mdast-util-gfm-strikethrough@2.0.0: dependencies: - '@types/mdast': 3.0.15 - mdast-util-to-markdown: 1.5.0 - micromark-extension-frontmatter: 1.1.1 + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color - mdast-util-gfm-autolink-literal@1.0.3: + mdast-util-gfm-table@2.0.0: dependencies: - '@types/mdast': 3.0.15 - ccount: 2.0.1 - mdast-util-find-and-replace: 2.2.2 - micromark-util-character: 1.2.0 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + markdown-table: 3.0.4 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color - mdast-util-gfm-footnote@1.0.2: + mdast-util-gfm-task-list-item@2.0.0: dependencies: - '@types/mdast': 3.0.15 - mdast-util-to-markdown: 1.5.0 - micromark-util-normalize-identifier: 1.1.0 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color - mdast-util-gfm-strikethrough@1.0.3: + mdast-util-gfm@3.1.0: dependencies: - '@types/mdast': 3.0.15 - mdast-util-to-markdown: 1.5.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-gfm-autolink-literal: 2.0.1 + mdast-util-gfm-footnote: 2.1.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color - mdast-util-gfm-table@1.0.7: + mdast-util-mdx-expression@2.0.1: dependencies: - '@types/mdast': 3.0.15 - markdown-table: 3.0.4 - mdast-util-from-markdown: 1.3.1 - mdast-util-to-markdown: 1.5.0 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.5 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color - mdast-util-gfm-task-list-item@1.0.2: + mdast-util-mdx-jsx@3.2.0: dependencies: - '@types/mdast': 3.0.15 - mdast-util-to-markdown: 1.5.0 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.5 + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + parse-entities: 4.0.2 + stringify-entities: 4.0.4 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.3 + transitivePeerDependencies: + - supports-color - mdast-util-gfm@2.0.2: + mdast-util-mdx@3.0.0: dependencies: - mdast-util-from-markdown: 1.3.1 - mdast-util-gfm-autolink-literal: 1.0.3 - mdast-util-gfm-footnote: 1.0.2 - mdast-util-gfm-strikethrough: 1.0.3 - mdast-util-gfm-table: 1.0.7 - mdast-util-gfm-task-list-item: 1.0.2 - mdast-util-to-markdown: 1.5.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-mdx-expression: 2.0.1 + mdast-util-mdx-jsx: 3.2.0 + mdast-util-mdxjs-esm: 2.0.1 + mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color - mdast-util-math@2.0.2: + mdast-util-mdxjs-esm@2.0.1: dependencies: - '@types/mdast': 3.0.15 - longest-streak: 3.1.0 - mdast-util-to-markdown: 1.5.0 + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.5 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + transitivePeerDependencies: + - supports-color - mdast-util-phrasing@3.0.1: + mdast-util-phrasing@4.1.0: dependencies: - '@types/mdast': 3.0.15 - unist-util-is: 5.2.1 + '@types/mdast': 4.0.4 + unist-util-is: 6.0.1 - mdast-util-to-markdown@1.5.0: + mdast-util-to-hast@13.2.1: dependencies: - '@types/mdast': 3.0.15 - '@types/unist': 2.0.11 + '@types/hast': 3.0.5 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.3.3 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.1 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.1.0 + vfile: 6.0.3 + + mdast-util-to-markdown-cjk-friendly-gfm-strikethrough@1.0.0(@types/mdast@4.0.4)(micromark-util-types@2.0.2): + dependencies: + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-to-markdown: 2.1.2 + micromark-extension-cjk-friendly-util: 3.0.1(micromark-util-types@2.0.2) + micromark-util-symbol: 2.0.1 + optionalDependencies: + '@types/mdast': 4.0.4 + transitivePeerDependencies: + - micromark-util-types + - supports-color + + mdast-util-to-markdown-cjk-friendly@1.0.0(@types/mdast@4.0.4)(micromark-util-types@2.0.2): + dependencies: + mdast-util-to-markdown: 2.1.2 + micromark-extension-cjk-friendly-util: 3.0.1(micromark-util-types@2.0.2) + micromark-util-symbol: 2.0.1 + optionalDependencies: + '@types/mdast': 4.0.4 + transitivePeerDependencies: + - micromark-util-types + + mdast-util-to-markdown@2.1.2: + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 longest-streak: 3.1.0 - mdast-util-phrasing: 3.0.1 - mdast-util-to-string: 3.2.0 - micromark-util-decode-string: 1.1.0 - unist-util-visit: 4.1.2 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-classify-character: 2.0.1 + micromark-util-decode-string: 2.0.1 + unist-util-visit: 5.1.0 zwitch: 2.0.4 - mdast-util-to-string@3.2.0: + mdast-util-to-string@4.0.0: dependencies: - '@types/mdast': 3.0.15 + '@types/mdast': 4.0.4 + + medium-zoom@1.1.0: {} - micromark-core-commonmark@1.1.0: + micromark-core-commonmark@2.0.3: dependencies: decode-named-character-reference: 1.3.0 - micromark-factory-destination: 1.1.0 - micromark-factory-label: 1.1.0 - micromark-factory-space: 1.1.0 - micromark-factory-title: 1.1.0 - micromark-factory-whitespace: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-chunked: 1.1.0 - micromark-util-classify-character: 1.1.0 - micromark-util-html-tag-name: 1.2.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-resolve-all: 1.1.0 - micromark-util-subtokenize: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - - micromark-extension-directive@2.2.1: - dependencies: - micromark-factory-space: 1.1.0 - micromark-factory-whitespace: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - parse-entities: 4.0.2 - uvu: 0.5.6 + devlop: 1.1.0 + micromark-factory-destination: 2.0.1 + micromark-factory-label: 2.0.1 + micromark-factory-space: 2.0.1 + micromark-factory-title: 2.0.1 + micromark-factory-whitespace: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-html-tag-name: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-cjk-friendly-gfm-strikethrough@2.0.1(micromark-util-types@2.0.2)(micromark@4.0.2): + dependencies: + devlop: 1.1.0 + get-east-asian-width: 1.6.0 + micromark: 4.0.2 + micromark-extension-cjk-friendly-util: 3.0.1(micromark-util-types@2.0.2) + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + optionalDependencies: + micromark-util-types: 2.0.2 + + micromark-extension-cjk-friendly-util@3.0.1(micromark-util-types@2.0.2): + dependencies: + get-east-asian-width: 1.6.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + optionalDependencies: + micromark-util-types: 2.0.2 + + micromark-extension-cjk-friendly@2.0.1(micromark-util-types@2.0.2)(micromark@4.0.2): + dependencies: + devlop: 1.1.0 + micromark: 4.0.2 + micromark-extension-cjk-friendly-util: 3.0.1(micromark-util-types@2.0.2) + micromark-util-chunked: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + optionalDependencies: + micromark-util-types: 2.0.2 + + micromark-extension-gfm-autolink-literal@2.1.0: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-footnote@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-strikethrough@2.1.0: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-classify-character: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-extension-gfm-table@2.1.1: + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - micromark-extension-frontmatter@1.1.1: + micromark-extension-gfm-tagfilter@2.0.0: dependencies: - fault: 2.0.1 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 + micromark-util-types: 2.0.2 - micromark-extension-gfm-autolink-literal@1.0.5: + micromark-extension-gfm-task-list-item@2.1.0: dependencies: - micromark-util-character: 1.2.0 - micromark-util-sanitize-uri: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - micromark-extension-gfm-footnote@1.1.2: + micromark-extension-gfm@3.0.0: dependencies: - micromark-core-commonmark: 1.1.0 - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-sanitize-uri: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 + micromark-extension-gfm-autolink-literal: 2.1.0 + micromark-extension-gfm-footnote: 2.1.0 + micromark-extension-gfm-strikethrough: 2.1.0 + micromark-extension-gfm-table: 2.1.1 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.1.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 - micromark-extension-gfm-strikethrough@1.0.7: + micromark-extension-mdx-expression@3.0.1: dependencies: - micromark-util-chunked: 1.1.0 - micromark-util-classify-character: 1.1.0 - micromark-util-resolve-all: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 + '@types/estree': 1.0.9 + devlop: 1.1.0 + micromark-factory-mdx-expression: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - micromark-extension-gfm-table@1.0.7: + micromark-extension-mdx-jsx@3.0.2: dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 + '@types/estree': 1.0.9 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + micromark-factory-mdx-expression: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + vfile-message: 4.0.3 - micromark-extension-gfm-tagfilter@1.0.2: + micromark-extension-mdx-md@2.0.0: dependencies: - micromark-util-types: 1.1.0 + micromark-util-types: 2.0.2 - micromark-extension-gfm-task-list-item@1.0.5: + micromark-extension-mdxjs-esm@3.0.0: dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 + '@types/estree': 1.0.9 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.3 - micromark-extension-gfm@2.0.3: + micromark-extension-mdxjs@3.0.0: dependencies: - micromark-extension-gfm-autolink-literal: 1.0.5 - micromark-extension-gfm-footnote: 1.1.2 - micromark-extension-gfm-strikethrough: 1.0.7 - micromark-extension-gfm-table: 1.0.7 - micromark-extension-gfm-tagfilter: 1.0.2 - micromark-extension-gfm-task-list-item: 1.0.5 - micromark-util-combine-extensions: 1.1.0 - micromark-util-types: 1.1.0 + acorn: 8.17.0 + acorn-jsx: 5.3.2(acorn@8.17.0) + micromark-extension-mdx-expression: 3.0.1 + micromark-extension-mdx-jsx: 3.0.2 + micromark-extension-mdx-md: 2.0.0 + micromark-extension-mdxjs-esm: 3.0.0 + micromark-util-combine-extensions: 2.0.1 + micromark-util-types: 2.0.2 - micromark-extension-math@2.1.2: + micromark-factory-destination@2.0.1: dependencies: - '@types/katex': 0.16.8 - katex: 0.16.47 - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - micromark-factory-destination@1.1.0: + micromark-factory-label@2.0.1: dependencies: - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - micromark-factory-label@1.1.0: + micromark-factory-mdx-expression@2.0.3: dependencies: - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 + '@types/estree': 1.0.9 + devlop: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-events-to-acorn: 2.0.3 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.3 - micromark-factory-space@1.1.0: + micromark-factory-space@2.0.1: dependencies: - micromark-util-character: 1.2.0 - micromark-util-types: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 - micromark-factory-title@1.1.0: + micromark-factory-title@2.0.1: dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - micromark-factory-whitespace@1.1.0: + micromark-factory-whitespace@2.0.1: dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - micromark-util-character@1.2.0: + micromark-util-character@2.1.1: dependencies: - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - micromark-util-chunked@1.1.0: + micromark-util-chunked@2.0.1: dependencies: - micromark-util-symbol: 1.1.0 + micromark-util-symbol: 2.0.1 - micromark-util-classify-character@1.1.0: + micromark-util-classify-character@2.0.1: dependencies: - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - micromark-util-combine-extensions@1.1.0: + micromark-util-combine-extensions@2.0.1: dependencies: - micromark-util-chunked: 1.1.0 - micromark-util-types: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 - micromark-util-decode-numeric-character-reference@1.1.0: + micromark-util-decode-numeric-character-reference@2.0.2: dependencies: - micromark-util-symbol: 1.1.0 + micromark-util-symbol: 2.0.1 - micromark-util-decode-string@1.1.0: + micromark-util-decode-string@2.0.1: dependencies: decode-named-character-reference: 1.3.0 - micromark-util-character: 1.2.0 - micromark-util-decode-numeric-character-reference: 1.1.0 - micromark-util-symbol: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-symbol: 2.0.1 - micromark-util-encode@1.1.0: {} + micromark-util-encode@2.0.1: {} + + micromark-util-events-to-acorn@2.0.3: + dependencies: + '@types/estree': 1.0.9 + '@types/unist': 3.0.3 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + vfile-message: 4.0.3 - micromark-util-html-tag-name@1.2.0: {} + micromark-util-html-tag-name@2.0.1: {} - micromark-util-normalize-identifier@1.1.0: + micromark-util-normalize-identifier@2.0.1: dependencies: - micromark-util-symbol: 1.1.0 + micromark-util-symbol: 2.0.1 - micromark-util-resolve-all@1.1.0: + micromark-util-resolve-all@2.0.1: dependencies: - micromark-util-types: 1.1.0 + micromark-util-types: 2.0.2 - micromark-util-sanitize-uri@1.2.0: + micromark-util-sanitize-uri@2.0.1: dependencies: - micromark-util-character: 1.2.0 - micromark-util-encode: 1.1.0 - micromark-util-symbol: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 - micromark-util-subtokenize@1.1.0: + micromark-util-subtokenize@2.1.0: dependencies: - micromark-util-chunked: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 + devlop: 1.1.0 + micromark-util-chunked: 2.0.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 - micromark-util-symbol@1.1.0: {} + micromark-util-symbol@2.0.1: {} - micromark-util-types@1.1.0: {} + micromark-util-types@2.0.2: {} - micromark@3.2.0: + micromark@4.0.2: dependencies: '@types/debug': 4.1.13 debug: 4.4.3 decode-named-character-reference: 1.3.0 - micromark-core-commonmark: 1.1.0 - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-chunked: 1.1.0 - micromark-util-combine-extensions: 1.1.0 - micromark-util-decode-numeric-character-reference: 1.1.0 - micromark-util-encode: 1.1.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-resolve-all: 1.1.0 - micromark-util-sanitize-uri: 1.2.0 - micromark-util-subtokenize: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.3 + micromark-factory-space: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-combine-extensions: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.2 + micromark-util-encode: 2.0.1 + micromark-util-normalize-identifier: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromark-util-subtokenize: 2.1.0 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 transitivePeerDependencies: - supports-color minimatch@10.2.5: dependencies: - brace-expansion: 5.0.6 + brace-expansion: 5.0.8 mlly@1.8.2: dependencies: @@ -2568,16 +3734,24 @@ snapshots: pkg-types: 1.3.1 ufo: 1.6.4 - mri@1.2.0: {} - ms@2.1.3: {} - nanoid@3.3.12: {} + nanoid@3.3.16: {} natural-compare@1.4.0: {} + nprogress@0.2.0: {} + obug@2.1.3: {} + oniguruma-parser@0.12.2: {} + + oniguruma-to-es@4.3.6: + dependencies: + oniguruma-parser: 0.12.2 + regex: 6.1.0 + regex-recursion: 6.0.2 + optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -2605,6 +3779,10 @@ snapshots: is-decimal: 2.0.1 is-hexadecimal: 2.0.1 + parse5@7.3.0: + dependencies: + entities: 6.0.1 + path-browserify@1.0.1: {} path-exists@4.0.0: {} @@ -2615,7 +3793,7 @@ snapshots: picocolors@1.1.1: {} - picomatch@4.0.4: {} + picomatch@4.0.5: {} pkg-types@1.3.1: dependencies: @@ -2629,158 +3807,301 @@ snapshots: exsolve: 1.0.8 pathe: 2.0.3 - postcss@8.5.15: + postcss@8.5.23: dependencies: - nanoid: 3.3.12 + nanoid: 3.3.16 picocolors: 1.1.1 source-map-js: 1.2.1 prelude-ls@1.2.1: {} - prettier@3.8.4: {} + prettier@3.9.6: {} + + property-information@7.2.0: {} punycode@2.3.1: {} quansync@0.2.11: {} - remark-directive@2.0.1: + react-dom@19.2.8(react@19.2.8): dependencies: - '@types/mdast': 3.0.15 - mdast-util-directive: 2.2.4 - micromark-extension-directive: 2.2.1 - unified: 10.1.2 - transitivePeerDependencies: - - supports-color + react: 19.2.8 + scheduler: 0.27.0 + + react-lazy-with-preload@2.2.1: {} - remark-frontmatter@4.0.1: + react-reconciler@0.33.0(react@19.2.8): dependencies: - '@types/mdast': 3.0.15 - mdast-util-frontmatter: 1.0.1 - micromark-extension-frontmatter: 1.1.1 - unified: 10.1.2 + react: 19.2.8 + scheduler: 0.27.0 + + react-refresh@0.18.0: {} - remark-gfm@3.0.1: + react-render-to-markdown@19.1.0(react@19.2.8): dependencies: - '@types/mdast': 3.0.15 - mdast-util-gfm: 2.0.2 - micromark-extension-gfm: 2.0.3 - unified: 10.1.2 + react: 19.2.8 + react-reconciler: 0.33.0(react@19.2.8) + + react-router-dom@7.18.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8): + dependencies: + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + react-router: 7.18.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + + react-router@7.18.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8): + dependencies: + cookie: 1.1.1 + react: 19.2.8 + set-cookie-parser: 2.7.2 + optionalDependencies: + react-dom: 19.2.8(react@19.2.8) + + react@19.2.8: {} + + recma-build-jsx@1.0.0: + dependencies: + '@types/estree': 1.0.9 + estree-util-build-jsx: 3.0.1 + vfile: 6.0.3 + + recma-jsx@1.0.1(acorn@8.17.0): + dependencies: + acorn: 8.17.0 + acorn-jsx: 5.3.2(acorn@8.17.0) + estree-util-to-js: 2.0.0 + recma-parse: 1.0.0 + recma-stringify: 1.0.0 + unified: 11.0.5 + + recma-parse@1.0.0: + dependencies: + '@types/estree': 1.0.9 + esast-util-from-js: 2.0.1 + unified: 11.0.5 + vfile: 6.0.3 + + recma-stringify@1.0.0: + dependencies: + '@types/estree': 1.0.9 + estree-util-to-js: 2.0.0 + unified: 11.0.5 + vfile: 6.0.3 + + regex-recursion@6.0.2: + dependencies: + regex-utilities: 2.3.0 + + regex-utilities@2.3.0: {} + + regex@6.1.0: + dependencies: + regex-utilities: 2.3.0 + + rehype-external-links@3.0.0: + dependencies: + '@types/hast': 3.0.5 + '@ungap/structured-clone': 1.3.3 + hast-util-is-element: 3.0.0 + is-absolute-url: 4.0.1 + space-separated-tokens: 2.0.2 + unist-util-visit: 5.1.0 + + rehype-raw@7.0.0: + dependencies: + '@types/hast': 3.0.5 + hast-util-raw: 9.1.0 + vfile: 6.0.3 + + rehype-recma@1.0.0: + dependencies: + '@types/estree': 1.0.9 + '@types/hast': 3.0.5 + hast-util-to-estree: 3.1.3 transitivePeerDependencies: - supports-color - remark-math@5.1.1: + remark-cjk-friendly-gfm-strikethrough@2.3.1(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2)(unified@11.0.5): dependencies: - '@types/mdast': 3.0.15 - mdast-util-math: 2.0.2 - micromark-extension-math: 2.1.2 - unified: 10.1.2 + mdast-util-to-markdown-cjk-friendly-gfm-strikethrough: 1.0.0(@types/mdast@4.0.4)(micromark-util-types@2.0.2) + micromark-extension-cjk-friendly-gfm-strikethrough: 2.0.1(micromark-util-types@2.0.2)(micromark@4.0.2) + unified: 11.0.5 + optionalDependencies: + '@types/mdast': 4.0.4 + transitivePeerDependencies: + - micromark + - micromark-util-types + - supports-color - remark-parse@10.0.2: + remark-cjk-friendly@2.3.1(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2)(unified@11.0.5): dependencies: - '@types/mdast': 3.0.15 - mdast-util-from-markdown: 1.3.1 - unified: 10.1.2 + mdast-util-to-markdown-cjk-friendly: 1.0.0(@types/mdast@4.0.4)(micromark-util-types@2.0.2) + micromark-extension-cjk-friendly: 2.0.1(micromark-util-types@2.0.2)(micromark@4.0.2) + unified: 11.0.5 + optionalDependencies: + '@types/mdast': 4.0.4 + transitivePeerDependencies: + - micromark + - micromark-util-types + + remark-gfm@4.0.1: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-gfm: 3.1.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.5 transitivePeerDependencies: - supports-color - remark-stringify@10.0.3: + remark-mdx@3.1.1: dependencies: - '@types/mdast': 3.0.15 - mdast-util-to-markdown: 1.5.0 - unified: 10.1.2 + mdast-util-mdx: 3.0.0 + micromark-extension-mdxjs: 3.0.0 + transitivePeerDependencies: + - supports-color - remark@14.0.3: + remark-parse@11.0.0: dependencies: - '@types/mdast': 3.0.15 - remark-parse: 10.0.2 - remark-stringify: 10.0.3 - unified: 10.1.2 + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.3 + micromark-util-types: 2.0.2 + unified: 11.0.5 transitivePeerDependencies: - supports-color - rolldown@1.0.3: + remark-rehype@11.1.2: + dependencies: + '@types/hast': 3.0.5 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.2.1 + unified: 11.0.5 + vfile: 6.0.3 + + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.4 + mdast-util-to-markdown: 2.1.2 + unified: 11.0.5 + + rolldown@1.1.5: dependencies: - '@oxc-project/types': 0.133.0 + '@oxc-project/types': 0.139.0 '@rolldown/pluginutils': 1.0.1 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.3 - '@rolldown/binding-darwin-arm64': 1.0.3 - '@rolldown/binding-darwin-x64': 1.0.3 - '@rolldown/binding-freebsd-x64': 1.0.3 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.3 - '@rolldown/binding-linux-arm64-gnu': 1.0.3 - '@rolldown/binding-linux-arm64-musl': 1.0.3 - '@rolldown/binding-linux-ppc64-gnu': 1.0.3 - '@rolldown/binding-linux-s390x-gnu': 1.0.3 - '@rolldown/binding-linux-x64-gnu': 1.0.3 - '@rolldown/binding-linux-x64-musl': 1.0.3 - '@rolldown/binding-openharmony-arm64': 1.0.3 - '@rolldown/binding-wasm32-wasi': 1.0.3 - '@rolldown/binding-win32-arm64-msvc': 1.0.3 - '@rolldown/binding-win32-x64-msvc': 1.0.3 - - sade@1.8.1: - dependencies: - mri: 1.2.0 + '@rolldown/binding-android-arm64': 1.1.5 + '@rolldown/binding-darwin-arm64': 1.1.5 + '@rolldown/binding-darwin-x64': 1.1.5 + '@rolldown/binding-freebsd-x64': 1.1.5 + '@rolldown/binding-linux-arm-gnueabihf': 1.1.5 + '@rolldown/binding-linux-arm64-gnu': 1.1.5 + '@rolldown/binding-linux-arm64-musl': 1.1.5 + '@rolldown/binding-linux-ppc64-gnu': 1.1.5 + '@rolldown/binding-linux-s390x-gnu': 1.1.5 + '@rolldown/binding-linux-x64-gnu': 1.1.5 + '@rolldown/binding-linux-x64-musl': 1.1.5 + '@rolldown/binding-openharmony-arm64': 1.1.5 + '@rolldown/binding-wasm32-wasi': 1.1.5 + '@rolldown/binding-win32-arm64-msvc': 1.1.5 + '@rolldown/binding-win32-x64-msvc': 1.1.5 + + scheduler@0.27.0: {} + + scroll-into-view-if-needed@3.1.0: + dependencies: + compute-scroll-into-view: 3.1.1 semver@7.8.4: {} + set-cookie-parser@2.7.2: {} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 shebang-regex@3.0.0: {} + shiki@4.3.1: + dependencies: + '@shikijs/core': 4.3.1 + '@shikijs/engine-javascript': 4.3.1 + '@shikijs/engine-oniguruma': 4.3.1 + '@shikijs/langs': 4.3.1 + '@shikijs/themes': 4.3.1 + '@shikijs/types': 4.3.1 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.5 + siginfo@2.0.0: {} + simple-git-hooks@2.13.1: {} + source-map-js@1.2.1: {} + source-map@0.7.6: {} + + space-separated-tokens@2.0.2: {} + stackback@0.0.2: {} std-env@4.1.0: {} + string-argv@0.3.2: {} + stringify-entities@4.0.4: dependencies: character-entities-html4: 2.1.0 character-entities-legacy: 3.0.0 + style-to-js@1.1.21: + dependencies: + style-to-object: 1.0.14 + + style-to-object@1.0.14: + dependencies: + inline-style-parser: 0.2.7 + tinybench@2.9.0: {} tinyexec@1.2.4: {} tinyglobby@0.2.17: dependencies: - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 tinyrainbow@3.1.0: {} + toggle-selection@1.0.6: {} + + trim-lines@3.0.1: {} + trough@2.2.0: {} ts-api-utils@2.5.0(typescript@6.0.3): dependencies: typescript: 6.0.3 - tslib@2.8.1: - optional: true + tslib@2.8.1: {} - tsx@4.22.4: + tsx@4.23.1: dependencies: esbuild: 0.28.1 optionalDependencies: fsevents: 2.3.3 + optional: true type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - typescript-eslint@8.61.1(eslint@10.5.0)(typescript@6.0.3): + typescript-eslint@8.65.0(eslint@10.8.0)(typescript@6.0.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.61.1(@typescript-eslint/parser@8.61.1(eslint@10.5.0)(typescript@6.0.3))(eslint@10.5.0)(typescript@6.0.3) - '@typescript-eslint/parser': 8.61.1(eslint@10.5.0)(typescript@6.0.3) - '@typescript-eslint/typescript-estree': 8.61.1(typescript@6.0.3) - '@typescript-eslint/utils': 8.61.1(eslint@10.5.0)(typescript@6.0.3) - eslint: 10.5.0 + '@typescript-eslint/eslint-plugin': 8.65.0(@typescript-eslint/parser@8.65.0(eslint@10.8.0)(typescript@6.0.3))(eslint@10.8.0)(typescript@6.0.3) + '@typescript-eslint/parser': 8.65.0(eslint@10.8.0)(typescript@6.0.3) + '@typescript-eslint/typescript-estree': 8.65.0(typescript@6.0.3) + '@typescript-eslint/utils': 8.65.0(eslint@10.8.0)(typescript@6.0.3) + eslint: 10.8.0 typescript: 6.0.3 transitivePeerDependencies: - supports-color @@ -2789,38 +4110,60 @@ snapshots: ufo@1.6.4: {} - undici-types@7.24.6: {} + undici-types@6.21.0: {} - unified@10.1.2: + unhead@2.1.16: dependencies: - '@types/unist': 2.0.11 + hookable: 6.1.1 + + unified@11.0.5: + dependencies: + '@types/unist': 3.0.3 bail: 2.0.2 + devlop: 1.1.0 extend: 3.0.2 - is-buffer: 2.0.5 is-plain-obj: 4.1.0 trough: 2.2.0 - vfile: 5.3.7 + vfile: 6.0.3 - unist-util-is@5.2.1: + unist-util-is@6.0.1: dependencies: - '@types/unist': 2.0.11 + '@types/unist': 3.0.3 - unist-util-stringify-position@3.0.3: + unist-util-position-from-estree@2.0.0: dependencies: - '@types/unist': 2.0.11 + '@types/unist': 3.0.3 - unist-util-visit-parents@5.1.3: + unist-util-position@5.0.0: dependencies: - '@types/unist': 2.0.11 - unist-util-is: 5.2.1 + '@types/unist': 3.0.3 - unist-util-visit@4.1.2: + unist-util-remove@4.0.0: dependencies: - '@types/unist': 2.0.11 - unist-util-is: 5.2.1 - unist-util-visit-parents: 5.1.3 + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + unist-util-visit-children@3.0.0: + dependencies: + '@types/unist': 3.0.3 - unplugin-dts@1.0.2(esbuild@0.28.1)(rolldown@1.0.3)(typescript@6.0.3)(vite@8.0.16(@types/node@25.9.3)(esbuild@0.28.1)(tsx@4.22.4)): + unist-util-visit-parents@6.0.2: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + + unist-util-visit@5.1.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-is: 6.0.1 + unist-util-visit-parents: 6.0.2 + + unplugin-dts@1.0.3(esbuild@0.28.1)(rolldown@1.1.5)(typescript@6.0.3)(vite@8.1.5(@types/node@22.20.1)(esbuild@0.28.1)(tsx@4.23.1)(yaml@2.9.0)): dependencies: '@rollup/pluginutils': 5.4.0 '@volar/typescript': 2.4.28 @@ -2833,8 +4176,8 @@ snapshots: unplugin: 2.3.11 optionalDependencies: esbuild: 0.28.1 - rolldown: 1.0.3 - vite: 8.0.16(@types/node@25.9.3)(esbuild@0.28.1)(tsx@4.22.4) + rolldown: 1.1.5 + vite: 8.1.5(@types/node@22.20.1)(esbuild@0.28.1)(tsx@4.23.1)(yaml@2.9.0) transitivePeerDependencies: - supports-color @@ -2842,37 +4185,33 @@ snapshots: dependencies: '@jridgewell/remapping': 2.3.5 acorn: 8.17.0 - picomatch: 4.0.4 + picomatch: 4.0.5 webpack-virtual-modules: 0.6.2 uri-js@4.4.1: dependencies: punycode: 2.3.1 - uvu@0.5.6: + vfile-location@5.0.3: dependencies: - dequal: 2.0.3 - diff: 5.2.2 - kleur: 4.1.5 - sade: 1.8.1 + '@types/unist': 3.0.3 + vfile: 6.0.3 - vfile-message@3.1.4: + vfile-message@4.0.3: dependencies: - '@types/unist': 2.0.11 - unist-util-stringify-position: 3.0.3 + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 - vfile@5.3.7: + vfile@6.0.3: dependencies: - '@types/unist': 2.0.11 - is-buffer: 2.0.5 - unist-util-stringify-position: 3.0.3 - vfile-message: 3.1.4 + '@types/unist': 3.0.3 + vfile-message: 4.0.3 - vite-plugin-dts@5.0.2(esbuild@0.28.1)(rolldown@1.0.3)(typescript@6.0.3)(vite@8.0.16(@types/node@25.9.3)(esbuild@0.28.1)(tsx@4.22.4)): + vite-plugin-dts@5.0.3(esbuild@0.28.1)(rolldown@1.1.5)(typescript@6.0.3)(vite@8.1.5(@types/node@22.20.1)(esbuild@0.28.1)(tsx@4.23.1)(yaml@2.9.0)): dependencies: - unplugin-dts: 1.0.2(esbuild@0.28.1)(rolldown@1.0.3)(typescript@6.0.3)(vite@8.0.16(@types/node@25.9.3)(esbuild@0.28.1)(tsx@4.22.4)) + unplugin-dts: 1.0.3(esbuild@0.28.1)(rolldown@1.1.5)(typescript@6.0.3)(vite@8.1.5(@types/node@22.20.1)(esbuild@0.28.1)(tsx@4.23.1)(yaml@2.9.0)) optionalDependencies: - vite: 8.0.16(@types/node@25.9.3)(esbuild@0.28.1)(tsx@4.22.4) + vite: 8.1.5(@types/node@22.20.1)(esbuild@0.28.1)(tsx@4.23.1)(yaml@2.9.0) transitivePeerDependencies: - '@rspack/core' - '@vue/language-core' @@ -2882,48 +4221,51 @@ snapshots: - typescript - webpack - vite@8.0.16(@types/node@25.9.3)(esbuild@0.28.1)(tsx@4.22.4): + vite@8.1.5(@types/node@22.20.1)(esbuild@0.28.1)(tsx@4.23.1)(yaml@2.9.0): dependencies: lightningcss: 1.32.0 - picomatch: 4.0.4 - postcss: 8.5.15 - rolldown: 1.0.3 + picomatch: 4.0.5 + postcss: 8.5.23 + rolldown: 1.1.5 tinyglobby: 0.2.17 optionalDependencies: - '@types/node': 25.9.3 + '@types/node': 22.20.1 esbuild: 0.28.1 fsevents: 2.3.3 - tsx: 4.22.4 - - vitest@4.1.9(@types/node@25.9.3)(vite@8.0.16(@types/node@25.9.3)(esbuild@0.28.1)(tsx@4.22.4)): - dependencies: - '@vitest/expect': 4.1.9 - '@vitest/mocker': 4.1.9(vite@8.0.16(@types/node@25.9.3)(esbuild@0.28.1)(tsx@4.22.4)) - '@vitest/pretty-format': 4.1.9 - '@vitest/runner': 4.1.9 - '@vitest/snapshot': 4.1.9 - '@vitest/spy': 4.1.9 - '@vitest/utils': 4.1.9 + tsx: 4.23.1 + yaml: 2.9.0 + + vitest@4.1.10(@types/node@22.20.1)(vite@8.1.5(@types/node@22.20.1)(esbuild@0.28.1)(tsx@4.23.1)(yaml@2.9.0)): + dependencies: + '@vitest/expect': 4.1.10 + '@vitest/mocker': 4.1.10(vite@8.1.5(@types/node@22.20.1)(esbuild@0.28.1)(tsx@4.23.1)(yaml@2.9.0)) + '@vitest/pretty-format': 4.1.10 + '@vitest/runner': 4.1.10 + '@vitest/snapshot': 4.1.10 + '@vitest/spy': 4.1.10 + '@vitest/utils': 4.1.10 es-module-lexer: 2.1.0 expect-type: 1.3.0 magic-string: 0.30.21 obug: 2.1.3 pathe: 2.0.3 - picomatch: 4.0.4 + picomatch: 4.0.5 std-env: 4.1.0 tinybench: 2.9.0 tinyexec: 1.2.4 tinyglobby: 0.2.17 tinyrainbow: 3.1.0 - vite: 8.0.16(@types/node@25.9.3)(esbuild@0.28.1)(tsx@4.22.4) + vite: 8.1.5(@types/node@22.20.1)(esbuild@0.28.1)(tsx@4.23.1)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 25.9.3 + '@types/node': 22.20.1 transitivePeerDependencies: - msw vscode-uri@3.1.0: {} + web-namespaces@2.0.1: {} + webpack-virtual-modules@0.6.2: {} which@2.0.2: @@ -2937,6 +4279,9 @@ snapshots: word-wrap@1.2.5: {} + yaml@2.9.0: + optional: true + yocto-queue@0.1.0: {} zwitch@2.0.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 5ed0b5a..0a9588a 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,2 +1,9 @@ +packages: + - packages/* + - docs + allowBuilds: esbuild: true + simple-git-hooks: true +minimumReleaseAgeExclude: + - brace-expansion@5.0.7 || 5.0.8 diff --git a/release-please-config.json b/release-please-config.json new file mode 100644 index 0000000..0922f4d --- /dev/null +++ b/release-please-config.json @@ -0,0 +1,8 @@ +{ + "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json", + "release-type": "node", + "include-component-in-tag": false, + "packages": { + "packages/prettier-plugin-lint-md": {} + } +} diff --git a/skills-lock.json b/skills-lock.json new file mode 100644 index 0000000..a6d890f --- /dev/null +++ b/skills-lock.json @@ -0,0 +1,23 @@ +{ + "version": 1, + "skills": { + "chinese-article-writing": { + "source": "bosens-China/my-skills", + "sourceType": "github", + "skillPath": "skills/chinese-article-writing/SKILL.md", + "computedHash": "73804701320943f1af7ccb99a6eb68c7c821110250070a1ac5f1161c6927cd6a" + }, + "git-step-commit": { + "source": "bosens-China/my-skills", + "sourceType": "github", + "skillPath": "skills/git-step-commit/SKILL.md", + "computedHash": "018408e51254dddcab7aa5af3ceea1a3ec4fff2b36dbb9d55963c33368f2f766" + }, + "publish-npm-packages": { + "source": "bosens-China/my-skills", + "sourceType": "github", + "skillPath": "skills/publish-npm-packages/SKILL.md", + "computedHash": "e819d4f1f80afed4c2942f3db1bb55b01ab0c884b53e28006949be8367708a97" + } + } +}