From 1c7ad29e1f43b257550d6faa1be0549beeba7f28 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Tue, 11 Aug 2026 14:45:37 +0800 Subject: [PATCH 001/106] chore: initial project --- .github/renovate.json5 | 18 + .github/workflows/autofix.yml | 30 + .github/workflows/ci.yml | 25 + .github/workflows/pr-contributor-welcome.yml | 37 + .github/workflows/release.yml | 25 + .gitignore | 145 + README.md | 115 + eslint.config.ts | 24 + package.json | 70 + pnpm-lock.yaml | 3803 ++++++++++++++++++ pnpm-workspace.yaml | 7 + tsconfig.json | 22 + 12 files changed, 4321 insertions(+) create mode 100644 .github/renovate.json5 create mode 100644 .github/workflows/autofix.yml create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/pr-contributor-welcome.yml create mode 100644 .github/workflows/release.yml create mode 100644 .gitignore create mode 100644 README.md create mode 100644 eslint.config.ts create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 pnpm-workspace.yaml create mode 100644 tsconfig.json diff --git a/.github/renovate.json5 b/.github/renovate.json5 new file mode 100644 index 0000000..f7217b0 --- /dev/null +++ b/.github/renovate.json5 @@ -0,0 +1,18 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": ["config:recommended", "schedule:weekly"], + "enabledManagers": ["github-actions"], + "packageRules": [ + { + "matchManagers": ["github-actions"], + "matchDepTypes": [ + "docker", + "container", + "service", + "github-runner", + "uses-with" + ], + "enabled": false + } + ] +} diff --git a/.github/workflows/autofix.yml b/.github/workflows/autofix.yml new file mode 100644 index 0000000..b572a58 --- /dev/null +++ b/.github/workflows/autofix.yml @@ -0,0 +1,30 @@ +name: autofix.ci + +on: + pull_request: +permissions: + contents: write + +jobs: + autofix: + runs-on: ubuntu-latest + timeout-minutes: 10 + + steps: + - uses: actions/checkout@v7 + + - name: Use Node.js lts/* + uses: actions/setup-node@v7 + with: + node-version: lts/* + + - name: Install pnpm + uses: pnpm/action-setup@v6 + + - name: Install + run: pnpm i + + - name: Lint + run: pnpm run lint:fix + + - uses: autofix-ci/action@635ffb0c9798bd160680f18fd73371e355b85f27 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..a4a14a1 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,25 @@ +name: CI + +on: + pull_request: + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + + - name: Install pnpm + uses: pnpm/action-setup@v6 + + - name: Set node + uses: actions/setup-node@v7 + with: + node-version: lts/* + cache: pnpm + + - name: Install + run: pnpm i + + - name: Lint + run: pnpm run lint diff --git a/.github/workflows/pr-contributor-welcome.yml b/.github/workflows/pr-contributor-welcome.yml new file mode 100644 index 0000000..3da6e24 --- /dev/null +++ b/.github/workflows/pr-contributor-welcome.yml @@ -0,0 +1,37 @@ +name: PullRequest Contributor Welcome + +on: + pull_request_target: + types: + - closed +# paths: +# - 'components/**' + +permissions: + contents: read + +jobs: + comment: + permissions: + issues: write # for actions-cool/maintain-one-comment to modify or create issue comments + pull-requests: write # for actions-cool/maintain-one-comment to modify or create PR comments + if: github.event.pull_request.merged == true && github.repository == 'antdv-next/cli' + runs-on: ubuntu-latest + steps: + - name: get commit count + id: get_commit_count + run: | + PR_AUTHOR=$(echo "${{ github.event.pull_request.user.login }}") + RESULT_DATA=$(curl -s "https://api.github.com/repos/${{ github.repository }}/commits?author=${PR_AUTHOR}&per_page=5") + DATA_LENGTH=$(echo $RESULT_DATA | jq 'if type == "array" then length else 0 end') + echo "COUNT=$DATA_LENGTH" >> $GITHUB_OUTPUT + - name: Comment on PR + if: steps.get_commit_count.outputs.COUNT < 3 + uses: actions-cool/maintain-one-comment-backup@fbbc22ad1809c1bcf46f19b58397b6254773588c + with: + token: ${{ secrets.GITHUB_TOKEN }} + body: | + 🎉 Thx for the PR @${{ github.event.pull_request.user.login }} + + + body-include: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..206c6bf --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,25 @@ +name: Release + +permissions: + contents: write + +on: + push: + tags: + - 'v*' + +jobs: + release: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + with: + fetch-depth: 0 + + - uses: actions/setup-node@v6 + with: + node-version: lts/* + + - run: npx genereleaselog + env: + GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b3a4b98 --- /dev/null +++ b/.gitignore @@ -0,0 +1,145 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.* +!.env.example + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist +.output + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp directory +.temp + +# Sveltekit cache directory +.svelte-kit/ + +# vitepress build output +**/.vitepress/dist + +# vitepress cache directory +**/.vitepress/cache + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# Firebase cache directory +.firebase/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# pnpm +.pnpm-store + +# yarn v3 +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/sdks +!.yarn/versions + +# Vite files +vite.config.js.timestamp-* +vite.config.ts.timestamp-* +.vite/ + +.idea \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..3761d87 --- /dev/null +++ b/README.md @@ -0,0 +1,115 @@ +
+ +
+ +Antdv Next + +

Antdv Next CLI

+ +**命令行上的 Antdv Next。**
+查询组件知识、分析项目用量、指导版本迁移 — 完全离线。 + +
+ +
+ +## 🤔 为什么 + +Code Agent(Claude Code、Codex、Gemini CLI)在拥有即时 API 数据访问能力时,能写出更好的 antdv next 代码。这个 CLI +正是为此而生 — antdv next 的每个 Prop、Token、Demo 和 Changelog 条目,本地打包,毫秒级查询。 + +```bash +npx skills add antdv-next/antdv-next-cli # install as an agent skill +``` + +
+ +## ✨ 亮点 + +- 📦 **完全离线** — 所有元数据随包安装,无需网络请求,无延迟,无 API Key。 +- 🤖 **Agent 优化** — 所有命令支持 `--format json`。结构化错误码与修复建议。stdout/stderr 严格分离。 +- 🌍 **双语输出** — 每个组件名、描述和文档均有中英文。通过 `--lang zh` 切换。 +- 🔮 **智能纠错** — 输入 `Buttn`?CLI 基于 Levenshtein 距离建议 `Button`,优先匹配首字母相同的候选。 +- 🔌 **MCP 服务** — `antd mcp` 启动 stdio 服务,原生集成 Claude Desktop、Cursor 等 IDE。 + +## 📦 安装 + +```bash +npm install -g @antdv-next/cli +``` + +
+其他包管理器 + +```bash +pnpm add -g @antdv-next/cli +bun add -g @antdv-next/cli +``` + +
+ +
+ +## 🤖 Agent 集成 + +CLI 内置 [Skill 文件](./skills/antdv-next/SKILL.md),指导 Code Agent 在正确的时机调用正确的命令: + +```bash +npx skills add antdv-next/cli +``` + +或者直接告诉你的 Code Agent: + +> 安装 `@antdv-next/cli` 和 `antdv-next/cli` 的 antdv next skill + +Agent 会自动完成 `npm install`、`npx skills add`,并开始使用 CLI。 + +### MCP 服务 + +支持 [Model Context Protocol](https://modelcontextprotocol.io) 的 IDE 可直接将 CLI 作为 MCP 服务使用: + +```json +{ + "mcpServers": { + "antd": { + "command": "antd", + "args": ["mcp"] + } + } +} +``` + +如需固定 antd 版本,在 `args` 数组中添加 `"--version", "5.20.0"`。 + +提供 8 个工具(`antdv_list`、`antdv_info`、`antdv_doc`、`antdv_demo`、`antdv_token`、`antdv_design_md`、`antdv_semantic`、`antdv_changelog`)和 2 个提示词(`antdv-expert`、`antdv-page-generator`)。 + +支持 [Claude Code](https://claude.ai/code)、[Cursor](https://cursor.sh)、[Codex](https://openai.com/codex)、[Gemini CLI](https://github.com/google-gemini/gemini-cli) 等所有兼容 [skills](https://github.com/nicepkg/agent-skills) 协议的 Agent。 + +
+ +## 🚀 快速开始 + +```bash +antdv list # 所有组件及版本信息 +antdv info Button # 组件 Props、类型、默认值 +antdv doc Button # 完整 Markdown 文档 +antdv demo Select basic # 可运行的 Demo 源码 +antdv token DatePicker # Design Token 值(v5+) +antdv design.md # 设计语言文档(design.md) +antdv semantic Table # classNames / styles 结构 +antdv changelog 4.24.0 5.0.0 Select # 跨版本 API 差异对比 +antdv doctor # 诊断项目配置问题 +antdv env # 收集环境信息用于 Bug 报告 +antdv usage ./src # 分析项目中的 antd 导入 +antdv lint ./src # 检查废弃 API 和最佳实践 +antdv migrate 3 4 # v3 → v4 迁移指南 +antdv migrate 4 5 --apply ./src # 生成 Agent 迁移提示 +antdv mcp # 启动 MCP 服务,供 IDE 集成 +antdv setup --client claude # 为 AI Agent 接入 MCP/Skill +antdv upgrade # 升级 CLI 到最新版本 +``` + + +## 📄 开源协议 + +[MIT](./LICENSE) © [Antv Next](https://antdv-next.com) \ No newline at end of file diff --git a/eslint.config.ts b/eslint.config.ts new file mode 100644 index 0000000..cfad65e --- /dev/null +++ b/eslint.config.ts @@ -0,0 +1,24 @@ +import type { Linter } from 'eslint' +import antfu from '@antfu/eslint-config' + +const config = antfu({ + type: 'lib', + typescript: true, + stylistic: { + indent: 4, + quotes: 'single', + }, + rules: { + 'no-console': 'off', + 'node/prefer-global/process': 'off', + 'antfu/top-level-function': 'off', + 'regexp/no-unused-capturing-group': 'off', + }, + yaml: { + overrides: { + 'yaml/indent': ['error', 2], + }, + }, +}) as Linter.Config + +export default config diff --git a/package.json b/package.json new file mode 100644 index 0000000..8771bee --- /dev/null +++ b/package.json @@ -0,0 +1,70 @@ +{ + "name": "@antdv-next/cli", + "type": "module", + "version": "0.0.0", + "packageManager": "pnpm@11.9.0", + "description": "CLI tool for querying antd knowledge and analyzing antd usage in projects", + "author": "lonewolfyx", + "license": "MIT", + "homepage": "https://github.com/lonewolfyx/antdv-next-cli#readme", + "repository": { + "type": "git", + "url": "git+https://github.com/lonewolfyx/antdv-next-cli.git" + }, + "bugs": { + "url": "https://github.com/lonewolfyx/antdv-next-cli/issues" + }, + "keywords": [ + "antdv-next", + "ant-design-vue", + "antdv", + "cli", + "component", + "vue" + ], + "exports": { + ".": "./dist/cli.mjs", + "./package.json": "./package.json" + }, + "types": "./dist/cli.d.mts", + "bin": { + "antdv": "./bin/cli.js" + }, + "files": [ + "data", + "dist" + ], + "scripts": { + "dev": "tsdown --watch", + "build": "tsdown", + "lint": "eslint .", + "lint:fix": "eslint --fix", + "prepublishOnly": "pnpm build", + "prepare": "simple-git-hooks" + }, + "devDependencies": { + "@antfu/eslint-config": "^9.3.0", + "@lonewolfyx/tsconfig": "^0.0.6", + "@types/node": "^26.2.0", + "eslint": "^10.8.1", + "jiti": "^2.7.0", + "lint-staged": "^17.3.0", + "picocolors": "^1.1.1", + "simple-git-hooks": "^2.13.1", + "tsdown": "^0.22.14", + "tsx": "^4.23.12", + "typescript": "^6.0.3", + "verify-git-commit": "^0.0.1" + }, + "simple-git-hooks": { + "pre-commit": "npx lint-staged", + "commit-msg": "npx verify-git-commit" + }, + "lint-staged": { + "*": "eslint --fix" + }, + "publishConfig": { + "registry": "https://registry.npmjs.org", + "access": "public" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..6de8c93 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,3803 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + devDependencies: + '@antfu/eslint-config': + specifier: ^9.3.0 + version: 9.3.0(@typescript-eslint/typescript-estree@8.66.0(typescript@6.0.3))(@typescript-eslint/utils@8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(@vue/compiler-sfc@3.5.41)(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) + '@lonewolfyx/tsconfig': + specifier: ^0.0.6 + version: 0.0.6(typescript@6.0.3) + '@types/node': + specifier: ^26.2.0 + version: 26.2.0 + eslint: + specifier: ^10.8.1 + version: 10.8.1(jiti@2.7.0) + jiti: + specifier: ^2.7.0 + version: 2.7.0 + lint-staged: + specifier: ^17.3.0 + version: 17.3.0 + picocolors: + specifier: ^1.1.1 + version: 1.1.1 + simple-git-hooks: + specifier: ^2.13.1 + version: 2.13.1 + tsdown: + specifier: ^0.22.14 + version: 0.22.14(tsx@4.23.12)(typescript@6.0.3) + tsx: + specifier: ^4.23.12 + version: 4.23.12 + typescript: + specifier: ^6.0.3 + version: 6.0.3 + verify-git-commit: + specifier: ^0.0.1 + version: 0.0.1 + +packages: + + '@antfu/eslint-config@9.3.0': + resolution: {integrity: sha512-+CIC4G6MowUl1RHiT01Ah9Obo/wwVynw7uNlN8ODwEn2opo9W1KzaatCrmu4WhGGJjOkOkyT5w7kKfQ//agHrQ==} + hasBin: true + peerDependencies: + '@angular-eslint/eslint-plugin': ^21.1.0 + '@angular-eslint/eslint-plugin-template': ^21.1.0 + '@angular-eslint/template-parser': ^21.1.0 + '@eslint-react/eslint-plugin': ^5.6.0 + '@next/eslint-plugin-next': '>=15.0.0' + '@prettier/plugin-xml': ^3.4.1 + '@unocss/eslint-plugin': '>=0.50.0' + astro-eslint-parser: '>=1.0.2' + eslint: ^9.10.0 || ^10.0.0 + eslint-plugin-astro: '>=1.2.0' + eslint-plugin-erasable-syntax-only: ^0.4.2 + eslint-plugin-format: '>=0.1.0' + eslint-plugin-jsx-a11y: '>=6.10.2' + eslint-plugin-react-refresh: ^0.5.0 + eslint-plugin-solid: ^0.14.3 + eslint-plugin-svelte: '>=2.35.1' + eslint-plugin-vuejs-accessibility: ^2.4.1 + prettier-plugin-astro: ^0.14.0 + prettier-plugin-slidev: ^1.0.5 + svelte-eslint-parser: '>=0.37.0' + peerDependenciesMeta: + '@angular-eslint/eslint-plugin': + optional: true + '@angular-eslint/eslint-plugin-template': + optional: true + '@angular-eslint/template-parser': + optional: true + '@eslint-react/eslint-plugin': + optional: true + '@next/eslint-plugin-next': + optional: true + '@prettier/plugin-xml': + optional: true + '@unocss/eslint-plugin': + optional: true + astro-eslint-parser: + optional: true + eslint-plugin-astro: + optional: true + eslint-plugin-erasable-syntax-only: + optional: true + eslint-plugin-format: + optional: true + eslint-plugin-jsx-a11y: + optional: true + eslint-plugin-react-refresh: + optional: true + eslint-plugin-solid: + optional: true + eslint-plugin-svelte: + optional: true + eslint-plugin-vuejs-accessibility: + optional: true + prettier-plugin-astro: + optional: true + prettier-plugin-slidev: + optional: true + svelte-eslint-parser: + optional: true + + '@antfu/install-pkg@2.0.1': + resolution: {integrity: sha512-iCKVQcIC0e3oDxEfs3SHQGW+ovhBMZmS1TE+bTk50rVyMCBmCfClv7Qi3HQKlumYwvjb/iIMeWCW2i67q6kFfQ==} + + '@babel/helper-string-parser@7.29.7': + resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.29.7': + resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.8': + resolution: {integrity: sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/types@7.29.8': + resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==} + engines: {node: '>=6.9.0'} + + '@clack/core@1.4.3': + resolution: {integrity: sha512-/kr3UWNtdJfxZtPgDqUOmG2pvwlmcLGheex5yiZKdwbzZJxhV+HMNR9QNmyY5cGwTNV6LrR7Jtp+KjhUAP1qBQ==} + engines: {node: '>= 20.12.0'} + + '@clack/prompts@1.7.0': + resolution: {integrity: sha512-y7/yvZ2TPAnR9+jnc00klvNNLkJiXFFrQA/hlLCcxA9a2A4zQIOimyFQ9XfwYKiGD1fb5GY8vbKIIgO8d5Tb2A==} + engines: {node: '>= 20.12.0'} + + '@e18e/eslint-plugin@0.6.0': + resolution: {integrity: sha512-JQkeXoZA12f9WM2H4t4IobIRqlPvYLeNAjZF6raFu2vmD5YoyuzKmwsLZNJ4g/39c3v1Se2ad3o+oq4y2et/RA==} + peerDependencies: + eslint: ^9.0.0 || ^10.0.0 + oxlint: ^1.72.0 + peerDependenciesMeta: + eslint: + optional: true + oxlint: + optional: true + + '@es-joy/jsdoccomment@0.91.0': + resolution: {integrity: sha512-vgqlMGNNhZxwDYbUNIHj3Hskb4R28iqdXx90ufHyt/NeuTQkeqjTDslAs9I0/GCAfbxP5BpH5WsL1R1fht5Lxg==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@es-joy/jsdoccomment@0.92.0': + resolution: {integrity: sha512-WivZqV5jPTYDQJgIMp0hTsyQESKYNY6yCJr4b0l84tYtQntkAMkc6zARh2vlRQyeg4aYHPUkCUDpvr2IWAiGpQ==} + engines: {node: ^22.22.2 || >=24.15.0} + + '@es-joy/resolve.exports@1.2.0': + resolution: {integrity: sha512-Q9hjxWI5xBM+qW2enxfe8wDKdFWMfd0Z29k5ZJnuBqD/CasY5Zryj09aCA6owbGATWz+39p5uIdaHXpopOcG8g==} + engines: {node: '>=10'} + + '@esbuild/aix-ppc64@0.28.2': + resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.28.2': + resolution: {integrity: sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.28.2': + resolution: {integrity: sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.28.2': + resolution: {integrity: sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.28.2': + resolution: {integrity: sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.28.2': + resolution: {integrity: sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.28.2': + resolution: {integrity: sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.28.2': + resolution: {integrity: sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.28.2': + resolution: {integrity: sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.28.2': + resolution: {integrity: sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.28.2': + resolution: {integrity: sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.28.2': + resolution: {integrity: sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.28.2': + resolution: {integrity: sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.28.2': + resolution: {integrity: sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.28.2': + resolution: {integrity: sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.28.2': + resolution: {integrity: sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.28.2': + resolution: {integrity: sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.28.2': + resolution: {integrity: sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.28.2': + resolution: {integrity: sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.28.2': + resolution: {integrity: sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.28.2': + resolution: {integrity: sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.28.2': + resolution: {integrity: sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.28.2': + resolution: {integrity: sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.28.2': + resolution: {integrity: sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.28.2': + resolution: {integrity: sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.28.2': + resolution: {integrity: sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-plugin-eslint-comments@4.7.2': + resolution: {integrity: sha512-LF03qURSwEWm2dz5wtdDCzNk+7Opl0X7q6I3undsaIuNsEiNvRV3BCtqu14Q/6Pzg1tBj44LcxpW2EpSLZStZw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 + + '@eslint-community/eslint-utils@4.10.1': + resolution: {integrity: sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/compat@2.1.0': + resolution: {integrity: sha512-LgaSCymEpw7tF53xvDw9SNsraPb1IBHxpdABIOM0hW8UAlP8znrjYtuxfR58FSJ3L9BhwD+FaPRFQpZq84Nh6g==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + peerDependencies: + eslint: ^8.40 || 9 || 10 + peerDependenciesMeta: + eslint: + optional: true + + '@eslint/config-array@0.23.5': + resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/config-helpers@0.5.5': + resolution: {integrity: sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@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': + resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/css-tree@4.0.5': + resolution: {integrity: sha512-iPmijIAq4hlIJB86PYmY/fcZORHtjphSqICDbwuw32A/JmkhZQ/K/6TjHE03zqf3n5yABpVcbRAMG8Mi9ojy8g==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/markdown@8.0.3': + resolution: {integrity: sha512-rBTSSShrq7e4O+PWfeE4azH4/CWPNrC+VGxBXiW00o3vYVJnznsZiDayj3KC9JztIMVRZxZHn2nrDIUau/4j7A==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/object-schema@3.0.5': + resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@eslint/plugin-kit@0.7.2': + resolution: {integrity: sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@humanfs/core@0.19.2': + resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.8': + resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} + engines: {node: '>=18.18.0'} + + '@humanfs/types@0.15.0': + resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@lonewolfyx/tsconfig@0.0.6': + resolution: {integrity: sha512-KWMWUmf/7S9Jsvox+3o57XnJ1iadGZaq2R+og9hWoGIa26HG7sC/lSU/YapXvff7An0nXhB2wcoFJrHHdLtFjQ==} + peerDependencies: + typescript: ^5.8.2 + + '@ota-meshi/ast-token-store@0.3.0': + resolution: {integrity: sha512-XRO0zi2NIUKq2lUk3T1ecFSld1fMWRKE6naRFGkgkdeosx7IslyUKNv5Dcb5PJTja9tHJoFu0v/7yEpAkrkrTg==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + '@oxc-project/types@0.143.0': + resolution: {integrity: sha512-u6JZdLBTLotrNC9Vd6vPssINdzcCzleKAH6EJKImQb7GtYvX5keN2dxkoK44stCc4tffE6QQRtZTXVSzsLUlWA==} + + '@pkgr/core@0.3.6': + resolution: {integrity: sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA==} + engines: {node: ^14.18.0 || >=16.0.0} + + '@quansync/fs@1.0.0': + resolution: {integrity: sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ==} + + '@rolldown/binding-android-arm64@1.2.3': + resolution: {integrity: sha512-zrJtHDcaZJ1Fp7xf4hNl+7seH9Cn/N5TwLYkhgXREtBwAd/jaqW3uqeHxpDugJLVICWg4eW44kOQEGJ1r6jCGw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.2.3': + resolution: {integrity: sha512-ieIiibVCp0tX7TLu2cafoNPv8wJyYi01ekXpbf8q2j7F4rGAhhXb/eQh7ge9DRBY78GwmRQtvjZDux7EDbA8kA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.2.3': + resolution: {integrity: sha512-Zh9tCon19eDXJoihx0rqKhMUlMYqzwj3aPsSuHmI4RWZh62dWUL+DJN4C5YQya5TcQBJU/Fe8+rY0jhXTQITqA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.2.3': + resolution: {integrity: sha512-nGbJWewA1wrXXZiQhjAT5rhibGfns5ZNkDVqxsO6zJ3f3YvpoDNNmGMSbbhLuXKjNScaBJVOAboztAWVespQMg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.2.3': + resolution: {integrity: sha512-QNniJr5Kml0kDEB98jiDOJjXNroxIIi0IXIbdYzY26Xt1pVbeP62+KnoIZLwirOymX/0jDk/2gI/bNUv7A7OIw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.2.3': + resolution: {integrity: sha512-TkqEAcmmvH3I/q4114NB4RVt6241Dao48pF45uLcFGrwAaIn0iITgTAKP/dLjbN0R4buJjGb91+UHSoFmpgIWw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-arm64-musl@1.2.3': + resolution: {integrity: sha512-NHqjnxpsndf4MPymxteFAWHHfkTL8HjWh1KB7z23ofZ6QO2euONuxDXjat69dKZRALnGypg8k8SsK8vZJoXv1Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rolldown/binding-linux-ppc64-gnu@1.2.3': + resolution: {integrity: sha512-6tbrbwfz5GB9DQ4Jwo6hy9v+vR31xZlvzZ6n5Xut6Hhx5PvrA9q/HsK8KMaYQp063iqZGXwNvZtYNLD7EM/x0w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-s390x-gnu@1.2.3': + resolution: {integrity: sha512-oyuXxXmoZHjXC917IAPFAAv4wWAa0cM9afk8nx1+9/jNNOX1uPf8yDA6p7G0RypOfw/X0PQt5IfoquY1um+zSg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-gnu@1.2.3': + resolution: {integrity: sha512-TytMwF2KVGqP2tgd0I1OY0PAv78dZRAYcF5ssDzjM34SUXCED3uXvSd5+lHoC0bTD6eEdFz7LdQNCO1y0oVk9w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-musl@1.2.3': + resolution: {integrity: sha512-/E9m3qstrJFVPoULV25mVQblSNExY2+kBsYe4sy0Tn0yOOgJ8wZbZt3KnRbF/XeU2Gl1STKUQnDNTqhIE5MD4A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rolldown/binding-openharmony-arm64@1.2.3': + resolution: {integrity: sha512-Kr0OcsoQI816i6HOl3vFHpd1K0eZyh76zgfj4c1nTyaTsd5r2Mj1lwM4R90y/qaCfmTn9eHy0SKwi98eitRxug==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-win32-arm64-msvc@1.2.3': + resolution: {integrity: sha512-hOtMwTqnME+/gJcH/PCZ0wn0zPUjiWOgkHpxbSJpfGKMezHltx1S7/k1SitzVa7Ww2cqrDDaFbZEhcJZO8o+Jw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.2.3': + resolution: {integrity: sha512-ekcqMMkI2PlhYnfzQnB/cEdYUVVJViWvoUyLrbzgDoi3Snfc1mVBwdnc306ufA5ejy8JSPjT2RlW1nQSjW7efg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.1': + resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} + + '@sindresorhus/base62@1.0.0': + resolution: {integrity: sha512-TeheYy0ILzBEI/CO55CP6zJCSdSWeRtGnHy8U8dWSUH4I68iqTsy7HkMktR4xakThc9jotkPQUXT4ITdbV7cHA==} + engines: {node: '>=18'} + + '@stylistic/eslint-plugin@5.10.0': + resolution: {integrity: sha512-nPK52ZHvot8Ju/0A4ucSX1dcPV2/1clx0kLcH5wDmrE4naKso7TUC/voUyU1O9OTKTrR6MYip6LP0ogEMQ9jPQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^9.0.0 || ^10.0.0 + + '@types/debug@4.1.13': + resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} + + '@types/esrecurse@4.3.1': + resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} + + '@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@4.0.4': + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/node@26.2.0': + resolution: {integrity: sha512-5IviulTZeRNp2vAJ514cc/HUlY5nZ9fCbq9DMyC52BrhFZACo3nI0R7qBxhQmo/d27NFe96ur/b7Wwxklda+kg==} + + '@types/unist@3.0.3': + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + + '@typescript-eslint/eslint-plugin@8.66.0': + resolution: {integrity: sha512-p088eaGrzYz1s+7cov0aMOCkNGTJlVxF4jgubf28c8L0Cv9Rloj8YBHnv4hXLq6IIEE1AsjNWavO+k+8kP2Y0A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.66.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/parser@8.66.0': + resolution: {integrity: sha512-X6ypGChaWYk6PBtUg2BwuTZEFFcHJAtGTVJ9/lCTOufhZ4i9fNolQNnktq+kkMCwMj7V8Svsq7+TxSDslmhE0g==} + 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.66.0': + resolution: {integrity: sha512-7MthGPTt4BP69lSryqpqq8HQqxuzynssckL/jyDyk3+TNMQ3y2jFWkptCrktWvBrP+EH787Nl5N5Qpw7WZg+5g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/scope-manager@8.66.0': + resolution: {integrity: sha512-8TGcH25j9zqJ/IULB/ppyhRvxA8QYfFEZ7nfbg6/BN9spDgb8fPWQXlE5l8TWBL50EtUx007uZ1o9VOwrq2/9g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.66.0': + resolution: {integrity: sha512-9D5gLYZG4rOjcoag8MQ/fWI8WqA9wcPDyOGyWtWFhvM1lHRbliqUSPIY5J3zqCU1tvSwzXxnnjhQhz5Ne7mJ4g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/type-utils@8.66.0': + resolution: {integrity: sha512-LG2dWfjZQQp0ADtAu/EWJVayefGL2UEZ3CDeI44D9v3rXB/WYUqE/jpO28KrEKul5AySrmI+Zh1v6v+xW2U9+g==} + 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.66.0': + resolution: {integrity: sha512-H6gcYaSDOyvL3AD/jHUtUFo2jqGgn/F6nuyuZSu0QTesxL+cP4dQoIMrODRofuJC09g64+WgZ6tE19Y1N2YIFQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.66.0': + resolution: {integrity: sha512-8/x4INiiQb10jGgXYD7116/zQ+OL84ZIFn0za68wwFHCanT/VLbBEroWht8RV8fn0/ZCAoazHLQgwUC0UQcDfg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/utils@8.66.0': + resolution: {integrity: sha512-jasearZPolBw5NJNYGMwxzHMF83niVWmMU1VdHzG1CyfI2VS7f7nZltnKtHcg20hW+7Uo5GfK4MeDPoU3qI8EA==} + 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.66.0': + resolution: {integrity: sha512-dkKR8q+lKciskj1Y3vthHktl+3cMLWGyVUP23bRiPZ5O9BRT++4EqDDV+TVeIKBL1VXVEqrJlz8MYbcnvJcAlg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@vitest/eslint-plugin@1.6.27': + resolution: {integrity: sha512-X1RCAfwbatG4GFbJ/1PIHP9MSZMt0JJThqbYID+vS4L783k6QGlLPe421wQE8dHXuGCcenVLsydiM4qzsYWxhg==} + engines: {node: '>=18'} + peerDependencies: + '@typescript-eslint/eslint-plugin': '*' + eslint: '>=8.57.0' + typescript: '>=5.0.0' + vitest: '*' + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + typescript: + optional: true + vitest: + optional: true + + '@vue/compiler-core@3.5.41': + resolution: {integrity: sha512-q0Xtv/F9w2YO/7htQhtiL+Ev2WCJbe5N2hc+XfgyKkEKqWpSxknmT8QOuGdEKNdjPq0c3F7rNpFkTo3Kfrm7pg==} + + '@vue/compiler-dom@3.5.41': + resolution: {integrity: sha512-oKacVfNglLvGjnS6BXOlGL7EyG2h8X03pqXCjzotRZUaXGjbrTJUnVAQjrCqUnS+lyu31nwQjZY/d817GmCnfw==} + + '@vue/compiler-sfc@3.5.41': + resolution: {integrity: sha512-XJhip7R2wy6vX3knCxdZN4KracFaZUef58s1KYewqluedHIJaPIVfXoYT7MF1F8nCvv6k8bWWxDC8opMkg1VTQ==} + + '@vue/compiler-ssr@3.5.41': + resolution: {integrity: sha512-U3v5OejKEGqOI0Wy0+Sz7hGuIFZHA4LSXzrNM3IMIeDyJEBBfTpX26n3SDgToRpP2bLc9FfI2j/kSgcJ8Emq5A==} + + '@vue/shared@3.5.41': + resolution: {integrity: sha512-IOnwSCma8j+9xJT6b8H0dEYidC80NsYmNMlZxRsukYcSoGaDBohog5hDxzeUXdFeGWFA++vWvxqOmrr96VlqMA==} + + '@yuku-codegen/binding-android-arm64@0.8.4': + resolution: {integrity: sha512-rsYkGl2kOkDRsh1mxriYnk1qBS78vjlBJ3+T2XwtwKwqOliy2n+2Ae0EDxJ/uX1DZLm3KkBZarGO5isEnmHchA==} + cpu: [arm64] + os: [android] + + '@yuku-codegen/binding-darwin-arm64@0.8.4': + resolution: {integrity: sha512-tNLKzPF3FYmEcHSYvWp/LEpjHHAtDR13hwo6/gdCkYMi9x59CWn2obczKzWNe7kDor4/1AMZuJDEVRpFkTSefw==} + cpu: [arm64] + os: [darwin] + + '@yuku-codegen/binding-darwin-x64@0.8.4': + resolution: {integrity: sha512-tK7LWzXNb5JbZpnoCNHB0nEhPFss/LwwehM6m/f0oYDan+iZgFZXzdoy80JdE7dVxjTZDIhUNPx8X8xbIdaoxA==} + cpu: [x64] + os: [darwin] + + '@yuku-codegen/binding-freebsd-x64@0.8.4': + resolution: {integrity: sha512-5MUV4d7g2p5Hd8GiXW6ynTRgYjm4Dw4eM2gaWRZ4crkGetzNx+HlPxcEfGtVNPqH5Qaa4Z2REtzdsdgvaE6/Ng==} + cpu: [x64] + os: [freebsd] + + '@yuku-codegen/binding-linux-arm-gnu@0.8.4': + resolution: {integrity: sha512-g6LnHrR0Rfqq5cXs7olwR2+LlVDc876pw7Hh7YXbukVSiBxQkaxqsEO/trO25z2g99zWzgXwoYvQZ1TnwA2wEw==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@yuku-codegen/binding-linux-arm-musl@0.8.4': + resolution: {integrity: sha512-7XAPHrROPEFuJWXEGZeLZQN4xR8ENQ65+HSCtCHjSzCwGgnX53GUjM9ExVcHopV0a5g4vu57v2wwtyWIM5iNOQ==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@yuku-codegen/binding-linux-arm64-gnu@0.8.4': + resolution: {integrity: sha512-fnBm7NLuuwFXy7F1vRIuyOc+RW9ADUjuCKVGY87Dj8jtr9XgESNrwb+B9VLSFY7nZ0rCdK/Sm1fBqJpI7eLdKQ==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@yuku-codegen/binding-linux-arm64-musl@0.8.4': + resolution: {integrity: sha512-6vTw4ZHO9nm4SUkw36uG+UE6/qifZ0E8HIef7Mx/U/c2Zxu3JLBfXtU7U/NN2GMkDmcJkgwjXfpQoYw4Ch5Y1w==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@yuku-codegen/binding-linux-x64-gnu@0.8.4': + resolution: {integrity: sha512-+vuC3V3Lw+DB4oJgHV9pVDfQZlsZJnxmbdods7HzxgEALU3P5+czwdAcw3wfh7Ebabt0Ny8eLUb1k9RV5OB/+w==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@yuku-codegen/binding-linux-x64-musl@0.8.4': + resolution: {integrity: sha512-QH60PE4eZecmgNGa1/T1cKPhrfxt6ANtu4lrQ1FZ50F9b0GS9WjGmIjrfdSUeQa+f2Iqk3oEFSJdgVHBg1KPNg==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@yuku-codegen/binding-win32-arm64@0.8.4': + resolution: {integrity: sha512-6r68c0nKZPIBRXZIBiD7zjlEukBR+xRxpTOVj4n1Fsjcdh4YbbJfjFfmIzdbo9jXR1xL+dPueDVdsRGOUH5MoQ==} + cpu: [arm64] + os: [win32] + + '@yuku-codegen/binding-win32-x64@0.8.4': + resolution: {integrity: sha512-i+BW77LPjNqe7Apq50J3OeEaVfga3G+eT2bKjb6bj4yO99fil/jnKb4ZDH4JLvby/Q7hRa6VicL2EZ7iS+ifzA==} + cpu: [x64] + os: [win32] + + '@yuku-parser/binding-android-arm64@0.8.4': + resolution: {integrity: sha512-+HIMmv08Zrh9ugIAEMnKBMMePOl7CDxrjc8Vui1+GG2TJHM1yI1+3wo1pnXB6Nj2IiHugDkQw8ycUI6SA2EUkQ==} + cpu: [arm64] + os: [android] + + '@yuku-parser/binding-darwin-arm64@0.8.4': + resolution: {integrity: sha512-Elf/B/2m3OsyvxoQnBk8Dtu+9csHkzBNs5Yv9GbHjT3x0kVKNWjFusyZgm41VwxcPDqdpRi8tWxNX7OqXkmf/A==} + cpu: [arm64] + os: [darwin] + + '@yuku-parser/binding-darwin-x64@0.8.4': + resolution: {integrity: sha512-CjZuMoXnL5XUkVpDqh4WDPwpAw8CwmtHHnTerGkS45So/sNuwkXdyIAEqqIZfaLopi5W/V9NApAT2md9XizjsQ==} + cpu: [x64] + os: [darwin] + + '@yuku-parser/binding-freebsd-x64@0.8.4': + resolution: {integrity: sha512-ibLKORdz71iI4Vs+fyFgvwQ51P5XcxJIyQLa8cSEWqwptRdo+BTcZHIQEcZnFDPUuvmJ19RRH9CoiJdfhr7pZw==} + cpu: [x64] + os: [freebsd] + + '@yuku-parser/binding-linux-arm-gnu@0.8.4': + resolution: {integrity: sha512-Fo3r5fYhGDcFnl+KN+L9PgtiQPS4AIE1n1mG1o5jZ11p7g5yZ/1EjLFmSHAUsoXreun8KjTsFjEL7P1Sb93PZQ==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@yuku-parser/binding-linux-arm-musl@0.8.4': + resolution: {integrity: sha512-BEB31vUEgXPWf7WkoMPSzzJhpC/wWCBXyysRCCPsw47BJ/OtbQsvJbxX9fFDuSRLy3kbyIV/WbdUTgbQ9COxiw==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@yuku-parser/binding-linux-arm64-gnu@0.8.4': + resolution: {integrity: sha512-xGLCRcHn9xVz7JVNyyKtiNJSf503qtUmih9XVSsghgzOmiKUMnHObs69OMMwXN3788tg1jsl11fNjjQlB8idMA==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@yuku-parser/binding-linux-arm64-musl@0.8.4': + resolution: {integrity: sha512-3kNRi8NJT2q6FQRVCUFHIQ99+kXdi8cVJEEUi6+xtFqpMgNrZNnbgAj28ILsDC7zmclaU+v47eUCeJoKLSCbww==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@yuku-parser/binding-linux-x64-gnu@0.8.4': + resolution: {integrity: sha512-isi62oMy94Z3OXwGs2l2rkqRiRyqLmfHeTRHpA/uWZbsNhnm7IdVvkF7e7wHNKAtd5jwGzOqYSroxKv2fOm7Cw==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@yuku-parser/binding-linux-x64-musl@0.8.4': + resolution: {integrity: sha512-9RsEw2xYHqU/pjSRBTOupWN3sF8uz9stjJdARfz6o0llvF+yfrj5QHmTiocGGBeAI80fvKmDtr2RIQClUzAPcA==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@yuku-parser/binding-win32-arm64@0.8.4': + resolution: {integrity: sha512-VEZHo9rEGOBKR20sA3vCO00aQvwWND5aLu7YxeX+YupMZJh9hd1f17AbClJN37Q2iL1PCHht+wDTOKX6tZYqXg==} + cpu: [arm64] + os: [win32] + + '@yuku-parser/binding-win32-x64@0.8.4': + resolution: {integrity: sha512-PeH3VzN1feGjPtDpVEAqf000fPT+nxtw/696LKp/5Z9RJi/MaXpB636QC+5QtrAPSoEnIkyEe+c+mq2QLZPWBA==} + cpu: [x64] + os: [win32] + + '@yuku-toolchain/types@0.8.4': + resolution: {integrity: sha512-p7JE8flrj7ijZ/qLjHi4UwKqMarMD6zumbKXhrjp2I2iLJOuTYiQyci2U36VlXcUlNyzsY7E/mLnKCHotbzJVw==} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.18.0: + resolution: {integrity: sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} + + ansis@4.3.1: + resolution: {integrity: sha512-BJ8/l4R5LRE7hW9WdSuGYrLSHi2ynxeFpDFbH0K/CgNeY/tyhk+vO6TYxXC5r5CpUhNVX310xzPsN/H9lCdfOA==} + engines: {node: '>=14'} + + are-docs-informative@0.0.2: + resolution: {integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==} + engines: {node: '>=14'} + + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + + baseline-browser-mapping@2.11.13: + resolution: {integrity: sha512-k9HNuUVMlqVjQ9UHzfPjIqiDbWw7WqT1AoT7GL8VwvF3r0ZfArtgiSPAlmupyNquNgOJHTuH4CKYf8ttMTWBTQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + brace-expansion@5.0.9: + resolution: {integrity: sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==} + engines: {node: 20 || >=22} + + browserslist@4.28.8: + resolution: {integrity: sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + builtin-modules@5.3.0: + resolution: {integrity: sha512-hMQUl2bUFG339QygPM97E+mc8OY1IAchORZxm4a/frcYwKzozMzRVDBwHW0NjOqGElLm2O37AVQE8ikxlZHrMQ==} + engines: {node: '>=18.20'} + + cac@7.0.0: + resolution: {integrity: sha512-tixWYgm5ZoOD+3g6UTea91eow5z6AAHaho3g0V9CNSNb45gM8SmflpAc+GRd1InC4AqN/07Unrgp56Y94N9hJQ==} + engines: {node: '>=20.19.0'} + + caniuse-lite@1.0.30001809: + resolution: {integrity: sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ==} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + change-case@5.4.4: + resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + ci-info@4.4.0: + resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} + engines: {node: '>=8'} + + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + comment-parser@1.4.7: + resolution: {integrity: sha512-0h+uSNtQGW3D98eQt3jJ8L06Fves8hncB4V/PKdw/Qb8Hnk19VaKuTr55UNRYiSoVa7WwrFls+rh3ux9agmkeQ==} + engines: {node: '>= 12.0.0'} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + confbox@0.2.4: + resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==} + + convert-hrtime@5.0.0: + resolution: {integrity: sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==} + engines: {node: '>=12'} + + core-js-compat@3.50.0: + resolution: {integrity: sha512-XGpFGbMLHwSt74YLTKho7Ib242qi6O8MSX+sRokV4oz7iKXvQWGYZthjIhjRGMxjzVkAubBO512dKGYcefmX3Q==} + engines: {node: '>=6.4.0'} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decode-named-character-reference@1.3.0: + resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + defu@6.1.7: + resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + detect-indent@7.0.2: + resolution: {integrity: sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A==} + engines: {node: '>=12.20'} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + dts-resolver@3.0.0: + resolution: {integrity: sha512-1T1f+z+4tl9XD+m+0HBgWoL/nm0bOIffyWaUuUSBlFg/86IWvfx+wjNaO/ybU0AJzG9/Mi5hBUgGV6zCmWEN7Q==} + engines: {node: ^22.18.0 || >=24.0.0} + peerDependencies: + oxc-resolver: '>=11.0.0' + peerDependenciesMeta: + oxc-resolver: + optional: true + + electron-to-chromium@1.5.403: + resolution: {integrity: sha512-MQsYmdaLzvaCX5j+ZZBr5Fm6uCCnPQcRtlvmvRlWqrXy+BH2O4ffXIAScF+JQznQWB9brWp4lSD9Z4yNmaf2BA==} + + empathic@2.0.1: + resolution: {integrity: sha512-YGRs8knHhKHVShLkFET/rWAU8kmHbOV5LwN938RHI0pljAJ1Gf6SzXsSmRaEzcXTtOOmVqJ5+WtQPL5uigY50Q==} + engines: {node: '>=14'} + + enhanced-resolve@5.24.5: + resolution: {integrity: sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==} + engines: {node: '>=10.13.0'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} + + esbuild@0.28.2: + resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + eslint-compat-utils@0.5.1: + resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} + engines: {node: '>=12'} + peerDependencies: + eslint: '>=6.0.0' + + eslint-config-flat-gitignore@2.3.0: + resolution: {integrity: sha512-bg4ZLGgoARg1naWfsINUUb/52Ksw/K22K+T16D38Y8v+/sGwwIYrGvH/JBjOin+RQtxxC9tzNNiy4shnGtGyyQ==} + peerDependencies: + eslint: ^9.5.0 || ^10.0.0 + + eslint-flat-config-utils@3.2.0: + resolution: {integrity: sha512-PHgo1X5uqIorJONLVD9BIaOSdoYFD3z/AeJljdqDPlWVRpeCYkDbK9k0AXoYVqqNJr6FEYIEr5Rm2TSktLQcHw==} + + eslint-json-compat-utils@0.2.3: + resolution: {integrity: sha512-RbBmDFyu7FqnjE8F0ZxPNzx5UaptdeS9Uu50r7A+D7s/+FCX+ybiyViYEgFUaFIFqSWJgZRTpL5d8Kanxxl2lQ==} + engines: {node: '>=12'} + peerDependencies: + '@eslint/json': '*' + eslint: '*' + jsonc-eslint-parser: ^2.4.0 || ^3.0.0 + peerDependenciesMeta: + '@eslint/json': + optional: true + + eslint-merge-processors@2.0.0: + resolution: {integrity: sha512-sUuhSf3IrJdGooquEUB5TNpGNpBoQccbnaLHsb1XkBLUPPqCNivCpY05ZcpCOiV9uHwO2yxXEWVczVclzMxYlA==} + peerDependencies: + eslint: '*' + + eslint-plugin-antfu@3.2.3: + resolution: {integrity: sha512-U2fnz/H0gFPxpuC7QpaHa0Jv2AgCZ5hunp36SOP/yWo8yFzgvMh8X4pZ4uN4IKoqtBhk7G3HuVa93Urf51+sZg==} + peerDependencies: + eslint: '*' + + eslint-plugin-command@4.0.0: + resolution: {integrity: sha512-mM1UdKu39YF5nUBVbA+PaVvpB3R3Niwjes8CQ8rJTTbgIThgrfQILgDqmtpAAQL1xGaolCoES1SfiwzwPVGkXQ==} + engines: {node: ^22.22.2 || >=24.15.0} + peerDependencies: + '@typescript-eslint/typescript-estree': '*' + '@typescript-eslint/utils': '*' + eslint: '*' + + eslint-plugin-es-x@7.8.0: + resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '>=8' + + eslint-plugin-import-lite@0.6.0: + resolution: {integrity: sha512-80vevx2A7i3H7n1/6pqDO8cc5wRz6OwLDvIyVl9UflBV1N1f46e9Ihzi65IOLYoSxM6YykK2fTw1xm0Ixx6aTQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^9.0.0 || ^10.0.0 + + eslint-plugin-jsdoc@63.3.3: + resolution: {integrity: sha512-xI4IeVRzRFA2DGHrPLIxF3U+oJHU3FE+P9Zb27fVs5dPHgfcpoAs0PyCbznVhK7pwR+9BPUztFeXSgpw/CL4Yg==} + engines: {node: ^22.13.0 || >=24} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 + + eslint-plugin-jsonc@3.4.1: + resolution: {integrity: sha512-HHWkjAmVJ3QAffCkfo0XKl3CstLtgbIu5EGfFfVDLQT6vqPrxl4pFbUwFwY03nOlvyuDiiBixhHFrlbzn9u09Q==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + peerDependencies: + eslint: '>=9.38.0' + + eslint-plugin-n@18.3.0: + resolution: {integrity: sha512-cPVguuDe6DrIPb/qUXHf8P89MaVTUmiYWwpt5gX5AILsvRIiZAxMFXcFR6QHYBksqKJpjfUBlL/RleCJUWcD7w==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + peerDependencies: + eslint: '>=8.57.1' + ts-declaration-location: ^1.0.6 + typescript: '>=5.0.0' + peerDependenciesMeta: + ts-declaration-location: + optional: true + typescript: + optional: true + + eslint-plugin-no-only-tests@3.4.0: + resolution: {integrity: sha512-4S3/9Nb7A2tiMcpzEQE9bQSlpeOz6WJkgryBuou/SA8W2x2c8Zf4j0NvTKBjv6qNhF9T79tmkecm/0CHqV0UGg==} + engines: {node: '>=5.0.0'} + + eslint-plugin-perfectionist@5.10.1: + resolution: {integrity: sha512-Kprsp9Us0GqAesYaAIzUViw57xYp5WBqzXrcE0Mtww++E5fexWXYBipMuuD7yvyH4vvpBH0+oJ+OMAmZ0oYXkw==} + engines: {node: ^20.0.0 || >=22.0.0} + peerDependencies: + eslint: ^8.45.0 || ^9.0.0 || ^10.0.0 + + eslint-plugin-pnpm@1.7.0: + resolution: {integrity: sha512-SZaPARN1+NMqAjQOlQjHu59SnN/o299N5Z4HTyhwWYnfkQkjdiydayHBegwXER3VecRF/Rf7eHw3sGcTF+uLOQ==} + peerDependencies: + eslint: ^9.0.0 || ^10.0.0 + + eslint-plugin-regexp@3.1.1: + resolution: {integrity: sha512-MxR5nqoQCtVWmJwia0D2+NlXX1xzdpkslsVOZLEYQ4PQWEaL65PCZXURxaBc3lPnkNFpNxzMIRmYVxdl8giXRA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + peerDependencies: + eslint: '>=9.38.0' + + eslint-plugin-toml@1.5.0: + resolution: {integrity: sha512-qBjRywEkKxO2uYOjus//6GVF1r+Hg5QDkRO8RTY6XcaXgWfBU0DhwpFmJa2Ljf0Sz49r7DdZlpKwwHmJ4nmH1Q==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + peerDependencies: + eslint: '>=9.38.0' + + eslint-plugin-unicorn@73.0.0: + resolution: {integrity: sha512-V0YatLe9nkGhXEXKe2Qljb1EY0sJHwDV0HUF1NKFwtsHh/fU7qGHDgv+6fchzZcgU2/7noHo2gdjnmo0P2uDPw==} + engines: {node: '>=22'} + peerDependencies: + eslint: '>=10.4' + + eslint-plugin-unused-imports@4.4.1: + resolution: {integrity: sha512-oZGYUz1X3sRMGUB+0cZyK2VcvRX5lm/vB56PgNNcU+7ficUCKm66oZWKUubXWnOuPjQ8PvmXtCViXBMONPe7tQ==} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^8.0.0-0 || ^7.0.0 || ^6.0.0 || ^5.0.0 + eslint: ^10.0.0 || ^9.0.0 || ^8.0.0 + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + + eslint-plugin-vue@10.10.0: + resolution: {integrity: sha512-dL9x9rBHqqNcByWiLOHK6L0SB97V82/NC0cZRn9cXPjM7pCuWlpQQP9bFH4vjBv80ej1ZpzAkuD8zWH1o9bZbA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@stylistic/eslint-plugin': ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 + '@typescript-eslint/parser': ^7.0.0 || ^8.0.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + vue-eslint-parser: ^10.3.0 + peerDependenciesMeta: + '@stylistic/eslint-plugin': + optional: true + '@typescript-eslint/parser': + optional: true + + eslint-plugin-yml@3.8.1: + resolution: {integrity: sha512-E/70psRwxz5EJ8dBtzrFfqSiiInuSytbdtFCjueb/GcKjsWzPBfxfhtQePImMAPjHwMA/VDurO7DJwStDJ4wWg==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24.0.0} + peerDependencies: + eslint: '>=9.38.0' + + eslint-processor-vue-blocks@2.0.0: + resolution: {integrity: sha512-u4W0CJwGoWY3bjXAuFpc/b6eK3NQEI8MoeW7ritKj3G3z/WtHrKjkqf+wk8mPEy5rlMGS+k6AZYOw2XBoN/02Q==} + peerDependencies: + '@vue/compiler-sfc': ^3.3.0 + eslint: '>=9.0.0' + + eslint-scope@9.1.2: + resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@5.0.1: + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eslint@10.8.1: + resolution: {integrity: sha512-wqA7W2jbsC/BnV9Iv1UZpKVFkO1AdNoSmYW8NWG4HNOBbkAMvIqDZ27pI2f07dqn583NcIC44ckjAcOXDL1QbQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + espree@11.2.0: + resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + exsolve@1.1.1: + resolution: {integrity: sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-string-truncated-width@3.0.3: + resolution: {integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==} + + fast-string-width@3.0.2: + resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} + + fast-wrap-ansi@0.2.2: + resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==} + + fault@2.0.1: + resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + find-up-simple@1.0.1: + resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==} + engines: {node: '>=18'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.4.4: + resolution: {integrity: sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==} + + format@0.2.2: + resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} + engines: {node: '>=0.4.x'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-timeout@1.0.2: + resolution: {integrity: sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA==} + engines: {node: '>=18'} + + get-tsconfig@4.14.0: + resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} + + get-tsconfig@5.0.0-beta.5: + resolution: {integrity: sha512-/6gFNr0N04nob252sTQxyFLi3eKFRqIg1I87YcqAMT1i6SQrSF6KujUEQrtrjMV0H/eejTCltLdDSTEMzHbnsQ==} + engines: {node: '>=20.20.0'} + + github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + globals@15.15.0: + resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} + engines: {node: '>=18'} + + globals@17.9.0: + resolution: {integrity: sha512-m/MvAW61QVU5VDNF1Vj8axt016h8w7L5TU1e9zlab7XIttAT2YAlCwl75K1fOqvMM9apmD7lbCIRhpfkhmxhCg==} + engines: {node: '>=18'} + + globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + hookable@6.1.1: + resolution: {integrity: sha512-U9LYDy1CwhMCnprUfeAZWZGByVbhd54hwepegYTK7Pi5NvqEj63ifz5z+xukznehT7i6NIZRu89Ay1AZmRsLEQ==} + + html-entities@2.6.0: + resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==} + + identifier-regex@1.1.0: + resolution: {integrity: sha512-SLX4H/vtcYlYnL7XqnuJKHU7Z8517TgsW9nmQiGOgMCjQ8V/deLYu6bEmbGoXe7WMMhc9+EUGyFFneHja8KabA==} + engines: {node: '>=18'} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@7.0.6: + resolution: {integrity: sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==} + engines: {node: '>= 4'} + + import-without-cache@0.4.0: + resolution: {integrity: sha512-NkJQA7oZ4YHQhd2+H3BoRFKF3d/XNsiKpHZCQEMH9pDX27hQQLsTyOocyRgaIVtf8gHX3Nt3LPkR4e5EdtPAGQ==} + engines: {node: ^22.18.0 || >=24.0.0} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@5.0.0: + resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} + engines: {node: '>=12'} + + is-builtin-module@5.0.0: + resolution: {integrity: sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA==} + engines: {node: '>=18.20'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-identifier@1.1.0: + resolution: {integrity: sha512-NhOds0mDx9lJu+1lBRO0xbwFo5nobA7GCk/0e5xjr6+6XugX985+0OyGX35BNrTkPAsdLcIKg02HUQJOK8D8kw==} + engines: {node: '>=18'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jiti@2.7.0: + resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} + hasBin: true + + jsdoc-type-pratt-parser@7.3.0: + resolution: {integrity: sha512-DoyJXo7x/n48M3NsGOs9QnEws0ft0tV3YsSgvWMNxz2hZtz+Q6fpqUD96lVYX4a+jcEkzHeFNDJOn68TzXfbdA==} + engines: {node: '>=20.0.0'} + + jsdoc-type-pratt-parser@8.0.0: + resolution: {integrity: sha512-uQu/fXVqVaMg6gM8/E5G5+eygVcZ1NV0Z51CvqhNa2bDWxvHMl484ETr6vph4oPyC+KUcbP/w2W2pewfCiR9aQ==} + engines: {node: '>=20.0.0'} + + jsdoc-type-pratt-parser@9.0.1: + resolution: {integrity: sha512-1LJ/negRKJxH0+ulOsJYEpUgzIs1DAOz9QctuS4In2LW/Ro3l8C4ej5al+5FU2hBGEOAY3R3SCnP6x8226JMIw==} + engines: {node: ^22.22.2 || >=24.15.0} + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + jsonc-eslint-parser@3.3.0: + resolution: {integrity: sha512-hYTGkHGNRZnXOFZ1urhINADoqDrGfpy53cjw+dxk84QE0pUDujQzeUeamNs6Mz44/TKD49z2x6/GVSu4ZrtA+Q==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + 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==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lint-staged@17.3.0: + resolution: {integrity: sha512-woZS3vNe3UKqBaLPvbLOtKRY4tLANpWQhom12MGWqC8Mh1lCOO+WgSwmX2amjJAqTY9BkXYW87fCUH5H9Ph6xw==} + engines: {node: '>=22.22.1'} + hasBin: true + + local-pkg@1.2.1: + resolution: {integrity: sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==} + engines: {node: '>=14'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + make-asynchronous@1.1.0: + resolution: {integrity: sha512-ayF7iT+44LXdxJLTrTd3TLQpFDDvPCBxXxbv+pMUSuHA5Q8zyAfwkRP6aHHwNVFBUFWtxAHqwNJxF8vMZLAbVg==} + engines: {node: '>=18'} + + markdown-table@3.0.4: + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + + 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-frontmatter@2.0.1: + resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==} + + 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-math@3.0.0: + resolution: {integrity: sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-markdown@2.1.2: + resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + mdn-data@2.29.0: + resolution: {integrity: sha512-pVxQFCcaYUEAH853+v7yoI/qzhxXSq1bTb9obMYGYAN1c3Hen+XDCEvr296XhstrwlSTNgOR7mCSD4JPjbJe5A==} + + micromark-core-commonmark@2.0.3: + resolution: {integrity: sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==} + + micromark-extension-frontmatter@2.0.0: + resolution: {integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==} + + micromark-extension-gfm-autolink-literal@2.1.0: + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} + + micromark-extension-gfm-footnote@2.1.0: + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} + + micromark-extension-gfm-strikethrough@2.1.0: + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} + + micromark-extension-gfm-table@2.1.1: + resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.1.0: + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-extension-math@3.1.0: + resolution: {integrity: sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==} + + micromark-factory-destination@2.0.1: + resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==} + + micromark-factory-label@2.0.1: + resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==} + + micromark-factory-space@2.0.1: + resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==} + + micromark-factory-title@2.0.1: + resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==} + + micromark-factory-whitespace@2.0.1: + resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==} + + micromark-util-character@2.1.1: + resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==} + + micromark-util-chunked@2.0.1: + resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==} + + micromark-util-classify-character@2.0.1: + resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==} + + micromark-util-combine-extensions@2.0.1: + resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==} + + micromark-util-decode-numeric-character-reference@2.0.2: + resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==} + + micromark-util-decode-string@2.0.1: + resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==} + + micromark-util-encode@2.0.1: + resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==} + + micromark-util-html-tag-name@2.0.1: + resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==} + + micromark-util-normalize-identifier@2.0.1: + resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==} + + micromark-util-resolve-all@2.0.1: + resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==} + + micromark-util-sanitize-uri@2.0.1: + resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==} + + micromark-util-subtokenize@2.1.0: + resolution: {integrity: sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==} + + micromark-util-symbol@2.0.1: + resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==} + + micromark-util-types@2.0.2: + resolution: {integrity: sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==} + + micromark@4.0.2: + resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} + + minimatch@10.2.6: + resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==} + engines: {node: 18 || 20 || >=22} + + mlly@1.8.2: + resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} + + module-replacements@3.1.0: + resolution: {integrity: sha512-MSTNGqlp2q0seRlrAA/FK3SUkGnmPeexeKWuCjeJ7HobD2RCjk4f8ry8lJ+nUQFDVBAHSdC4TdjyJSaocnR7Uw==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.18: + resolution: {integrity: sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + natural-orderby@5.0.0: + resolution: {integrity: sha512-kKHJhxwpR/Okycz4HhQKKlhWe4ASEfPgkSWNmKFHd7+ezuQlxkA5cM3+XkBPvm1gmHen3w53qsYAv+8GwRrBlg==} + engines: {node: '>=18'} + + node-releases@2.0.53: + resolution: {integrity: sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==} + engines: {node: '>=18'} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + object-deep-merge@2.0.1: + resolution: {integrity: sha512-aKttDKcU3pyZqKcCkDhsMn70WmZFG2JGDQLP9EcLyTSIFQRCPWLAmBZRLJnrVUrhPG1jETEEbfdgbNtJf1LyMg==} + + obug@2.1.4: + resolution: {integrity: sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==} + engines: {node: '>=12.20.0'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + p-event@6.0.1: + resolution: {integrity: sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w==} + engines: {node: '>=16.17'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-timeout@6.1.4: + resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==} + engines: {node: '>=14.16'} + + package-manager-detector@1.8.0: + resolution: {integrity: sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==} + + parse-gitignore@2.0.0: + resolution: {integrity: sha512-RmVuCHWsfu0QPNW+mraxh/xjQVw/lhUCUru8Zni3Ctq3AoMhpDTq0OVdKS6iesd6Kqb7viCV3isAL43dciOSog==} + engines: {node: '>=14'} + + parse-imports-exports@0.2.4: + resolution: {integrity: sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==} + + parse-statements@1.0.11: + resolution: {integrity: sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.5: + resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} + engines: {node: '>=12'} + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + pkg-types@2.3.1: + resolution: {integrity: sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==} + + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + + pnpm-workspace-yaml@1.7.0: + resolution: {integrity: sha512-cgjaozHkjWL4H8oKZydEWE4mg31XydK3/1cLKjHvwnFAXutp45yAlMKljpOdZEq4TtLuzYAMvy9j05wRm3aoPw==} + + postcss-selector-parser@7.1.5: + resolution: {integrity: sha512-KvvtD7SrlBP7dlgkBghEE3r84CABm5SmV2aNcG4oCA+qDnJ/tvKonFVvwWAyyWUEwxuNawdfEAZKP9zM3oZ2Uw==} + engines: {node: '>=4'} + + postcss@8.5.26: + resolution: {integrity: sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + quansync@0.2.11: + resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + + quansync@1.0.0: + resolution: {integrity: sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==} + + quote-js-string@0.1.0: + resolution: {integrity: sha512-Y3NoRtprEEZQD8RfxMCfS0ZTqc4e+i18OrXEXAvpM6TfC/3y+0L5rNbZiSnbBBEkDfFzbpd8o+cE8q3/anjMGA==} + engines: {node: '>=22'} + + refa@0.12.1: + resolution: {integrity: sha512-J8rn6v4DBb2nnFqkqwy6/NnTYMcgLA+sLr0iIO41qpv0n+ngb7ksag2tMRl0inb1bbO/esUwzW1vbJi7K0sI0g==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + regexp-ast-analysis@0.7.1: + resolution: {integrity: sha512-sZuz1dYW/ZsfG17WSAG7eS85r5a0dDsvg+7BiiYR5o6lKCAtUrEwdmRmaGF6rwVj3LcmAeYkOWKEPlbPzN3Y3A==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + regjsparser@0.13.2: + resolution: {integrity: sha512-NgRBy2Nx/bE+9F27nVHnqcN5HjyLmecqsqx2PJHu3/IEtADD4WuxuXIVExD5PoSDFVrl78dOonfcOe5O+5nbzQ==} + hasBin: true + + reserved-identifiers@1.2.0: + resolution: {integrity: sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw==} + engines: {node: '>=18'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + rolldown-plugin-dts@0.27.14: + resolution: {integrity: sha512-ZvuDDwoIpRK9RPxDXratCpklFO9QZZWndf/sd0VBFb4LEj0jj07UcHK9OCh7V4XiFz2Z89ziyBC2K6tJiDjrbw==} + engines: {node: ^22.18.0 || >=24.11.0} + peerDependencies: + '@typescript/native-preview': '*' + '@volar/typescript': ~2.4.0 + rolldown: ^1.0.0 + typescript: ^5.0.0 || ^6.0.0 || ~7.0.0 + vue-tsc: ~3.2.0 || ~3.3.0 + peerDependenciesMeta: + '@typescript/native-preview': + optional: true + '@volar/typescript': + optional: true + typescript: + optional: true + vue-tsc: + optional: true + + rolldown@1.2.3: + resolution: {integrity: sha512-rn9wpmxplLf7NLNyCk9FyWh3FM43DbY8jOzCdEPzH7uflhTftRbCEpqi6Ly2osgoU8OwObtmavMbWLaWy4LX7A==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + scslre@0.3.0: + resolution: {integrity: sha512-3A6sD0WYP7+QrjbfNA2FN3FsOaGGFoekCVgTyypy53gPxhbkCIjtO6YWgdrfM+n/8sI8JeXZOIxsHjMTNxQ4nQ==} + engines: {node: ^14.0.0 || >=16.0.0} + + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + engines: {node: '>=10'} + hasBin: true + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + simple-git-hooks@2.13.1: + resolution: {integrity: sha512-WszCLXwT4h2k1ufIXAgsbiTOazqqevFCIncOuUBZJ91DdvWcC5+OFkluWRQPrcuSYd8fjq+o2y1QfWqYMoAToQ==} + hasBin: true + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@5.0.0: + resolution: {integrity: sha512-vngmw3Rgn+o2arXNbnZaj5UtOEBuWBfvaI+Wc8GFfykIhA5/vdK9/Sp/XkLv63dykz2rxKDvKEHupF5P0FORcQ==} + + spdx-license-ids@3.0.23: + resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==} + + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + + strip-indent@4.1.1: + resolution: {integrity: sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==} + engines: {node: '>=12'} + + super-regex@1.1.0: + resolution: {integrity: sha512-WHkws2ZflZe41zj6AolvvmaTrWds/VuyeYr9iPVv/oQeaIoVxMKaushfFWpOGDT+GuBrM/sVqF8KUCYQlSSTdQ==} + engines: {node: '>=18'} + + synckit@0.11.13: + resolution: {integrity: sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==} + engines: {node: ^14.18.0 || >=16.0.0} + + tapable@2.3.3: + resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} + engines: {node: '>=6'} + + time-span@5.1.0: + resolution: {integrity: sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==} + engines: {node: '>=12'} + + tinyexec@1.3.0: + resolution: {integrity: sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==} + engines: {node: '>=18'} + + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + + to-valid-identifier@1.0.0: + resolution: {integrity: sha512-41wJyvKep3yT2tyPqX/4blcfybknGB4D+oETKLs7Q76UiPqRpUJK3hr1nxelyYO0PHKVzJwlu0aCeEAsGI6rpw==} + engines: {node: '>=20'} + + toml-eslint-parser@1.0.3: + resolution: {integrity: sha512-A5F0cM6+mDleacLIEUkmfpkBbnHJFV1d2rprHU2MXNk7mlxHq2zGojA+SRvQD1RoMo9gqjZPWEaKG4v1BQ48lw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + ts-api-utils@2.5.0: + resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + + tsdown@0.22.14: + resolution: {integrity: sha512-ule7Y+fsAN2iZbLDoo7C4KYljFJNJJ+fLshyn+9gozeTspVersWHxwdGB+Dm2hzA38s6muFnUTl0jK3vJm9ifQ==} + engines: {node: ^22.18.0 || >=24.11.0} + hasBin: true + peerDependencies: + '@arethetypeswrong/core': ^0.18.1 + '@tsdown/css': 0.22.14 + '@tsdown/exe': 0.22.14 + '@vitejs/devtools': '*' + publint: ^0.3.8 + tsx: '*' + typescript: ^5.0.0 || ^6.0.0 || ^7.0.0 + unplugin-unused: ^0.5.0 + unrun: '*' + peerDependenciesMeta: + '@arethetypeswrong/core': + optional: true + '@tsdown/css': + optional: true + '@tsdown/exe': + optional: true + '@vitejs/devtools': + optional: true + publint: + optional: true + tsx: + optional: true + typescript: + optional: true + unplugin-unused: + optional: true + unrun: + optional: true + + tsx@4.23.12: + resolution: {integrity: sha512-FDf4L4sYzKtzWYhU/Xm0AQFdTjdIxNo9ElTf2mxXM6k8YMHXzYUe4yODVaXP4V9uMFbVg8c0qyBccK2OOxb45Q==} + engines: {node: '>=18.0.0'} + hasBin: true + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} + engines: {node: '>=14.17'} + hasBin: true + + ufo@1.6.4: + resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} + + unconfig-core@7.5.0: + resolution: {integrity: sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w==} + + undici-types@8.3.0: + resolution: {integrity: sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==} + + unist-util-is@6.0.1: + resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + + unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + 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==} + + update-browserslist-db@1.3.0: + resolution: {integrity: sha512-x/M6q3w4Ybp91CNaS4S69UnliqR3BzRpOT6LWbksjth0S/+jhfaPJsWjt/TewpT8j9eLIojUf5jr29WextHroA==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + verify-git-commit@0.0.1: + resolution: {integrity: sha512-+kXxFOv8RmpQS0a5r34OXdvA5Zgfqa6gzVgFRVY9hvb7Q5i1Q3xF7vHaok7a86jYCYEUKg0P6jYTY/PVeb9SZA==} + hasBin: true + + verkit@0.3.2: + resolution: {integrity: sha512-zj/ob3UsvJGN0whEAKFp53REA5X66hvffVqoCtVQAakJKnKlH+/PcOfMoFwIG/o4rElqLv/ycAFlx8ZlXUorCg==} + engines: {node: '>=18.12.0'} + + vue-eslint-parser@10.4.1: + resolution: {integrity: sha512-Gk6gRDj0n/fkRa3C3l0bBheoBckUq/Rs0F/TvMWIS6nzzx67amAViMe9CkNgsP2tXyQONvGiHQESHwFtZ3aYDA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + + web-worker@1.5.0: + resolution: {integrity: sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} + + yaml-eslint-parser@2.1.0: + resolution: {integrity: sha512-1zo9KRfp6vIAXBEhWAz09ex3hUwh3T+/6dGbGteHvNseA0Uk4FgQnPES55klZ6cDzSy9FpgKS0D/CoLUvCCj4w==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + 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'} + + yuku-ast@0.8.4: + resolution: {integrity: sha512-s7EWfWIQkaGmsGnyr/BU0jli9YTN5TvrKIsSmALyRD9elumDQInuhv0BrVObENKVCxr9W3Ikmnx5u02KvfuUmw==} + + yuku-codegen@0.8.4: + resolution: {integrity: sha512-1Rw+NYcmB1xkHAWlsIpbwIv/Fr50idtEbLf7OjDA+90dny6PM4Krz7Fs0TT+w2PBdjaldZpN4ye5wR4Dhlm8vA==} + + yuku-parser@0.8.4: + resolution: {integrity: sha512-sw41wouvT5rUmLIp87hmvm5vtF+MRSI3x6yjq6xqpYmtkQj+Ht6N7xRQ8lMhLv8N7JAzughGj0Rfi0jQRSu9HQ==} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@antfu/eslint-config@9.3.0(@typescript-eslint/typescript-estree@8.66.0(typescript@6.0.3))(@typescript-eslint/utils@8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(@vue/compiler-sfc@3.5.41)(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3)': + dependencies: + '@antfu/install-pkg': 2.0.1 + '@clack/prompts': 1.7.0 + '@e18e/eslint-plugin': 0.6.0(eslint@10.8.1(jiti@2.7.0)) + '@eslint-community/eslint-plugin-eslint-comments': 4.7.2(eslint@10.8.1(jiti@2.7.0)) + '@eslint/markdown': 8.0.3 + '@stylistic/eslint-plugin': 5.10.0(eslint@10.8.1(jiti@2.7.0)) + '@typescript-eslint/eslint-plugin': 8.66.0(@typescript-eslint/parser@8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/parser': 8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) + '@vitest/eslint-plugin': 1.6.27(@typescript-eslint/eslint-plugin@8.66.0(@typescript-eslint/parser@8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) + ansis: 4.3.1 + cac: 7.0.0 + eslint: 10.8.1(jiti@2.7.0) + eslint-config-flat-gitignore: 2.3.0(eslint@10.8.1(jiti@2.7.0)) + eslint-flat-config-utils: 3.2.0 + eslint-merge-processors: 2.0.0(eslint@10.8.1(jiti@2.7.0)) + eslint-plugin-antfu: 3.2.3(eslint@10.8.1(jiti@2.7.0)) + eslint-plugin-command: 4.0.0(@typescript-eslint/typescript-estree@8.66.0(typescript@6.0.3))(@typescript-eslint/utils@8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0)) + eslint-plugin-import-lite: 0.6.0(eslint@10.8.1(jiti@2.7.0)) + eslint-plugin-jsdoc: 63.3.3(eslint@10.8.1(jiti@2.7.0)) + eslint-plugin-jsonc: 3.4.1(eslint@10.8.1(jiti@2.7.0)) + eslint-plugin-n: 18.3.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) + eslint-plugin-no-only-tests: 3.4.0 + eslint-plugin-perfectionist: 5.10.1(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) + eslint-plugin-pnpm: 1.7.0(eslint@10.8.1(jiti@2.7.0)) + eslint-plugin-regexp: 3.1.1(eslint@10.8.1(jiti@2.7.0)) + eslint-plugin-toml: 1.5.0(eslint@10.8.1(jiti@2.7.0)) + eslint-plugin-unicorn: 73.0.0(eslint@10.8.1(jiti@2.7.0)) + eslint-plugin-unused-imports: 4.4.1(@typescript-eslint/eslint-plugin@8.66.0(@typescript-eslint/parser@8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0)) + eslint-plugin-vue: 10.10.0(@stylistic/eslint-plugin@5.10.0(eslint@10.8.1(jiti@2.7.0)))(@typescript-eslint/parser@8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(vue-eslint-parser@10.4.1(eslint@10.8.1(jiti@2.7.0))) + eslint-plugin-yml: 3.8.1(eslint@10.8.1(jiti@2.7.0)) + eslint-processor-vue-blocks: 2.0.0(@vue/compiler-sfc@3.5.41)(eslint@10.8.1(jiti@2.7.0)) + globals: 17.9.0 + local-pkg: 1.2.1 + parse-gitignore: 2.0.0 + toml-eslint-parser: 1.0.3 + vue-eslint-parser: 10.4.1(eslint@10.8.1(jiti@2.7.0)) + yaml-eslint-parser: 2.1.0 + transitivePeerDependencies: + - '@eslint/json' + - '@typescript-eslint/typescript-estree' + - '@typescript-eslint/utils' + - '@vue/compiler-sfc' + - oxlint + - supports-color + - ts-declaration-location + - typescript + - vitest + + '@antfu/install-pkg@2.0.1': + dependencies: + package-manager-detector: 1.8.0 + tinyexec: 1.3.0 + + '@babel/helper-string-parser@7.29.7': {} + + '@babel/helper-validator-identifier@7.29.7': {} + + '@babel/parser@7.29.8': + dependencies: + '@babel/types': 7.29.8 + + '@babel/types@7.29.8': + dependencies: + '@babel/helper-string-parser': 7.29.7 + '@babel/helper-validator-identifier': 7.29.7 + + '@clack/core@1.4.3': + dependencies: + fast-wrap-ansi: 0.2.2 + sisteransi: 1.0.5 + + '@clack/prompts@1.7.0': + dependencies: + '@clack/core': 1.4.3 + fast-string-width: 3.0.2 + fast-wrap-ansi: 0.2.2 + sisteransi: 1.0.5 + + '@e18e/eslint-plugin@0.6.0(eslint@10.8.1(jiti@2.7.0))': + dependencies: + empathic: 2.0.1 + module-replacements: 3.1.0 + semver: 7.8.5 + optionalDependencies: + eslint: 10.8.1(jiti@2.7.0) + + '@es-joy/jsdoccomment@0.91.0': + dependencies: + '@types/estree': 1.0.9 + '@typescript-eslint/types': 8.66.0 + comment-parser: 1.4.7 + esquery: 1.7.0 + jsdoc-type-pratt-parser: 8.0.0 + + '@es-joy/jsdoccomment@0.92.0': + dependencies: + '@types/estree': 1.0.9 + '@typescript-eslint/types': 8.66.0 + comment-parser: 1.4.7 + esquery: 1.7.0 + jsdoc-type-pratt-parser: 9.0.1 + + '@es-joy/resolve.exports@1.2.0': {} + + '@esbuild/aix-ppc64@0.28.2': + optional: true + + '@esbuild/android-arm64@0.28.2': + optional: true + + '@esbuild/android-arm@0.28.2': + optional: true + + '@esbuild/android-x64@0.28.2': + optional: true + + '@esbuild/darwin-arm64@0.28.2': + optional: true + + '@esbuild/darwin-x64@0.28.2': + optional: true + + '@esbuild/freebsd-arm64@0.28.2': + optional: true + + '@esbuild/freebsd-x64@0.28.2': + optional: true + + '@esbuild/linux-arm64@0.28.2': + optional: true + + '@esbuild/linux-arm@0.28.2': + optional: true + + '@esbuild/linux-ia32@0.28.2': + optional: true + + '@esbuild/linux-loong64@0.28.2': + optional: true + + '@esbuild/linux-mips64el@0.28.2': + optional: true + + '@esbuild/linux-ppc64@0.28.2': + optional: true + + '@esbuild/linux-riscv64@0.28.2': + optional: true + + '@esbuild/linux-s390x@0.28.2': + optional: true + + '@esbuild/linux-x64@0.28.2': + optional: true + + '@esbuild/netbsd-arm64@0.28.2': + optional: true + + '@esbuild/netbsd-x64@0.28.2': + optional: true + + '@esbuild/openbsd-arm64@0.28.2': + optional: true + + '@esbuild/openbsd-x64@0.28.2': + optional: true + + '@esbuild/openharmony-arm64@0.28.2': + optional: true + + '@esbuild/sunos-x64@0.28.2': + optional: true + + '@esbuild/win32-arm64@0.28.2': + optional: true + + '@esbuild/win32-ia32@0.28.2': + optional: true + + '@esbuild/win32-x64@0.28.2': + optional: true + + '@eslint-community/eslint-plugin-eslint-comments@4.7.2(eslint@10.8.1(jiti@2.7.0))': + dependencies: + escape-string-regexp: 4.0.0 + eslint: 10.8.1(jiti@2.7.0) + ignore: 7.0.6 + + '@eslint-community/eslint-utils@4.10.1(eslint@10.8.1(jiti@2.7.0))': + dependencies: + eslint: 10.8.1(jiti@2.7.0) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/compat@2.1.0(eslint@10.8.1(jiti@2.7.0))': + dependencies: + '@eslint/core': 1.2.1 + optionalDependencies: + eslint: 10.8.1(jiti@2.7.0) + + '@eslint/config-array@0.23.5': + dependencies: + '@eslint/object-schema': 3.0.5 + debug: 4.4.3 + minimatch: 10.2.6 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.5.5': + dependencies: + '@eslint/core': 1.2.1 + + '@eslint/config-helpers@0.7.0': + dependencies: + '@eslint/core': 1.2.1 + + '@eslint/core@1.2.1': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/css-tree@4.0.5': + dependencies: + mdn-data: 2.29.0 + source-map-js: 1.2.1 + + '@eslint/markdown@8.0.3': + dependencies: + '@eslint/core': 1.2.1 + '@eslint/plugin-kit': 0.7.2 + github-slugger: 2.0.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-frontmatter: 2.0.1 + mdast-util-gfm: 3.1.0 + mdast-util-math: 3.0.0 + micromark-extension-frontmatter: 2.0.0 + micromark-extension-gfm: 3.0.0 + micromark-extension-math: 3.1.0 + micromark-util-normalize-identifier: 2.0.1 + transitivePeerDependencies: + - supports-color + + '@eslint/object-schema@3.0.5': {} + + '@eslint/plugin-kit@0.7.2': + dependencies: + '@eslint/core': 1.2.1 + levn: 0.4.1 + + '@humanfs/core@0.19.2': + dependencies: + '@humanfs/types': 0.15.0 + + '@humanfs/node@0.16.8': + dependencies: + '@humanfs/core': 0.19.2 + '@humanfs/types': 0.15.0 + '@humanwhocodes/retry': 0.4.3 + + '@humanfs/types@0.15.0': {} + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.4.3': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@lonewolfyx/tsconfig@0.0.6(typescript@6.0.3)': + dependencies: + typescript: 6.0.3 + + '@ota-meshi/ast-token-store@0.3.0': {} + + '@oxc-project/types@0.143.0': {} + + '@pkgr/core@0.3.6': {} + + '@quansync/fs@1.0.0': + dependencies: + quansync: 1.0.0 + + '@rolldown/binding-android-arm64@1.2.3': + optional: true + + '@rolldown/binding-darwin-arm64@1.2.3': + optional: true + + '@rolldown/binding-darwin-x64@1.2.3': + optional: true + + '@rolldown/binding-freebsd-x64@1.2.3': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.2.3': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.2.3': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.2.3': + optional: true + + '@rolldown/binding-linux-ppc64-gnu@1.2.3': + optional: true + + '@rolldown/binding-linux-s390x-gnu@1.2.3': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.2.3': + optional: true + + '@rolldown/binding-linux-x64-musl@1.2.3': + optional: true + + '@rolldown/binding-openharmony-arm64@1.2.3': + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.2.3': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.2.3': + optional: true + + '@rolldown/pluginutils@1.0.1': {} + + '@sindresorhus/base62@1.0.0': {} + + '@stylistic/eslint-plugin@5.10.0(eslint@10.8.1(jiti@2.7.0))': + dependencies: + '@eslint-community/eslint-utils': 4.10.1(eslint@10.8.1(jiti@2.7.0)) + '@typescript-eslint/types': 8.66.0 + eslint: 10.8.1(jiti@2.7.0) + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + estraverse: 5.3.0 + picomatch: 4.0.5 + + '@types/debug@4.1.13': + dependencies: + '@types/ms': 2.1.0 + + '@types/esrecurse@4.3.1': {} + + '@types/estree@1.0.9': {} + + '@types/hast@3.0.5': + dependencies: + '@types/unist': 3.0.3 + + '@types/json-schema@7.0.15': {} + + '@types/katex@0.16.8': {} + + '@types/mdast@4.0.4': + dependencies: + '@types/unist': 3.0.3 + + '@types/ms@2.1.0': {} + + '@types/node@26.2.0': + dependencies: + undici-types: 8.3.0 + + '@types/unist@3.0.3': {} + + '@typescript-eslint/eslint-plugin@8.66.0(@typescript-eslint/parser@8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.66.0 + '@typescript-eslint/type-utils': 8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.66.0 + eslint: 10.8.1(jiti@2.7.0) + ignore: 7.0.6 + natural-compare: 1.4.0 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.66.0 + '@typescript-eslint/types': 8.66.0 + '@typescript-eslint/typescript-estree': 8.66.0(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.66.0 + debug: 4.4.3 + eslint: 10.8.1(jiti@2.7.0) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.66.0(typescript@6.0.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.66.0(typescript@6.0.3) + '@typescript-eslint/types': 8.66.0 + debug: 4.4.3 + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.66.0': + dependencies: + '@typescript-eslint/types': 8.66.0 + '@typescript-eslint/visitor-keys': 8.66.0 + + '@typescript-eslint/tsconfig-utils@8.66.0(typescript@6.0.3)': + dependencies: + typescript: 6.0.3 + + '@typescript-eslint/type-utils@8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3)': + dependencies: + '@typescript-eslint/types': 8.66.0 + '@typescript-eslint/typescript-estree': 8.66.0(typescript@6.0.3) + '@typescript-eslint/utils': 8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) + debug: 4.4.3 + eslint: 10.8.1(jiti@2.7.0) + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.66.0': {} + + '@typescript-eslint/typescript-estree@8.66.0(typescript@6.0.3)': + dependencies: + '@typescript-eslint/project-service': 8.66.0(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.66.0(typescript@6.0.3) + '@typescript-eslint/types': 8.66.0 + '@typescript-eslint/visitor-keys': 8.66.0 + debug: 4.4.3 + minimatch: 10.2.6 + semver: 7.8.5 + tinyglobby: 0.2.17 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3)': + dependencies: + '@eslint-community/eslint-utils': 4.10.1(eslint@10.8.1(jiti@2.7.0)) + '@typescript-eslint/scope-manager': 8.66.0 + '@typescript-eslint/types': 8.66.0 + '@typescript-eslint/typescript-estree': 8.66.0(typescript@6.0.3) + eslint: 10.8.1(jiti@2.7.0) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.66.0': + dependencies: + '@typescript-eslint/types': 8.66.0 + eslint-visitor-keys: 5.0.1 + + '@vitest/eslint-plugin@1.6.27(@typescript-eslint/eslint-plugin@8.66.0(@typescript-eslint/parser@8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.66.0 + '@typescript-eslint/utils': 8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) + eslint: 10.8.1(jiti@2.7.0) + optionalDependencies: + '@typescript-eslint/eslint-plugin': 8.66.0(@typescript-eslint/parser@8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + + '@vue/compiler-core@3.5.41': + dependencies: + '@babel/parser': 7.29.8 + '@vue/shared': 3.5.41 + entities: 7.0.1 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.41': + dependencies: + '@vue/compiler-core': 3.5.41 + '@vue/shared': 3.5.41 + + '@vue/compiler-sfc@3.5.41': + dependencies: + '@babel/parser': 7.29.8 + '@vue/compiler-core': 3.5.41 + '@vue/compiler-dom': 3.5.41 + '@vue/compiler-ssr': 3.5.41 + '@vue/shared': 3.5.41 + estree-walker: 2.0.2 + magic-string: 0.30.21 + postcss: 8.5.26 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.41': + dependencies: + '@vue/compiler-dom': 3.5.41 + '@vue/shared': 3.5.41 + + '@vue/shared@3.5.41': {} + + '@yuku-codegen/binding-android-arm64@0.8.4': + optional: true + + '@yuku-codegen/binding-darwin-arm64@0.8.4': + optional: true + + '@yuku-codegen/binding-darwin-x64@0.8.4': + optional: true + + '@yuku-codegen/binding-freebsd-x64@0.8.4': + optional: true + + '@yuku-codegen/binding-linux-arm-gnu@0.8.4': + optional: true + + '@yuku-codegen/binding-linux-arm-musl@0.8.4': + optional: true + + '@yuku-codegen/binding-linux-arm64-gnu@0.8.4': + optional: true + + '@yuku-codegen/binding-linux-arm64-musl@0.8.4': + optional: true + + '@yuku-codegen/binding-linux-x64-gnu@0.8.4': + optional: true + + '@yuku-codegen/binding-linux-x64-musl@0.8.4': + optional: true + + '@yuku-codegen/binding-win32-arm64@0.8.4': + optional: true + + '@yuku-codegen/binding-win32-x64@0.8.4': + optional: true + + '@yuku-parser/binding-android-arm64@0.8.4': + optional: true + + '@yuku-parser/binding-darwin-arm64@0.8.4': + optional: true + + '@yuku-parser/binding-darwin-x64@0.8.4': + optional: true + + '@yuku-parser/binding-freebsd-x64@0.8.4': + optional: true + + '@yuku-parser/binding-linux-arm-gnu@0.8.4': + optional: true + + '@yuku-parser/binding-linux-arm-musl@0.8.4': + optional: true + + '@yuku-parser/binding-linux-arm64-gnu@0.8.4': + optional: true + + '@yuku-parser/binding-linux-arm64-musl@0.8.4': + optional: true + + '@yuku-parser/binding-linux-x64-gnu@0.8.4': + optional: true + + '@yuku-parser/binding-linux-x64-musl@0.8.4': + optional: true + + '@yuku-parser/binding-win32-arm64@0.8.4': + optional: true + + '@yuku-parser/binding-win32-x64@0.8.4': + optional: true + + '@yuku-toolchain/types@0.8.4': {} + + acorn-jsx@5.3.2(acorn@8.18.0): + dependencies: + acorn: 8.18.0 + + acorn@8.18.0: {} + + ajv@6.15.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansis@4.3.1: {} + + are-docs-informative@0.0.2: {} + + balanced-match@4.0.4: {} + + baseline-browser-mapping@2.11.13: {} + + boolbase@1.0.0: {} + + brace-expansion@5.0.9: + dependencies: + balanced-match: 4.0.4 + + browserslist@4.28.8: + dependencies: + baseline-browser-mapping: 2.11.13 + caniuse-lite: 1.0.30001809 + electron-to-chromium: 1.5.403 + node-releases: 2.0.53 + update-browserslist-db: 1.3.0(browserslist@4.28.8) + + builtin-modules@5.3.0: {} + + cac@7.0.0: {} + + caniuse-lite@1.0.30001809: {} + + ccount@2.0.1: {} + + change-case@5.4.4: {} + + character-entities@2.0.2: {} + + ci-info@4.4.0: {} + + commander@8.3.0: {} + + comment-parser@1.4.7: {} + + confbox@0.1.8: {} + + confbox@0.2.4: {} + + convert-hrtime@5.0.0: {} + + core-js-compat@3.50.0: + dependencies: + browserslist: 4.28.8 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + cssesc@3.0.0: {} + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + decode-named-character-reference@1.3.0: + dependencies: + character-entities: 2.0.2 + + deep-is@0.1.4: {} + + defu@6.1.7: {} + + dequal@2.0.3: {} + + detect-indent@7.0.2: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + diff-sequences@29.6.3: {} + + dts-resolver@3.0.0: {} + + electron-to-chromium@1.5.403: {} + + empathic@2.0.1: {} + + enhanced-resolve@5.24.5: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.3 + + entities@4.5.0: {} + + entities@7.0.1: {} + + esbuild@0.28.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.2 + '@esbuild/android-arm': 0.28.2 + '@esbuild/android-arm64': 0.28.2 + '@esbuild/android-x64': 0.28.2 + '@esbuild/darwin-arm64': 0.28.2 + '@esbuild/darwin-x64': 0.28.2 + '@esbuild/freebsd-arm64': 0.28.2 + '@esbuild/freebsd-x64': 0.28.2 + '@esbuild/linux-arm': 0.28.2 + '@esbuild/linux-arm64': 0.28.2 + '@esbuild/linux-ia32': 0.28.2 + '@esbuild/linux-loong64': 0.28.2 + '@esbuild/linux-mips64el': 0.28.2 + '@esbuild/linux-ppc64': 0.28.2 + '@esbuild/linux-riscv64': 0.28.2 + '@esbuild/linux-s390x': 0.28.2 + '@esbuild/linux-x64': 0.28.2 + '@esbuild/netbsd-arm64': 0.28.2 + '@esbuild/netbsd-x64': 0.28.2 + '@esbuild/openbsd-arm64': 0.28.2 + '@esbuild/openbsd-x64': 0.28.2 + '@esbuild/openharmony-arm64': 0.28.2 + '@esbuild/sunos-x64': 0.28.2 + '@esbuild/win32-arm64': 0.28.2 + '@esbuild/win32-ia32': 0.28.2 + '@esbuild/win32-x64': 0.28.2 + + escalade@3.2.0: {} + + escape-string-regexp@4.0.0: {} + + escape-string-regexp@5.0.0: {} + + eslint-compat-utils@0.5.1(eslint@10.8.1(jiti@2.7.0)): + dependencies: + eslint: 10.8.1(jiti@2.7.0) + semver: 7.8.5 + + eslint-config-flat-gitignore@2.3.0(eslint@10.8.1(jiti@2.7.0)): + dependencies: + '@eslint/compat': 2.1.0(eslint@10.8.1(jiti@2.7.0)) + eslint: 10.8.1(jiti@2.7.0) + + eslint-flat-config-utils@3.2.0: + dependencies: + '@eslint/config-helpers': 0.5.5 + pathe: 2.0.3 + + eslint-json-compat-utils@0.2.3(eslint@10.8.1(jiti@2.7.0))(jsonc-eslint-parser@3.3.0): + dependencies: + eslint: 10.8.1(jiti@2.7.0) + esquery: 1.7.0 + jsonc-eslint-parser: 3.3.0 + + eslint-merge-processors@2.0.0(eslint@10.8.1(jiti@2.7.0)): + dependencies: + eslint: 10.8.1(jiti@2.7.0) + + eslint-plugin-antfu@3.2.3(eslint@10.8.1(jiti@2.7.0)): + dependencies: + eslint: 10.8.1(jiti@2.7.0) + + eslint-plugin-command@4.0.0(@typescript-eslint/typescript-estree@8.66.0(typescript@6.0.3))(@typescript-eslint/utils@8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0)): + dependencies: + '@es-joy/jsdoccomment': 0.92.0 + '@typescript-eslint/typescript-estree': 8.66.0(typescript@6.0.3) + '@typescript-eslint/utils': 8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) + eslint: 10.8.1(jiti@2.7.0) + + eslint-plugin-es-x@7.8.0(eslint@10.8.1(jiti@2.7.0)): + dependencies: + '@eslint-community/eslint-utils': 4.10.1(eslint@10.8.1(jiti@2.7.0)) + '@eslint-community/regexpp': 4.12.2 + eslint: 10.8.1(jiti@2.7.0) + eslint-compat-utils: 0.5.1(eslint@10.8.1(jiti@2.7.0)) + + eslint-plugin-import-lite@0.6.0(eslint@10.8.1(jiti@2.7.0)): + dependencies: + eslint: 10.8.1(jiti@2.7.0) + + eslint-plugin-jsdoc@63.3.3(eslint@10.8.1(jiti@2.7.0)): + dependencies: + '@es-joy/jsdoccomment': 0.91.0 + '@es-joy/resolve.exports': 1.2.0 + are-docs-informative: 0.0.2 + comment-parser: 1.4.7 + debug: 4.4.3 + escape-string-regexp: 4.0.0 + eslint: 10.8.1(jiti@2.7.0) + espree: 11.2.0 + esquery: 1.7.0 + html-entities: 2.6.0 + object-deep-merge: 2.0.1 + parse-imports-exports: 0.2.4 + semver: 7.8.5 + spdx-expression-parse: 5.0.0 + to-valid-identifier: 1.0.0 + transitivePeerDependencies: + - supports-color + + eslint-plugin-jsonc@3.4.1(eslint@10.8.1(jiti@2.7.0)): + dependencies: + '@eslint-community/eslint-utils': 4.10.1(eslint@10.8.1(jiti@2.7.0)) + '@eslint/core': 1.2.1 + '@eslint/plugin-kit': 0.7.2 + '@ota-meshi/ast-token-store': 0.3.0 + diff-sequences: 29.6.3 + eslint: 10.8.1(jiti@2.7.0) + eslint-json-compat-utils: 0.2.3(eslint@10.8.1(jiti@2.7.0))(jsonc-eslint-parser@3.3.0) + jsonc-eslint-parser: 3.3.0 + natural-compare: 1.4.0 + synckit: 0.11.13 + transitivePeerDependencies: + - '@eslint/json' + + eslint-plugin-n@18.3.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3): + dependencies: + '@eslint-community/eslint-utils': 4.10.1(eslint@10.8.1(jiti@2.7.0)) + enhanced-resolve: 5.24.5 + eslint: 10.8.1(jiti@2.7.0) + eslint-plugin-es-x: 7.8.0(eslint@10.8.1(jiti@2.7.0)) + get-tsconfig: 4.14.0 + globals: 15.15.0 + globrex: 0.1.2 + ignore: 5.3.2 + semver: 7.8.5 + optionalDependencies: + typescript: 6.0.3 + + eslint-plugin-no-only-tests@3.4.0: {} + + eslint-plugin-perfectionist@5.10.1(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3): + dependencies: + '@typescript-eslint/utils': 8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) + eslint: 10.8.1(jiti@2.7.0) + natural-orderby: 5.0.0 + transitivePeerDependencies: + - supports-color + - typescript + + eslint-plugin-pnpm@1.7.0(eslint@10.8.1(jiti@2.7.0)): + dependencies: + empathic: 2.0.1 + eslint: 10.8.1(jiti@2.7.0) + jsonc-eslint-parser: 3.3.0 + pathe: 2.0.3 + pnpm-workspace-yaml: 1.7.0 + tinyglobby: 0.2.17 + yaml: 2.9.0 + yaml-eslint-parser: 2.1.0 + + eslint-plugin-regexp@3.1.1(eslint@10.8.1(jiti@2.7.0)): + dependencies: + '@eslint-community/eslint-utils': 4.10.1(eslint@10.8.1(jiti@2.7.0)) + '@eslint-community/regexpp': 4.12.2 + comment-parser: 1.4.7 + eslint: 10.8.1(jiti@2.7.0) + jsdoc-type-pratt-parser: 7.3.0 + refa: 0.12.1 + regexp-ast-analysis: 0.7.1 + scslre: 0.3.0 + + eslint-plugin-toml@1.5.0(eslint@10.8.1(jiti@2.7.0)): + dependencies: + '@eslint/core': 1.2.1 + '@eslint/plugin-kit': 0.7.2 + '@ota-meshi/ast-token-store': 0.3.0 + debug: 4.4.3 + eslint: 10.8.1(jiti@2.7.0) + toml-eslint-parser: 1.0.3 + transitivePeerDependencies: + - supports-color + + eslint-plugin-unicorn@73.0.0(eslint@10.8.1(jiti@2.7.0)): + dependencies: + '@eslint-community/eslint-utils': 4.10.1(eslint@10.8.1(jiti@2.7.0)) + '@eslint/css-tree': 4.0.5 + browserslist: 4.28.8 + change-case: 5.4.4 + ci-info: 4.4.0 + core-js-compat: 3.50.0 + detect-indent: 7.0.2 + entities: 4.5.0 + eslint: 10.8.1(jiti@2.7.0) + find-up-simple: 1.0.1 + globals: 17.9.0 + indent-string: 5.0.0 + is-builtin-module: 5.0.0 + is-identifier: 1.1.0 + pluralize: 8.0.0 + quote-js-string: 0.1.0 + regjsparser: 0.13.2 + reserved-identifiers: 1.2.0 + semver: 7.8.5 + strip-indent: 4.1.1 + yaml: 2.9.0 + + eslint-plugin-unused-imports@4.4.1(@typescript-eslint/eslint-plugin@8.66.0(@typescript-eslint/parser@8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0)): + dependencies: + eslint: 10.8.1(jiti@2.7.0) + optionalDependencies: + '@typescript-eslint/eslint-plugin': 8.66.0(@typescript-eslint/parser@8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) + + eslint-plugin-vue@10.10.0(@stylistic/eslint-plugin@5.10.0(eslint@10.8.1(jiti@2.7.0)))(@typescript-eslint/parser@8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(vue-eslint-parser@10.4.1(eslint@10.8.1(jiti@2.7.0))): + dependencies: + '@eslint-community/eslint-utils': 4.10.1(eslint@10.8.1(jiti@2.7.0)) + eslint: 10.8.1(jiti@2.7.0) + natural-compare: 1.4.0 + nth-check: 2.1.1 + postcss-selector-parser: 7.1.5 + semver: 7.8.5 + vue-eslint-parser: 10.4.1(eslint@10.8.1(jiti@2.7.0)) + xml-name-validator: 5.0.0 + optionalDependencies: + '@stylistic/eslint-plugin': 5.10.0(eslint@10.8.1(jiti@2.7.0)) + '@typescript-eslint/parser': 8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) + + eslint-plugin-yml@3.8.1(eslint@10.8.1(jiti@2.7.0)): + dependencies: + '@eslint/core': 1.2.1 + '@eslint/plugin-kit': 0.7.2 + '@ota-meshi/ast-token-store': 0.3.0 + diff-sequences: 29.6.3 + escape-string-regexp: 5.0.0 + eslint: 10.8.1(jiti@2.7.0) + natural-compare: 1.4.0 + yaml-eslint-parser: 2.1.0 + + eslint-processor-vue-blocks@2.0.0(@vue/compiler-sfc@3.5.41)(eslint@10.8.1(jiti@2.7.0)): + dependencies: + '@vue/compiler-sfc': 3.5.41 + eslint: 10.8.1(jiti@2.7.0) + + eslint-scope@9.1.2: + dependencies: + '@types/esrecurse': 4.3.1 + '@types/estree': 1.0.9 + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.1: {} + + eslint-visitor-keys@5.0.1: {} + + eslint@10.8.1(jiti@2.7.0): + dependencies: + '@eslint-community/eslint-utils': 4.10.1(eslint@10.8.1(jiti@2.7.0)) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.23.5 + '@eslint/config-helpers': 0.7.0 + '@eslint/core': 1.2.1 + '@eslint/plugin-kit': 0.7.2 + '@humanfs/node': 0.16.8 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.9 + ajv: 6.15.0 + cross-spawn: 7.0.6 + debug: 4.4.3 + escape-string-regexp: 4.0.0 + eslint-scope: 9.1.2 + eslint-visitor-keys: 5.0.1 + espree: 11.2.0 + esquery: 1.7.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + minimatch: 10.2.6 + natural-compare: 1.4.0 + optionator: 0.9.4 + optionalDependencies: + jiti: 2.7.0 + transitivePeerDependencies: + - supports-color + + espree@10.4.0: + dependencies: + acorn: 8.18.0 + acorn-jsx: 5.3.2(acorn@8.18.0) + eslint-visitor-keys: 4.2.1 + + espree@11.2.0: + dependencies: + acorn: 8.18.0 + acorn-jsx: 5.3.2(acorn@8.18.0) + eslint-visitor-keys: 5.0.1 + + esquery@1.7.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + estree-walker@2.0.2: {} + + esutils@2.0.3: {} + + exsolve@1.1.1: {} + + fast-deep-equal@3.1.3: {} + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fast-string-truncated-width@3.0.3: {} + + fast-string-width@3.0.2: + dependencies: + fast-string-truncated-width: 3.0.3 + + fast-wrap-ansi@0.2.2: + dependencies: + fast-string-width: 3.0.2 + + fault@2.0.1: + dependencies: + format: 0.2.2 + + fdir@6.5.0(picomatch@4.0.5): + optionalDependencies: + picomatch: 4.0.5 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + find-up-simple@1.0.1: {} + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@4.0.1: + dependencies: + flatted: 3.4.4 + keyv: 4.5.4 + + flatted@3.4.4: {} + + format@0.2.2: {} + + fsevents@2.3.3: + optional: true + + function-timeout@1.0.2: {} + + get-tsconfig@4.14.0: + dependencies: + resolve-pkg-maps: 1.0.0 + + get-tsconfig@5.0.0-beta.5: + dependencies: + resolve-pkg-maps: 1.0.0 + + github-slugger@2.0.0: {} + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + globals@15.15.0: {} + + globals@17.9.0: {} + + globrex@0.1.2: {} + + graceful-fs@4.2.11: {} + + hookable@6.1.1: {} + + html-entities@2.6.0: {} + + identifier-regex@1.1.0: + dependencies: + reserved-identifiers: 1.2.0 + + ignore@5.3.2: {} + + ignore@7.0.6: {} + + import-without-cache@0.4.0: {} + + imurmurhash@0.1.4: {} + + indent-string@5.0.0: {} + + is-builtin-module@5.0.0: + dependencies: + builtin-modules: 5.3.0 + + is-extglob@2.1.1: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-identifier@1.1.0: + dependencies: + identifier-regex: 1.1.0 + super-regex: 1.1.0 + + isexe@2.0.0: {} + + jiti@2.7.0: {} + + jsdoc-type-pratt-parser@7.3.0: {} + + jsdoc-type-pratt-parser@8.0.0: {} + + jsdoc-type-pratt-parser@9.0.1: + dependencies: + '@types/estree': 1.0.9 + + jsesc@3.1.0: {} + + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + jsonc-eslint-parser@3.3.0: + dependencies: + acorn: 8.18.0 + eslint-visitor-keys: 5.0.1 + verkit: 0.3.2 + + katex@0.16.47: + dependencies: + commander: 8.3.0 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lint-staged@17.3.0: + dependencies: + picomatch: 4.0.5 + string-argv: 0.3.2 + tinyexec: 1.3.0 + optionalDependencies: + yaml: 2.9.0 + + local-pkg@1.2.1: + dependencies: + mlly: 1.8.2 + pkg-types: 2.3.1 + quansync: 0.2.11 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + longest-streak@3.1.0: {} + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + make-asynchronous@1.1.0: + dependencies: + p-event: 6.0.1 + type-fest: 4.41.0 + web-worker: 1.5.0 + + markdown-table@3.0.4: {} + + mdast-util-find-and-replace@3.0.2: + dependencies: + '@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-frontmatter@2.0.1: + dependencies: + '@types/mdast': 4.0.4 + devlop: 1.1.0 + escape-string-regexp: 5.0.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + micromark-extension-frontmatter: 2.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-gfm-autolink-literal@2.0.1: + dependencies: + '@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-gfm-footnote@2.1.0: + dependencies: + '@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-gfm-strikethrough@2.0.0: + dependencies: + '@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-table@2.0.0: + dependencies: + '@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-task-list-item@2.0.0: + dependencies: + '@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@3.1.0: + dependencies: + 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-math@3.0.0: + dependencies: + '@types/hast': 3.0.5 + '@types/mdast': 4.0.4 + devlop: 1.1.0 + longest-streak: 3.1.0 + mdast-util-from-markdown: 2.0.3 + mdast-util-to-markdown: 2.1.2 + unist-util-remove-position: 5.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.4 + unist-util-is: 6.0.1 + + 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: 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@4.0.0: + dependencies: + '@types/mdast': 4.0.4 + + mdn-data@2.29.0: {} + + micromark-core-commonmark@2.0.3: + dependencies: + decode-named-character-reference: 1.3.0 + 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-frontmatter@2.0.0: + dependencies: + fault: 2.0.1 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + 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-gfm-tagfilter@2.0.0: + dependencies: + micromark-util-types: 2.0.2 + + micromark-extension-gfm-task-list-item@2.1.0: + 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-gfm@3.0.0: + dependencies: + 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-math@3.1.0: + dependencies: + '@types/katex': 0.16.8 + devlop: 1.1.0 + katex: 0.16.47 + 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-destination@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-label@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-factory-space@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-types: 2.0.2 + + micromark-factory-title@2.0.1: + dependencies: + 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@2.0.1: + dependencies: + 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@2.1.1: + dependencies: + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-chunked@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-classify-character@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-symbol: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-combine-extensions@2.0.1: + dependencies: + micromark-util-chunked: 2.0.1 + micromark-util-types: 2.0.2 + + micromark-util-decode-numeric-character-reference@2.0.2: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-decode-string@2.0.1: + dependencies: + decode-named-character-reference: 1.3.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@2.0.1: {} + + micromark-util-html-tag-name@2.0.1: {} + + micromark-util-normalize-identifier@2.0.1: + dependencies: + micromark-util-symbol: 2.0.1 + + micromark-util-resolve-all@2.0.1: + dependencies: + micromark-util-types: 2.0.2 + + micromark-util-sanitize-uri@2.0.1: + dependencies: + micromark-util-character: 2.1.1 + micromark-util-encode: 2.0.1 + micromark-util-symbol: 2.0.1 + + micromark-util-subtokenize@2.1.0: + dependencies: + 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@2.0.1: {} + + micromark-util-types@2.0.2: {} + + micromark@4.0.2: + dependencies: + '@types/debug': 4.1.13 + debug: 4.4.3 + decode-named-character-reference: 1.3.0 + 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.6: + dependencies: + brace-expansion: 5.0.9 + + mlly@1.8.2: + dependencies: + acorn: 8.18.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.4 + + module-replacements@3.1.0: {} + + ms@2.1.3: {} + + nanoid@3.3.18: {} + + natural-compare@1.4.0: {} + + natural-orderby@5.0.0: {} + + node-releases@2.0.53: {} + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + object-deep-merge@2.0.1: {} + + obug@2.1.4: {} + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + p-event@6.0.1: + dependencies: + p-timeout: 6.1.4 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-timeout@6.1.4: {} + + package-manager-detector@1.8.0: {} + + parse-gitignore@2.0.0: {} + + parse-imports-exports@0.2.4: + dependencies: + parse-statements: 1.0.11 + + parse-statements@1.0.11: {} + + path-exists@4.0.0: {} + + path-key@3.1.1: {} + + pathe@2.0.3: {} + + picocolors@1.1.1: {} + + picomatch@4.0.5: {} + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.8.2 + pathe: 2.0.3 + + pkg-types@2.3.1: + dependencies: + confbox: 0.2.4 + exsolve: 1.1.1 + pathe: 2.0.3 + + pluralize@8.0.0: {} + + pnpm-workspace-yaml@1.7.0: + dependencies: + yaml: 2.9.0 + + postcss-selector-parser@7.1.5: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss@8.5.26: + dependencies: + nanoid: 3.3.18 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.2.1: {} + + punycode@2.3.1: {} + + quansync@0.2.11: {} + + quansync@1.0.0: {} + + quote-js-string@0.1.0: {} + + refa@0.12.1: + dependencies: + '@eslint-community/regexpp': 4.12.2 + + regexp-ast-analysis@0.7.1: + dependencies: + '@eslint-community/regexpp': 4.12.2 + refa: 0.12.1 + + regjsparser@0.13.2: + dependencies: + jsesc: 3.1.0 + + reserved-identifiers@1.2.0: {} + + resolve-pkg-maps@1.0.0: {} + + rolldown-plugin-dts@0.27.14(rolldown@1.2.3)(typescript@6.0.3): + dependencies: + dts-resolver: 3.0.0 + get-tsconfig: 5.0.0-beta.5 + obug: 2.1.4 + rolldown: 1.2.3 + yuku-ast: 0.8.4 + yuku-codegen: 0.8.4 + yuku-parser: 0.8.4 + optionalDependencies: + typescript: 6.0.3 + transitivePeerDependencies: + - oxc-resolver + + rolldown@1.2.3: + dependencies: + '@oxc-project/types': 0.143.0 + '@rolldown/pluginutils': 1.0.1 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.2.3 + '@rolldown/binding-darwin-arm64': 1.2.3 + '@rolldown/binding-darwin-x64': 1.2.3 + '@rolldown/binding-freebsd-x64': 1.2.3 + '@rolldown/binding-linux-arm-gnueabihf': 1.2.3 + '@rolldown/binding-linux-arm64-gnu': 1.2.3 + '@rolldown/binding-linux-arm64-musl': 1.2.3 + '@rolldown/binding-linux-ppc64-gnu': 1.2.3 + '@rolldown/binding-linux-s390x-gnu': 1.2.3 + '@rolldown/binding-linux-x64-gnu': 1.2.3 + '@rolldown/binding-linux-x64-musl': 1.2.3 + '@rolldown/binding-openharmony-arm64': 1.2.3 + '@rolldown/binding-win32-arm64-msvc': 1.2.3 + '@rolldown/binding-win32-x64-msvc': 1.2.3 + + scslre@0.3.0: + dependencies: + '@eslint-community/regexpp': 4.12.2 + refa: 0.12.1 + regexp-ast-analysis: 0.7.1 + + semver@7.8.5: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + simple-git-hooks@2.13.1: {} + + sisteransi@1.0.5: {} + + source-map-js@1.2.1: {} + + spdx-exceptions@2.5.0: {} + + spdx-expression-parse@5.0.0: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.23 + + spdx-license-ids@3.0.23: {} + + string-argv@0.3.2: {} + + strip-indent@4.1.1: {} + + super-regex@1.1.0: + dependencies: + function-timeout: 1.0.2 + make-asynchronous: 1.1.0 + time-span: 5.1.0 + + synckit@0.11.13: + dependencies: + '@pkgr/core': 0.3.6 + + tapable@2.3.3: {} + + time-span@5.1.0: + dependencies: + convert-hrtime: 5.0.0 + + tinyexec@1.3.0: {} + + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 + + to-valid-identifier@1.0.0: + dependencies: + '@sindresorhus/base62': 1.0.0 + reserved-identifiers: 1.2.0 + + toml-eslint-parser@1.0.3: + dependencies: + eslint-visitor-keys: 5.0.1 + + tree-kill@1.2.2: {} + + ts-api-utils@2.5.0(typescript@6.0.3): + dependencies: + typescript: 6.0.3 + + tsdown@0.22.14(tsx@4.23.12)(typescript@6.0.3): + dependencies: + ansis: 4.3.1 + cac: 7.0.0 + defu: 6.1.7 + empathic: 2.0.1 + hookable: 6.1.1 + import-without-cache: 0.4.0 + obug: 2.1.4 + picomatch: 4.0.5 + rolldown: 1.2.3 + rolldown-plugin-dts: 0.27.14(rolldown@1.2.3)(typescript@6.0.3) + tinyexec: 1.3.0 + tinyglobby: 0.2.17 + tree-kill: 1.2.2 + unconfig-core: 7.5.0 + verkit: 0.3.2 + optionalDependencies: + tsx: 4.23.12 + typescript: 6.0.3 + transitivePeerDependencies: + - '@typescript/native-preview' + - '@volar/typescript' + - oxc-resolver + - vue-tsc + + tsx@4.23.12: + dependencies: + esbuild: 0.28.2 + optionalDependencies: + fsevents: 2.3.3 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-fest@4.41.0: {} + + typescript@6.0.3: {} + + ufo@1.6.4: {} + + unconfig-core@7.5.0: + dependencies: + '@quansync/fs': 1.0.0 + quansync: 1.0.0 + + undici-types@8.3.0: {} + + unist-util-is@6.0.1: + dependencies: + '@types/unist': 3.0.3 + + unist-util-remove-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-visit: 5.1.0 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.3 + + 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 + + update-browserslist-db@1.3.0(browserslist@4.28.8): + dependencies: + browserslist: 4.28.8 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + util-deprecate@1.0.2: {} + + verify-git-commit@0.0.1: {} + + verkit@0.3.2: {} + + vue-eslint-parser@10.4.1(eslint@10.8.1(jiti@2.7.0)): + dependencies: + debug: 4.4.3 + eslint: 10.8.1(jiti@2.7.0) + eslint-scope: 9.1.2 + eslint-visitor-keys: 5.0.1 + espree: 11.2.0 + esquery: 1.7.0 + semver: 7.8.5 + transitivePeerDependencies: + - supports-color + + web-worker@1.5.0: {} + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + xml-name-validator@5.0.0: {} + + yaml-eslint-parser@2.1.0: + dependencies: + eslint-visitor-keys: 5.0.1 + yaml: 2.9.0 + + yaml@2.9.0: {} + + yocto-queue@0.1.0: {} + + yuku-ast@0.8.4: + dependencies: + '@yuku-toolchain/types': 0.8.4 + + yuku-codegen@0.8.4: + dependencies: + '@yuku-toolchain/types': 0.8.4 + optionalDependencies: + '@yuku-codegen/binding-android-arm64': 0.8.4 + '@yuku-codegen/binding-darwin-arm64': 0.8.4 + '@yuku-codegen/binding-darwin-x64': 0.8.4 + '@yuku-codegen/binding-freebsd-x64': 0.8.4 + '@yuku-codegen/binding-linux-arm-gnu': 0.8.4 + '@yuku-codegen/binding-linux-arm-musl': 0.8.4 + '@yuku-codegen/binding-linux-arm64-gnu': 0.8.4 + '@yuku-codegen/binding-linux-arm64-musl': 0.8.4 + '@yuku-codegen/binding-linux-x64-gnu': 0.8.4 + '@yuku-codegen/binding-linux-x64-musl': 0.8.4 + '@yuku-codegen/binding-win32-arm64': 0.8.4 + '@yuku-codegen/binding-win32-x64': 0.8.4 + + yuku-parser@0.8.4: + dependencies: + '@yuku-toolchain/types': 0.8.4 + yuku-ast: 0.8.4 + optionalDependencies: + '@yuku-parser/binding-android-arm64': 0.8.4 + '@yuku-parser/binding-darwin-arm64': 0.8.4 + '@yuku-parser/binding-darwin-x64': 0.8.4 + '@yuku-parser/binding-freebsd-x64': 0.8.4 + '@yuku-parser/binding-linux-arm-gnu': 0.8.4 + '@yuku-parser/binding-linux-arm-musl': 0.8.4 + '@yuku-parser/binding-linux-arm64-gnu': 0.8.4 + '@yuku-parser/binding-linux-arm64-musl': 0.8.4 + '@yuku-parser/binding-linux-x64-gnu': 0.8.4 + '@yuku-parser/binding-linux-x64-musl': 0.8.4 + '@yuku-parser/binding-win32-arm64': 0.8.4 + '@yuku-parser/binding-win32-x64': 0.8.4 + + zwitch@2.0.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..a7ffe31 --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,7 @@ +shellEmulator: true + +trustPolicy: no-downgrade + +allowBuilds: + esbuild: true + simple-git-hooks: true diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..83d87c2 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,22 @@ +{ + "extends": "@lonewolfyx/tsconfig/tsconfig.lib.json", + "compilerOptions": { + "baseUrl": "./", + "paths": { + "@/*": [ + "./src/*" + ], + "#/*": [ + "./src/types/*", + "./types/*" + ] + }, + "resolveJsonModule": true, + "types": [ + "node" + ], + "noUnusedLocals": false, + "noUnusedParameters": false, + "declarationMap": false + } +} From 69036694b09bf4a8efe5fc3ef6fa738811ce4d7a Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Tue, 11 Aug 2026 14:48:59 +0800 Subject: [PATCH 002/106] chore(project): update repository and author information - Remove author field from package.json - Update homepage URL to new repository location - Update repository URL to point to new organization - Update bugs URL to match new repository location --- package.json | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 8771bee..8cd3a60 100644 --- a/package.json +++ b/package.json @@ -4,15 +4,14 @@ "version": "0.0.0", "packageManager": "pnpm@11.9.0", "description": "CLI tool for querying antd knowledge and analyzing antd usage in projects", - "author": "lonewolfyx", "license": "MIT", - "homepage": "https://github.com/lonewolfyx/antdv-next-cli#readme", + "homepage": "https://github.com/antdv-next/cli#readme", "repository": { "type": "git", - "url": "git+https://github.com/lonewolfyx/antdv-next-cli.git" + "url": "git+https://github.com/antdv-next/cli.git" }, "bugs": { - "url": "https://github.com/lonewolfyx/antdv-next-cli/issues" + "url": "https://github.com/antdv-next/cli/issues" }, "keywords": [ "antdv-next", From 549cfcfce9874c58a108312f55c0c826bb275313 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Tue, 11 Aug 2026 14:50:43 +0800 Subject: [PATCH 003/106] docs(package): update description to reflect antdv-next focus - Changed CLI tool description from antd to antdv-next - Updated package description to accurately represent the project scope --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8cd3a60..36d5bbb 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "type": "module", "version": "0.0.0", "packageManager": "pnpm@11.9.0", - "description": "CLI tool for querying antd knowledge and analyzing antd usage in projects", + "description": "CLI tool for querying antdv-next knowledge and analyzing antdv-next usage in projects", "license": "MIT", "homepage": "https://github.com/antdv-next/cli#readme", "repository": { From cf41b89da6a9a9e2623bbdafa787b1e7ce7c5a5d Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Tue, 11 Aug 2026 14:57:04 +0800 Subject: [PATCH 004/106] chore(core): add new dependencies for enhanced functionality - Added @clack/prompts v1.7.0 for interactive command line prompts - Integrated citty v0.2.2 for improved configuration management - Included pkg-types v2.3.1 for better package type definitions - Updated publishConfig with public access settings - Modified package.json structure to accommodate new dependencies - Updated pnpm lockfile with new dependency resolutions --- package.json | 5 +++++ pnpm-lock.yaml | 15 +++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/package.json b/package.json index 36d5bbb..59d3f8b 100644 --- a/package.json +++ b/package.json @@ -41,6 +41,11 @@ "prepublishOnly": "pnpm build", "prepare": "simple-git-hooks" }, + "dependencies": { + "@clack/prompts": "^1.7.0", + "citty": "^0.2.2", + "pkg-types": "^2.3.1" + }, "devDependencies": { "@antfu/eslint-config": "^9.3.0", "@lonewolfyx/tsconfig": "^0.0.6", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6de8c93..e2f85f2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,6 +7,16 @@ settings: importers: .: + dependencies: + '@clack/prompts': + specifier: ^1.7.0 + version: 1.7.0 + citty: + specifier: ^0.2.2 + version: 0.2.2 + pkg-types: + specifier: ^2.3.1 + version: 2.3.1 devDependencies: '@antfu/eslint-config': specifier: ^9.3.0 @@ -841,6 +851,9 @@ packages: resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} engines: {node: '>=8'} + citty@0.2.2: + resolution: {integrity: sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w==} + commander@8.3.0: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} @@ -2524,6 +2537,8 @@ snapshots: ci-info@4.4.0: {} + citty@0.2.2: {} + commander@8.3.0: {} comment-parser@1.4.7: {} From 80f44f44836bb0ec948a4ee4730a7c2443ad322c Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Tue, 11 Aug 2026 14:59:27 +0800 Subject: [PATCH 005/106] chore(build): add antdv cli entry point - Add bin/antdv.js as the CLI entry point - Include shebang line for node execution - Import the main module from dist/index.mjs - Enable command-line execution of the build output - Provide direct access to the compiled library - Support executable script functionality for the CLI tool --- bin/antdv.js | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 bin/antdv.js diff --git a/bin/antdv.js b/bin/antdv.js new file mode 100644 index 0000000..88213af --- /dev/null +++ b/bin/antdv.js @@ -0,0 +1,2 @@ +#!/usr/bin/env node +import('../dist/index.mjs') From f626cabdad3b2d47f4843e19e4ff691daf654b5a Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Tue, 11 Aug 2026 14:59:42 +0800 Subject: [PATCH 006/106] build(package): update export paths and binary entry point - Change main export from ./dist/cli.mjs to ./dist/index.mjs - Update types declaration from ./dist/cli.d.mts to ./dist/index.d.mts - Rename binary entry point from cli.js to antdv.js - Maintain package.json exports mapping - Preserve data directory in files array --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 59d3f8b..cdbcdb7 100644 --- a/package.json +++ b/package.json @@ -22,12 +22,12 @@ "vue" ], "exports": { - ".": "./dist/cli.mjs", + ".": "./dist/index.mjs", "./package.json": "./package.json" }, - "types": "./dist/cli.d.mts", + "types": "./dist/index.d.mts", "bin": { - "antdv": "./bin/cli.js" + "antdv": "./bin/antdv.js" }, "files": [ "data", From db1e5cf2c5b1e09833cd256184d710c27e4fe0ce Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Tue, 11 Aug 2026 15:22:22 +0800 Subject: [PATCH 007/106] chore: add antdv.js --- bin/antdv.js | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 bin/antdv.js diff --git a/bin/antdv.js b/bin/antdv.js old mode 100644 new mode 100755 From 008b6bb8e246526488af4d396e46fc9bfda8ce17 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Tue, 11 Aug 2026 15:34:48 +0800 Subject: [PATCH 008/106] types(config): remove redundant types path mapping from tsconfig - Removed duplicate ./types/* path mapping in compiler options - Kept only ./src/types/* for cleaner module resolution - Fixed potential conflicts with type definitions lookup --- tsconfig.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tsconfig.json b/tsconfig.json index 83d87c2..2d4be81 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -7,8 +7,7 @@ "./src/*" ], "#/*": [ - "./src/types/*", - "./types/*" + "./src/types/*" ] }, "resolveJsonModule": true, From ea41927ff0ba569d9ec644033e79ff7645df4024 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Tue, 11 Aug 2026 16:36:22 +0800 Subject: [PATCH 009/106] feat(cli): add comprehensive CLI tool with multiple commands and banner utility - Create help banner utility with version display - Implement bug reporting command for antdv-next repository - Add bug-cli command for reporting CLI-specific issues - Create changelog command for version comparison - Add demo command for retrieving component source code - Implement design command for outputting design language document - Create doc command for generating component API documentation - Add doctor command for diagnosing antd configuration issues - Implement env command for collecting environment information - Create info command for querying component API details - Add lint command for checking antdv-next usage best practices - Implement list command for displaying all components with details - Create mcp command for starting MCP server for AI integration - Add migrate command for version migration with auto-fix option - Implement semantic command for querying component customization structure - Create setup command for configuring Ant Design MCP/Skill - Add token command for querying design tokens - Implement upgrade command for CLI version updates - Create usage command for scanning component usage statistics - Set up main CLI entry point with command routing and banner display - Configure build system with tsdown and version injection --- src/commands/bug-cli.ts | 11 +++++++++ src/commands/bug.ts | 11 +++++++++ src/commands/changelog.ts | 11 +++++++++ src/commands/demo.ts | 11 +++++++++ src/commands/design.ts | 11 +++++++++ src/commands/doc.ts | 11 +++++++++ src/commands/doctor.ts | 11 +++++++++ src/commands/env.ts | 11 +++++++++ src/commands/info.ts | 11 +++++++++ src/commands/lint.ts | 11 +++++++++ src/commands/list.ts | 11 +++++++++ src/commands/mcp.ts | 11 +++++++++ src/commands/migrate.ts | 11 +++++++++ src/commands/semantic.ts | 11 +++++++++ src/commands/setup.ts | 11 +++++++++ src/commands/token.ts | 11 +++++++++ src/commands/upgrade.ts | 11 +++++++++ src/commands/usage.ts | 11 +++++++++ src/index.ts | 52 +++++++++++++++++++++++++++++++++++++++ src/utils/banner.ts | 9 +++++++ tsdown.config.ts | 12 +++++++++ 21 files changed, 271 insertions(+) create mode 100644 src/commands/bug-cli.ts create mode 100644 src/commands/bug.ts create mode 100644 src/commands/changelog.ts create mode 100644 src/commands/demo.ts create mode 100644 src/commands/design.ts create mode 100644 src/commands/doc.ts create mode 100644 src/commands/doctor.ts create mode 100644 src/commands/env.ts create mode 100644 src/commands/info.ts create mode 100644 src/commands/lint.ts create mode 100644 src/commands/list.ts create mode 100644 src/commands/mcp.ts create mode 100644 src/commands/migrate.ts create mode 100644 src/commands/semantic.ts create mode 100644 src/commands/setup.ts create mode 100644 src/commands/token.ts create mode 100644 src/commands/upgrade.ts create mode 100644 src/commands/usage.ts create mode 100644 src/index.ts create mode 100644 src/utils/banner.ts create mode 100644 tsdown.config.ts diff --git a/src/commands/bug-cli.ts b/src/commands/bug-cli.ts new file mode 100644 index 0000000..c4c5acd --- /dev/null +++ b/src/commands/bug-cli.ts @@ -0,0 +1,11 @@ +import { defineCommand } from 'citty' + +export default defineCommand({ + meta: { + name: 'bug-cli', + description: 'Report a bug to the @antdv-next/cli repository', + }, + run({ args }) { + console.log('Parsed args:', args) + }, +}) diff --git a/src/commands/bug.ts b/src/commands/bug.ts new file mode 100644 index 0000000..b8fe2cd --- /dev/null +++ b/src/commands/bug.ts @@ -0,0 +1,11 @@ +import { defineCommand } from 'citty' + +export default defineCommand({ + meta: { + name: 'bug', + description: 'Report a bug to the antdv-next repository', + }, + run({ args }) { + console.log('Parsed args:', args) + }, +}) diff --git a/src/commands/changelog.ts b/src/commands/changelog.ts new file mode 100644 index 0000000..73a4aa2 --- /dev/null +++ b/src/commands/changelog.ts @@ -0,0 +1,11 @@ +import { defineCommand } from 'citty' + +export default defineCommand({ + meta: { + name: 'changelog', + description: 'Query changelog or compare API differences between versions', + }, + run({ args }) { + console.log('Parsed args:', args) + }, +}) diff --git a/src/commands/demo.ts b/src/commands/demo.ts new file mode 100644 index 0000000..dda5c2c --- /dev/null +++ b/src/commands/demo.ts @@ -0,0 +1,11 @@ +import { defineCommand } from 'citty' + +export default defineCommand({ + meta: { + name: 'demo', + description: 'Get demo source code for a component', + }, + run({ args }) { + console.log('Parsed args:', args) + }, +}) diff --git a/src/commands/design.ts b/src/commands/design.ts new file mode 100644 index 0000000..4cd6851 --- /dev/null +++ b/src/commands/design.ts @@ -0,0 +1,11 @@ +import { defineCommand } from 'citty' + +export default defineCommand({ + meta: { + name: 'design.md', + description: 'Output the antd design-language document (design.md) for AI design tools', + }, + run({ args }) { + console.log('Parsed args:', args) + }, +}) diff --git a/src/commands/doc.ts b/src/commands/doc.ts new file mode 100644 index 0000000..955f26b --- /dev/null +++ b/src/commands/doc.ts @@ -0,0 +1,11 @@ +import { defineCommand } from 'citty' + +export default defineCommand({ + meta: { + name: 'doc', + description: 'Output the full API documentation for a component in markdown', + }, + run({ args }) { + console.log('Parsed args:', args) + }, +}) diff --git a/src/commands/doctor.ts b/src/commands/doctor.ts new file mode 100644 index 0000000..d0c5f4b --- /dev/null +++ b/src/commands/doctor.ts @@ -0,0 +1,11 @@ +import { defineCommand } from 'citty' + +export default defineCommand({ + meta: { + name: 'doctor', + description: 'Diagnose project-level antd configuration issues', + }, + run({ args }) { + console.log('Parsed args:', args) + }, +}) diff --git a/src/commands/env.ts b/src/commands/env.ts new file mode 100644 index 0000000..887de93 --- /dev/null +++ b/src/commands/env.ts @@ -0,0 +1,11 @@ +import { defineCommand } from 'citty' + +export default defineCommand({ + meta: { + name: 'env', + description: 'Collect antd-related environment information for bug reporting', + }, + run({ args }) { + console.log('Parsed args:', args) + }, +}) diff --git a/src/commands/info.ts b/src/commands/info.ts new file mode 100644 index 0000000..8f27f7f --- /dev/null +++ b/src/commands/info.ts @@ -0,0 +1,11 @@ +import { defineCommand } from 'citty' + +export default defineCommand({ + meta: { + name: 'info', + description: 'Query component API: props, type definitions, default values', + }, + run({ args }) { + console.log('Parsed args:', args) + }, +}) diff --git a/src/commands/lint.ts b/src/commands/lint.ts new file mode 100644 index 0000000..2f471fb --- /dev/null +++ b/src/commands/lint.ts @@ -0,0 +1,11 @@ +import { defineCommand } from 'citty' + +export default defineCommand({ + meta: { + name: 'lint', + description: 'Check antdv-next usage against best practices', + }, + run({ args }) { + console.log('Parsed args:', args) + }, +}) diff --git a/src/commands/list.ts b/src/commands/list.ts new file mode 100644 index 0000000..cf86fd4 --- /dev/null +++ b/src/commands/list.ts @@ -0,0 +1,11 @@ +import { defineCommand } from 'citty' + +export default defineCommand({ + meta: { + name: 'list', + description: 'List all components with bilingual names, descriptions, and first-supported version', + }, + run({ args }) { + console.log('Parsed args:', args) + }, +}) diff --git a/src/commands/mcp.ts b/src/commands/mcp.ts new file mode 100644 index 0000000..7812362 --- /dev/null +++ b/src/commands/mcp.ts @@ -0,0 +1,11 @@ +import { defineCommand } from 'citty' + +export default defineCommand({ + meta: { + name: 'usage', + description: 'Start MCP server for AI assistant integration', + }, + run({ args }) { + console.log('Parsed args:', args) + }, +}) diff --git a/src/commands/migrate.ts b/src/commands/migrate.ts new file mode 100644 index 0000000..7c4bb1c --- /dev/null +++ b/src/commands/migrate.ts @@ -0,0 +1,11 @@ +import { defineCommand } from 'citty' + +export default defineCommand({ + meta: { + name: 'migrate', + description: 'Version migration guide with optional auto-fix', + }, + run({ args }) { + console.log('Parsed args:', args) + }, +}) diff --git a/src/commands/semantic.ts b/src/commands/semantic.ts new file mode 100644 index 0000000..d939f44 --- /dev/null +++ b/src/commands/semantic.ts @@ -0,0 +1,11 @@ +import { defineCommand } from 'citty' + +export default defineCommand({ + meta: { + name: 'semantic', + description: 'Query the semantic customization structure of a component', + }, + run({ args }) { + console.log('Parsed args:', args) + }, +}) diff --git a/src/commands/setup.ts b/src/commands/setup.ts new file mode 100644 index 0000000..c2dcc5d --- /dev/null +++ b/src/commands/setup.ts @@ -0,0 +1,11 @@ +import { defineCommand } from 'citty' + +export default defineCommand({ + meta: { + name: 'setup', + description: 'Set up Ant Design MCP/Skill for AI agents or GitHub Actions', + }, + run({ args }) { + console.log('Parsed args:', args) + }, +}) diff --git a/src/commands/token.ts b/src/commands/token.ts new file mode 100644 index 0000000..c5d8a8e --- /dev/null +++ b/src/commands/token.ts @@ -0,0 +1,11 @@ +import { defineCommand } from 'citty' + +export default defineCommand({ + meta: { + name: 'token', + description: 'Query Design Tokens (global or component-level)', + }, + run({ args }) { + console.log('Parsed args:', args) + }, +}) diff --git a/src/commands/upgrade.ts b/src/commands/upgrade.ts new file mode 100644 index 0000000..e98503c --- /dev/null +++ b/src/commands/upgrade.ts @@ -0,0 +1,11 @@ +import { defineCommand } from 'citty' + +export default defineCommand({ + meta: { + name: 'upgrade', + description: 'Upgrade the CLI to the latest version', + }, + run({ args }) { + console.log('Parsed args:', args) + }, +}) diff --git a/src/commands/usage.ts b/src/commands/usage.ts new file mode 100644 index 0000000..5cafc7d --- /dev/null +++ b/src/commands/usage.ts @@ -0,0 +1,11 @@ +import { defineCommand } from 'citty' + +export default defineCommand({ + meta: { + name: 'usage', + description: 'Scan project for antd component/API usage statistics', + }, + run({ args }) { + console.log('Parsed args:', args) + }, +}) diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..906153e --- /dev/null +++ b/src/index.ts @@ -0,0 +1,52 @@ +import { createMain, defineCommand, showUsage } from 'citty' +import { createHelpBanner } from '@/utils/banner.ts' +import { description, name, version } from '../package.json' with { type: 'json' } + +declare const __CLI_VERSION__: string +const CLI_VERSION = __CLI_VERSION__ + +const main = defineCommand({ + meta: { + name, + version, + description, + }, + + setup() { + console.log(createHelpBanner(CLI_VERSION)) + }, + args: { + cwd: { + type: 'string', + description: 'Current working directory', + alias: 'c', + default: process.cwd(), + }, + }, + subCommands: { + // TODO + 'bug': () => import('./commands/bug.ts').then(r => r.default), + 'bug-cli': () => import('./commands/bug-cli.ts').then(r => r.default), + 'changelog': () => import('./commands/changelog.ts').then(r => r.default), + 'demo': () => import('./commands/demo.ts').then(r => r.default), + 'design': () => import('./commands/design.ts').then(r => r.default), + 'doc': () => import('./commands/doc.ts').then(r => r.default), + 'doctor': () => import('./commands/doctor.ts').then(r => r.default), + 'env': () => import('./commands/env.ts').then(r => r.default), + 'info': () => import('./commands/info.ts').then(r => r.default), + 'lint': () => import('./commands/lint.ts').then(r => r.default), + 'list': () => import('./commands/list.ts').then(r => r.default), + 'mcp': () => import('./commands/mcp.ts').then(r => r.default), + 'migrate': () => import('./commands/migrate.ts').then(r => r.default), + 'semantic': () => import('./commands/semantic.ts').then(r => r.default), + 'setup': () => import('./commands/setup.ts').then(r => r.default), + 'token': () => import('./commands/token.ts').then(r => r.default), + 'upgrade': () => import('./commands/upgrade.ts').then(r => r.default), + 'usage': () => import('./commands/usage.ts').then(r => r.default), + }, + async run({ cmd }) { + await showUsage(cmd) + }, +}) + +createMain(main)({}) diff --git a/src/utils/banner.ts b/src/utils/banner.ts new file mode 100644 index 0000000..7fc3610 --- /dev/null +++ b/src/utils/banner.ts @@ -0,0 +1,9 @@ +export const createHelpBanner = (version: string): string => { + const label = `@antdv-next/cli v${version}` + const divider = '─'.repeat(label.length) + + return ` +${label} +${divider} +` +} diff --git a/tsdown.config.ts b/tsdown.config.ts new file mode 100644 index 0000000..61882b3 --- /dev/null +++ b/tsdown.config.ts @@ -0,0 +1,12 @@ +import { readFileSync } from 'node:fs' +import { defineConfig } from 'tsdown' + +const { version } = JSON.parse(readFileSync('package.json', 'utf-8')) + +export default defineConfig({ + clean: true, + dts: true, + define: { + __CLI_VERSION__: JSON.stringify(version), + }, +}) From 9ea963fbdfd006accc4df996676658e3677789b6 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Tue, 11 Aug 2026 16:36:49 +0800 Subject: [PATCH 010/106] feat(cli): customize usage display with help banner - Import renderUsage function from citty module - Add custom showUsage implementation to createMain - Display help banner before command usage - Render command usage asynchronously with parent context - Maintain CLI version information in banner display --- src/index.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/index.ts b/src/index.ts index 906153e..b9f1c9c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,4 @@ -import { createMain, defineCommand, showUsage } from 'citty' +import { createMain, defineCommand, renderUsage, showUsage } from 'citty' import { createHelpBanner } from '@/utils/banner.ts' import { description, name, version } from '../package.json' with { type: 'json' } @@ -49,4 +49,10 @@ const main = defineCommand({ }, }) -createMain(main)({}) +createMain(main)({ + async showUsage(cmd, parent) { + console.log(createHelpBanner(CLI_VERSION)) + + console.log(await renderUsage(cmd, parent)) + }, +}) From b3fe8b8dc5f9c6def8f41e3c380c10982533bf8b Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Tue, 11 Aug 2026 16:52:02 +0800 Subject: [PATCH 011/106] chore(cli): remove unnecessary blank line in index setup function - Removed extra blank line in the setup function of src/index.ts - Maintained the original functionality while improving code formatting consistency --- src/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index b9f1c9c..a963c6d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -11,7 +11,6 @@ const main = defineCommand({ version, description, }, - setup() { console.log(createHelpBanner(CLI_VERSION)) }, From 512d6ced1d104ba4a42717f6b2be04c949fa7294 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Tue, 11 Aug 2026 22:53:35 +0800 Subject: [PATCH 012/106] types(config): add tsdown/client types to tsconfig - Added tsdown/client type definition to types array in tsconfig.json - This enables proper type checking for tsdown client functionality - Resolves potential type errors when using tsdown client features --- tsconfig.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tsconfig.json b/tsconfig.json index 2d4be81..e4e0942 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -12,7 +12,8 @@ }, "resolveJsonModule": true, "types": [ - "node" + "node", + "tsdown/client" ], "noUnusedLocals": false, "noUnusedParameters": false, From a17b343a21f304ff7273d4d6ac3cfc72c170901e Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Tue, 11 Aug 2026 22:54:12 +0800 Subject: [PATCH 013/106] feat(constants): add dirname constant utility - Import dirname and fileURLToPath from node modules - Export __dirname constant using import.meta.url - Provide cross-platform path resolution utility - Enable consistent directory path handling across the application --- src/constants/dirname.ts | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 src/constants/dirname.ts diff --git a/src/constants/dirname.ts b/src/constants/dirname.ts new file mode 100644 index 0000000..fd37529 --- /dev/null +++ b/src/constants/dirname.ts @@ -0,0 +1,4 @@ +import { dirname } from 'node:path' +import { fileURLToPath } from 'node:url' + +export const __dirname = dirname(fileURLToPath(import.meta.url)) From e81d34750cfc509c1f928102646e7efe2f0f8934 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Wed, 12 Aug 2026 13:52:03 +0800 Subject: [PATCH 014/106] ci(workflow): add pkg.pr.new publishing workflow for pull requests - Configure pull request trigger for package publishing - Set up Ubuntu runner with 30-minute timeout - Add checkout step using actions/checkout@v7 - Integrate pnpm action setup for dependency management - Configure Node.js LTS with pnpm caching - Implement dependency installation and build steps - Add pkg.pr.new publishing command execution --- .github/workflows/pkg.pr.new.yml | 36 ++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 .github/workflows/pkg.pr.new.yml diff --git a/.github/workflows/pkg.pr.new.yml b/.github/workflows/pkg.pr.new.yml new file mode 100644 index 0000000..e7e2e48 --- /dev/null +++ b/.github/workflows/pkg.pr.new.yml @@ -0,0 +1,36 @@ +name: Publish pkg.pr.new + +on: + pull_request: { } + +permissions: + contents: read + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} + cancel-in-progress: true + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v7 + + - name: Use pnpm + uses: pnpm/action-setup@v6 + + - uses: actions/setup-node@v7 + with: + node-version: lts/* + cache: pnpm + + - name: Install dependencies + run: pnpm i + + - name: Build + run: pnpm build + + - name: Publish pkg.pr.new + run: npx pkg-pr-new publish From 3c1958bfae4a3d1a92f0a7c95e428180433878ba Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Wed, 12 Aug 2026 13:54:07 +0800 Subject: [PATCH 015/106] ci(pr-welcome): update pull request contributor welcome workflow name - Changed workflow name from "PullRequest Contributor Welcome" to "Pull Request Contributor Welcome" - Improved readability by adding space between words in workflow title --- .github/workflows/pr-contributor-welcome.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pr-contributor-welcome.yml b/.github/workflows/pr-contributor-welcome.yml index 3da6e24..f581b20 100644 --- a/.github/workflows/pr-contributor-welcome.yml +++ b/.github/workflows/pr-contributor-welcome.yml @@ -1,4 +1,4 @@ -name: PullRequest Contributor Welcome +name: Pull Request Contributor Welcome on: pull_request_target: From adb6c6acd24abd4bc23b5509b68dcac77382bca7 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Wed, 12 Aug 2026 13:58:58 +0800 Subject: [PATCH 016/106] feat(deps): add vitest testing framework and update dependencies - Add vitest dependency for testing capabilities - Update @antfu/eslint-config with vitest integration - Include chai assertion library and related type definitions - Add vitest-related packages (@vitest/expect, @vitest/mocker, etc.) - Include supporting libraries (assertion-error, convert-source-map, etc.) - Add various platform-specific lightningcss binaries - Update package lockfile with new dependency tree --- package.json | 3 +- pnpm-lock.yaml | 426 ++++++++++++++++++++++++++++++++++++++++++++++- vitest.config.ts | 15 ++ 3 files changed, 439 insertions(+), 5 deletions(-) create mode 100644 vitest.config.ts diff --git a/package.json b/package.json index cdbcdb7..0d17b6b 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,8 @@ "tsdown": "^0.22.14", "tsx": "^4.23.12", "typescript": "^6.0.3", - "verify-git-commit": "^0.0.1" + "verify-git-commit": "^0.0.1", + "vitest": "^4.1.10" }, "simple-git-hooks": { "pre-commit": "npx lint-staged", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e2f85f2..ec98850 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -20,7 +20,7 @@ importers: devDependencies: '@antfu/eslint-config': specifier: ^9.3.0 - version: 9.3.0(@typescript-eslint/typescript-estree@8.66.0(typescript@6.0.3))(@typescript-eslint/utils@8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(@vue/compiler-sfc@3.5.41)(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) + version: 9.3.0(@typescript-eslint/typescript-estree@8.66.0(typescript@6.0.3))(@typescript-eslint/utils@8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(@vue/compiler-sfc@3.5.41)(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3)(vitest@4.1.10(@types/node@26.2.0)(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))) '@lonewolfyx/tsconfig': specifier: ^0.0.6 version: 0.0.6(typescript@6.0.3) @@ -54,6 +54,9 @@ importers: verify-git-commit: specifier: ^0.0.1 version: 0.0.1 + vitest: + specifier: ^4.1.10 + version: 4.1.10(@types/node@26.2.0)(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) packages: @@ -524,15 +527,24 @@ packages: resolution: {integrity: sha512-TeheYy0ILzBEI/CO55CP6zJCSdSWeRtGnHy8U8dWSUH4I68iqTsy7HkMktR4xakThc9jotkPQUXT4ITdbV7cHA==} engines: {node: '>=18'} + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + '@stylistic/eslint-plugin@5.10.0': resolution: {integrity: sha512-nPK52ZHvot8Ju/0A4ucSX1dcPV2/1clx0kLcH5wDmrE4naKso7TUC/voUyU1O9OTKTrR6MYip6LP0ogEMQ9jPQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^9.0.0 || ^10.0.0 + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + '@types/debug@4.1.13': resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/esrecurse@4.3.1': resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} @@ -635,6 +647,35 @@ packages: vitest: optional: true + '@vitest/expect@4.1.10': + resolution: {integrity: sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==} + + '@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 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@4.1.10': + resolution: {integrity: sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q==} + + '@vitest/runner@4.1.10': + resolution: {integrity: sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg==} + + '@vitest/snapshot@4.1.10': + resolution: {integrity: sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw==} + + '@vitest/spy@4.1.10': + resolution: {integrity: sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==} + + '@vitest/utils@4.1.10': + resolution: {integrity: sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==} + '@vue/compiler-core@3.5.41': resolution: {integrity: sha512-q0Xtv/F9w2YO/7htQhtiL+Ev2WCJbe5N2hc+XfgyKkEKqWpSxknmT8QOuGdEKNdjPq0c3F7rNpFkTo3Kfrm7pg==} @@ -806,6 +847,10 @@ packages: resolution: {integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==} engines: {node: '>=14'} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + balanced-match@4.0.4: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} @@ -841,6 +886,10 @@ packages: ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + chai@6.2.2: + resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} + engines: {node: '>=18'} + change-case@5.4.4: resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} @@ -872,6 +921,9 @@ packages: resolution: {integrity: sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==} engines: {node: '>=12'} + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + core-js-compat@3.50.0: resolution: {integrity: sha512-XGpFGbMLHwSt74YLTKho7Ib242qi6O8MSX+sRokV4oz7iKXvQWGYZthjIhjRGMxjzVkAubBO512dKGYcefmX3Q==} engines: {node: '>=6.4.0'} @@ -911,6 +963,10 @@ packages: resolution: {integrity: sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A==} engines: {node: '>=12.20'} + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} @@ -946,6 +1002,9 @@ packages: resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} engines: {node: '>=0.12'} + es-module-lexer@2.3.1: + resolution: {integrity: sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==} + esbuild@0.28.2: resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==} engines: {node: '>=18'} @@ -1160,10 +1219,17 @@ packages: estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} + expect-type@1.4.0: + resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} + engines: {node: '>=12.0.0'} + exsolve@1.1.1: resolution: {integrity: sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g==} @@ -1351,6 +1417,80 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + lightningcss-android-arm64@1.33.0: + resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.33.0: + resolution: {integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.33.0: + resolution: {integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.33.0: + resolution: {integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.33.0: + resolution: {integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.33.0: + resolution: {integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + lightningcss-linux-arm64-musl@1.33.0: + resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + lightningcss-linux-x64-gnu@1.33.0: + resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + lightningcss-linux-x64-musl@1.33.0: + resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + lightningcss-win32-arm64-msvc@1.33.0: + resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.33.0: + resolution: {integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.33.0: + resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==} + engines: {node: '>= 12.0.0'} + lint-staged@17.3.0: resolution: {integrity: sha512-woZS3vNe3UKqBaLPvbLOtKRY4tLANpWQhom12MGWqC8Mh1lCOO+WgSwmX2amjJAqTY9BkXYW87fCUH5H9Ph6xw==} engines: {node: '>=22.22.1'} @@ -1698,6 +1838,9 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + simple-git-hooks@2.13.1: resolution: {integrity: sha512-WszCLXwT4h2k1ufIXAgsbiTOazqqevFCIncOuUBZJ91DdvWcC5+OFkluWRQPrcuSYd8fjq+o2y1QfWqYMoAToQ==} hasBin: true @@ -1718,6 +1861,12 @@ packages: spdx-license-ids@3.0.23: resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==} + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + std-env@4.2.0: + resolution: {integrity: sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==} + string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} @@ -1742,6 +1891,9 @@ packages: resolution: {integrity: sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==} engines: {node: '>=12'} + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + tinyexec@1.3.0: resolution: {integrity: sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==} engines: {node: '>=18'} @@ -1750,6 +1902,10 @@ packages: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} + tinyrainbow@3.1.1: + resolution: {integrity: sha512-yau8yJdTt989Mm0Bd/236QnzEiPf2xLLTqUZRUJOo/3CB078LSwzei343DgtJVmfJKJE3TMINY1u42SQsP6mXw==} + engines: {node: '>=14.0.0'} + to-valid-identifier@1.0.0: resolution: {integrity: sha512-41wJyvKep3yT2tyPqX/4blcfybknGB4D+oETKLs7Q76UiPqRpUJK3hr1nxelyYO0PHKVzJwlu0aCeEAsGI6rpw==} engines: {node: '>=20'} @@ -1864,6 +2020,90 @@ packages: resolution: {integrity: sha512-zj/ob3UsvJGN0whEAKFp53REA5X66hvffVqoCtVQAakJKnKlH+/PcOfMoFwIG/o4rElqLv/ycAFlx8ZlXUorCg==} engines: {node: '>=18.12.0'} + vite@8.2.1: + resolution: {integrity: sha512-EU/eS7BH3XROHh2YnBefjM6DBKA6ZeMZEYQbj7NLWg5wHYlhB8B/Mayd5XsgWq+NFYccDOTemRpdETWR6Ka/lw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.4.0 + esbuild: ^0.27.0 || ^0.28.0 + jiti: '>=1.21.0' + less: ^4.0.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + '@vitejs/devtools': + optional: true + esbuild: + optional: true + jiti: + optional: true + less: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + 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.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 + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@opentelemetry/api': + optional: true + '@types/node': + optional: true + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': + optional: true + '@vitest/coverage-istanbul': + optional: true + '@vitest/coverage-v8': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + vue-eslint-parser@10.4.1: resolution: {integrity: sha512-Gk6gRDj0n/fkRa3C3l0bBheoBckUq/Rs0F/TvMWIS6nzzx67amAViMe9CkNgsP2tXyQONvGiHQESHwFtZ3aYDA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1878,6 +2118,11 @@ packages: engines: {node: '>= 8'} hasBin: true + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -1913,7 +2158,7 @@ packages: snapshots: - '@antfu/eslint-config@9.3.0(@typescript-eslint/typescript-estree@8.66.0(typescript@6.0.3))(@typescript-eslint/utils@8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(@vue/compiler-sfc@3.5.41)(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3)': + '@antfu/eslint-config@9.3.0(@typescript-eslint/typescript-estree@8.66.0(typescript@6.0.3))(@typescript-eslint/utils@8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(@vue/compiler-sfc@3.5.41)(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3)(vitest@4.1.10(@types/node@26.2.0)(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))': dependencies: '@antfu/install-pkg': 2.0.1 '@clack/prompts': 1.7.0 @@ -1923,7 +2168,7 @@ snapshots: '@stylistic/eslint-plugin': 5.10.0(eslint@10.8.1(jiti@2.7.0)) '@typescript-eslint/eslint-plugin': 8.66.0(@typescript-eslint/parser@8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) '@typescript-eslint/parser': 8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) - '@vitest/eslint-plugin': 1.6.27(@typescript-eslint/eslint-plugin@8.66.0(@typescript-eslint/parser@8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) + '@vitest/eslint-plugin': 1.6.27(@typescript-eslint/eslint-plugin@8.66.0(@typescript-eslint/parser@8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3)(vitest@4.1.10(@types/node@26.2.0)(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))) ansis: 4.3.1 cac: 7.0.0 eslint: 10.8.1(jiti@2.7.0) @@ -2242,6 +2487,8 @@ snapshots: '@sindresorhus/base62@1.0.0': {} + '@standard-schema/spec@1.1.0': {} + '@stylistic/eslint-plugin@5.10.0(eslint@10.8.1(jiti@2.7.0))': dependencies: '@eslint-community/eslint-utils': 4.10.1(eslint@10.8.1(jiti@2.7.0)) @@ -2252,10 +2499,17 @@ snapshots: estraverse: 5.3.0 picomatch: 4.0.5 + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 + '@types/debug@4.1.13': dependencies: '@types/ms': 2.1.0 + '@types/deep-eql@4.0.2': {} + '@types/esrecurse@4.3.1': {} '@types/estree@1.0.9': {} @@ -2371,7 +2625,7 @@ snapshots: '@typescript-eslint/types': 8.66.0 eslint-visitor-keys: 5.0.1 - '@vitest/eslint-plugin@1.6.27(@typescript-eslint/eslint-plugin@8.66.0(@typescript-eslint/parser@8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3)': + '@vitest/eslint-plugin@1.6.27(@typescript-eslint/eslint-plugin@8.66.0(@typescript-eslint/parser@8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3)(vitest@4.1.10(@types/node@26.2.0)(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))': dependencies: '@typescript-eslint/scope-manager': 8.66.0 '@typescript-eslint/utils': 8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) @@ -2379,9 +2633,51 @@ snapshots: optionalDependencies: '@typescript-eslint/eslint-plugin': 8.66.0(@typescript-eslint/parser@8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) typescript: 6.0.3 + vitest: 4.1.10(@types/node@26.2.0)(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) transitivePeerDependencies: - supports-color + '@vitest/expect@4.1.10': + dependencies: + '@standard-schema/spec': 1.1.0 + '@types/chai': 5.2.3 + '@vitest/spy': 4.1.10 + '@vitest/utils': 4.1.10 + chai: 6.2.2 + tinyrainbow: 3.1.1 + + '@vitest/mocker@4.1.10(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))': + dependencies: + '@vitest/spy': 4.1.10 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0) + + '@vitest/pretty-format@4.1.10': + dependencies: + tinyrainbow: 3.1.1 + + '@vitest/runner@4.1.10': + dependencies: + '@vitest/utils': 4.1.10 + pathe: 2.0.3 + + '@vitest/snapshot@4.1.10': + dependencies: + '@vitest/pretty-format': 4.1.10 + '@vitest/utils': 4.1.10 + magic-string: 0.30.21 + pathe: 2.0.3 + + '@vitest/spy@4.1.10': {} + + '@vitest/utils@4.1.10': + dependencies: + '@vitest/pretty-format': 4.1.10 + convert-source-map: 2.0.0 + tinyrainbow: 3.1.1 + '@vue/compiler-core@3.5.41': dependencies: '@babel/parser': 7.29.8 @@ -2505,6 +2801,8 @@ snapshots: are-docs-informative@0.0.2: {} + assertion-error@2.0.1: {} + balanced-match@4.0.4: {} baseline-browser-mapping@2.11.13: {} @@ -2531,6 +2829,8 @@ snapshots: ccount@2.0.1: {} + chai@6.2.2: {} + change-case@5.4.4: {} character-entities@2.0.2: {} @@ -2549,6 +2849,8 @@ snapshots: convert-hrtime@5.0.0: {} + convert-source-map@2.0.0: {} + core-js-compat@3.50.0: dependencies: browserslist: 4.28.8 @@ -2577,6 +2879,8 @@ snapshots: detect-indent@7.0.2: {} + detect-libc@2.1.2: {} + devlop@1.1.0: dependencies: dequal: 2.0.3 @@ -2598,6 +2902,8 @@ snapshots: entities@7.0.1: {} + es-module-lexer@2.3.1: {} + esbuild@0.28.2: optionalDependencies: '@esbuild/aix-ppc64': 0.28.2 @@ -2907,8 +3213,14 @@ snapshots: estree-walker@2.0.2: {} + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.9 + esutils@2.0.3: {} + expect-type@1.4.0: {} + exsolve@1.1.1: {} fast-deep-equal@3.1.3: {} @@ -3054,6 +3366,55 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + lightningcss-android-arm64@1.33.0: + optional: true + + lightningcss-darwin-arm64@1.33.0: + optional: true + + lightningcss-darwin-x64@1.33.0: + optional: true + + lightningcss-freebsd-x64@1.33.0: + optional: true + + lightningcss-linux-arm-gnueabihf@1.33.0: + optional: true + + lightningcss-linux-arm64-gnu@1.33.0: + optional: true + + lightningcss-linux-arm64-musl@1.33.0: + optional: true + + lightningcss-linux-x64-gnu@1.33.0: + optional: true + + lightningcss-linux-x64-musl@1.33.0: + optional: true + + lightningcss-win32-arm64-msvc@1.33.0: + optional: true + + lightningcss-win32-x64-msvc@1.33.0: + optional: true + + lightningcss@1.33.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.33.0 + lightningcss-darwin-arm64: 1.33.0 + lightningcss-darwin-x64: 1.33.0 + lightningcss-freebsd-x64: 1.33.0 + lightningcss-linux-arm-gnueabihf: 1.33.0 + lightningcss-linux-arm64-gnu: 1.33.0 + lightningcss-linux-arm64-musl: 1.33.0 + lightningcss-linux-x64-gnu: 1.33.0 + lightningcss-linux-x64-musl: 1.33.0 + lightningcss-win32-arm64-msvc: 1.33.0 + lightningcss-win32-x64-msvc: 1.33.0 + lint-staged@17.3.0: dependencies: picomatch: 4.0.5 @@ -3599,6 +3960,8 @@ snapshots: shebang-regex@3.0.0: {} + siginfo@2.0.0: {} + simple-git-hooks@2.13.1: {} sisteransi@1.0.5: {} @@ -3614,6 +3977,10 @@ snapshots: spdx-license-ids@3.0.23: {} + stackback@0.0.2: {} + + std-env@4.2.0: {} + string-argv@0.3.2: {} strip-indent@4.1.1: {} @@ -3634,6 +4001,8 @@ snapshots: dependencies: convert-hrtime: 5.0.0 + tinybench@2.9.0: {} + tinyexec@1.3.0: {} tinyglobby@0.2.17: @@ -3641,6 +4010,8 @@ snapshots: fdir: 6.5.0(picomatch@4.0.5) picomatch: 4.0.5 + tinyrainbow@3.1.1: {} + to-valid-identifier@1.0.0: dependencies: '@sindresorhus/base62': 1.0.0 @@ -3745,6 +4116,48 @@ snapshots: verkit@0.3.2: {} + vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0): + dependencies: + lightningcss: 1.33.0 + picomatch: 4.0.5 + postcss: 8.5.26 + rolldown: 1.2.3 + tinyglobby: 0.2.17 + optionalDependencies: + '@types/node': 26.2.0 + esbuild: 0.28.2 + fsevents: 2.3.3 + jiti: 2.7.0 + tsx: 4.23.12 + yaml: 2.9.0 + + vitest@4.1.10(@types/node@26.2.0)(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)): + dependencies: + '@vitest/expect': 4.1.10 + '@vitest/mocker': 4.1.10(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(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.3.1 + expect-type: 1.4.0 + magic-string: 0.30.21 + obug: 2.1.4 + pathe: 2.0.3 + picomatch: 4.0.5 + std-env: 4.2.0 + tinybench: 2.9.0 + tinyexec: 1.3.0 + tinyglobby: 0.2.17 + tinyrainbow: 3.1.1 + vite: 8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 26.2.0 + transitivePeerDependencies: + - msw + vue-eslint-parser@10.4.1(eslint@10.8.1(jiti@2.7.0)): dependencies: debug: 4.4.3 @@ -3763,6 +4176,11 @@ snapshots: dependencies: isexe: 2.0.0 + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + word-wrap@1.2.5: {} xml-name-validator@5.0.0: {} diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 0000000..50f403e --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,15 @@ +import { readFileSync } from 'node:fs' +import { defineConfig } from 'vitest/config' + +const { version } = JSON.parse(readFileSync('package.json', 'utf-8')) + +export default defineConfig({ + define: { + __CLI_VERSION__: JSON.parse(JSON.stringify(version)), + }, + resolve: { + alias: { + '@/': new URL('./src/', import.meta.url).pathname, + }, + }, +}) From a2e4f16475288605d5a7e81ae662eac4f6852f7a Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Wed, 12 Aug 2026 14:09:06 +0800 Subject: [PATCH 017/106] perf(vitest): optimize CLI version definition in config - Replace JSON.parse(JSON.stringify()) with direct JSON.stringify() - Remove unnecessary parsing operation for version string - Improve configuration loading performance --- vitest.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vitest.config.ts b/vitest.config.ts index 50f403e..16251e3 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -5,7 +5,7 @@ const { version } = JSON.parse(readFileSync('package.json', 'utf-8')) export default defineConfig({ define: { - __CLI_VERSION__: JSON.parse(JSON.stringify(version)), + __CLI_VERSION__: JSON.stringify(version), }, resolve: { alias: { From b52d70d91c31009382134b623ed5a0fa51831b94 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Wed, 12 Aug 2026 14:35:26 +0800 Subject: [PATCH 018/106] refactor(cli): extract subCommands object and update command handling - Extracted subCommands definition into separate constant object - Updated main command to use the extracted subCommands object - Modified run function to properly handle subcommand routing - Added conditional check for subcommand existence before showing usage - Maintained all existing subcommand imports and functionality --- src/index.ts | 52 +++++++++++++++++++++++++++++----------------------- 1 file changed, 29 insertions(+), 23 deletions(-) diff --git a/src/index.ts b/src/index.ts index a963c6d..1dd2eb2 100644 --- a/src/index.ts +++ b/src/index.ts @@ -5,6 +5,28 @@ import { description, name, version } from '../package.json' with { type: 'json' declare const __CLI_VERSION__: string const CLI_VERSION = __CLI_VERSION__ +const subCommands = { + // TODO + 'bug': () => import('./commands/bug.ts').then(r => r.default), + 'bug-cli': () => import('./commands/bug-cli.ts').then(r => r.default), + 'changelog': () => import('./commands/changelog.ts').then(r => r.default), + 'demo': () => import('./commands/demo.ts').then(r => r.default), + 'design': () => import('./commands/design.ts').then(r => r.default), + 'doc': () => import('./commands/doc.ts').then(r => r.default), + 'doctor': () => import('./commands/doctor.ts').then(r => r.default), + 'env': () => import('./commands/env.ts').then(r => r.default), + 'info': () => import('./commands/info.ts').then(r => r.default), + 'lint': () => import('./commands/lint.ts').then(r => r.default), + 'list': () => import('./commands/list.ts').then(r => r.default), + 'mcp': () => import('./commands/mcp.ts').then(r => r.default), + 'migrate': () => import('./commands/migrate.ts').then(r => r.default), + 'semantic': () => import('./commands/semantic.ts').then(r => r.default), + 'setup': () => import('./commands/setup.ts').then(r => r.default), + 'token': () => import('./commands/token.ts').then(r => r.default), + 'upgrade': () => import('./commands/upgrade.ts').then(r => r.default), + 'usage': () => import('./commands/usage.ts').then(r => r.default), +} + const main = defineCommand({ meta: { name, @@ -22,29 +44,13 @@ const main = defineCommand({ default: process.cwd(), }, }, - subCommands: { - // TODO - 'bug': () => import('./commands/bug.ts').then(r => r.default), - 'bug-cli': () => import('./commands/bug-cli.ts').then(r => r.default), - 'changelog': () => import('./commands/changelog.ts').then(r => r.default), - 'demo': () => import('./commands/demo.ts').then(r => r.default), - 'design': () => import('./commands/design.ts').then(r => r.default), - 'doc': () => import('./commands/doc.ts').then(r => r.default), - 'doctor': () => import('./commands/doctor.ts').then(r => r.default), - 'env': () => import('./commands/env.ts').then(r => r.default), - 'info': () => import('./commands/info.ts').then(r => r.default), - 'lint': () => import('./commands/lint.ts').then(r => r.default), - 'list': () => import('./commands/list.ts').then(r => r.default), - 'mcp': () => import('./commands/mcp.ts').then(r => r.default), - 'migrate': () => import('./commands/migrate.ts').then(r => r.default), - 'semantic': () => import('./commands/semantic.ts').then(r => r.default), - 'setup': () => import('./commands/setup.ts').then(r => r.default), - 'token': () => import('./commands/token.ts').then(r => r.default), - 'upgrade': () => import('./commands/upgrade.ts').then(r => r.default), - 'usage': () => import('./commands/usage.ts').then(r => r.default), - }, - async run({ cmd }) { - await showUsage(cmd) + subCommands, + async run(ctx) { + if (ctx.rawArgs.length >= 1 && Object.keys(subCommands).includes(ctx.rawArgs[0]!)) { + return '' + } + + await showUsage(ctx.cmd) }, }) From 6600c9f0fe0076bf07f417025299798d7f5e67c5 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Wed, 12 Aug 2026 14:42:44 +0800 Subject: [PATCH 019/106] fix(cli): move help banner log to proper location in command setup - Removed console.log from setup function - Added console.log back in the correct location after showUsage call - Ensures help banner displays properly when command is executed --- src/index.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index 1dd2eb2..cfc97a8 100644 --- a/src/index.ts +++ b/src/index.ts @@ -34,7 +34,6 @@ const main = defineCommand({ description, }, setup() { - console.log(createHelpBanner(CLI_VERSION)) }, args: { cwd: { @@ -50,6 +49,8 @@ const main = defineCommand({ return '' } + console.log(createHelpBanner(CLI_VERSION)) + await showUsage(ctx.cmd) }, }) From c84e991eee282b9641b7c734ac854f3d5c3463f0 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Wed, 12 Aug 2026 14:43:12 +0800 Subject: [PATCH 020/106] test(cli): add CLI integration tests with vitest - Add vitest as testing framework with test scripts - Create comprehensive CLI test suite covering basic commands - Implement helper functions for temporary directory management - Add test cases for 'antdv' and 'antdv env' commands - Integrate tinyexec for subprocess command execution - Set up proper test environment with mock directories - Configure before/after hooks for test cleanup --- package.json | 5 ++++- pnpm-lock.yaml | 3 +++ test/cli.test.ts | 53 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 test/cli.test.ts diff --git a/package.json b/package.json index 0d17b6b..299a180 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,9 @@ "lint": "eslint .", "lint:fix": "eslint --fix", "prepublishOnly": "pnpm build", - "prepare": "simple-git-hooks" + "prepare": "simple-git-hooks", + "test": "vitest run", + "test:watch": "vitest" }, "dependencies": { "@clack/prompts": "^1.7.0", @@ -55,6 +57,7 @@ "lint-staged": "^17.3.0", "picocolors": "^1.1.1", "simple-git-hooks": "^2.13.1", + "tinyexec": "^1.3.0", "tsdown": "^0.22.14", "tsx": "^4.23.12", "typescript": "^6.0.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ec98850..04ba105 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -42,6 +42,9 @@ importers: simple-git-hooks: specifier: ^2.13.1 version: 2.13.1 + tinyexec: + specifier: ^1.3.0 + version: 1.3.0 tsdown: specifier: ^0.22.14 version: 0.22.14(tsx@4.23.12)(typescript@6.0.3) diff --git a/test/cli.test.ts b/test/cli.test.ts new file mode 100644 index 0000000..0aa779e --- /dev/null +++ b/test/cli.test.ts @@ -0,0 +1,53 @@ +import fs from 'node:fs/promises' +import process from 'node:process' +import { fileURLToPath } from 'node:url' +import { x } from 'tinyexec' +import { afterAll, beforeEach, describe, expect, it } from 'vitest' + +const CLI_PATH = fileURLToPath(new URL('../bin/antdv.js', import.meta.url)) +const genPath = fileURLToPath(new URL(`../.temp/${randomStr()}`, import.meta.url)) + +function randomStr() { + return Math.random().toString(36).slice(2) +} + +async function run(params: string[] = [], env = { + SKIP_PROMPT: '1', + NO_COLOR: '1', +}) { + return x(process.execPath, [CLI_PATH, ...params], { + throwOnError: true, + nodeOptions: { + cwd: genPath, + env: { + ...process.env, + ...env, + }, + }, + }) +} + +async function createMockDir() { + await fs.rm(genPath, { recursive: true, force: true }) + await fs.mkdir(genPath, { recursive: true }) +} + +beforeEach(async () => await createMockDir()) +afterAll(async () => await fs.rm(genPath, { + recursive: true, + force: true, +})) + +describe('cli', () => { + it('run antdv command', async () => { + const { stdout } = await run() + + expect(stdout).toContain('@antdv-next/cli v0.0.0') + }) + + it('run antdv env command', async () => { + const { stdout } = await run(['env']) + + expect(stdout).toContain('Parsed args') + }) +}) From 4679b130962c740b0c7654783104828056042ba2 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Wed, 12 Aug 2026 14:43:35 +0800 Subject: [PATCH 021/106] fix(cli): replace inline args with defaultArgs import - Removed hardcoded cwd argument definition from index.ts - Imported defaultArgs from '@/args.ts' module - Replaced manual args configuration with defaultArgs reference - Maintained same functionality while improving code organization - Centralized argument definitions in separate module for better maintainability --- src/index.ts | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/index.ts b/src/index.ts index cfc97a8..107b7bf 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,5 @@ import { createMain, defineCommand, renderUsage, showUsage } from 'citty' +import { defaultArgs } from '@/args.ts' import { createHelpBanner } from '@/utils/banner.ts' import { description, name, version } from '../package.json' with { type: 'json' } @@ -35,14 +36,7 @@ const main = defineCommand({ }, setup() { }, - args: { - cwd: { - type: 'string', - description: 'Current working directory', - alias: 'c', - default: process.cwd(), - }, - }, + args: defaultArgs, subCommands, async run(ctx) { if (ctx.rawArgs.length >= 1 && Object.keys(subCommands).includes(ctx.rawArgs[0]!)) { From 811a14d246e2f5cefba472df8ce169d1e4b9ceb7 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Wed, 12 Aug 2026 14:43:51 +0800 Subject: [PATCH 022/106] feat(args): add command line arguments configuration - Define default arguments for current working directory with alias 'c' - Add output format option supporting json, text, and markdown formats - Create CommandArgs type extending ParsedArgs with deep writeable conversion - Implement DeepWriteable utility type to convert readonly properties - Set default values for cwd to process.cwd() and format to 'text' --- src/args.ts | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/args.ts diff --git a/src/args.ts b/src/args.ts new file mode 100644 index 0000000..1559c57 --- /dev/null +++ b/src/args.ts @@ -0,0 +1,22 @@ +import type { ParsedArgs } from 'citty' + +export const defaultArgs = { + cwd: { + type: 'string', + description: 'Current working directory', + alias: 'c', + default: process.cwd(), + }, + format: { + type: 'string', + description: 'Output format: json, text, or markdown', + alias: 'f', + default: 'text', + }, +} as const + +type DeepWriteable = { + -readonly [P in keyof T]: T[P] extends object ? DeepWriteable : T[P]; +} + +export type CommandArgs = ParsedArgs> From 4e2425aac5a123c2618163c81e82f3c7e848e34b Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Wed, 12 Aug 2026 15:01:28 +0800 Subject: [PATCH 023/106] refactor(test): extract test utilities to separate module - Move CLI_PATH, genPath, run, and createMockDir functions to new run.ts file - Replace local implementations with imports from shared test utilities - Remove unused imports and helper functions from cli.test.ts - Centralize test setup logic for better maintainability - Improve code organization by separating test utilities from test cases --- test/cli.test.ts | 32 +------------------------------- test/run.ts | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 31 deletions(-) create mode 100644 test/run.ts diff --git a/test/cli.test.ts b/test/cli.test.ts index 0aa779e..6b69032 100644 --- a/test/cli.test.ts +++ b/test/cli.test.ts @@ -1,36 +1,6 @@ import fs from 'node:fs/promises' -import process from 'node:process' -import { fileURLToPath } from 'node:url' -import { x } from 'tinyexec' import { afterAll, beforeEach, describe, expect, it } from 'vitest' - -const CLI_PATH = fileURLToPath(new URL('../bin/antdv.js', import.meta.url)) -const genPath = fileURLToPath(new URL(`../.temp/${randomStr()}`, import.meta.url)) - -function randomStr() { - return Math.random().toString(36).slice(2) -} - -async function run(params: string[] = [], env = { - SKIP_PROMPT: '1', - NO_COLOR: '1', -}) { - return x(process.execPath, [CLI_PATH, ...params], { - throwOnError: true, - nodeOptions: { - cwd: genPath, - env: { - ...process.env, - ...env, - }, - }, - }) -} - -async function createMockDir() { - await fs.rm(genPath, { recursive: true, force: true }) - await fs.mkdir(genPath, { recursive: true }) -} +import { createMockDir, genPath, run } from './run' beforeEach(async () => await createMockDir()) afterAll(async () => await fs.rm(genPath, { diff --git a/test/run.ts b/test/run.ts new file mode 100644 index 0000000..6090d38 --- /dev/null +++ b/test/run.ts @@ -0,0 +1,33 @@ +import type { ExecProcess } from 'tinyexec' +import fs from 'node:fs/promises' +import process from 'node:process' +import { fileURLToPath } from 'node:url' +import { x } from 'tinyexec' + +export const CLI_PATH = fileURLToPath(new URL('../bin/antdv.js', import.meta.url)) +export const genPath = fileURLToPath(new URL(`../.temp/${randomStr()}`, import.meta.url)) + +export function randomStr(): string { + return Math.random().toString(36).slice(2) +} + +export async function run(params: string[] = [], env = { + SKIP_PROMPT: '1', + NO_COLOR: '1', +}): Promise { + return x(process.execPath, [CLI_PATH, ...params], { + throwOnError: true, + nodeOptions: { + cwd: genPath, + env: { + ...process.env, + ...env, + }, + }, + }) +} + +export async function createMockDir(): Promise { + await fs.rm(genPath, { recursive: true, force: true }) + await fs.mkdir(genPath, { recursive: true }) +} From f5d6e3afc26f033c06de037f19fd9c10d0b0b2dd Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Wed, 12 Aug 2026 15:59:09 +0800 Subject: [PATCH 024/106] chore(tsconfig): add include pattern for source files - Added src/**/* to include all source files in compilation - Ensures proper TypeScript compilation of project files --- tsconfig.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tsconfig.json b/tsconfig.json index e4e0942..cb2416a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -18,5 +18,8 @@ "noUnusedLocals": false, "noUnusedParameters": false, "declarationMap": false - } + }, + "include": [ + "src/**/*" + ] } From 87aaed307924eab1dafbb9cd1af30cdea7e2940f Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Wed, 12 Aug 2026 15:59:35 +0800 Subject: [PATCH 025/106] feat(config): add configuration resolution and types - Create resolveConfig function to process command arguments - Add ResolvedConfig interface with cwd and format properties - Add PackageInfo interface with optional version and path fields - Implement configuration structure for command line options - Define type definitions for package information handling --- src/config.ts | 9 +++++++++ src/types.ts | 9 +++++++++ 2 files changed, 18 insertions(+) create mode 100644 src/config.ts create mode 100644 src/types.ts diff --git a/src/config.ts b/src/config.ts new file mode 100644 index 0000000..1c0e5cd --- /dev/null +++ b/src/config.ts @@ -0,0 +1,9 @@ +import type { CommandArgs } from '@/args.ts' +import type { ResolvedConfig } from '@/types.ts' + +export const resolveConfig = (options: CommandArgs): ResolvedConfig => { + return { + cwd: options.cwd, + format: options.format, + } +} diff --git a/src/types.ts b/src/types.ts new file mode 100644 index 0000000..e0c6b03 --- /dev/null +++ b/src/types.ts @@ -0,0 +1,9 @@ +export interface ResolvedConfig { + cwd: string + format: string +} + +export interface PackageInfo { + version?: string + path?: string +} From 2c59682f0529bd392d4b2d76968b75d75e878205 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Wed, 12 Aug 2026 16:25:15 +0800 Subject: [PATCH 026/106] feat(env): enhance environment information collection with detailed system and dependency data - Add comprehensive envinfo collection including system, binaries, managers, utilities, servers, IDEs, languages, databases and browsers - Integrate package version detection for core dependencies like antdv-next, vue, vite, typescript and other build tools - Implement ecosystem package scanning to identify @antdv-next and @v-c scoped packages - Add npm registry detection in binaries section - Create structured data output with text, markdown and JSON formatting options - Replace basic arg parsing with resolved config integration - Add proper error handling for package info retrieval and system command execution - Implement formatted table output for markdown rendering with proper alignment - Update command description from 'ant-related' to 'antdv-related' for clarity --- package.json | 6 +- pnpm-lock.yaml | 19 ++- src/commands/env.ts | 299 ++++++++++++++++++++++++++++++++++++++++- src/types/envinfo.d.ts | 20 +++ test/args.test.ts | 32 +++++ test/cli.test.ts | 22 ++- test/env.test.ts | 297 ++++++++++++++++++++++++++++++++++++++++ 7 files changed, 685 insertions(+), 10 deletions(-) create mode 100644 src/types/envinfo.d.ts create mode 100644 test/args.test.ts create mode 100644 test/env.test.ts diff --git a/package.json b/package.json index 299a180..854f54b 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,10 @@ "dependencies": { "@clack/prompts": "^1.7.0", "citty": "^0.2.2", - "pkg-types": "^2.3.1" + "envinfo": "^7.21.0", + "local-pkg": "^1.2.1", + "pkg-types": "^2.3.1", + "tinyexec": "^1.3.0" }, "devDependencies": { "@antfu/eslint-config": "^9.3.0", @@ -57,7 +60,6 @@ "lint-staged": "^17.3.0", "picocolors": "^1.1.1", "simple-git-hooks": "^2.13.1", - "tinyexec": "^1.3.0", "tsdown": "^0.22.14", "tsx": "^4.23.12", "typescript": "^6.0.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 04ba105..ea4a6ac 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,9 +14,18 @@ importers: citty: specifier: ^0.2.2 version: 0.2.2 + envinfo: + specifier: ^7.21.0 + version: 7.21.0 + local-pkg: + specifier: ^1.2.1 + version: 1.2.1 pkg-types: specifier: ^2.3.1 version: 2.3.1 + tinyexec: + specifier: ^1.3.0 + version: 1.3.0 devDependencies: '@antfu/eslint-config': specifier: ^9.3.0 @@ -42,9 +51,6 @@ importers: simple-git-hooks: specifier: ^2.13.1 version: 2.13.1 - tinyexec: - specifier: ^1.3.0 - version: 1.3.0 tsdown: specifier: ^0.22.14 version: 0.22.14(tsx@4.23.12)(typescript@6.0.3) @@ -1005,6 +1011,11 @@ packages: resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} engines: {node: '>=0.12'} + envinfo@7.21.0: + resolution: {integrity: sha512-Lw7I8Zp5YKHFCXL7+Dz95g4CcbMEpgvqZNNq3AmlT5XAV6CgAAk6gyAMqn2zjw08K9BHfcNuKrMiCPLByGafow==} + engines: {node: '>=4'} + hasBin: true + es-module-lexer@2.3.1: resolution: {integrity: sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==} @@ -2905,6 +2916,8 @@ snapshots: entities@7.0.1: {} + envinfo@7.21.0: {} + es-module-lexer@2.3.1: {} esbuild@0.28.2: diff --git a/src/commands/env.ts b/src/commands/env.ts index 887de93..e3b9646 100644 --- a/src/commands/env.ts +++ b/src/commands/env.ts @@ -1,11 +1,304 @@ +import type { PackageInfo, ResolvedConfig } from '@/types.ts' import { defineCommand } from 'citty' +import { getPackageInfo, loadPackageJSON } from 'local-pkg' +import { x } from 'tinyexec' +import { defaultArgs } from '@/args.ts' +import { resolveConfig } from '@/config.ts' + +export type EnvinfoValue = PackageInfo | string | null +export type EnvinfoData = Record> + +export interface EnvResult { + envinfo: EnvinfoData + dependencies: Record + ecosystem: Record + buildTools: Record +} + +const CORE_DEPENDENCIES = [ + 'antdv-next', + '@antdv-next/cssinjs', + '@antdv-next/icons', + 'dayjs', +] as const + +const BUILD_TOOLS = [ + 'vue', + 'nuxt', + 'vite', + 'esbuild', + 'rollup', + 'tsdown', + 'typescript', + 'tailwindcss', +] as const + +const ENVINFO_ORDER = [ + 'System', + 'Binaries', + 'Managers', + 'Utilities', + 'Servers', + 'IDEs', + 'Languages', + 'Databases', + 'Browsers', +] as const + +function getDisplayValue(value: EnvinfoValue): string | null { + if (value === null) { + return null + } + + if (typeof value === 'string') { + return value + } + + return value.version ?? null +} + +export async function collectEnvinfo(config: ResolvedConfig): Promise { + try { + const envinfo = await import('envinfo') + const raw = await envinfo.default.run( + { + System: ['OS', 'CPU', 'Memory', 'Shell'], + Binaries: ['Node', 'Yarn', 'npm', 'pnpm', 'bun', 'Deno'], + Managers: ['Cargo', 'Homebrew', 'pip3', 'RubyGems'], + Utilities: ['Make', 'GCC', 'Git', 'Clang', 'FFmpeg', 'Curl', 'OpenSSL'], + Servers: ['Apache'], + IDEs: ['VSCode', 'Claude Code', 'Vim', 'Xcode'], + Languages: ['Bash', 'Perl', 'Python3', 'Ruby', 'Rust'], + Databases: ['SQLite'], + Browsers: ['Chrome', 'Firefox', 'Safari', 'Edge'], + }, + { + json: true, + }, + ) + const parsed = JSON.parse(raw) as Record> + const result: EnvinfoData = {} + + for (const [category, items] of Object.entries(parsed)) { + const categoryResult: Record = {} + result[category] = categoryResult + + for (const [name, info] of Object.entries(items)) { + if (typeof info === 'string') { + categoryResult[name] = info + } + else if (info && typeof info === 'object') { + categoryResult[name] = info as PackageInfo + } + else { + categoryResult[name] = null + } + } + } + + result.Binaries ??= {} + + try { + const registry = await x('npm', ['config', 'get', 'registry'], { + timeout: 5000, + nodeOptions: { + cwd: config.cwd, + stdio: 'pipe', + }, + }) + result.Binaries.Registry = registry.stdout.trim() + } + catch { + result.Binaries.Registry = null + } + + return result + } + catch { + return {} + } +} + +export async function getInstalledPackageVersion(cwd: string, packageName: string): Promise { + try { + const packageInfo = await getPackageInfo(packageName, { + paths: [cwd], + }) + return typeof packageInfo?.version === 'string' && packageInfo.version.length > 0 + ? packageInfo.version + : null + } + catch { + return null + } +} + +export async function collectDependencies(cwd: string): Promise> { + const entries = await Promise.all(CORE_DEPENDENCIES.map(async packageName => [ + packageName, + await getInstalledPackageVersion(cwd, packageName), + ] as const)) + + return Object.fromEntries(entries) +} + +export async function scanEcosystem(cwd: string): Promise> { + const packageNames = new Set() + const coreDependencies = new Set(CORE_DEPENDENCIES) + + try { + const packageJson = await loadPackageJSON(cwd) + const dependencyGroups = [ + packageJson?.dependencies, + packageJson?.devDependencies, + packageJson?.optionalDependencies, + packageJson?.peerDependencies, + ] + + for (const dependencies of dependencyGroups) { + for (const packageName of Object.keys(dependencies ?? {})) { + const isEcosystemPackage = packageName.startsWith('@antdv-next/') + || packageName.startsWith('@v-c/') + + if (isEcosystemPackage && !coreDependencies.has(packageName)) { + packageNames.add(packageName) + } + } + } + } + catch { + return {} + } + + const result: Record = {} + for (const packageName of [...packageNames].sort()) { + const version = await getInstalledPackageVersion(cwd, packageName) + if (version !== null) { + result[packageName] = version + } + } + + return result +} + +export async function collectBuildTools(cwd: string): Promise> { + const result: Record = {} + + for (const packageName of BUILD_TOOLS) { + const version = await getInstalledPackageVersion(cwd, packageName) + if (version !== null) { + result[packageName] = version + } + } + + return result +} + +export function formatText(data: EnvResult): string { + const lines: string[] = ['Environment', ''] + + const section = (title: string, entries: Record, showNull: boolean): void => { + const filtered = showNull + ? Object.entries(entries) + : Object.entries(entries).filter(([, value]) => getDisplayValue(value) !== null) + + if (filtered.length === 0) { + return + } + + lines.push(` ${title}:`) + const maxKeyLength = Math.max(...filtered.map(([key]) => key.length)) + for (const [key, value] of filtered) { + const paddedKey = key.padEnd(maxKeyLength + 1) + lines.push(` ${paddedKey} ${getDisplayValue(value) ?? 'Not found'}`) + } + lines.push('') + } + + for (const category of ENVINFO_ORDER) { + if (data.envinfo[category]) { + section(category, data.envinfo[category], false) + } + } + + section('Dependencies', data.dependencies, true) + section('Ecosystem', data.ecosystem, false) + section('Build Tools', data.buildTools, false) + + return lines.join('\n') +} + +export function formatMarkdown(data: EnvResult): string { + const lines: string[] = ['## Environment', ''] + + const table = ( + title: string, + firstColumn: string, + secondColumn: string, + entries: Record, + showNull: boolean, + ): void => { + const filtered = showNull + ? Object.entries(entries) + : Object.entries(entries).filter(([, value]) => getDisplayValue(value) !== null) + + if (filtered.length === 0) { + return + } + + lines.push(`### ${title}`, '') + lines.push(`| ${firstColumn} | ${secondColumn} |`) + lines.push('|------|---------|') + for (const [key, value] of filtered) { + lines.push(`| ${key} | ${getDisplayValue(value) ?? 'Not found'} |`) + } + lines.push('') + } + + for (const category of ENVINFO_ORDER) { + if (data.envinfo[category]) { + table(category, 'Item', 'Version', data.envinfo[category], false) + } + } + + table('Dependencies', 'Package', 'Version', data.dependencies, true) + table('Ecosystem', 'Package', 'Version', data.ecosystem, false) + table('Build Tools', 'Package', 'Version', data.buildTools, false) + + return lines.join('\n') +} export default defineCommand({ meta: { name: 'env', - description: 'Collect antd-related environment information for bug reporting', + description: 'Collect antdv-related environment information for bug reporting', }, - run({ args }) { - console.log('Parsed args:', args) + args: defaultArgs, + async run({ args }) { + const config = resolveConfig(args) + + const [envinfo, dependencies, ecosystem, buildTools] = await Promise.all([ + collectEnvinfo(config), + collectDependencies(config.cwd), + scanEcosystem(config.cwd), + collectBuildTools(config.cwd), + ]) + + const data: EnvResult = { + envinfo, + dependencies, + ecosystem, + buildTools, + } + + if (config.format === 'json') { + console.log(JSON.stringify(data, null, 2)) + } + else if (config.format === 'markdown') { + console.log(formatMarkdown(data)) + } + else { + console.log(formatText(data)) + } }, }) diff --git a/src/types/envinfo.d.ts b/src/types/envinfo.d.ts new file mode 100644 index 0000000..d045d5d --- /dev/null +++ b/src/types/envinfo.d.ts @@ -0,0 +1,20 @@ +declare module 'envinfo' { + interface EnvInfoOptions { + System?: string[] + Binaries?: string[] + Browsers?: string[] + npmPackages?: string[] + [key: string]: string[] | undefined + } + + interface EnvInfoConfig { + json?: boolean + showNotFound?: boolean + [key: string]: unknown + } + + function run(options: EnvInfoOptions, config?: EnvInfoConfig): Promise + + const _default: { run: typeof run } + export default _default +} diff --git a/test/args.test.ts b/test/args.test.ts new file mode 100644 index 0000000..7f2b0de --- /dev/null +++ b/test/args.test.ts @@ -0,0 +1,32 @@ +import type { CommandArgs, OutputFormat } from '../src/args' +import type { ResolvedConfig } from '../src/types' +import { parseArgs } from 'citty' +import { describe, expect, expectTypeOf, it } from 'vitest' +import { defaultArgs, OUTPUT_FORMATS } from '../src/args' + +describe('defaultArgs format', () => { + it('accepts text, markdown, and json', () => { + expect(OUTPUT_FORMATS).toEqual(['text', 'markdown', 'json']) + + for (const format of OUTPUT_FORMATS) { + const args = parseArgs(['--format', format], defaultArgs) + expect(args.format).toBe(format) + } + }) + + it('defaults to text', () => { + const args = parseArgs([], defaultArgs) + + expect(args.format).toBe('text') + }) + + it('rejects unsupported formats', () => { + expect(() => parseArgs(['--format', 'yaml'], defaultArgs)) + .toThrow(/Expected one of:.*text.*markdown.*json/) + }) + + it('preserves the format union in command and config declarations', () => { + expectTypeOf().toEqualTypeOf() + expectTypeOf().toEqualTypeOf() + }) +}) diff --git a/test/cli.test.ts b/test/cli.test.ts index 6b69032..097cea8 100644 --- a/test/cli.test.ts +++ b/test/cli.test.ts @@ -15,9 +15,27 @@ describe('cli', () => { expect(stdout).toContain('@antdv-next/cli v0.0.0') }) - it('run antdv env command', async () => { + it('run antdv env command in text format', async () => { const { stdout } = await run(['env']) - expect(stdout).toContain('Parsed args') + expect(stdout).toContain('Environment') + expect(stdout).toContain('Dependencies') + }) + + it('run antdv env command in markdown format', async () => { + const { stdout } = await run(['env', '--format', 'markdown']) + + expect(stdout).toContain('## Environment') + expect(stdout).toContain('### Dependencies') + }) + + it('run antdv env command in json format', async () => { + const { stdout } = await run(['env', '--format', 'json']) + const data = JSON.parse(stdout) + + expect(data).toHaveProperty('envinfo') + expect(data).toHaveProperty('dependencies') + expect(data).toHaveProperty('ecosystem') + expect(data).toHaveProperty('buildTools') }) }) diff --git a/test/env.test.ts b/test/env.test.ts new file mode 100644 index 0000000..5aa4576 --- /dev/null +++ b/test/env.test.ts @@ -0,0 +1,297 @@ +import type { EnvResult } from '../src/commands/env' +import fs from 'node:fs/promises' +import { tmpdir } from 'node:os' +import { join } from 'node:path' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import { + collectBuildTools, + collectDependencies, + collectEnvinfo, + + formatMarkdown, + formatText, + getInstalledPackageVersion, + scanEcosystem, +} from '../src/commands/env' + +const mocks = vi.hoisted(() => ({ + envinfoRun: vi.fn(), + x: vi.fn(), +})) + +vi.mock('envinfo', () => ({ + default: { + run: mocks.envinfoRun, + }, +})) + +vi.mock('tinyexec', () => ({ + x: mocks.x, +})) + +let projectPath: string + +async function writePackage(packageName: string, version?: string): Promise { + const packageDirectory = join(projectPath, 'node_modules', packageName) + await fs.mkdir(packageDirectory, { recursive: true }) + await fs.writeFile(join(packageDirectory, 'package.json'), JSON.stringify({ + name: packageName, + version, + })) +} + +async function writeProjectPackage(packageJson: Record): Promise { + await fs.writeFile(join(projectPath, 'package.json'), JSON.stringify({ + name: 'test-project', + version: '1.0.0', + ...packageJson, + })) +} + +beforeEach(async () => { + projectPath = await fs.mkdtemp(join(tmpdir(), 'antdv-cli-env-')) + vi.clearAllMocks() +}) + +afterEach(async () => await fs.rm(projectPath, { + recursive: true, + force: true, +})) + +describe('collectEnvinfo', () => { + it('normalizes envinfo values and adds the project npm registry', async () => { + mocks.envinfoRun.mockResolvedValueOnce(JSON.stringify({ + System: { + OS: 'macOS 15.7.3', + Numeric: 123, + Empty: null, + Node: { version: '26.0.0', path: '/usr/local/bin/node' }, + }, + })) + mocks.x.mockResolvedValueOnce({ + stdout: 'https://registry.npmjs.org\n', + }) + + const result = await collectEnvinfo({ + cwd: projectPath, + format: 'text', + }) + + expect(result).toEqual({ + System: { + OS: 'macOS 15.7.3', + Numeric: null, + Empty: null, + Node: { version: '26.0.0', path: '/usr/local/bin/node' }, + }, + Binaries: { + Registry: 'https://registry.npmjs.org', + }, + }) + expect(mocks.x).toHaveBeenCalledWith('npm', ['config', 'get', 'registry'], { + timeout: 5000, + nodeOptions: { + cwd: projectPath, + stdio: 'pipe', + }, + }) + }) + + it('sets Registry to null when npm config cannot be read', async () => { + mocks.envinfoRun.mockResolvedValueOnce(JSON.stringify({ + Binaries: { + Node: '26.0.0', + }, + })) + mocks.x.mockRejectedValueOnce(new Error('npm not found')) + + const result = await collectEnvinfo({ + cwd: projectPath, + format: 'text', + }) + + expect(result.Binaries).toEqual({ + Node: '26.0.0', + Registry: null, + }) + }) + + it('returns an empty object when envinfo collection fails', async () => { + mocks.envinfoRun.mockRejectedValueOnce(new Error('envinfo failed')) + + const result = await collectEnvinfo({ + cwd: projectPath, + format: 'text', + }) + + expect(result).toEqual({}) + expect(mocks.x).not.toHaveBeenCalled() + }) +}) + +describe('getInstalledPackageVersion', () => { + it('reads the package version from the target project', async () => { + await writePackage('antdv-next', '1.2.3') + + await expect(getInstalledPackageVersion(projectPath, 'antdv-next')).resolves.toBe('1.2.3') + }) + + it('returns null for a missing package or version', async () => { + await writePackage('dayjs') + + await expect(getInstalledPackageVersion(projectPath, 'dayjs')).resolves.toBeNull() + await expect(getInstalledPackageVersion(projectPath, 'not-installed')).resolves.toBeNull() + }) +}) + +describe('collectDependencies', () => { + it('reports only the four antdv core dependencies and includes missing packages', async () => { + await Promise.all([ + writePackage('antdv-next', '1.0.0'), + writePackage('@antdv-next/cssinjs', '2.0.0'), + writePackage('@antdv-next/icons', '3.0.0'), + writePackage('unrelated-package', '9.0.0'), + ]) + + await expect(collectDependencies(projectPath)).resolves.toEqual({ + 'antdv-next': '1.0.0', + '@antdv-next/cssinjs': '2.0.0', + '@antdv-next/icons': '3.0.0', + 'dayjs': null, + }) + }) +}) + +describe('scanEcosystem', () => { + it('collects declared non-core @antdv-next and @v-c packages', async () => { + await writeProjectPackage({ + dependencies: { + '@antdv-next/cssinjs': '^2.0.0', + '@antdv-next/pro-components': '^1.4.0', + 'unrelated-package': '^9.0.0', + }, + devDependencies: { + '@v-c/dialog': '^5.0.0', + '@v-c/no-version': '^1.0.0', + }, + optionalDependencies: { + '@v-c/optional': '^2.0.0', + }, + peerDependencies: { + '@antdv-next/icons': '^3.0.0', + '@v-c/peer': '^4.0.0', + }, + }) + await Promise.all([ + writePackage('@antdv-next/cssinjs', '2.0.0'), + writePackage('@antdv-next/icons', '3.0.0'), + writePackage('@antdv-next/pro-components', '1.4.0'), + writePackage('@v-c/dialog', '5.0.0'), + writePackage('@v-c/no-version'), + writePackage('@v-c/optional', '2.0.0'), + writePackage('@v-c/peer', '4.0.0'), + writePackage('@v-c/undeclared', '6.0.0'), + writePackage('unrelated-package', '9.0.0'), + ]) + + await expect(scanEcosystem(projectPath)).resolves.toEqual({ + '@antdv-next/pro-components': '1.4.0', + '@v-c/dialog': '5.0.0', + '@v-c/optional': '2.0.0', + '@v-c/peer': '4.0.0', + }) + }) + + it('returns an empty object when no ecosystem dependencies are declared', async () => { + await writeProjectPackage({}) + + await expect(scanEcosystem(projectPath)).resolves.toEqual({}) + }) +}) + +describe('collectBuildTools', () => { + it('reports only the requested installed build tools', async () => { + const versions = { + vue: '3.5.0', + nuxt: '4.0.0', + vite: '7.0.0', + esbuild: '0.25.0', + rollup: '4.0.0', + tsdown: '0.15.0', + typescript: '6.0.0', + tailwindcss: '4.0.0', + } + await Promise.all([ + ...Object.entries(versions).map(([packageName, version]) => writePackage(packageName, version)), + writePackage('webpack', '5.0.0'), + ]) + + await expect(collectBuildTools(projectPath)).resolves.toEqual(versions) + }) + + it('omits build tools that are not installed', async () => { + await writePackage('vite', '7.0.0') + + await expect(collectBuildTools(projectPath)).resolves.toEqual({ + vite: '7.0.0', + }) + }) +}) + +describe('environment formatters', () => { + const data: EnvResult = { + envinfo: { + System: { + OS: 'macOS 15.7.3', + CPU: null, + Node: { version: '26.0.0', path: '/usr/local/bin/node' }, + Shell: { path: '/bin/zsh' }, + }, + Binaries: { + Registry: 'https://registry.npmjs.org', + }, + }, + dependencies: { + 'antdv-next': '1.0.0', + '@antdv-next/cssinjs': null, + '@antdv-next/icons': '2.0.0', + 'dayjs': null, + }, + ecosystem: { + '@v-c/dialog': '3.0.0', + }, + buildTools: { + vue: '3.5.0', + vite: '7.0.0', + }, + } + + it('formats readable text and hides unavailable envinfo values', () => { + const result = formatText(data) + + expect(result).toContain('Environment') + expect(result).toContain(' System:') + expect(result).toContain('Node 26.0.0') + expect(result).not.toContain('CPU') + expect(result).not.toContain('Shell') + expect(result).toContain(' Dependencies:') + expect(result).toContain('@antdv-next/cssinjs Not found') + expect(result).toContain(' Ecosystem:') + expect(result).toContain('@v-c/dialog 3.0.0') + expect(result).toContain(' Build Tools:') + }) + + it('formats markdown tables and keeps missing core dependencies visible', () => { + const result = formatMarkdown(data) + + expect(result).toContain('## Environment') + expect(result).toContain('### System') + expect(result).toContain('| Item | Version |') + expect(result).toContain('| Node | 26.0.0 |') + expect(result).not.toContain('| CPU |') + expect(result).toContain('### Dependencies') + expect(result).toContain('| @antdv-next/cssinjs | Not found |') + expect(result).toContain('### Ecosystem') + expect(result).toContain('### Build Tools') + }) +}) From 1174e391c18af51bcb2430b80574f360ceb73453 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Wed, 12 Aug 2026 16:26:12 +0800 Subject: [PATCH 027/106] feat(args): add output format validation and type safety - Import ArgsDef and create OUTPUT_FORMATS constant with supported formats - Define OutputFormat type for better type safety - Change format arg type from string to enum with validation options - Update defaultArgs to use satisfies ArgsDef for better typing - Remove unnecessary DeepWriteable utility type - Update ResolvedConfig to use OutputFormat type instead of generic string --- src/args.ts | 18 +++++++++--------- src/types.ts | 4 +++- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/args.ts b/src/args.ts index 1559c57..a3a5a13 100644 --- a/src/args.ts +++ b/src/args.ts @@ -1,4 +1,7 @@ -import type { ParsedArgs } from 'citty' +import type { ArgsDef, ParsedArgs } from 'citty' + +export const OUTPUT_FORMATS = ['text', 'markdown', 'json'] as const +export type OutputFormat = typeof OUTPUT_FORMATS[number] export const defaultArgs = { cwd: { @@ -8,15 +11,12 @@ export const defaultArgs = { default: process.cwd(), }, format: { - type: 'string', - description: 'Output format: json, text, or markdown', + type: 'enum', + description: 'Output format', alias: 'f', default: 'text', + options: [...OUTPUT_FORMATS], }, -} as const - -type DeepWriteable = { - -readonly [P in keyof T]: T[P] extends object ? DeepWriteable : T[P]; -} +} satisfies ArgsDef -export type CommandArgs = ParsedArgs> +export type CommandArgs = ParsedArgs diff --git a/src/types.ts b/src/types.ts index e0c6b03..21910e8 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,6 +1,8 @@ +import type { OutputFormat } from '@/args.ts' + export interface ResolvedConfig { cwd: string - format: string + format: OutputFormat } export interface PackageInfo { From bbed4d31715e1cdca1d0fadcfbb3d5f1bc2baf68 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Wed, 12 Aug 2026 20:05:42 +0800 Subject: [PATCH 028/106] refactor(env): extract output formatting logic to separate utility module - Move console output logic from env command to output utility - Create ResolvedContent interface for structured content handling - Implement output function with format switching capability - Remove direct console.log calls in favor of centralized output - Maintain support for json, markdown, and text formats - Centralize formatting logic for better maintainability --- src/commands/env.ts | 18 +++++++++--------- src/types.ts | 6 ++++++ src/utils/output.ts | 13 +++++++++++++ 3 files changed, 28 insertions(+), 9 deletions(-) create mode 100644 src/utils/output.ts diff --git a/src/commands/env.ts b/src/commands/env.ts index e3b9646..d11a294 100644 --- a/src/commands/env.ts +++ b/src/commands/env.ts @@ -4,6 +4,7 @@ import { getPackageInfo, loadPackageJSON } from 'local-pkg' import { x } from 'tinyexec' import { defaultArgs } from '@/args.ts' import { resolveConfig } from '@/config.ts' +import { output } from '@/utils/output.ts' export type EnvinfoValue = PackageInfo | string | null export type EnvinfoData = Record> @@ -291,14 +292,13 @@ export default defineCommand({ buildTools, } - if (config.format === 'json') { - console.log(JSON.stringify(data, null, 2)) - } - else if (config.format === 'markdown') { - console.log(formatMarkdown(data)) - } - else { - console.log(formatText(data)) - } + output( + { + json: data, + markdown: formatMarkdown(data), + text: formatText(data), + }, + config.format, + ) }, }) diff --git a/src/types.ts b/src/types.ts index 21910e8..6a4f080 100644 --- a/src/types.ts +++ b/src/types.ts @@ -9,3 +9,9 @@ export interface PackageInfo { version?: string path?: string } + +export interface ResolvedContent { + json: object + text: string + markdown: string +} diff --git a/src/utils/output.ts b/src/utils/output.ts new file mode 100644 index 0000000..b359f7e --- /dev/null +++ b/src/utils/output.ts @@ -0,0 +1,13 @@ +import type { OutputFormat } from '@/args.ts' +import type { ResolvedContent } from '@/types.ts' + +export const output = (content: ResolvedContent, type: OutputFormat): string => { + switch (type) { + case 'json': + return JSON.stringify(content.json, null, 2) + case 'markdown': + case 'text': + default: + return content.text + } +} From 52aeedc7417bfdb0202a99ee919c5678b0e2e6b9 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Wed, 12 Aug 2026 22:59:58 +0800 Subject: [PATCH 029/106] feat(sync): add script to sync remote git tags and generate changelog files - Fetch remote git tags matching antdv-next@1.* pattern from repository - Parse semantic version tags and validate major version requirement - Group tags by minor versions to create organized changelog records - Generate JSON files for each version containing changelog data - Remove stale minor version files during synchronization process - Create output directory and write formatted changelog JSON files - Implement error handling for invalid tags and git operations --- scripts/sync.ts | 164 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 164 insertions(+) create mode 100644 scripts/sync.ts diff --git a/scripts/sync.ts b/scripts/sync.ts new file mode 100644 index 0000000..9939deb --- /dev/null +++ b/scripts/sync.ts @@ -0,0 +1,164 @@ +// @env node + +import fs from 'node:fs/promises' +import path from 'node:path' +import { fileURLToPath } from 'node:url' +import { x } from 'tinyexec' + +interface ChangelogRecord { + version: string + majorVersion: string +} + +interface ParsedTag { + record: ChangelogRecord + major: number + minor: number + patch: number +} + +interface MinorGroup { + major: number + minor: number + highestPatch: number + changelog: ChangelogRecord[] +} + +const TARGET_MAJOR = 1 +const REMOTE_URL = 'https://github.com/antdv-next/antdv-next.git' +const TAG_PREFIX = 'antdv-next@' +const TAG_PATTERN = 'refs/tags/antdv-next@1.*' +const OUTPUT_DIRECTORY = fileURLToPath(new URL('../data', import.meta.url)) +const SEMVER_PATTERN = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-[0-9A-Z-]+(?:\.[0-9A-Z-]+)*)?(?:\+[0-9A-Z-]+(?:\.[0-9A-Z-]+)*)?$/i +const REMOTE_TAG_PATTERN = /^[0-9a-f]+\s+refs\/tags\/(.+)$/i +const MINOR_FILE_PATTERN = /^v1\.(\d+)\.(\d+)\.json$/ + +async function fetchTags(): Promise { + const { stdout } = await x('git', [ + 'ls-remote', + '--tags', + '--refs', + '--sort=v:refname', + REMOTE_URL, + TAG_PATTERN, + ], { + throwOnError: true, + nodeOptions: { + stdio: 'pipe', + }, + }) + + const lines = stdout.split(/\r?\n/).filter(Boolean) + if (lines.length === 0) { + throw new Error(`No tags matched ${TAG_PATTERN}`) + } + + return lines.map(parseRemoteTag) +} + +function parseRemoteTag(line: string): ParsedTag { + const remoteTagMatch = line.match(REMOTE_TAG_PATTERN) + const tag = remoteTagMatch?.[1] + + if (!tag?.startsWith(TAG_PREFIX)) { + throw new Error(`Unexpected git ls-remote output: ${line}`) + } + + const rawVersion = tag.slice(TAG_PREFIX.length) + const semverMatch = rawVersion.match(SEMVER_PATTERN) + + if (!semverMatch) { + throw new Error(`Invalid semantic version tag: ${tag}`) + } + + const major = Number(semverMatch[1]) + const minor = Number(semverMatch[2]) + const patch = Number(semverMatch[3]) + + if (major !== TARGET_MAJOR) { + throw new Error(`Unexpected major version tag: ${tag}`) + } + + return { + record: { + version: `v${rawVersion}`, + majorVersion: `v${major}`, + }, + major, + minor, + patch, + } +} + +function groupTagsByMinor(tags: ParsedTag[]): MinorGroup[] { + const groups = new Map() + + for (const tag of tags) { + const key = `${tag.major}.${tag.minor}` + const group = groups.get(key) + + if (group) { + group.highestPatch = Math.max(group.highestPatch, tag.patch) + group.changelog.push(tag.record) + continue + } + + groups.set(key, { + major: tag.major, + minor: tag.minor, + highestPatch: tag.patch, + changelog: [tag.record], + }) + } + + return [...groups.values()].sort((left, right) => + left.major - right.major || left.minor - right.minor, + ) +} + +function buildOutputFiles(tags: ParsedTag[]): Map { + const outputFiles = new Map() + + outputFiles.set( + `v${TARGET_MAJOR}.json`, + tags.map(tag => tag.record), + ) + + for (const group of groupTagsByMinor(tags)) { + const filename = `v${group.major}.${group.minor}.${group.highestPatch}.json` + outputFiles.set(filename, group.changelog) + } + + return outputFiles +} + +async function writeJsonFile(filename: string, changelog: ChangelogRecord[]): Promise { + const file = path.join(OUTPUT_DIRECTORY, filename) + await fs.writeFile(file, `${JSON.stringify(changelog, null, 2)}\n`, 'utf8') +} + +async function removeStaleMinorFiles(expectedFiles: Set): Promise { + const filenames = await fs.readdir(OUTPUT_DIRECTORY) + const staleFiles = filenames.filter(filename => + MINOR_FILE_PATTERN.test(filename) && !expectedFiles.has(filename), + ) + + await Promise.all(staleFiles.map(filename => + fs.unlink(path.join(OUTPUT_DIRECTORY, filename)), + )) +} + +async function main(): Promise { + const tags = await fetchTags() + const outputFiles = buildOutputFiles(tags) + + await fs.mkdir(OUTPUT_DIRECTORY, { recursive: true }) + await Promise.all([...outputFiles].map(([filename, changelog]) => + writeJsonFile(filename, changelog), + )) + await removeStaleMinorFiles(new Set(outputFiles.keys())) + + console.log(`Synced ${tags.length} tags to ${outputFiles.size} changelog files`) +} + +await main() From 12acaed82530f92d2707f1b90a68afb300026e31 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Wed, 12 Aug 2026 23:05:33 +0800 Subject: [PATCH 030/106] chore(deps): add semver and @types/semver dependencies - Add semver package version ^7.8.5 as production dependency - Add @types/semver package version ^7.8.0 as dev dependency - Update pnpm-lock.yaml with new dependency resolutions - Include proper type definitions for semver usage --- package.json | 2 ++ pnpm-lock.yaml | 11 +++++++++++ 2 files changed, 13 insertions(+) diff --git a/package.json b/package.json index 854f54b..15cef86 100644 --- a/package.json +++ b/package.json @@ -49,12 +49,14 @@ "envinfo": "^7.21.0", "local-pkg": "^1.2.1", "pkg-types": "^2.3.1", + "semver": "^7.8.5", "tinyexec": "^1.3.0" }, "devDependencies": { "@antfu/eslint-config": "^9.3.0", "@lonewolfyx/tsconfig": "^0.0.6", "@types/node": "^26.2.0", + "@types/semver": "^7.8.0", "eslint": "^10.8.1", "jiti": "^2.7.0", "lint-staged": "^17.3.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ea4a6ac..30019ca 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,6 +23,9 @@ importers: pkg-types: specifier: ^2.3.1 version: 2.3.1 + semver: + specifier: ^7.8.5 + version: 7.8.5 tinyexec: specifier: ^1.3.0 version: 1.3.0 @@ -36,6 +39,9 @@ importers: '@types/node': specifier: ^26.2.0 version: 26.2.0 + '@types/semver': + specifier: ^7.8.0 + version: 7.8.0 eslint: specifier: ^10.8.1 version: 10.8.1(jiti@2.7.0) @@ -578,6 +584,9 @@ packages: '@types/node@26.2.0': resolution: {integrity: sha512-5IviulTZeRNp2vAJ514cc/HUlY5nZ9fCbq9DMyC52BrhFZACo3nI0R7qBxhQmo/d27NFe96ur/b7Wwxklda+kg==} + '@types/semver@7.8.0': + resolution: {integrity: sha512-1mAINjtQCXXeLkJ9ehXkwOcBpqtLxiVtKhpUf83DdRNdQKV0iXZpaHYqRr7nj+wvxuJzoAmAwXI+sCNMv1CzLQ==} + '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} @@ -2546,6 +2555,8 @@ snapshots: dependencies: undici-types: 8.3.0 + '@types/semver@7.8.0': {} + '@types/unist@3.0.3': {} '@typescript-eslint/eslint-plugin@8.66.0(@typescript-eslint/parser@8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3)': From dd1ea4124dd3fcdaf301d2124fbc44453520ec84 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Wed, 12 Aug 2026 23:15:37 +0800 Subject: [PATCH 031/106] feat(sync): support multiple major versions in changelog generation - Added support for parsing and handling multiple major versions (1, 2, 3, 4) - Modified tag fetching to work with different major versions instead of fixed target - Updated semver parsing using proper semver library for better version handling - Changed output structure to generate separate changelog files per major version - Implemented minor changelog files that track highest base version within each group - Updated file naming pattern to include major version numbers in filenames - Modified stale file removal to only clean up files belonging to synced major versions - Enhanced error handling for empty tag collections and invalid semantic versions - Added comprehensive version comparison and grouping logic for multi-major support --- scripts/sync.ts | 149 +++++++++++++++++++++++++++++++++++------------- 1 file changed, 108 insertions(+), 41 deletions(-) diff --git a/scripts/sync.ts b/scripts/sync.ts index 9939deb..bbf7824 100644 --- a/scripts/sync.ts +++ b/scripts/sync.ts @@ -3,6 +3,7 @@ import fs from 'node:fs/promises' import path from 'node:path' import { fileURLToPath } from 'node:url' +import { parse } from 'semver' import { x } from 'tinyexec' interface ChangelogRecord { @@ -10,6 +11,12 @@ interface ChangelogRecord { majorVersion: string } +interface MinorChangelogFile extends ChangelogRecord { + changelog: ChangelogRecord[] +} + +type ChangelogFile = ChangelogRecord[] | MinorChangelogFile + interface ParsedTag { record: ChangelogRecord major: number @@ -20,27 +27,25 @@ interface ParsedTag { interface MinorGroup { major: number minor: number - highestPatch: number - changelog: ChangelogRecord[] + tags: ParsedTag[] } -const TARGET_MAJOR = 1 +const MAJOR_VERSIONS = [1, 2, 3, 4] as const const REMOTE_URL = 'https://github.com/antdv-next/antdv-next.git' const TAG_PREFIX = 'antdv-next@' -const TAG_PATTERN = 'refs/tags/antdv-next@1.*' const OUTPUT_DIRECTORY = fileURLToPath(new URL('../data', import.meta.url)) -const SEMVER_PATTERN = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-[0-9A-Z-]+(?:\.[0-9A-Z-]+)*)?(?:\+[0-9A-Z-]+(?:\.[0-9A-Z-]+)*)?$/i const REMOTE_TAG_PATTERN = /^[0-9a-f]+\s+refs\/tags\/(.+)$/i -const MINOR_FILE_PATTERN = /^v1\.(\d+)\.(\d+)\.json$/ +const MINOR_FILE_PATTERN = /^v(\d+)\.(\d+)\.(\d+)\.json$/ -async function fetchTags(): Promise { +async function fetchTags(majorVersion: number): Promise { + const tagPattern = `refs/tags/${TAG_PREFIX}${majorVersion}.*` const { stdout } = await x('git', [ 'ls-remote', '--tags', '--refs', '--sort=v:refname', REMOTE_URL, - TAG_PATTERN, + tagPattern, ], { throwOnError: true, nodeOptions: { @@ -49,14 +54,10 @@ async function fetchTags(): Promise { }) const lines = stdout.split(/\r?\n/).filter(Boolean) - if (lines.length === 0) { - throw new Error(`No tags matched ${TAG_PATTERN}`) - } - - return lines.map(parseRemoteTag) + return lines.map(line => parseRemoteTag(line, majorVersion)) } -function parseRemoteTag(line: string): ParsedTag { +function parseRemoteTag(line: string, expectedMajorVersion: number): ParsedTag { const remoteTagMatch = line.match(REMOTE_TAG_PATTERN) const tag = remoteTagMatch?.[1] @@ -65,23 +66,24 @@ function parseRemoteTag(line: string): ParsedTag { } const rawVersion = tag.slice(TAG_PREFIX.length) - const semverMatch = rawVersion.match(SEMVER_PATTERN) + const semver = parse(rawVersion) - if (!semverMatch) { + if (!semver) { throw new Error(`Invalid semantic version tag: ${tag}`) } - const major = Number(semverMatch[1]) - const minor = Number(semverMatch[2]) - const patch = Number(semverMatch[3]) + const { build, major, minor, patch, version } = semver + const normalizedVersion = build.length > 0 + ? `${version}+${build.join('.')}` + : version - if (major !== TARGET_MAJOR) { + if (major !== expectedMajorVersion) { throw new Error(`Unexpected major version tag: ${tag}`) } return { record: { - version: `v${rawVersion}`, + version: normalizedVersion, majorVersion: `v${major}`, }, major, @@ -98,16 +100,14 @@ function groupTagsByMinor(tags: ParsedTag[]): MinorGroup[] { const group = groups.get(key) if (group) { - group.highestPatch = Math.max(group.highestPatch, tag.patch) - group.changelog.push(tag.record) + group.tags.push(tag) continue } groups.set(key, { major: tag.major, minor: tag.minor, - highestPatch: tag.patch, - changelog: [tag.record], + tags: [tag], }) } @@ -116,32 +116,91 @@ function groupTagsByMinor(tags: ParsedTag[]): MinorGroup[] { ) } -function buildOutputFiles(tags: ParsedTag[]): Map { - const outputFiles = new Map() +function compareBaseVersions(left: ParsedTag, right: ParsedTag): number { + return left.major - right.major + || left.minor - right.minor + || left.patch - right.patch +} - outputFiles.set( - `v${TARGET_MAJOR}.json`, - tags.map(tag => tag.record), - ) +function getHighestBaseVersion(tags: ParsedTag[]): ParsedTag { + const [firstTag, ...remainingTags] = tags + + if (!firstTag) { + throw new Error('Cannot resolve a version from an empty tag collection') + } + + return remainingTags.reduce((highestTag, tag) => + compareBaseVersions(tag, highestTag) > 0 ? tag : highestTag, firstTag) +} + +function getBaseVersion(tag: ParsedTag): string { + return `${tag.major}.${tag.minor}.${tag.patch}` +} + +function createMinorChangelogFile(tags: ParsedTag[]): MinorChangelogFile { + const highestTag = getHighestBaseVersion(tags) + const version = getBaseVersion(highestTag) + + return { + version, + majorVersion: `v${highestTag.major}`, + changelog: tags + .map(tag => tag.record) + .filter(record => record.version !== version), + } +} + +function groupTagsByMajor(tags: ParsedTag[]): Map { + const groups = new Map() + + for (const tag of tags) { + const group = groups.get(tag.major) + + if (group) { + group.push(tag.record) + } + else { + groups.set(tag.major, [tag.record]) + } + } + + return groups +} + +function buildOutputFiles(tags: ParsedTag[]): Map { + const outputFiles = new Map() + + for (const [major, changelog] of groupTagsByMajor(tags)) { + outputFiles.set(`v${major}.json`, changelog) + } for (const group of groupTagsByMinor(tags)) { - const filename = `v${group.major}.${group.minor}.${group.highestPatch}.json` - outputFiles.set(filename, group.changelog) + const changelogFile = createMinorChangelogFile(group.tags) + const filename = `v${changelogFile.version}.json` + outputFiles.set(filename, changelogFile) } return outputFiles } -async function writeJsonFile(filename: string, changelog: ChangelogRecord[]): Promise { +async function writeJsonFile(filename: string, changelog: ChangelogFile): Promise { const file = path.join(OUTPUT_DIRECTORY, filename) await fs.writeFile(file, `${JSON.stringify(changelog, null, 2)}\n`, 'utf8') } -async function removeStaleMinorFiles(expectedFiles: Set): Promise { +async function removeStaleMinorFiles( + expectedFiles: Set, + syncedMajorVersions: Set, +): Promise { const filenames = await fs.readdir(OUTPUT_DIRECTORY) - const staleFiles = filenames.filter(filename => - MINOR_FILE_PATTERN.test(filename) && !expectedFiles.has(filename), - ) + const staleFiles = filenames.filter((filename) => { + const match = filename.match(MINOR_FILE_PATTERN) + const majorVersion = Number(match?.[1]) + + return match + && syncedMajorVersions.has(majorVersion) + && !expectedFiles.has(filename) + }) await Promise.all(staleFiles.map(filename => fs.unlink(path.join(OUTPUT_DIRECTORY, filename)), @@ -149,16 +208,24 @@ async function removeStaleMinorFiles(expectedFiles: Set): Promise } async function main(): Promise { - const tags = await fetchTags() + const tags = (await Promise.all(MAJOR_VERSIONS.map(fetchTags))).flat() + + if (tags.length === 0) { + throw new Error(`No tags matched the configured major versions: ${MAJOR_VERSIONS.join(', ')}`) + } + const outputFiles = buildOutputFiles(tags) + const syncedMajorVersions = new Set(tags.map(tag => tag.major)) await fs.mkdir(OUTPUT_DIRECTORY, { recursive: true }) await Promise.all([...outputFiles].map(([filename, changelog]) => writeJsonFile(filename, changelog), )) - await removeStaleMinorFiles(new Set(outputFiles.keys())) + await removeStaleMinorFiles(new Set(outputFiles.keys()), syncedMajorVersions) - console.log(`Synced ${tags.length} tags to ${outputFiles.size} changelog files`) + console.log( + `Synced ${tags.length} tags across ${syncedMajorVersions.size} major versions to ${outputFiles.size} changelog files`, + ) } await main() From 5ea7aae6dc82aaf7786168fe0911efbabb8cfac2 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Wed, 12 Aug 2026 23:27:17 +0800 Subject: [PATCH 032/106] feat(scripts): enhance changelog sync with npm publish times - Add publishedAt field to changelog records with npm publish timestamps - Fetch package publish times from npm registry using tinyexec - Create VersionRecord and ChangelogRecord interfaces for better typing - Implement formatSemver function to handle build metadata correctly - Add validation for missing npm publish times in changelog data - Update script to use PACKAGE_NAME constant for tag prefixing - Refactor buildOutputFiles to integrate publish time data into output - Add error handling for invalid npm publish time responses --- scripts/sync.ts | 148 +++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 122 insertions(+), 26 deletions(-) diff --git a/scripts/sync.ts b/scripts/sync.ts index bbf7824..aeeaa6c 100644 --- a/scripts/sync.ts +++ b/scripts/sync.ts @@ -6,19 +6,21 @@ import { fileURLToPath } from 'node:url' import { parse } from 'semver' import { x } from 'tinyexec' -interface ChangelogRecord { +interface VersionRecord { version: string majorVersion: string } -interface MinorChangelogFile extends ChangelogRecord { - changelog: ChangelogRecord[] +interface ChangelogRecord extends VersionRecord { + publishedAt: string } -type ChangelogFile = ChangelogRecord[] | MinorChangelogFile +interface ChangelogFile extends VersionRecord { + changelog: ChangelogRecord[] +} interface ParsedTag { - record: ChangelogRecord + record: VersionRecord major: number minor: number patch: number @@ -31,8 +33,9 @@ interface MinorGroup { } const MAJOR_VERSIONS = [1, 2, 3, 4] as const +const PACKAGE_NAME = 'antdv-next' const REMOTE_URL = 'https://github.com/antdv-next/antdv-next.git' -const TAG_PREFIX = 'antdv-next@' +const TAG_PREFIX = `${PACKAGE_NAME}@` const OUTPUT_DIRECTORY = fileURLToPath(new URL('../data', import.meta.url)) const REMOTE_TAG_PATTERN = /^[0-9a-f]+\s+refs\/tags\/(.+)$/i const MINOR_FILE_PATTERN = /^v(\d+)\.(\d+)\.(\d+)\.json$/ @@ -57,6 +60,56 @@ async function fetchTags(majorVersion: number): Promise { return lines.map(line => parseRemoteTag(line, majorVersion)) } +async function fetchPublishTimes(): Promise> { + const { stdout } = await x('npm', [ + 'view', + PACKAGE_NAME, + 'time', + '--json', + ], { + throwOnError: true, + nodeOptions: { + stdio: 'pipe', + }, + }) + + let data: unknown + + try { + data = JSON.parse(stdout) + } + catch { + throw new Error(`Invalid npm publish time response for ${PACKAGE_NAME}`) + } + + if (!data || typeof data !== 'object' || Array.isArray(data)) { + throw new Error(`Unexpected npm publish time response for ${PACKAGE_NAME}`) + } + + const publishTimes = new Map() + + for (const [rawVersion, rawPublishedAt] of Object.entries(data)) { + const semver = parse(rawVersion) + + if (!semver || typeof rawPublishedAt !== 'string') { + continue + } + + const publishedAt = new Date(rawPublishedAt) + if (Number.isNaN(publishedAt.getTime())) { + throw new TypeError(`Invalid npm publish time for ${PACKAGE_NAME}@${rawVersion}`) + } + + publishTimes.set(formatSemver(semver), publishedAt.toISOString()) + } + + if (publishTimes.size === 0) { + throw new Error(`No npm publish times found for ${PACKAGE_NAME}`) + } + + return publishTimes +} + function parseRemoteTag(line: string, expectedMajorVersion: number): ParsedTag { const remoteTagMatch = line.match(REMOTE_TAG_PATTERN) const tag = remoteTagMatch?.[1] @@ -72,10 +125,7 @@ function parseRemoteTag(line: string, expectedMajorVersion: number): ParsedTag { throw new Error(`Invalid semantic version tag: ${tag}`) } - const { build, major, minor, patch, version } = semver - const normalizedVersion = build.length > 0 - ? `${version}+${build.join('.')}` - : version + const { major, minor, patch } = semver if (major !== expectedMajorVersion) { throw new Error(`Unexpected major version tag: ${tag}`) @@ -83,7 +133,7 @@ function parseRemoteTag(line: string, expectedMajorVersion: number): ParsedTag { return { record: { - version: normalizedVersion, + version: formatSemver(semver), majorVersion: `v${major}`, }, major, @@ -92,6 +142,12 @@ function parseRemoteTag(line: string, expectedMajorVersion: number): ParsedTag { } } +function formatSemver(semver: NonNullable>): string { + return semver.build.length > 0 + ? `${semver.version}+${semver.build.join('.')}` + : semver.version +} + function groupTagsByMinor(tags: ParsedTag[]): MinorGroup[] { const groups = new Map() @@ -129,15 +185,47 @@ function getHighestBaseVersion(tags: ParsedTag[]): ParsedTag { throw new Error('Cannot resolve a version from an empty tag collection') } - return remainingTags.reduce((highestTag, tag) => - compareBaseVersions(tag, highestTag) > 0 ? tag : highestTag, firstTag) + return remainingTags.reduce( + (highestTag, tag) => compareBaseVersions(tag, highestTag) > 0 ? tag : highestTag, + firstTag, + ) } function getBaseVersion(tag: ParsedTag): string { return `${tag.major}.${tag.minor}.${tag.patch}` } -function createMinorChangelogFile(tags: ParsedTag[]): MinorChangelogFile { +function createChangelogRecord( + tag: ParsedTag, + publishTimes: Map, +): ChangelogRecord { + const publishedAt = publishTimes.get(tag.record.version) + + if (!publishedAt) { + throw new Error(`Missing npm publish time for ${PACKAGE_NAME}@${tag.record.version}`) + } + + return { + ...tag.record, + publishedAt, + } +} + +function assertPublishTimes( + tags: ParsedTag[], + publishTimes: Map, +): void { + for (const tag of tags) { + if (!publishTimes.has(tag.record.version)) { + throw new Error(`Missing npm publish time for ${PACKAGE_NAME}@${tag.record.version}`) + } + } +} + +function createChangelogFile( + tags: ParsedTag[], + publishTimes: Map, +): ChangelogFile { const highestTag = getHighestBaseVersion(tags) const version = getBaseVersion(highestTag) @@ -145,37 +233,40 @@ function createMinorChangelogFile(tags: ParsedTag[]): MinorChangelogFile { version, majorVersion: `v${highestTag.major}`, changelog: tags - .map(tag => tag.record) - .filter(record => record.version !== version), + .filter(tag => tag.record.version !== version) + .map(tag => createChangelogRecord(tag, publishTimes)), } } -function groupTagsByMajor(tags: ParsedTag[]): Map { - const groups = new Map() +function groupTagsByMajor(tags: ParsedTag[]): Map { + const groups = new Map() for (const tag of tags) { const group = groups.get(tag.major) if (group) { - group.push(tag.record) + group.push(tag) } else { - groups.set(tag.major, [tag.record]) + groups.set(tag.major, [tag]) } } return groups } -function buildOutputFiles(tags: ParsedTag[]): Map { +function buildOutputFiles( + tags: ParsedTag[], + publishTimes: Map, +): Map { const outputFiles = new Map() - for (const [major, changelog] of groupTagsByMajor(tags)) { - outputFiles.set(`v${major}.json`, changelog) + for (const [major, majorTags] of groupTagsByMajor(tags)) { + outputFiles.set(`v${major}.json`, createChangelogFile(majorTags, publishTimes)) } for (const group of groupTagsByMinor(tags)) { - const changelogFile = createMinorChangelogFile(group.tags) + const changelogFile = createChangelogFile(group.tags, publishTimes) const filename = `v${changelogFile.version}.json` outputFiles.set(filename, changelogFile) } @@ -208,13 +299,18 @@ async function removeStaleMinorFiles( } async function main(): Promise { - const tags = (await Promise.all(MAJOR_VERSIONS.map(fetchTags))).flat() + const [tagGroups, publishTimes] = await Promise.all([ + Promise.all(MAJOR_VERSIONS.map(fetchTags)), + fetchPublishTimes(), + ]) + const tags = tagGroups.flat() if (tags.length === 0) { throw new Error(`No tags matched the configured major versions: ${MAJOR_VERSIONS.join(', ')}`) } - const outputFiles = buildOutputFiles(tags) + assertPublishTimes(tags, publishTimes) + const outputFiles = buildOutputFiles(tags, publishTimes) const syncedMajorVersions = new Set(tags.map(tag => tag.major)) await fs.mkdir(OUTPUT_DIRECTORY, { recursive: true }) From 82eec521c220a460aec2e1d9c2f04d91bf085e0b Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Wed, 12 Aug 2026 23:32:18 +0800 Subject: [PATCH 033/106] feat(sync): add dayjs library for date handling - Added dayjs dependency to package.json - Imported dayjs and utc plugin in sync script - Extended dayjs with utc functionality - Replaced native Date constructor with dayjs.utc for parsing - Used dayjs validation instead of isNaN check - Formatted date output as YYYY-MM-DD string format --- package.json | 1 + pnpm-lock.yaml | 8 ++++++++ scripts/sync.ts | 10 +++++++--- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 15cef86..a5d5b8c 100644 --- a/package.json +++ b/package.json @@ -57,6 +57,7 @@ "@lonewolfyx/tsconfig": "^0.0.6", "@types/node": "^26.2.0", "@types/semver": "^7.8.0", + "dayjs": "^1.11.21", "eslint": "^10.8.1", "jiti": "^2.7.0", "lint-staged": "^17.3.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 30019ca..ea520d6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -42,6 +42,9 @@ importers: '@types/semver': specifier: ^7.8.0 version: 7.8.0 + dayjs: + specifier: ^1.11.21 + version: 1.11.21 eslint: specifier: ^10.8.1 version: 10.8.1(jiti@2.7.0) @@ -955,6 +958,9 @@ packages: engines: {node: '>=4'} hasBin: true + dayjs@1.11.21: + resolution: {integrity: sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==} + debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -2888,6 +2894,8 @@ snapshots: cssesc@3.0.0: {} + dayjs@1.11.21: {} + debug@4.4.3: dependencies: ms: 2.1.3 diff --git a/scripts/sync.ts b/scripts/sync.ts index aeeaa6c..5dbdd71 100644 --- a/scripts/sync.ts +++ b/scripts/sync.ts @@ -3,9 +3,13 @@ import fs from 'node:fs/promises' import path from 'node:path' import { fileURLToPath } from 'node:url' +import dayjs from 'dayjs' +import utc from 'dayjs/plugin/utc.js' import { parse } from 'semver' import { x } from 'tinyexec' +dayjs.extend(utc) + interface VersionRecord { version: string majorVersion: string @@ -95,12 +99,12 @@ async function fetchPublishTimes(): Promise> { continue } - const publishedAt = new Date(rawPublishedAt) - if (Number.isNaN(publishedAt.getTime())) { + const publishedAt = dayjs.utc(rawPublishedAt) + if (!publishedAt.isValid()) { throw new TypeError(`Invalid npm publish time for ${PACKAGE_NAME}@${rawVersion}`) } - publishTimes.set(formatSemver(semver), publishedAt.toISOString()) + publishTimes.set(formatSemver(semver), publishedAt.format('YYYY-MM-DD')) } if (publishTimes.size === 0) { From 82baa58187e46a0f7721ec85f1e1d51158645d81 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Wed, 12 Aug 2026 23:43:18 +0800 Subject: [PATCH 034/106] chore(deps): add giget dependency to project - Added giget package version 3.3.1 to package.json dependencies - Updated pnpm-lock.yaml with giget specification and resolution - Included giget in the locked dependency tree structure - Ensured proper integration with existing build tooling ecosystem --- package.json | 1 + pnpm-lock.yaml | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/package.json b/package.json index a5d5b8c..c70a22a 100644 --- a/package.json +++ b/package.json @@ -59,6 +59,7 @@ "@types/semver": "^7.8.0", "dayjs": "^1.11.21", "eslint": "^10.8.1", + "giget": "^3.3.1", "jiti": "^2.7.0", "lint-staged": "^17.3.0", "picocolors": "^1.1.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ea520d6..d347db7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -48,6 +48,9 @@ importers: eslint: specifier: ^10.8.1 version: 10.8.1(jiti@2.7.0) + giget: + specifier: ^3.3.1 + version: 3.3.1 jiti: specifier: ^2.7.0 version: 2.7.0 @@ -1331,6 +1334,10 @@ packages: resolution: {integrity: sha512-/6gFNr0N04nob252sTQxyFLi3eKFRqIg1I87YcqAMT1i6SQrSF6KujUEQrtrjMV0H/eejTCltLdDSTEMzHbnsQ==} engines: {node: '>=20.20.0'} + giget@3.3.1: + resolution: {integrity: sha512-r+mvuDjrjMpsdw46Kmeydb8bdHm7wOKw8wNBtTndkjbPjgAp5oUJUxRE76wZFknxIPokfWvep2qSXK37aXE6zg==} + hasBin: true + github-slugger@2.0.0: resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} @@ -3315,6 +3322,8 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 + giget@3.3.1: {} + github-slugger@2.0.0: {} glob-parent@6.0.2: From 2df42e127b5ef87cfd759ec562e87d4fa6c9f3a3 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Thu, 13 Aug 2026 00:10:00 +0800 Subject: [PATCH 035/106] feat(changelog): add changelog parsing script for multilingual support - Create new script to parse English and Chinese changelog files - Download Ant Design Vue repository from GitHub as template source - Parse changelog markdown files using regex patterns for version headings - Validate release dates and handle both inline and separate date formats - Merge English and Chinese changelog entries by version number - Generate JSON output with multilingual changelog records - Add proper error handling for duplicate versions and mismatched dates - Include temporary directory cleanup after processing completes --- scripts/changelog.ts | 224 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 224 insertions(+) create mode 100644 scripts/changelog.ts diff --git a/scripts/changelog.ts b/scripts/changelog.ts new file mode 100644 index 0000000..7d2b734 --- /dev/null +++ b/scripts/changelog.ts @@ -0,0 +1,224 @@ +// @env node + +import fs from 'node:fs/promises' +import os from 'node:os' +import path from 'node:path' +import { fileURLToPath } from 'node:url' +import { downloadTemplate } from 'giget' + +type Locale = 'en-US' | 'zh-CN' + +interface ParsedChangelog { + version: string + date: string | null + changelog: string +} + +interface ChangelogRecord { + version: string + date: string | null + changelog: Record +} + +const REPOSITORY_SOURCE = 'github:antdv-next/antdv-next#main' +const CHANGELOG_DIRECTORY = 'docs/src/pages/components' +const CHANGELOG_FILES = { + 'en-US': 'changelog.en-US.md', + 'zh-CN': 'changelog.zh-CN.md', +} as const satisfies Record +const OUTPUT_FILE = fileURLToPath(new URL('../data/changelog.json', import.meta.url)) +const VERSION_HEADING_PATTERN = /^##[ \t]+v?(\d+\.\d+\.\d+(?:-[a-z0-9.-]+)?(?:\+[a-z0-9.-]+)?)(?:[ \t]+-[ \t]+(\d{4}-\d{2}-\d{2}))?[ \t]*$/gim +const RELEASE_DATE_PATTERN = /^(?:Release Date|发布日期)[ \t]*[::][ \t]*(\d{4}-\d{2}-\d{2})[ \t]*$/i + +function trimBlankLines(lines: string[]): string[] { + let start = 0 + let end = lines.length + + while (start < end && lines[start]?.trim() === '') { + start += 1 + } + + while (end > start && lines[end - 1]?.trim() === '') { + end -= 1 + } + + return lines.slice(start, end) +} + +function assertValidDate(date: string, context: string): void { + const [year, month, day] = date.split('-').map(Number) + const parsedDate = new Date(Date.UTC(year, month - 1, day)) + + if ( + parsedDate.getUTCFullYear() !== year + || parsedDate.getUTCMonth() + 1 !== month + || parsedDate.getUTCDate() !== day + ) { + throw new Error(`Invalid release date ${date} in ${context}`) + } +} + +function parseSection( + rawSection: string, + version: string, + inlineDate: string | null, + locale: Locale, +): ParsedChangelog { + const lines = trimBlankLines(rawSection.split('\n')) + const releaseDateMatch = lines[0]?.match(RELEASE_DATE_PATTERN) + const releaseDate = releaseDateMatch?.[1] ?? null + + if (releaseDateMatch) { + lines.shift() + } + + if (inlineDate && releaseDate && inlineDate !== releaseDate) { + throw new Error( + `Conflicting release dates for ${version} in ${CHANGELOG_FILES[locale]}: ${inlineDate} and ${releaseDate}`, + ) + } + + const date = inlineDate ?? releaseDate + if (date) { + assertValidDate(date, `${CHANGELOG_FILES[locale]} (${version})`) + } + + const changelog = trimBlankLines(lines).join('\n') + if (!changelog) { + throw new Error(`Empty changelog for ${version} in ${CHANGELOG_FILES[locale]}`) + } + + return { + version, + date, + changelog, + } +} + +function parseChangelog(markdown: string, locale: Locale): ParsedChangelog[] { + const normalizedMarkdown = markdown.replace(/\r\n?/g, '\n') + const matches = [...normalizedMarkdown.matchAll(VERSION_HEADING_PATTERN)] + + if (matches.length === 0) { + throw new Error(`No version headings found in ${CHANGELOG_FILES[locale]}`) + } + + const seenVersions = new Set() + + return matches.map((match, index) => { + const version = match[1] + const sectionStart = match.index + match[0].length + const sectionEnd = matches[index + 1]?.index ?? normalizedMarkdown.length + + if (!version) { + throw new Error(`Invalid version heading in ${CHANGELOG_FILES[locale]}: ${match[0]}`) + } + + if (seenVersions.has(version)) { + throw new Error(`Duplicate version ${version} in ${CHANGELOG_FILES[locale]}`) + } + + seenVersions.add(version) + + return parseSection( + normalizedMarkdown.slice(sectionStart, sectionEnd), + version, + match[2] ?? null, + locale, + ) + }) +} + +function mergeChangelogs( + englishChangelogs: ParsedChangelog[], + chineseChangelogs: ParsedChangelog[], +): ChangelogRecord[] { + const chineseByVersion = new Map( + chineseChangelogs.map(changelog => [changelog.version, changelog]), + ) + + if (englishChangelogs.length !== chineseChangelogs.length) { + throw new Error( + `Changelog version count differs: en-US has ${englishChangelogs.length}, zh-CN has ${chineseChangelogs.length}`, + ) + } + + return englishChangelogs.map((englishChangelog) => { + const chineseChangelog = chineseByVersion.get(englishChangelog.version) + + if (!chineseChangelog) { + throw new Error(`Version ${englishChangelog.version} is missing from ${CHANGELOG_FILES['zh-CN']}`) + } + + if ( + englishChangelog.date + && chineseChangelog.date + && englishChangelog.date !== chineseChangelog.date + ) { + throw new Error( + `Release date differs for ${englishChangelog.version}: en-US is ${englishChangelog.date}, zh-CN is ${chineseChangelog.date}`, + ) + } + + return { + version: englishChangelog.version, + date: englishChangelog.date ?? chineseChangelog.date, + changelog: { + 'en-US': englishChangelog.changelog, + 'zh-CN': chineseChangelog.changelog, + }, + } + }) +} + +async function readChangelogs(repositoryDirectory: string): Promise { + const locales = Object.keys(CHANGELOG_FILES) as Locale[] + const parsedChangelogs = await Promise.all(locales.map(async (locale) => { + const filename = path.join( + repositoryDirectory, + CHANGELOG_DIRECTORY, + CHANGELOG_FILES[locale], + ) + const markdown = await fs.readFile(filename, 'utf8') + + return [locale, parseChangelog(markdown, locale)] as const + })) + const changelogsByLocale = Object.fromEntries(parsedChangelogs) as Record< + Locale, + ParsedChangelog[] + > + + return mergeChangelogs( + changelogsByLocale['en-US'], + changelogsByLocale['zh-CN'], + ) +} + +async function main(): Promise { + const temporaryDirectory = await fs.mkdtemp( + path.join(os.tmpdir(), 'antdv-next-changelog-'), + ) + + try { + const repositoryDirectory = path.join(temporaryDirectory, 'repository') + const downloadedRepository = await downloadTemplate(REPOSITORY_SOURCE, { + dir: repositoryDirectory, + silent: true, + }) + const changelogs = await readChangelogs(downloadedRepository.dir) + + await fs.mkdir(path.dirname(OUTPUT_FILE), { recursive: true }) + await fs.writeFile( + OUTPUT_FILE, + `${JSON.stringify(changelogs, null, 2)}\n`, + 'utf8', + ) + + console.log(`Wrote ${changelogs.length} releases to ${OUTPUT_FILE}`) + } + finally { + await fs.rm(temporaryDirectory, { recursive: true, force: true }) + } +} + +await main() From 091d4b2d2343d4507c2a49f58a9c46f4671190b0 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Thu, 13 Aug 2026 00:25:12 +0800 Subject: [PATCH 036/106] refactor(changelog): update changelog parser to use conventional commit format - Replace locale-based dual changelog system with single English changelog parsing - Add ChangelogItem interface with component, type, and description fields - Implement list item collection with proper multiline support - Add conventional commit pattern matching for changelog entries - Remove Chinese changelog integration and merging logic - Update output format to include changelog item counts and statistics - Add warning for skipped list items without conventional commit metadata --- scripts/changelog.ts | 224 +++++++++++++++++++++++++------------------ 1 file changed, 129 insertions(+), 95 deletions(-) diff --git a/scripts/changelog.ts b/scripts/changelog.ts index 7d2b734..a46e11f 100644 --- a/scripts/changelog.ts +++ b/scripts/changelog.ts @@ -6,29 +6,36 @@ import path from 'node:path' import { fileURLToPath } from 'node:url' import { downloadTemplate } from 'giget' -type Locale = 'en-US' | 'zh-CN' - -interface ParsedChangelog { - version: string - date: string | null - changelog: string +interface ChangelogItem { + component: string | null + type: string + description: string } interface ChangelogRecord { version: string date: string | null - changelog: Record + changelog: ChangelogItem[] +} + +interface ParsedSection { + record: ChangelogRecord + listItemCount: number +} + +interface ParsedChangelog { + records: ChangelogRecord[] + listItemCount: number } const REPOSITORY_SOURCE = 'github:antdv-next/antdv-next#main' -const CHANGELOG_DIRECTORY = 'docs/src/pages/components' -const CHANGELOG_FILES = { - 'en-US': 'changelog.en-US.md', - 'zh-CN': 'changelog.zh-CN.md', -} as const satisfies Record +const CHANGELOG_FILE = 'docs/src/pages/components/changelog.en-US.md' const OUTPUT_FILE = fileURLToPath(new URL('../data/changelog.json', import.meta.url)) const VERSION_HEADING_PATTERN = /^##[ \t]+v?(\d+\.\d+\.\d+(?:-[a-z0-9.-]+)?(?:\+[a-z0-9.-]+)?)(?:[ \t]+-[ \t]+(\d{4}-\d{2}-\d{2}))?[ \t]*$/gim -const RELEASE_DATE_PATTERN = /^(?:Release Date|发布日期)[ \t]*[::][ \t]*(\d{4}-\d{2}-\d{2})[ \t]*$/i +const RELEASE_DATE_PATTERN = /^Release Date[ \t]*:[ \t]*(\d{4}-\d{2}-\d{2})[ \t]*$/i +const LIST_ITEM_PATTERN = /^[*+-][ \t]+(\S.*)$/ +const LIST_ITEM_CONTINUATION_PATTERN = /^[ \t]+(\S.*)$/ +const COMMIT_METADATA_PATTERN = /^(feat|fix|docs|test|chore|perf|refactor|build|ci|style|revert)(?:\(([^)\r\n]+)\))?!?:[ \t]+(\S[\s\S]*)$/ function trimBlankLines(lines: string[]): string[] { let start = 0 @@ -45,6 +52,52 @@ function trimBlankLines(lines: string[]): string[] { return lines.slice(start, end) } +function collectListItems(lines: string[]): string[] { + const items: string[] = [] + let currentItem: string[] | null = null + + const finishCurrentItem = (): void => { + if (!currentItem) { + return + } + + items.push(trimBlankLines(currentItem).join('\n')) + currentItem = null + } + + for (const line of lines) { + const listItemMatch = line.match(LIST_ITEM_PATTERN) + + if (listItemMatch?.[1]) { + finishCurrentItem() + currentItem = [listItemMatch[1]] + continue + } + + if (!currentItem) { + continue + } + + if (line.trim() === '') { + currentItem.push('') + continue + } + + const continuationMatch = line.match(LIST_ITEM_CONTINUATION_PATTERN) + + if (continuationMatch?.[1]) { + currentItem.push(continuationMatch[1]) + continue + } + + finishCurrentItem() + } + + finishCurrentItem() + + return items +} + function assertValidDate(date: string, context: string): void { const [year, month, day] = date.split('-').map(Number) const parsedDate = new Date(Date.UTC(year, month - 1, day)) @@ -62,8 +115,7 @@ function parseSection( rawSection: string, version: string, inlineDate: string | null, - locale: Locale, -): ParsedChangelog { +): ParsedSection { const lines = trimBlankLines(rawSection.split('\n')) const releaseDateMatch = lines[0]?.match(RELEASE_DATE_PATTERN) const releaseDate = releaseDateMatch?.[1] ?? null @@ -74,48 +126,67 @@ function parseSection( if (inlineDate && releaseDate && inlineDate !== releaseDate) { throw new Error( - `Conflicting release dates for ${version} in ${CHANGELOG_FILES[locale]}: ${inlineDate} and ${releaseDate}`, + `Conflicting release dates for ${version} in ${CHANGELOG_FILE}: ${inlineDate} and ${releaseDate}`, ) } const date = inlineDate ?? releaseDate if (date) { - assertValidDate(date, `${CHANGELOG_FILES[locale]} (${version})`) + assertValidDate(date, `${CHANGELOG_FILE} (${version})`) } - const changelog = trimBlankLines(lines).join('\n') - if (!changelog) { - throw new Error(`Empty changelog for ${version} in ${CHANGELOG_FILES[locale]}`) - } + const listItems = collectListItems(lines) + const changelog = listItems.flatMap((item): ChangelogItem[] => { + const match = item.match(COMMIT_METADATA_PATTERN) + + if (!match) { + return [] + } + + const [, type, component, description] = match + + if (!type || !description) { + return [] + } + + return [{ + component: component?.trim() || null, + type, + description: description.trim(), + }] + }) return { - version, - date, - changelog, + record: { + version, + date, + changelog, + }, + listItemCount: listItems.length, } } -function parseChangelog(markdown: string, locale: Locale): ParsedChangelog[] { +function parseChangelog(markdown: string): ParsedChangelog { const normalizedMarkdown = markdown.replace(/\r\n?/g, '\n') const matches = [...normalizedMarkdown.matchAll(VERSION_HEADING_PATTERN)] if (matches.length === 0) { - throw new Error(`No version headings found in ${CHANGELOG_FILES[locale]}`) + throw new Error(`No version headings found in ${CHANGELOG_FILE}`) } const seenVersions = new Set() - return matches.map((match, index) => { + const sections = matches.map((match, index) => { const version = match[1] const sectionStart = match.index + match[0].length const sectionEnd = matches[index + 1]?.index ?? normalizedMarkdown.length if (!version) { - throw new Error(`Invalid version heading in ${CHANGELOG_FILES[locale]}: ${match[0]}`) + throw new Error(`Invalid version heading in ${CHANGELOG_FILE}: ${match[0]}`) } if (seenVersions.has(version)) { - throw new Error(`Duplicate version ${version} in ${CHANGELOG_FILES[locale]}`) + throw new Error(`Duplicate version ${version} in ${CHANGELOG_FILE}`) } seenVersions.add(version) @@ -124,74 +195,16 @@ function parseChangelog(markdown: string, locale: Locale): ParsedChangelog[] { normalizedMarkdown.slice(sectionStart, sectionEnd), version, match[2] ?? null, - locale, ) }) -} - -function mergeChangelogs( - englishChangelogs: ParsedChangelog[], - chineseChangelogs: ParsedChangelog[], -): ChangelogRecord[] { - const chineseByVersion = new Map( - chineseChangelogs.map(changelog => [changelog.version, changelog]), - ) - if (englishChangelogs.length !== chineseChangelogs.length) { - throw new Error( - `Changelog version count differs: en-US has ${englishChangelogs.length}, zh-CN has ${chineseChangelogs.length}`, - ) + return { + records: sections.map(section => section.record), + listItemCount: sections.reduce( + (count, section) => count + section.listItemCount, + 0, + ), } - - return englishChangelogs.map((englishChangelog) => { - const chineseChangelog = chineseByVersion.get(englishChangelog.version) - - if (!chineseChangelog) { - throw new Error(`Version ${englishChangelog.version} is missing from ${CHANGELOG_FILES['zh-CN']}`) - } - - if ( - englishChangelog.date - && chineseChangelog.date - && englishChangelog.date !== chineseChangelog.date - ) { - throw new Error( - `Release date differs for ${englishChangelog.version}: en-US is ${englishChangelog.date}, zh-CN is ${chineseChangelog.date}`, - ) - } - - return { - version: englishChangelog.version, - date: englishChangelog.date ?? chineseChangelog.date, - changelog: { - 'en-US': englishChangelog.changelog, - 'zh-CN': chineseChangelog.changelog, - }, - } - }) -} - -async function readChangelogs(repositoryDirectory: string): Promise { - const locales = Object.keys(CHANGELOG_FILES) as Locale[] - const parsedChangelogs = await Promise.all(locales.map(async (locale) => { - const filename = path.join( - repositoryDirectory, - CHANGELOG_DIRECTORY, - CHANGELOG_FILES[locale], - ) - const markdown = await fs.readFile(filename, 'utf8') - - return [locale, parseChangelog(markdown, locale)] as const - })) - const changelogsByLocale = Object.fromEntries(parsedChangelogs) as Record< - Locale, - ParsedChangelog[] - > - - return mergeChangelogs( - changelogsByLocale['en-US'], - changelogsByLocale['zh-CN'], - ) } async function main(): Promise { @@ -205,7 +218,26 @@ async function main(): Promise { dir: repositoryDirectory, silent: true, }) - const changelogs = await readChangelogs(downloadedRepository.dir) + const markdown = await fs.readFile( + path.join(downloadedRepository.dir, CHANGELOG_FILE), + 'utf8', + ) + const { records: changelogs, listItemCount } = parseChangelog(markdown) + const changelogItemCount = changelogs.reduce( + (count, changelog) => count + changelog.changelog.length, + 0, + ) + const skippedItemCount = listItemCount - changelogItemCount + + if (changelogItemCount === 0) { + throw new Error(`No conventional-commit changelog items found in ${CHANGELOG_FILE}`) + } + + if (skippedItemCount > 0) { + console.warn( + `Skipped ${skippedItemCount} list items without conventional-commit metadata`, + ) + } await fs.mkdir(path.dirname(OUTPUT_FILE), { recursive: true }) await fs.writeFile( @@ -214,7 +246,9 @@ async function main(): Promise { 'utf8', ) - console.log(`Wrote ${changelogs.length} releases to ${OUTPUT_FILE}`) + console.log( + `Wrote ${changelogs.length} releases with ${changelogItemCount} changelog items to ${OUTPUT_FILE}`, + ) } finally { await fs.rm(temporaryDirectory, { recursive: true, force: true }) From 7a7692e34aca469adf113fce3900da468137687d Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Thu, 13 Aug 2026 00:27:02 +0800 Subject: [PATCH 037/106] fix(changelog): validate release date format before parsing - Add regex validation to ensure date follows YYYY-MM-DD format - Throw error with context when invalid date format is detected - Extract year, month, and day using slice instead of split - Maintain UTC date parsing behavior after validation - Preserve existing date validation logic flow --- scripts/changelog.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/scripts/changelog.ts b/scripts/changelog.ts index a46e11f..48cba16 100644 --- a/scripts/changelog.ts +++ b/scripts/changelog.ts @@ -99,7 +99,13 @@ function collectListItems(lines: string[]): string[] { } function assertValidDate(date: string, context: string): void { - const [year, month, day] = date.split('-').map(Number) + if (!/^\d{4}-\d{2}-\d{2}$/.test(date)) { + throw new Error(`Invalid release date ${date} in ${context}`) + } + + const year = Number(date.slice(0, 4)) + const month = Number(date.slice(5, 7)) + const day = Number(date.slice(8, 10)) const parsedDate = new Date(Date.UTC(year, month - 1, day)) if ( From 31de7bb513393ea178530f3cab12ad539402f9e0 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Thu, 13 Aug 2026 09:46:34 +0800 Subject: [PATCH 038/106] perf(changelog): change temp directory handling to use cwd - Remove os import since it's no longer needed - Add process import for cwd access - Use process.cwd() instead of os.tmpdir() for repository location - Simplify directory structure by removing temporary directory creation - Update cleanup logic to remove repository directory directly - Maintain same functionality while improving directory management --- scripts/changelog.ts | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/scripts/changelog.ts b/scripts/changelog.ts index 48cba16..43d95c9 100644 --- a/scripts/changelog.ts +++ b/scripts/changelog.ts @@ -1,8 +1,8 @@ // @env node import fs from 'node:fs/promises' -import os from 'node:os' import path from 'node:path' +import process from 'node:process' import { fileURLToPath } from 'node:url' import { downloadTemplate } from 'giget' @@ -214,12 +214,9 @@ function parseChangelog(markdown: string): ParsedChangelog { } async function main(): Promise { - const temporaryDirectory = await fs.mkdtemp( - path.join(os.tmpdir(), 'antdv-next-changelog-'), - ) + const repositoryDirectory = path.join(process.cwd(), 'repository') try { - const repositoryDirectory = path.join(temporaryDirectory, 'repository') const downloadedRepository = await downloadTemplate(REPOSITORY_SOURCE, { dir: repositoryDirectory, silent: true, @@ -257,7 +254,7 @@ async function main(): Promise { ) } finally { - await fs.rm(temporaryDirectory, { recursive: true, force: true }) + await fs.rm(repositoryDirectory, { recursive: true, force: true }) } } From 36214fe15df87f21580328ee33117f19da4353d2 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Thu, 13 Aug 2026 10:07:15 +0800 Subject: [PATCH 039/106] perf(sync): update changelog record property name - Changed publishedAt property to date in ChangelogRecord interface - Updated return statement to use date instead of publishedAt - Maintained same functionality while improving property naming consistency --- scripts/sync.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/sync.ts b/scripts/sync.ts index 5dbdd71..731e46f 100644 --- a/scripts/sync.ts +++ b/scripts/sync.ts @@ -16,7 +16,7 @@ interface VersionRecord { } interface ChangelogRecord extends VersionRecord { - publishedAt: string + date: string } interface ChangelogFile extends VersionRecord { @@ -211,7 +211,7 @@ function createChangelogRecord( return { ...tag.record, - publishedAt, + date: publishedAt, } } From a1f0771b9d23673e45a3f46198bad0b4d2b394e5 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Thu, 13 Aug 2026 10:39:46 +0800 Subject: [PATCH 040/106] fix(args): enforce strict typing for output format default value - Changed default value from string literal to const assertion - Ensures type safety for OUTPUT_FORMATS enum matching - Prevents potential runtime type mismatches in format selection --- src/args.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/args.ts b/src/args.ts index a3a5a13..b3e0c2b 100644 --- a/src/args.ts +++ b/src/args.ts @@ -14,7 +14,7 @@ export const defaultArgs = { type: 'enum', description: 'Output format', alias: 'f', - default: 'text', + default: 'text' as const, options: [...OUTPUT_FORMATS], }, } satisfies ArgsDef From db9958113612ed4dac4d79a018b827d68b928c14 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Thu, 13 Aug 2026 10:45:36 +0800 Subject: [PATCH 041/106] types(version): move __CLI_VERSION__ declaration to types module - Moved __CLI_VERSION__ declaration from index.ts to types.ts - Added export keyword to make the declaration available externally - Reordered imports in index.ts to place new import after existing ones - Maintained same functionality while improving code organization --- src/index.ts | 2 +- src/types.ts | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index 107b7bf..a8e5111 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,9 +1,9 @@ import { createMain, defineCommand, renderUsage, showUsage } from 'citty' import { defaultArgs } from '@/args.ts' +import { __CLI_VERSION__ } from '@/types.ts' import { createHelpBanner } from '@/utils/banner.ts' import { description, name, version } from '../package.json' with { type: 'json' } -declare const __CLI_VERSION__: string const CLI_VERSION = __CLI_VERSION__ const subCommands = { diff --git a/src/types.ts b/src/types.ts index 6a4f080..8b3b056 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,5 +1,7 @@ import type { OutputFormat } from '@/args.ts' +export declare const __CLI_VERSION__: string + export interface ResolvedConfig { cwd: string format: OutputFormat From e6499cf243735ab2815150f12f35fdd73c8b8e0a Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Thu, 13 Aug 2026 10:49:42 +0800 Subject: [PATCH 042/106] types(cli): move CLI version type declaration to separate file - Removed __CLI_VERSION__ export from src/types.ts - Created new src/types/cli.version.d.ts for version declaration - Updated import in src/index.ts to remove unused __CLI_VERSION__ reference - Maintained same type definition in new dedicated file - Improved code organization by separating version types --- src/index.ts | 1 - src/types.ts | 2 -- src/types/cli.version.d.ts | 1 + 3 files changed, 1 insertion(+), 3 deletions(-) create mode 100644 src/types/cli.version.d.ts diff --git a/src/index.ts b/src/index.ts index a8e5111..20edcc3 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,6 +1,5 @@ import { createMain, defineCommand, renderUsage, showUsage } from 'citty' import { defaultArgs } from '@/args.ts' -import { __CLI_VERSION__ } from '@/types.ts' import { createHelpBanner } from '@/utils/banner.ts' import { description, name, version } from '../package.json' with { type: 'json' } diff --git a/src/types.ts b/src/types.ts index 8b3b056..6a4f080 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,7 +1,5 @@ import type { OutputFormat } from '@/args.ts' -export declare const __CLI_VERSION__: string - export interface ResolvedConfig { cwd: string format: OutputFormat diff --git a/src/types/cli.version.d.ts b/src/types/cli.version.d.ts new file mode 100644 index 0000000..151e964 --- /dev/null +++ b/src/types/cli.version.d.ts @@ -0,0 +1 @@ +declare const __CLI_VERSION__: string From 77d7cbded9050fd7efea5dec11ab5e84a8588e16 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Thu, 13 Aug 2026 11:01:13 +0800 Subject: [PATCH 043/106] feat(args): add target version option for antdv-next migration - Added ver argument to specify target antdv-next version - Updated argument parser to handle new string-type option - Added description field explaining the purpose of the new option - Maintained default behavior for existing arguments - Enhanced CLI interface with version targeting capability --- src/args.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/args.ts b/src/args.ts index b3e0c2b..381bc56 100644 --- a/src/args.ts +++ b/src/args.ts @@ -10,6 +10,10 @@ export const defaultArgs = { alias: 'c', default: process.cwd(), }, + ver: { + type: 'string', + description: 'Target antdv-next version (e.g. 1.0.0)', + }, format: { type: 'enum', description: 'Output format', From 2620a2cf9556d6722951ba255853bf4d63f05cb2 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Thu, 13 Aug 2026 11:17:57 +0800 Subject: [PATCH 044/106] feat(utils): add package manager version detection utility - Implement getPackageManagerVersion function to retrieve package manager version - Use tinyexec library to execute package manager commands safely - Handle command execution with proper error handling and fallback - Return trimmed stdout or default '0.0.0' when version detection fails - Add proper TypeScript typing for the function parameters and return value - Include cwd parameter for specifying working directory during execution --- src/utils/env.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/utils/env.ts diff --git a/src/utils/env.ts b/src/utils/env.ts new file mode 100644 index 0000000..999dd49 --- /dev/null +++ b/src/utils/env.ts @@ -0,0 +1,17 @@ +import { x } from 'tinyexec' + +export const getPackageManagerVersion = async (cwd: string, manager: string): Promise => { + try { + const { stdout } = await x(manager, ['-v'], { + nodeOptions: { + cwd, + stdio: 'pipe', + }, + }) + return stdout.trim() + } + // eslint-disable-next-line unused-imports/no-unused-vars + catch (error) { + return '0.0.0' + } +} From 59502add0d1d5965b15742ed6a6cc963dd442677 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Thu, 13 Aug 2026 16:51:19 +0800 Subject: [PATCH 045/106] chore(devdeps): add utils package and changelog script - Added @lonewolfyx/utils dependency to devDependencies - Added generate-changelog script using tsx runner - Updated package.json with new utility functions requirement --- package.json | 4 +- pnpm-lock.yaml | 2041 +++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 1663 insertions(+), 382 deletions(-) diff --git a/package.json b/package.json index c70a22a..dd0bd1c 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,8 @@ "prepublishOnly": "pnpm build", "prepare": "simple-git-hooks", "test": "vitest run", - "test:watch": "vitest" + "test:watch": "vitest", + "generate-changelog": "tsx ./scripts/changelog.ts" }, "dependencies": { "@clack/prompts": "^1.7.0", @@ -55,6 +56,7 @@ "devDependencies": { "@antfu/eslint-config": "^9.3.0", "@lonewolfyx/tsconfig": "^0.0.6", + "@lonewolfyx/utils": "^0.0.5", "@types/node": "^26.2.0", "@types/semver": "^7.8.0", "dayjs": "^1.11.21", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d347db7..0f9c632 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -32,10 +32,13 @@ importers: devDependencies: '@antfu/eslint-config': specifier: ^9.3.0 - version: 9.3.0(@typescript-eslint/typescript-estree@8.66.0(typescript@6.0.3))(@typescript-eslint/utils@8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(@vue/compiler-sfc@3.5.41)(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3)(vitest@4.1.10(@types/node@26.2.0)(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))) + version: 9.3.0(@typescript-eslint/typescript-estree@8.67.0(typescript@6.0.3))(@typescript-eslint/utils@8.67.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(@vue/compiler-sfc@3.5.41)(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3)(vitest@4.1.10(@types/node@26.2.0)(vite@5.4.21(@types/node@26.2.0))) '@lonewolfyx/tsconfig': specifier: ^0.0.6 version: 0.0.6(typescript@6.0.3) + '@lonewolfyx/utils': + specifier: ^0.0.5 + version: 0.0.5(@algolia/client-search@5.56.0)(@types/node@26.2.0)(change-case@5.4.4)(postcss@8.5.26)(search-insights@2.17.3)(typescript@6.0.3)(vue@3.5.41(typescript@6.0.3)) '@types/node': specifier: ^26.2.0 version: 26.2.0 @@ -77,10 +80,86 @@ importers: version: 0.0.1 vitest: specifier: ^4.1.10 - version: 4.1.10(@types/node@26.2.0)(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) + version: 4.1.10(@types/node@26.2.0)(vite@5.4.21(@types/node@26.2.0)) packages: + '@algolia/abtesting@1.22.0': + resolution: {integrity: sha512-BFR6zNowNKcY7Ou7TaJc9QWexES4YKPbmf/OTFofpdsdhz4x6q0lbxp3duO0EHnyrN7rE4ba/TSXuY+BDGu4+g==} + engines: {node: '>= 14.0.0'} + + '@algolia/autocomplete-core@1.17.7': + resolution: {integrity: sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==} + + '@algolia/autocomplete-plugin-algolia-insights@1.17.7': + resolution: {integrity: sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==} + peerDependencies: + search-insights: '>= 1 < 3' + + '@algolia/autocomplete-preset-algolia@1.17.7': + resolution: {integrity: sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==} + peerDependencies: + '@algolia/client-search': '>= 4.9.1 < 6' + algoliasearch: '>= 4.9.1 < 6' + + '@algolia/autocomplete-shared@1.17.7': + resolution: {integrity: sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==} + peerDependencies: + '@algolia/client-search': '>= 4.9.1 < 6' + algoliasearch: '>= 4.9.1 < 6' + + '@algolia/client-abtesting@5.56.0': + resolution: {integrity: sha512-7r4Z3NC7yU1oAQVWJNA2HX7tX481F3pJvCGyLIXiTdBcthz4Q/o21jwcMYDFkuI92UWTNBQQmHYgwHo1zS5dzg==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-analytics@5.56.0': + resolution: {integrity: sha512-avmjXQSq+jadFO8Xl2em05/uQdQnEmHsJyOAdVbZkmVgpMfxL12aJwVVfGNwYr9nulcpuJN1X0lTaQ5wxuNGcA==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-common@5.56.0': + resolution: {integrity: sha512-v2TPStUhY//ripPjIVclZ8AWc7DEGooXULZGFlFu37zNatgHjw34oZZ+OSbbc/YHO+xZwPl62I1k8xH1m4S2eg==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-insights@5.56.0': + resolution: {integrity: sha512-P0ehROpM4Sem3Sqo5x2cKPgj67D3G3jy0rh1Amwkcvsfr6tkvIcdCmerieanqTF7NxUMPNFLkpIFeMO8Rpa50w==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-personalization@5.56.0': + resolution: {integrity: sha512-SXK3Vn3WVxyzbm31oePZBJkp1wpOyuWdd4B/Pv7n0aXDxmeSWhC1R1FC1517mMrFAIaPH4Rt0x6RUe7ZNjz8FA==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-query-suggestions@5.56.0': + resolution: {integrity: sha512-5+ZdX8garFnmycnZgKhtXHePEaLj5zqDxI/0lkhhluzCcvTn0/PvvTirTg8hHYetQHvn7GDyeAiqTAieMvMW4A==} + engines: {node: '>= 14.0.0'} + + '@algolia/client-search@5.56.0': + resolution: {integrity: sha512-+mKUdYvqOi0BcvpAEyCEw49vSBptufIcfibtHz2bdr1pI789M46Yt0uQEk/sxtK3teh71OQvVFHaTDzShUWewQ==} + engines: {node: '>= 14.0.0'} + + '@algolia/ingestion@1.56.0': + resolution: {integrity: sha512-9g/zj+AZx5moFcdFIrYQoVrueXivjUcc3MQHtCYT8WhIuk1lUh1AyEhvJCS0XBZld09cLvd1AZ3BvDBpVpX2UA==} + engines: {node: '>= 14.0.0'} + + '@algolia/monitoring@1.56.0': + resolution: {integrity: sha512-Qf3Sr6f9A9uxCZUf3MXS0d2b877uYzEB5yxqpVGXAhcJnBCQjrRRon0KvefpGkxy+BshrIJs96OUoMtGqXTFDA==} + engines: {node: '>= 14.0.0'} + + '@algolia/recommend@5.56.0': + resolution: {integrity: sha512-GXWG1rWc5wu8hY4N33Y3b6ernY6sAdAvmKWN/zHAiACOx40WnpG0TVX5YazCAr/9gOYGInSiM2A0y2jy2xbiDA==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-browser-xhr@5.56.0': + resolution: {integrity: sha512-7t24cBxaInS3mZb7ddEaZT/tp6q+/aR4YttsQVyP1/i+LmwPR34atO35KjaLFCcRVrlP7sYOAqkCfg6lIRB+ew==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-fetch@5.56.0': + resolution: {integrity: sha512-R7ePHgVYmDFjZpvrsVAfbDz/d4RxKAYZ5/vgLfIsCVRZRryjWl/3INOxpOICzitehQ5FjNtNjcLQTrmHPTcHBQ==} + engines: {node: '>= 14.0.0'} + + '@algolia/requester-node-http@5.56.0': + resolution: {integrity: sha512-PIOUXlSnrqM0S+WOgDRb4RzotydJH7ZoT6tOyL7tAO7qJOfvX5wsEW8Pe+PMKMwvuI4/gIyK9cg2H7lJXqnc4Q==} + engines: {node: '>= 14.0.0'} + '@antfu/eslint-config@9.3.0': resolution: {integrity: sha512-+CIC4G6MowUl1RHiT01Ah9Obo/wwVynw7uNlN8ODwEn2opo9W1KzaatCrmu4WhGGJjOkOkyT5w7kKfQ//agHrQ==} hasBin: true @@ -173,6 +252,29 @@ packages: resolution: {integrity: sha512-y7/yvZ2TPAnR9+jnc00klvNNLkJiXFFrQA/hlLCcxA9a2A4zQIOimyFQ9XfwYKiGD1fb5GY8vbKIIgO8d5Tb2A==} engines: {node: '>= 20.12.0'} + '@docsearch/css@3.8.2': + resolution: {integrity: sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ==} + + '@docsearch/js@3.8.2': + resolution: {integrity: sha512-Q5wY66qHn0SwA7Taa0aDbHiJvaFJLOJyHmooQ7y8hlwwQLQ/5WwCcoX0g7ii04Qi2DJlHsd0XXzJ8Ypw9+9YmQ==} + + '@docsearch/react@3.8.2': + resolution: {integrity: sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg==} + peerDependencies: + '@types/react': '>= 16.8.0 < 19.0.0' + react: '>= 16.8.0 < 19.0.0' + react-dom: '>= 16.8.0 < 19.0.0' + search-insights: '>= 1 < 3' + peerDependenciesMeta: + '@types/react': + optional: true + react: + optional: true + react-dom: + optional: true + search-insights: + optional: true + '@e18e/eslint-plugin@0.6.0': resolution: {integrity: sha512-JQkeXoZA12f9WM2H4t4IobIRqlPvYLeNAjZF6raFu2vmD5YoyuzKmwsLZNJ4g/39c3v1Se2ad3o+oq4y2et/RA==} peerDependencies: @@ -196,102 +298,204 @@ packages: resolution: {integrity: sha512-Q9hjxWI5xBM+qW2enxfe8wDKdFWMfd0Z29k5ZJnuBqD/CasY5Zryj09aCA6owbGATWz+39p5uIdaHXpopOcG8g==} engines: {node: '>=10'} + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + '@esbuild/aix-ppc64@0.28.2': resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm64@0.28.2': resolution: {integrity: sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==} engines: {node: '>=18'} cpu: [arm64] os: [android] + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + '@esbuild/android-arm@0.28.2': resolution: {integrity: sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==} engines: {node: '>=18'} cpu: [arm] os: [android] + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + '@esbuild/android-x64@0.28.2': resolution: {integrity: sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==} engines: {node: '>=18'} cpu: [x64] os: [android] + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-arm64@0.28.2': resolution: {integrity: sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + '@esbuild/darwin-x64@0.28.2': resolution: {integrity: sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==} engines: {node: '>=18'} cpu: [x64] os: [darwin] + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-arm64@0.28.2': resolution: {integrity: sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + '@esbuild/freebsd-x64@0.28.2': resolution: {integrity: sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm64@0.28.2': resolution: {integrity: sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==} engines: {node: '>=18'} cpu: [arm64] os: [linux] + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + '@esbuild/linux-arm@0.28.2': resolution: {integrity: sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==} engines: {node: '>=18'} cpu: [arm] os: [linux] + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-ia32@0.28.2': resolution: {integrity: sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-loong64@0.28.2': resolution: {integrity: sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==} engines: {node: '>=18'} cpu: [loong64] os: [linux] + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-mips64el@0.28.2': resolution: {integrity: sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-ppc64@0.28.2': resolution: {integrity: sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-riscv64@0.28.2': resolution: {integrity: sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-s390x@0.28.2': resolution: {integrity: sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==} engines: {node: '>=18'} cpu: [s390x] os: [linux] + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + '@esbuild/linux-x64@0.28.2': resolution: {integrity: sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==} engines: {node: '>=18'} @@ -304,6 +508,12 @@ packages: cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + '@esbuild/netbsd-x64@0.28.2': resolution: {integrity: sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==} engines: {node: '>=18'} @@ -316,6 +526,12 @@ packages: cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + '@esbuild/openbsd-x64@0.28.2': resolution: {integrity: sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==} engines: {node: '>=18'} @@ -328,24 +544,48 @@ packages: cpu: [arm64] os: [openharmony] + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + '@esbuild/sunos-x64@0.28.2': resolution: {integrity: sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==} engines: {node: '>=18'} cpu: [x64] os: [sunos] + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-arm64@0.28.2': resolution: {integrity: sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-ia32@0.28.2': resolution: {integrity: sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==} engines: {node: '>=18'} cpu: [ia32] os: [win32] + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + '@esbuild/win32-x64@0.28.2': resolution: {integrity: sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==} engines: {node: '>=18'} @@ -429,6 +669,17 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} + '@iconify-json/simple-icons@1.2.93': + resolution: {integrity: sha512-/XhANjfGYOuqvSR3TmUnkQkINvQ4GVjVuukvymRbxtVFBvIq/yiXJqCDycKcQPT401OYT9H2vIY6ihAlz1QIAw==} + + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@iconify/vue@5.0.1': + resolution: {integrity: sha512-aumwwooJlFJ5H5qYWB6ZTAyM0C8hpfcSVLB9/a3qnH1GGvIJ+FEbpEs4s/HfErYe/M5qZeLjwmESR5fFm3lXEw==} + peerDependencies: + vue: '>=3.0.0' + '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} @@ -437,6 +688,16 @@ packages: peerDependencies: typescript: ^5.8.2 + '@lonewolfyx/utils@0.0.5': + resolution: {integrity: sha512-y5/Znkg6puA9bhiesQzS5Nlup4NwyILqYZhwvsoRbRG/RJDA3XKXzdkknX6SP3y1KmwwRpZRtIru4qQa+kRQ7w==} + + '@napi-rs/lzma-linux-x64-gnu@1.5.1': + resolution: {integrity: sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==} + engines: {node: ^22.20 || ^24.12 || >=25} + cpu: [x64] + os: [linux] + libc: [glibc] + '@ota-meshi/ast-token-store@0.3.0': resolution: {integrity: sha512-XRO0zi2NIUKq2lUk3T1ecFSld1fMWRKE6naRFGkgkdeosx7IslyUKNv5Dcb5PJTja9tHJoFu0v/7yEpAkrkrTg==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} @@ -544,6 +805,168 @@ packages: '@rolldown/pluginutils@1.0.1': resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} + '@rollup/rollup-android-arm-eabi@4.62.4': + resolution: {integrity: sha512-RrPokAb7dmbxFoeO3TloqHyOjgye8RkBhSqmp4aJMIex4c9r46ZstPnleDQOq1t46VOVjwIuwNogIqbodV1Vvg==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.62.4': + resolution: {integrity: sha512-JKuJc+pnpks2pjy7L/N3v/cAkZxYlnmuZoD840ldbMI5KDbC4iO9NKwPKYdjYFCMAIIlBzYSFHxIJVYzRo2/8A==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.62.4': + resolution: {integrity: sha512-krw5uS2STmvJ02x0uTXHbqQNuz+9eZ1iw+qXk9dmW2gvV4jV7O2hEoOnuhFrpOPiel1mBFtqbxYZZtC46hXLOw==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.62.4': + resolution: {integrity: sha512-wsTxtgApb4PrOsNJIm0FZ1h3WvCC+k9uxLJ4ad75hgoS4NiRes2SoJFlDAyMwiUY8IssDqGcHbXuN0sx1tfF1A==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.62.4': + resolution: {integrity: sha512-GUOnQlyZe3yAXhWOtOMsn5Qkrv5E5mZXa0thbARWi5Ei2szlVXJFQhddZ4HbAzh8q92w5twp+CQvs/eFanz9YQ==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.62.4': + resolution: {integrity: sha512-/Y7f3QuxjzPKsjA/rfEDa3+0vXqyjmJ50Ln8dPpCmWkKTrUoWHG1cWhTqaAMLob2m2nESWuC7yGrREz019Ztqg==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.62.4': + resolution: {integrity: sha512-81wiiX3v7aqy+T+bT61TJ78yJjRquqFFTTbAPt08imfQQzkPIW8t6aJbkTagtCCrXMNc9D66+geqlK7ydLPNqA==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.62.4': + resolution: {integrity: sha512-9kmDIvNZqdoHOBZgNtpTBeLWYO/LVipM3H/j62P8848/l/VPEQL6N3uxU9pvP1oZAsXyC2MEnFP3ovRjo7WYNQ==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.62.4': + resolution: {integrity: sha512-CcnXHWnXg69g+DX5VWL3FHts3qMRN2uVEHX+BZvGLdd07/gXkn3ePjYtO1LDJvxkGKVHMclKBRa1QUTH+6toYQ==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.62.4': + resolution: {integrity: sha512-iFOibiHnTRuhrWLlRsOQFdZJJIa7S8OwkneJr4ocALP16u5yk6lWLINFwhHaEqBFMsKDUZofLkGos7+CPzGB3g==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loong64-gnu@4.62.4': + resolution: {integrity: sha512-XnWYMI7euHlb5a871xPja+Gm7DRCFU+FGRrtS2sMq9N8FvqtpagUy6gD4YOemC5MRk9xbh8+jYMEJbigFQwsgA==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-loong64-musl@4.62.4': + resolution: {integrity: sha512-qGDAlO0U8xedCcsdRm9oaoQY8DAx/QT7uIxJWhCdx0ceIWX783UC9QSYkdpzAe29wNiVfp24+bZdQmn49o45SQ==} + cpu: [loong64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-ppc64-gnu@4.62.4': + resolution: {integrity: sha512-ru4H6ezD7ysA5EiEK6qkkaEb4modH8CTej6kUy/gQi20u3kB3G7Zn8snXXkeJSCOFKG/rbPPtM/+9Wgas1961w==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-ppc64-musl@4.62.4': + resolution: {integrity: sha512-2W4MO5WQVJnbJaZdvDb9rhBDuFU1nKIepPFpJUBsTh2k1YY2g+ODViaWuyOAjQ5cOP7NvrvLzt3wvHOoiAvc7w==} + cpu: [ppc64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-riscv64-gnu@4.62.4': + resolution: {integrity: sha512-+fxjfuoAmVMCYV5QyjoIpu0cp5DOiOTeqYFk1AVaxGr+/ravWLX89XfQmptsoWcaVy/TGf2hexzbUOrCQIL1CQ==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-musl@4.62.4': + resolution: {integrity: sha512-jTn8JfHGL4djjFxPuM06LmNUJDsst2jeVlsd9OmIH6zc5sC9K6rIuO4YajXatLUpBmBKl6b35ro1QZocLi+tcA==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-s390x-gnu@4.62.4': + resolution: {integrity: sha512-oCJCJL4pXsoDcP2QZ+JVlPTIRc6266zsIaeJJsWImmF7HO0W8nb6HuSgZlMWxJwaPf8ehbSw8yo0EUw925hKsA==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.62.4': + resolution: {integrity: sha512-W69hukhZ3KKNRCaMIEzKvcFye42hh0FE1+YoYaf5+Ikacuftoco6yO/xouz0hc5d5W/s3yBro5jRiuEE/Q5vUw==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-musl@4.62.4': + resolution: {integrity: sha512-qiXbGG2jkjXhzXpsFZSR2Xpb8DN/UaxYsbb/STbuR/6fpaDgRmmaq1B/LmtF2wQFOFOSsK2jdE0RZ3a0zHn4QA==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-openbsd-x64@4.62.4': + resolution: {integrity: sha512-nWeM//hxv8mIo6jD7Hu4o48DVmV9pbV6gsKaWU+4NFyqHoPKwrkRiZGLKUhOBk8qNmDmpwFtPKg80Bo/Tn4xiQ==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.62.4': + resolution: {integrity: sha512-s62SQ/vgsRSvMwDkOEfTqfgASF0f26ZNaQuTA6Aok5lrikf89yI2W0gFHvZb2Jpgc6N8JnOKZgCK2iciO3CsxQ==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.62.4': + resolution: {integrity: sha512-J6wGf8TVGbXJq+HH+ttTvrcfNKPbuZecV6KT1B8I18BC5IURUh5kl4Yl5OEP5eFIUoI5BWxCsyYMhFsDx8kekw==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.62.4': + resolution: {integrity: sha512-zmfrQd/0wu6oJs8Vq8KwY/YtsKSsLtKe/HwAP4Wqy8LhWjeT55fHRAkOhYQ12wI3ayS4Tt12d5CDRD7N96SAYQ==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.62.4': + resolution: {integrity: sha512-qPzHqdj9rfUD+w79dtE07zi/kFwKyCJqplp5K5ygeLTp7jLpAoc16OAH39HSmRC9UpozaecsleI8uAdEj6v2yw==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.62.4': + resolution: {integrity: sha512-zD6NdeWEByGE9QF9vCrlJ5YQB4oq9q91kPZS37Jwj5hOkvR1lTBSpsKhKDw4IJtbQ35LsTS1HD9DZYGKIshU1Q==} + cpu: [x64] + os: [win32] + + '@shikijs/core@2.5.0': + resolution: {integrity: sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==} + + '@shikijs/engine-javascript@2.5.0': + resolution: {integrity: sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w==} + + '@shikijs/engine-oniguruma@2.5.0': + resolution: {integrity: sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw==} + + '@shikijs/langs@2.5.0': + resolution: {integrity: sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w==} + + '@shikijs/themes@2.5.0': + resolution: {integrity: sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw==} + + '@shikijs/transformers@2.5.0': + resolution: {integrity: sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg==} + + '@shikijs/types@2.5.0': + resolution: {integrity: sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw==} + + '@shikijs/vscode-textmate@10.0.2': + resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + '@sindresorhus/base62@1.0.0': resolution: {integrity: sha512-TeheYy0ILzBEI/CO55CP6zJCSdSWeRtGnHy8U8dWSUH4I68iqTsy7HkMktR4xakThc9jotkPQUXT4ITdbV7cHA==} engines: {node: '>=18'} @@ -581,9 +1004,18 @@ packages: '@types/katex@0.16.8': resolution: {integrity: sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg==} + '@types/linkify-it@5.0.0': + resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} + + '@types/markdown-it@14.1.2': + resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} + '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + '@types/mdurl@2.0.0': + resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} @@ -596,65 +1028,78 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - '@typescript-eslint/eslint-plugin@8.66.0': - resolution: {integrity: sha512-p088eaGrzYz1s+7cov0aMOCkNGTJlVxF4jgubf28c8L0Cv9Rloj8YBHnv4hXLq6IIEE1AsjNWavO+k+8kP2Y0A==} + '@types/web-bluetooth@0.0.21': + resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} + + '@typescript-eslint/eslint-plugin@8.67.0': + resolution: {integrity: sha512-Un7Heoyj65NREbKAyIrFxeM143NZpExWmy1Nep4DLeQOeLlTeumPjoNKnBrU5D5moWXbPJgRa5Uwcdu0faVNGQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.66.0 + '@typescript-eslint/parser': ^8.67.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.66.0': - resolution: {integrity: sha512-X6ypGChaWYk6PBtUg2BwuTZEFFcHJAtGTVJ9/lCTOufhZ4i9fNolQNnktq+kkMCwMj7V8Svsq7+TxSDslmhE0g==} + '@typescript-eslint/parser@8.67.0': + resolution: {integrity: sha512-fUBfTuuEulWqX6V8+O3PtScV01tzYYRUDTAirHFKoRAt7nOzoGiPt0M/bB47wWNy0coOOcgEwAMUtBpykMxl6w==} 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.66.0': - resolution: {integrity: sha512-7MthGPTt4BP69lSryqpqq8HQqxuzynssckL/jyDyk3+TNMQ3y2jFWkptCrktWvBrP+EH787Nl5N5Qpw7WZg+5g==} + '@typescript-eslint/project-service@8.67.0': + resolution: {integrity: sha512-cvE8c7ulYeXN9fYuszhCeCsbzyVEXuhrRCybnBre7TUmqb5nRmBfQAwCj0O3WJFDeyAZt4VYv51vMCC9LHSdYw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/scope-manager@8.66.0': - resolution: {integrity: sha512-8TGcH25j9zqJ/IULB/ppyhRvxA8QYfFEZ7nfbg6/BN9spDgb8fPWQXlE5l8TWBL50EtUx007uZ1o9VOwrq2/9g==} + '@typescript-eslint/scope-manager@8.67.0': + resolution: {integrity: sha512-EgvsleTwS4E+WzzSvem8fAUubLwatMNF1B5hHSLQxcvs7q2dtRhGyujHwLJSYlG41niJ7GP24Aha2+0mb1b2kg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.66.0': - resolution: {integrity: sha512-9D5gLYZG4rOjcoag8MQ/fWI8WqA9wcPDyOGyWtWFhvM1lHRbliqUSPIY5J3zqCU1tvSwzXxnnjhQhz5Ne7mJ4g==} + '@typescript-eslint/tsconfig-utils@8.67.0': + resolution: {integrity: sha512-vV+LUSv5njUWsknE71fqKTlXUva+R76SaeORd6Zojcunk/6DvKFXONU3BrAs2H49mbygUXt6gbYunzwqNwlhdg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.66.0': - resolution: {integrity: sha512-LG2dWfjZQQp0ADtAu/EWJVayefGL2UEZ3CDeI44D9v3rXB/WYUqE/jpO28KrEKul5AySrmI+Zh1v6v+xW2U9+g==} + '@typescript-eslint/type-utils@8.67.0': + resolution: {integrity: sha512-aVWDXbRmdXO9siTfX4ditQI1T9+zVcNazT48EJCD0v40/9RIFoUgZ05CmGEq9H2gixRpjUn/iplwvlcvutJW/Q==} 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.66.0': - resolution: {integrity: sha512-H6gcYaSDOyvL3AD/jHUtUFo2jqGgn/F6nuyuZSu0QTesxL+cP4dQoIMrODRofuJC09g64+WgZ6tE19Y1N2YIFQ==} + '@typescript-eslint/types@8.67.0': + resolution: {integrity: sha512-sBtgslww8nsMYUjhdPBiSyUqSzT8uR6g93A2QXnQC8+cGdjz0CyaOdqHDRJb1AtORbZCNUJBBeFA/tNR2uQmww==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.66.0': - resolution: {integrity: sha512-8/x4INiiQb10jGgXYD7116/zQ+OL84ZIFn0za68wwFHCanT/VLbBEroWht8RV8fn0/ZCAoazHLQgwUC0UQcDfg==} + '@typescript-eslint/typescript-estree@8.67.0': + resolution: {integrity: sha512-EKQBCE9yNlRJYm7jdTW5AhDacDUmSwQb0FAJAmK2EKYrNXIsa2vxcSZx6PvJ/dEdI6lS+Y9W+EXckLj0iPFGcw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.66.0': - resolution: {integrity: sha512-jasearZPolBw5NJNYGMwxzHMF83niVWmMU1VdHzG1CyfI2VS7f7nZltnKtHcg20hW+7Uo5GfK4MeDPoU3qI8EA==} + '@typescript-eslint/utils@8.67.0': + resolution: {integrity: sha512-U9D1FdwEWBwok3hxxSdhclMb0twvt9QnjIQ0VfQ1AiX2epnpSgv2ubVDsayOFyY8K6FX+AQ7E0FKWVG3iKsj1A==} 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.66.0': - resolution: {integrity: sha512-dkKR8q+lKciskj1Y3vthHktl+3cMLWGyVUP23bRiPZ5O9BRT++4EqDDV+TVeIKBL1VXVEqrJlz8MYbcnvJcAlg==} + '@typescript-eslint/visitor-keys@8.67.0': + resolution: {integrity: sha512-fkv8dHRDqfGtTHuJeebdrQ7cX6Ad4WAS00rgHh9UGvMycF1mjBfsxry1XsLIFhWZ6Judlh6UdzK+TYlbpCXgnA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ungap/structured-clone@1.3.3': + resolution: {integrity: sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==} + + '@vitejs/plugin-vue@5.2.4': + resolution: {integrity: sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 + vue: ^3.2.25 + '@vitest/eslint-plugin@1.6.27': resolution: {integrity: sha512-X1RCAfwbatG4GFbJ/1PIHP9MSZMt0JJThqbYID+vS4L783k6QGlLPe421wQE8dHXuGCcenVLsydiM4qzsYWxhg==} engines: {node: '>=18'} @@ -712,143 +1157,214 @@ packages: '@vue/compiler-ssr@3.5.41': resolution: {integrity: sha512-U3v5OejKEGqOI0Wy0+Sz7hGuIFZHA4LSXzrNM3IMIeDyJEBBfTpX26n3SDgToRpP2bLc9FfI2j/kSgcJ8Emq5A==} + '@vue/devtools-api@7.7.10': + resolution: {integrity: sha512-KxtEpUOOpFz/qOGRrAwA36QF7DqIA+FXgCYit9mk9wjbaZt0sXOFz81ElOZtKA4HbWHUdwNjZHBFsFFyp5BZiA==} + + '@vue/devtools-kit@7.7.10': + resolution: {integrity: sha512-3WNi2Kq4tbpVbmhml7RiphmAt0279oh3fKNeWMQIrltfX8Q91b4i5PL8DtyNKdwmcsGrV4fg+erwWOmD05CLIw==} + + '@vue/devtools-shared@7.7.10': + resolution: {integrity: sha512-wOPslzB8vTvpxwdaOcR2qAbwmuSP0L+rhpoC6Cf56V3Jip+HWb7PQQXOUPgBNQARpXsbQX/+mvi8kKucmBGRwQ==} + + '@vue/reactivity@3.5.41': + resolution: {integrity: sha512-rznsqKM0np0x18EjzF8x88MpEhdNsffbvFbckLL5+oUKz1BxAImEmO7J1ArRYSyo6aQaVoBDp7jEkT91OOxydA==} + + '@vue/runtime-core@3.5.41': + resolution: {integrity: sha512-Vcry58hiAKwGen9Z1jUZE0feFsNArPCMOImYI8el48A9Idf6DuQYD0U05zZIF2Iad1hGhPSvcbBbAOhNr55fhg==} + + '@vue/runtime-dom@3.5.41': + resolution: {integrity: sha512-3vVBahVBS9+U6cmXBLyb8nE6/yYo4J/CGI9eVFs3KiMc0YHuudwKyShTD65jtJy/L9PUUxNAFu4cj4LiJ0UFbw==} + + '@vue/server-renderer@3.5.41': + resolution: {integrity: sha512-n6hx/pNFfbD6SuyeuMVkvqox8bwf/ET9JlA/kAz/imw8sw++wkqKe2mHX5KutjPpbKE4Z56yTHszoOjGMI9igQ==} + '@vue/shared@3.5.41': resolution: {integrity: sha512-IOnwSCma8j+9xJT6b8H0dEYidC80NsYmNMlZxRsukYcSoGaDBohog5hDxzeUXdFeGWFA++vWvxqOmrr96VlqMA==} - '@yuku-codegen/binding-android-arm64@0.8.4': - resolution: {integrity: sha512-rsYkGl2kOkDRsh1mxriYnk1qBS78vjlBJ3+T2XwtwKwqOliy2n+2Ae0EDxJ/uX1DZLm3KkBZarGO5isEnmHchA==} + '@vueuse/core@12.8.2': + resolution: {integrity: sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==} + + '@vueuse/integrations@12.8.2': + resolution: {integrity: sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g==} + peerDependencies: + async-validator: ^4 + axios: ^1 + change-case: ^5 + drauu: ^0.4 + focus-trap: ^7 + fuse.js: ^7 + idb-keyval: ^6 + jwt-decode: ^4 + nprogress: ^0.2 + qrcode: ^1.5 + sortablejs: ^1 + universal-cookie: ^7 + peerDependenciesMeta: + async-validator: + optional: true + axios: + optional: true + change-case: + optional: true + drauu: + optional: true + focus-trap: + optional: true + fuse.js: + optional: true + idb-keyval: + optional: true + jwt-decode: + optional: true + nprogress: + optional: true + qrcode: + optional: true + sortablejs: + optional: true + universal-cookie: + optional: true + + '@vueuse/metadata@12.8.2': + resolution: {integrity: sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==} + + '@vueuse/shared@12.8.2': + resolution: {integrity: sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==} + + '@yuku-codegen/binding-android-arm64@0.8.5': + resolution: {integrity: sha512-+oEBxK35kdbskhxozjZhI8N6qrMOfphpIkXnqBj6N2DC08rdkg10MUMRNKZLBNU6uNyoYiLcLyCE6aFV2sfMKw==} cpu: [arm64] os: [android] - '@yuku-codegen/binding-darwin-arm64@0.8.4': - resolution: {integrity: sha512-tNLKzPF3FYmEcHSYvWp/LEpjHHAtDR13hwo6/gdCkYMi9x59CWn2obczKzWNe7kDor4/1AMZuJDEVRpFkTSefw==} + '@yuku-codegen/binding-darwin-arm64@0.8.5': + resolution: {integrity: sha512-+U2LBCJbQH24dFLAM0kmij/fOVHHWqWTMuaCavRKDE9rBz/a46tNsuYN87p+nFt5V4MECM7t5RSLCNkYzBmE+Q==} cpu: [arm64] os: [darwin] - '@yuku-codegen/binding-darwin-x64@0.8.4': - resolution: {integrity: sha512-tK7LWzXNb5JbZpnoCNHB0nEhPFss/LwwehM6m/f0oYDan+iZgFZXzdoy80JdE7dVxjTZDIhUNPx8X8xbIdaoxA==} + '@yuku-codegen/binding-darwin-x64@0.8.5': + resolution: {integrity: sha512-STctF8lSW+XhRvPupHktesqV0pk61SEZOwZTuDTZD/nPZsBsOPnD+X1hODioeoXMHn7bTkQKefOn4y6NyBOnoQ==} cpu: [x64] os: [darwin] - '@yuku-codegen/binding-freebsd-x64@0.8.4': - resolution: {integrity: sha512-5MUV4d7g2p5Hd8GiXW6ynTRgYjm4Dw4eM2gaWRZ4crkGetzNx+HlPxcEfGtVNPqH5Qaa4Z2REtzdsdgvaE6/Ng==} + '@yuku-codegen/binding-freebsd-x64@0.8.5': + resolution: {integrity: sha512-cQRu/g1LjMnso08GhiFQHrzLdczNiJ1IikpStJRC1RnKHGdZRGAWrfuJx1/j0Nwow0z9PrBf/rb3x85MRGSAQQ==} cpu: [x64] os: [freebsd] - '@yuku-codegen/binding-linux-arm-gnu@0.8.4': - resolution: {integrity: sha512-g6LnHrR0Rfqq5cXs7olwR2+LlVDc876pw7Hh7YXbukVSiBxQkaxqsEO/trO25z2g99zWzgXwoYvQZ1TnwA2wEw==} + '@yuku-codegen/binding-linux-arm-gnu@0.8.5': + resolution: {integrity: sha512-069wu3iLZzw0vMC3p4SECvA0MVyglOw5jTeKL99yfC1k89qA6PvKJDn3Ty6Z/2D9Ci0lAIjRDdicNqVpNCFyfg==} cpu: [arm] os: [linux] libc: [glibc] - '@yuku-codegen/binding-linux-arm-musl@0.8.4': - resolution: {integrity: sha512-7XAPHrROPEFuJWXEGZeLZQN4xR8ENQ65+HSCtCHjSzCwGgnX53GUjM9ExVcHopV0a5g4vu57v2wwtyWIM5iNOQ==} + '@yuku-codegen/binding-linux-arm-musl@0.8.5': + resolution: {integrity: sha512-g7GhzWR1EmK4BLZfVXJGzhpzNqgF8WhblU/oFZBvR+d747TmBslShqzdJAmaS1gJ1ydmQfyO94Zyias8pLUe5Q==} cpu: [arm] os: [linux] libc: [musl] - '@yuku-codegen/binding-linux-arm64-gnu@0.8.4': - resolution: {integrity: sha512-fnBm7NLuuwFXy7F1vRIuyOc+RW9ADUjuCKVGY87Dj8jtr9XgESNrwb+B9VLSFY7nZ0rCdK/Sm1fBqJpI7eLdKQ==} + '@yuku-codegen/binding-linux-arm64-gnu@0.8.5': + resolution: {integrity: sha512-moIvcAsAmgehTqvj3aBo97mAzx+4VGZudXsWvZTRfFs4qgg+iSdzrV8wMWURHslQkFDXKvt1DzMxGNZZxjz5yQ==} cpu: [arm64] os: [linux] libc: [glibc] - '@yuku-codegen/binding-linux-arm64-musl@0.8.4': - resolution: {integrity: sha512-6vTw4ZHO9nm4SUkw36uG+UE6/qifZ0E8HIef7Mx/U/c2Zxu3JLBfXtU7U/NN2GMkDmcJkgwjXfpQoYw4Ch5Y1w==} + '@yuku-codegen/binding-linux-arm64-musl@0.8.5': + resolution: {integrity: sha512-w6sQZ5nlSYFPsz9FQ2a9oWxY/1cLi7C73qydLCqxYnB0EuDsrwZrKHw2FF/DXJr6qH7x2x+SmSFoVtaadLkhhg==} cpu: [arm64] os: [linux] libc: [musl] - '@yuku-codegen/binding-linux-x64-gnu@0.8.4': - resolution: {integrity: sha512-+vuC3V3Lw+DB4oJgHV9pVDfQZlsZJnxmbdods7HzxgEALU3P5+czwdAcw3wfh7Ebabt0Ny8eLUb1k9RV5OB/+w==} + '@yuku-codegen/binding-linux-x64-gnu@0.8.5': + resolution: {integrity: sha512-R3bbB3RYuNu/aQcgCrwNRhKo/5zTLNyx+rklCzTrpESAbnZAwAU8cZqAe0CSXFDGQAPooWZDnmIGsq/L5aDUBQ==} cpu: [x64] os: [linux] libc: [glibc] - '@yuku-codegen/binding-linux-x64-musl@0.8.4': - resolution: {integrity: sha512-QH60PE4eZecmgNGa1/T1cKPhrfxt6ANtu4lrQ1FZ50F9b0GS9WjGmIjrfdSUeQa+f2Iqk3oEFSJdgVHBg1KPNg==} + '@yuku-codegen/binding-linux-x64-musl@0.8.5': + resolution: {integrity: sha512-E3tDaVRj9azS0GTzF2VpwkLLH1iqoadp2U1C2KDbUAtt1F4q5BBYzUv9/yI/4lmYzkrUSBG4e343tUwevm8u1w==} cpu: [x64] os: [linux] libc: [musl] - '@yuku-codegen/binding-win32-arm64@0.8.4': - resolution: {integrity: sha512-6r68c0nKZPIBRXZIBiD7zjlEukBR+xRxpTOVj4n1Fsjcdh4YbbJfjFfmIzdbo9jXR1xL+dPueDVdsRGOUH5MoQ==} + '@yuku-codegen/binding-win32-arm64@0.8.5': + resolution: {integrity: sha512-zqy0Gu6StX8vN+J7i7J6HUjy6p+B+w7a3lLETlbmJLgphQTq3lKEt5zPAsNs/I5TU54xa3GaLobMM7EUqJvxZA==} cpu: [arm64] os: [win32] - '@yuku-codegen/binding-win32-x64@0.8.4': - resolution: {integrity: sha512-i+BW77LPjNqe7Apq50J3OeEaVfga3G+eT2bKjb6bj4yO99fil/jnKb4ZDH4JLvby/Q7hRa6VicL2EZ7iS+ifzA==} + '@yuku-codegen/binding-win32-x64@0.8.5': + resolution: {integrity: sha512-2ASUq/tP4sFD6xlB7Nuz/v3ofhPlt122r6RNFjPAnQdxZUqerOCX4rTJkyYqYcnyiSVazyuSVWKOiJItyJGX1w==} cpu: [x64] os: [win32] - '@yuku-parser/binding-android-arm64@0.8.4': - resolution: {integrity: sha512-+HIMmv08Zrh9ugIAEMnKBMMePOl7CDxrjc8Vui1+GG2TJHM1yI1+3wo1pnXB6Nj2IiHugDkQw8ycUI6SA2EUkQ==} + '@yuku-parser/binding-android-arm64@0.8.5': + resolution: {integrity: sha512-BJtJvyf/Ma3v57uebPbe7VMUjNwTa3KW0fJn4awBBXyen8aS/i0gUbCDEsjGPY4GvAT41AggcYSep37V5VPENg==} cpu: [arm64] os: [android] - '@yuku-parser/binding-darwin-arm64@0.8.4': - resolution: {integrity: sha512-Elf/B/2m3OsyvxoQnBk8Dtu+9csHkzBNs5Yv9GbHjT3x0kVKNWjFusyZgm41VwxcPDqdpRi8tWxNX7OqXkmf/A==} + '@yuku-parser/binding-darwin-arm64@0.8.5': + resolution: {integrity: sha512-CEzkjuxNjufVmSRlSm1qYGaoRpbp0g03saC8Tz6BesbmBUuP8MSqJa2BSskMbvYkRhKUN4OFCoPJ0XJf7ARTZQ==} cpu: [arm64] os: [darwin] - '@yuku-parser/binding-darwin-x64@0.8.4': - resolution: {integrity: sha512-CjZuMoXnL5XUkVpDqh4WDPwpAw8CwmtHHnTerGkS45So/sNuwkXdyIAEqqIZfaLopi5W/V9NApAT2md9XizjsQ==} + '@yuku-parser/binding-darwin-x64@0.8.5': + resolution: {integrity: sha512-HS7wYfYUi3fTYNrzLNnZUia5DVo/Kf5NRmbh2rNVDKzMUEUfXI7xWdh0OOqIqYI3SsA5AcZOCI357uYb0+2B9Q==} cpu: [x64] os: [darwin] - '@yuku-parser/binding-freebsd-x64@0.8.4': - resolution: {integrity: sha512-ibLKORdz71iI4Vs+fyFgvwQ51P5XcxJIyQLa8cSEWqwptRdo+BTcZHIQEcZnFDPUuvmJ19RRH9CoiJdfhr7pZw==} + '@yuku-parser/binding-freebsd-x64@0.8.5': + resolution: {integrity: sha512-Iq/XcdT3qjV+mxzb6hE4oSlst/+wrJxSsgKu3FkVkV1bxb0UfITfedws/wI356KVr+BM9CeamNkdbchHV4pJlw==} cpu: [x64] os: [freebsd] - '@yuku-parser/binding-linux-arm-gnu@0.8.4': - resolution: {integrity: sha512-Fo3r5fYhGDcFnl+KN+L9PgtiQPS4AIE1n1mG1o5jZ11p7g5yZ/1EjLFmSHAUsoXreun8KjTsFjEL7P1Sb93PZQ==} + '@yuku-parser/binding-linux-arm-gnu@0.8.5': + resolution: {integrity: sha512-vbI/zeUdJEZ8BKUEfOD8ngtPR5/9XdONpRRosw73kOtA1GyipTF1rj75ozLHIVCEybdCB/GSlQ6OjjhuEAKrGA==} cpu: [arm] os: [linux] libc: [glibc] - '@yuku-parser/binding-linux-arm-musl@0.8.4': - resolution: {integrity: sha512-BEB31vUEgXPWf7WkoMPSzzJhpC/wWCBXyysRCCPsw47BJ/OtbQsvJbxX9fFDuSRLy3kbyIV/WbdUTgbQ9COxiw==} + '@yuku-parser/binding-linux-arm-musl@0.8.5': + resolution: {integrity: sha512-3K4kOkOxWbUKoRja+vn7Srn8Nyc66Fr66oFWO+pFA/0KpVtlIGpKY+/KL8QIQdM7swTh+82OVkuFKeFEweVFLg==} cpu: [arm] os: [linux] libc: [musl] - '@yuku-parser/binding-linux-arm64-gnu@0.8.4': - resolution: {integrity: sha512-xGLCRcHn9xVz7JVNyyKtiNJSf503qtUmih9XVSsghgzOmiKUMnHObs69OMMwXN3788tg1jsl11fNjjQlB8idMA==} + '@yuku-parser/binding-linux-arm64-gnu@0.8.5': + resolution: {integrity: sha512-aj2pI9eT3ZAj8mWrC+utYUJwyxSd6ozthHjJfGtcY3MnZuQ4qbO7wm15BMqDgCSrg7az3tnONy1ftVQTWV9inA==} cpu: [arm64] os: [linux] libc: [glibc] - '@yuku-parser/binding-linux-arm64-musl@0.8.4': - resolution: {integrity: sha512-3kNRi8NJT2q6FQRVCUFHIQ99+kXdi8cVJEEUi6+xtFqpMgNrZNnbgAj28ILsDC7zmclaU+v47eUCeJoKLSCbww==} + '@yuku-parser/binding-linux-arm64-musl@0.8.5': + resolution: {integrity: sha512-+T2buVRNtY0QwhUeo8t47HmEpgh7tXMx8htMEdT7O0HHv3eFitwvyuVSdYNOpxo52Sc/0wJ6F4UbZni75aD4Pg==} cpu: [arm64] os: [linux] libc: [musl] - '@yuku-parser/binding-linux-x64-gnu@0.8.4': - resolution: {integrity: sha512-isi62oMy94Z3OXwGs2l2rkqRiRyqLmfHeTRHpA/uWZbsNhnm7IdVvkF7e7wHNKAtd5jwGzOqYSroxKv2fOm7Cw==} + '@yuku-parser/binding-linux-x64-gnu@0.8.5': + resolution: {integrity: sha512-uIoy1uplNUqjq3GW6z+Ea8UCQkLKRPlM4FvqAhYMDwBazkVpE1mNvMqaQqf57ZP8mGTeOf4OF6CuUlenR2ttqg==} cpu: [x64] os: [linux] libc: [glibc] - '@yuku-parser/binding-linux-x64-musl@0.8.4': - resolution: {integrity: sha512-9RsEw2xYHqU/pjSRBTOupWN3sF8uz9stjJdARfz6o0llvF+yfrj5QHmTiocGGBeAI80fvKmDtr2RIQClUzAPcA==} + '@yuku-parser/binding-linux-x64-musl@0.8.5': + resolution: {integrity: sha512-27doVJjvYevPWcakDCpfgZfDAlyhfyY3BwHf5TKtponCrSYBMzrBpD8ChYB1M7B6YOm0M5U9kEA0k1sB6CD4Ow==} cpu: [x64] os: [linux] libc: [musl] - '@yuku-parser/binding-win32-arm64@0.8.4': - resolution: {integrity: sha512-VEZHo9rEGOBKR20sA3vCO00aQvwWND5aLu7YxeX+YupMZJh9hd1f17AbClJN37Q2iL1PCHht+wDTOKX6tZYqXg==} + '@yuku-parser/binding-win32-arm64@0.8.5': + resolution: {integrity: sha512-UIlSKhOLWZUQyDVQzYWAkHQGWnwNw5IxR/YYT2UCy64HLMQGGIxhb3qa/7Rf6yki50FrLx1O9PWgBKXCq7Zxxg==} cpu: [arm64] os: [win32] - '@yuku-parser/binding-win32-x64@0.8.4': - resolution: {integrity: sha512-PeH3VzN1feGjPtDpVEAqf000fPT+nxtw/696LKp/5Z9RJi/MaXpB636QC+5QtrAPSoEnIkyEe+c+mq2QLZPWBA==} + '@yuku-parser/binding-win32-x64@0.8.5': + resolution: {integrity: sha512-helhS0Pt0TwsW9Z5L3V5o27qrnTrmaUTgSpymVUJYlZJgW6Nagk7nS5P3Ez4b1OZXMwc5y5CR6m1niuzL/yYfQ==} cpu: [x64] os: [win32] - '@yuku-toolchain/types@0.8.4': - resolution: {integrity: sha512-p7JE8flrj7ijZ/qLjHi4UwKqMarMD6zumbKXhrjp2I2iLJOuTYiQyci2U36VlXcUlNyzsY7E/mLnKCHotbzJVw==} + '@yuku-toolchain/types@0.8.5': + resolution: {integrity: sha512-ELNzrhwfi9+VCTaj6QcLCb5MlUK6pmVqPqH8bBmer1FTHvgEITnpwB73L/Wx5KKPPVWAokfeeU9V2rJy/9kMlg==} acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -863,6 +1379,10 @@ packages: ajv@6.15.0: resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} + algoliasearch@5.56.0: + resolution: {integrity: sha512-PrqppUmhT4ENdas2pH9caE7efUcxy6EcSFhWzosiVuQBzu2tQ5yLTI6jwomT/1cuBnivzGfxiJCqDNN9FRRh+Q==} + engines: {node: '>= 14.0.0'} + ansis@4.3.1: resolution: {integrity: sha512-BJ8/l4R5LRE7hW9WdSuGYrLSHi2ynxeFpDFbH0K/CgNeY/tyhk+vO6TYxXC5r5CpUhNVX310xzPsN/H9lCdfOA==} engines: {node: '>=14'} @@ -884,6 +1404,9 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + birpc@2.9.0: + resolution: {integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==} + boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -917,6 +1440,12 @@ packages: change-case@5.4.4: resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + character-entities@2.0.2: resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} @@ -927,6 +1456,9 @@ packages: citty@0.2.2: resolution: {integrity: sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w==} + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + commander@8.3.0: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} @@ -935,6 +1467,10 @@ packages: resolution: {integrity: sha512-0h+uSNtQGW3D98eQt3jJ8L06Fves8hncB4V/PKdw/Qb8Hnk19VaKuTr55UNRYiSoVa7WwrFls+rh3ux9agmkeQ==} engines: {node: '>= 12.0.0'} + comment-parser@1.4.8: + resolution: {integrity: sha512-rKZTGo4fzKYna8UcL0isTg5wkBNla7bxTypLwZQXjIdi++IdP1OJ41rI5Mti3/jltkPujbu4i9LIARYA+zpotQ==} + engines: {node: '>= 12.0.0'} + confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} @@ -948,6 +1484,10 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + copy-anything@4.0.5: + resolution: {integrity: sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==} + engines: {node: '>=18'} + core-js-compat@3.50.0: resolution: {integrity: sha512-XGpFGbMLHwSt74YLTKho7Ib242qi6O8MSX+sRokV4oz7iKXvQWGYZthjIhjRGMxjzVkAubBO512dKGYcefmX3Q==} engines: {node: '>=6.4.0'} @@ -961,6 +1501,9 @@ packages: engines: {node: '>=4'} hasBin: true + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + dayjs@1.11.21: resolution: {integrity: sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==} @@ -990,10 +1533,6 @@ packages: resolution: {integrity: sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A==} engines: {node: '>=12.20'} - detect-libc@2.1.2: - resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} - engines: {node: '>=8'} - devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} @@ -1010,8 +1549,11 @@ packages: oxc-resolver: optional: true - electron-to-chromium@1.5.403: - resolution: {integrity: sha512-MQsYmdaLzvaCX5j+ZZBr5Fm6uCCnPQcRtlvmvRlWqrXy+BH2O4ffXIAScF+JQznQWB9brWp4lSD9Z4yNmaf2BA==} + electron-to-chromium@1.5.405: + resolution: {integrity: sha512-bNglH7lPH5l+yHOes7Zr4VqxhOy4BQ9ZBUX4VdoFgxMpzJk7W1ZoO3Vgd9Pxa9PyjQ76sfm2aKH/nzEcCNRlew==} + + emoji-regex-xs@1.0.0: + resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} empathic@2.0.1: resolution: {integrity: sha512-YGRs8knHhKHVShLkFET/rWAU8kmHbOV5LwN938RHI0pljAJ1Gf6SzXsSmRaEzcXTtOOmVqJ5+WtQPL5uigY50Q==} @@ -1037,6 +1579,11 @@ packages: es-module-lexer@2.3.1: resolution: {integrity: sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==} + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + esbuild@0.28.2: resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==} engines: {node: '>=18'} @@ -1314,10 +1861,17 @@ packages: flatted@3.4.4: resolution: {integrity: sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==} + focus-trap@7.8.0: + resolution: {integrity: sha512-/yNdlIkpWbM0ptxno3ONTuf+2g318kh2ez3KSeZN5dZ8YC6AAmgeWz+GasYYiBJPFaYcSAPeu4GfhUaChzIJXA==} + format@0.2.2: resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} engines: {node: '>=0.4.x'} + fs-extra@11.4.0: + resolution: {integrity: sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==} + engines: {node: '>=14.14'} + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -1327,8 +1881,8 @@ packages: resolution: {integrity: sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA==} engines: {node: '>=18'} - get-tsconfig@4.14.0: - resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} + get-tsconfig@4.14.1: + resolution: {integrity: sha512-Dz/6HxkrxgNehhxLVeyv8sad9UzF2xBVeaKBQNDfJ5XiSXmp2gTR0eO0RWiT2NCKS5aGP9jjkOMggTN90qU50A==} get-tsconfig@5.0.0-beta.5: resolution: {integrity: sha512-/6gFNr0N04nob252sTQxyFLi3eKFRqIg1I87YcqAMT1i6SQrSF6KujUEQrtrjMV0H/eejTCltLdDSTEMzHbnsQ==} @@ -1349,8 +1903,8 @@ packages: resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} engines: {node: '>=18'} - globals@17.9.0: - resolution: {integrity: sha512-m/MvAW61QVU5VDNF1Vj8axt016h8w7L5TU1e9zlab7XIttAT2YAlCwl75K1fOqvMM9apmD7lbCIRhpfkhmxhCg==} + globals@17.10.0: + resolution: {integrity: sha512-V0kztuWST2k8A/VbxAY8+L+7+Rgo3fyA24IHRLrZp7HOzJjV0gHSaZUjK9lpP/IrBSNite2tZ1prhRkinRu1CA==} engines: {node: '>=18'} globrex@0.1.2: @@ -1359,12 +1913,24 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + hast-util-to-html@9.0.5: + resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + hookable@6.1.1: resolution: {integrity: sha512-U9LYDy1CwhMCnprUfeAZWZGByVbhd54hwepegYTK7Pi5NvqEj63ifz5z+xukznehT7i6NIZRu89Ay1AZmRsLEQ==} html-entities@2.6.0: resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==} + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + identifier-regex@1.1.0: resolution: {integrity: sha512-SLX4H/vtcYlYnL7XqnuJKHU7Z8517TgsW9nmQiGOgMCjQ8V/deLYu6bEmbGoXe7WMMhc9+EUGyFFneHja8KabA==} engines: {node: '>=18'} @@ -1405,6 +1971,10 @@ packages: resolution: {integrity: sha512-NhOds0mDx9lJu+1lBRO0xbwFo5nobA7GCk/0e5xjr6+6XugX985+0OyGX35BNrTkPAsdLcIKg02HUQJOK8D8kw==} engines: {node: '>=18'} + is-what@5.5.0: + resolution: {integrity: sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==} + engines: {node: '>=18'} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -1442,6 +2012,9 @@ packages: resolution: {integrity: sha512-hYTGkHGNRZnXOFZ1urhINADoqDrGfpy53cjw+dxk84QE0pUDujQzeUeamNs6Mz44/TKD49z2x6/GVSu4ZrtA+Q==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} + jsonfile@6.2.1: + resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==} + katex@0.16.47: resolution: {integrity: sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg==} hasBin: true @@ -1453,80 +2026,6 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - lightningcss-android-arm64@1.33.0: - resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [android] - - lightningcss-darwin-arm64@1.33.0: - resolution: {integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [darwin] - - lightningcss-darwin-x64@1.33.0: - resolution: {integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [darwin] - - lightningcss-freebsd-x64@1.33.0: - resolution: {integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [freebsd] - - lightningcss-linux-arm-gnueabihf@1.33.0: - resolution: {integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==} - engines: {node: '>= 12.0.0'} - cpu: [arm] - os: [linux] - - lightningcss-linux-arm64-gnu@1.33.0: - resolution: {integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [linux] - libc: [glibc] - - lightningcss-linux-arm64-musl@1.33.0: - resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [linux] - libc: [musl] - - lightningcss-linux-x64-gnu@1.33.0: - resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [linux] - libc: [glibc] - - lightningcss-linux-x64-musl@1.33.0: - resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [linux] - libc: [musl] - - lightningcss-win32-arm64-msvc@1.33.0: - resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [win32] - - lightningcss-win32-x64-msvc@1.33.0: - resolution: {integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [win32] - - lightningcss@1.33.0: - resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==} - engines: {node: '>= 12.0.0'} - lint-staged@17.3.0: resolution: {integrity: sha512-woZS3vNe3UKqBaLPvbLOtKRY4tLANpWQhom12MGWqC8Mh1lCOO+WgSwmX2amjJAqTY9BkXYW87fCUH5H9Ph6xw==} engines: {node: '>=22.22.1'} @@ -1550,9 +2049,15 @@ packages: resolution: {integrity: sha512-ayF7iT+44LXdxJLTrTd3TLQpFDDvPCBxXxbv+pMUSuHA5Q8zyAfwkRP6aHHwNVFBUFWtxAHqwNJxF8vMZLAbVg==} engines: {node: '>=18'} + mark.js@8.11.1: + resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} + markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + md5-typescript@1.0.5: + resolution: {integrity: sha512-ovAc4EtiNt2dY8JPhPr/wkC9h4U5k/nuClNVcG0Ga3V1rMlYpAY24ZaaymFXJlz+ccJ6UMPo3FSaVKe7czBsXw==} + mdast-util-find-and-replace@3.0.2: resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} @@ -1586,6 +2091,9 @@ packages: mdast-util-phrasing@4.1.0: resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + mdast-util-to-hast@13.2.1: + resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} + mdast-util-to-markdown@2.1.2: resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} @@ -1689,6 +2197,12 @@ packages: resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==} engines: {node: 18 || 20 || >=22} + minisearch@7.2.0: + resolution: {integrity: sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==} + + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + mlly@1.8.2: resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} @@ -1724,6 +2238,9 @@ packages: resolution: {integrity: sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==} engines: {node: '>=12.20.0'} + oniguruma-to-es@3.1.1: + resolution: {integrity: sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==} + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -1768,6 +2285,9 @@ packages: pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + perfect-debounce@1.0.0: + resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -1796,10 +2316,21 @@ packages: resolution: {integrity: sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==} engines: {node: ^10 || ^12 || >=14} + preact@10.29.8: + resolution: {integrity: sha512-ej2aVZ+vZ8WO7tvlQWRM9N63A0KzF9q4mWJfDUHgYaIofWY9hu74QdnQrjoPMmZi2/nZ5gN0bJCQF49xQqx09Q==} + peerDependencies: + preact-render-to-string: '>=5' + peerDependenciesMeta: + preact-render-to-string: + optional: true + prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} + property-information@7.2.0: + resolution: {integrity: sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -1818,6 +2349,15 @@ packages: resolution: {integrity: sha512-J8rn6v4DBb2nnFqkqwy6/NnTYMcgLA+sLr0iIO41qpv0n+ngb7ksag2tMRl0inb1bbO/esUwzW1vbJi7K0sI0g==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + regex-recursion@6.0.2: + resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} + + regex-utilities@2.3.0: + resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} + + regex@6.1.0: + resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} + regexp-ast-analysis@0.7.1: resolution: {integrity: sha512-sZuz1dYW/ZsfG17WSAG7eS85r5a0dDsvg+7BiiYR5o6lKCAtUrEwdmRmaGF6rwVj3LcmAeYkOWKEPlbPzN3Y3A==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} @@ -1833,6 +2373,9 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + rolldown-plugin-dts@0.27.14: resolution: {integrity: sha512-ZvuDDwoIpRK9RPxDXratCpklFO9QZZWndf/sd0VBFb4LEj0jj07UcHK9OCh7V4XiFz2Z89ziyBC2K6tJiDjrbw==} engines: {node: ^22.18.0 || >=24.11.0} @@ -1857,10 +2400,18 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true + rollup@4.62.4: + resolution: {integrity: sha512-RXOqwaPsBGjMNMa4sQjDjHieHEZDFoj/Rdr46l2MU5DfEs16wHJPC2RPTPHWhNl+M3aI472LLqFkFKut4SblOg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + scslre@0.3.0: resolution: {integrity: sha512-3A6sD0WYP7+QrjbfNA2FN3FsOaGGFoekCVgTyypy53gPxhbkCIjtO6YWgdrfM+n/8sI8JeXZOIxsHjMTNxQ4nQ==} engines: {node: ^14.0.0 || >=16.0.0} + search-insights@2.17.3: + resolution: {integrity: sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==} + semver@7.8.5: resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} engines: {node: '>=10'} @@ -1874,6 +2425,9 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + shiki@2.5.0: + resolution: {integrity: sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ==} + siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} @@ -1888,6 +2442,9 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + spdx-exceptions@2.5.0: resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} @@ -1897,6 +2454,10 @@ packages: spdx-license-ids@3.0.23: resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==} + speakingurl@14.0.1: + resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} + engines: {node: '>=0.10.0'} + stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} @@ -1907,6 +2468,9 @@ packages: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + strip-indent@4.1.1: resolution: {integrity: sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==} engines: {node: '>=12'} @@ -1915,10 +2479,17 @@ packages: resolution: {integrity: sha512-WHkws2ZflZe41zj6AolvvmaTrWds/VuyeYr9iPVv/oQeaIoVxMKaushfFWpOGDT+GuBrM/sVqF8KUCYQlSSTdQ==} engines: {node: '>=18'} + superjson@2.2.6: + resolution: {integrity: sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==} + engines: {node: '>=16'} + synckit@0.11.13: resolution: {integrity: sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==} engines: {node: ^14.18.0 || >=16.0.0} + tabbable@6.5.0: + resolution: {integrity: sha512-wieBHXygIm7OyQOu5hQlkk62/WyCFYGlWg7L6/ZCUZwx0o398Zkn4pVmMyfYhfMG8kGrj/Krt8eIk6UKC6VzwA==} + tapable@2.3.3: resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} engines: {node: '>=6'} @@ -1954,6 +2525,9 @@ packages: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + ts-api-utils@2.5.0: resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} engines: {node: '>=18.12'} @@ -2024,6 +2598,9 @@ packages: unist-util-is@6.0.1: resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + unist-util-remove-position@5.0.0: resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} @@ -2036,8 +2613,12 @@ packages: unist-util-visit@5.1.0: resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} - update-browserslist-db@1.3.0: - resolution: {integrity: sha512-x/M6q3w4Ybp91CNaS4S69UnliqR3BzRpOT6LWbksjth0S/+jhfaPJsWjt/TewpT8j9eLIojUf5jr29WextHroA==} + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + update-browserslist-db@1.3.1: + resolution: {integrity: sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -2056,34 +2637,32 @@ packages: resolution: {integrity: sha512-zj/ob3UsvJGN0whEAKFp53REA5X66hvffVqoCtVQAakJKnKlH+/PcOfMoFwIG/o4rElqLv/ycAFlx8ZlXUorCg==} engines: {node: '>=18.12.0'} - vite@8.2.1: - resolution: {integrity: sha512-EU/eS7BH3XROHh2YnBefjM6DBKA6ZeMZEYQbj7NLWg5wHYlhB8B/Mayd5XsgWq+NFYccDOTemRpdETWR6Ka/lw==} - engines: {node: ^20.19.0 || >=22.12.0} + vfile-message@4.0.3: + resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} + + vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} + + vite@5.4.21: + resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==} + engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: - '@types/node': ^20.19.0 || >=22.12.0 - '@vitejs/devtools': ^0.4.0 - esbuild: ^0.27.0 || ^0.28.0 - jiti: '>=1.21.0' - less: ^4.0.0 - sass: ^1.70.0 - sass-embedded: ^1.70.0 - stylus: '>=0.54.8' - sugarss: ^5.0.0 - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 peerDependenciesMeta: '@types/node': optional: true - '@vitejs/devtools': - optional: true - esbuild: - optional: true - jiti: - optional: true less: optional: true + lightningcss: + optional: true sass: optional: true sass-embedded: @@ -2094,9 +2673,17 @@ packages: optional: true terser: optional: true - tsx: + + vitepress@1.6.4: + resolution: {integrity: sha512-+2ym1/+0VVrbhNyRoFFesVvBvHAVMZMK0rw60E3X/5349M1GuVdKeazuksqopEdvkKwKGs21Q729jX81/bkBJg==} + hasBin: true + peerDependencies: + markdown-it-mathjax3: ^4 + postcss: ^8 + peerDependenciesMeta: + markdown-it-mathjax3: optional: true - yaml: + postcss: optional: true vitest@4.1.10: @@ -2146,6 +2733,14 @@ packages: peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + vue@3.5.41: + resolution: {integrity: sha512-2laE0p+aK+/AOPG/XL/WepOs/GlK755LJ1XECi9kDUrz1FKNw8rb2Xzlw9JS1rqEV55nb0ttsKxVlTCcd+R5cg==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + web-worker@1.5.0: resolution: {integrity: sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==} @@ -2180,21 +2775,133 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - yuku-ast@0.8.4: - resolution: {integrity: sha512-s7EWfWIQkaGmsGnyr/BU0jli9YTN5TvrKIsSmALyRD9elumDQInuhv0BrVObENKVCxr9W3Ikmnx5u02KvfuUmw==} + yuku-ast@0.8.5: + resolution: {integrity: sha512-Ez2CI2BnPK/if0tVI7jB9UUDSNibcChjJDEPEKuWPJNRkbvzSoAQrSqpKtdzl8qTPp4ftVb87f/jx5HIKOieQw==} - yuku-codegen@0.8.4: - resolution: {integrity: sha512-1Rw+NYcmB1xkHAWlsIpbwIv/Fr50idtEbLf7OjDA+90dny6PM4Krz7Fs0TT+w2PBdjaldZpN4ye5wR4Dhlm8vA==} + yuku-codegen@0.8.5: + resolution: {integrity: sha512-+vhgTZyRxyl8eqjvt/6SfTpMW6Jn4+WYd1v7uJqfFFZja21HRsF3s9o3yhexdO3u5EnOm164b3gPv2llQQf6HA==} - yuku-parser@0.8.4: - resolution: {integrity: sha512-sw41wouvT5rUmLIp87hmvm5vtF+MRSI3x6yjq6xqpYmtkQj+Ht6N7xRQ8lMhLv8N7JAzughGj0Rfi0jQRSu9HQ==} + yuku-parser@0.8.5: + resolution: {integrity: sha512-t843J9IdYYpcDaW7o3aDPXpTM72FsvkIDYEHtigyGFCvC3EhiIaSGM5WVNZl3lxTv1Dfis6IW3S/yBsBIaCiWw==} zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} snapshots: - '@antfu/eslint-config@9.3.0(@typescript-eslint/typescript-estree@8.66.0(typescript@6.0.3))(@typescript-eslint/utils@8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(@vue/compiler-sfc@3.5.41)(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3)(vitest@4.1.10(@types/node@26.2.0)(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))': + '@algolia/abtesting@1.22.0': + dependencies: + '@algolia/client-common': 5.56.0 + '@algolia/requester-browser-xhr': 5.56.0 + '@algolia/requester-fetch': 5.56.0 + '@algolia/requester-node-http': 5.56.0 + + '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.56.0)(algoliasearch@5.56.0)(search-insights@2.17.3)': + dependencies: + '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.56.0)(algoliasearch@5.56.0)(search-insights@2.17.3) + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.56.0)(algoliasearch@5.56.0) + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + - search-insights + + '@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.56.0)(algoliasearch@5.56.0)(search-insights@2.17.3)': + dependencies: + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.56.0)(algoliasearch@5.56.0) + search-insights: 2.17.3 + transitivePeerDependencies: + - '@algolia/client-search' + - algoliasearch + + '@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.56.0)(algoliasearch@5.56.0)': + dependencies: + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.56.0)(algoliasearch@5.56.0) + '@algolia/client-search': 5.56.0 + algoliasearch: 5.56.0 + + '@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.56.0)(algoliasearch@5.56.0)': + dependencies: + '@algolia/client-search': 5.56.0 + algoliasearch: 5.56.0 + + '@algolia/client-abtesting@5.56.0': + dependencies: + '@algolia/client-common': 5.56.0 + '@algolia/requester-browser-xhr': 5.56.0 + '@algolia/requester-fetch': 5.56.0 + '@algolia/requester-node-http': 5.56.0 + + '@algolia/client-analytics@5.56.0': + dependencies: + '@algolia/client-common': 5.56.0 + '@algolia/requester-browser-xhr': 5.56.0 + '@algolia/requester-fetch': 5.56.0 + '@algolia/requester-node-http': 5.56.0 + + '@algolia/client-common@5.56.0': {} + + '@algolia/client-insights@5.56.0': + dependencies: + '@algolia/client-common': 5.56.0 + '@algolia/requester-browser-xhr': 5.56.0 + '@algolia/requester-fetch': 5.56.0 + '@algolia/requester-node-http': 5.56.0 + + '@algolia/client-personalization@5.56.0': + dependencies: + '@algolia/client-common': 5.56.0 + '@algolia/requester-browser-xhr': 5.56.0 + '@algolia/requester-fetch': 5.56.0 + '@algolia/requester-node-http': 5.56.0 + + '@algolia/client-query-suggestions@5.56.0': + dependencies: + '@algolia/client-common': 5.56.0 + '@algolia/requester-browser-xhr': 5.56.0 + '@algolia/requester-fetch': 5.56.0 + '@algolia/requester-node-http': 5.56.0 + + '@algolia/client-search@5.56.0': + dependencies: + '@algolia/client-common': 5.56.0 + '@algolia/requester-browser-xhr': 5.56.0 + '@algolia/requester-fetch': 5.56.0 + '@algolia/requester-node-http': 5.56.0 + + '@algolia/ingestion@1.56.0': + dependencies: + '@algolia/client-common': 5.56.0 + '@algolia/requester-browser-xhr': 5.56.0 + '@algolia/requester-fetch': 5.56.0 + '@algolia/requester-node-http': 5.56.0 + + '@algolia/monitoring@1.56.0': + dependencies: + '@algolia/client-common': 5.56.0 + '@algolia/requester-browser-xhr': 5.56.0 + '@algolia/requester-fetch': 5.56.0 + '@algolia/requester-node-http': 5.56.0 + + '@algolia/recommend@5.56.0': + dependencies: + '@algolia/client-common': 5.56.0 + '@algolia/requester-browser-xhr': 5.56.0 + '@algolia/requester-fetch': 5.56.0 + '@algolia/requester-node-http': 5.56.0 + + '@algolia/requester-browser-xhr@5.56.0': + dependencies: + '@algolia/client-common': 5.56.0 + + '@algolia/requester-fetch@5.56.0': + dependencies: + '@algolia/client-common': 5.56.0 + + '@algolia/requester-node-http@5.56.0': + dependencies: + '@algolia/client-common': 5.56.0 + + '@antfu/eslint-config@9.3.0(@typescript-eslint/typescript-estree@8.67.0(typescript@6.0.3))(@typescript-eslint/utils@8.67.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(@vue/compiler-sfc@3.5.41)(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3)(vitest@4.1.10(@types/node@26.2.0)(vite@5.4.21(@types/node@26.2.0)))': dependencies: '@antfu/install-pkg': 2.0.1 '@clack/prompts': 1.7.0 @@ -2202,9 +2909,9 @@ snapshots: '@eslint-community/eslint-plugin-eslint-comments': 4.7.2(eslint@10.8.1(jiti@2.7.0)) '@eslint/markdown': 8.0.3 '@stylistic/eslint-plugin': 5.10.0(eslint@10.8.1(jiti@2.7.0)) - '@typescript-eslint/eslint-plugin': 8.66.0(@typescript-eslint/parser@8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/parser': 8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) - '@vitest/eslint-plugin': 1.6.27(@typescript-eslint/eslint-plugin@8.66.0(@typescript-eslint/parser@8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3)(vitest@4.1.10(@types/node@26.2.0)(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))) + '@typescript-eslint/eslint-plugin': 8.67.0(@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/parser': 8.67.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) + '@vitest/eslint-plugin': 1.6.27(@typescript-eslint/eslint-plugin@8.67.0(@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3)(vitest@4.1.10(@types/node@26.2.0)(vite@5.4.21(@types/node@26.2.0))) ansis: 4.3.1 cac: 7.0.0 eslint: 10.8.1(jiti@2.7.0) @@ -2212,7 +2919,7 @@ snapshots: eslint-flat-config-utils: 3.2.0 eslint-merge-processors: 2.0.0(eslint@10.8.1(jiti@2.7.0)) eslint-plugin-antfu: 3.2.3(eslint@10.8.1(jiti@2.7.0)) - eslint-plugin-command: 4.0.0(@typescript-eslint/typescript-estree@8.66.0(typescript@6.0.3))(@typescript-eslint/utils@8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0)) + eslint-plugin-command: 4.0.0(@typescript-eslint/typescript-estree@8.67.0(typescript@6.0.3))(@typescript-eslint/utils@8.67.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0)) eslint-plugin-import-lite: 0.6.0(eslint@10.8.1(jiti@2.7.0)) eslint-plugin-jsdoc: 63.3.3(eslint@10.8.1(jiti@2.7.0)) eslint-plugin-jsonc: 3.4.1(eslint@10.8.1(jiti@2.7.0)) @@ -2223,11 +2930,11 @@ snapshots: eslint-plugin-regexp: 3.1.1(eslint@10.8.1(jiti@2.7.0)) eslint-plugin-toml: 1.5.0(eslint@10.8.1(jiti@2.7.0)) eslint-plugin-unicorn: 73.0.0(eslint@10.8.1(jiti@2.7.0)) - eslint-plugin-unused-imports: 4.4.1(@typescript-eslint/eslint-plugin@8.66.0(@typescript-eslint/parser@8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0)) - eslint-plugin-vue: 10.10.0(@stylistic/eslint-plugin@5.10.0(eslint@10.8.1(jiti@2.7.0)))(@typescript-eslint/parser@8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(vue-eslint-parser@10.4.1(eslint@10.8.1(jiti@2.7.0))) + eslint-plugin-unused-imports: 4.4.1(@typescript-eslint/eslint-plugin@8.67.0(@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0)) + eslint-plugin-vue: 10.10.0(@stylistic/eslint-plugin@5.10.0(eslint@10.8.1(jiti@2.7.0)))(@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(vue-eslint-parser@10.4.1(eslint@10.8.1(jiti@2.7.0))) eslint-plugin-yml: 3.8.1(eslint@10.8.1(jiti@2.7.0)) eslint-processor-vue-blocks: 2.0.0(@vue/compiler-sfc@3.5.41)(eslint@10.8.1(jiti@2.7.0)) - globals: 17.9.0 + globals: 17.10.0 local-pkg: 1.2.1 parse-gitignore: 2.0.0 toml-eslint-parser: 1.0.3 @@ -2274,6 +2981,31 @@ snapshots: fast-wrap-ansi: 0.2.2 sisteransi: 1.0.5 + '@docsearch/css@3.8.2': {} + + '@docsearch/js@3.8.2(@algolia/client-search@5.56.0)(search-insights@2.17.3)': + dependencies: + '@docsearch/react': 3.8.2(@algolia/client-search@5.56.0)(search-insights@2.17.3) + preact: 10.29.8 + transitivePeerDependencies: + - '@algolia/client-search' + - '@types/react' + - preact-render-to-string + - react + - react-dom + - search-insights + + '@docsearch/react@3.8.2(@algolia/client-search@5.56.0)(search-insights@2.17.3)': + dependencies: + '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.56.0)(algoliasearch@5.56.0)(search-insights@2.17.3) + '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.56.0)(algoliasearch@5.56.0) + '@docsearch/css': 3.8.2 + algoliasearch: 5.56.0 + optionalDependencies: + search-insights: 2.17.3 + transitivePeerDependencies: + - '@algolia/client-search' + '@e18e/eslint-plugin@0.6.0(eslint@10.8.1(jiti@2.7.0))': dependencies: empathic: 2.0.1 @@ -2285,7 +3017,7 @@ snapshots: '@es-joy/jsdoccomment@0.91.0': dependencies: '@types/estree': 1.0.9 - '@typescript-eslint/types': 8.66.0 + '@typescript-eslint/types': 8.67.0 comment-parser: 1.4.7 esquery: 1.7.0 jsdoc-type-pratt-parser: 8.0.0 @@ -2293,88 +3025,157 @@ snapshots: '@es-joy/jsdoccomment@0.92.0': dependencies: '@types/estree': 1.0.9 - '@typescript-eslint/types': 8.66.0 + '@typescript-eslint/types': 8.67.0 comment-parser: 1.4.7 esquery: 1.7.0 jsdoc-type-pratt-parser: 9.0.1 '@es-joy/resolve.exports@1.2.0': {} + '@esbuild/aix-ppc64@0.21.5': + optional: true + '@esbuild/aix-ppc64@0.28.2': optional: true + '@esbuild/android-arm64@0.21.5': + optional: true + '@esbuild/android-arm64@0.28.2': optional: true + '@esbuild/android-arm@0.21.5': + optional: true + '@esbuild/android-arm@0.28.2': optional: true + '@esbuild/android-x64@0.21.5': + optional: true + '@esbuild/android-x64@0.28.2': optional: true + '@esbuild/darwin-arm64@0.21.5': + optional: true + '@esbuild/darwin-arm64@0.28.2': optional: true + '@esbuild/darwin-x64@0.21.5': + optional: true + '@esbuild/darwin-x64@0.28.2': optional: true + '@esbuild/freebsd-arm64@0.21.5': + optional: true + '@esbuild/freebsd-arm64@0.28.2': optional: true + '@esbuild/freebsd-x64@0.21.5': + optional: true + '@esbuild/freebsd-x64@0.28.2': optional: true + '@esbuild/linux-arm64@0.21.5': + optional: true + '@esbuild/linux-arm64@0.28.2': optional: true + '@esbuild/linux-arm@0.21.5': + optional: true + '@esbuild/linux-arm@0.28.2': optional: true + '@esbuild/linux-ia32@0.21.5': + optional: true + '@esbuild/linux-ia32@0.28.2': optional: true + '@esbuild/linux-loong64@0.21.5': + optional: true + '@esbuild/linux-loong64@0.28.2': optional: true + '@esbuild/linux-mips64el@0.21.5': + optional: true + '@esbuild/linux-mips64el@0.28.2': optional: true + '@esbuild/linux-ppc64@0.21.5': + optional: true + '@esbuild/linux-ppc64@0.28.2': optional: true + '@esbuild/linux-riscv64@0.21.5': + optional: true + '@esbuild/linux-riscv64@0.28.2': optional: true + '@esbuild/linux-s390x@0.21.5': + optional: true + '@esbuild/linux-s390x@0.28.2': optional: true + '@esbuild/linux-x64@0.21.5': + optional: true + '@esbuild/linux-x64@0.28.2': optional: true '@esbuild/netbsd-arm64@0.28.2': optional: true + '@esbuild/netbsd-x64@0.21.5': + optional: true + '@esbuild/netbsd-x64@0.28.2': optional: true '@esbuild/openbsd-arm64@0.28.2': optional: true + '@esbuild/openbsd-x64@0.21.5': + optional: true + '@esbuild/openbsd-x64@0.28.2': optional: true '@esbuild/openharmony-arm64@0.28.2': optional: true + '@esbuild/sunos-x64@0.21.5': + optional: true + '@esbuild/sunos-x64@0.28.2': optional: true + '@esbuild/win32-arm64@0.21.5': + optional: true + '@esbuild/win32-arm64@0.28.2': optional: true + '@esbuild/win32-ia32@0.21.5': + optional: true + '@esbuild/win32-ia32@0.28.2': optional: true + '@esbuild/win32-x64@0.21.5': + optional: true + '@esbuild/win32-x64@0.28.2': optional: true @@ -2461,12 +3262,63 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} + '@iconify-json/simple-icons@1.2.93': + dependencies: + '@iconify/types': 2.0.0 + + '@iconify/types@2.0.0': {} + + '@iconify/vue@5.0.1(vue@3.5.41(typescript@6.0.3))': + dependencies: + '@iconify/types': 2.0.0 + vue: 3.5.41(typescript@6.0.3) + '@jridgewell/sourcemap-codec@1.5.5': {} '@lonewolfyx/tsconfig@0.0.6(typescript@6.0.3)': dependencies: typescript: 6.0.3 + '@lonewolfyx/utils@0.0.5(@algolia/client-search@5.56.0)(@types/node@26.2.0)(change-case@5.4.4)(postcss@8.5.26)(search-insights@2.17.3)(typescript@6.0.3)(vue@3.5.41(typescript@6.0.3))': + dependencies: + '@iconify/vue': 5.0.1(vue@3.5.41(typescript@6.0.3)) + fs-extra: 11.4.0 + md5-typescript: 1.0.5 + vitepress: 1.6.4(@algolia/client-search@5.56.0)(@types/node@26.2.0)(change-case@5.4.4)(postcss@8.5.26)(search-insights@2.17.3)(typescript@6.0.3) + transitivePeerDependencies: + - '@algolia/client-search' + - '@types/node' + - '@types/react' + - async-validator + - axios + - change-case + - drauu + - fuse.js + - idb-keyval + - jwt-decode + - less + - lightningcss + - markdown-it-mathjax3 + - nprogress + - postcss + - preact-render-to-string + - qrcode + - react + - react-dom + - sass + - sass-embedded + - search-insights + - sortablejs + - stylus + - sugarss + - terser + - typescript + - universal-cookie + - vue + + '@napi-rs/lzma-linux-x64-gnu@1.5.1': + optional: true + '@ota-meshi/ast-token-store@0.3.0': {} '@oxc-project/types@0.143.0': {} @@ -2521,6 +3373,121 @@ snapshots: '@rolldown/pluginutils@1.0.1': {} + '@rollup/rollup-android-arm-eabi@4.62.4': + optional: true + + '@rollup/rollup-android-arm64@4.62.4': + optional: true + + '@rollup/rollup-darwin-arm64@4.62.4': + optional: true + + '@rollup/rollup-darwin-x64@4.62.4': + optional: true + + '@rollup/rollup-freebsd-arm64@4.62.4': + optional: true + + '@rollup/rollup-freebsd-x64@4.62.4': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.62.4': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.62.4': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.62.4': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.62.4': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.62.4': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.62.4': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.62.4': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.62.4': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.62.4': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.62.4': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.62.4': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.62.4': + optional: true + + '@rollup/rollup-linux-x64-musl@4.62.4': + optional: true + + '@rollup/rollup-openbsd-x64@4.62.4': + optional: true + + '@rollup/rollup-openharmony-arm64@4.62.4': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.62.4': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.62.4': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.62.4': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.62.4': + optional: true + + '@shikijs/core@2.5.0': + dependencies: + '@shikijs/engine-javascript': 2.5.0 + '@shikijs/engine-oniguruma': 2.5.0 + '@shikijs/types': 2.5.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.5 + hast-util-to-html: 9.0.5 + + '@shikijs/engine-javascript@2.5.0': + dependencies: + '@shikijs/types': 2.5.0 + '@shikijs/vscode-textmate': 10.0.2 + oniguruma-to-es: 3.1.1 + + '@shikijs/engine-oniguruma@2.5.0': + dependencies: + '@shikijs/types': 2.5.0 + '@shikijs/vscode-textmate': 10.0.2 + + '@shikijs/langs@2.5.0': + dependencies: + '@shikijs/types': 2.5.0 + + '@shikijs/themes@2.5.0': + dependencies: + '@shikijs/types': 2.5.0 + + '@shikijs/transformers@2.5.0': + dependencies: + '@shikijs/core': 2.5.0 + '@shikijs/types': 2.5.0 + + '@shikijs/types@2.5.0': + dependencies: + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.5 + + '@shikijs/vscode-textmate@10.0.2': {} + '@sindresorhus/base62@1.0.0': {} '@standard-schema/spec@1.1.0': {} @@ -2528,7 +3495,7 @@ snapshots: '@stylistic/eslint-plugin@5.10.0(eslint@10.8.1(jiti@2.7.0))': dependencies: '@eslint-community/eslint-utils': 4.10.1(eslint@10.8.1(jiti@2.7.0)) - '@typescript-eslint/types': 8.66.0 + '@typescript-eslint/types': 8.67.0 eslint: 10.8.1(jiti@2.7.0) eslint-visitor-keys: 4.2.1 espree: 10.4.0 @@ -2558,10 +3525,19 @@ snapshots: '@types/katex@0.16.8': {} + '@types/linkify-it@5.0.0': {} + + '@types/markdown-it@14.1.2': + dependencies: + '@types/linkify-it': 5.0.0 + '@types/mdurl': 2.0.0 + '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 + '@types/mdurl@2.0.0': {} + '@types/ms@2.1.0': {} '@types/node@26.2.0': @@ -2572,14 +3548,16 @@ snapshots: '@types/unist@3.0.3': {} - '@typescript-eslint/eslint-plugin@8.66.0(@typescript-eslint/parser@8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3)': + '@types/web-bluetooth@0.0.21': {} + + '@typescript-eslint/eslint-plugin@8.67.0(@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/scope-manager': 8.66.0 - '@typescript-eslint/type-utils': 8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/utils': 8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.66.0 + '@typescript-eslint/parser': 8.67.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.67.0 + '@typescript-eslint/type-utils': 8.67.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.67.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.67.0 eslint: 10.8.1(jiti@2.7.0) ignore: 7.0.6 natural-compare: 1.4.0 @@ -2588,41 +3566,41 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3)': + '@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@typescript-eslint/scope-manager': 8.66.0 - '@typescript-eslint/types': 8.66.0 - '@typescript-eslint/typescript-estree': 8.66.0(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.66.0 + '@typescript-eslint/scope-manager': 8.67.0 + '@typescript-eslint/types': 8.67.0 + '@typescript-eslint/typescript-estree': 8.67.0(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.67.0 debug: 4.4.3 eslint: 10.8.1(jiti@2.7.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.66.0(typescript@6.0.3)': + '@typescript-eslint/project-service@8.67.0(typescript@6.0.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.66.0(typescript@6.0.3) - '@typescript-eslint/types': 8.66.0 + '@typescript-eslint/tsconfig-utils': 8.67.0(typescript@6.0.3) + '@typescript-eslint/types': 8.67.0 debug: 4.4.3 typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.66.0': + '@typescript-eslint/scope-manager@8.67.0': dependencies: - '@typescript-eslint/types': 8.66.0 - '@typescript-eslint/visitor-keys': 8.66.0 + '@typescript-eslint/types': 8.67.0 + '@typescript-eslint/visitor-keys': 8.67.0 - '@typescript-eslint/tsconfig-utils@8.66.0(typescript@6.0.3)': + '@typescript-eslint/tsconfig-utils@8.67.0(typescript@6.0.3)': dependencies: typescript: 6.0.3 - '@typescript-eslint/type-utils@8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3)': + '@typescript-eslint/type-utils@8.67.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3)': dependencies: - '@typescript-eslint/types': 8.66.0 - '@typescript-eslint/typescript-estree': 8.66.0(typescript@6.0.3) - '@typescript-eslint/utils': 8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/types': 8.67.0 + '@typescript-eslint/typescript-estree': 8.67.0(typescript@6.0.3) + '@typescript-eslint/utils': 8.67.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) debug: 4.4.3 eslint: 10.8.1(jiti@2.7.0) ts-api-utils: 2.5.0(typescript@6.0.3) @@ -2630,14 +3608,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.66.0': {} + '@typescript-eslint/types@8.67.0': {} - '@typescript-eslint/typescript-estree@8.66.0(typescript@6.0.3)': + '@typescript-eslint/typescript-estree@8.67.0(typescript@6.0.3)': dependencies: - '@typescript-eslint/project-service': 8.66.0(typescript@6.0.3) - '@typescript-eslint/tsconfig-utils': 8.66.0(typescript@6.0.3) - '@typescript-eslint/types': 8.66.0 - '@typescript-eslint/visitor-keys': 8.66.0 + '@typescript-eslint/project-service': 8.67.0(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.67.0(typescript@6.0.3) + '@typescript-eslint/types': 8.67.0 + '@typescript-eslint/visitor-keys': 8.67.0 debug: 4.4.3 minimatch: 10.2.6 semver: 7.8.5 @@ -2647,31 +3625,38 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3)': + '@typescript-eslint/utils@8.67.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@eslint-community/eslint-utils': 4.10.1(eslint@10.8.1(jiti@2.7.0)) - '@typescript-eslint/scope-manager': 8.66.0 - '@typescript-eslint/types': 8.66.0 - '@typescript-eslint/typescript-estree': 8.66.0(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.67.0 + '@typescript-eslint/types': 8.67.0 + '@typescript-eslint/typescript-estree': 8.67.0(typescript@6.0.3) eslint: 10.8.1(jiti@2.7.0) typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.66.0': + '@typescript-eslint/visitor-keys@8.67.0': dependencies: - '@typescript-eslint/types': 8.66.0 + '@typescript-eslint/types': 8.67.0 eslint-visitor-keys: 5.0.1 - '@vitest/eslint-plugin@1.6.27(@typescript-eslint/eslint-plugin@8.66.0(@typescript-eslint/parser@8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3)(vitest@4.1.10(@types/node@26.2.0)(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))': + '@ungap/structured-clone@1.3.3': {} + + '@vitejs/plugin-vue@5.2.4(vite@5.4.21(@types/node@26.2.0))(vue@3.5.41(typescript@6.0.3))': + dependencies: + vite: 5.4.21(@types/node@26.2.0) + vue: 3.5.41(typescript@6.0.3) + + '@vitest/eslint-plugin@1.6.27(@typescript-eslint/eslint-plugin@8.67.0(@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3)(vitest@4.1.10(@types/node@26.2.0)(vite@5.4.21(@types/node@26.2.0)))': dependencies: - '@typescript-eslint/scope-manager': 8.66.0 - '@typescript-eslint/utils': 8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.67.0 + '@typescript-eslint/utils': 8.67.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) eslint: 10.8.1(jiti@2.7.0) optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.66.0(@typescript-eslint/parser@8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/eslint-plugin': 8.67.0(@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) typescript: 6.0.3 - vitest: 4.1.10(@types/node@26.2.0)(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) + vitest: 4.1.10(@types/node@26.2.0)(vite@5.4.21(@types/node@26.2.0)) transitivePeerDependencies: - supports-color @@ -2684,13 +3669,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.1 - '@vitest/mocker@4.1.10(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))': + '@vitest/mocker@4.1.10(vite@5.4.21(@types/node@26.2.0))': dependencies: '@vitest/spy': 4.1.10 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0) + vite: 5.4.21(@types/node@26.2.0) '@vitest/pretty-format@4.1.10': dependencies: @@ -2746,81 +3731,149 @@ snapshots: '@vue/compiler-dom': 3.5.41 '@vue/shared': 3.5.41 + '@vue/devtools-api@7.7.10': + dependencies: + '@vue/devtools-kit': 7.7.10 + + '@vue/devtools-kit@7.7.10': + dependencies: + '@vue/devtools-shared': 7.7.10 + birpc: 2.9.0 + hookable: 5.5.3 + mitt: 3.0.1 + perfect-debounce: 1.0.0 + speakingurl: 14.0.1 + superjson: 2.2.6 + + '@vue/devtools-shared@7.7.10': + dependencies: + rfdc: 1.4.1 + + '@vue/reactivity@3.5.41': + dependencies: + '@vue/shared': 3.5.41 + + '@vue/runtime-core@3.5.41': + dependencies: + '@vue/reactivity': 3.5.41 + '@vue/shared': 3.5.41 + + '@vue/runtime-dom@3.5.41': + dependencies: + '@vue/reactivity': 3.5.41 + '@vue/runtime-core': 3.5.41 + '@vue/shared': 3.5.41 + csstype: 3.2.3 + + '@vue/server-renderer@3.5.41': + dependencies: + '@vue/compiler-ssr': 3.5.41 + '@vue/runtime-dom': 3.5.41 + '@vue/shared': 3.5.41 + '@vue/shared@3.5.41': {} - '@yuku-codegen/binding-android-arm64@0.8.4': + '@vueuse/core@12.8.2(typescript@6.0.3)': + dependencies: + '@types/web-bluetooth': 0.0.21 + '@vueuse/metadata': 12.8.2 + '@vueuse/shared': 12.8.2(typescript@6.0.3) + vue: 3.5.41(typescript@6.0.3) + transitivePeerDependencies: + - typescript + + '@vueuse/integrations@12.8.2(change-case@5.4.4)(focus-trap@7.8.0)(typescript@6.0.3)': + dependencies: + '@vueuse/core': 12.8.2(typescript@6.0.3) + '@vueuse/shared': 12.8.2(typescript@6.0.3) + vue: 3.5.41(typescript@6.0.3) + optionalDependencies: + change-case: 5.4.4 + focus-trap: 7.8.0 + transitivePeerDependencies: + - typescript + + '@vueuse/metadata@12.8.2': {} + + '@vueuse/shared@12.8.2(typescript@6.0.3)': + dependencies: + vue: 3.5.41(typescript@6.0.3) + transitivePeerDependencies: + - typescript + + '@yuku-codegen/binding-android-arm64@0.8.5': optional: true - '@yuku-codegen/binding-darwin-arm64@0.8.4': + '@yuku-codegen/binding-darwin-arm64@0.8.5': optional: true - '@yuku-codegen/binding-darwin-x64@0.8.4': + '@yuku-codegen/binding-darwin-x64@0.8.5': optional: true - '@yuku-codegen/binding-freebsd-x64@0.8.4': + '@yuku-codegen/binding-freebsd-x64@0.8.5': optional: true - '@yuku-codegen/binding-linux-arm-gnu@0.8.4': + '@yuku-codegen/binding-linux-arm-gnu@0.8.5': optional: true - '@yuku-codegen/binding-linux-arm-musl@0.8.4': + '@yuku-codegen/binding-linux-arm-musl@0.8.5': optional: true - '@yuku-codegen/binding-linux-arm64-gnu@0.8.4': + '@yuku-codegen/binding-linux-arm64-gnu@0.8.5': optional: true - '@yuku-codegen/binding-linux-arm64-musl@0.8.4': + '@yuku-codegen/binding-linux-arm64-musl@0.8.5': optional: true - '@yuku-codegen/binding-linux-x64-gnu@0.8.4': + '@yuku-codegen/binding-linux-x64-gnu@0.8.5': optional: true - '@yuku-codegen/binding-linux-x64-musl@0.8.4': + '@yuku-codegen/binding-linux-x64-musl@0.8.5': optional: true - '@yuku-codegen/binding-win32-arm64@0.8.4': + '@yuku-codegen/binding-win32-arm64@0.8.5': optional: true - '@yuku-codegen/binding-win32-x64@0.8.4': + '@yuku-codegen/binding-win32-x64@0.8.5': optional: true - '@yuku-parser/binding-android-arm64@0.8.4': + '@yuku-parser/binding-android-arm64@0.8.5': optional: true - '@yuku-parser/binding-darwin-arm64@0.8.4': + '@yuku-parser/binding-darwin-arm64@0.8.5': optional: true - '@yuku-parser/binding-darwin-x64@0.8.4': + '@yuku-parser/binding-darwin-x64@0.8.5': optional: true - '@yuku-parser/binding-freebsd-x64@0.8.4': + '@yuku-parser/binding-freebsd-x64@0.8.5': optional: true - '@yuku-parser/binding-linux-arm-gnu@0.8.4': + '@yuku-parser/binding-linux-arm-gnu@0.8.5': optional: true - '@yuku-parser/binding-linux-arm-musl@0.8.4': + '@yuku-parser/binding-linux-arm-musl@0.8.5': optional: true - '@yuku-parser/binding-linux-arm64-gnu@0.8.4': + '@yuku-parser/binding-linux-arm64-gnu@0.8.5': optional: true - '@yuku-parser/binding-linux-arm64-musl@0.8.4': + '@yuku-parser/binding-linux-arm64-musl@0.8.5': optional: true - '@yuku-parser/binding-linux-x64-gnu@0.8.4': + '@yuku-parser/binding-linux-x64-gnu@0.8.5': optional: true - '@yuku-parser/binding-linux-x64-musl@0.8.4': + '@yuku-parser/binding-linux-x64-musl@0.8.5': optional: true - '@yuku-parser/binding-win32-arm64@0.8.4': + '@yuku-parser/binding-win32-arm64@0.8.5': optional: true - '@yuku-parser/binding-win32-x64@0.8.4': + '@yuku-parser/binding-win32-x64@0.8.5': optional: true - '@yuku-toolchain/types@0.8.4': {} + '@yuku-toolchain/types@0.8.5': {} acorn-jsx@5.3.2(acorn@8.18.0): dependencies: @@ -2835,6 +3888,23 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 + algoliasearch@5.56.0: + dependencies: + '@algolia/abtesting': 1.22.0 + '@algolia/client-abtesting': 5.56.0 + '@algolia/client-analytics': 5.56.0 + '@algolia/client-common': 5.56.0 + '@algolia/client-insights': 5.56.0 + '@algolia/client-personalization': 5.56.0 + '@algolia/client-query-suggestions': 5.56.0 + '@algolia/client-search': 5.56.0 + '@algolia/ingestion': 1.56.0 + '@algolia/monitoring': 1.56.0 + '@algolia/recommend': 5.56.0 + '@algolia/requester-browser-xhr': 5.56.0 + '@algolia/requester-fetch': 5.56.0 + '@algolia/requester-node-http': 5.56.0 + ansis@4.3.1: {} are-docs-informative@0.0.2: {} @@ -2845,6 +3915,8 @@ snapshots: baseline-browser-mapping@2.11.13: {} + birpc@2.9.0: {} + boolbase@1.0.0: {} brace-expansion@5.0.9: @@ -2855,9 +3927,9 @@ snapshots: dependencies: baseline-browser-mapping: 2.11.13 caniuse-lite: 1.0.30001809 - electron-to-chromium: 1.5.403 + electron-to-chromium: 1.5.405 node-releases: 2.0.53 - update-browserslist-db: 1.3.0(browserslist@4.28.8) + update-browserslist-db: 1.3.1(browserslist@4.28.8) builtin-modules@5.3.0: {} @@ -2871,16 +3943,24 @@ snapshots: change-case@5.4.4: {} + character-entities-html4@2.1.0: {} + + character-entities-legacy@3.0.0: {} + character-entities@2.0.2: {} ci-info@4.4.0: {} citty@0.2.2: {} + comma-separated-tokens@2.0.3: {} + commander@8.3.0: {} comment-parser@1.4.7: {} + comment-parser@1.4.8: {} + confbox@0.1.8: {} confbox@0.2.4: {} @@ -2889,6 +3969,10 @@ snapshots: convert-source-map@2.0.0: {} + copy-anything@4.0.5: + dependencies: + is-what: 5.5.0 + core-js-compat@3.50.0: dependencies: browserslist: 4.28.8 @@ -2901,6 +3985,8 @@ snapshots: cssesc@3.0.0: {} + csstype@3.2.3: {} + dayjs@1.11.21: {} debug@4.4.3: @@ -2919,8 +4005,6 @@ snapshots: detect-indent@7.0.2: {} - detect-libc@2.1.2: {} - devlop@1.1.0: dependencies: dequal: 2.0.3 @@ -2929,7 +4013,9 @@ snapshots: dts-resolver@3.0.0: {} - electron-to-chromium@1.5.403: {} + electron-to-chromium@1.5.405: {} + + emoji-regex-xs@1.0.0: {} empathic@2.0.1: {} @@ -2946,6 +4032,32 @@ snapshots: es-module-lexer@2.3.1: {} + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + esbuild@0.28.2: optionalDependencies: '@esbuild/aix-ppc64': 0.28.2 @@ -3010,11 +4122,11 @@ snapshots: dependencies: eslint: 10.8.1(jiti@2.7.0) - eslint-plugin-command@4.0.0(@typescript-eslint/typescript-estree@8.66.0(typescript@6.0.3))(@typescript-eslint/utils@8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0)): + eslint-plugin-command@4.0.0(@typescript-eslint/typescript-estree@8.67.0(typescript@6.0.3))(@typescript-eslint/utils@8.67.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0)): dependencies: '@es-joy/jsdoccomment': 0.92.0 - '@typescript-eslint/typescript-estree': 8.66.0(typescript@6.0.3) - '@typescript-eslint/utils': 8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/typescript-estree': 8.67.0(typescript@6.0.3) + '@typescript-eslint/utils': 8.67.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) eslint: 10.8.1(jiti@2.7.0) eslint-plugin-es-x@7.8.0(eslint@10.8.1(jiti@2.7.0)): @@ -3069,7 +4181,7 @@ snapshots: enhanced-resolve: 5.24.5 eslint: 10.8.1(jiti@2.7.0) eslint-plugin-es-x: 7.8.0(eslint@10.8.1(jiti@2.7.0)) - get-tsconfig: 4.14.0 + get-tsconfig: 4.14.1 globals: 15.15.0 globrex: 0.1.2 ignore: 5.3.2 @@ -3081,7 +4193,7 @@ snapshots: eslint-plugin-perfectionist@5.10.1(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3): dependencies: - '@typescript-eslint/utils': 8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.67.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) eslint: 10.8.1(jiti@2.7.0) natural-orderby: 5.0.0 transitivePeerDependencies: @@ -3103,7 +4215,7 @@ snapshots: dependencies: '@eslint-community/eslint-utils': 4.10.1(eslint@10.8.1(jiti@2.7.0)) '@eslint-community/regexpp': 4.12.2 - comment-parser: 1.4.7 + comment-parser: 1.4.8 eslint: 10.8.1(jiti@2.7.0) jsdoc-type-pratt-parser: 7.3.0 refa: 0.12.1 @@ -3133,7 +4245,7 @@ snapshots: entities: 4.5.0 eslint: 10.8.1(jiti@2.7.0) find-up-simple: 1.0.1 - globals: 17.9.0 + globals: 17.10.0 indent-string: 5.0.0 is-builtin-module: 5.0.0 is-identifier: 1.1.0 @@ -3145,13 +4257,13 @@ snapshots: strip-indent: 4.1.1 yaml: 2.9.0 - eslint-plugin-unused-imports@4.4.1(@typescript-eslint/eslint-plugin@8.66.0(@typescript-eslint/parser@8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0)): + eslint-plugin-unused-imports@4.4.1(@typescript-eslint/eslint-plugin@8.67.0(@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0)): dependencies: eslint: 10.8.1(jiti@2.7.0) optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.66.0(@typescript-eslint/parser@8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/eslint-plugin': 8.67.0(@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) - eslint-plugin-vue@10.10.0(@stylistic/eslint-plugin@5.10.0(eslint@10.8.1(jiti@2.7.0)))(@typescript-eslint/parser@8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(vue-eslint-parser@10.4.1(eslint@10.8.1(jiti@2.7.0))): + eslint-plugin-vue@10.10.0(@stylistic/eslint-plugin@5.10.0(eslint@10.8.1(jiti@2.7.0)))(@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(vue-eslint-parser@10.4.1(eslint@10.8.1(jiti@2.7.0))): dependencies: '@eslint-community/eslint-utils': 4.10.1(eslint@10.8.1(jiti@2.7.0)) eslint: 10.8.1(jiti@2.7.0) @@ -3163,7 +4275,7 @@ snapshots: xml-name-validator: 5.0.0 optionalDependencies: '@stylistic/eslint-plugin': 5.10.0(eslint@10.8.1(jiti@2.7.0)) - '@typescript-eslint/parser': 8.66.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/parser': 8.67.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) eslint-plugin-yml@3.8.1(eslint@10.8.1(jiti@2.7.0)): dependencies: @@ -3307,14 +4419,24 @@ snapshots: flatted@3.4.4: {} + focus-trap@7.8.0: + dependencies: + tabbable: 6.5.0 + format@0.2.2: {} + fs-extra@11.4.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.1 + universalify: 2.0.1 + fsevents@2.3.3: optional: true function-timeout@1.0.2: {} - get-tsconfig@4.14.0: + get-tsconfig@4.14.1: dependencies: resolve-pkg-maps: 1.0.0 @@ -3332,16 +4454,38 @@ snapshots: globals@15.15.0: {} - globals@17.9.0: {} + globals@17.10.0: {} globrex@0.1.2: {} graceful-fs@4.2.11: {} + 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-whitespace@3.0.0: + dependencies: + '@types/hast': 3.0.5 + + hookable@5.5.3: {} + hookable@6.1.1: {} html-entities@2.6.0: {} + html-void-elements@3.0.0: {} + identifier-regex@1.1.0: dependencies: reserved-identifiers: 1.2.0 @@ -3371,6 +4515,8 @@ snapshots: identifier-regex: 1.1.0 super-regex: 1.1.0 + is-what@5.5.0: {} + isexe@2.0.0: {} jiti@2.7.0: {} @@ -3397,6 +4543,12 @@ snapshots: eslint-visitor-keys: 5.0.1 verkit: 0.3.2 + jsonfile@6.2.1: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + katex@0.16.47: dependencies: commander: 8.3.0 @@ -3410,55 +4562,6 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - lightningcss-android-arm64@1.33.0: - optional: true - - lightningcss-darwin-arm64@1.33.0: - optional: true - - lightningcss-darwin-x64@1.33.0: - optional: true - - lightningcss-freebsd-x64@1.33.0: - optional: true - - lightningcss-linux-arm-gnueabihf@1.33.0: - optional: true - - lightningcss-linux-arm64-gnu@1.33.0: - optional: true - - lightningcss-linux-arm64-musl@1.33.0: - optional: true - - lightningcss-linux-x64-gnu@1.33.0: - optional: true - - lightningcss-linux-x64-musl@1.33.0: - optional: true - - lightningcss-win32-arm64-msvc@1.33.0: - optional: true - - lightningcss-win32-x64-msvc@1.33.0: - optional: true - - lightningcss@1.33.0: - dependencies: - detect-libc: 2.1.2 - optionalDependencies: - lightningcss-android-arm64: 1.33.0 - lightningcss-darwin-arm64: 1.33.0 - lightningcss-darwin-x64: 1.33.0 - lightningcss-freebsd-x64: 1.33.0 - lightningcss-linux-arm-gnueabihf: 1.33.0 - lightningcss-linux-arm64-gnu: 1.33.0 - lightningcss-linux-arm64-musl: 1.33.0 - lightningcss-linux-x64-gnu: 1.33.0 - lightningcss-linux-x64-musl: 1.33.0 - lightningcss-win32-arm64-msvc: 1.33.0 - lightningcss-win32-x64-msvc: 1.33.0 - lint-staged@17.3.0: dependencies: picomatch: 4.0.5 @@ -3489,8 +4592,12 @@ snapshots: type-fest: 4.41.0 web-worker: 1.5.0 + mark.js@8.11.1: {} + markdown-table@3.0.4: {} + md5-typescript@1.0.5: {} + mdast-util-find-and-replace@3.0.2: dependencies: '@types/mdast': 4.0.4 @@ -3600,6 +4707,18 @@ snapshots: '@types/mdast': 4.0.4 unist-util-is: 6.0.1 + mdast-util-to-hast@13.2.1: + dependencies: + '@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@2.1.2: dependencies: '@types/mdast': 4.0.4 @@ -3830,6 +4949,10 @@ snapshots: dependencies: brace-expansion: 5.0.9 + minisearch@7.2.0: {} + + mitt@3.0.1: {} + mlly@1.8.2: dependencies: acorn: 8.18.0 @@ -3857,6 +4980,12 @@ snapshots: obug@2.1.4: {} + oniguruma-to-es@3.1.1: + dependencies: + emoji-regex-xs: 1.0.0 + regex: 6.1.0 + regex-recursion: 6.0.2 + optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -3896,6 +5025,8 @@ snapshots: pathe@2.0.3: {} + perfect-debounce@1.0.0: {} + picocolors@1.1.1: {} picomatch@4.0.5: {} @@ -3929,8 +5060,12 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + preact@10.29.8: {} + prelude-ls@1.2.1: {} + property-information@7.2.0: {} + punycode@2.3.1: {} quansync@0.2.11: {} @@ -3943,6 +5078,16 @@ snapshots: dependencies: '@eslint-community/regexpp': 4.12.2 + 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 + regexp-ast-analysis@0.7.1: dependencies: '@eslint-community/regexpp': 4.12.2 @@ -3956,15 +5101,17 @@ snapshots: resolve-pkg-maps@1.0.0: {} + rfdc@1.4.1: {} + rolldown-plugin-dts@0.27.14(rolldown@1.2.3)(typescript@6.0.3): dependencies: dts-resolver: 3.0.0 get-tsconfig: 5.0.0-beta.5 obug: 2.1.4 rolldown: 1.2.3 - yuku-ast: 0.8.4 - yuku-codegen: 0.8.4 - yuku-parser: 0.8.4 + yuku-ast: 0.8.5 + yuku-codegen: 0.8.5 + yuku-parser: 0.8.5 optionalDependencies: typescript: 6.0.3 transitivePeerDependencies: @@ -3990,12 +5137,46 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.2.3 '@rolldown/binding-win32-x64-msvc': 1.2.3 + rollup@4.62.4: + dependencies: + '@types/estree': 1.0.9 + optionalDependencies: + '@napi-rs/lzma-linux-x64-gnu': 1.5.1 + '@rollup/rollup-android-arm-eabi': 4.62.4 + '@rollup/rollup-android-arm64': 4.62.4 + '@rollup/rollup-darwin-arm64': 4.62.4 + '@rollup/rollup-darwin-x64': 4.62.4 + '@rollup/rollup-freebsd-arm64': 4.62.4 + '@rollup/rollup-freebsd-x64': 4.62.4 + '@rollup/rollup-linux-arm-gnueabihf': 4.62.4 + '@rollup/rollup-linux-arm-musleabihf': 4.62.4 + '@rollup/rollup-linux-arm64-gnu': 4.62.4 + '@rollup/rollup-linux-arm64-musl': 4.62.4 + '@rollup/rollup-linux-loong64-gnu': 4.62.4 + '@rollup/rollup-linux-loong64-musl': 4.62.4 + '@rollup/rollup-linux-ppc64-gnu': 4.62.4 + '@rollup/rollup-linux-ppc64-musl': 4.62.4 + '@rollup/rollup-linux-riscv64-gnu': 4.62.4 + '@rollup/rollup-linux-riscv64-musl': 4.62.4 + '@rollup/rollup-linux-s390x-gnu': 4.62.4 + '@rollup/rollup-linux-x64-gnu': 4.62.4 + '@rollup/rollup-linux-x64-musl': 4.62.4 + '@rollup/rollup-openbsd-x64': 4.62.4 + '@rollup/rollup-openharmony-arm64': 4.62.4 + '@rollup/rollup-win32-arm64-msvc': 4.62.4 + '@rollup/rollup-win32-ia32-msvc': 4.62.4 + '@rollup/rollup-win32-x64-gnu': 4.62.4 + '@rollup/rollup-win32-x64-msvc': 4.62.4 + fsevents: 2.3.3 + scslre@0.3.0: dependencies: '@eslint-community/regexpp': 4.12.2 refa: 0.12.1 regexp-ast-analysis: 0.7.1 + search-insights@2.17.3: {} + semver@7.8.5: {} shebang-command@2.0.0: @@ -4004,6 +5185,17 @@ snapshots: shebang-regex@3.0.0: {} + shiki@2.5.0: + dependencies: + '@shikijs/core': 2.5.0 + '@shikijs/engine-javascript': 2.5.0 + '@shikijs/engine-oniguruma': 2.5.0 + '@shikijs/langs': 2.5.0 + '@shikijs/themes': 2.5.0 + '@shikijs/types': 2.5.0 + '@shikijs/vscode-textmate': 10.0.2 + '@types/hast': 3.0.5 + siginfo@2.0.0: {} simple-git-hooks@2.13.1: {} @@ -4012,6 +5204,8 @@ snapshots: source-map-js@1.2.1: {} + space-separated-tokens@2.0.2: {} + spdx-exceptions@2.5.0: {} spdx-expression-parse@5.0.0: @@ -4021,12 +5215,19 @@ snapshots: spdx-license-ids@3.0.23: {} + speakingurl@14.0.1: {} + stackback@0.0.2: {} std-env@4.2.0: {} string-argv@0.3.2: {} + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + strip-indent@4.1.1: {} super-regex@1.1.0: @@ -4035,10 +5236,16 @@ snapshots: make-asynchronous: 1.1.0 time-span: 5.1.0 + superjson@2.2.6: + dependencies: + copy-anything: 4.0.5 + synckit@0.11.13: dependencies: '@pkgr/core': 0.3.6 + tabbable@6.5.0: {} + tapable@2.3.3: {} time-span@5.1.0: @@ -4067,6 +5274,8 @@ snapshots: tree-kill@1.2.2: {} + trim-lines@3.0.1: {} + ts-api-utils@2.5.0(typescript@6.0.3): dependencies: typescript: 6.0.3 @@ -4124,6 +5333,10 @@ snapshots: dependencies: '@types/unist': 3.0.3 + unist-util-position@5.0.0: + dependencies: + '@types/unist': 3.0.3 + unist-util-remove-position@5.0.0: dependencies: '@types/unist': 3.0.3 @@ -4144,7 +5357,9 @@ snapshots: unist-util-is: 6.0.1 unist-util-visit-parents: 6.0.2 - update-browserslist-db@1.3.0(browserslist@4.28.8): + universalify@2.0.1: {} + + update-browserslist-db@1.3.1(browserslist@4.28.8): dependencies: browserslist: 4.28.8 escalade: 3.2.0 @@ -4160,25 +5375,79 @@ snapshots: verkit@0.3.2: {} - vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0): + vfile-message@4.0.3: dependencies: - lightningcss: 1.33.0 - picomatch: 4.0.5 + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 + + vfile@6.0.3: + dependencies: + '@types/unist': 3.0.3 + vfile-message: 4.0.3 + + vite@5.4.21(@types/node@26.2.0): + dependencies: + esbuild: 0.21.5 postcss: 8.5.26 - rolldown: 1.2.3 - tinyglobby: 0.2.17 + rollup: 4.62.4 optionalDependencies: '@types/node': 26.2.0 - esbuild: 0.28.2 fsevents: 2.3.3 - jiti: 2.7.0 - tsx: 4.23.12 - yaml: 2.9.0 - vitest@4.1.10(@types/node@26.2.0)(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)): + vitepress@1.6.4(@algolia/client-search@5.56.0)(@types/node@26.2.0)(change-case@5.4.4)(postcss@8.5.26)(search-insights@2.17.3)(typescript@6.0.3): + dependencies: + '@docsearch/css': 3.8.2 + '@docsearch/js': 3.8.2(@algolia/client-search@5.56.0)(search-insights@2.17.3) + '@iconify-json/simple-icons': 1.2.93 + '@shikijs/core': 2.5.0 + '@shikijs/transformers': 2.5.0 + '@shikijs/types': 2.5.0 + '@types/markdown-it': 14.1.2 + '@vitejs/plugin-vue': 5.2.4(vite@5.4.21(@types/node@26.2.0))(vue@3.5.41(typescript@6.0.3)) + '@vue/devtools-api': 7.7.10 + '@vue/shared': 3.5.41 + '@vueuse/core': 12.8.2(typescript@6.0.3) + '@vueuse/integrations': 12.8.2(change-case@5.4.4)(focus-trap@7.8.0)(typescript@6.0.3) + focus-trap: 7.8.0 + mark.js: 8.11.1 + minisearch: 7.2.0 + shiki: 2.5.0 + vite: 5.4.21(@types/node@26.2.0) + vue: 3.5.41(typescript@6.0.3) + optionalDependencies: + postcss: 8.5.26 + transitivePeerDependencies: + - '@algolia/client-search' + - '@types/node' + - '@types/react' + - async-validator + - axios + - change-case + - drauu + - fuse.js + - idb-keyval + - jwt-decode + - less + - lightningcss + - nprogress + - preact-render-to-string + - qrcode + - react + - react-dom + - sass + - sass-embedded + - search-insights + - sortablejs + - stylus + - sugarss + - terser + - typescript + - universal-cookie + + vitest@4.1.10(@types/node@26.2.0)(vite@5.4.21(@types/node@26.2.0)): dependencies: '@vitest/expect': 4.1.10 - '@vitest/mocker': 4.1.10(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) + '@vitest/mocker': 4.1.10(vite@5.4.21(@types/node@26.2.0)) '@vitest/pretty-format': 4.1.10 '@vitest/runner': 4.1.10 '@vitest/snapshot': 4.1.10 @@ -4195,7 +5464,7 @@ snapshots: tinyexec: 1.3.0 tinyglobby: 0.2.17 tinyrainbow: 3.1.1 - vite: 8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0) + vite: 5.4.21(@types/node@26.2.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 26.2.0 @@ -4214,6 +5483,16 @@ snapshots: transitivePeerDependencies: - supports-color + vue@3.5.41(typescript@6.0.3): + dependencies: + '@vue/compiler-dom': 3.5.41 + '@vue/compiler-sfc': 3.5.41 + '@vue/runtime-dom': 3.5.41 + '@vue/server-renderer': 3.5.41 + '@vue/shared': 3.5.41 + optionalDependencies: + typescript: 6.0.3 + web-worker@1.5.0: {} which@2.0.2: @@ -4238,43 +5517,43 @@ snapshots: yocto-queue@0.1.0: {} - yuku-ast@0.8.4: + yuku-ast@0.8.5: dependencies: - '@yuku-toolchain/types': 0.8.4 + '@yuku-toolchain/types': 0.8.5 - yuku-codegen@0.8.4: + yuku-codegen@0.8.5: dependencies: - '@yuku-toolchain/types': 0.8.4 + '@yuku-toolchain/types': 0.8.5 optionalDependencies: - '@yuku-codegen/binding-android-arm64': 0.8.4 - '@yuku-codegen/binding-darwin-arm64': 0.8.4 - '@yuku-codegen/binding-darwin-x64': 0.8.4 - '@yuku-codegen/binding-freebsd-x64': 0.8.4 - '@yuku-codegen/binding-linux-arm-gnu': 0.8.4 - '@yuku-codegen/binding-linux-arm-musl': 0.8.4 - '@yuku-codegen/binding-linux-arm64-gnu': 0.8.4 - '@yuku-codegen/binding-linux-arm64-musl': 0.8.4 - '@yuku-codegen/binding-linux-x64-gnu': 0.8.4 - '@yuku-codegen/binding-linux-x64-musl': 0.8.4 - '@yuku-codegen/binding-win32-arm64': 0.8.4 - '@yuku-codegen/binding-win32-x64': 0.8.4 - - yuku-parser@0.8.4: - dependencies: - '@yuku-toolchain/types': 0.8.4 - yuku-ast: 0.8.4 + '@yuku-codegen/binding-android-arm64': 0.8.5 + '@yuku-codegen/binding-darwin-arm64': 0.8.5 + '@yuku-codegen/binding-darwin-x64': 0.8.5 + '@yuku-codegen/binding-freebsd-x64': 0.8.5 + '@yuku-codegen/binding-linux-arm-gnu': 0.8.5 + '@yuku-codegen/binding-linux-arm-musl': 0.8.5 + '@yuku-codegen/binding-linux-arm64-gnu': 0.8.5 + '@yuku-codegen/binding-linux-arm64-musl': 0.8.5 + '@yuku-codegen/binding-linux-x64-gnu': 0.8.5 + '@yuku-codegen/binding-linux-x64-musl': 0.8.5 + '@yuku-codegen/binding-win32-arm64': 0.8.5 + '@yuku-codegen/binding-win32-x64': 0.8.5 + + yuku-parser@0.8.5: + dependencies: + '@yuku-toolchain/types': 0.8.5 + yuku-ast: 0.8.5 optionalDependencies: - '@yuku-parser/binding-android-arm64': 0.8.4 - '@yuku-parser/binding-darwin-arm64': 0.8.4 - '@yuku-parser/binding-darwin-x64': 0.8.4 - '@yuku-parser/binding-freebsd-x64': 0.8.4 - '@yuku-parser/binding-linux-arm-gnu': 0.8.4 - '@yuku-parser/binding-linux-arm-musl': 0.8.4 - '@yuku-parser/binding-linux-arm64-gnu': 0.8.4 - '@yuku-parser/binding-linux-arm64-musl': 0.8.4 - '@yuku-parser/binding-linux-x64-gnu': 0.8.4 - '@yuku-parser/binding-linux-x64-musl': 0.8.4 - '@yuku-parser/binding-win32-arm64': 0.8.4 - '@yuku-parser/binding-win32-x64': 0.8.4 + '@yuku-parser/binding-android-arm64': 0.8.5 + '@yuku-parser/binding-darwin-arm64': 0.8.5 + '@yuku-parser/binding-darwin-x64': 0.8.5 + '@yuku-parser/binding-freebsd-x64': 0.8.5 + '@yuku-parser/binding-linux-arm-gnu': 0.8.5 + '@yuku-parser/binding-linux-arm-musl': 0.8.5 + '@yuku-parser/binding-linux-arm64-gnu': 0.8.5 + '@yuku-parser/binding-linux-arm64-musl': 0.8.5 + '@yuku-parser/binding-linux-x64-gnu': 0.8.5 + '@yuku-parser/binding-linux-x64-musl': 0.8.5 + '@yuku-parser/binding-win32-arm64': 0.8.5 + '@yuku-parser/binding-win32-x64': 0.8.5 zwitch@2.0.4: {} From 9b340a6ce7cc88dff0cbc211bf12b1a90c8ffcd6 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Thu, 13 Aug 2026 22:46:51 +0800 Subject: [PATCH 046/106] chore(deps): remove unused @lonewolfyx/utils package and update pnpm workspace config - Removed @lonewolfyx/utils from devDependencies - Reorganized pnpm-workspace.yaml to only include allowBuilds section - Removed shellEmulator and trustPolicy configurations from workspace file --- package.json | 1 - pnpm-lock.yaml | 1761 +++++++----------------------------------------- 2 files changed, 244 insertions(+), 1518 deletions(-) diff --git a/package.json b/package.json index dd0bd1c..2d704fb 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,6 @@ "devDependencies": { "@antfu/eslint-config": "^9.3.0", "@lonewolfyx/tsconfig": "^0.0.6", - "@lonewolfyx/utils": "^0.0.5", "@types/node": "^26.2.0", "@types/semver": "^7.8.0", "dayjs": "^1.11.21", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0f9c632..1e268cc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -32,13 +32,10 @@ importers: devDependencies: '@antfu/eslint-config': specifier: ^9.3.0 - version: 9.3.0(@typescript-eslint/typescript-estree@8.67.0(typescript@6.0.3))(@typescript-eslint/utils@8.67.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(@vue/compiler-sfc@3.5.41)(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3)(vitest@4.1.10(@types/node@26.2.0)(vite@5.4.21(@types/node@26.2.0))) + version: 9.3.0(@typescript-eslint/typescript-estree@8.67.0(typescript@6.0.3))(@typescript-eslint/utils@8.67.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(@vue/compiler-sfc@3.5.41)(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3)(vitest@4.1.10(@types/node@26.2.0)(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))) '@lonewolfyx/tsconfig': specifier: ^0.0.6 version: 0.0.6(typescript@6.0.3) - '@lonewolfyx/utils': - specifier: ^0.0.5 - version: 0.0.5(@algolia/client-search@5.56.0)(@types/node@26.2.0)(change-case@5.4.4)(postcss@8.5.26)(search-insights@2.17.3)(typescript@6.0.3)(vue@3.5.41(typescript@6.0.3)) '@types/node': specifier: ^26.2.0 version: 26.2.0 @@ -80,86 +77,10 @@ importers: version: 0.0.1 vitest: specifier: ^4.1.10 - version: 4.1.10(@types/node@26.2.0)(vite@5.4.21(@types/node@26.2.0)) + version: 4.1.10(@types/node@26.2.0)(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) packages: - '@algolia/abtesting@1.22.0': - resolution: {integrity: sha512-BFR6zNowNKcY7Ou7TaJc9QWexES4YKPbmf/OTFofpdsdhz4x6q0lbxp3duO0EHnyrN7rE4ba/TSXuY+BDGu4+g==} - engines: {node: '>= 14.0.0'} - - '@algolia/autocomplete-core@1.17.7': - resolution: {integrity: sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==} - - '@algolia/autocomplete-plugin-algolia-insights@1.17.7': - resolution: {integrity: sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==} - peerDependencies: - search-insights: '>= 1 < 3' - - '@algolia/autocomplete-preset-algolia@1.17.7': - resolution: {integrity: sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==} - peerDependencies: - '@algolia/client-search': '>= 4.9.1 < 6' - algoliasearch: '>= 4.9.1 < 6' - - '@algolia/autocomplete-shared@1.17.7': - resolution: {integrity: sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==} - peerDependencies: - '@algolia/client-search': '>= 4.9.1 < 6' - algoliasearch: '>= 4.9.1 < 6' - - '@algolia/client-abtesting@5.56.0': - resolution: {integrity: sha512-7r4Z3NC7yU1oAQVWJNA2HX7tX481F3pJvCGyLIXiTdBcthz4Q/o21jwcMYDFkuI92UWTNBQQmHYgwHo1zS5dzg==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-analytics@5.56.0': - resolution: {integrity: sha512-avmjXQSq+jadFO8Xl2em05/uQdQnEmHsJyOAdVbZkmVgpMfxL12aJwVVfGNwYr9nulcpuJN1X0lTaQ5wxuNGcA==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-common@5.56.0': - resolution: {integrity: sha512-v2TPStUhY//ripPjIVclZ8AWc7DEGooXULZGFlFu37zNatgHjw34oZZ+OSbbc/YHO+xZwPl62I1k8xH1m4S2eg==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-insights@5.56.0': - resolution: {integrity: sha512-P0ehROpM4Sem3Sqo5x2cKPgj67D3G3jy0rh1Amwkcvsfr6tkvIcdCmerieanqTF7NxUMPNFLkpIFeMO8Rpa50w==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-personalization@5.56.0': - resolution: {integrity: sha512-SXK3Vn3WVxyzbm31oePZBJkp1wpOyuWdd4B/Pv7n0aXDxmeSWhC1R1FC1517mMrFAIaPH4Rt0x6RUe7ZNjz8FA==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-query-suggestions@5.56.0': - resolution: {integrity: sha512-5+ZdX8garFnmycnZgKhtXHePEaLj5zqDxI/0lkhhluzCcvTn0/PvvTirTg8hHYetQHvn7GDyeAiqTAieMvMW4A==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-search@5.56.0': - resolution: {integrity: sha512-+mKUdYvqOi0BcvpAEyCEw49vSBptufIcfibtHz2bdr1pI789M46Yt0uQEk/sxtK3teh71OQvVFHaTDzShUWewQ==} - engines: {node: '>= 14.0.0'} - - '@algolia/ingestion@1.56.0': - resolution: {integrity: sha512-9g/zj+AZx5moFcdFIrYQoVrueXivjUcc3MQHtCYT8WhIuk1lUh1AyEhvJCS0XBZld09cLvd1AZ3BvDBpVpX2UA==} - engines: {node: '>= 14.0.0'} - - '@algolia/monitoring@1.56.0': - resolution: {integrity: sha512-Qf3Sr6f9A9uxCZUf3MXS0d2b877uYzEB5yxqpVGXAhcJnBCQjrRRon0KvefpGkxy+BshrIJs96OUoMtGqXTFDA==} - engines: {node: '>= 14.0.0'} - - '@algolia/recommend@5.56.0': - resolution: {integrity: sha512-GXWG1rWc5wu8hY4N33Y3b6ernY6sAdAvmKWN/zHAiACOx40WnpG0TVX5YazCAr/9gOYGInSiM2A0y2jy2xbiDA==} - engines: {node: '>= 14.0.0'} - - '@algolia/requester-browser-xhr@5.56.0': - resolution: {integrity: sha512-7t24cBxaInS3mZb7ddEaZT/tp6q+/aR4YttsQVyP1/i+LmwPR34atO35KjaLFCcRVrlP7sYOAqkCfg6lIRB+ew==} - engines: {node: '>= 14.0.0'} - - '@algolia/requester-fetch@5.56.0': - resolution: {integrity: sha512-R7ePHgVYmDFjZpvrsVAfbDz/d4RxKAYZ5/vgLfIsCVRZRryjWl/3INOxpOICzitehQ5FjNtNjcLQTrmHPTcHBQ==} - engines: {node: '>= 14.0.0'} - - '@algolia/requester-node-http@5.56.0': - resolution: {integrity: sha512-PIOUXlSnrqM0S+WOgDRb4RzotydJH7ZoT6tOyL7tAO7qJOfvX5wsEW8Pe+PMKMwvuI4/gIyK9cg2H7lJXqnc4Q==} - engines: {node: '>= 14.0.0'} - '@antfu/eslint-config@9.3.0': resolution: {integrity: sha512-+CIC4G6MowUl1RHiT01Ah9Obo/wwVynw7uNlN8ODwEn2opo9W1KzaatCrmu4WhGGJjOkOkyT5w7kKfQ//agHrQ==} hasBin: true @@ -252,29 +173,6 @@ packages: resolution: {integrity: sha512-y7/yvZ2TPAnR9+jnc00klvNNLkJiXFFrQA/hlLCcxA9a2A4zQIOimyFQ9XfwYKiGD1fb5GY8vbKIIgO8d5Tb2A==} engines: {node: '>= 20.12.0'} - '@docsearch/css@3.8.2': - resolution: {integrity: sha512-y05ayQFyUmCXze79+56v/4HpycYF3uFqB78pLPrSV5ZKAlDuIAAJNhaRi8tTdRNXh05yxX/TyNnzD6LwSM89vQ==} - - '@docsearch/js@3.8.2': - resolution: {integrity: sha512-Q5wY66qHn0SwA7Taa0aDbHiJvaFJLOJyHmooQ7y8hlwwQLQ/5WwCcoX0g7ii04Qi2DJlHsd0XXzJ8Ypw9+9YmQ==} - - '@docsearch/react@3.8.2': - resolution: {integrity: sha512-xCRrJQlTt8N9GU0DG4ptwHRkfnSnD/YpdeaXe02iKfqs97TkZJv60yE+1eq/tjPcVnTW8dP5qLP7itifFVV5eg==} - peerDependencies: - '@types/react': '>= 16.8.0 < 19.0.0' - react: '>= 16.8.0 < 19.0.0' - react-dom: '>= 16.8.0 < 19.0.0' - search-insights: '>= 1 < 3' - peerDependenciesMeta: - '@types/react': - optional: true - react: - optional: true - react-dom: - optional: true - search-insights: - optional: true - '@e18e/eslint-plugin@0.6.0': resolution: {integrity: sha512-JQkeXoZA12f9WM2H4t4IobIRqlPvYLeNAjZF6raFu2vmD5YoyuzKmwsLZNJ4g/39c3v1Se2ad3o+oq4y2et/RA==} peerDependencies: @@ -298,204 +196,102 @@ packages: resolution: {integrity: sha512-Q9hjxWI5xBM+qW2enxfe8wDKdFWMfd0Z29k5ZJnuBqD/CasY5Zryj09aCA6owbGATWz+39p5uIdaHXpopOcG8g==} engines: {node: '>=10'} - '@esbuild/aix-ppc64@0.21.5': - resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - '@esbuild/aix-ppc64@0.28.2': resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.21.5': - resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm64@0.28.2': resolution: {integrity: sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.21.5': - resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - '@esbuild/android-arm@0.28.2': resolution: {integrity: sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.21.5': - resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - '@esbuild/android-x64@0.28.2': resolution: {integrity: sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.21.5': - resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-arm64@0.28.2': resolution: {integrity: sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.21.5': - resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - '@esbuild/darwin-x64@0.28.2': resolution: {integrity: sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.21.5': - resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-arm64@0.28.2': resolution: {integrity: sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.21.5': - resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - '@esbuild/freebsd-x64@0.28.2': resolution: {integrity: sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.21.5': - resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm64@0.28.2': resolution: {integrity: sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.21.5': - resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - '@esbuild/linux-arm@0.28.2': resolution: {integrity: sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.21.5': - resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-ia32@0.28.2': resolution: {integrity: sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.21.5': - resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-loong64@0.28.2': resolution: {integrity: sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.21.5': - resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-mips64el@0.28.2': resolution: {integrity: sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.21.5': - resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-ppc64@0.28.2': resolution: {integrity: sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.21.5': - resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-riscv64@0.28.2': resolution: {integrity: sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.21.5': - resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-s390x@0.28.2': resolution: {integrity: sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.21.5': - resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - '@esbuild/linux-x64@0.28.2': resolution: {integrity: sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==} engines: {node: '>=18'} @@ -508,12 +304,6 @@ packages: cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.21.5': - resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - '@esbuild/netbsd-x64@0.28.2': resolution: {integrity: sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==} engines: {node: '>=18'} @@ -526,12 +316,6 @@ packages: cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.21.5': - resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - '@esbuild/openbsd-x64@0.28.2': resolution: {integrity: sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==} engines: {node: '>=18'} @@ -544,48 +328,24 @@ packages: cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.21.5': - resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - '@esbuild/sunos-x64@0.28.2': resolution: {integrity: sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.21.5': - resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-arm64@0.28.2': resolution: {integrity: sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.21.5': - resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-ia32@0.28.2': resolution: {integrity: sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.21.5': - resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - '@esbuild/win32-x64@0.28.2': resolution: {integrity: sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==} engines: {node: '>=18'} @@ -669,17 +429,6 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} - '@iconify-json/simple-icons@1.2.93': - resolution: {integrity: sha512-/XhANjfGYOuqvSR3TmUnkQkINvQ4GVjVuukvymRbxtVFBvIq/yiXJqCDycKcQPT401OYT9H2vIY6ihAlz1QIAw==} - - '@iconify/types@2.0.0': - resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} - - '@iconify/vue@5.0.1': - resolution: {integrity: sha512-aumwwooJlFJ5H5qYWB6ZTAyM0C8hpfcSVLB9/a3qnH1GGvIJ+FEbpEs4s/HfErYe/M5qZeLjwmESR5fFm3lXEw==} - peerDependencies: - vue: '>=3.0.0' - '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} @@ -688,22 +437,12 @@ packages: peerDependencies: typescript: ^5.8.2 - '@lonewolfyx/utils@0.0.5': - resolution: {integrity: sha512-y5/Znkg6puA9bhiesQzS5Nlup4NwyILqYZhwvsoRbRG/RJDA3XKXzdkknX6SP3y1KmwwRpZRtIru4qQa+kRQ7w==} - - '@napi-rs/lzma-linux-x64-gnu@1.5.1': - resolution: {integrity: sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==} - engines: {node: ^22.20 || ^24.12 || >=25} - cpu: [x64] - os: [linux] - libc: [glibc] - '@ota-meshi/ast-token-store@0.3.0': resolution: {integrity: sha512-XRO0zi2NIUKq2lUk3T1ecFSld1fMWRKE6naRFGkgkdeosx7IslyUKNv5Dcb5PJTja9tHJoFu0v/7yEpAkrkrTg==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@oxc-project/types@0.143.0': - resolution: {integrity: sha512-u6JZdLBTLotrNC9Vd6vPssINdzcCzleKAH6EJKImQb7GtYvX5keN2dxkoK44stCc4tffE6QQRtZTXVSzsLUlWA==} + '@oxc-project/types@0.144.0': + resolution: {integrity: sha512-nuhZIOLuI6TFQ32I/WnUx+SCPY7SdSKwgnFHydAuoS1+Z4BRcaP+RRJmGzl9lw+0OFF7UmaESf7KQRXaNLHypg==} '@pkgr/core@0.3.6': resolution: {integrity: sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA==} @@ -712,92 +451,92 @@ packages: '@quansync/fs@1.0.0': resolution: {integrity: sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ==} - '@rolldown/binding-android-arm64@1.2.3': - resolution: {integrity: sha512-zrJtHDcaZJ1Fp7xf4hNl+7seH9Cn/N5TwLYkhgXREtBwAd/jaqW3uqeHxpDugJLVICWg4eW44kOQEGJ1r6jCGw==} + '@rolldown/binding-android-arm64@1.2.4': + resolution: {integrity: sha512-jHC2cnyKz5xU2fhECtFl8OZ83cYNt13GZQD+0uMJ/X3o+ijmd56okHhTUwxVSHPx1IRVIJEZ1/1pPzeLCU6XKA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.2.3': - resolution: {integrity: sha512-ieIiibVCp0tX7TLu2cafoNPv8wJyYi01ekXpbf8q2j7F4rGAhhXb/eQh7ge9DRBY78GwmRQtvjZDux7EDbA8kA==} + '@rolldown/binding-darwin-arm64@1.2.4': + resolution: {integrity: sha512-Dc5mPD8F5F/FS8i01syd7FTF6yB2fVthH/TRkjwJkzUK6EpoxHtqvZQP5Zwq80/5z19TWYHIg1KOHboCgVx/aQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.2.3': - resolution: {integrity: sha512-Zh9tCon19eDXJoihx0rqKhMUlMYqzwj3aPsSuHmI4RWZh62dWUL+DJN4C5YQya5TcQBJU/Fe8+rY0jhXTQITqA==} + '@rolldown/binding-darwin-x64@1.2.4': + resolution: {integrity: sha512-fpDm4oBo6SqLvWUYCmFhdde3U9KH2fRNNMeAnAPAIwxRL345xutL0EtEUcuoxsoazdJGv/MuDBQHlCDrtbvqOg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.2.3': - resolution: {integrity: sha512-nGbJWewA1wrXXZiQhjAT5rhibGfns5ZNkDVqxsO6zJ3f3YvpoDNNmGMSbbhLuXKjNScaBJVOAboztAWVespQMg==} + '@rolldown/binding-freebsd-x64@1.2.4': + resolution: {integrity: sha512-rSJoreDE/HoIzoaib6MTp5jQtCTdMHKIvItAKT/ImS6Y6Ww76oUaeMyp4Vc/fAgd/ehji068IxetHXAnqUwN9A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.2.3': - resolution: {integrity: sha512-QNniJr5Kml0kDEB98jiDOJjXNroxIIi0IXIbdYzY26Xt1pVbeP62+KnoIZLwirOymX/0jDk/2gI/bNUv7A7OIw==} + '@rolldown/binding-linux-arm-gnueabihf@1.2.4': + resolution: {integrity: sha512-/jm8OGHgn7oGaJu3i/qZI9spUGcJ+y/lk43ttQ/iO1tOd9NissG6o97bighBCiL+BKRngmcDuR6ikfwYdJmVuQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.2.3': - resolution: {integrity: sha512-TkqEAcmmvH3I/q4114NB4RVt6241Dao48pF45uLcFGrwAaIn0iITgTAKP/dLjbN0R4buJjGb91+UHSoFmpgIWw==} + '@rolldown/binding-linux-arm64-gnu@1.2.4': + resolution: {integrity: sha512-tIP06BeD9EqvECBrPZ+sqdPlYrT+aYaAiu1wYziVx5elRK/ftm33JxVDy2bXGbr6J0CrtirCkR87/X5a2euEng==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-musl@1.2.3': - resolution: {integrity: sha512-NHqjnxpsndf4MPymxteFAWHHfkTL8HjWh1KB7z23ofZ6QO2euONuxDXjat69dKZRALnGypg8k8SsK8vZJoXv1Q==} + '@rolldown/binding-linux-arm64-musl@1.2.4': + resolution: {integrity: sha512-Ql1Q0EQqVThvn9VAVlwNzsUvbSFtCMGjLpRRi4pk5i7NZZ4n5ISiLMjHYtus4VQ2PvkSw24zyaCVsiS+sXPj1w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@rolldown/binding-linux-ppc64-gnu@1.2.3': - resolution: {integrity: sha512-6tbrbwfz5GB9DQ4Jwo6hy9v+vR31xZlvzZ6n5Xut6Hhx5PvrA9q/HsK8KMaYQp063iqZGXwNvZtYNLD7EM/x0w==} + '@rolldown/binding-linux-ppc64-gnu@1.2.4': + resolution: {integrity: sha512-GjbjXD4XXfN19D0LZNbmiCBUoDiRACsYHr0yaIbbn8aFsXjHZifcYqu/W5Er5X2X990WjHXFrxarn5chzItorQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.2.3': - resolution: {integrity: sha512-oyuXxXmoZHjXC917IAPFAAv4wWAa0cM9afk8nx1+9/jNNOX1uPf8yDA6p7G0RypOfw/X0PQt5IfoquY1um+zSg==} + '@rolldown/binding-linux-s390x-gnu@1.2.4': + resolution: {integrity: sha512-p5WR0NOwaRmJ/B1b6IjEFLLivwEsf3PrdBIhRbhTCQisbo2SvHHpG4ELB/+FgQNnB88LTOF86upmJmbvZdQ2lw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.2.3': - resolution: {integrity: sha512-TytMwF2KVGqP2tgd0I1OY0PAv78dZRAYcF5ssDzjM34SUXCED3uXvSd5+lHoC0bTD6eEdFz7LdQNCO1y0oVk9w==} + '@rolldown/binding-linux-x64-gnu@1.2.4': + resolution: {integrity: sha512-4/GyVjmhR+Tc6HLJvwc1sOhPqAZtySiSMesOZyX6JQ5XBxoTDEMKQzvo07NIK6nTon/SivlZqvhzvuVBNQhObQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-musl@1.2.3': - resolution: {integrity: sha512-/E9m3qstrJFVPoULV25mVQblSNExY2+kBsYe4sy0Tn0yOOgJ8wZbZt3KnRbF/XeU2Gl1STKUQnDNTqhIE5MD4A==} + '@rolldown/binding-linux-x64-musl@1.2.4': + resolution: {integrity: sha512-l9eeLsCNvPpmSXUej0etw/J1eqV0Jj1D5G/xG6YTijmE6dkv6E2QezgWbTfQk63v952DPqrjOCoiqxq7Bw0YUQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@rolldown/binding-openharmony-arm64@1.2.3': - resolution: {integrity: sha512-Kr0OcsoQI816i6HOl3vFHpd1K0eZyh76zgfj4c1nTyaTsd5r2Mj1lwM4R90y/qaCfmTn9eHy0SKwi98eitRxug==} + '@rolldown/binding-openharmony-arm64@1.2.4': + resolution: {integrity: sha512-e0F355MSTMm3+UOqtV3L24gFUp2N5m1f8L/7d56deik6va+AXdrt9F8LbzGpeWGWRbZEDq4m8NVnJDeBtf9DZg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-win32-arm64-msvc@1.2.3': - resolution: {integrity: sha512-hOtMwTqnME+/gJcH/PCZ0wn0zPUjiWOgkHpxbSJpfGKMezHltx1S7/k1SitzVa7Ww2cqrDDaFbZEhcJZO8o+Jw==} + '@rolldown/binding-win32-arm64-msvc@1.2.4': + resolution: {integrity: sha512-AWLi0uBRYh6QlE7OKhiz+phZC0qwtij2QZmhmOdsLdFn64m7oMpooE9ICE3lhm9xMb4SpDo2WbHcxX1iFLFtqw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.2.3': - resolution: {integrity: sha512-ekcqMMkI2PlhYnfzQnB/cEdYUVVJViWvoUyLrbzgDoi3Snfc1mVBwdnc306ufA5ejy8JSPjT2RlW1nQSjW7efg==} + '@rolldown/binding-win32-x64-msvc@1.2.4': + resolution: {integrity: sha512-UwSDJOg3dqCAejWdxclJjCsh3Qq4vLYMDxmyHqo1btz3stK2VqgwNd3mm5tuIwzSlGIQ/1H9Hr+Zn09mrezNqQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -805,168 +544,6 @@ packages: '@rolldown/pluginutils@1.0.1': resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} - '@rollup/rollup-android-arm-eabi@4.62.4': - resolution: {integrity: sha512-RrPokAb7dmbxFoeO3TloqHyOjgye8RkBhSqmp4aJMIex4c9r46ZstPnleDQOq1t46VOVjwIuwNogIqbodV1Vvg==} - cpu: [arm] - os: [android] - - '@rollup/rollup-android-arm64@4.62.4': - resolution: {integrity: sha512-JKuJc+pnpks2pjy7L/N3v/cAkZxYlnmuZoD840ldbMI5KDbC4iO9NKwPKYdjYFCMAIIlBzYSFHxIJVYzRo2/8A==} - cpu: [arm64] - os: [android] - - '@rollup/rollup-darwin-arm64@4.62.4': - resolution: {integrity: sha512-krw5uS2STmvJ02x0uTXHbqQNuz+9eZ1iw+qXk9dmW2gvV4jV7O2hEoOnuhFrpOPiel1mBFtqbxYZZtC46hXLOw==} - cpu: [arm64] - os: [darwin] - - '@rollup/rollup-darwin-x64@4.62.4': - resolution: {integrity: sha512-wsTxtgApb4PrOsNJIm0FZ1h3WvCC+k9uxLJ4ad75hgoS4NiRes2SoJFlDAyMwiUY8IssDqGcHbXuN0sx1tfF1A==} - cpu: [x64] - os: [darwin] - - '@rollup/rollup-freebsd-arm64@4.62.4': - resolution: {integrity: sha512-GUOnQlyZe3yAXhWOtOMsn5Qkrv5E5mZXa0thbARWi5Ei2szlVXJFQhddZ4HbAzh8q92w5twp+CQvs/eFanz9YQ==} - cpu: [arm64] - os: [freebsd] - - '@rollup/rollup-freebsd-x64@4.62.4': - resolution: {integrity: sha512-/Y7f3QuxjzPKsjA/rfEDa3+0vXqyjmJ50Ln8dPpCmWkKTrUoWHG1cWhTqaAMLob2m2nESWuC7yGrREz019Ztqg==} - cpu: [x64] - os: [freebsd] - - '@rollup/rollup-linux-arm-gnueabihf@4.62.4': - resolution: {integrity: sha512-81wiiX3v7aqy+T+bT61TJ78yJjRquqFFTTbAPt08imfQQzkPIW8t6aJbkTagtCCrXMNc9D66+geqlK7ydLPNqA==} - cpu: [arm] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-arm-musleabihf@4.62.4': - resolution: {integrity: sha512-9kmDIvNZqdoHOBZgNtpTBeLWYO/LVipM3H/j62P8848/l/VPEQL6N3uxU9pvP1oZAsXyC2MEnFP3ovRjo7WYNQ==} - cpu: [arm] - os: [linux] - libc: [musl] - - '@rollup/rollup-linux-arm64-gnu@4.62.4': - resolution: {integrity: sha512-CcnXHWnXg69g+DX5VWL3FHts3qMRN2uVEHX+BZvGLdd07/gXkn3ePjYtO1LDJvxkGKVHMclKBRa1QUTH+6toYQ==} - cpu: [arm64] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-arm64-musl@4.62.4': - resolution: {integrity: sha512-iFOibiHnTRuhrWLlRsOQFdZJJIa7S8OwkneJr4ocALP16u5yk6lWLINFwhHaEqBFMsKDUZofLkGos7+CPzGB3g==} - cpu: [arm64] - os: [linux] - libc: [musl] - - '@rollup/rollup-linux-loong64-gnu@4.62.4': - resolution: {integrity: sha512-XnWYMI7euHlb5a871xPja+Gm7DRCFU+FGRrtS2sMq9N8FvqtpagUy6gD4YOemC5MRk9xbh8+jYMEJbigFQwsgA==} - cpu: [loong64] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-loong64-musl@4.62.4': - resolution: {integrity: sha512-qGDAlO0U8xedCcsdRm9oaoQY8DAx/QT7uIxJWhCdx0ceIWX783UC9QSYkdpzAe29wNiVfp24+bZdQmn49o45SQ==} - cpu: [loong64] - os: [linux] - libc: [musl] - - '@rollup/rollup-linux-ppc64-gnu@4.62.4': - resolution: {integrity: sha512-ru4H6ezD7ysA5EiEK6qkkaEb4modH8CTej6kUy/gQi20u3kB3G7Zn8snXXkeJSCOFKG/rbPPtM/+9Wgas1961w==} - cpu: [ppc64] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-ppc64-musl@4.62.4': - resolution: {integrity: sha512-2W4MO5WQVJnbJaZdvDb9rhBDuFU1nKIepPFpJUBsTh2k1YY2g+ODViaWuyOAjQ5cOP7NvrvLzt3wvHOoiAvc7w==} - cpu: [ppc64] - os: [linux] - libc: [musl] - - '@rollup/rollup-linux-riscv64-gnu@4.62.4': - resolution: {integrity: sha512-+fxjfuoAmVMCYV5QyjoIpu0cp5DOiOTeqYFk1AVaxGr+/ravWLX89XfQmptsoWcaVy/TGf2hexzbUOrCQIL1CQ==} - cpu: [riscv64] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-riscv64-musl@4.62.4': - resolution: {integrity: sha512-jTn8JfHGL4djjFxPuM06LmNUJDsst2jeVlsd9OmIH6zc5sC9K6rIuO4YajXatLUpBmBKl6b35ro1QZocLi+tcA==} - cpu: [riscv64] - os: [linux] - libc: [musl] - - '@rollup/rollup-linux-s390x-gnu@4.62.4': - resolution: {integrity: sha512-oCJCJL4pXsoDcP2QZ+JVlPTIRc6266zsIaeJJsWImmF7HO0W8nb6HuSgZlMWxJwaPf8ehbSw8yo0EUw925hKsA==} - cpu: [s390x] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-x64-gnu@4.62.4': - resolution: {integrity: sha512-W69hukhZ3KKNRCaMIEzKvcFye42hh0FE1+YoYaf5+Ikacuftoco6yO/xouz0hc5d5W/s3yBro5jRiuEE/Q5vUw==} - cpu: [x64] - os: [linux] - libc: [glibc] - - '@rollup/rollup-linux-x64-musl@4.62.4': - resolution: {integrity: sha512-qiXbGG2jkjXhzXpsFZSR2Xpb8DN/UaxYsbb/STbuR/6fpaDgRmmaq1B/LmtF2wQFOFOSsK2jdE0RZ3a0zHn4QA==} - cpu: [x64] - os: [linux] - libc: [musl] - - '@rollup/rollup-openbsd-x64@4.62.4': - resolution: {integrity: sha512-nWeM//hxv8mIo6jD7Hu4o48DVmV9pbV6gsKaWU+4NFyqHoPKwrkRiZGLKUhOBk8qNmDmpwFtPKg80Bo/Tn4xiQ==} - cpu: [x64] - os: [openbsd] - - '@rollup/rollup-openharmony-arm64@4.62.4': - resolution: {integrity: sha512-s62SQ/vgsRSvMwDkOEfTqfgASF0f26ZNaQuTA6Aok5lrikf89yI2W0gFHvZb2Jpgc6N8JnOKZgCK2iciO3CsxQ==} - cpu: [arm64] - os: [openharmony] - - '@rollup/rollup-win32-arm64-msvc@4.62.4': - resolution: {integrity: sha512-J6wGf8TVGbXJq+HH+ttTvrcfNKPbuZecV6KT1B8I18BC5IURUh5kl4Yl5OEP5eFIUoI5BWxCsyYMhFsDx8kekw==} - cpu: [arm64] - os: [win32] - - '@rollup/rollup-win32-ia32-msvc@4.62.4': - resolution: {integrity: sha512-zmfrQd/0wu6oJs8Vq8KwY/YtsKSsLtKe/HwAP4Wqy8LhWjeT55fHRAkOhYQ12wI3ayS4Tt12d5CDRD7N96SAYQ==} - cpu: [ia32] - os: [win32] - - '@rollup/rollup-win32-x64-gnu@4.62.4': - resolution: {integrity: sha512-qPzHqdj9rfUD+w79dtE07zi/kFwKyCJqplp5K5ygeLTp7jLpAoc16OAH39HSmRC9UpozaecsleI8uAdEj6v2yw==} - cpu: [x64] - os: [win32] - - '@rollup/rollup-win32-x64-msvc@4.62.4': - resolution: {integrity: sha512-zD6NdeWEByGE9QF9vCrlJ5YQB4oq9q91kPZS37Jwj5hOkvR1lTBSpsKhKDw4IJtbQ35LsTS1HD9DZYGKIshU1Q==} - cpu: [x64] - os: [win32] - - '@shikijs/core@2.5.0': - resolution: {integrity: sha512-uu/8RExTKtavlpH7XqnVYBrfBkUc20ngXiX9NSrBhOVZYv/7XQRKUyhtkeflY5QsxC0GbJThCerruZfsUaSldg==} - - '@shikijs/engine-javascript@2.5.0': - resolution: {integrity: sha512-VjnOpnQf8WuCEZtNUdjjwGUbtAVKuZkVQ/5cHy/tojVVRIRtlWMYVjyWhxOmIq05AlSOv72z7hRNRGVBgQOl0w==} - - '@shikijs/engine-oniguruma@2.5.0': - resolution: {integrity: sha512-pGd1wRATzbo/uatrCIILlAdFVKdxImWJGQ5rFiB5VZi2ve5xj3Ax9jny8QvkaV93btQEwR/rSz5ERFpC5mKNIw==} - - '@shikijs/langs@2.5.0': - resolution: {integrity: sha512-Qfrrt5OsNH5R+5tJ/3uYBBZv3SuGmnRPejV9IlIbFH3HTGLDlkqgHymAlzklVmKBjAaVmkPkyikAV/sQ1wSL+w==} - - '@shikijs/themes@2.5.0': - resolution: {integrity: sha512-wGrk+R8tJnO0VMzmUExHR+QdSaPUl/NKs+a4cQQRWyoc3YFbUzuLEi/KWK1hj+8BfHRKm2jNhhJck1dfstJpiw==} - - '@shikijs/transformers@2.5.0': - resolution: {integrity: sha512-SI494W5X60CaUwgi8u4q4m4s3YAFSxln3tzNjOSYqq54wlVgz0/NbbXEb3mdLbqMBztcmS7bVTaEd2w0qMmfeg==} - - '@shikijs/types@2.5.0': - resolution: {integrity: sha512-ygl5yhxki9ZLNuNpPitBWvcy9fsSKKaRuO4BAlMyagszQidxcpLAr0qiW/q43DtSIDxO6hEbtYLiFZNXO/hdGw==} - - '@shikijs/vscode-textmate@10.0.2': - resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} - '@sindresorhus/base62@1.0.0': resolution: {integrity: sha512-TeheYy0ILzBEI/CO55CP6zJCSdSWeRtGnHy8U8dWSUH4I68iqTsy7HkMktR4xakThc9jotkPQUXT4ITdbV7cHA==} engines: {node: '>=18'} @@ -1004,18 +581,9 @@ packages: '@types/katex@0.16.8': resolution: {integrity: sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg==} - '@types/linkify-it@5.0.0': - resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} - - '@types/markdown-it@14.1.2': - resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} - '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} - '@types/mdurl@2.0.0': - resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} - '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} @@ -1028,9 +596,6 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} - '@types/web-bluetooth@0.0.21': - resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} - '@typescript-eslint/eslint-plugin@8.67.0': resolution: {integrity: sha512-Un7Heoyj65NREbKAyIrFxeM143NZpExWmy1Nep4DLeQOeLlTeumPjoNKnBrU5D5moWXbPJgRa5Uwcdu0faVNGQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1090,16 +655,6 @@ packages: resolution: {integrity: sha512-fkv8dHRDqfGtTHuJeebdrQ7cX6Ad4WAS00rgHh9UGvMycF1mjBfsxry1XsLIFhWZ6Judlh6UdzK+TYlbpCXgnA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@ungap/structured-clone@1.3.3': - resolution: {integrity: sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==} - - '@vitejs/plugin-vue@5.2.4': - resolution: {integrity: sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==} - engines: {node: ^18.0.0 || >=20.0.0} - peerDependencies: - vite: ^5.0.0 || ^6.0.0 - vue: ^3.2.25 - '@vitest/eslint-plugin@1.6.27': resolution: {integrity: sha512-X1RCAfwbatG4GFbJ/1PIHP9MSZMt0JJThqbYID+vS4L783k6QGlLPe421wQE8dHXuGCcenVLsydiM4qzsYWxhg==} engines: {node: '>=18'} @@ -1157,80 +712,9 @@ packages: '@vue/compiler-ssr@3.5.41': resolution: {integrity: sha512-U3v5OejKEGqOI0Wy0+Sz7hGuIFZHA4LSXzrNM3IMIeDyJEBBfTpX26n3SDgToRpP2bLc9FfI2j/kSgcJ8Emq5A==} - '@vue/devtools-api@7.7.10': - resolution: {integrity: sha512-KxtEpUOOpFz/qOGRrAwA36QF7DqIA+FXgCYit9mk9wjbaZt0sXOFz81ElOZtKA4HbWHUdwNjZHBFsFFyp5BZiA==} - - '@vue/devtools-kit@7.7.10': - resolution: {integrity: sha512-3WNi2Kq4tbpVbmhml7RiphmAt0279oh3fKNeWMQIrltfX8Q91b4i5PL8DtyNKdwmcsGrV4fg+erwWOmD05CLIw==} - - '@vue/devtools-shared@7.7.10': - resolution: {integrity: sha512-wOPslzB8vTvpxwdaOcR2qAbwmuSP0L+rhpoC6Cf56V3Jip+HWb7PQQXOUPgBNQARpXsbQX/+mvi8kKucmBGRwQ==} - - '@vue/reactivity@3.5.41': - resolution: {integrity: sha512-rznsqKM0np0x18EjzF8x88MpEhdNsffbvFbckLL5+oUKz1BxAImEmO7J1ArRYSyo6aQaVoBDp7jEkT91OOxydA==} - - '@vue/runtime-core@3.5.41': - resolution: {integrity: sha512-Vcry58hiAKwGen9Z1jUZE0feFsNArPCMOImYI8el48A9Idf6DuQYD0U05zZIF2Iad1hGhPSvcbBbAOhNr55fhg==} - - '@vue/runtime-dom@3.5.41': - resolution: {integrity: sha512-3vVBahVBS9+U6cmXBLyb8nE6/yYo4J/CGI9eVFs3KiMc0YHuudwKyShTD65jtJy/L9PUUxNAFu4cj4LiJ0UFbw==} - - '@vue/server-renderer@3.5.41': - resolution: {integrity: sha512-n6hx/pNFfbD6SuyeuMVkvqox8bwf/ET9JlA/kAz/imw8sw++wkqKe2mHX5KutjPpbKE4Z56yTHszoOjGMI9igQ==} - '@vue/shared@3.5.41': resolution: {integrity: sha512-IOnwSCma8j+9xJT6b8H0dEYidC80NsYmNMlZxRsukYcSoGaDBohog5hDxzeUXdFeGWFA++vWvxqOmrr96VlqMA==} - '@vueuse/core@12.8.2': - resolution: {integrity: sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==} - - '@vueuse/integrations@12.8.2': - resolution: {integrity: sha512-fbGYivgK5uBTRt7p5F3zy6VrETlV9RtZjBqd1/HxGdjdckBgBM4ugP8LHpjolqTj14TXTxSK1ZfgPbHYyGuH7g==} - peerDependencies: - async-validator: ^4 - axios: ^1 - change-case: ^5 - drauu: ^0.4 - focus-trap: ^7 - fuse.js: ^7 - idb-keyval: ^6 - jwt-decode: ^4 - nprogress: ^0.2 - qrcode: ^1.5 - sortablejs: ^1 - universal-cookie: ^7 - peerDependenciesMeta: - async-validator: - optional: true - axios: - optional: true - change-case: - optional: true - drauu: - optional: true - focus-trap: - optional: true - fuse.js: - optional: true - idb-keyval: - optional: true - jwt-decode: - optional: true - nprogress: - optional: true - qrcode: - optional: true - sortablejs: - optional: true - universal-cookie: - optional: true - - '@vueuse/metadata@12.8.2': - resolution: {integrity: sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==} - - '@vueuse/shared@12.8.2': - resolution: {integrity: sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==} - '@yuku-codegen/binding-android-arm64@0.8.5': resolution: {integrity: sha512-+oEBxK35kdbskhxozjZhI8N6qrMOfphpIkXnqBj6N2DC08rdkg10MUMRNKZLBNU6uNyoYiLcLyCE6aFV2sfMKw==} cpu: [arm64] @@ -1379,10 +863,6 @@ packages: ajv@6.15.0: resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} - algoliasearch@5.56.0: - resolution: {integrity: sha512-PrqppUmhT4ENdas2pH9caE7efUcxy6EcSFhWzosiVuQBzu2tQ5yLTI6jwomT/1cuBnivzGfxiJCqDNN9FRRh+Q==} - engines: {node: '>= 14.0.0'} - ansis@4.3.1: resolution: {integrity: sha512-BJ8/l4R5LRE7hW9WdSuGYrLSHi2ynxeFpDFbH0K/CgNeY/tyhk+vO6TYxXC5r5CpUhNVX310xzPsN/H9lCdfOA==} engines: {node: '>=14'} @@ -1404,9 +884,6 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - birpc@2.9.0: - resolution: {integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==} - boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -1440,12 +917,6 @@ packages: change-case@5.4.4: resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} - character-entities-html4@2.1.0: - resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} - - character-entities-legacy@3.0.0: - resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - character-entities@2.0.2: resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} @@ -1456,9 +927,6 @@ packages: citty@0.2.2: resolution: {integrity: sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w==} - comma-separated-tokens@2.0.3: - resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - commander@8.3.0: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} @@ -1484,10 +952,6 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - copy-anything@4.0.5: - resolution: {integrity: sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==} - engines: {node: '>=18'} - core-js-compat@3.50.0: resolution: {integrity: sha512-XGpFGbMLHwSt74YLTKho7Ib242qi6O8MSX+sRokV4oz7iKXvQWGYZthjIhjRGMxjzVkAubBO512dKGYcefmX3Q==} engines: {node: '>=6.4.0'} @@ -1501,9 +965,6 @@ packages: engines: {node: '>=4'} hasBin: true - csstype@3.2.3: - resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} - dayjs@1.11.21: resolution: {integrity: sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==} @@ -1533,6 +994,10 @@ packages: resolution: {integrity: sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A==} engines: {node: '>=12.20'} + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} @@ -1552,9 +1017,6 @@ packages: electron-to-chromium@1.5.405: resolution: {integrity: sha512-bNglH7lPH5l+yHOes7Zr4VqxhOy4BQ9ZBUX4VdoFgxMpzJk7W1ZoO3Vgd9Pxa9PyjQ76sfm2aKH/nzEcCNRlew==} - emoji-regex-xs@1.0.0: - resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==} - empathic@2.0.1: resolution: {integrity: sha512-YGRs8knHhKHVShLkFET/rWAU8kmHbOV5LwN938RHI0pljAJ1Gf6SzXsSmRaEzcXTtOOmVqJ5+WtQPL5uigY50Q==} engines: {node: '>=14'} @@ -1579,11 +1041,6 @@ packages: es-module-lexer@2.3.1: resolution: {integrity: sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==} - esbuild@0.21.5: - resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} - engines: {node: '>=12'} - hasBin: true - esbuild@0.28.2: resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==} engines: {node: '>=18'} @@ -1861,17 +1318,10 @@ packages: flatted@3.4.4: resolution: {integrity: sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==} - focus-trap@7.8.0: - resolution: {integrity: sha512-/yNdlIkpWbM0ptxno3ONTuf+2g318kh2ez3KSeZN5dZ8YC6AAmgeWz+GasYYiBJPFaYcSAPeu4GfhUaChzIJXA==} - format@0.2.2: resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} engines: {node: '>=0.4.x'} - fs-extra@11.4.0: - resolution: {integrity: sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==} - engines: {node: '>=14.14'} - fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -1903,8 +1353,8 @@ packages: resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} engines: {node: '>=18'} - globals@17.10.0: - resolution: {integrity: sha512-V0kztuWST2k8A/VbxAY8+L+7+Rgo3fyA24IHRLrZp7HOzJjV0gHSaZUjK9lpP/IrBSNite2tZ1prhRkinRu1CA==} + globals@17.11.0: + resolution: {integrity: sha512-Z2I8hM+PbJDXQDq3Icgpzv+mPdwr68iZUU9d5WW4FuXfDUQfkZaZuvjMv42/5crNyw154+9+VWXbYrUgDXbxNw==} engines: {node: '>=18'} globrex@0.1.2: @@ -1913,24 +1363,12 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - hast-util-to-html@9.0.5: - resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==} - - hast-util-whitespace@3.0.0: - resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} - - hookable@5.5.3: - resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} - hookable@6.1.1: resolution: {integrity: sha512-U9LYDy1CwhMCnprUfeAZWZGByVbhd54hwepegYTK7Pi5NvqEj63ifz5z+xukznehT7i6NIZRu89Ay1AZmRsLEQ==} html-entities@2.6.0: resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==} - html-void-elements@3.0.0: - resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} - identifier-regex@1.1.0: resolution: {integrity: sha512-SLX4H/vtcYlYnL7XqnuJKHU7Z8517TgsW9nmQiGOgMCjQ8V/deLYu6bEmbGoXe7WMMhc9+EUGyFFneHja8KabA==} engines: {node: '>=18'} @@ -1971,10 +1409,6 @@ packages: resolution: {integrity: sha512-NhOds0mDx9lJu+1lBRO0xbwFo5nobA7GCk/0e5xjr6+6XugX985+0OyGX35BNrTkPAsdLcIKg02HUQJOK8D8kw==} engines: {node: '>=18'} - is-what@5.5.0: - resolution: {integrity: sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==} - engines: {node: '>=18'} - isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -2012,9 +1446,6 @@ packages: resolution: {integrity: sha512-hYTGkHGNRZnXOFZ1urhINADoqDrGfpy53cjw+dxk84QE0pUDujQzeUeamNs6Mz44/TKD49z2x6/GVSu4ZrtA+Q==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - jsonfile@6.2.1: - resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==} - katex@0.16.47: resolution: {integrity: sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg==} hasBin: true @@ -2026,6 +1457,80 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + lightningcss-android-arm64@1.33.0: + resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.33.0: + resolution: {integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.33.0: + resolution: {integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.33.0: + resolution: {integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.33.0: + resolution: {integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.33.0: + resolution: {integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + lightningcss-linux-arm64-musl@1.33.0: + resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + lightningcss-linux-x64-gnu@1.33.0: + resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + lightningcss-linux-x64-musl@1.33.0: + resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + lightningcss-win32-arm64-msvc@1.33.0: + resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.33.0: + resolution: {integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.33.0: + resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==} + engines: {node: '>= 12.0.0'} + lint-staged@17.3.0: resolution: {integrity: sha512-woZS3vNe3UKqBaLPvbLOtKRY4tLANpWQhom12MGWqC8Mh1lCOO+WgSwmX2amjJAqTY9BkXYW87fCUH5H9Ph6xw==} engines: {node: '>=22.22.1'} @@ -2049,15 +1554,9 @@ packages: resolution: {integrity: sha512-ayF7iT+44LXdxJLTrTd3TLQpFDDvPCBxXxbv+pMUSuHA5Q8zyAfwkRP6aHHwNVFBUFWtxAHqwNJxF8vMZLAbVg==} engines: {node: '>=18'} - mark.js@8.11.1: - resolution: {integrity: sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==} - markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} - md5-typescript@1.0.5: - resolution: {integrity: sha512-ovAc4EtiNt2dY8JPhPr/wkC9h4U5k/nuClNVcG0Ga3V1rMlYpAY24ZaaymFXJlz+ccJ6UMPo3FSaVKe7czBsXw==} - mdast-util-find-and-replace@3.0.2: resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==} @@ -2091,9 +1590,6 @@ packages: mdast-util-phrasing@4.1.0: resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} - mdast-util-to-hast@13.2.1: - resolution: {integrity: sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==} - mdast-util-to-markdown@2.1.2: resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==} @@ -2197,12 +1693,6 @@ packages: resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==} engines: {node: 18 || 20 || >=22} - minisearch@7.2.0: - resolution: {integrity: sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==} - - mitt@3.0.1: - resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} - mlly@1.8.2: resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} @@ -2238,9 +1728,6 @@ packages: resolution: {integrity: sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==} engines: {node: '>=12.20.0'} - oniguruma-to-es@3.1.1: - resolution: {integrity: sha512-bUH8SDvPkH3ho3dvwJwfonjlQ4R80vjyvrU8YpxuROddv55vAEJrTuCuCVUhhsHbtlD9tGGbaNApGQckXhS8iQ==} - optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -2285,9 +1772,6 @@ packages: pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - perfect-debounce@1.0.0: - resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} - picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -2316,21 +1800,10 @@ packages: resolution: {integrity: sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==} engines: {node: ^10 || ^12 || >=14} - preact@10.29.8: - resolution: {integrity: sha512-ej2aVZ+vZ8WO7tvlQWRM9N63A0KzF9q4mWJfDUHgYaIofWY9hu74QdnQrjoPMmZi2/nZ5gN0bJCQF49xQqx09Q==} - peerDependencies: - preact-render-to-string: '>=5' - peerDependenciesMeta: - preact-render-to-string: - optional: true - prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - property-information@7.2.0: - resolution: {integrity: sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==} - punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -2349,15 +1822,6 @@ packages: resolution: {integrity: sha512-J8rn6v4DBb2nnFqkqwy6/NnTYMcgLA+sLr0iIO41qpv0n+ngb7ksag2tMRl0inb1bbO/esUwzW1vbJi7K0sI0g==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - regex-recursion@6.0.2: - resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} - - regex-utilities@2.3.0: - resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==} - - regex@6.1.0: - resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==} - regexp-ast-analysis@0.7.1: resolution: {integrity: sha512-sZuz1dYW/ZsfG17WSAG7eS85r5a0dDsvg+7BiiYR5o6lKCAtUrEwdmRmaGF6rwVj3LcmAeYkOWKEPlbPzN3Y3A==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} @@ -2373,9 +1837,6 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - rfdc@1.4.1: - resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rolldown-plugin-dts@0.27.14: resolution: {integrity: sha512-ZvuDDwoIpRK9RPxDXratCpklFO9QZZWndf/sd0VBFb4LEj0jj07UcHK9OCh7V4XiFz2Z89ziyBC2K6tJiDjrbw==} engines: {node: ^22.18.0 || >=24.11.0} @@ -2395,23 +1856,15 @@ packages: vue-tsc: optional: true - rolldown@1.2.3: - resolution: {integrity: sha512-rn9wpmxplLf7NLNyCk9FyWh3FM43DbY8jOzCdEPzH7uflhTftRbCEpqi6Ly2osgoU8OwObtmavMbWLaWy4LX7A==} + rolldown@1.2.4: + resolution: {integrity: sha512-rSr7irW0K7QRWzjdJXqZowkcRdDtjRduh43rBltnVKd0VFq839l1lJoDvGJb6gl7+4rTTCrPWu+YfujUL8Ug7w==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - rollup@4.62.4: - resolution: {integrity: sha512-RXOqwaPsBGjMNMa4sQjDjHieHEZDFoj/Rdr46l2MU5DfEs16wHJPC2RPTPHWhNl+M3aI472LLqFkFKut4SblOg==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - scslre@0.3.0: resolution: {integrity: sha512-3A6sD0WYP7+QrjbfNA2FN3FsOaGGFoekCVgTyypy53gPxhbkCIjtO6YWgdrfM+n/8sI8JeXZOIxsHjMTNxQ4nQ==} engines: {node: ^14.0.0 || >=16.0.0} - search-insights@2.17.3: - resolution: {integrity: sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==} - semver@7.8.5: resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} engines: {node: '>=10'} @@ -2425,9 +1878,6 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shiki@2.5.0: - resolution: {integrity: sha512-mI//trrsaiCIPsja5CNfsyNOqgAZUb6VpJA+340toL42UpzQlXpwRV9nch69X6gaUxrr9kaOOa6e3y3uAkGFxQ==} - siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} @@ -2442,9 +1892,6 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} - space-separated-tokens@2.0.2: - resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - spdx-exceptions@2.5.0: resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} @@ -2454,10 +1901,6 @@ packages: spdx-license-ids@3.0.23: resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==} - speakingurl@14.0.1: - resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} - engines: {node: '>=0.10.0'} - stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} @@ -2468,9 +1911,6 @@ packages: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} - stringify-entities@4.0.4: - resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} - strip-indent@4.1.1: resolution: {integrity: sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==} engines: {node: '>=12'} @@ -2479,17 +1919,10 @@ packages: resolution: {integrity: sha512-WHkws2ZflZe41zj6AolvvmaTrWds/VuyeYr9iPVv/oQeaIoVxMKaushfFWpOGDT+GuBrM/sVqF8KUCYQlSSTdQ==} engines: {node: '>=18'} - superjson@2.2.6: - resolution: {integrity: sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==} - engines: {node: '>=16'} - synckit@0.11.13: resolution: {integrity: sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==} engines: {node: ^14.18.0 || >=16.0.0} - tabbable@6.5.0: - resolution: {integrity: sha512-wieBHXygIm7OyQOu5hQlkk62/WyCFYGlWg7L6/ZCUZwx0o398Zkn4pVmMyfYhfMG8kGrj/Krt8eIk6UKC6VzwA==} - tapable@2.3.3: resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} engines: {node: '>=6'} @@ -2525,9 +1958,6 @@ packages: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true - trim-lines@3.0.1: - resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - ts-api-utils@2.5.0: resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} engines: {node: '>=18.12'} @@ -2598,9 +2028,6 @@ packages: unist-util-is@6.0.1: resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==} - unist-util-position@5.0.0: - resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} - unist-util-remove-position@5.0.0: resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} @@ -2613,10 +2040,6 @@ packages: unist-util-visit@5.1.0: resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} - universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} - update-browserslist-db@1.3.1: resolution: {integrity: sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ==} hasBin: true @@ -2637,31 +2060,33 @@ packages: resolution: {integrity: sha512-zj/ob3UsvJGN0whEAKFp53REA5X66hvffVqoCtVQAakJKnKlH+/PcOfMoFwIG/o4rElqLv/ycAFlx8ZlXUorCg==} engines: {node: '>=18.12.0'} - vfile-message@4.0.3: - resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==} - - vfile@6.0.3: - resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - - vite@5.4.21: - resolution: {integrity: sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==} - engines: {node: ^18.0.0 || >=20.0.0} + vite@8.2.1: + resolution: {integrity: sha512-EU/eS7BH3XROHh2YnBefjM6DBKA6ZeMZEYQbj7NLWg5wHYlhB8B/Mayd5XsgWq+NFYccDOTemRpdETWR6Ka/lw==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' - lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 + '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.4.0 + esbuild: ^0.27.0 || ^0.28.0 + jiti: '>=1.21.0' + less: ^4.0.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 peerDependenciesMeta: '@types/node': optional: true - less: + '@vitejs/devtools': optional: true - lightningcss: + esbuild: + optional: true + jiti: + optional: true + less: optional: true sass: optional: true @@ -2673,17 +2098,9 @@ packages: optional: true terser: optional: true - - vitepress@1.6.4: - resolution: {integrity: sha512-+2ym1/+0VVrbhNyRoFFesVvBvHAVMZMK0rw60E3X/5349M1GuVdKeazuksqopEdvkKwKGs21Q729jX81/bkBJg==} - hasBin: true - peerDependencies: - markdown-it-mathjax3: ^4 - postcss: ^8 - peerDependenciesMeta: - markdown-it-mathjax3: + tsx: optional: true - postcss: + yaml: optional: true vitest@4.1.10: @@ -2733,14 +2150,6 @@ packages: peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - vue@3.5.41: - resolution: {integrity: sha512-2laE0p+aK+/AOPG/XL/WepOs/GlK755LJ1XECi9kDUrz1FKNw8rb2Xzlw9JS1rqEV55nb0ttsKxVlTCcd+R5cg==} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - web-worker@1.5.0: resolution: {integrity: sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==} @@ -2789,119 +2198,7 @@ packages: snapshots: - '@algolia/abtesting@1.22.0': - dependencies: - '@algolia/client-common': 5.56.0 - '@algolia/requester-browser-xhr': 5.56.0 - '@algolia/requester-fetch': 5.56.0 - '@algolia/requester-node-http': 5.56.0 - - '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.56.0)(algoliasearch@5.56.0)(search-insights@2.17.3)': - dependencies: - '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.56.0)(algoliasearch@5.56.0)(search-insights@2.17.3) - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.56.0)(algoliasearch@5.56.0) - transitivePeerDependencies: - - '@algolia/client-search' - - algoliasearch - - search-insights - - '@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.56.0)(algoliasearch@5.56.0)(search-insights@2.17.3)': - dependencies: - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.56.0)(algoliasearch@5.56.0) - search-insights: 2.17.3 - transitivePeerDependencies: - - '@algolia/client-search' - - algoliasearch - - '@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.56.0)(algoliasearch@5.56.0)': - dependencies: - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.56.0)(algoliasearch@5.56.0) - '@algolia/client-search': 5.56.0 - algoliasearch: 5.56.0 - - '@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.56.0)(algoliasearch@5.56.0)': - dependencies: - '@algolia/client-search': 5.56.0 - algoliasearch: 5.56.0 - - '@algolia/client-abtesting@5.56.0': - dependencies: - '@algolia/client-common': 5.56.0 - '@algolia/requester-browser-xhr': 5.56.0 - '@algolia/requester-fetch': 5.56.0 - '@algolia/requester-node-http': 5.56.0 - - '@algolia/client-analytics@5.56.0': - dependencies: - '@algolia/client-common': 5.56.0 - '@algolia/requester-browser-xhr': 5.56.0 - '@algolia/requester-fetch': 5.56.0 - '@algolia/requester-node-http': 5.56.0 - - '@algolia/client-common@5.56.0': {} - - '@algolia/client-insights@5.56.0': - dependencies: - '@algolia/client-common': 5.56.0 - '@algolia/requester-browser-xhr': 5.56.0 - '@algolia/requester-fetch': 5.56.0 - '@algolia/requester-node-http': 5.56.0 - - '@algolia/client-personalization@5.56.0': - dependencies: - '@algolia/client-common': 5.56.0 - '@algolia/requester-browser-xhr': 5.56.0 - '@algolia/requester-fetch': 5.56.0 - '@algolia/requester-node-http': 5.56.0 - - '@algolia/client-query-suggestions@5.56.0': - dependencies: - '@algolia/client-common': 5.56.0 - '@algolia/requester-browser-xhr': 5.56.0 - '@algolia/requester-fetch': 5.56.0 - '@algolia/requester-node-http': 5.56.0 - - '@algolia/client-search@5.56.0': - dependencies: - '@algolia/client-common': 5.56.0 - '@algolia/requester-browser-xhr': 5.56.0 - '@algolia/requester-fetch': 5.56.0 - '@algolia/requester-node-http': 5.56.0 - - '@algolia/ingestion@1.56.0': - dependencies: - '@algolia/client-common': 5.56.0 - '@algolia/requester-browser-xhr': 5.56.0 - '@algolia/requester-fetch': 5.56.0 - '@algolia/requester-node-http': 5.56.0 - - '@algolia/monitoring@1.56.0': - dependencies: - '@algolia/client-common': 5.56.0 - '@algolia/requester-browser-xhr': 5.56.0 - '@algolia/requester-fetch': 5.56.0 - '@algolia/requester-node-http': 5.56.0 - - '@algolia/recommend@5.56.0': - dependencies: - '@algolia/client-common': 5.56.0 - '@algolia/requester-browser-xhr': 5.56.0 - '@algolia/requester-fetch': 5.56.0 - '@algolia/requester-node-http': 5.56.0 - - '@algolia/requester-browser-xhr@5.56.0': - dependencies: - '@algolia/client-common': 5.56.0 - - '@algolia/requester-fetch@5.56.0': - dependencies: - '@algolia/client-common': 5.56.0 - - '@algolia/requester-node-http@5.56.0': - dependencies: - '@algolia/client-common': 5.56.0 - - '@antfu/eslint-config@9.3.0(@typescript-eslint/typescript-estree@8.67.0(typescript@6.0.3))(@typescript-eslint/utils@8.67.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(@vue/compiler-sfc@3.5.41)(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3)(vitest@4.1.10(@types/node@26.2.0)(vite@5.4.21(@types/node@26.2.0)))': + '@antfu/eslint-config@9.3.0(@typescript-eslint/typescript-estree@8.67.0(typescript@6.0.3))(@typescript-eslint/utils@8.67.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(@vue/compiler-sfc@3.5.41)(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3)(vitest@4.1.10(@types/node@26.2.0)(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))': dependencies: '@antfu/install-pkg': 2.0.1 '@clack/prompts': 1.7.0 @@ -2911,7 +2208,7 @@ snapshots: '@stylistic/eslint-plugin': 5.10.0(eslint@10.8.1(jiti@2.7.0)) '@typescript-eslint/eslint-plugin': 8.67.0(@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) '@typescript-eslint/parser': 8.67.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) - '@vitest/eslint-plugin': 1.6.27(@typescript-eslint/eslint-plugin@8.67.0(@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3)(vitest@4.1.10(@types/node@26.2.0)(vite@5.4.21(@types/node@26.2.0))) + '@vitest/eslint-plugin': 1.6.27(@typescript-eslint/eslint-plugin@8.67.0(@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3)(vitest@4.1.10(@types/node@26.2.0)(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))) ansis: 4.3.1 cac: 7.0.0 eslint: 10.8.1(jiti@2.7.0) @@ -2934,7 +2231,7 @@ snapshots: eslint-plugin-vue: 10.10.0(@stylistic/eslint-plugin@5.10.0(eslint@10.8.1(jiti@2.7.0)))(@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(vue-eslint-parser@10.4.1(eslint@10.8.1(jiti@2.7.0))) eslint-plugin-yml: 3.8.1(eslint@10.8.1(jiti@2.7.0)) eslint-processor-vue-blocks: 2.0.0(@vue/compiler-sfc@3.5.41)(eslint@10.8.1(jiti@2.7.0)) - globals: 17.10.0 + globals: 17.11.0 local-pkg: 1.2.1 parse-gitignore: 2.0.0 toml-eslint-parser: 1.0.3 @@ -2981,31 +2278,6 @@ snapshots: fast-wrap-ansi: 0.2.2 sisteransi: 1.0.5 - '@docsearch/css@3.8.2': {} - - '@docsearch/js@3.8.2(@algolia/client-search@5.56.0)(search-insights@2.17.3)': - dependencies: - '@docsearch/react': 3.8.2(@algolia/client-search@5.56.0)(search-insights@2.17.3) - preact: 10.29.8 - transitivePeerDependencies: - - '@algolia/client-search' - - '@types/react' - - preact-render-to-string - - react - - react-dom - - search-insights - - '@docsearch/react@3.8.2(@algolia/client-search@5.56.0)(search-insights@2.17.3)': - dependencies: - '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.56.0)(algoliasearch@5.56.0)(search-insights@2.17.3) - '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.56.0)(algoliasearch@5.56.0) - '@docsearch/css': 3.8.2 - algoliasearch: 5.56.0 - optionalDependencies: - search-insights: 2.17.3 - transitivePeerDependencies: - - '@algolia/client-search' - '@e18e/eslint-plugin@0.6.0(eslint@10.8.1(jiti@2.7.0))': dependencies: empathic: 2.0.1 @@ -3032,150 +2304,81 @@ snapshots: '@es-joy/resolve.exports@1.2.0': {} - '@esbuild/aix-ppc64@0.21.5': - optional: true - '@esbuild/aix-ppc64@0.28.2': optional: true - '@esbuild/android-arm64@0.21.5': - optional: true - '@esbuild/android-arm64@0.28.2': optional: true - '@esbuild/android-arm@0.21.5': - optional: true - '@esbuild/android-arm@0.28.2': optional: true - '@esbuild/android-x64@0.21.5': - optional: true - '@esbuild/android-x64@0.28.2': optional: true - '@esbuild/darwin-arm64@0.21.5': - optional: true - '@esbuild/darwin-arm64@0.28.2': optional: true - '@esbuild/darwin-x64@0.21.5': - optional: true - '@esbuild/darwin-x64@0.28.2': optional: true - '@esbuild/freebsd-arm64@0.21.5': - optional: true - '@esbuild/freebsd-arm64@0.28.2': optional: true - '@esbuild/freebsd-x64@0.21.5': - optional: true - '@esbuild/freebsd-x64@0.28.2': optional: true - '@esbuild/linux-arm64@0.21.5': - optional: true - '@esbuild/linux-arm64@0.28.2': optional: true - '@esbuild/linux-arm@0.21.5': - optional: true - '@esbuild/linux-arm@0.28.2': optional: true - '@esbuild/linux-ia32@0.21.5': - optional: true - '@esbuild/linux-ia32@0.28.2': optional: true - '@esbuild/linux-loong64@0.21.5': - optional: true - '@esbuild/linux-loong64@0.28.2': optional: true - '@esbuild/linux-mips64el@0.21.5': - optional: true - '@esbuild/linux-mips64el@0.28.2': optional: true - '@esbuild/linux-ppc64@0.21.5': - optional: true - '@esbuild/linux-ppc64@0.28.2': optional: true - '@esbuild/linux-riscv64@0.21.5': - optional: true - '@esbuild/linux-riscv64@0.28.2': optional: true - '@esbuild/linux-s390x@0.21.5': - optional: true - '@esbuild/linux-s390x@0.28.2': optional: true - '@esbuild/linux-x64@0.21.5': - optional: true - '@esbuild/linux-x64@0.28.2': optional: true '@esbuild/netbsd-arm64@0.28.2': optional: true - '@esbuild/netbsd-x64@0.21.5': - optional: true - '@esbuild/netbsd-x64@0.28.2': optional: true '@esbuild/openbsd-arm64@0.28.2': optional: true - '@esbuild/openbsd-x64@0.21.5': - optional: true - '@esbuild/openbsd-x64@0.28.2': optional: true '@esbuild/openharmony-arm64@0.28.2': optional: true - '@esbuild/sunos-x64@0.21.5': - optional: true - '@esbuild/sunos-x64@0.28.2': optional: true - '@esbuild/win32-arm64@0.21.5': - optional: true - '@esbuild/win32-arm64@0.28.2': optional: true - '@esbuild/win32-ia32@0.21.5': - optional: true - '@esbuild/win32-ia32@0.28.2': optional: true - '@esbuild/win32-x64@0.21.5': - optional: true - '@esbuild/win32-x64@0.28.2': optional: true @@ -3262,66 +2465,15 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} - '@iconify-json/simple-icons@1.2.93': - dependencies: - '@iconify/types': 2.0.0 - - '@iconify/types@2.0.0': {} - - '@iconify/vue@5.0.1(vue@3.5.41(typescript@6.0.3))': - dependencies: - '@iconify/types': 2.0.0 - vue: 3.5.41(typescript@6.0.3) - '@jridgewell/sourcemap-codec@1.5.5': {} '@lonewolfyx/tsconfig@0.0.6(typescript@6.0.3)': dependencies: typescript: 6.0.3 - '@lonewolfyx/utils@0.0.5(@algolia/client-search@5.56.0)(@types/node@26.2.0)(change-case@5.4.4)(postcss@8.5.26)(search-insights@2.17.3)(typescript@6.0.3)(vue@3.5.41(typescript@6.0.3))': - dependencies: - '@iconify/vue': 5.0.1(vue@3.5.41(typescript@6.0.3)) - fs-extra: 11.4.0 - md5-typescript: 1.0.5 - vitepress: 1.6.4(@algolia/client-search@5.56.0)(@types/node@26.2.0)(change-case@5.4.4)(postcss@8.5.26)(search-insights@2.17.3)(typescript@6.0.3) - transitivePeerDependencies: - - '@algolia/client-search' - - '@types/node' - - '@types/react' - - async-validator - - axios - - change-case - - drauu - - fuse.js - - idb-keyval - - jwt-decode - - less - - lightningcss - - markdown-it-mathjax3 - - nprogress - - postcss - - preact-render-to-string - - qrcode - - react - - react-dom - - sass - - sass-embedded - - search-insights - - sortablejs - - stylus - - sugarss - - terser - - typescript - - universal-cookie - - vue - - '@napi-rs/lzma-linux-x64-gnu@1.5.1': - optional: true - '@ota-meshi/ast-token-store@0.3.0': {} - '@oxc-project/types@0.143.0': {} + '@oxc-project/types@0.144.0': {} '@pkgr/core@0.3.6': {} @@ -3329,165 +2481,50 @@ snapshots: dependencies: quansync: 1.0.0 - '@rolldown/binding-android-arm64@1.2.3': + '@rolldown/binding-android-arm64@1.2.4': optional: true - '@rolldown/binding-darwin-arm64@1.2.3': + '@rolldown/binding-darwin-arm64@1.2.4': optional: true - '@rolldown/binding-darwin-x64@1.2.3': + '@rolldown/binding-darwin-x64@1.2.4': optional: true - '@rolldown/binding-freebsd-x64@1.2.3': + '@rolldown/binding-freebsd-x64@1.2.4': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.2.3': + '@rolldown/binding-linux-arm-gnueabihf@1.2.4': optional: true - '@rolldown/binding-linux-arm64-gnu@1.2.3': + '@rolldown/binding-linux-arm64-gnu@1.2.4': optional: true - '@rolldown/binding-linux-arm64-musl@1.2.3': + '@rolldown/binding-linux-arm64-musl@1.2.4': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.2.3': + '@rolldown/binding-linux-ppc64-gnu@1.2.4': optional: true - '@rolldown/binding-linux-s390x-gnu@1.2.3': + '@rolldown/binding-linux-s390x-gnu@1.2.4': optional: true - '@rolldown/binding-linux-x64-gnu@1.2.3': + '@rolldown/binding-linux-x64-gnu@1.2.4': optional: true - '@rolldown/binding-linux-x64-musl@1.2.3': + '@rolldown/binding-linux-x64-musl@1.2.4': optional: true - '@rolldown/binding-openharmony-arm64@1.2.3': + '@rolldown/binding-openharmony-arm64@1.2.4': optional: true - '@rolldown/binding-win32-arm64-msvc@1.2.3': + '@rolldown/binding-win32-arm64-msvc@1.2.4': optional: true - '@rolldown/binding-win32-x64-msvc@1.2.3': + '@rolldown/binding-win32-x64-msvc@1.2.4': optional: true '@rolldown/pluginutils@1.0.1': {} - '@rollup/rollup-android-arm-eabi@4.62.4': - optional: true - - '@rollup/rollup-android-arm64@4.62.4': - optional: true - - '@rollup/rollup-darwin-arm64@4.62.4': - optional: true - - '@rollup/rollup-darwin-x64@4.62.4': - optional: true - - '@rollup/rollup-freebsd-arm64@4.62.4': - optional: true - - '@rollup/rollup-freebsd-x64@4.62.4': - optional: true - - '@rollup/rollup-linux-arm-gnueabihf@4.62.4': - optional: true - - '@rollup/rollup-linux-arm-musleabihf@4.62.4': - optional: true - - '@rollup/rollup-linux-arm64-gnu@4.62.4': - optional: true - - '@rollup/rollup-linux-arm64-musl@4.62.4': - optional: true - - '@rollup/rollup-linux-loong64-gnu@4.62.4': - optional: true - - '@rollup/rollup-linux-loong64-musl@4.62.4': - optional: true - - '@rollup/rollup-linux-ppc64-gnu@4.62.4': - optional: true - - '@rollup/rollup-linux-ppc64-musl@4.62.4': - optional: true - - '@rollup/rollup-linux-riscv64-gnu@4.62.4': - optional: true - - '@rollup/rollup-linux-riscv64-musl@4.62.4': - optional: true - - '@rollup/rollup-linux-s390x-gnu@4.62.4': - optional: true - - '@rollup/rollup-linux-x64-gnu@4.62.4': - optional: true - - '@rollup/rollup-linux-x64-musl@4.62.4': - optional: true - - '@rollup/rollup-openbsd-x64@4.62.4': - optional: true - - '@rollup/rollup-openharmony-arm64@4.62.4': - optional: true - - '@rollup/rollup-win32-arm64-msvc@4.62.4': - optional: true - - '@rollup/rollup-win32-ia32-msvc@4.62.4': - optional: true - - '@rollup/rollup-win32-x64-gnu@4.62.4': - optional: true - - '@rollup/rollup-win32-x64-msvc@4.62.4': - optional: true - - '@shikijs/core@2.5.0': - dependencies: - '@shikijs/engine-javascript': 2.5.0 - '@shikijs/engine-oniguruma': 2.5.0 - '@shikijs/types': 2.5.0 - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.5 - hast-util-to-html: 9.0.5 - - '@shikijs/engine-javascript@2.5.0': - dependencies: - '@shikijs/types': 2.5.0 - '@shikijs/vscode-textmate': 10.0.2 - oniguruma-to-es: 3.1.1 - - '@shikijs/engine-oniguruma@2.5.0': - dependencies: - '@shikijs/types': 2.5.0 - '@shikijs/vscode-textmate': 10.0.2 - - '@shikijs/langs@2.5.0': - dependencies: - '@shikijs/types': 2.5.0 - - '@shikijs/themes@2.5.0': - dependencies: - '@shikijs/types': 2.5.0 - - '@shikijs/transformers@2.5.0': - dependencies: - '@shikijs/core': 2.5.0 - '@shikijs/types': 2.5.0 - - '@shikijs/types@2.5.0': - dependencies: - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.5 - - '@shikijs/vscode-textmate@10.0.2': {} - '@sindresorhus/base62@1.0.0': {} '@standard-schema/spec@1.1.0': {} @@ -3525,19 +2562,10 @@ snapshots: '@types/katex@0.16.8': {} - '@types/linkify-it@5.0.0': {} - - '@types/markdown-it@14.1.2': - dependencies: - '@types/linkify-it': 5.0.0 - '@types/mdurl': 2.0.0 - '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 - '@types/mdurl@2.0.0': {} - '@types/ms@2.1.0': {} '@types/node@26.2.0': @@ -3548,8 +2576,6 @@ snapshots: '@types/unist@3.0.3': {} - '@types/web-bluetooth@0.0.21': {} - '@typescript-eslint/eslint-plugin@8.67.0(@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 @@ -3641,14 +2667,7 @@ snapshots: '@typescript-eslint/types': 8.67.0 eslint-visitor-keys: 5.0.1 - '@ungap/structured-clone@1.3.3': {} - - '@vitejs/plugin-vue@5.2.4(vite@5.4.21(@types/node@26.2.0))(vue@3.5.41(typescript@6.0.3))': - dependencies: - vite: 5.4.21(@types/node@26.2.0) - vue: 3.5.41(typescript@6.0.3) - - '@vitest/eslint-plugin@1.6.27(@typescript-eslint/eslint-plugin@8.67.0(@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3)(vitest@4.1.10(@types/node@26.2.0)(vite@5.4.21(@types/node@26.2.0)))': + '@vitest/eslint-plugin@1.6.27(@typescript-eslint/eslint-plugin@8.67.0(@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3)(vitest@4.1.10(@types/node@26.2.0)(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)))': dependencies: '@typescript-eslint/scope-manager': 8.67.0 '@typescript-eslint/utils': 8.67.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) @@ -3656,7 +2675,7 @@ snapshots: optionalDependencies: '@typescript-eslint/eslint-plugin': 8.67.0(@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.8.1(jiti@2.7.0))(typescript@6.0.3) typescript: 6.0.3 - vitest: 4.1.10(@types/node@26.2.0)(vite@5.4.21(@types/node@26.2.0)) + vitest: 4.1.10(@types/node@26.2.0)(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) transitivePeerDependencies: - supports-color @@ -3669,13 +2688,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.1 - '@vitest/mocker@4.1.10(vite@5.4.21(@types/node@26.2.0))': + '@vitest/mocker@4.1.10(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0))': dependencies: '@vitest/spy': 4.1.10 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 5.4.21(@types/node@26.2.0) + vite: 8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0) '@vitest/pretty-format@4.1.10': dependencies: @@ -3731,76 +2750,8 @@ snapshots: '@vue/compiler-dom': 3.5.41 '@vue/shared': 3.5.41 - '@vue/devtools-api@7.7.10': - dependencies: - '@vue/devtools-kit': 7.7.10 - - '@vue/devtools-kit@7.7.10': - dependencies: - '@vue/devtools-shared': 7.7.10 - birpc: 2.9.0 - hookable: 5.5.3 - mitt: 3.0.1 - perfect-debounce: 1.0.0 - speakingurl: 14.0.1 - superjson: 2.2.6 - - '@vue/devtools-shared@7.7.10': - dependencies: - rfdc: 1.4.1 - - '@vue/reactivity@3.5.41': - dependencies: - '@vue/shared': 3.5.41 - - '@vue/runtime-core@3.5.41': - dependencies: - '@vue/reactivity': 3.5.41 - '@vue/shared': 3.5.41 - - '@vue/runtime-dom@3.5.41': - dependencies: - '@vue/reactivity': 3.5.41 - '@vue/runtime-core': 3.5.41 - '@vue/shared': 3.5.41 - csstype: 3.2.3 - - '@vue/server-renderer@3.5.41': - dependencies: - '@vue/compiler-ssr': 3.5.41 - '@vue/runtime-dom': 3.5.41 - '@vue/shared': 3.5.41 - '@vue/shared@3.5.41': {} - '@vueuse/core@12.8.2(typescript@6.0.3)': - dependencies: - '@types/web-bluetooth': 0.0.21 - '@vueuse/metadata': 12.8.2 - '@vueuse/shared': 12.8.2(typescript@6.0.3) - vue: 3.5.41(typescript@6.0.3) - transitivePeerDependencies: - - typescript - - '@vueuse/integrations@12.8.2(change-case@5.4.4)(focus-trap@7.8.0)(typescript@6.0.3)': - dependencies: - '@vueuse/core': 12.8.2(typescript@6.0.3) - '@vueuse/shared': 12.8.2(typescript@6.0.3) - vue: 3.5.41(typescript@6.0.3) - optionalDependencies: - change-case: 5.4.4 - focus-trap: 7.8.0 - transitivePeerDependencies: - - typescript - - '@vueuse/metadata@12.8.2': {} - - '@vueuse/shared@12.8.2(typescript@6.0.3)': - dependencies: - vue: 3.5.41(typescript@6.0.3) - transitivePeerDependencies: - - typescript - '@yuku-codegen/binding-android-arm64@0.8.5': optional: true @@ -3888,23 +2839,6 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - algoliasearch@5.56.0: - dependencies: - '@algolia/abtesting': 1.22.0 - '@algolia/client-abtesting': 5.56.0 - '@algolia/client-analytics': 5.56.0 - '@algolia/client-common': 5.56.0 - '@algolia/client-insights': 5.56.0 - '@algolia/client-personalization': 5.56.0 - '@algolia/client-query-suggestions': 5.56.0 - '@algolia/client-search': 5.56.0 - '@algolia/ingestion': 1.56.0 - '@algolia/monitoring': 1.56.0 - '@algolia/recommend': 5.56.0 - '@algolia/requester-browser-xhr': 5.56.0 - '@algolia/requester-fetch': 5.56.0 - '@algolia/requester-node-http': 5.56.0 - ansis@4.3.1: {} are-docs-informative@0.0.2: {} @@ -3915,8 +2849,6 @@ snapshots: baseline-browser-mapping@2.11.13: {} - birpc@2.9.0: {} - boolbase@1.0.0: {} brace-expansion@5.0.9: @@ -3943,18 +2875,12 @@ snapshots: change-case@5.4.4: {} - character-entities-html4@2.1.0: {} - - character-entities-legacy@3.0.0: {} - character-entities@2.0.2: {} ci-info@4.4.0: {} citty@0.2.2: {} - comma-separated-tokens@2.0.3: {} - commander@8.3.0: {} comment-parser@1.4.7: {} @@ -3969,10 +2895,6 @@ snapshots: convert-source-map@2.0.0: {} - copy-anything@4.0.5: - dependencies: - is-what: 5.5.0 - core-js-compat@3.50.0: dependencies: browserslist: 4.28.8 @@ -3985,8 +2907,6 @@ snapshots: cssesc@3.0.0: {} - csstype@3.2.3: {} - dayjs@1.11.21: {} debug@4.4.3: @@ -4005,6 +2925,8 @@ snapshots: detect-indent@7.0.2: {} + detect-libc@2.1.2: {} + devlop@1.1.0: dependencies: dequal: 2.0.3 @@ -4015,8 +2937,6 @@ snapshots: electron-to-chromium@1.5.405: {} - emoji-regex-xs@1.0.0: {} - empathic@2.0.1: {} enhanced-resolve@5.24.5: @@ -4032,32 +2952,6 @@ snapshots: es-module-lexer@2.3.1: {} - esbuild@0.21.5: - optionalDependencies: - '@esbuild/aix-ppc64': 0.21.5 - '@esbuild/android-arm': 0.21.5 - '@esbuild/android-arm64': 0.21.5 - '@esbuild/android-x64': 0.21.5 - '@esbuild/darwin-arm64': 0.21.5 - '@esbuild/darwin-x64': 0.21.5 - '@esbuild/freebsd-arm64': 0.21.5 - '@esbuild/freebsd-x64': 0.21.5 - '@esbuild/linux-arm': 0.21.5 - '@esbuild/linux-arm64': 0.21.5 - '@esbuild/linux-ia32': 0.21.5 - '@esbuild/linux-loong64': 0.21.5 - '@esbuild/linux-mips64el': 0.21.5 - '@esbuild/linux-ppc64': 0.21.5 - '@esbuild/linux-riscv64': 0.21.5 - '@esbuild/linux-s390x': 0.21.5 - '@esbuild/linux-x64': 0.21.5 - '@esbuild/netbsd-x64': 0.21.5 - '@esbuild/openbsd-x64': 0.21.5 - '@esbuild/sunos-x64': 0.21.5 - '@esbuild/win32-arm64': 0.21.5 - '@esbuild/win32-ia32': 0.21.5 - '@esbuild/win32-x64': 0.21.5 - esbuild@0.28.2: optionalDependencies: '@esbuild/aix-ppc64': 0.28.2 @@ -4245,7 +3139,7 @@ snapshots: entities: 4.5.0 eslint: 10.8.1(jiti@2.7.0) find-up-simple: 1.0.1 - globals: 17.10.0 + globals: 17.11.0 indent-string: 5.0.0 is-builtin-module: 5.0.0 is-identifier: 1.1.0 @@ -4419,18 +3313,8 @@ snapshots: flatted@3.4.4: {} - focus-trap@7.8.0: - dependencies: - tabbable: 6.5.0 - format@0.2.2: {} - fs-extra@11.4.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.2.1 - universalify: 2.0.1 - fsevents@2.3.3: optional: true @@ -4454,38 +3338,16 @@ snapshots: globals@15.15.0: {} - globals@17.10.0: {} + globals@17.11.0: {} globrex@0.1.2: {} graceful-fs@4.2.11: {} - 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-whitespace@3.0.0: - dependencies: - '@types/hast': 3.0.5 - - hookable@5.5.3: {} - hookable@6.1.1: {} html-entities@2.6.0: {} - html-void-elements@3.0.0: {} - identifier-regex@1.1.0: dependencies: reserved-identifiers: 1.2.0 @@ -4515,8 +3377,6 @@ snapshots: identifier-regex: 1.1.0 super-regex: 1.1.0 - is-what@5.5.0: {} - isexe@2.0.0: {} jiti@2.7.0: {} @@ -4543,12 +3403,6 @@ snapshots: eslint-visitor-keys: 5.0.1 verkit: 0.3.2 - jsonfile@6.2.1: - dependencies: - universalify: 2.0.1 - optionalDependencies: - graceful-fs: 4.2.11 - katex@0.16.47: dependencies: commander: 8.3.0 @@ -4562,6 +3416,55 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + lightningcss-android-arm64@1.33.0: + optional: true + + lightningcss-darwin-arm64@1.33.0: + optional: true + + lightningcss-darwin-x64@1.33.0: + optional: true + + lightningcss-freebsd-x64@1.33.0: + optional: true + + lightningcss-linux-arm-gnueabihf@1.33.0: + optional: true + + lightningcss-linux-arm64-gnu@1.33.0: + optional: true + + lightningcss-linux-arm64-musl@1.33.0: + optional: true + + lightningcss-linux-x64-gnu@1.33.0: + optional: true + + lightningcss-linux-x64-musl@1.33.0: + optional: true + + lightningcss-win32-arm64-msvc@1.33.0: + optional: true + + lightningcss-win32-x64-msvc@1.33.0: + optional: true + + lightningcss@1.33.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.33.0 + lightningcss-darwin-arm64: 1.33.0 + lightningcss-darwin-x64: 1.33.0 + lightningcss-freebsd-x64: 1.33.0 + lightningcss-linux-arm-gnueabihf: 1.33.0 + lightningcss-linux-arm64-gnu: 1.33.0 + lightningcss-linux-arm64-musl: 1.33.0 + lightningcss-linux-x64-gnu: 1.33.0 + lightningcss-linux-x64-musl: 1.33.0 + lightningcss-win32-arm64-msvc: 1.33.0 + lightningcss-win32-x64-msvc: 1.33.0 + lint-staged@17.3.0: dependencies: picomatch: 4.0.5 @@ -4592,12 +3495,8 @@ snapshots: type-fest: 4.41.0 web-worker: 1.5.0 - mark.js@8.11.1: {} - markdown-table@3.0.4: {} - md5-typescript@1.0.5: {} - mdast-util-find-and-replace@3.0.2: dependencies: '@types/mdast': 4.0.4 @@ -4707,18 +3606,6 @@ snapshots: '@types/mdast': 4.0.4 unist-util-is: 6.0.1 - mdast-util-to-hast@13.2.1: - dependencies: - '@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@2.1.2: dependencies: '@types/mdast': 4.0.4 @@ -4949,10 +3836,6 @@ snapshots: dependencies: brace-expansion: 5.0.9 - minisearch@7.2.0: {} - - mitt@3.0.1: {} - mlly@1.8.2: dependencies: acorn: 8.18.0 @@ -4980,12 +3863,6 @@ snapshots: obug@2.1.4: {} - oniguruma-to-es@3.1.1: - dependencies: - emoji-regex-xs: 1.0.0 - regex: 6.1.0 - regex-recursion: 6.0.2 - optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -5025,8 +3902,6 @@ snapshots: pathe@2.0.3: {} - perfect-debounce@1.0.0: {} - picocolors@1.1.1: {} picomatch@4.0.5: {} @@ -5060,12 +3935,8 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - preact@10.29.8: {} - prelude-ls@1.2.1: {} - property-information@7.2.0: {} - punycode@2.3.1: {} quansync@0.2.11: {} @@ -5078,16 +3949,6 @@ snapshots: dependencies: '@eslint-community/regexpp': 4.12.2 - 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 - regexp-ast-analysis@0.7.1: dependencies: '@eslint-community/regexpp': 4.12.2 @@ -5101,14 +3962,12 @@ snapshots: resolve-pkg-maps@1.0.0: {} - rfdc@1.4.1: {} - - rolldown-plugin-dts@0.27.14(rolldown@1.2.3)(typescript@6.0.3): + rolldown-plugin-dts@0.27.14(rolldown@1.2.4)(typescript@6.0.3): dependencies: dts-resolver: 3.0.0 get-tsconfig: 5.0.0-beta.5 obug: 2.1.4 - rolldown: 1.2.3 + rolldown: 1.2.4 yuku-ast: 0.8.5 yuku-codegen: 0.8.5 yuku-parser: 0.8.5 @@ -5117,57 +3976,25 @@ snapshots: transitivePeerDependencies: - oxc-resolver - rolldown@1.2.3: + rolldown@1.2.4: dependencies: - '@oxc-project/types': 0.143.0 + '@oxc-project/types': 0.144.0 '@rolldown/pluginutils': 1.0.1 optionalDependencies: - '@rolldown/binding-android-arm64': 1.2.3 - '@rolldown/binding-darwin-arm64': 1.2.3 - '@rolldown/binding-darwin-x64': 1.2.3 - '@rolldown/binding-freebsd-x64': 1.2.3 - '@rolldown/binding-linux-arm-gnueabihf': 1.2.3 - '@rolldown/binding-linux-arm64-gnu': 1.2.3 - '@rolldown/binding-linux-arm64-musl': 1.2.3 - '@rolldown/binding-linux-ppc64-gnu': 1.2.3 - '@rolldown/binding-linux-s390x-gnu': 1.2.3 - '@rolldown/binding-linux-x64-gnu': 1.2.3 - '@rolldown/binding-linux-x64-musl': 1.2.3 - '@rolldown/binding-openharmony-arm64': 1.2.3 - '@rolldown/binding-win32-arm64-msvc': 1.2.3 - '@rolldown/binding-win32-x64-msvc': 1.2.3 - - rollup@4.62.4: - dependencies: - '@types/estree': 1.0.9 - optionalDependencies: - '@napi-rs/lzma-linux-x64-gnu': 1.5.1 - '@rollup/rollup-android-arm-eabi': 4.62.4 - '@rollup/rollup-android-arm64': 4.62.4 - '@rollup/rollup-darwin-arm64': 4.62.4 - '@rollup/rollup-darwin-x64': 4.62.4 - '@rollup/rollup-freebsd-arm64': 4.62.4 - '@rollup/rollup-freebsd-x64': 4.62.4 - '@rollup/rollup-linux-arm-gnueabihf': 4.62.4 - '@rollup/rollup-linux-arm-musleabihf': 4.62.4 - '@rollup/rollup-linux-arm64-gnu': 4.62.4 - '@rollup/rollup-linux-arm64-musl': 4.62.4 - '@rollup/rollup-linux-loong64-gnu': 4.62.4 - '@rollup/rollup-linux-loong64-musl': 4.62.4 - '@rollup/rollup-linux-ppc64-gnu': 4.62.4 - '@rollup/rollup-linux-ppc64-musl': 4.62.4 - '@rollup/rollup-linux-riscv64-gnu': 4.62.4 - '@rollup/rollup-linux-riscv64-musl': 4.62.4 - '@rollup/rollup-linux-s390x-gnu': 4.62.4 - '@rollup/rollup-linux-x64-gnu': 4.62.4 - '@rollup/rollup-linux-x64-musl': 4.62.4 - '@rollup/rollup-openbsd-x64': 4.62.4 - '@rollup/rollup-openharmony-arm64': 4.62.4 - '@rollup/rollup-win32-arm64-msvc': 4.62.4 - '@rollup/rollup-win32-ia32-msvc': 4.62.4 - '@rollup/rollup-win32-x64-gnu': 4.62.4 - '@rollup/rollup-win32-x64-msvc': 4.62.4 - fsevents: 2.3.3 + '@rolldown/binding-android-arm64': 1.2.4 + '@rolldown/binding-darwin-arm64': 1.2.4 + '@rolldown/binding-darwin-x64': 1.2.4 + '@rolldown/binding-freebsd-x64': 1.2.4 + '@rolldown/binding-linux-arm-gnueabihf': 1.2.4 + '@rolldown/binding-linux-arm64-gnu': 1.2.4 + '@rolldown/binding-linux-arm64-musl': 1.2.4 + '@rolldown/binding-linux-ppc64-gnu': 1.2.4 + '@rolldown/binding-linux-s390x-gnu': 1.2.4 + '@rolldown/binding-linux-x64-gnu': 1.2.4 + '@rolldown/binding-linux-x64-musl': 1.2.4 + '@rolldown/binding-openharmony-arm64': 1.2.4 + '@rolldown/binding-win32-arm64-msvc': 1.2.4 + '@rolldown/binding-win32-x64-msvc': 1.2.4 scslre@0.3.0: dependencies: @@ -5175,8 +4002,6 @@ snapshots: refa: 0.12.1 regexp-ast-analysis: 0.7.1 - search-insights@2.17.3: {} - semver@7.8.5: {} shebang-command@2.0.0: @@ -5185,17 +4010,6 @@ snapshots: shebang-regex@3.0.0: {} - shiki@2.5.0: - dependencies: - '@shikijs/core': 2.5.0 - '@shikijs/engine-javascript': 2.5.0 - '@shikijs/engine-oniguruma': 2.5.0 - '@shikijs/langs': 2.5.0 - '@shikijs/themes': 2.5.0 - '@shikijs/types': 2.5.0 - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.5 - siginfo@2.0.0: {} simple-git-hooks@2.13.1: {} @@ -5204,8 +4018,6 @@ snapshots: source-map-js@1.2.1: {} - space-separated-tokens@2.0.2: {} - spdx-exceptions@2.5.0: {} spdx-expression-parse@5.0.0: @@ -5215,19 +4027,12 @@ snapshots: spdx-license-ids@3.0.23: {} - speakingurl@14.0.1: {} - stackback@0.0.2: {} std-env@4.2.0: {} string-argv@0.3.2: {} - stringify-entities@4.0.4: - dependencies: - character-entities-html4: 2.1.0 - character-entities-legacy: 3.0.0 - strip-indent@4.1.1: {} super-regex@1.1.0: @@ -5236,16 +4041,10 @@ snapshots: make-asynchronous: 1.1.0 time-span: 5.1.0 - superjson@2.2.6: - dependencies: - copy-anything: 4.0.5 - synckit@0.11.13: dependencies: '@pkgr/core': 0.3.6 - tabbable@6.5.0: {} - tapable@2.3.3: {} time-span@5.1.0: @@ -5274,8 +4073,6 @@ snapshots: tree-kill@1.2.2: {} - trim-lines@3.0.1: {} - ts-api-utils@2.5.0(typescript@6.0.3): dependencies: typescript: 6.0.3 @@ -5290,8 +4087,8 @@ snapshots: import-without-cache: 0.4.0 obug: 2.1.4 picomatch: 4.0.5 - rolldown: 1.2.3 - rolldown-plugin-dts: 0.27.14(rolldown@1.2.3)(typescript@6.0.3) + rolldown: 1.2.4 + rolldown-plugin-dts: 0.27.14(rolldown@1.2.4)(typescript@6.0.3) tinyexec: 1.3.0 tinyglobby: 0.2.17 tree-kill: 1.2.2 @@ -5333,10 +4130,6 @@ snapshots: dependencies: '@types/unist': 3.0.3 - unist-util-position@5.0.0: - dependencies: - '@types/unist': 3.0.3 - unist-util-remove-position@5.0.0: dependencies: '@types/unist': 3.0.3 @@ -5357,8 +4150,6 @@ snapshots: unist-util-is: 6.0.1 unist-util-visit-parents: 6.0.2 - universalify@2.0.1: {} - update-browserslist-db@1.3.1(browserslist@4.28.8): dependencies: browserslist: 4.28.8 @@ -5375,79 +4166,25 @@ snapshots: verkit@0.3.2: {} - vfile-message@4.0.3: - dependencies: - '@types/unist': 3.0.3 - unist-util-stringify-position: 4.0.0 - - vfile@6.0.3: - dependencies: - '@types/unist': 3.0.3 - vfile-message: 4.0.3 - - vite@5.4.21(@types/node@26.2.0): + vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0): dependencies: - esbuild: 0.21.5 + lightningcss: 1.33.0 + picomatch: 4.0.5 postcss: 8.5.26 - rollup: 4.62.4 + rolldown: 1.2.4 + tinyglobby: 0.2.17 optionalDependencies: '@types/node': 26.2.0 + esbuild: 0.28.2 fsevents: 2.3.3 + jiti: 2.7.0 + tsx: 4.23.12 + yaml: 2.9.0 - vitepress@1.6.4(@algolia/client-search@5.56.0)(@types/node@26.2.0)(change-case@5.4.4)(postcss@8.5.26)(search-insights@2.17.3)(typescript@6.0.3): - dependencies: - '@docsearch/css': 3.8.2 - '@docsearch/js': 3.8.2(@algolia/client-search@5.56.0)(search-insights@2.17.3) - '@iconify-json/simple-icons': 1.2.93 - '@shikijs/core': 2.5.0 - '@shikijs/transformers': 2.5.0 - '@shikijs/types': 2.5.0 - '@types/markdown-it': 14.1.2 - '@vitejs/plugin-vue': 5.2.4(vite@5.4.21(@types/node@26.2.0))(vue@3.5.41(typescript@6.0.3)) - '@vue/devtools-api': 7.7.10 - '@vue/shared': 3.5.41 - '@vueuse/core': 12.8.2(typescript@6.0.3) - '@vueuse/integrations': 12.8.2(change-case@5.4.4)(focus-trap@7.8.0)(typescript@6.0.3) - focus-trap: 7.8.0 - mark.js: 8.11.1 - minisearch: 7.2.0 - shiki: 2.5.0 - vite: 5.4.21(@types/node@26.2.0) - vue: 3.5.41(typescript@6.0.3) - optionalDependencies: - postcss: 8.5.26 - transitivePeerDependencies: - - '@algolia/client-search' - - '@types/node' - - '@types/react' - - async-validator - - axios - - change-case - - drauu - - fuse.js - - idb-keyval - - jwt-decode - - less - - lightningcss - - nprogress - - preact-render-to-string - - qrcode - - react - - react-dom - - sass - - sass-embedded - - search-insights - - sortablejs - - stylus - - sugarss - - terser - - typescript - - universal-cookie - - vitest@4.1.10(@types/node@26.2.0)(vite@5.4.21(@types/node@26.2.0)): + vitest@4.1.10(@types/node@26.2.0)(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)): dependencies: '@vitest/expect': 4.1.10 - '@vitest/mocker': 4.1.10(vite@5.4.21(@types/node@26.2.0)) + '@vitest/mocker': 4.1.10(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0)) '@vitest/pretty-format': 4.1.10 '@vitest/runner': 4.1.10 '@vitest/snapshot': 4.1.10 @@ -5464,7 +4201,7 @@ snapshots: tinyexec: 1.3.0 tinyglobby: 0.2.17 tinyrainbow: 3.1.1 - vite: 5.4.21(@types/node@26.2.0) + vite: 8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.23.12)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 26.2.0 @@ -5483,16 +4220,6 @@ snapshots: transitivePeerDependencies: - supports-color - vue@3.5.41(typescript@6.0.3): - dependencies: - '@vue/compiler-dom': 3.5.41 - '@vue/compiler-sfc': 3.5.41 - '@vue/runtime-dom': 3.5.41 - '@vue/server-renderer': 3.5.41 - '@vue/shared': 3.5.41 - optionalDependencies: - typescript: 6.0.3 - web-worker@1.5.0: {} which@2.0.2: From fbf24fef2851391b7f1f5c68c7bab5662691530a Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Thu, 13 Aug 2026 22:50:05 +0800 Subject: [PATCH 047/106] fix(output): change output function to log content instead of returning strings - Modified JSON output case to log content and return empty string - Updated markdown output case to log content and return empty string - Changed text output case to log content and return empty string - Removed direct string returns from all output format cases - Added console.log statements for all content types before returning empty strings --- src/utils/output.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/utils/output.ts b/src/utils/output.ts index b359f7e..3f841c4 100644 --- a/src/utils/output.ts +++ b/src/utils/output.ts @@ -4,10 +4,14 @@ import type { ResolvedContent } from '@/types.ts' export const output = (content: ResolvedContent, type: OutputFormat): string => { switch (type) { case 'json': - return JSON.stringify(content.json, null, 2) + console.log(JSON.stringify(content.json, null, 2)) + return '' case 'markdown': + console.log(content.markdown) + return '' case 'text': default: - return content.text + console.log(content.text) + return '' } } From 06533b741479ca18405a9ab36ad19149ed783818 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Thu, 13 Aug 2026 23:15:54 +0800 Subject: [PATCH 048/106] feat(bug): add comprehensive bug report command with issue creation utilities - Implement command arguments for issue title, reproduction link, steps, expected/actual behavior - Add validation for reproduction URL format and exit on invalid URLs - Create issue body generator with environment information collection - Build GitHub issue URL with parameter truncation for length limits - Add utility functions for URL validation and issue formatting - Integrate environment detection for Vue, Vite, Antdv, Node.js versions - Support multiple output formats (JSON, text, markdown) for issue preview - Add submit flag for direct GitHub CLI integration - Include package manager version detection and system information - Generate formatted markdown tables with environment details - Add special handling for CodeSandbox and StackBlitz links - Implement URL truncation logic when exceeding GitHub's URL length limits --- src/commands/bug.ts | 90 ++++++++++++++++++++++++++++++- src/constants/repo.ts | 1 + src/types.ts | 25 +++++++++ src/utils/is.ts | 3 ++ src/utils/issue.ts | 121 ++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 238 insertions(+), 2 deletions(-) create mode 100644 src/constants/repo.ts create mode 100644 src/utils/is.ts create mode 100644 src/utils/issue.ts diff --git a/src/commands/bug.ts b/src/commands/bug.ts index b8fe2cd..049c6fb 100644 --- a/src/commands/bug.ts +++ b/src/commands/bug.ts @@ -1,11 +1,97 @@ +import process from 'node:process' import { defineCommand } from 'citty' +import { defaultArgs } from '@/args.ts' +import { ANTDV_REPO } from '@/constants/repo.ts' +import { isUrl } from '@/utils/is.ts' +import { buildIssueUrl, collectAntdvEnv, createIssueBody } from '@/utils/issue.ts' +import { output } from '@/utils/output.ts' export default defineCommand({ meta: { name: 'bug', description: 'Report a bug to the antdv-next repository', }, - run({ args }) { - console.log('Parsed args:', args) + args: { + ...defaultArgs, + // 问题标题 + title: { + type: 'string', + description: 'Issue title', + required: true, + alias: 't', + }, + // 重现链接 + reproduction: { + type: 'string', + description: 'Reproduction link', + default: '', + }, + // 重现步骤 + steps: { + type: 'string', + description: 'Steps to reproduce', + default: '', + }, + // 期望的结果是什么? + expected: { + type: 'string', + description: 'Expected behavior', + default: '', + }, + // 实际的结果是什么? + actual: { + type: 'string', + description: 'Actual behavior', + default: '', + }, + // 补充说明 + extra: { + type: 'string', + description: 'Additional comments', + default: '', + }, + // 是否 cli 创建 issues + submit: { + type: 'boolean', + description: 'Submit via gh CLI instead of previewing', + default: false, + }, + }, + async run({ args }) { + const env = await collectAntdvEnv(args.cwd) + + if (args.reproduction.length > 1 && !isUrl(args.reproduction)) { + console.log('Please provide a valid URL for the reproduction link.') + process.exit(1) + } + + const body = createIssueBody({ + reproduction: args.reproduction, + steps: args.steps, + expected: args.expected, + actual: args.actual, + extra: args.extra, + env, + }) + + const url = buildIssueUrl(args.title, ANTDV_REPO, body) + + output({ + json: { + repo: ANTDV_REPO, + title: args.title, + body, + url, + }, + text: `Repository: ${ANTDV_REPO} +Title: ${args.title} + +--- Issue Body --- +${body} +--- Issue End --- + +To submit, re-run with --submit flag.\n`, + markdown: body, + }, args.format) }, }) diff --git a/src/constants/repo.ts b/src/constants/repo.ts new file mode 100644 index 0000000..43c2391 --- /dev/null +++ b/src/constants/repo.ts @@ -0,0 +1 @@ +export const ANTDV_REPO = 'antdv-next/antdv-next' diff --git a/src/types.ts b/src/types.ts index 6a4f080..4ddf255 100644 --- a/src/types.ts +++ b/src/types.ts @@ -15,3 +15,28 @@ export interface ResolvedContent { text: string markdown: string } + +export interface ResolvedAntdvVersionEnv { + vue: string + vite: string + antdv: string + cli: string + typescript: string + system: string + package: { + node: string + npm: string + pnpm: string + deno: string + bun: string + } +} + +export interface AntdvIssueFields { + reproduction: string + steps: string + expected: string + actual: string + extra: string + env: ResolvedAntdvVersionEnv +} diff --git a/src/utils/is.ts b/src/utils/is.ts new file mode 100644 index 0000000..7c0c890 --- /dev/null +++ b/src/utils/is.ts @@ -0,0 +1,3 @@ +export const isUrl = (link: string): boolean => { + return /^(https?):\/\/[^ \t\r\n\f\v\u00A0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]{2,}$/.test(link) +} diff --git a/src/utils/issue.ts b/src/utils/issue.ts new file mode 100644 index 0000000..4cbeeea --- /dev/null +++ b/src/utils/issue.ts @@ -0,0 +1,121 @@ +import type { AntdvIssueFields, ResolvedAntdvVersionEnv } from '@/types.ts' +import { platform, release } from 'node:os' +import process from 'node:process' +import { getInstalledPackageVersion } from '@/commands/env.ts' +import { getPackageManagerVersion } from '@/utils/env.ts' + +const MAX_URL_LENGTH = 8000 + +export const collectAntdvEnv = async (cwd: string): Promise => { + return { + antdv: await getInstalledPackageVersion(cwd, 'antdv-next') || 'unknown', + + vue: await getInstalledPackageVersion(cwd, 'vue') || 'unknown', + vite: await getInstalledPackageVersion(cwd, 'vite') || 'unknown', + + typescript: await getInstalledPackageVersion(cwd, 'typescript') || 'unknown', + package: { + node: process.versions.node, + npm: await getPackageManagerVersion(cwd, 'npm'), + pnpm: await getPackageManagerVersion(cwd, 'pnpm'), + deno: await getPackageManagerVersion(cwd, 'deno'), + bun: await getPackageManagerVersion(cwd, 'bun'), + }, + system: `${platform()} ${release()}`, + cli: __CLI_VERSION__, + } +} + +export const createIssueBody = ({ reproduction, steps, expected, actual, extra, env }: AntdvIssueFields): string => { + const { vue, vite, antdv, cli, typescript, system } = env + const { npm, pnpm, node } = env.package + + let body = `### Reproduction link + +${createReproductionLink(reproduction)} + +### Steps to reproduce + +${steps} + +### What is expected? + +${expected} + +### What is actually happening? + +${actual} + +| Environment | Info | +| --- | --- | +| Vue | ${vue} | +| Vite | ${vite} | +| Antdv | ${antdv} | +| TypeScript | ${typescript} | +| Cli | ${cli} | +| Node | ${node} | +| Npm | ${npm} | +| Pnpm | ${pnpm} | +| System | ${system} | + +`.trim() + + if (extra) { + body += [ + '\n', + '---', + extra, + ].join('\n') + } + + body += [ + '\n', + '---', + 'Generated by [@antdv-next/cli](https://github.com/antdv-next/cli)', + ].join('\n') + return body +} + +function createReproductionLink(link: string): string { + if (!link) { + return '' + } + + if (link.includes('codesandbox.io')) { + return `[![Edit on CodeSandbox](https://codesandbox.io/static/img/play-codesandbox.svg)](${link})` + } + else if (link.includes('stackblitz.com')) { + return `[![Edit on StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](${link})` + } + + return `[${link}](${link})` +} + +export function buildIssueUrl(title: string, repo: string, body: string): string { + const baseUrl = `https://github.com/${repo}/issues/new` + const params = new URLSearchParams({ title, body }) + let url = `${baseUrl}?${params.toString()}` + + if (url.length > MAX_URL_LENGTH) { + const truncationNote = '\n\n(Content truncated. Please add remaining details after opening.)' + let lo = 0 + let hi = body.length + while (lo < hi) { + const mid = Math.ceil((lo + hi) / 2) + const truncated = body.slice(0, mid) + truncationNote + const testParams = new URLSearchParams({ title, body: truncated }) + const testUrl = `${baseUrl}?${testParams.toString()}` + if (testUrl.length <= MAX_URL_LENGTH) { + lo = mid + } + else { + hi = mid - 1 + } + } + const truncatedBody = body.slice(0, lo) + truncationNote + const finalParams = new URLSearchParams({ title, body: truncatedBody }) + url = `${baseUrl}?${finalParams.toString()}` + } + + return url +} From f648b80b53ad3fd17e914ae2f41f1f2a4926b036 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Thu, 13 Aug 2026 23:19:46 +0800 Subject: [PATCH 049/106] test(issue): add comprehensive test suite for issue utilities - Add tests for collectAntdvEnv function with dependency version collection - Include tests for handling missing dependencies and unknown version cases - Create tests for createIssueBody function with various reproduction links - Add tests for StackBlitz and CodeSandbox link rendering - Include tests for empty extra information section handling - Add tests for buildIssueUrl function with encoded parameters - Implement tests for body truncation with oversized content - Mock package manager and system environment functions - Verify proper URL parameter encoding and length limitations --- test/issue.test.ts | 219 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 219 insertions(+) create mode 100644 test/issue.test.ts diff --git a/test/issue.test.ts b/test/issue.test.ts new file mode 100644 index 0000000..20b0d90 --- /dev/null +++ b/test/issue.test.ts @@ -0,0 +1,219 @@ +import type { ResolvedAntdvVersionEnv } from '../src/types' +import process from 'node:process' +import { beforeEach, describe, expect, it, vi } from 'vitest' +import { buildIssueUrl, collectAntdvEnv, createIssueBody } from '../src/utils/issue' + +const mocks = vi.hoisted(() => ({ + getInstalledPackageVersion: vi.fn(), + getPackageManagerVersion: vi.fn(), + platform: vi.fn(() => 'test-platform'), + release: vi.fn(() => 'test-release'), +})) + +vi.mock('@/commands/env.ts', () => ({ + getInstalledPackageVersion: mocks.getInstalledPackageVersion, +})) + +vi.mock('@/utils/env.ts', () => ({ + getPackageManagerVersion: mocks.getPackageManagerVersion, +})) + +vi.mock('node:os', () => ({ + platform: mocks.platform, + release: mocks.release, +})) + +const env: ResolvedAntdvVersionEnv = { + vue: '3.5.21', + vite: '7.1.5', + antdv: '1.2.3', + cli: '0.0.0', + typescript: '5.9.2', + system: 'darwin 24.6.0', + package: { + node: '22.19.0', + npm: '10.9.3', + pnpm: '10.15.1', + deno: '2.4.5', + bun: '1.2.21', + }, +} + +beforeEach(() => { + mocks.getInstalledPackageVersion.mockReset().mockResolvedValue(null) + mocks.getPackageManagerVersion.mockReset().mockResolvedValue('0.0.0') + mocks.platform.mockClear() + mocks.release.mockClear() +}) + +describe('collectAntdvEnv', () => { + it('collects dependency, package manager, runtime, system, and CLI versions', async () => { + mocks.getInstalledPackageVersion + .mockResolvedValueOnce('1.2.3') + .mockResolvedValueOnce('3.5.21') + .mockResolvedValueOnce('7.1.5') + .mockResolvedValueOnce('5.9.2') + mocks.getPackageManagerVersion + .mockResolvedValueOnce('10.9.3') + .mockResolvedValueOnce('10.15.1') + .mockResolvedValueOnce('2.4.5') + .mockResolvedValueOnce('1.2.21') + + await expect(collectAntdvEnv('/project')).resolves.toEqual({ + antdv: '1.2.3', + vue: '3.5.21', + vite: '7.1.5', + typescript: '5.9.2', + package: { + node: process.versions.node, + npm: '10.9.3', + pnpm: '10.15.1', + deno: '2.4.5', + bun: '1.2.21', + }, + system: 'test-platform test-release', + cli: '0.0.0', + }) + + expect(mocks.getInstalledPackageVersion).toHaveBeenNthCalledWith(1, '/project', 'antdv-next') + expect(mocks.getInstalledPackageVersion).toHaveBeenNthCalledWith(2, '/project', 'vue') + expect(mocks.getInstalledPackageVersion).toHaveBeenNthCalledWith(3, '/project', 'vite') + expect(mocks.getInstalledPackageVersion).toHaveBeenNthCalledWith(4, '/project', 'typescript') + expect(mocks.getPackageManagerVersion).toHaveBeenNthCalledWith(1, '/project', 'npm') + expect(mocks.getPackageManagerVersion).toHaveBeenNthCalledWith(2, '/project', 'pnpm') + expect(mocks.getPackageManagerVersion).toHaveBeenNthCalledWith(3, '/project', 'deno') + expect(mocks.getPackageManagerVersion).toHaveBeenNthCalledWith(4, '/project', 'bun') + }) + + it('uses unknown when an expected dependency is not installed', async () => { + const result = await collectAntdvEnv('/missing-dependencies') + + expect(result).toMatchObject({ + antdv: 'unknown', + vue: 'unknown', + vite: 'unknown', + typescript: 'unknown', + }) + }) +}) + +describe('createIssueBody', () => { + it('creates the complete issue template and appends extra information', () => { + const body = createIssueBody({ + reproduction: 'https://example.com/reproduction', + steps: '1. Open the reproduction\n2. Click the button', + expected: 'The dialog opens.', + actual: 'Nothing happens.', + extra: 'This only happens after a page refresh.', + env, + }) + + expect(body).toBe(`### Reproduction link + +[https://example.com/reproduction](https://example.com/reproduction) + +### Steps to reproduce + +1. Open the reproduction +2. Click the button + +### What is expected? + +The dialog opens. + +### What is actually happening? + +Nothing happens. + +| Environment | Info | +| --- | --- | +| Vue | 3.5.21 | +| Vite | 7.1.5 | +| Antdv | 1.2.3 | +| TypeScript | 5.9.2 | +| Cli | 0.0.0 | +| Node | 22.19.0 | +| Npm | 10.9.3 | +| Pnpm | 10.15.1 | +| System | darwin 24.6.0 | + +--- +This only happens after a page refresh. + +--- +Generated by [@antdv-next/cli](https://github.com/antdv-next/cli)`) + }) + + it.each([ + { + name: 'CodeSandbox', + link: 'https://codesandbox.io/p/sandbox/antdv-demo', + markdown: '[![Edit on CodeSandbox](https://codesandbox.io/static/img/play-codesandbox.svg)](https://codesandbox.io/p/sandbox/antdv-demo)', + }, + { + name: 'StackBlitz', + link: 'https://stackblitz.com/edit/antdv-demo', + markdown: '[![Edit on StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/edit/antdv-demo)', + }, + { + name: 'an empty reproduction', + link: '', + markdown: '', + }, + ])('renders $name link correctly', ({ link, markdown }) => { + const body = createIssueBody({ + reproduction: link, + steps: 'Reproduce the issue.', + expected: 'Expected result.', + actual: 'Actual result.', + extra: '', + env, + }) + + expect(body).toContain(`### Reproduction link\n\n${markdown}\n\n### Steps to reproduce`) + }) + + it('does not add an empty extra-information section', () => { + const body = createIssueBody({ + reproduction: '', + steps: 'Reproduce the issue.', + expected: 'Expected result.', + actual: 'Actual result.', + extra: '', + env, + }) + + expect(body.match(/^---$/gm)).toHaveLength(1) + expect(body.endsWith('Generated by [@antdv-next/cli](https://github.com/antdv-next/cli)')).toBe(true) + }) +}) + +describe('buildIssueUrl', () => { + it('builds a GitHub new-issue URL with encoded title and body', () => { + const result = buildIssueUrl( + 'Button: click & focus', + 'antdv-next/antdv-next', + 'Expected = open\nActual = closed', + ) + const url = new URL(result) + + expect(url.origin).toBe('https://github.com') + expect(url.pathname).toBe('/antdv-next/antdv-next/issues/new') + expect(url.searchParams.get('title')).toBe('Button: click & focus') + expect(url.searchParams.get('body')).toBe('Expected = open\nActual = closed') + }) + + it('truncates an oversized encoded body and preserves a useful suffix', () => { + const body = '% &=中文\n'.repeat(2_000) + const result = buildIssueUrl('Large issue', 'antdv-next/antdv-next', body) + const parsedBody = new URL(result).searchParams.get('body') ?? '' + const truncationNote = '\n\n(Content truncated. Please add remaining details after opening.)' + const retainedBody = parsedBody.slice(0, -truncationNote.length) + + expect(result.length).toBeLessThanOrEqual(8_000) + expect(result.length).toBeGreaterThan(7_900) + expect(parsedBody.endsWith(truncationNote)).toBe(true) + expect(retainedBody.length).toBeLessThan(body.length) + expect(body.startsWith(retainedBody)).toBe(true) + }) +}) From a89be11919ce97b0cbf25ac733a32faf9141f4fc Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Thu, 13 Aug 2026 23:21:52 +0800 Subject: [PATCH 050/106] test(bug): add comprehensive unit tests for bug command functionality - Add mock implementations for issue utility functions - Create test cases for collecting issue details and preview rendering - Verify proper handling of optional issue fields with default values - Test validation logic for reproduction link URLs - Ensure correct error handling and process exit behavior - Validate JSON, text, and markdown output formats - Test environment collection and issue body generation workflows --- test/bug.test.ts | 158 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 test/bug.test.ts diff --git a/test/bug.test.ts b/test/bug.test.ts new file mode 100644 index 0000000..b2ca5aa --- /dev/null +++ b/test/bug.test.ts @@ -0,0 +1,158 @@ +import type { ResolvedAntdvVersionEnv } from '../src/types' +import process from 'node:process' +import { runCommand } from 'citty' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import bugCommand from '../src/commands/bug' +import { ANTDV_REPO } from '../src/constants/repo' + +const mocks = vi.hoisted(() => ({ + buildIssueUrl: vi.fn(), + collectAntdvEnv: vi.fn(), + createIssueBody: vi.fn(), + output: vi.fn(), +})) + +vi.mock('@/utils/issue.ts', () => ({ + buildIssueUrl: mocks.buildIssueUrl, + collectAntdvEnv: mocks.collectAntdvEnv, + createIssueBody: mocks.createIssueBody, +})) + +vi.mock('@/utils/output.ts', () => ({ + output: mocks.output, +})) + +const env: ResolvedAntdvVersionEnv = { + vue: '3.5.0', + vite: '7.0.0', + antdv: '1.0.0', + cli: '0.0.0', + typescript: '6.0.0', + system: 'darwin 25.0.0', + package: { + node: '26.0.0', + npm: '11.0.0', + pnpm: '11.9.0', + deno: '2.0.0', + bun: '1.0.0', + }, +} + +const issueBody = 'generated issue body' +const issueUrl = 'https://github.com/antdv-next/antdv-next/issues/new?title=Button' + +beforeEach(() => { + vi.clearAllMocks() + mocks.collectAntdvEnv.mockResolvedValue(env) + mocks.createIssueBody.mockReturnValue(issueBody) + mocks.buildIssueUrl.mockReturnValue(issueUrl) +}) + +afterEach(() => { + vi.restoreAllMocks() +}) + +describe('bug command', () => { + it('collects issue details and renders the requested preview format', async () => { + await runCommand(bugCommand, { + rawArgs: [ + '--cwd', + '/tmp/example-project', + '--title', + 'Button cannot be clicked', + '--reproduction', + 'https://stackblitz.com/edit/example', + '--steps', + 'Open the demo and click the button', + '--expected', + 'The click handler runs', + '--actual', + 'Nothing happens', + '--extra', + 'Only reproducible in production', + '--format', + 'markdown', + ], + }) + + expect(mocks.collectAntdvEnv).toHaveBeenCalledWith('/tmp/example-project') + expect(mocks.createIssueBody).toHaveBeenCalledWith({ + reproduction: 'https://stackblitz.com/edit/example', + steps: 'Open the demo and click the button', + expected: 'The click handler runs', + actual: 'Nothing happens', + extra: 'Only reproducible in production', + env, + }) + expect(mocks.buildIssueUrl).toHaveBeenCalledWith( + 'Button cannot be clicked', + ANTDV_REPO, + issueBody, + ) + expect(mocks.output).toHaveBeenCalledWith({ + json: { + repo: ANTDV_REPO, + title: 'Button cannot be clicked', + body: issueBody, + url: issueUrl, + }, + text: `Repository: ${ANTDV_REPO} +Title: Button cannot be clicked + +--- Issue Body --- +${issueBody} +--- Issue End --- + +To submit, re-run with --submit flag.\n`, + markdown: issueBody, + }, 'markdown') + }) + + it('uses empty optional issue fields and text output by default', async () => { + await runCommand(bugCommand, { + rawArgs: [ + '--cwd', + '/tmp/example-project', + '--title', + 'Minimal report', + ], + }) + + expect(mocks.createIssueBody).toHaveBeenCalledWith({ + reproduction: '', + steps: '', + expected: '', + actual: '', + extra: '', + env, + }) + expect(mocks.output).toHaveBeenCalledOnce() + expect(mocks.output.mock.calls[0]?.[1]).toBe('text') + }) + + it('exits before building the issue when the reproduction link is invalid', async () => { + const exitError = new Error('process exited') + const logSpy = vi.spyOn(console, 'log').mockImplementation(() => {}) + const exitSpy = vi.spyOn(process, 'exit').mockImplementation(() => { + throw exitError + }) + + await expect(runCommand(bugCommand, { + rawArgs: [ + '--cwd', + '/tmp/example-project', + '--title', + 'Invalid reproduction', + '--reproduction', + 'not-a-url', + ], + })).rejects.toBe(exitError) + + expect(mocks.collectAntdvEnv).toHaveBeenCalledWith('/tmp/example-project') + expect(logSpy).toHaveBeenCalledWith('Please provide a valid URL for the reproduction link.') + expect(exitSpy).toHaveBeenCalledWith(1) + expect(mocks.createIssueBody).not.toHaveBeenCalled() + expect(mocks.buildIssueUrl).not.toHaveBeenCalled() + expect(mocks.output).not.toHaveBeenCalled() + }) +}) From 3ad8e9cc518e52e0a763c8225841d150f61cae21 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Thu, 13 Aug 2026 23:34:00 +0800 Subject: [PATCH 051/106] refactor(bug): extract bug creation logic into separate function - Move bug creation logic from command run method to createBug function - Remove unused process import from node:process - Separate concerns by extracting issue creation functionality - Improve code organization and testability - Maintain same functionality while improving structure --- src/commands/bug.ts | 75 +++++++++++++++++++++++---------------------- 1 file changed, 39 insertions(+), 36 deletions(-) diff --git a/src/commands/bug.ts b/src/commands/bug.ts index 049c6fb..dcd015f 100644 --- a/src/commands/bug.ts +++ b/src/commands/bug.ts @@ -1,4 +1,3 @@ -import process from 'node:process' import { defineCommand } from 'citty' import { defaultArgs } from '@/args.ts' import { ANTDV_REPO } from '@/constants/repo.ts' @@ -6,6 +5,44 @@ import { isUrl } from '@/utils/is.ts' import { buildIssueUrl, collectAntdvEnv, createIssueBody } from '@/utils/issue.ts' import { output } from '@/utils/output.ts' +export async function createBug(repo: string, args: any): Promise { + const env = await collectAntdvEnv(args.cwd) + + if (args.reproduction.length > 1 && !isUrl(args.reproduction)) { + console.log('Please provide a valid URL for the reproduction link.') + process.exit(1) + } + + const body = createIssueBody({ + reproduction: args.reproduction, + steps: args.steps, + expected: args.expected, + actual: args.actual, + extra: args.extra, + env, + }) + + const url = buildIssueUrl(args.title, repo, body) + + output({ + json: { + repo, + title: args.title, + body, + url, + }, + text: `Repository: ${repo} +Title: ${args.title} + +--- Issue Body --- +${body} +--- Issue End --- + +To submit, re-run with --submit flag.\n`, + markdown: body, + }, args.format) +} + export default defineCommand({ meta: { name: 'bug', @@ -58,40 +95,6 @@ export default defineCommand({ }, }, async run({ args }) { - const env = await collectAntdvEnv(args.cwd) - - if (args.reproduction.length > 1 && !isUrl(args.reproduction)) { - console.log('Please provide a valid URL for the reproduction link.') - process.exit(1) - } - - const body = createIssueBody({ - reproduction: args.reproduction, - steps: args.steps, - expected: args.expected, - actual: args.actual, - extra: args.extra, - env, - }) - - const url = buildIssueUrl(args.title, ANTDV_REPO, body) - - output({ - json: { - repo: ANTDV_REPO, - title: args.title, - body, - url, - }, - text: `Repository: ${ANTDV_REPO} -Title: ${args.title} - ---- Issue Body --- -${body} ---- Issue End --- - -To submit, re-run with --submit flag.\n`, - markdown: body, - }, args.format) + await createBug(ANTDV_REPO, args) }, }) From 5420ca7dde7bcbcdabacb96898dc8ce1958149ba Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Thu, 13 Aug 2026 23:40:25 +0800 Subject: [PATCH 052/106] refactor(bug): extract bug command arguments to separate module - Move bug command argument definitions to new args/bug.ts file - Replace inline args object with imported bugArgs reference - Update createBug function signature to use typed ParsedArgs - Maintain all existing argument definitions and configurations - Improve code organization by separating command logic from arguments --- src/args/bug.ts | 49 ++++++++++++++++++++++++++++++++++++++++++ src/commands/bug.ts | 52 ++++----------------------------------------- 2 files changed, 53 insertions(+), 48 deletions(-) create mode 100644 src/args/bug.ts diff --git a/src/args/bug.ts b/src/args/bug.ts new file mode 100644 index 0000000..9d0f204 --- /dev/null +++ b/src/args/bug.ts @@ -0,0 +1,49 @@ +import type { ArgsDef } from 'citty' +import { defaultArgs } from '@/args.ts' + +export const bugArgs = { + ...defaultArgs, + // 问题标题 + title: { + type: 'string', + description: 'Issue title', + required: true, + alias: 't', + }, + // 重现链接 + reproduction: { + type: 'string', + description: 'Reproduction link', + default: '', + }, + // 重现步骤 + steps: { + type: 'string', + description: 'Steps to reproduce', + default: '', + }, + // 期望的结果是什么? + expected: { + type: 'string', + description: 'Expected behavior', + default: '', + }, + // 实际的结果是什么? + actual: { + type: 'string', + description: 'Actual behavior', + default: '', + }, + // 补充说明 + extra: { + type: 'string', + description: 'Additional comments', + default: '', + }, + // 是否 cli 创建 issues + submit: { + type: 'boolean', + description: 'Submit via gh CLI instead of previewing', + default: false, + }, +} satisfies ArgsDef diff --git a/src/commands/bug.ts b/src/commands/bug.ts index dcd015f..295f315 100644 --- a/src/commands/bug.ts +++ b/src/commands/bug.ts @@ -1,11 +1,12 @@ +import type { ParsedArgs } from 'citty' import { defineCommand } from 'citty' -import { defaultArgs } from '@/args.ts' +import { bugArgs } from '@/args/bug.ts' import { ANTDV_REPO } from '@/constants/repo.ts' import { isUrl } from '@/utils/is.ts' import { buildIssueUrl, collectAntdvEnv, createIssueBody } from '@/utils/issue.ts' import { output } from '@/utils/output.ts' -export async function createBug(repo: string, args: any): Promise { +export async function createBug(repo: string, args: ParsedArgs): Promise { const env = await collectAntdvEnv(args.cwd) if (args.reproduction.length > 1 && !isUrl(args.reproduction)) { @@ -48,52 +49,7 @@ export default defineCommand({ name: 'bug', description: 'Report a bug to the antdv-next repository', }, - args: { - ...defaultArgs, - // 问题标题 - title: { - type: 'string', - description: 'Issue title', - required: true, - alias: 't', - }, - // 重现链接 - reproduction: { - type: 'string', - description: 'Reproduction link', - default: '', - }, - // 重现步骤 - steps: { - type: 'string', - description: 'Steps to reproduce', - default: '', - }, - // 期望的结果是什么? - expected: { - type: 'string', - description: 'Expected behavior', - default: '', - }, - // 实际的结果是什么? - actual: { - type: 'string', - description: 'Actual behavior', - default: '', - }, - // 补充说明 - extra: { - type: 'string', - description: 'Additional comments', - default: '', - }, - // 是否 cli 创建 issues - submit: { - type: 'boolean', - description: 'Submit via gh CLI instead of previewing', - default: false, - }, - }, + args: bugArgs, async run({ args }) { await createBug(ANTDV_REPO, args) }, From 4ae86749edbd0a77c067ef075fe9f9659eedfd6b Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Thu, 13 Aug 2026 23:42:23 +0800 Subject: [PATCH 053/106] refactor(args): move default arguments to separate file - Move OUTPUT_FORMATS and defaultArgs from src/args.ts to src/args/default.ts - Update import paths in bug.ts, config.ts, env.ts, index.ts, output.ts and types.ts - Maintain same argument definitions and types in new location - Keep all existing functionality unchanged while improving code organization --- src/args/bug.ts | 2 +- src/{args.ts => args/default.ts} | 0 src/commands/env.ts | 2 +- src/config.ts | 2 +- src/index.ts | 2 +- src/types.ts | 2 +- src/utils/output.ts | 2 +- 7 files changed, 6 insertions(+), 6 deletions(-) rename src/{args.ts => args/default.ts} (100%) diff --git a/src/args/bug.ts b/src/args/bug.ts index 9d0f204..e8d7fc4 100644 --- a/src/args/bug.ts +++ b/src/args/bug.ts @@ -1,5 +1,5 @@ import type { ArgsDef } from 'citty' -import { defaultArgs } from '@/args.ts' +import { defaultArgs } from '@/args/default.ts' export const bugArgs = { ...defaultArgs, diff --git a/src/args.ts b/src/args/default.ts similarity index 100% rename from src/args.ts rename to src/args/default.ts diff --git a/src/commands/env.ts b/src/commands/env.ts index d11a294..f3518bb 100644 --- a/src/commands/env.ts +++ b/src/commands/env.ts @@ -2,7 +2,7 @@ import type { PackageInfo, ResolvedConfig } from '@/types.ts' import { defineCommand } from 'citty' import { getPackageInfo, loadPackageJSON } from 'local-pkg' import { x } from 'tinyexec' -import { defaultArgs } from '@/args.ts' +import { defaultArgs } from '@/args/default.ts' import { resolveConfig } from '@/config.ts' import { output } from '@/utils/output.ts' diff --git a/src/config.ts b/src/config.ts index 1c0e5cd..4a09d6e 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1,4 +1,4 @@ -import type { CommandArgs } from '@/args.ts' +import type { CommandArgs } from '@/args/default.ts' import type { ResolvedConfig } from '@/types.ts' export const resolveConfig = (options: CommandArgs): ResolvedConfig => { diff --git a/src/index.ts b/src/index.ts index 20edcc3..778e6e8 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,5 @@ import { createMain, defineCommand, renderUsage, showUsage } from 'citty' -import { defaultArgs } from '@/args.ts' +import { defaultArgs } from '@/args/default.ts' import { createHelpBanner } from '@/utils/banner.ts' import { description, name, version } from '../package.json' with { type: 'json' } diff --git a/src/types.ts b/src/types.ts index 4ddf255..0a916fb 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,4 +1,4 @@ -import type { OutputFormat } from '@/args.ts' +import type { OutputFormat } from '@/args/default.ts' export interface ResolvedConfig { cwd: string diff --git a/src/utils/output.ts b/src/utils/output.ts index 3f841c4..03d884a 100644 --- a/src/utils/output.ts +++ b/src/utils/output.ts @@ -1,4 +1,4 @@ -import type { OutputFormat } from '@/args.ts' +import type { OutputFormat } from '@/args/default.ts' import type { ResolvedContent } from '@/types.ts' export const output = (content: ResolvedContent, type: OutputFormat): string => { From ee8f183c635a392ed137a011ceb4d07834742e04 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Thu, 13 Aug 2026 23:47:56 +0800 Subject: [PATCH 054/106] feat(bug): implement bug reporting command for cli repository - Add bugArgs import for argument parsing - Integrate createBug function to handle bug submission - Add ANTDV_REPO_CLI constant for cli repository reference - Configure command with proper arguments and async execution - Connect command to antdv-next/cli repository instead of main repo --- src/commands/bug-cli.ts | 8 ++++++-- src/constants/repo.ts | 1 + 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/commands/bug-cli.ts b/src/commands/bug-cli.ts index c4c5acd..e68719e 100644 --- a/src/commands/bug-cli.ts +++ b/src/commands/bug-cli.ts @@ -1,11 +1,15 @@ import { defineCommand } from 'citty' +import { bugArgs } from '@/args/bug.ts' +import { createBug } from '@/commands/bug.ts' +import { ANTDV_REPO_CLI } from '@/constants/repo.ts' export default defineCommand({ meta: { name: 'bug-cli', description: 'Report a bug to the @antdv-next/cli repository', }, - run({ args }) { - console.log('Parsed args:', args) + args: bugArgs, + async run({ args }) { + await createBug(ANTDV_REPO_CLI, args) }, }) diff --git a/src/constants/repo.ts b/src/constants/repo.ts index 43c2391..8b7a5f3 100644 --- a/src/constants/repo.ts +++ b/src/constants/repo.ts @@ -1 +1,2 @@ export const ANTDV_REPO = 'antdv-next/antdv-next' +export const ANTDV_REPO_CLI = 'antdv-next/cli' From cc1d25ad42e522e179a1dd21515d82c8c2b63d5f Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Thu, 13 Aug 2026 23:48:12 +0800 Subject: [PATCH 055/106] types(config): remove redundant baseUrl from tsconfig - Removed baseUrl option that was set to default value "./" - Simplified compiler options by eliminating unnecessary configuration - Maintained existing path mappings for @/* imports - Reduced configuration complexity while preserving functionality --- tsconfig.json | 1 - 1 file changed, 1 deletion(-) diff --git a/tsconfig.json b/tsconfig.json index cb2416a..7e25be6 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,6 @@ { "extends": "@lonewolfyx/tsconfig/tsconfig.lib.json", "compilerOptions": { - "baseUrl": "./", "paths": { "@/*": [ "./src/*" From f453831013e165d82b7a177c8a8d34a1df09cd1e Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Fri, 14 Aug 2026 11:10:05 +0800 Subject: [PATCH 056/106] feat(design): add design.md command with proper file reading - Import necessary node modules (readFile, join, process) and utils - Add defaultArgs to command configuration - Implement async file reading from data directory - Support both plain text and JSON format output - Write content to stdout directly instead of using console.log - Register command as 'design.md' instead of 'design' - Add data/design.md file with comprehensive design tokens - Create loader utility for accessing data path --- data/design.md | 330 +++++++++++++++++++++++++++++++++++++++++ src/commands/design.ts | 16 +- src/index.ts | 2 +- src/utils/loader.ts | 6 + 4 files changed, 351 insertions(+), 3 deletions(-) create mode 100644 data/design.md create mode 100644 src/utils/loader.ts diff --git a/data/design.md b/data/design.md new file mode 100644 index 0000000..fd41421 --- /dev/null +++ b/data/design.md @@ -0,0 +1,330 @@ +--- +version: alpha +name: Antdv Next +description: Enterprise-grade React UI design system from Ant Group, built around the values Natural, Certain, Meaningful, and Growing. +colors: + primary: '#1677FF' + success: '#52C41A' + warning: '#FAAD14' + error: '#FF4D4F' + info: '#1677FF' + blue: '#1677FF' + blue-7: '#0958D9' + purple: '#722ED1' + cyan: '#13C2C2' + green: '#52C41A' + magenta: '#EB2F96' + red: '#F5222D' + orange: '#FA8C16' + yellow: '#FADB14' + volcano: '#FA541C' + geekblue: '#2F54EB' + gold: '#FAAD14' + lime: '#A0D911' + surface: '#FFFFFF' + surface-container: '#FAFAFA' + surface-layout: '#F5F5F5' + on-surface: '#1F1F1F' + on-surface-variant: '#595959' + on-surface-disabled: '#BFBFBF' + outline: '#D9D9D9' + outline-variant: '#F0F0F0' +typography: + display-lg: + fontFamily: "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif" + fontSize: 38px + fontWeight: '600' + lineHeight: 46px + headline-lg: + fontFamily: "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif" + fontSize: 30px + fontWeight: '600' + lineHeight: 38px + headline-md: + fontFamily: "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif" + fontSize: 24px + fontWeight: '600' + lineHeight: 32px + headline-sm: + fontFamily: "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif" + fontSize: 20px + fontWeight: '600' + lineHeight: 28px + title-lg: + fontFamily: "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif" + fontSize: 16px + fontWeight: '600' + lineHeight: 24px + title-md: + fontFamily: "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif" + fontSize: 14px + fontWeight: '600' + lineHeight: 22px + body-lg: + fontFamily: "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif" + fontSize: 16px + fontWeight: '400' + lineHeight: 24px + body-md: + fontFamily: "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif" + fontSize: 14px + fontWeight: '400' + lineHeight: 22px + body-sm: + fontFamily: "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif" + fontSize: 12px + fontWeight: '400' + lineHeight: 20px + code: + fontFamily: "'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace" + fontSize: 13px + fontWeight: '400' + lineHeight: 20px +rounded: + none: 0px + sm: 2px + md: 4px + DEFAULT: 6px + lg: 8px + xl: 16px + full: 9999px +spacing: + unit: 4px + xs: 4px + sm: 8px + md: 16px + lg: 24px + xl: 32px + control-height: 32px +components: + button-primary: + backgroundColor: '{colors.primary}' + textColor: '#FFFFFF' + typography: '{typography.body-md}' + rounded: '{rounded.DEFAULT}' + height: 32px + padding: 0 15px + button-primary-hover: + backgroundColor: '#4096FF' + button-primary-active: + backgroundColor: '#0958D9' + button-default: + backgroundColor: '{colors.surface}' + textColor: '{colors.on-surface}' + typography: '{typography.body-md}' + rounded: '{rounded.DEFAULT}' + height: 32px + padding: 0 15px + button-default-hover: + textColor: '#4096FF' + input-field: + backgroundColor: '{colors.surface}' + textColor: '{colors.on-surface}' + typography: '{typography.body-md}' + rounded: '{rounded.DEFAULT}' + height: 32px + padding: 4px 11px + input-field-focus: + backgroundColor: '{colors.surface}' + select-field: + backgroundColor: '{colors.surface}' + textColor: '{colors.on-surface}' + typography: '{typography.body-md}' + rounded: '{rounded.DEFAULT}' + height: 32px + padding: 0 11px + card: + backgroundColor: '{colors.surface}' + textColor: '{colors.on-surface}' + rounded: '{rounded.lg}' + padding: 24px + modal: + backgroundColor: '{colors.surface}' + textColor: '{colors.on-surface}' + rounded: '{rounded.lg}' + padding: 20px 24px + menu-item-selected: + backgroundColor: '#E6F4FF' + textColor: '{colors.primary}' + typography: '{typography.body-md}' + tabs-tab-active: + textColor: '{colors.primary}' + typography: '{typography.body-md}' + table-header: + backgroundColor: '{colors.surface-container}' + textColor: '{colors.on-surface}' + typography: '{typography.title-md}' + padding: 16px + tag: + backgroundColor: '{colors.surface-container}' + textColor: '{colors.on-surface}' + typography: '{typography.body-sm}' + rounded: '{rounded.md}' + padding: 0 7px + tooltip: + backgroundColor: 'rgba(0, 0, 0, 0.85)' + textColor: '#FFFFFF' + typography: '{typography.body-md}' + rounded: '{rounded.md}' + padding: 6px 8px + dropdown-item-hover: + backgroundColor: '{colors.surface-container}' + textColor: '{colors.on-surface}' + alert-success: + backgroundColor: '#F6FFED' + textColor: '{colors.on-surface}' + rounded: '{rounded.lg}' + padding: 8px 12px + alert-warning: + backgroundColor: '#FFFBE6' + textColor: '{colors.on-surface}' + rounded: '{rounded.lg}' + padding: 8px 12px + alert-error: + backgroundColor: '#FFF2F0' + textColor: '{colors.on-surface}' + rounded: '{rounded.lg}' + padding: 8px 12px + alert-info: + backgroundColor: '#E6F4FF' + textColor: '{colors.on-surface}' + rounded: '{rounded.lg}' + padding: 8px 12px + badge-status-error: + backgroundColor: '{colors.error}' + rounded: '{rounded.full}' + width: 6px + height: 6px + tag-blue: + backgroundColor: '#E6F4FF' + textColor: '{colors.blue-7}' + typography: '{typography.body-sm}' + rounded: '{rounded.md}' + padding: 0 7px +--- + +## Overview + +This document describes the default light theme of Antdv Next. The system employs semantic versioning: Major versions indicate comprehensive updates to the design language, and are synchronized with the upstream Ant Design in terms of design. + +Antdv Next is an open-source project that converts the upstream React Ant Design version into the Vue version. It is mainly applied to the middle and back-end consoles, dashboards, and operation tools. This project was created in 2026 and aims to provide a shared and clearly defined infrastructure for large product teams, enabling them to deliver rich-functionality and data-intensive interfaces without having to redefine the basic design on each page. + +Four values guide every decision in the system: + +- **Natural.** The interface follows established conventions; nothing surprises a returning user. Patterns that already exist in operating systems and prior generations of enterprise software are preferred over novel inventions. +- **Certain.** Users always know what state they're in, what their inputs did, and what the next step is. Hover, focus, loading, and error states are explicit and consistent. +- **Meaningful.** Visual emphasis is reserved for action. Decoration that does not communicate is removed. +- **Growing.** The system scales from small forms to dense tables to multi-tenant admin consoles without losing coherence. + +## Colors + +The palette is built from one **primary** brand seed, four semantic state seeds (`success`, `warning`, `error`, `info`), and neutral base colors for text and surfaces. Color seeds expand automatically through `@ant-design/colors` into gradient steps covering background tint, hover, active, and outline variants — change the seed, and the entire derived palette moves with it. + +`#1677FF` was chosen as the primary because blue reads as trustworthy and focused without the corporate flatness of a darker navy or the playfulness of a saturated cyan. It is the default brand color for actions, links, focus rings, selected navigation, and active tabs. + +Accessibility note: this file records Antdv Next's default visual tokens. Some brand-color pairs, especially white text on `#1677FF` and primary text on pale selected backgrounds, are below WCAG AA's 4.5:1 contrast threshold for small text. For strict accessibility targets, darken `colorPrimary` through `ConfigProvider` or use component-specific token overrides rather than inventing one-off colors. + +Neutral text and overlays in the runtime token system are expressed as `rgba(0, 0, 0, α)` rather than flat grey hex values. The reason is overlay: when text sits above a tinted card or a colored cell highlight, an opaque grey breaks the tint, while a transparent black blends naturally. The four standard alpha steps are `0.88` (primary text, exported here as `#1F1F1F`), `0.65` (secondary text, `#595959`), `0.45` (tertiary / description text), and `0.25` (placeholder / disabled, `#BFBFBF`). The hex values listed in this document are the equivalent composited result on a white surface, suitable for static export targets that require hex; downstream consumers that support alpha should prefer the `rgba()` form from `@antdv-next/cssinjs`. + +The preset colors (`blue`, `purple`, `cyan`, `green`, `magenta`, `red`, `orange`, `yellow`, `volcano`, `geekblue`, `gold`, `lime`; `pink` is a deprecated alias of `magenta` in runtime tokens) are reserved for tags, charts, and categorical visualization — never for primary UI affordances. Use functional colors (`success`/`warning`/`error`/`info`) for status, and reserve `primary` for the single most important action on each screen. + +## Typography + +The base font size is **14 px**, not 16. Enterprise consoles trade legibility headroom for information density — a 1440 px-wide window has to comfortably fit a sidebar, a header, a data table with eight columns, and a detail pane. At 14 px, a row of body copy reaches the eye-saccade sweet spot of ~75 characters at the column widths these layouts demand. + +The font stack prioritizes the OS UI font in order: Apple's `-apple-system`, then `BlinkMacSystemFont`, then Windows' `Segoe UI`, then Android/ChromeOS' `Roboto`, then `Helvetica Neue`, then `Arial`, with `Noto Sans` covering Linux. Emoji fallbacks are kept short. The code font uses `SFMono-Regular`, `Consolas`, `Liberation Mono`, `Menlo`, and `Courier` in the same order. + +Only **two font weights** appear in product UI: 400 (body, controls, menu items, tab labels) and 600 (`fontWeightStrong` — headings, table headers, and any title-grade typography). Thin (100–300), bold (700+), and italics are not used in interface chrome — they fight the calm, certain tone the system targets. Italics are acceptable only inside long-form documentation prose. Visual emphasis on selected/active states comes from color and stroke (border, underline), not weight. + +## Layout + +All spacing snaps to a **4 px grid**. The six-step spacing scale (`unit`, `xs`, `sm`, `md`, `lg`, `xl` → 4 / 4 / 8 / 16 / 24 / 32 px) covers every gap, gutter, and inset in the system. Magic numbers — `padding: 11px`, `gap: 13px` — do not appear in token-driven code; the input field's 11 px horizontal padding exists only because the design pre-dates the 4 px grid and a one-pixel migration would shift millions of existing screens. + +Surfaces use a **three-layer model**: + +1. **`bg-layout`** (`#F5F5F5`) — the page background. It surrounds and contains everything else. +2. **`bg-container`** (`#FFFFFF`) — the surface for cards, panels, tables, and forms. This is where most content lives. +3. **`bg-elevated`** (`#FFFFFF`, same hex as `bg-container`) — the surface for modals, dropdowns, popovers. Distinguished from `bg-container` not by color but by shadow. + +Never hard-code `#FFF` or `#FAFAFA` in product code. Read the token. The three-layer model is what lets a dark-mode algorithm flip the surface ladder without breaking layouts. + +## Elevation & Depth + +Antdv Next is **flat-first**. Borders and tonal contrast carry hierarchy. Shadows appear only on surfaces that genuinely float above their context. + +Shadow tokens are generated from `colorShadow`, so the same names adapt across light and dark themes. The core tiers are: + +- **Tertiary** (`boxShadowTertiary`) — the light raised-surface shadow: `0 1px 2px 0 rgba(0,0,0,0.05), 0 1px 6px -1px rgba(0,0,0,0.03), 0 2px 4px 0 rgba(0,0,0,0.03)`. +- **Popup** (`boxShadow` and `boxShadowSecondary`) — the standard floating-layer shadow: `0 6px 16px 0 rgba(0,0,0,0.08), 0 3px 6px -4px rgba(0,0,0,0.12), 0 9px 28px 8px rgba(0,0,0,0.05)`. +- **Card** (`boxShadowCard`) — a card-specific raised shadow with tighter spread, used when cards need separation from the container. +- **Directional drawer and overflow shadows** (`boxShadowDrawer*`, `boxShadowTabsOverflow*`) — specialized tokens for edge-attached surfaces and scroll affordances. +- **Popover arrow** (`boxShadowPopoverArrow`) — used only for the small triangular pointer on tooltip and popover arrows. + +Motion uses three durations and a small library of cubic-bezier easings, all exposed as tokens: + +- `motionDurationFast` — 0.1 s, for state changes (hover, focus, press). +- `motionDurationMid` — 0.2 s, for component-internal transitions (collapse, fade). +- `motionDurationSlow` — 0.3 s, for surface-level changes (modal enter, drawer slide). + +Easings are pre-defined: `motionEaseInOut`, `motionEaseOut`, `motionEaseIn`, `motionEaseOutBack`, `motionEaseOutCirc`, etc. Do not pick a `transition-timing-function` arbitrarily. If the design need does not match an existing easing, use `motionEaseInOut` and move on. + +## Shapes + +The default corner radius is **6 px**. It is round enough to read as modern and friendly, but small enough that a 32-pixel-tall button still presents a clean, almost-rectangular silhouette suitable for dense forms. + +By component class: + +- **Controls** (button, input, select, dropdown trigger) — 6 px (`rounded.DEFAULT`). +- **Surfaces** (card, modal, drawer, notification) — 8 px (`rounded.lg`). +- **Tags and small chips** — 4 px (`rounded.md`). +- **Tooltip and popover** — 4 px (`rounded.md`). + +Full-pill (`rounded.full`, 9999 px) is reserved for circular avatars, badges, and dots — not for buttons or tags. Square (0 px) is reserved for tables and the inner edges of segmented controls. Mixing radii on adjacent elements is a smell: a card with 8 px corners should not contain a button with 16 px corners. + +## Components + +Component archetypes capture the system's most common surfaces and states. Each entry below maps to the token references in the YAML front-matter. + +- **Button (primary)** — the single dominant action per screen. Solid `primary` fill, white text, 32 px tall, 6 px radius. Hover lightens the fill to `#4096FF`; active darkens to `#0958D9`. Do not stack two `primary` buttons in one decision. +- **Button (default)** — secondary actions. Transparent background on a white surface, dark text, 1 px outline border. Hover changes text color to `#4096FF`; the border tints to match. +- **Input field** — 32 px tall to match buttons. Subtle 1 px outline border; focus state thickens the border to `primary` and adds an inset glow. Placeholder text uses `on-surface-disabled`. +- **Select** — visually identical to Input. The trigger reads as an input until interacted with. +- **Card** — the workhorse container. White surface, 8 px radius, optional `boxShadowCard` elevation. Internal padding is 24 px on all sides; nested controls maintain 16 px gaps. +- **Modal** — same surface and radius as Card, but uses the secondary shadow tier and is centered on a `rgba(0, 0, 0, 0.45)` mask. Body padding is 20 px top/bottom × 24 px left/right. +- **Menu (selected item)** — `#E6F4FF` background, `primary` text. This is the single visual cue for "you are here" in navigation. +- **Tabs (active tab)** — `primary` text and a 2 px `primary` underline. Inactive tabs are `on-surface-variant`. No background fill on tabs at any state. +- **Table (header row)** — `surface-container` background, `title-md` typography (14 px / 600). Body rows alternate on hover only, not by default — the system trusts users to read dense data without zebra striping. +- **Tag** — small categorical label. 4 px radius, 12 px font, low-saturation pastel fills from the preset palette. Never use a tag for a critical state — use Alert or Badge. +- **Alert** — semantic feedback surface. Success, warning, error, and info alerts use pale semantic backgrounds with normal text color; the status is communicated by icon and tint, not by low-contrast colored body text. +- **Badge status dot** — compact status indicator. Critical status may use `error` fill, but the dot is not a substitute for text in accessibility-critical flows. +- **Tooltip** — high-contrast inverse surface: `rgba(0,0,0,0.85)` background, white text. Always positioned by the framework, never manually pinned. +- **Dropdown menu (item hover)** — `surface-container` fill on hover, no text-color change. The hover affordance is enough. + +## Do's and Don'ts + +- **Do** use the four design values as a tie-breaker. When two approaches conflict, the one that produces a more certain, more legible state for the user wins. +- **Don't** stack two `primary`-colored buttons on the same surface. Pick one. Demote the rest to `default`. +- **Do** read surfaces from `colors.surface`, `colors.surface-container`, and `colors.surface-layout`. They reflect the three-layer model. +- **Don't** hard-code `#FFFFFF` or `#FAFAFA`. The hex is incidental; the role is what matters. +- **Do** use `motionDurationMid` (0.2 s) for any component-level transition you cannot find a more specific token for. +- **Don't** invent custom `cubic-bezier` curves. Use the named easings. +- **Do** reserve the preset color palette (`blue` through `lime`) for tags, charts, and categorical visualization. +- **Don't** mint accent colors outside the preset palette for one-off UI surfaces. If a screen seems to need one, the design probably needs a different layout instead. +- **Do** snap every gap, inset, and gutter to the 4 px grid through the spacing scale. +- **Don't** use magic numbers in product code. If the scale lacks a step you need, the design needs revisiting, not a one-pixel override. + +## Customization + +Every value in the YAML front-matter above is a **default** produced by `defaultAlgorithm` — the light theme. Antdv Next theming is broader than Design Token replacement: it includes algorithmic derivation, component-scoped overrides, dynamic switching, nested theme scopes, CSS variable output, static token consumption, and zero-runtime CSS extraction. See [Customize Theme](https://www.antdv-next.com/docs/vue/customize-theme.md) for the complete runtime API and examples. + +The primary theme configuration entry is `ConfigProvider`'s `theme` prop: + +1. **Seed token overrides.** Pass `theme.token` to `ConfigProvider` to replace any seed. The primary and semantic color seeds (`colorPrimary`, `colorSuccess`, `colorWarning`, `colorError`, `colorInfo`) expand into derived gradients, while `colorBgBase` and `colorTextBase` drive neutral surfaces and text. Spacing, radius, and font-size seeds work the same way. + +2. **Algorithm switching.** Set `theme.algorithm` to swap the derivation logic. `defaultAlgorithm`, `darkAlgorithm`, and `compactAlgorithm` can be used alone or composed as an array — do not invert colors manually; the algorithms account for non-linear palette, surface, shadow, and size relationships. + +3. **Component-level overrides.** `theme.components.Button` (or any component's token namespace) can override a single component's Component Token and consumed Alias Token without affecting others. In component config, `algorithm` can opt that component into token derivation when the override should still follow seed-token relationships. + +4. **Runtime scope.** Themes can switch dynamically by changing `ConfigProvider.theme`, and nested `ConfigProvider` instances create local themes that inherit unchanged tokens from their parent. Static APIs such as `message.xxx`, `Modal.xxx`, and `notification.xxx` do not automatically receive the surrounding context; use hook-based APIs, `App`, or explicit context holders when themed static feedback is required. + +For custom theme generation, keep Antdv Next's interaction structure, density, state feedback, and component semantics first. Then change the smallest necessary seed set: usually `colorPrimary`, status colors, `borderRadius`, `fontFamily`, `fontSize`, and neutral surface bases. Brand pages may look distinct, but forms, tables, navigation, overlays, focus states, and validation feedback should still feel like Antdv Next. Avoid generating custom CSS rules that bypass tokens, algorithms, `theme.components`, CSS variables, or extracted static styles; if a theme cannot be expressed through those official layers, treat that as a design-system extension rather than a one-off page style. \ No newline at end of file diff --git a/src/commands/design.ts b/src/commands/design.ts index 4cd6851..127c1cc 100644 --- a/src/commands/design.ts +++ b/src/commands/design.ts @@ -1,11 +1,23 @@ +import { readFile } from 'node:fs/promises' +import { join } from 'node:path' +import process from 'node:process' import { defineCommand } from 'citty' +import { defaultArgs } from '@/args/default.ts' +import { getDataPath } from '@/utils/loader.ts' export default defineCommand({ meta: { name: 'design.md', description: 'Output the antd design-language document (design.md) for AI design tools', }, - run({ args }) { - console.log('Parsed args:', args) + args: defaultArgs, + async run({ args }) { + const doc = await readFile(join(getDataPath(), 'design.md'), 'utf-8') + + if (args.format === 'json') { + console.log(JSON.stringify({ doc }, null, 2)) + return '' + } + process.stdout.write(`${doc}\n`) }, }) diff --git a/src/index.ts b/src/index.ts index 778e6e8..9375996 100644 --- a/src/index.ts +++ b/src/index.ts @@ -11,7 +11,7 @@ const subCommands = { 'bug-cli': () => import('./commands/bug-cli.ts').then(r => r.default), 'changelog': () => import('./commands/changelog.ts').then(r => r.default), 'demo': () => import('./commands/demo.ts').then(r => r.default), - 'design': () => import('./commands/design.ts').then(r => r.default), + 'design.md': () => import('./commands/design.ts').then(r => r.default), 'doc': () => import('./commands/doc.ts').then(r => r.default), 'doctor': () => import('./commands/doctor.ts').then(r => r.default), 'env': () => import('./commands/env.ts').then(r => r.default), diff --git a/src/utils/loader.ts b/src/utils/loader.ts new file mode 100644 index 0000000..eb3154e --- /dev/null +++ b/src/utils/loader.ts @@ -0,0 +1,6 @@ +import { join } from 'node:path' +import { __dirname } from '@/constants/dirname.ts' + +export function getDataPath(): string { + return join(__dirname, '..', 'data') +} From cea247b91570bf5dfdf293fba4a971935f4a8627 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Fri, 14 Aug 2026 13:24:37 +0800 Subject: [PATCH 057/106] docs(design): update description according to Ant Design guidelines - Changed description to reflect Vue UI library development - Updated core values to "natural, definite, meaningful, and continuous growth" - Aligned documentation with Ant Design principles --- data/design.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/design.md b/data/design.md index fd41421..7f46fd9 100644 --- a/data/design.md +++ b/data/design.md @@ -1,7 +1,7 @@ --- version: alpha name: Antdv Next -description: Enterprise-grade React UI design system from Ant Group, built around the values Natural, Certain, Meaningful, and Growing. +description: According to the guidelines of Ant Design, we have developed the Vue UI library antdv-next, with the core values of "natural, definite, meaningful, and continuous growth". colors: primary: '#1677FF' success: '#52C41A' From 615ddad6ac96d7c70171006b8e4fbb35a331fefd Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Fri, 14 Aug 2026 14:48:05 +0800 Subject: [PATCH 058/106] feat(sync): add version.json generation with major.minor version mapping - Introduce VersionFile type for version mapping structure - Create createVersionFile function to generate version mappings grouped by major version - Update writeJsonFile to handle both ChangelogFile and VersionFile types - Add version.json output with major.minor to base version mappings - Include version.json in sync process alongside changelog files - Update console log to reflect version.json generation in sync summary --- scripts/sync.ts | 36 ++++++++++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/scripts/sync.ts b/scripts/sync.ts index 731e46f..86cb554 100644 --- a/scripts/sync.ts +++ b/scripts/sync.ts @@ -23,6 +23,8 @@ interface ChangelogFile extends VersionRecord { changelog: ChangelogRecord[] } +type VersionFile = [Record>] + interface ParsedTag { record: VersionRecord major: number @@ -278,9 +280,27 @@ function buildOutputFiles( return outputFiles } -async function writeJsonFile(filename: string, changelog: ChangelogFile): Promise { +function createVersionFile(tags: ParsedTag[]): VersionFile { + const versions: Record> = {} + + for (const group of groupTagsByMinor(tags)) { + const majorVersion = `v${group.major}` + const minorVersions = versions[majorVersion] ?? {} + const highestTag = getHighestBaseVersion(group.tags) + + minorVersions[`${group.major}.${group.minor}`] = getBaseVersion(highestTag) + versions[majorVersion] = minorVersions + } + + return [versions] +} + +async function writeJsonFile( + filename: string, + data: ChangelogFile | VersionFile, +): Promise { const file = path.join(OUTPUT_DIRECTORY, filename) - await fs.writeFile(file, `${JSON.stringify(changelog, null, 2)}\n`, 'utf8') + await fs.writeFile(file, `${JSON.stringify(data, null, 2)}\n`, 'utf8') } async function removeStaleMinorFiles( @@ -315,16 +335,20 @@ async function main(): Promise { assertPublishTimes(tags, publishTimes) const outputFiles = buildOutputFiles(tags, publishTimes) + const versionFile = createVersionFile(tags) const syncedMajorVersions = new Set(tags.map(tag => tag.major)) await fs.mkdir(OUTPUT_DIRECTORY, { recursive: true }) - await Promise.all([...outputFiles].map(([filename, changelog]) => - writeJsonFile(filename, changelog), - )) + await Promise.all([ + ...[...outputFiles].map(([filename, changelog]) => + writeJsonFile(filename, changelog), + ), + writeJsonFile('version.json', versionFile), + ]) await removeStaleMinorFiles(new Set(outputFiles.keys()), syncedMajorVersions) console.log( - `Synced ${tags.length} tags across ${syncedMajorVersions.size} major versions to ${outputFiles.size} changelog files`, + `Synced ${tags.length} tags across ${syncedMajorVersions.size} major versions to ${outputFiles.size} changelog files and version.json`, ) } From c48c786b247a77fc674233231c723b21f0f82c72 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Fri, 14 Aug 2026 14:59:16 +0800 Subject: [PATCH 059/106] ci(sync): add sync data workflow - Create sync.yml workflow for automated data synchronization - Configure workflow dispatch trigger for manual execution - Set up permissions for content writing and ID token access - Define concurrency group to prevent overlapping executions - Add job with Ubuntu runner and 15-minute timeout - Include steps for repository checkout and dependency installation - Integrate pnpm setup with LTS Node.js version - Add antdv-next source cloning using giget - Implement changelog generation and version data sync - Configure cleanup step to remove temporary source files - Add automatic commit and push for data changes --- .github/workflows/sync.yml | 59 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 .github/workflows/sync.yml diff --git a/.github/workflows/sync.yml b/.github/workflows/sync.yml new file mode 100644 index 0000000..aa64613 --- /dev/null +++ b/.github/workflows/sync.yml @@ -0,0 +1,59 @@ +name: Sync data + +on: + workflow_dispatch: + +permissions: + contents: write + id-token: write + +concurrency: + group: sync-data + cancel-in-progress: false + +jobs: + sync: + runs-on: ubuntu-latest + timeout-minutes: 15 + + steps: + - name: Checkout repository + uses: actions/checkout@v7 + + - name: Install latest pnpm + uses: pnpm/action-setup@v6 + with: + version: latest + + - name: Set up Node.js + uses: actions/setup-node@v7 + with: + node-version: lts/* + cache: pnpm + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Clone antdv-next source + run: npx giget gh:antdv-next/antdv-next antdv-source + + - name: Generate changelog data + run: pnpm exec tsx scripts/changelog.ts + + - name: Sync version data + run: pnpm exec tsx scripts/sync.ts + + - name: Remove antdv-next source + if: always() + run: rm -rf antdv-source + + - name: Commit data changes + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + git add -- data/ + + git commit --no-verify -m "chore(data): sync antdv-next metadata" + git push origin main + env: + GH_TOKEN: ${{ github.token }} From 95022c5b946b7c8275724bcfac77d36daab6997a Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Fri, 14 Aug 2026 15:01:51 +0800 Subject: [PATCH 060/106] ci(sync): add scheduled sync trigger to GitHub workflow - Added cron schedule to run sync job every hour at 28 minutes past the hour - Maintained manual workflow dispatch capability for on-demand execution - Updated workflow permissions configuration to support scheduled runs --- .github/workflows/sync.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/sync.yml b/.github/workflows/sync.yml index aa64613..4c3001f 100644 --- a/.github/workflows/sync.yml +++ b/.github/workflows/sync.yml @@ -1,6 +1,8 @@ name: Sync data on: + schedule: + - cron: '28 * * * *' workflow_dispatch: permissions: From b74b5f4bd9f5aa5302577b31189c1f6c04824d65 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Fri, 14 Aug 2026 16:57:54 +0800 Subject: [PATCH 061/106] feat(scripts): add changelog extraction functionality - Add extract script to package.json for changelog synchronization - Define ChangelogChange interface with component, type, and description fields - Add changes array to ChangelogRecord interface - Create constant for changelog.json file path - Implement isChangelogChange type guard function - Add readChangesByVersion function to parse changelog changes from JSON file - Pass changesByVersion parameter through createChangelogRecord function - Update buildOutputFiles function to include changesByVersion parameter - Modify main function to read and pass changelog changes data - Integrate changelog changes into generated output files --- package.json | 3 +- scripts/sync.ts | 85 ++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 82 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 2d704fb..ceb43e3 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,8 @@ "prepare": "simple-git-hooks", "test": "vitest run", "test:watch": "vitest", - "generate-changelog": "tsx ./scripts/changelog.ts" + "generate-changelog": "tsx ./scripts/changelog.ts", + "extract": "tsx ./scripts/sync.ts" }, "dependencies": { "@clack/prompts": "^1.7.0", diff --git a/scripts/sync.ts b/scripts/sync.ts index 86cb554..05b460d 100644 --- a/scripts/sync.ts +++ b/scripts/sync.ts @@ -15,8 +15,15 @@ interface VersionRecord { majorVersion: string } +interface ChangelogChange { + component: string | null + type: string + description: string +} + interface ChangelogRecord extends VersionRecord { date: string + changes: ChangelogChange[] } interface ChangelogFile extends VersionRecord { @@ -43,6 +50,7 @@ const PACKAGE_NAME = 'antdv-next' const REMOTE_URL = 'https://github.com/antdv-next/antdv-next.git' const TAG_PREFIX = `${PACKAGE_NAME}@` const OUTPUT_DIRECTORY = fileURLToPath(new URL('../data', import.meta.url)) +const CHANGELOG_FILE = path.join(OUTPUT_DIRECTORY, 'changelog.json') const REMOTE_TAG_PATTERN = /^[0-9a-f]+\s+refs\/tags\/(.+)$/i const MINOR_FILE_PATTERN = /^v(\d+)\.(\d+)\.(\d+)\.json$/ @@ -116,6 +124,61 @@ async function fetchPublishTimes(): Promise> { return publishTimes } +function isChangelogChange(value: unknown): value is ChangelogChange { + if (!value || typeof value !== 'object' || Array.isArray(value)) { + return false + } + + const change = value as Record + + return (typeof change.component === 'string' || change.component === null) + && typeof change.type === 'string' + && typeof change.description === 'string' +} + +async function readChangesByVersion(): Promise> { + const source = await fs.readFile(CHANGELOG_FILE, 'utf8') + let data: unknown + + try { + data = JSON.parse(source) + } + catch { + throw new Error(`Invalid JSON in ${CHANGELOG_FILE}`) + } + + if (!Array.isArray(data)) { + throw new TypeError(`Expected an array in ${CHANGELOG_FILE}`) + } + + const changesByVersion = new Map() + + for (const [index, value] of data.entries()) { + if (!value || typeof value !== 'object' || Array.isArray(value)) { + throw new TypeError(`Invalid changelog record at index ${index} in ${CHANGELOG_FILE}`) + } + + const record = value as Record + const { version, changelog } = record + + if (typeof version !== 'string' || !Array.isArray(changelog)) { + throw new TypeError(`Invalid changelog record at index ${index} in ${CHANGELOG_FILE}`) + } + + if (!changelog.every(isChangelogChange)) { + throw new TypeError(`Invalid changes for version ${version} in ${CHANGELOG_FILE}`) + } + + if (changesByVersion.has(version)) { + throw new Error(`Duplicate version ${version} in ${CHANGELOG_FILE}`) + } + + changesByVersion.set(version, changelog) + } + + return changesByVersion +} + function parseRemoteTag(line: string, expectedMajorVersion: number): ParsedTag { const remoteTagMatch = line.match(REMOTE_TAG_PATTERN) const tag = remoteTagMatch?.[1] @@ -204,6 +267,7 @@ function getBaseVersion(tag: ParsedTag): string { function createChangelogRecord( tag: ParsedTag, publishTimes: Map, + changesByVersion: Map, ): ChangelogRecord { const publishedAt = publishTimes.get(tag.record.version) @@ -214,6 +278,7 @@ function createChangelogRecord( return { ...tag.record, date: publishedAt, + changes: changesByVersion.get(tag.record.version) ?? [], } } @@ -231,6 +296,7 @@ function assertPublishTimes( function createChangelogFile( tags: ParsedTag[], publishTimes: Map, + changesByVersion: Map, ): ChangelogFile { const highestTag = getHighestBaseVersion(tags) const version = getBaseVersion(highestTag) @@ -240,7 +306,7 @@ function createChangelogFile( majorVersion: `v${highestTag.major}`, changelog: tags .filter(tag => tag.record.version !== version) - .map(tag => createChangelogRecord(tag, publishTimes)), + .map(tag => createChangelogRecord(tag, publishTimes, changesByVersion)), } } @@ -264,15 +330,23 @@ function groupTagsByMajor(tags: ParsedTag[]): Map { function buildOutputFiles( tags: ParsedTag[], publishTimes: Map, + changesByVersion: Map, ): Map { const outputFiles = new Map() for (const [major, majorTags] of groupTagsByMajor(tags)) { - outputFiles.set(`v${major}.json`, createChangelogFile(majorTags, publishTimes)) + outputFiles.set( + `v${major}.json`, + createChangelogFile(majorTags, publishTimes, changesByVersion), + ) } for (const group of groupTagsByMinor(tags)) { - const changelogFile = createChangelogFile(group.tags, publishTimes) + const changelogFile = createChangelogFile( + group.tags, + publishTimes, + changesByVersion, + ) const filename = `v${changelogFile.version}.json` outputFiles.set(filename, changelogFile) } @@ -323,9 +397,10 @@ async function removeStaleMinorFiles( } async function main(): Promise { - const [tagGroups, publishTimes] = await Promise.all([ + const [tagGroups, publishTimes, changesByVersion] = await Promise.all([ Promise.all(MAJOR_VERSIONS.map(fetchTags)), fetchPublishTimes(), + readChangesByVersion(), ]) const tags = tagGroups.flat() @@ -334,7 +409,7 @@ async function main(): Promise { } assertPublishTimes(tags, publishTimes) - const outputFiles = buildOutputFiles(tags, publishTimes) + const outputFiles = buildOutputFiles(tags, publishTimes, changesByVersion) const versionFile = createVersionFile(tags) const syncedMajorVersions = new Set(tags.map(tag => tag.major)) From a3fe96ff58c08440c1a3e28926c31a0049fce207 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Fri, 14 Aug 2026 17:01:37 +0800 Subject: [PATCH 062/106] fix(changelog): update component field to always be string - Changed component field type from string | null to string - Updated changelog item creation to use empty string instead of null - Added SourceChangelogChange interface with nullable component field - Renamed isChangelogChange to isSourceChangelogChange for clarity - Mapped changelog entries to ensure component field is never null - Updated type checking to use source changelog change validation --- scripts/changelog.ts | 4 ++-- scripts/sync.ts | 15 +++++++++++---- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/scripts/changelog.ts b/scripts/changelog.ts index 43d95c9..10c8990 100644 --- a/scripts/changelog.ts +++ b/scripts/changelog.ts @@ -7,7 +7,7 @@ import { fileURLToPath } from 'node:url' import { downloadTemplate } from 'giget' interface ChangelogItem { - component: string | null + component: string type: string description: string } @@ -156,7 +156,7 @@ function parseSection( } return [{ - component: component?.trim() || null, + component: component?.trim() || '', type, description: description.trim(), }] diff --git a/scripts/sync.ts b/scripts/sync.ts index 05b460d..9357386 100644 --- a/scripts/sync.ts +++ b/scripts/sync.ts @@ -16,11 +16,15 @@ interface VersionRecord { } interface ChangelogChange { - component: string | null + component: string type: string description: string } +interface SourceChangelogChange extends Omit { + component: string | null +} + interface ChangelogRecord extends VersionRecord { date: string changes: ChangelogChange[] @@ -124,7 +128,7 @@ async function fetchPublishTimes(): Promise> { return publishTimes } -function isChangelogChange(value: unknown): value is ChangelogChange { +function isSourceChangelogChange(value: unknown): value is SourceChangelogChange { if (!value || typeof value !== 'object' || Array.isArray(value)) { return false } @@ -165,7 +169,7 @@ async function readChangesByVersion(): Promise> { throw new TypeError(`Invalid changelog record at index ${index} in ${CHANGELOG_FILE}`) } - if (!changelog.every(isChangelogChange)) { + if (!changelog.every(isSourceChangelogChange)) { throw new TypeError(`Invalid changes for version ${version} in ${CHANGELOG_FILE}`) } @@ -173,7 +177,10 @@ async function readChangesByVersion(): Promise> { throw new Error(`Duplicate version ${version} in ${CHANGELOG_FILE}`) } - changesByVersion.set(version, changelog) + changesByVersion.set(version, changelog.map(change => ({ + ...change, + component: change.component ?? '', + }))) } return changesByVersion From 2f90d59adc3e0ed6f81503089e51b93e0d02564f Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Fri, 14 Aug 2026 19:43:35 +0800 Subject: [PATCH 063/106] refactor(bug): integrate default arguments into bug command - Removed spread operator from bugArgs definition - Imported defaultArgs in commands files - Combined defaultArgs with bugArgs in command definitions - Updated createBug function signature to accept merged argument types - Ensured all bug commands include default arguments functionality --- src/args/bug.ts | 2 -- src/commands/bug-cli.ts | 6 +++++- src/commands/bug.ts | 8 ++++++-- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/args/bug.ts b/src/args/bug.ts index e8d7fc4..dc89641 100644 --- a/src/args/bug.ts +++ b/src/args/bug.ts @@ -1,8 +1,6 @@ import type { ArgsDef } from 'citty' -import { defaultArgs } from '@/args/default.ts' export const bugArgs = { - ...defaultArgs, // 问题标题 title: { type: 'string', diff --git a/src/commands/bug-cli.ts b/src/commands/bug-cli.ts index e68719e..b152cc5 100644 --- a/src/commands/bug-cli.ts +++ b/src/commands/bug-cli.ts @@ -1,5 +1,6 @@ import { defineCommand } from 'citty' import { bugArgs } from '@/args/bug.ts' +import { defaultArgs } from '@/args/default.ts' import { createBug } from '@/commands/bug.ts' import { ANTDV_REPO_CLI } from '@/constants/repo.ts' @@ -8,7 +9,10 @@ export default defineCommand({ name: 'bug-cli', description: 'Report a bug to the @antdv-next/cli repository', }, - args: bugArgs, + args: { + ...defaultArgs, + ...bugArgs, + }, async run({ args }) { await createBug(ANTDV_REPO_CLI, args) }, diff --git a/src/commands/bug.ts b/src/commands/bug.ts index 295f315..84ed0b6 100644 --- a/src/commands/bug.ts +++ b/src/commands/bug.ts @@ -1,12 +1,13 @@ import type { ParsedArgs } from 'citty' import { defineCommand } from 'citty' import { bugArgs } from '@/args/bug.ts' +import { defaultArgs } from '@/args/default.ts' import { ANTDV_REPO } from '@/constants/repo.ts' import { isUrl } from '@/utils/is.ts' import { buildIssueUrl, collectAntdvEnv, createIssueBody } from '@/utils/issue.ts' import { output } from '@/utils/output.ts' -export async function createBug(repo: string, args: ParsedArgs): Promise { +export async function createBug(repo: string, args: ParsedArgs & ParsedArgs): Promise { const env = await collectAntdvEnv(args.cwd) if (args.reproduction.length > 1 && !isUrl(args.reproduction)) { @@ -49,7 +50,10 @@ export default defineCommand({ name: 'bug', description: 'Report a bug to the antdv-next repository', }, - args: bugArgs, + args: { + ...defaultArgs, + ...bugArgs, + }, async run({ args }) { await createBug(ANTDV_REPO, args) }, From 2b64bae8f89495c9c144409736fcf08e16341dd7 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Fri, 14 Aug 2026 21:56:26 +0800 Subject: [PATCH 064/106] feat(config): switch CommandArgs with OptionsArgs type - Update resolveConfig function parameter type - Create new args.d.ts file with OptionsArgs type definition - Import ParsedArgs from citty and combine default and bug args types --- src/args/args.d.ts | 5 +++++ src/config.ts | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 src/args/args.d.ts diff --git a/src/args/args.d.ts b/src/args/args.d.ts new file mode 100644 index 0000000..103c148 --- /dev/null +++ b/src/args/args.d.ts @@ -0,0 +1,5 @@ +import type { ParsedArgs } from 'citty' +import type { bugArgs } from '@/args/bug.ts' +import type { defaultArgs } from '@/args/default.ts' + +export type OptionsArgs = ParsedArgs & ParsedArgs diff --git a/src/config.ts b/src/config.ts index 4a09d6e..ffe8ad5 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1,7 +1,7 @@ -import type { CommandArgs } from '@/args/default.ts' +import type { OptionsArgs } from '@/args/args' import type { ResolvedConfig } from '@/types.ts' -export const resolveConfig = (options: CommandArgs): ResolvedConfig => { +export const resolveConfig = (options: OptionsArgs): ResolvedConfig => { return { cwd: options.cwd, format: options.format, From 36ba6992f2cb7bf64490ab2b29c1e48c9ba1e347 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Fri, 14 Aug 2026 23:51:18 +0800 Subject: [PATCH 065/106] feat(dependencies): add boxen package and update dependency tree - Added boxen@8.0.1 as a new project dependency - Updated pnpm-lock.yaml with all transitive dependencies for boxen - Included supporting packages like ansi-align, camelcase, chalk, cli-boxes - Added string-width, emoji-regex, ansi-regex and related formatting utilities - Updated dependency resolution entries in lockfile with proper versioning - Maintained compatibility with existing project dependencies --- package.json | 1 + pnpm-lock.yaml | 137 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 138 insertions(+) diff --git a/package.json b/package.json index ceb43e3..3608c31 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,7 @@ }, "dependencies": { "@clack/prompts": "^1.7.0", + "boxen": "^8.0.1", "citty": "^0.2.2", "envinfo": "^7.21.0", "local-pkg": "^1.2.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1e268cc..3019db1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,6 +11,9 @@ importers: '@clack/prompts': specifier: ^1.7.0 version: 1.7.0 + boxen: + specifier: ^8.0.1 + version: 8.0.1 citty: specifier: ^0.2.2 version: 0.2.2 @@ -863,6 +866,21 @@ packages: ajv@6.15.0: resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} + ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.3.0: + resolution: {integrity: sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==} + engines: {node: '>=12'} + + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} + ansis@4.3.1: resolution: {integrity: sha512-BJ8/l4R5LRE7hW9WdSuGYrLSHi2ynxeFpDFbH0K/CgNeY/tyhk+vO6TYxXC5r5CpUhNVX310xzPsN/H9lCdfOA==} engines: {node: '>=14'} @@ -887,6 +905,10 @@ packages: boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + boxen@8.0.1: + resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==} + engines: {node: '>=18'} + brace-expansion@5.0.9: resolution: {integrity: sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==} engines: {node: 20 || >=22} @@ -904,6 +926,10 @@ packages: resolution: {integrity: sha512-tixWYgm5ZoOD+3g6UTea91eow5z6AAHaho3g0V9CNSNb45gM8SmflpAc+GRd1InC4AqN/07Unrgp56Y94N9hJQ==} engines: {node: '>=20.19.0'} + camelcase@8.0.0: + resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} + engines: {node: '>=16'} + caniuse-lite@1.0.30001809: resolution: {integrity: sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ==} @@ -914,6 +940,10 @@ packages: resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} engines: {node: '>=18'} + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + change-case@5.4.4: resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} @@ -927,6 +957,10 @@ packages: citty@0.2.2: resolution: {integrity: sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w==} + cli-boxes@3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + commander@8.3.0: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} @@ -1017,6 +1051,12 @@ packages: electron-to-chromium@1.5.405: resolution: {integrity: sha512-bNglH7lPH5l+yHOes7Zr4VqxhOy4BQ9ZBUX4VdoFgxMpzJk7W1ZoO3Vgd9Pxa9PyjQ76sfm2aKH/nzEcCNRlew==} + emoji-regex@10.6.0: + resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + empathic@2.0.1: resolution: {integrity: sha512-YGRs8knHhKHVShLkFET/rWAU8kmHbOV5LwN938RHI0pljAJ1Gf6SzXsSmRaEzcXTtOOmVqJ5+WtQPL5uigY50Q==} engines: {node: '>=14'} @@ -1331,6 +1371,10 @@ packages: resolution: {integrity: sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA==} engines: {node: '>=18'} + get-east-asian-width@1.6.0: + resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==} + engines: {node: '>=18'} + get-tsconfig@4.14.1: resolution: {integrity: sha512-Dz/6HxkrxgNehhxLVeyv8sad9UzF2xBVeaKBQNDfJ5XiSXmp2gTR0eO0RWiT2NCKS5aGP9jjkOMggTN90qU50A==} @@ -1401,6 +1445,10 @@ packages: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -1911,6 +1959,22 @@ packages: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.2.0: + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} + engines: {node: '>=12'} + strip-indent@4.1.1: resolution: {integrity: sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==} engines: {node: '>=12'} @@ -2163,10 +2227,18 @@ packages: engines: {node: '>=8'} hasBin: true + widest-line@5.0.0: + resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==} + engines: {node: '>=18'} + word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} + wrap-ansi@9.0.2: + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} + engines: {node: '>=18'} + xml-name-validator@5.0.0: resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} engines: {node: '>=18'} @@ -2839,6 +2911,16 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 + ansi-align@3.0.1: + dependencies: + string-width: 4.2.3 + + ansi-regex@5.0.1: {} + + ansi-regex@6.3.0: {} + + ansi-styles@6.2.3: {} + ansis@4.3.1: {} are-docs-informative@0.0.2: {} @@ -2851,6 +2933,17 @@ snapshots: boolbase@1.0.0: {} + boxen@8.0.1: + dependencies: + ansi-align: 3.0.1 + camelcase: 8.0.0 + chalk: 5.6.2 + cli-boxes: 3.0.0 + string-width: 7.2.0 + type-fest: 4.41.0 + widest-line: 5.0.0 + wrap-ansi: 9.0.2 + brace-expansion@5.0.9: dependencies: balanced-match: 4.0.4 @@ -2867,12 +2960,16 @@ snapshots: cac@7.0.0: {} + camelcase@8.0.0: {} + caniuse-lite@1.0.30001809: {} ccount@2.0.1: {} chai@6.2.2: {} + chalk@5.6.2: {} + change-case@5.4.4: {} character-entities@2.0.2: {} @@ -2881,6 +2978,8 @@ snapshots: citty@0.2.2: {} + cli-boxes@3.0.0: {} + commander@8.3.0: {} comment-parser@1.4.7: {} @@ -2937,6 +3036,10 @@ snapshots: electron-to-chromium@1.5.405: {} + emoji-regex@10.6.0: {} + + emoji-regex@8.0.0: {} + empathic@2.0.1: {} enhanced-resolve@5.24.5: @@ -3320,6 +3423,8 @@ snapshots: function-timeout@1.0.2: {} + get-east-asian-width@1.6.0: {} + get-tsconfig@4.14.1: dependencies: resolve-pkg-maps: 1.0.0 @@ -3368,6 +3473,8 @@ snapshots: is-extglob@2.1.1: {} + is-fullwidth-code-point@3.0.0: {} + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 @@ -4033,6 +4140,26 @@ snapshots: string-argv@0.3.2: {} + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@7.2.0: + dependencies: + emoji-regex: 10.6.0 + get-east-asian-width: 1.6.0 + strip-ansi: 7.2.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.2.0: + dependencies: + ansi-regex: 6.3.0 + strip-indent@4.1.1: {} super-regex@1.1.0: @@ -4231,8 +4358,18 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 + widest-line@5.0.0: + dependencies: + string-width: 7.2.0 + word-wrap@1.2.5: {} + wrap-ansi@9.0.2: + dependencies: + ansi-styles: 6.2.3 + string-width: 7.2.0 + strip-ansi: 7.2.0 + xml-name-validator@5.0.0: {} yaml-eslint-parser@2.1.0: From 5cb5725fcec98afe48c2beef5d79959c05f85fe0 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Fri, 14 Aug 2026 23:51:31 +0800 Subject: [PATCH 066/106] feat(cli): add check command to verify CLI version updates - Add check command to index.ts for version checking functionality - Implement getLatestVersion utility to fetch latest package version from multiple registries - Create reportUpdateCheck function to display update notifications with colored output - Add comprehensive test suite for version checking with mock responses and error handling - Support multiple package registry sources with timeout and abort mechanisms - Display update warning box with upgrade instructions when newer version is available --- src/commands/check.ts | 12 ++++ src/index.ts | 1 + src/utils/check.ts | 94 ++++++++++++++++++++++++++++++ test/check.test.ts | 131 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 238 insertions(+) create mode 100644 src/commands/check.ts create mode 100644 src/utils/check.ts create mode 100644 test/check.test.ts diff --git a/src/commands/check.ts b/src/commands/check.ts new file mode 100644 index 0000000..31ad8be --- /dev/null +++ b/src/commands/check.ts @@ -0,0 +1,12 @@ +import { defineCommand } from 'citty' +import { reportUpdateCheck } from '@/utils/check.ts' + +export default defineCommand({ + meta: { + name: 'check', + description: 'Test item version', + }, + async run() { + await reportUpdateCheck() + }, +}) diff --git a/src/index.ts b/src/index.ts index 9375996..f7cae28 100644 --- a/src/index.ts +++ b/src/index.ts @@ -25,6 +25,7 @@ const subCommands = { 'token': () => import('./commands/token.ts').then(r => r.default), 'upgrade': () => import('./commands/upgrade.ts').then(r => r.default), 'usage': () => import('./commands/usage.ts').then(r => r.default), + 'check': () => import('./commands/check.ts').then(r => r.default), } const main = defineCommand({ diff --git a/src/utils/check.ts b/src/utils/check.ts new file mode 100644 index 0000000..b657eee --- /dev/null +++ b/src/utils/check.ts @@ -0,0 +1,94 @@ +import type { PackageJson } from 'pkg-types' +import boxen from 'boxen' +import pc from 'picocolors' +import semver from 'semver' +import { ANTDV_REPO_CLI } from '@/constants/repo.ts' + +const LATEST_VERSION_URLS = [ + `https://registry.npmjs.org/@${ANTDV_REPO_CLI}/latest`, + `https://registry.npmmirror.com/@${ANTDV_REPO_CLI}/latest`, + `https://unpkg.com/@${ANTDV_REPO_CLI}@latest/package.json`, +] as const + +const REQUEST_TIMEOUT_MS = 5_000 +const VERSION_NOT_FOUND = '0.0.0' + +interface LatestVersionResult { + index: number + version: string +} + +async function fetchLatestVersion(url: string, controller: AbortController): Promise { + const timeout = setTimeout(() => { + controller.abort(new Error(`Request to ${url} timed out after ${REQUEST_TIMEOUT_MS}ms`)) + }, REQUEST_TIMEOUT_MS) + + try { + const response = await fetch(url, { signal: controller.signal }) + + if (response.status === 404) { + return VERSION_NOT_FOUND + } + + if (!response.ok) { + throw new Error(`Request to ${url} failed with status ${response.status}`) + } + + const result = await response.json() as PackageJson + + if (typeof result.version !== 'string' || result.version.trim() === '') { + throw new Error(`Request to ${url} returned an invalid version`) + } + + return result.version.trim() + } + finally { + clearTimeout(timeout) + } +} + +export async function getLatestVersion(): Promise { + const controllers = LATEST_VERSION_URLS.map(() => new AbortController()) + let winnerIndex: number | undefined + + try { + const winner = await Promise.any( + LATEST_VERSION_URLS.map(async (url, index): Promise => ({ + index, + version: await fetchLatestVersion(url, controllers[index]!), + })), + ) + + winnerIndex = winner.index + return winner.version + } + finally { + controllers.forEach((controller, index) => { + if (index !== winnerIndex) { + controller.abort() + } + }) + } +} + +export async function reportUpdateCheck(): Promise { + const latestVersion = await getLatestVersion() + if (semver.gt(latestVersion, __CLI_VERSION__)) { + const line = `Update available: v${pc.cyan(__CLI_VERSION__)} → v${pc.red(latestVersion)}` + const cmd = 'Run: antdv upgrade' + const install = `Or: npm i @${ANTDV_REPO_CLI} -g` + const content = [line, cmd, install].join('\n') + console.log(boxen(content, { + title: 'Warning', + borderColor: 'yellow', + borderStyle: 'round', + padding: { + top: 1, + left: 1, + right: 1, + bottom: 1, + }, + margin: 0, + })) + } +} diff --git a/test/check.test.ts b/test/check.test.ts new file mode 100644 index 0000000..df43df0 --- /dev/null +++ b/test/check.test.ts @@ -0,0 +1,131 @@ +import { afterEach, describe, expect, it, vi } from 'vitest' +import { getLatestVersion } from '../src/utils/check' + +const URLS = [ + 'https://registry.npmjs.org/@antdv-next/cli/latest', + 'https://registry.npmmirror.com/@antdv-next/cli/latest', + 'https://unpkg.com/@antdv-next/cli@latest/package.json', +] as const + +interface Deferred { + promise: Promise + reject: (reason?: unknown) => void + resolve: (value: T) => void +} + +function createDeferred(): Deferred { + let resolve!: (value: T) => void + let reject!: (reason?: unknown) => void + const promise = new Promise((resolvePromise, rejectPromise) => { + resolve = resolvePromise + reject = rejectPromise + }) + + return { promise, reject, resolve } +} + +afterEach(() => { + vi.useRealTimers() + vi.unstubAllGlobals() +}) + +describe('getLatestVersion', () => { + it('returns the fastest valid version and aborts the slower requests', async () => { + vi.useFakeTimers() + const responses = URLS.map(() => createDeferred()) + const signals: AbortSignal[] = [] + const fetchMock = vi.fn((input: string | URL | Request, init?: RequestInit) => { + const index = URLS.indexOf(String(input) as typeof URLS[number]) + const signal = init?.signal as AbortSignal + signals[index] = signal + signal.addEventListener('abort', () => responses[index]!.reject(signal.reason), { once: true }) + return responses[index]!.promise + }) + vi.stubGlobal('fetch', fetchMock) + + const latestVersion = getLatestVersion() + + expect(fetchMock).toHaveBeenCalledTimes(3) + responses[0]!.resolve(Response.json({ version: '' })) + responses[2]!.resolve(Response.json({ version: '2.1.0' })) + + await expect(latestVersion).resolves.toBe('2.1.0') + expect(signals[0]!.aborted).toBe(true) + expect(signals[1]!.aborted).toBe(true) + expect(signals[2]!.aborted).toBe(false) + await vi.advanceTimersByTimeAsync(0) + expect(vi.getTimerCount()).toBe(0) + }) + + it('reports a clear aggregate error when every source fails', async () => { + const fetchMock = vi.fn((input: string | URL | Request) => { + const url = String(input) + + if (url === URLS[0]) { + return Promise.reject(new Error('network unavailable')) + } + if (url === URLS[1]) { + return Promise.resolve(new Response(null, { status: 503 })) + } + + return Promise.resolve(Response.json({ name: '@antdv-next/cli' })) + }) + vi.stubGlobal('fetch', fetchMock) + + const error = await getLatestVersion().catch(error => error) + + expect(error).toBeInstanceOf(AggregateError) + expect(error).toMatchObject({ + message: 'Failed to get the latest @antdv-next/cli version from all registries', + }) + expect(error.errors).toHaveLength(3) + }) + + it('returns 0.0.0 and aborts the remaining requests when the package is not found', async () => { + vi.useFakeTimers() + const responses = URLS.map(() => createDeferred()) + const signals: AbortSignal[] = [] + const fetchMock = vi.fn((input: string | URL | Request, init?: RequestInit) => { + const index = URLS.indexOf(String(input) as typeof URLS[number]) + const signal = init?.signal as AbortSignal + signals[index] = signal + signal.addEventListener('abort', () => responses[index]!.reject(signal.reason), { once: true }) + return responses[index]!.promise + }) + vi.stubGlobal('fetch', fetchMock) + + const latestVersion = getLatestVersion() + responses[0]!.resolve(new Response(null, { status: 404 })) + + await expect(latestVersion).resolves.toBe('0.0.0') + expect(signals[0]!.aborted).toBe(false) + expect(signals[1]!.aborted).toBe(true) + expect(signals[2]!.aborted).toBe(true) + await vi.advanceTimersByTimeAsync(0) + expect(vi.getTimerCount()).toBe(0) + }) + + it('times out and aborts all requests when no source responds', async () => { + vi.useFakeTimers() + const signals: AbortSignal[] = [] + const fetchMock = vi.fn((_input: string | URL | Request, init?: RequestInit) => { + const signal = init?.signal as AbortSignal + signals.push(signal) + + return new Promise((_resolve, reject) => { + signal.addEventListener('abort', () => reject(signal.reason), { once: true }) + }) + }) + vi.stubGlobal('fetch', fetchMock) + + const rejection = expect(getLatestVersion()).rejects.toThrow( + 'Failed to get the latest @antdv-next/cli version from all registries', + ) + + await vi.advanceTimersByTimeAsync(5_000) + await rejection + expect(signals).toHaveLength(3) + expect(signals.every(signal => signal.aborted)).toBe(true) + expect(vi.getTimerCount()).toBe(0) + }) +}) From 0f964637222c5d8c6686c67f964da2eba7b9d485 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Sat, 15 Aug 2026 22:08:36 +0800 Subject: [PATCH 067/106] feat(upgrade): implement CLI version upgrade functionality - Add async support for version checking operations - Integrate semver library for version comparison - Fetch latest version from remote source using getLatestVersion utility - Compare current version with latest version using semver.gt - Exit with error when current version is already latest - Add placeholder for actual upgrade steps implementation - Include process exit handling for upgrade scenarios --- src/commands/upgrade.ts | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/commands/upgrade.ts b/src/commands/upgrade.ts index e98503c..414d4e8 100644 --- a/src/commands/upgrade.ts +++ b/src/commands/upgrade.ts @@ -1,11 +1,27 @@ +import process from 'node:process' import { defineCommand } from 'citty' +import semver from 'semver' +import { getLatestVersion } from '@/utils/check.ts' export default defineCommand({ meta: { name: 'upgrade', description: 'Upgrade the CLI to the latest version', }, - run({ args }) { + async run({ args }) { console.log('Parsed args:', args) + + // 获取最新的版本 + const latestVersion = await getLatestVersion() + + if (!semver.gt(latestVersion, __CLI_VERSION__)) { + // TODO 提示当前版本已是最新版本 + console.log(`已是最新版本: v${__CLI_VERSION__}`) + process.exit(1) + } + + // 执行相关的升级步骤 + // step 2: 获取当前用户下的 pm,默认 npm + // step 3: 根据 pm 进行运行安装 ANTDV_NEXT_CLI }, }) From 775dea3ed441d7d4e59890b611f9b8117a0d5586 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Sat, 15 Aug 2026 22:08:44 +0800 Subject: [PATCH 068/106] feat(sync): add globalTokens field to changelog records - Added globalTokens array property to ChangelogFile interface - Initialize globalTokens as empty array in changelog record creation - Maintains compatibility with existing changelog structure - Prepares data structure for future token management features --- scripts/sync.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/sync.ts b/scripts/sync.ts index 9357386..c1f91da 100644 --- a/scripts/sync.ts +++ b/scripts/sync.ts @@ -31,6 +31,7 @@ interface ChangelogRecord extends VersionRecord { } interface ChangelogFile extends VersionRecord { + globalTokens: unknown[] changelog: ChangelogRecord[] } @@ -311,6 +312,7 @@ function createChangelogFile( return { version, majorVersion: `v${highestTag.major}`, + globalTokens: [], changelog: tags .filter(tag => tag.record.version !== version) .map(tag => createChangelogRecord(tag, publishTimes, changesByVersion)), From d6bff236ad939dc465d1e9223840f9b1ccb5f855 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Mon, 17 Aug 2026 09:52:57 +0800 Subject: [PATCH 069/106] refactor(changelog): update script to read local antdv-source directory - Remove downloadTemplate dependency and online repository download logic - Change repository directory name from 'repository' to 'antdv-source' - Update script to read changelog directly from local filesystem - Remove cleanup of temporary repository directory - Simplify main function by removing try-finally block --- scripts/changelog.ts | 71 +++++++++++++++++++------------------------- 1 file changed, 30 insertions(+), 41 deletions(-) diff --git a/scripts/changelog.ts b/scripts/changelog.ts index 10c8990..8111380 100644 --- a/scripts/changelog.ts +++ b/scripts/changelog.ts @@ -4,7 +4,6 @@ import fs from 'node:fs/promises' import path from 'node:path' import process from 'node:process' import { fileURLToPath } from 'node:url' -import { downloadTemplate } from 'giget' interface ChangelogItem { component: string @@ -28,7 +27,6 @@ interface ParsedChangelog { listItemCount: number } -const REPOSITORY_SOURCE = 'github:antdv-next/antdv-next#main' const CHANGELOG_FILE = 'docs/src/pages/components/changelog.en-US.md' const OUTPUT_FILE = fileURLToPath(new URL('../data/changelog.json', import.meta.url)) const VERSION_HEADING_PATTERN = /^##[ \t]+v?(\d+\.\d+\.\d+(?:-[a-z0-9.-]+)?(?:\+[a-z0-9.-]+)?)(?:[ \t]+-[ \t]+(\d{4}-\d{2}-\d{2}))?[ \t]*$/gim @@ -214,48 +212,39 @@ function parseChangelog(markdown: string): ParsedChangelog { } async function main(): Promise { - const repositoryDirectory = path.join(process.cwd(), 'repository') - - try { - const downloadedRepository = await downloadTemplate(REPOSITORY_SOURCE, { - dir: repositoryDirectory, - silent: true, - }) - const markdown = await fs.readFile( - path.join(downloadedRepository.dir, CHANGELOG_FILE), - 'utf8', - ) - const { records: changelogs, listItemCount } = parseChangelog(markdown) - const changelogItemCount = changelogs.reduce( - (count, changelog) => count + changelog.changelog.length, - 0, - ) - const skippedItemCount = listItemCount - changelogItemCount - - if (changelogItemCount === 0) { - throw new Error(`No conventional-commit changelog items found in ${CHANGELOG_FILE}`) - } - - if (skippedItemCount > 0) { - console.warn( - `Skipped ${skippedItemCount} list items without conventional-commit metadata`, - ) - } - - await fs.mkdir(path.dirname(OUTPUT_FILE), { recursive: true }) - await fs.writeFile( - OUTPUT_FILE, - `${JSON.stringify(changelogs, null, 2)}\n`, - 'utf8', - ) + const repositoryDirectory = path.join(process.cwd(), 'antdv-source') + + const markdown = await fs.readFile( + path.join(repositoryDirectory, CHANGELOG_FILE), + 'utf8', + ) + const { records: changelogs, listItemCount } = parseChangelog(markdown) + const changelogItemCount = changelogs.reduce( + (count, changelog) => count + changelog.changelog.length, + 0, + ) + const skippedItemCount = listItemCount - changelogItemCount + + if (changelogItemCount === 0) { + throw new Error(`No conventional-commit changelog items found in ${CHANGELOG_FILE}`) + } - console.log( - `Wrote ${changelogs.length} releases with ${changelogItemCount} changelog items to ${OUTPUT_FILE}`, + if (skippedItemCount > 0) { + console.warn( + `Skipped ${skippedItemCount} list items without conventional-commit metadata`, ) } - finally { - await fs.rm(repositoryDirectory, { recursive: true, force: true }) - } + + await fs.mkdir(path.dirname(OUTPUT_FILE), { recursive: true }) + await fs.writeFile( + OUTPUT_FILE, + `${JSON.stringify(changelogs, null, 2)}\n`, + 'utf8', + ) + + console.log( + `Wrote ${changelogs.length} releases with ${changelogItemCount} changelog items to ${OUTPUT_FILE}`, + ) } await main() From 470050196a6c97352c617d7cc99bd86c73885e1c Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Mon, 17 Aug 2026 10:39:53 +0800 Subject: [PATCH 070/106] feat(sync): integrate token fetching into changelog generation - Import TokenData type and fetchTokens function - Update ChangelogFile interface to accept TokenData[] or unknown[] - Make createChangelogFile asynchronous to fetch tokens - Add token data to globalTokens field in changelog files - Convert buildOutputFiles to async function with proper awaits - Update main function to await async operations properly --- scripts/sync.ts | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/scripts/sync.ts b/scripts/sync.ts index c1f91da..888e272 100644 --- a/scripts/sync.ts +++ b/scripts/sync.ts @@ -1,5 +1,6 @@ // @env node +import type { TokenData } from './tokens' import fs from 'node:fs/promises' import path from 'node:path' import { fileURLToPath } from 'node:url' @@ -7,6 +8,7 @@ import dayjs from 'dayjs' import utc from 'dayjs/plugin/utc.js' import { parse } from 'semver' import { x } from 'tinyexec' +import { fetchTokens } from './tokens' dayjs.extend(utc) @@ -31,7 +33,7 @@ interface ChangelogRecord extends VersionRecord { } interface ChangelogFile extends VersionRecord { - globalTokens: unknown[] + globalTokens: TokenData[] | unknown[] changelog: ChangelogRecord[] } @@ -301,18 +303,20 @@ function assertPublishTimes( } } -function createChangelogFile( +async function createChangelogFile( tags: ParsedTag[], publishTimes: Map, changesByVersion: Map, -): ChangelogFile { +): Promise { const highestTag = getHighestBaseVersion(tags) const version = getBaseVersion(highestTag) + const tokens = await fetchTokens(version) + return { version, majorVersion: `v${highestTag.major}`, - globalTokens: [], + globalTokens: tokens, changelog: tags .filter(tag => tag.record.version !== version) .map(tag => createChangelogRecord(tag, publishTimes, changesByVersion)), @@ -336,22 +340,22 @@ function groupTagsByMajor(tags: ParsedTag[]): Map { return groups } -function buildOutputFiles( +async function buildOutputFiles( tags: ParsedTag[], publishTimes: Map, changesByVersion: Map, -): Map { +): Promise> { const outputFiles = new Map() for (const [major, majorTags] of groupTagsByMajor(tags)) { outputFiles.set( `v${major}.json`, - createChangelogFile(majorTags, publishTimes, changesByVersion), + await createChangelogFile(majorTags, publishTimes, changesByVersion), ) } for (const group of groupTagsByMinor(tags)) { - const changelogFile = createChangelogFile( + const changelogFile = await createChangelogFile( group.tags, publishTimes, changesByVersion, @@ -418,7 +422,7 @@ async function main(): Promise { } assertPublishTimes(tags, publishTimes) - const outputFiles = buildOutputFiles(tags, publishTimes, changesByVersion) + const outputFiles = await buildOutputFiles(tags, publishTimes, changesByVersion) const versionFile = createVersionFile(tags) const syncedMajorVersions = new Set(tags.map(tag => tag.major)) From 16646eb0adab9e730ec29c48641f51be53c9794b Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Mon, 17 Aug 2026 11:00:51 +0800 Subject: [PATCH 071/106] refactor(sync): remove unnecessary version filter in changelog generation - Removed redundant filter condition that excluded current version from changelog - Simplified changelog record creation process - Improved code clarity by eliminating unnecessary array filtering operation - Maintained same changelog output functionality without extra processing step --- scripts/sync.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/sync.ts b/scripts/sync.ts index 888e272..13285dd 100644 --- a/scripts/sync.ts +++ b/scripts/sync.ts @@ -318,7 +318,6 @@ async function createChangelogFile( majorVersion: `v${highestTag.major}`, globalTokens: tokens, changelog: tags - .filter(tag => tag.record.version !== version) .map(tag => createChangelogRecord(tag, publishTimes, changesByVersion)), } } From 051fe6897fd16e039ca194c2abe2155ee3171cb2 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Mon, 17 Aug 2026 11:06:13 +0800 Subject: [PATCH 072/106] feat(tokens): add script to fetch token metadata from antdv-next package - Implement fetchTokens function to retrieve token data from specified version - Add npm pack and tar extraction logic to access package contents - Create temporary directory handling with proper cleanup - Parse token-meta.json to extract global token information - Map token entries with name, type, description, and Chinese description fields - Add error handling to return empty array on failure - Include console logging for debugging and progress tracking --- scripts/tokens.ts | 68 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 scripts/tokens.ts diff --git a/scripts/tokens.ts b/scripts/tokens.ts new file mode 100644 index 0000000..87490ec --- /dev/null +++ b/scripts/tokens.ts @@ -0,0 +1,68 @@ +import { statSync } from 'node:fs' +import { mkdir, readFile } from 'node:fs/promises' +import { join, resolve } from 'node:path' +import process from 'node:process' +import { x } from 'tinyexec' + +export interface TokenData { + name: string + type: string + default?: string + description?: string + descriptionZh?: string +} + +export async function fetchTokens(version: string): Promise { + try { + const tmpDir = join(process.cwd(), '.tmp-npm-pack') + await mkdir(tmpDir, { + recursive: true, + }) + + console.log(`Fetch token metadata from antdv-next@${version}`) + + await x('npm', ['pack', `antdv-next@${version}`, '--quiet'], { + nodeOptions: { + cwd: tmpDir, + stdio: 'pipe', + }, + }) + + const tempVersionDir = join(tmpDir, `antdv-next-${version}`) + await mkdir(tempVersionDir, { + recursive: true, + }) + console.log(tempVersionDir) + + await x('tar', [ + '-xzf', + resolve(tmpDir, `antdv-next-${version}.tgz`), + '-C', + tempVersionDir, + ], { + nodeOptions: { + cwd: tmpDir, + stdio: 'pipe', + }, + }) + + const contentPath = join(tempVersionDir, 'package', 'dist', 'version', 'token-meta.json') + if (!statSync(contentPath).isFile()) { + return [] + } + const content = JSON.parse(await readFile(contentPath, 'utf-8')) + return Object.entries(content.global).map(([key, g]: [string, any]) => ({ + name: key, + type: g.type, + default: '', + description: g.descEn, + descriptionZh: g.desc, + })) as TokenData[] + } + // eslint-disable-next-line unused-imports/no-unused-vars + catch (error) { + return [] + } +} + +console.log(await fetchTokens('1.5.1')) From 4a2debbb8b4c53ab9527d366bf51b19ea4269cc4 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Mon, 17 Aug 2026 13:26:56 +0800 Subject: [PATCH 073/106] fix(args): make bugArgs optional in OptionsArgs type - Changed ParsedArgs to Partial> - Allows OptionsArgs to work without requiring all bugArgs properties - Maintains compatibility with existing defaultArgs while making bugArgs optional --- src/args/args.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/args/args.d.ts b/src/args/args.d.ts index 103c148..36e56b2 100644 --- a/src/args/args.d.ts +++ b/src/args/args.d.ts @@ -2,4 +2,4 @@ import type { ParsedArgs } from 'citty' import type { bugArgs } from '@/args/bug.ts' import type { defaultArgs } from '@/args/default.ts' -export type OptionsArgs = ParsedArgs & ParsedArgs +export type OptionsArgs = ParsedArgs & Partial> From e0ed8094ad93de85fffc354f8a0bd7b1f29a4ac9 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Mon, 17 Aug 2026 13:35:19 +0800 Subject: [PATCH 074/106] types(args): remove unused ParsedArgs import and CommandArgs type - Removed unused ParsedArgs import from citty - Deleted CommandArgs type declaration - Simplified default.ts file structure --- src/args/default.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/args/default.ts b/src/args/default.ts index 381bc56..8833d4f 100644 --- a/src/args/default.ts +++ b/src/args/default.ts @@ -1,4 +1,4 @@ -import type { ArgsDef, ParsedArgs } from 'citty' +import type { ArgsDef } from 'citty' export const OUTPUT_FORMATS = ['text', 'markdown', 'json'] as const export type OutputFormat = typeof OUTPUT_FORMATS[number] @@ -22,5 +22,3 @@ export const defaultArgs = { options: [...OUTPUT_FORMATS], }, } satisfies ArgsDef - -export type CommandArgs = ParsedArgs From efdb372512870917f51beb14ca033f79816adb10 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Mon, 17 Aug 2026 13:39:31 +0800 Subject: [PATCH 075/106] feat(args): add default value for target version argument - Set empty string as default value for ver argument - Maintain backward compatibility while providing clearer initialization - Improve argument parsing behavior when version is not specified --- src/args/default.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/args/default.ts b/src/args/default.ts index 8833d4f..c14fbc5 100644 --- a/src/args/default.ts +++ b/src/args/default.ts @@ -13,6 +13,7 @@ export const defaultArgs = { ver: { type: 'string', description: 'Target antdv-next version (e.g. 1.0.0)', + default: '', }, format: { type: 'enum', From fcbdc69360bf997f72a6f83a0567a6bdaa4ebe2b Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Mon, 17 Aug 2026 13:39:40 +0800 Subject: [PATCH 076/106] feat(config): add version field to resolved config - Added version property to ResolvedConfig interface - Updated type definition to include package version information --- src/types.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/types.ts b/src/types.ts index 0a916fb..3cf835f 100644 --- a/src/types.ts +++ b/src/types.ts @@ -3,6 +3,7 @@ import type { OutputFormat } from '@/args/default.ts' export interface ResolvedConfig { cwd: string format: OutputFormat + version: string } export interface PackageInfo { From 16d4d8626288be08ab89d429580352b5329abf66 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Mon, 17 Aug 2026 13:39:48 +0800 Subject: [PATCH 077/106] feat(config): add version option to configuration - Added version property from options to config object - Updated config return object to include version field - Maintained existing cwd and format properties unchanged --- src/config.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/config.ts b/src/config.ts index ffe8ad5..a720a97 100644 --- a/src/config.ts +++ b/src/config.ts @@ -5,5 +5,6 @@ export const resolveConfig = (options: OptionsArgs): ResolvedConfig => { return { cwd: options.cwd, format: options.format, + version: options.ver, } } From 3ab2867d6bbf5737d348e575e6cefbc9e87dba33 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Mon, 17 Aug 2026 13:51:47 +0800 Subject: [PATCH 078/106] chore(mcp): add todo comment for second development stage - Added TODO comment indicating upcoming second development phase - Maintained existing command structure and functionality - Prepared groundwork for future MCP server enhancements --- src/commands/mcp.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/commands/mcp.ts b/src/commands/mcp.ts index 7812362..1d71aa5 100644 --- a/src/commands/mcp.ts +++ b/src/commands/mcp.ts @@ -6,6 +6,7 @@ export default defineCommand({ description: 'Start MCP server for AI assistant integration', }, run({ args }) { + // TODO : stage second development console.log('Parsed args:', args) }, }) From a3b2bd4054fe9bc2aef4dfc6d10035349e9a2ecf Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Mon, 17 Aug 2026 14:51:13 +0800 Subject: [PATCH 079/106] refactor(sync): update token fetching logic to use separate loader function - Import loaderVersionToken function from tokens module - Call fetchTokens first without assigning return value - Use loaderVersionToken to get tokens instead of direct fetchTokens call - Move temporary directory creation check to tokens module - Add error handling for token loading operations --- scripts/sync.ts | 6 ++++-- scripts/tokens.ts | 29 +++++++++++++++++++---------- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/scripts/sync.ts b/scripts/sync.ts index 13285dd..8cf3571 100644 --- a/scripts/sync.ts +++ b/scripts/sync.ts @@ -8,7 +8,7 @@ import dayjs from 'dayjs' import utc from 'dayjs/plugin/utc.js' import { parse } from 'semver' import { x } from 'tinyexec' -import { fetchTokens } from './tokens' +import { fetchTokens, loaderVersionToken } from './tokens' dayjs.extend(utc) @@ -311,7 +311,9 @@ async function createChangelogFile( const highestTag = getHighestBaseVersion(tags) const version = getBaseVersion(highestTag) - const tokens = await fetchTokens(version) + await fetchTokens(version) + + const tokens = await loaderVersionToken(version) return { version, diff --git a/scripts/tokens.ts b/scripts/tokens.ts index 87490ec..2207301 100644 --- a/scripts/tokens.ts +++ b/scripts/tokens.ts @@ -1,4 +1,4 @@ -import { statSync } from 'node:fs' +import { existsSync, statSync } from 'node:fs' import { mkdir, readFile } from 'node:fs/promises' import { join, resolve } from 'node:path' import process from 'node:process' @@ -12,12 +12,15 @@ export interface TokenData { descriptionZh?: string } -export async function fetchTokens(version: string): Promise { +const tmpDir = join(process.cwd(), '.tmp-npm-pack') + +export async function fetchTokens(version: string): Promise { try { - const tmpDir = join(process.cwd(), '.tmp-npm-pack') - await mkdir(tmpDir, { - recursive: true, - }) + if (!existsSync(tmpDir)) { + await mkdir(tmpDir, { + recursive: true, + }) + } console.log(`Fetch token metadata from antdv-next@${version}`) @@ -32,7 +35,6 @@ export async function fetchTokens(version: string): Promise Date: Mon, 17 Aug 2026 15:07:27 +0800 Subject: [PATCH 080/106] perf(workflow): optimize antdv-next source cloning in sync workflow - Replace npx giget with git clone using tree:0 filter for faster cloning - Add no-checkout flag to reduce initial clone overhead - Maintain same destination directory structure for compatibility --- .github/workflows/sync.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/sync.yml b/.github/workflows/sync.yml index 4c3001f..bdbe197 100644 --- a/.github/workflows/sync.yml +++ b/.github/workflows/sync.yml @@ -37,7 +37,7 @@ jobs: run: pnpm install --frozen-lockfile - name: Clone antdv-next source - run: npx giget gh:antdv-next/antdv-next antdv-source + run: git clone --filter=tree:0 --no-checkout https://github.com/antdv-next/antdv-next.git antdv-source - name: Generate changelog data run: pnpm exec tsx scripts/changelog.ts From 1a182d5ded87ec76b839ef639c1fd80dd3f8057d Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Mon, 17 Aug 2026 16:20:05 +0800 Subject: [PATCH 081/106] feat(sync): add component documentation parsing and sync functionality - Add interfaces for component records, props, API sections, and markdown parsing - Implement markdown frontmatter, headings, and table parsing utilities - Create component document parsing logic for English and Chinese docs - Add component property merging with bilingual support - Integrate component data loading into changelog generation - Implement git checkout and file reading for component documentation - Add caching mechanism for component data by version - Parse API sections including properties, events, and methods from markdown - Extract component metadata including name, category, description and usage info --- scripts/sync.ts | 709 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 708 insertions(+), 1 deletion(-) diff --git a/scripts/sync.ts b/scripts/sync.ts index 8cf3571..679b3b6 100644 --- a/scripts/sync.ts +++ b/scripts/sync.ts @@ -34,9 +34,61 @@ interface ChangelogRecord extends VersionRecord { interface ChangelogFile extends VersionRecord { globalTokens: TokenData[] | unknown[] + components: ComponentRecord[] changelog: ChangelogRecord[] } +type ApiSectionName = 'properties' | 'events' | 'methods' +type MarkdownTableRow = Record + +interface ComponentPropRecord { + name: string + type: string + default: string + description: string + descriptionZh: string +} + +interface ComponentRecord { + name: string + nameZh: string + category: string + categoryZh: string + description: string + descriptionZh: string + whenToUse: string + whenToUseZh: string + subComponents: Record + props: ComponentPropRecord[] +} + +interface MarkdownHeading { + level: number + title: string + anchor: string + start: number + contentStart: number +} + +interface ParsedApi { + properties: MarkdownTableRow[] + events: MarkdownTableRow[] + methods: MarkdownTableRow[] +} + +interface ParsedSubComponent { + key: string + name: string + props: ParsedApi +} + +interface ParsedComponentDocument { + frontmatter: Record + whenToUse: string + subComponents: ParsedSubComponent[] + props: ParsedApi +} + type VersionFile = [Record>] interface ParsedTag { @@ -57,10 +109,664 @@ const PACKAGE_NAME = 'antdv-next' const REMOTE_URL = 'https://github.com/antdv-next/antdv-next.git' const TAG_PREFIX = `${PACKAGE_NAME}@` const OUTPUT_DIRECTORY = fileURLToPath(new URL('../data', import.meta.url)) +const SOURCE_DIRECTORY = fileURLToPath(new URL('../antdv-source', import.meta.url)) +const COMPONENTS_DIRECTORY = path.join(SOURCE_DIRECTORY, 'docs/src/pages/components') const CHANGELOG_FILE = path.join(OUTPUT_DIRECTORY, 'changelog.json') const REMOTE_TAG_PATTERN = /^[0-9a-f]+\s+refs\/tags\/(.+)$/i const MINOR_FILE_PATTERN = /^v(\d+)\.(\d+)\.(\d+)\.json$/ +const componentCache = new Map>() + +function parseFrontmatterValue(rawValue: string): string { + const value = rawValue.trim() + + if (value.startsWith('"') && value.endsWith('"')) { + try { + return JSON.parse(value) as string + } + catch { + return value.slice(1, -1) + } + } + + if (value.startsWith('\'') && value.endsWith('\'')) { + return value.slice(1, -1).replace(/''/g, '\'') + } + + return value +} + +function parseFrontmatter(markdown: string): Record { + const markdownLines = markdown.split(/\r?\n/) + const closingDelimiterIndex = markdownLines + .slice(1) + .findIndex(line => line.trim() === '---') + 1 + + if (markdownLines[0]?.trim() !== '---' || closingDelimiterIndex <= 0) { + return {} + } + + const lines = markdownLines.slice(1, closingDelimiterIndex) + const frontmatter: Record = {} + + for (let index = 0; index < lines.length; index += 1) { + const line = lines[index]! + const delimiterIndex = line.indexOf(':') + const key = line.slice(0, delimiterIndex) + + if (delimiterIndex <= 0 || !/^[\w-]+$/.test(key)) { + continue + } + + const rawValue = line.slice(delimiterIndex + 1).trim() + + if (rawValue === '|' || rawValue === '>' || rawValue === '|-' || rawValue === '>-') { + const blockLines: string[] = [] + + while (index + 1 < lines.length) { + const nextLine = lines[index + 1]! + + if (nextLine !== '' && nextLine[0] !== ' ' && nextLine[0] !== '\t') { + break + } + + index += 1 + blockLines.push(lines[index]!.replace(/^\s+/, '')) + } + + frontmatter[key!] = rawValue.startsWith('>') + ? blockLines.join(' ').trim() + : blockLines.join('\n').trim() + continue + } + + frontmatter[key!] = parseFrontmatterValue(rawValue) + } + + return frontmatter +} + +function parseHeadings(markdown: string): MarkdownHeading[] { + const headings: MarkdownHeading[] = [] + const lines = markdown.split('\n') + let offset = 0 + let fence = '' + + for (const rawLine of lines) { + const line = rawLine.endsWith('\r') ? rawLine.slice(0, -1) : rawLine + const trimmedLine = line.trimStart() + const fenceMarker = trimmedLine.startsWith('```') + ? '```' + : trimmedLine.startsWith('~~~') ? '~~~' : '' + + if (fenceMarker) { + fence = fence === fenceMarker ? '' : fence || fenceMarker + offset += rawLine.length + 1 + continue + } + + if (fence) { + offset += rawLine.length + 1 + continue + } + + const headingMatch = line.match(/^(#{1,6})[ \t]+/) + + if (!headingMatch) { + offset += rawLine.length + 1 + continue + } + + let rawTitle = line.slice(headingMatch[0].length).trim() + + while (rawTitle.endsWith('#')) { + rawTitle = rawTitle.slice(0, -1).trimEnd() + } + + const anchorMatch = rawTitle.match(/\s*\{#([^}]+)\}\s*$/) + const title = rawTitle.replace(/\s*\{#[^}]+\}\s*$/, '').trim() + + headings.push({ + level: headingMatch[1]!.length, + title, + anchor: anchorMatch?.[1]?.toLowerCase() ?? '', + start: offset, + contentStart: offset + line.length, + }) + + offset += rawLine.length + 1 + } + + return headings +} + +function getHeadingContent( + markdown: string, + headings: MarkdownHeading[], + headingIndex: number, + boundaryLevel: number, +): string { + const heading = headings[headingIndex] + + if (!heading) { + return '' + } + + const nextHeading = headings + .slice(headingIndex + 1) + .find(candidate => candidate.level <= boundaryLevel) + + return markdown.slice(heading.contentStart, nextHeading?.start ?? markdown.length).trim() +} + +function normalizeHeadingTitle(title: string): string { + return title + .replace(/[`*_~]/g, '') + .replace(/\[([^\]]+)\]\([^)]*\)/g, '$1') + .trim() + .toLowerCase() +} + +function getApiSectionName(heading: MarkdownHeading): ApiSectionName | undefined { + const anchor = heading.anchor.replace(/^api-/, '') + + if (anchor === 'props' || anchor === 'properties') { + return 'properties' + } + if (anchor === 'events' || anchor === 'event') { + return 'events' + } + if (anchor === 'methods' || anchor === 'method') { + return 'methods' + } + + const title = normalizeHeadingTitle(heading.title) + + if (['属性', 'property', 'properties', 'props'].includes(title)) { + return 'properties' + } + if (['事件', 'event', 'events'].includes(title)) { + return 'events' + } + if (['方法', 'method', 'methods'].includes(title)) { + return 'methods' + } + + return undefined +} + +function splitMarkdownTableRow(line: string): string[] { + const cells: string[] = [] + let cell = '' + let escaped = false + let codeDelimiterLength = 0 + + for (let index = 0; index < line.length; index += 1) { + const character = line[index]! + + if (escaped) { + cell += character + escaped = false + continue + } + + if (character === '\\') { + cell += character + escaped = true + continue + } + + if (character === '`') { + let delimiterLength = 1 + + while (line[index + delimiterLength] === '`') { + delimiterLength += 1 + } + + if (codeDelimiterLength === 0) { + codeDelimiterLength = delimiterLength + } + else if (codeDelimiterLength === delimiterLength) { + codeDelimiterLength = 0 + } + + cell += '`'.repeat(delimiterLength) + index += delimiterLength - 1 + continue + } + + if (character === '|' && codeDelimiterLength === 0) { + cells.push(cell.trim()) + cell = '' + continue + } + + cell += character + } + + cells.push(cell.trim()) + + if (cells[0] === '') { + cells.shift() + } + if (cells.at(-1) === '') { + cells.pop() + } + + return cells +} + +function isMarkdownTableSeparator(cells: string[]): boolean { + return cells.length > 0 && cells.every(cell => /^:?-{3,}:?$/.test(cell.replace(/\s/g, ''))) +} + +function createUniqueColumnNames(columns: string[]): string[] { + const occurrences = new Map() + + return columns.map((column, index) => { + const baseName = column || `column${index + 1}` + const occurrence = (occurrences.get(baseName) ?? 0) + 1 + occurrences.set(baseName, occurrence) + return occurrence === 1 ? baseName : `${baseName}_${occurrence}` + }) +} + +function parseMarkdownTables(markdown: string): MarkdownTableRow[] { + const lines = markdown.split(/\r?\n/) + const rows: MarkdownTableRow[] = [] + + for (let index = 0; index < lines.length - 1; index += 1) { + const columns = splitMarkdownTableRow(lines[index]!) + const separator = splitMarkdownTableRow(lines[index + 1]!) + + if (!lines[index]!.includes('|') || !isMarkdownTableSeparator(separator)) { + continue + } + + const uniqueColumns = createUniqueColumnNames(columns) + index += 2 + + while (index < lines.length && lines[index]!.includes('|')) { + const cells = splitMarkdownTableRow(lines[index]!) + const row: MarkdownTableRow = {} + + for (const [columnIndex, column] of uniqueColumns.entries()) { + row[column] = cells[columnIndex] ?? '' + } + + rows.push(row) + index += 1 + } + + index -= 1 + } + + return rows +} + +function createEmptyParsedApi(): ParsedApi { + return { + properties: [], + events: [], + methods: [], + } +} + +function parseComponentApi( + markdown: string, + headings: MarkdownHeading[], +): { props: ParsedApi, subComponents: ParsedSubComponent[] } { + const props = createEmptyParsedApi() + const subComponents: ParsedSubComponent[] = [] + const apiIndex = headings.findIndex(heading => + heading.level === 2 + && (heading.anchor === 'api' || normalizeHeadingTitle(heading.title) === 'api'), + ) + + if (apiIndex === -1) { + return { props, subComponents } + } + + const apiEndIndex = headings.findIndex((heading, index) => + index > apiIndex && heading.level <= 2, + ) + const scopedEndIndex = apiEndIndex === -1 ? headings.length : apiEndIndex + + for (let index = apiIndex + 1; index < scopedEndIndex; index += 1) { + const heading = headings[index]! + + if (heading.level !== 3) { + continue + } + + const directSectionName = getApiSectionName(heading) + + if (directSectionName) { + props[directSectionName].push( + ...parseMarkdownTables(getHeadingContent(markdown, headings, index, 3)), + ) + continue + } + + const subComponentProps = createEmptyParsedApi() + const nextSiblingIndex = headings.findIndex((candidate, candidateIndex) => + candidateIndex > index && candidate.level <= 3, + ) + const subComponentEndIndex = nextSiblingIndex === -1 + ? scopedEndIndex + : Math.min(nextSiblingIndex, scopedEndIndex) + let hasApiSections = false + + for (let childIndex = index + 1; childIndex < subComponentEndIndex; childIndex += 1) { + const childHeading = headings[childIndex]! + const sectionName = childHeading.level === 4 + ? getApiSectionName(childHeading) + : undefined + + if (!sectionName) { + continue + } + + hasApiSections = true + subComponentProps[sectionName].push( + ...parseMarkdownTables(getHeadingContent(markdown, headings, childIndex, 4)), + ) + } + + if (!hasApiSections) { + continue + } + + subComponents.push({ + key: heading.anchor || normalizeHeadingTitle(heading.title), + name: heading.title, + props: subComponentProps, + }) + } + + return { props, subComponents } +} + +function parseComponentDocument(markdown: string): ParsedComponentDocument { + const headings = parseHeadings(markdown) + const whenToUseIndex = headings.findIndex(heading => + heading.level === 2 && heading.anchor === 'when-to-use', + ) + const { props, subComponents } = parseComponentApi(markdown, headings) + + return { + frontmatter: parseFrontmatter(markdown), + whenToUse: whenToUseIndex === -1 + ? '' + : getHeadingContent(markdown, headings, whenToUseIndex, 2), + subComponents, + props, + } +} + +function normalizeTableColumn(column: string): string { + return column + .replace(/[`*_~]/g, '') + .replace(/\s+/g, '') + .toLowerCase() +} + +function getTableCell(row: MarkdownTableRow, columns: string[]): string { + const normalizedColumns = new Set(columns.map(normalizeTableColumn)) + + for (const [column, value] of Object.entries(row)) { + if (normalizedColumns.has(normalizeTableColumn(column))) { + return value.trim() + } + } + + return '' +} + +function getTableRowName(row: MarkdownTableRow): string { + return getTableCell(row, [ + 'name', + 'property', + 'property name', + 'properties', + 'event', + 'event name', + 'events', + 'method', + 'method name', + 'methods', + '名称', + '属性', + '属性名', + '事件', + '事件名', + '方法', + '方法名', + ]).replace(/`/g, '').trim() +} + +function getTableRowType(row: MarkdownTableRow): string { + return getTableCell(row, ['type', '类型']) +} + +function getTableRowDefault(row: MarkdownTableRow): string { + return getTableCell(row, ['default', 'default value', '默认', '默认值']) +} + +function getTableRowDescription(row: MarkdownTableRow): string { + return getTableCell(row, ['description', '描述', '说明']) +} + +function normalizeTableRowName(row: MarkdownTableRow): string { + return getTableRowName(row).replace(/\s+/g, '').toLowerCase() +} + +function mergeTableRows( + enRows: MarkdownTableRow[], + zhRows: MarkdownTableRow[], +): ComponentPropRecord[] { + const zhRowsByName = new Map() + const usedZhRows = new Set() + + for (const zhRow of zhRows) { + const name = normalizeTableRowName(zhRow) + const rows = zhRowsByName.get(name) ?? [] + rows.push(zhRow) + zhRowsByName.set(name, rows) + } + + const records = enRows.map((enRow, index) => { + const matchingRows = zhRowsByName.get(normalizeTableRowName(enRow)) + const zhRow = matchingRows?.find(row => !usedZhRows.has(row)) + ?? (usedZhRows.has(zhRows[index]!) ? undefined : zhRows[index]) + + if (zhRow) { + usedZhRows.add(zhRow) + } + + return { + name: getTableRowName(enRow) || (zhRow ? getTableRowName(zhRow) : ''), + type: getTableRowType(enRow) || (zhRow ? getTableRowType(zhRow) : ''), + default: getTableRowDefault(enRow) || (zhRow ? getTableRowDefault(zhRow) : ''), + description: getTableRowDescription(enRow), + descriptionZh: zhRow ? getTableRowDescription(zhRow) : '', + } + }) + + for (const zhRow of zhRows) { + if (usedZhRows.has(zhRow)) { + continue + } + + records.push({ + name: getTableRowName(zhRow), + type: getTableRowType(zhRow), + default: getTableRowDefault(zhRow), + description: '', + descriptionZh: getTableRowDescription(zhRow), + }) + } + + return records +} + +function flattenApi(en: ParsedApi, zh: ParsedApi): ComponentPropRecord[] { + return [ + ...mergeTableRows(en.properties, zh.properties), + ...mergeTableRows(en.events, zh.events), + ...mergeTableRows(en.methods, zh.methods), + ] +} + +function cleanSubComponentName(name: string): string { + return name + .replace(/[`*_~]/g, '') + .replace(/\[([^\]]+)\]\([^)]*\)/g, '$1') + .trim() +} + +function createSubComponentRecord( + records: Record, + subComponentName: string, + props: ComponentPropRecord[], +): void { + for (const prop of props) { + const key = `${subComponentName}-${prop.name}` + const existingProps = records[key] ?? [] + existingProps.push(prop) + records[key] = existingProps + } +} + +function localizeSubComponents( + enSubComponents: ParsedSubComponent[], + zhSubComponents: ParsedSubComponent[], +): Record { + const zhByKey = new Map(zhSubComponents.map(subComponent => [subComponent.key, subComponent])) + const usedZhComponents = new Set() + const records: Record = {} + + for (const [index, enSubComponent] of enSubComponents.entries()) { + const zhSubComponent = zhByKey.get(enSubComponent.key) ?? zhSubComponents[index] + + if (zhSubComponent) { + usedZhComponents.add(zhSubComponent) + } + + createSubComponentRecord( + records, + cleanSubComponentName(enSubComponent.name), + flattenApi(enSubComponent.props, zhSubComponent?.props ?? createEmptyParsedApi()), + ) + } + + for (const zhSubComponent of zhSubComponents) { + if (usedZhComponents.has(zhSubComponent)) { + continue + } + + createSubComponentRecord( + records, + cleanSubComponentName(zhSubComponent.name), + flattenApi(createEmptyParsedApi(), zhSubComponent.props), + ) + } + + return records +} + +function getFrontmatterField( + frontmatter: Record, + field: string, + fallbackField?: string, +): string { + return frontmatter[field] ?? (fallbackField ? frontmatter[fallbackField] : undefined) ?? '' +} + +async function readComponent(componentDirectory: string): Promise { + const directory = path.join(COMPONENTS_DIRECTORY, componentDirectory) + const enFile = path.join(directory, 'index.en-US.md') + const zhFile = path.join(directory, 'index.zh-CN.md') + let enMarkdown: string + let zhMarkdown: string + + try { + [enMarkdown, zhMarkdown] = await Promise.all([ + fs.readFile(enFile, 'utf8'), + fs.readFile(zhFile, 'utf8'), + ]) + } + catch (error) { + if ((error as NodeJS.ErrnoException).code === 'ENOENT') { + return undefined + } + throw error + } + + const en = parseComponentDocument(enMarkdown) + const zh = parseComponentDocument(zhMarkdown) + + return { + name: getFrontmatterField(en.frontmatter, 'name', 'title'), + nameZh: getFrontmatterField(zh.frontmatter, 'name', 'title'), + category: getFrontmatterField(en.frontmatter, 'category'), + categoryZh: getFrontmatterField(zh.frontmatter, 'category'), + description: getFrontmatterField(en.frontmatter, 'description'), + descriptionZh: getFrontmatterField(zh.frontmatter, 'description'), + whenToUse: en.whenToUse, + whenToUseZh: zh.whenToUse, + subComponents: localizeSubComponents(en.subComponents, zh.subComponents), + props: flattenApi(en.props, zh.props), + } +} + +async function checkoutSourceVersion(version: string): Promise { + try { + await fs.access(SOURCE_DIRECTORY) + } + catch { + throw new Error(`Missing source repository: ${SOURCE_DIRECTORY}`) + } + + await x('git', [ + '-C', + SOURCE_DIRECTORY, + 'checkout', + '--quiet', + `${TAG_PREFIX}${version}`, + ], { + throwOnError: true, + nodeOptions: { + stdio: 'pipe', + }, + }) +} + +async function readComponentsForVersion(version: string): Promise { + await checkoutSourceVersion(version) + + const directoryEntries = await fs.readdir(COMPONENTS_DIRECTORY, { withFileTypes: true }) + const componentDirectories = directoryEntries + .filter(entry => entry.isDirectory()) + .map(entry => entry.name) + .sort((left, right) => left.localeCompare(right)) + const components = await Promise.all(componentDirectories.map(readComponent)) + + return components.filter(component => component !== undefined) +} + +function loadComponents(version: string): Promise { + const cachedComponents = componentCache.get(version) + + if (cachedComponents) { + return cachedComponents + } + + const components = readComponentsForVersion(version) + componentCache.set(version, components) + return components +} + async function fetchTags(majorVersion: number): Promise { const tagPattern = `refs/tags/${TAG_PREFIX}${majorVersion}.*` const { stdout } = await x('git', [ @@ -311,14 +1017,15 @@ async function createChangelogFile( const highestTag = getHighestBaseVersion(tags) const version = getBaseVersion(highestTag) + const components = await loadComponents(version) await fetchTokens(version) - const tokens = await loaderVersionToken(version) return { version, majorVersion: `v${highestTag.major}`, globalTokens: tokens, + components, changelog: tags .map(tag => createChangelogRecord(tag, publishTimes, changesByVersion)), } From 3b4343b78a2804671d4be47b6a8089355b11745b Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Mon, 17 Aug 2026 16:24:46 +0800 Subject: [PATCH 082/106] feat(sync): add documentation fields to component records - Added doc and docZh string properties to ComponentPropRecord interface - Updated localization function to include markdown content for both English and Chinese docs - Extended component data structure to store original markdown documentation content - Maintained backward compatibility with existing component properties --- scripts/sync.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scripts/sync.ts b/scripts/sync.ts index 679b3b6..cfb19e2 100644 --- a/scripts/sync.ts +++ b/scripts/sync.ts @@ -58,6 +58,8 @@ interface ComponentRecord { descriptionZh: string whenToUse: string whenToUseZh: string + doc: string + docZh: string subComponents: Record props: ComponentPropRecord[] } @@ -715,6 +717,8 @@ async function readComponent(componentDirectory: string): Promise Date: Mon, 17 Aug 2026 20:50:14 +0800 Subject: [PATCH 083/106] feat(sync): add component tokens, FAQ, and demos extraction - Add ComponentFaqRecord and ComponentDemoRecord interfaces - Add tokens, faq, and demos fields to ComponentRecord interface - Add TokenMetaFile, TokenDefaultIndex, DemoReference, and ElementBlock interfaces - Add constants for token meta and token files - Add functions for parsing token metadata and defaults - Add functions for extracting element blocks and attributes from markdown - Add functions for parsing FAQ sections and demo references - Update readComponent function to accept token data parameters - Add tokens, faq, and demos data to component records - Add prepareSourceVersion function to handle token build process - Integrate token data reading into component processing flow --- scripts/sync.ts | 522 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 518 insertions(+), 4 deletions(-) diff --git a/scripts/sync.ts b/scripts/sync.ts index cfb19e2..3139fe3 100644 --- a/scripts/sync.ts +++ b/scripts/sync.ts @@ -49,6 +49,20 @@ interface ComponentPropRecord { descriptionZh: string } +interface ComponentFaqRecord { + question: string + answer: string +} + +interface ComponentDemoRecord { + name: string + title: string + titleZh: string + description: string + descriptionZh: string + code: string +} + interface ComponentRecord { name: string nameZh: string @@ -62,6 +76,40 @@ interface ComponentRecord { docZh: string subComponents: Record props: ComponentPropRecord[] + tokens: ComponentPropRecord[] + faq: ComponentFaqRecord[] + demos: ComponentDemoRecord[] +} + +interface ComponentTokenMeta { + source: string + token: string + type: string + desc: string + descEn: string + name: string + nameEn: string +} + +interface TokenMetaFile { + components: Record +} + +interface TokenDefaultIndex { + global: Map + components: Map> +} + +interface DemoReference { + src: string + title: string +} + +interface ElementBlock { + start: number + openingTag: string + content: string + fullContent: string } interface MarkdownHeading { @@ -113,6 +161,8 @@ const TAG_PREFIX = `${PACKAGE_NAME}@` const OUTPUT_DIRECTORY = fileURLToPath(new URL('../data', import.meta.url)) const SOURCE_DIRECTORY = fileURLToPath(new URL('../antdv-source', import.meta.url)) const COMPONENTS_DIRECTORY = path.join(SOURCE_DIRECTORY, 'docs/src/pages/components') +const TOKEN_META_FILE = path.join(SOURCE_DIRECTORY, 'docs/src/assets/token-meta.json') +const TOKEN_FILE = path.join(SOURCE_DIRECTORY, 'docs/src/assets/token.json') const CHANGELOG_FILE = path.join(OUTPUT_DIRECTORY, 'changelog.json') const REMOTE_TAG_PATTERN = /^[0-9a-f]+\s+refs\/tags\/(.+)$/i const MINOR_FILE_PATTERN = /^v(\d+)\.(\d+)\.(\d+)\.json$/ @@ -677,6 +727,438 @@ function localizeSubComponents( return records } +function isRecord(value: unknown): value is Record { + return Boolean(value) && typeof value === 'object' && !Array.isArray(value) +} + +function parseTokenMetaFile(value: unknown): TokenMetaFile { + if (!isRecord(value) || !isRecord(value.components)) { + throw new TypeError(`Invalid token metadata in ${TOKEN_META_FILE}`) + } + + return { + components: value.components, + } +} + +function parseComponentTokenMeta(value: unknown): ComponentTokenMeta | undefined { + if (!isRecord(value) || typeof value.token !== 'string') { + return undefined + } + + return { + source: typeof value.source === 'string' ? value.source : '', + token: value.token, + type: typeof value.type === 'string' ? value.type : '', + desc: typeof value.desc === 'string' ? value.desc : '', + descEn: typeof value.descEn === 'string' ? value.descEn : '', + name: typeof value.name === 'string' ? value.name : '', + nameEn: typeof value.nameEn === 'string' ? value.nameEn : '', + } +} + +function stringifyTokenDefault(value: unknown): string { + if (value === undefined || value === null) { + return '' + } + + if (typeof value === 'string') { + return value + } + + if (typeof value === 'number' || typeof value === 'boolean') { + return String(value) + } + + return JSON.stringify(value) +} + +function getTokenDefaultCandidate(value: unknown): unknown { + if (!isRecord(value)) { + return value + } + + if ('default' in value) { + return value.default + } + if ('defaultValue' in value) { + return value.defaultValue + } + if ('value' in value) { + return value.value + } + + return undefined +} + +function setTokenDefault( + index: TokenDefaultIndex, + token: string, + value: unknown, + componentName?: string, +): void { + const defaultValue = stringifyTokenDefault(value) + + if (componentName) { + const componentDefaults = index.components.get(componentName) ?? new Map() + + if (!componentDefaults.has(token)) { + componentDefaults.set(token, defaultValue) + } + + index.components.set(componentName, componentDefaults) + return + } + + if (!index.global.has(token)) { + index.global.set(token, defaultValue) + } +} + +function createTokenDefaultIndex( + tokenData: unknown, + componentNames: Set, +): TokenDefaultIndex { + const index: TokenDefaultIndex = { + global: new Map(), + components: new Map(), + } + + function visit(value: unknown, componentName?: string): void { + if (Array.isArray(value)) { + for (const item of value) { + visit(item, componentName) + } + return + } + + if (!isRecord(value)) { + return + } + + const token = typeof value.token === 'string' + ? value.token + : typeof value.name === 'string' ? value.name : undefined + const tokenDefault = getTokenDefaultCandidate(value) + + if (token && tokenDefault !== undefined) { + setTokenDefault(index, token, tokenDefault, componentName) + } + + for (const [key, nestedValue] of Object.entries(value)) { + if (key === 'components' && isRecord(nestedValue)) { + for (const [nestedComponentName, componentValue] of Object.entries(nestedValue)) { + visit(componentValue, nestedComponentName) + } + continue + } + + const nestedComponentName = componentNames.has(key) ? key : componentName + const nestedDefault = getTokenDefaultCandidate(nestedValue) + + if (nestedDefault !== undefined) { + setTokenDefault(index, key, nestedDefault, nestedComponentName) + } + + visit(nestedValue, nestedComponentName) + } + } + + visit(tokenData) + return index +} + +async function readJsonFile(filename: string): Promise { + const source = await fs.readFile(filename, 'utf8') + + try { + return JSON.parse(source) + } + catch { + throw new Error(`Invalid JSON in ${filename}`) + } +} + +async function readTokenData(): Promise<{ + tokenMeta: TokenMetaFile + tokenDefaults: TokenDefaultIndex +}> { + const [rawTokenMeta, tokenData] = await Promise.all([ + readJsonFile(TOKEN_META_FILE), + readJsonFile(TOKEN_FILE), + ]) + const tokenMeta = parseTokenMetaFile(rawTokenMeta) + + return { + tokenMeta, + tokenDefaults: createTokenDefaultIndex( + tokenData, + new Set(Object.keys(tokenMeta.components)), + ), + } +} + +function getComponentTokens( + componentName: string, + tokenMeta: TokenMetaFile, + tokenDefaults: TokenDefaultIndex, +): ComponentPropRecord[] { + const rawTokens = tokenMeta.components[componentName] + + if (!Array.isArray(rawTokens)) { + return [] + } + + return rawTokens + .map(parseComponentTokenMeta) + .filter(token => token !== undefined) + .map(token => ({ + name: token.token, + type: token.type, + default: tokenDefaults.components.get(componentName)?.get(token.token) + ?? tokenDefaults.global.get(token.token) + ?? '', + description: token.descEn, + descriptionZh: token.desc, + })) +} + +function parseFaq(markdown: string): ComponentFaqRecord[] { + const headings = parseHeadings(markdown) + const faqIndex = headings.findIndex(heading => + heading.level === 2 + && (heading.anchor === 'faq' || normalizeHeadingTitle(heading.title) === 'faq'), + ) + + if (faqIndex === -1) { + return [] + } + + const faqEndIndex = headings.findIndex((heading, index) => + index > faqIndex && heading.level <= 2, + ) + const scopedEndIndex = faqEndIndex === -1 ? headings.length : faqEndIndex + const faq: ComponentFaqRecord[] = [] + + for (let index = faqIndex + 1; index < scopedEndIndex; index += 1) { + const heading = headings[index]! + + if (heading.level !== 3) { + continue + } + + faq.push({ + question: heading.title, + answer: getHeadingContent(markdown, headings, index, 3), + }) + } + + return faq +} + +function findElementStart(source: string, tagName: string, fromIndex: number): number { + const marker = `<${tagName}` + let index = source.indexOf(marker, fromIndex) + + while (index !== -1) { + const boundary = source[index + marker.length] + + if (boundary === '>' || boundary === '/' || boundary === ' ' || boundary === '\t' || boundary === '\n' || boundary === '\r') { + return index + } + + index = source.indexOf(marker, index + marker.length) + } + + return -1 +} + +function extractElementBlocks(source: string, tagName: string): ElementBlock[] { + const blocks: ElementBlock[] = [] + let searchIndex = 0 + + while (searchIndex < source.length) { + const start = findElementStart(source, tagName, searchIndex) + + if (start === -1) { + break + } + + const openingEnd = source.indexOf('>', start) + + if (openingEnd === -1) { + break + } + + const openingTag = source.slice(start, openingEnd + 1) + + if (openingTag.trimEnd().endsWith('/>')) { + blocks.push({ + start, + openingTag, + content: '', + fullContent: openingTag, + }) + searchIndex = openingEnd + 1 + continue + } + + let depth = 1 + let cursor = openingEnd + 1 + let closingStart = -1 + let closingEnd = -1 + + while (depth > 0) { + const nextOpening = findElementStart(source, tagName, cursor) + const nextClosing = source.indexOf(`', nextOpening) + + if (nestedOpeningEnd === -1) { + break + } + + if (!source.slice(nextOpening, nestedOpeningEnd + 1).trimEnd().endsWith('/>')) { + depth += 1 + } + + cursor = nestedOpeningEnd + 1 + continue + } + + closingStart = nextClosing + closingEnd = source.indexOf('>', closingStart) + + if (closingEnd === -1) { + break + } + + depth -= 1 + cursor = closingEnd + 1 + } + + if (depth !== 0 || closingStart === -1 || closingEnd === -1) { + searchIndex = openingEnd + 1 + continue + } + + blocks.push({ + start, + openingTag, + content: source.slice(openingEnd + 1, closingStart), + fullContent: source.slice(start, closingEnd + 1), + }) + searchIndex = closingEnd + 1 + } + + return blocks +} + +function getElementAttribute(openingTag: string, attributeName: string): string { + const lowerOpeningTag = openingTag.toLowerCase() + const lowerAttributeName = attributeName.toLowerCase() + let index = lowerOpeningTag.indexOf(lowerAttributeName) + + while (index !== -1) { + const previousCharacter = lowerOpeningTag[index - 1] + let cursor = index + lowerAttributeName.length + + if (index > 0 && previousCharacter !== ' ' && previousCharacter !== '\t' && previousCharacter !== '\n' && previousCharacter !== '\r') { + index = lowerOpeningTag.indexOf(lowerAttributeName, cursor) + continue + } + + while (/\s/.test(openingTag[cursor] ?? '')) { + cursor += 1 + } + + if (openingTag[cursor] !== '=') { + index = lowerOpeningTag.indexOf(lowerAttributeName, cursor) + continue + } + + cursor += 1 + + while (/\s/.test(openingTag[cursor] ?? '')) { + cursor += 1 + } + + const quote = openingTag[cursor] + + if (quote !== '"' && quote !== '\'') { + return '' + } + + const valueEnd = openingTag.indexOf(quote, cursor + 1) + return valueEnd === -1 ? '' : openingTag.slice(cursor + 1, valueEnd) + } + + return '' +} + +function parseDemoReferences(markdown: string): DemoReference[] { + return extractElementBlocks(markdown, 'demo') + .map(block => ({ + src: getElementAttribute(block.openingTag, 'src'), + title: block.content.trim(), + })) + .filter(reference => reference.src !== '') +} + +function getDemoDescription(source: string, language: string): string { + const docs = extractElementBlocks(source, 'docs') + .find(block => getElementAttribute(block.openingTag, 'lang') === language) + + return docs?.content.trim() ?? '' +} + +function getDemoCode(source: string): string { + return [ + ...extractElementBlocks(source, 'script'), + ...extractElementBlocks(source, 'template'), + ] + .sort((left, right) => left.start - right.start) + .map(block => block.fullContent.trim()) + .join('\n\n') +} + +async function readDemos( + componentDirectory: string, + enMarkdown: string, + zhMarkdown: string, +): Promise { + const enReferences = parseDemoReferences(enMarkdown) + const zhReferences = parseDemoReferences(zhMarkdown) + const enBySrc = new Map(enReferences.map(reference => [reference.src, reference])) + const zhBySrc = new Map(zhReferences.map(reference => [reference.src, reference])) + const sources = [...new Set([...enBySrc.keys(), ...zhBySrc.keys()])] + + return Promise.all(sources.map(async (src) => { + const demoFile = path.resolve(componentDirectory, src) + const relativeDemoFile = path.relative(componentDirectory, demoFile) + + if (relativeDemoFile.startsWith('..') || path.isAbsolute(relativeDemoFile)) { + throw new Error(`Demo source is outside component directory: ${src}`) + } + + const source = await fs.readFile(demoFile, 'utf8') + + return { + name: path.basename(src, path.extname(src)), + title: enBySrc.get(src)?.title ?? '', + titleZh: zhBySrc.get(src)?.title ?? '', + description: getDemoDescription(source, 'en-US'), + descriptionZh: getDemoDescription(source, 'zh-CN'), + code: getDemoCode(source), + } + })) +} + function getFrontmatterField( frontmatter: Record, field: string, @@ -685,7 +1167,11 @@ function getFrontmatterField( return frontmatter[field] ?? (fallbackField ? frontmatter[fallbackField] : undefined) ?? '' } -async function readComponent(componentDirectory: string): Promise { +async function readComponent( + componentDirectory: string, + tokenMeta: TokenMetaFile, + tokenDefaults: TokenDefaultIndex, +): Promise { const directory = path.join(COMPONENTS_DIRECTORY, componentDirectory) const enFile = path.join(directory, 'index.en-US.md') const zhFile = path.join(directory, 'index.zh-CN.md') @@ -707,9 +1193,11 @@ async function readComponent(componentDirectory: string): Promise { }) } -async function readComponentsForVersion(version: string): Promise { +async function prepareSourceVersion(version: string): Promise { await checkoutSourceVersion(version) + await x('pnpm', ['install'], { + throwOnError: true, + nodeOptions: { + cwd: SOURCE_DIRECTORY, + stdio: 'pipe', + }, + }) + + await x('pnpm', ['--filter', PACKAGE_NAME, 'build:token'], { + throwOnError: true, + nodeOptions: { + cwd: SOURCE_DIRECTORY, + stdio: 'pipe', + }, + }) +} + +async function readComponentsForVersion(version: string): Promise { + await prepareSourceVersion(version) + + const { tokenMeta, tokenDefaults } = await readTokenData() const directoryEntries = await fs.readdir(COMPONENTS_DIRECTORY, { withFileTypes: true }) const componentDirectories = directoryEntries .filter(entry => entry.isDirectory()) .map(entry => entry.name) .sort((left, right) => left.localeCompare(right)) - const components = await Promise.all(componentDirectories.map(readComponent)) + const components = await Promise.all(componentDirectories.map(componentDirectory => + readComponent(componentDirectory, tokenMeta, tokenDefaults), + )) return components.filter(component => component !== undefined) } From a6d920a8e7cdd7f9edcff66b2fb9e20e06c2fd1c Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Mon, 17 Aug 2026 21:06:55 +0800 Subject: [PATCH 084/106] refactor(sync): update token file handling and demo processing logic - Add TokenFiles interface for managing token metadata and token files - Replace hardcoded token file paths with dynamic TOKEN_DIRECTORIES array - Modify parseTokenMetaFile to accept filename parameter for better error reporting - Update readTokenData to accept TokenFiles parameter instead of using constants - Change demo processing to handle missing files gracefully by returning undefined - Add filtering to remove undefined demo records from results - Implement token file resolution logic to find most recently modified files - Add build step for ESM version during source preparation - Return token file paths from prepareSourceVersion for use in readTokenData --- scripts/sync.ts | 118 ++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 105 insertions(+), 13 deletions(-) diff --git a/scripts/sync.ts b/scripts/sync.ts index 3139fe3..ddea0ee 100644 --- a/scripts/sync.ts +++ b/scripts/sync.ts @@ -100,6 +100,11 @@ interface TokenDefaultIndex { components: Map> } +interface TokenFiles { + tokenMeta: string + token: string +} + interface DemoReference { src: string title: string @@ -161,8 +166,10 @@ const TAG_PREFIX = `${PACKAGE_NAME}@` const OUTPUT_DIRECTORY = fileURLToPath(new URL('../data', import.meta.url)) const SOURCE_DIRECTORY = fileURLToPath(new URL('../antdv-source', import.meta.url)) const COMPONENTS_DIRECTORY = path.join(SOURCE_DIRECTORY, 'docs/src/pages/components') -const TOKEN_META_FILE = path.join(SOURCE_DIRECTORY, 'docs/src/assets/token-meta.json') -const TOKEN_FILE = path.join(SOURCE_DIRECTORY, 'docs/src/assets/token.json') +const TOKEN_DIRECTORIES = [ + path.join(SOURCE_DIRECTORY, 'docs/src/assets'), + path.join(SOURCE_DIRECTORY, 'playground/src/assets'), +] const CHANGELOG_FILE = path.join(OUTPUT_DIRECTORY, 'changelog.json') const REMOTE_TAG_PATTERN = /^[0-9a-f]+\s+refs\/tags\/(.+)$/i const MINOR_FILE_PATTERN = /^v(\d+)\.(\d+)\.(\d+)\.json$/ @@ -731,9 +738,9 @@ function isRecord(value: unknown): value is Record { return Boolean(value) && typeof value === 'object' && !Array.isArray(value) } -function parseTokenMetaFile(value: unknown): TokenMetaFile { +function parseTokenMetaFile(value: unknown, filename: string): TokenMetaFile { if (!isRecord(value) || !isRecord(value.components)) { - throw new TypeError(`Invalid token metadata in ${TOKEN_META_FILE}`) + throw new TypeError(`Invalid token metadata in ${filename}`) } return { @@ -879,15 +886,15 @@ async function readJsonFile(filename: string): Promise { } } -async function readTokenData(): Promise<{ +async function readTokenData(tokenFiles: TokenFiles): Promise<{ tokenMeta: TokenMetaFile tokenDefaults: TokenDefaultIndex }> { const [rawTokenMeta, tokenData] = await Promise.all([ - readJsonFile(TOKEN_META_FILE), - readJsonFile(TOKEN_FILE), + readJsonFile(tokenFiles.tokenMeta), + readJsonFile(tokenFiles.token), ]) - const tokenMeta = parseTokenMetaFile(rawTokenMeta) + const tokenMeta = parseTokenMetaFile(rawTokenMeta, tokenFiles.tokenMeta) return { tokenMeta, @@ -1138,7 +1145,7 @@ async function readDemos( const zhBySrc = new Map(zhReferences.map(reference => [reference.src, reference])) const sources = [...new Set([...enBySrc.keys(), ...zhBySrc.keys()])] - return Promise.all(sources.map(async (src) => { + const demos = await Promise.all(sources.map(async (src): Promise => { const demoFile = path.resolve(componentDirectory, src) const relativeDemoFile = path.relative(componentDirectory, demoFile) @@ -1146,7 +1153,18 @@ async function readDemos( throw new Error(`Demo source is outside component directory: ${src}`) } - const source = await fs.readFile(demoFile, 'utf8') + let source: string + + try { + source = await fs.readFile(demoFile, 'utf8') + } + catch (error) { + if ((error as NodeJS.ErrnoException).code === 'ENOENT') { + return undefined + } + + throw error + } return { name: path.basename(src, path.extname(src)), @@ -1157,6 +1175,8 @@ async function readDemos( code: getDemoCode(source), } })) + + return demos.filter(demo => demo !== undefined) } function getFrontmatterField( @@ -1237,8 +1257,65 @@ async function checkoutSourceVersion(version: string): Promise { }) } -async function prepareSourceVersion(version: string): Promise { +function getTokenFileCandidates(filename: string): string[] { + return TOKEN_DIRECTORIES.map(directory => path.join(directory, filename)) +} + +async function getFileModificationTime(filename: string): Promise { + try { + return (await fs.stat(filename)).mtimeMs + } + catch (error) { + if ((error as NodeJS.ErrnoException).code === 'ENOENT') { + return undefined + } + + throw error + } +} + +async function getTokenFileModificationTimes(): Promise> { + const candidates = [ + ...getTokenFileCandidates('token-meta.json'), + ...getTokenFileCandidates('token.json'), + ] + const modificationTimes = await Promise.all(candidates.map(getFileModificationTime)) + const result = new Map() + + for (const [index, filename] of candidates.entries()) { + result.set(filename, modificationTimes[index]) + } + + return result +} + +async function resolveGeneratedTokenFile( + filename: string, + previousModificationTimes: Map, +): Promise { + const candidates = getTokenFileCandidates(filename) + const currentFiles = (await Promise.all(candidates.map(async candidate => ({ + filename: candidate, + modificationTime: await getFileModificationTime(candidate), + })))) + .filter(file => file.modificationTime !== undefined) + .sort((left, right) => right.modificationTime! - left.modificationTime!) + const generatedFile = currentFiles.find(file => + file.modificationTime !== previousModificationTimes.get(file.filename), + ) + + if (generatedFile) { + return generatedFile.filename + } + + throw new Error( + `Token build did not update ${filename} in: ${TOKEN_DIRECTORIES.join(', ')}`, + ) +} + +async function prepareSourceVersion(version: string): Promise { await checkoutSourceVersion(version) + const previousModificationTimes = await getTokenFileModificationTimes() await x('pnpm', ['install'], { throwOnError: true, @@ -1248,6 +1325,14 @@ async function prepareSourceVersion(version: string): Promise { }, }) + await x('pnpm', ['--filter', PACKAGE_NAME, 'build:esm'], { + throwOnError: true, + nodeOptions: { + cwd: SOURCE_DIRECTORY, + stdio: 'pipe', + }, + }) + await x('pnpm', ['--filter', PACKAGE_NAME, 'build:token'], { throwOnError: true, nodeOptions: { @@ -1255,12 +1340,19 @@ async function prepareSourceVersion(version: string): Promise { stdio: 'pipe', }, }) + + const [tokenMeta, token] = await Promise.all([ + resolveGeneratedTokenFile('token-meta.json', previousModificationTimes), + resolveGeneratedTokenFile('token.json', previousModificationTimes), + ]) + + return { tokenMeta, token } } async function readComponentsForVersion(version: string): Promise { - await prepareSourceVersion(version) + const tokenFiles = await prepareSourceVersion(version) - const { tokenMeta, tokenDefaults } = await readTokenData() + const { tokenMeta, tokenDefaults } = await readTokenData(tokenFiles) const directoryEntries = await fs.readdir(COMPONENTS_DIRECTORY, { withFileTypes: true }) const componentDirectories = directoryEntries .filter(entry => entry.isDirectory()) From 314f47de43f6c9261082ee6379419170cb29a656 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Mon, 17 Aug 2026 21:52:43 +0800 Subject: [PATCH 085/106] refactor(sync): update token handling and data structures - Remove unused TokenData import and fetchTokens dependency - Change ChangelogFile.globalTokens type from TokenData[] | unknown[] to ComponentPropRecord[] - Add TokenMetaFile.global property for global token records - Introduce VersionSourceData interface with globalTokens and components - Rename componentCache to sourceDataCache and update its type - Add getGlobalTokens function to extract global token information - Rename readComponentsForVersion to readSourceDataForVersion - Update loadComponents to loadSourceData with proper data structure - Extract globalTokens from source data instead of fetching separately --- scripts/sync.ts | 55 ++++++++++++++++++++++++++++++++++--------------- 1 file changed, 38 insertions(+), 17 deletions(-) diff --git a/scripts/sync.ts b/scripts/sync.ts index ddea0ee..1df6eef 100644 --- a/scripts/sync.ts +++ b/scripts/sync.ts @@ -1,6 +1,5 @@ // @env node -import type { TokenData } from './tokens' import fs from 'node:fs/promises' import path from 'node:path' import { fileURLToPath } from 'node:url' @@ -8,7 +7,6 @@ import dayjs from 'dayjs' import utc from 'dayjs/plugin/utc.js' import { parse } from 'semver' import { x } from 'tinyexec' -import { fetchTokens, loaderVersionToken } from './tokens' dayjs.extend(utc) @@ -33,7 +31,7 @@ interface ChangelogRecord extends VersionRecord { } interface ChangelogFile extends VersionRecord { - globalTokens: TokenData[] | unknown[] + globalTokens: ComponentPropRecord[] components: ComponentRecord[] changelog: ChangelogRecord[] } @@ -92,6 +90,7 @@ interface ComponentTokenMeta { } interface TokenMetaFile { + global: Record components: Record } @@ -105,6 +104,11 @@ interface TokenFiles { token: string } +interface VersionSourceData { + globalTokens: ComponentPropRecord[] + components: ComponentRecord[] +} + interface DemoReference { src: string title: string @@ -174,7 +178,7 @@ const CHANGELOG_FILE = path.join(OUTPUT_DIRECTORY, 'changelog.json') const REMOTE_TAG_PATTERN = /^[0-9a-f]+\s+refs\/tags\/(.+)$/i const MINOR_FILE_PATTERN = /^v(\d+)\.(\d+)\.(\d+)\.json$/ -const componentCache = new Map>() +const sourceDataCache = new Map>() function parseFrontmatterValue(rawValue: string): string { const value = rawValue.trim() @@ -744,6 +748,7 @@ function parseTokenMetaFile(value: unknown, filename: string): TokenMetaFile { } return { + global: isRecord(value.global) ? value.global : {}, components: value.components, } } @@ -930,6 +935,21 @@ function getComponentTokens( })) } +function getGlobalTokens( + tokenMeta: TokenMetaFile, + tokenDefaults: TokenDefaultIndex, +): ComponentPropRecord[] { + return Object.entries(tokenMeta.global) + .filter((entry): entry is [string, Record] => isRecord(entry[1])) + .map(([name, metadata]) => ({ + name, + type: typeof metadata.type === 'string' ? metadata.type : '', + default: tokenDefaults.global.get(name) ?? '', + description: typeof metadata.descEn === 'string' ? metadata.descEn : '', + descriptionZh: typeof metadata.desc === 'string' ? metadata.desc : '', + })) +} + function parseFaq(markdown: string): ComponentFaqRecord[] { const headings = parseHeadings(markdown) const faqIndex = headings.findIndex(heading => @@ -1349,7 +1369,7 @@ async function prepareSourceVersion(version: string): Promise { return { tokenMeta, token } } -async function readComponentsForVersion(version: string): Promise { +async function readSourceDataForVersion(version: string): Promise { const tokenFiles = await prepareSourceVersion(version) const { tokenMeta, tokenDefaults } = await readTokenData(tokenFiles) @@ -1362,19 +1382,22 @@ async function readComponentsForVersion(version: string): Promise component !== undefined) + return { + globalTokens: getGlobalTokens(tokenMeta, tokenDefaults), + components: components.filter(component => component !== undefined), + } } -function loadComponents(version: string): Promise { - const cachedComponents = componentCache.get(version) +function loadSourceData(version: string): Promise { + const cachedSourceData = sourceDataCache.get(version) - if (cachedComponents) { - return cachedComponents + if (cachedSourceData) { + return cachedSourceData } - const components = readComponentsForVersion(version) - componentCache.set(version, components) - return components + const sourceData = readSourceDataForVersion(version) + sourceDataCache.set(version, sourceData) + return sourceData } async function fetchTags(majorVersion: number): Promise { @@ -1627,14 +1650,12 @@ async function createChangelogFile( const highestTag = getHighestBaseVersion(tags) const version = getBaseVersion(highestTag) - const components = await loadComponents(version) - await fetchTokens(version) - const tokens = await loaderVersionToken(version) + const { components, globalTokens } = await loadSourceData(version) return { version, majorVersion: `v${highestTag.major}`, - globalTokens: tokens, + globalTokens, components, changelog: tags .map(tag => createChangelogRecord(tag, publishTimes, changesByVersion)), From cc1c868b5a48c5ad33be12a000ebeb6f5bd7599c Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Mon, 17 Aug 2026 22:04:35 +0800 Subject: [PATCH 086/106] feat(sync): add comprehensive logging and improve sync workflow - Add logStep, logSection, and formatDuration utility functions - Implement scoped logging for component processing steps - Add detailed logging for git operations and version checkout - Include timing information for synchronization duration - Add error handling with failure section logging - Log package installation and build processes - Track token file resolution and parsing - Add cleanup logging for stale files removal - Implement validation and version index --- scripts/sync.ts | 241 ++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 215 insertions(+), 26 deletions(-) diff --git a/scripts/sync.ts b/scripts/sync.ts index 1df6eef..6eafdc1 100644 --- a/scripts/sync.ts +++ b/scripts/sync.ts @@ -180,6 +180,18 @@ const MINOR_FILE_PATTERN = /^v(\d+)\.(\d+)\.(\d+)\.json$/ const sourceDataCache = new Map>() +function logStep(scope: string, message: string): void { + console.log(`[${scope}] ${message}`) +} + +function logSection(title: string): void { + console.log(`\n=== ${title} ===\n`) +} + +function formatDuration(startedAt: number): string { + return `${((Date.now() - startedAt) / 1000).toFixed(1)}s` +} + function parseFrontmatterValue(rawValue: string): string { const value = rawValue.trim() @@ -1159,6 +1171,7 @@ async function readDemos( enMarkdown: string, zhMarkdown: string, ): Promise { + const componentScope = `component:${path.basename(componentDirectory)}` const enReferences = parseDemoReferences(enMarkdown) const zhReferences = parseDemoReferences(zhMarkdown) const enBySrc = new Map(enReferences.map(reference => [reference.src, reference])) @@ -1180,6 +1193,7 @@ async function readDemos( } catch (error) { if ((error as NodeJS.ErrnoException).code === 'ENOENT') { + logStep(componentScope, `Skipping missing demo: ${src}`) return undefined } @@ -1212,12 +1226,15 @@ async function readComponent( tokenMeta: TokenMetaFile, tokenDefaults: TokenDefaultIndex, ): Promise { + const componentScope = `component:${componentDirectory}` const directory = path.join(COMPONENTS_DIRECTORY, componentDirectory) const enFile = path.join(directory, 'index.en-US.md') const zhFile = path.join(directory, 'index.zh-CN.md') let enMarkdown: string let zhMarkdown: string + logStep(componentScope, 'Reading bilingual documentation') + try { [enMarkdown, zhMarkdown] = await Promise.all([ fs.readFile(enFile, 'utf8'), @@ -1226,6 +1243,7 @@ async function readComponent( } catch (error) { if ((error as NodeJS.ErrnoException).code === 'ENOENT') { + logStep(componentScope, 'Skipping component because bilingual documentation is missing') return undefined } throw error @@ -1235,8 +1253,7 @@ async function readComponent( const zh = parseComponentDocument(zhMarkdown) const name = getFrontmatterField(en.frontmatter, 'name', 'title') const demos = await readDemos(directory, enMarkdown, zhMarkdown) - - return { + const component = { name, nameZh: getFrontmatterField(zh.frontmatter, 'name', 'title'), category: getFrontmatterField(en.frontmatter, 'category'), @@ -1253,9 +1270,64 @@ async function readComponent( faq: parseFaq(enMarkdown), demos, } + + logStep( + componentScope, + `Parsed ${component.props.length} props, ${component.tokens.length} tokens, ${component.faq.length} FAQs and ${component.demos.length} demos`, + ) + + return component +} + +async function getCurrentSourceReference(): Promise { + const commandOptions = { + nodeOptions: { + stdio: 'pipe' as const, + }, + } + const branch = await x('git', [ + '-C', + SOURCE_DIRECTORY, + 'symbolic-ref', + '--short', + '--quiet', + 'HEAD', + ], commandOptions) + + if (branch.exitCode === 0 && branch.stdout.trim()) { + return branch.stdout.trim() + } + + const tag = await x('git', [ + '-C', + SOURCE_DIRECTORY, + 'describe', + '--tags', + '--exact-match', + 'HEAD', + ], commandOptions) + + if (tag.exitCode === 0 && tag.stdout.trim()) { + return tag.stdout.trim() + } + + const commit = await x('git', [ + '-C', + SOURCE_DIRECTORY, + 'rev-parse', + '--short', + 'HEAD', + ], { + ...commandOptions, + throwOnError: true, + }) + + return commit.stdout.trim() } async function checkoutSourceVersion(version: string): Promise { + const scope = `source:${version}` + try { await fs.access(SOURCE_DIRECTORY) } @@ -1263,18 +1335,25 @@ async function checkoutSourceVersion(version: string): Promise { throw new Error(`Missing source repository: ${SOURCE_DIRECTORY}`) } + const currentReference = await getCurrentSourceReference() + const targetReference = `${TAG_PREFIX}${version}` + + logStep(scope, `git checkout ${currentReference} -> ${targetReference}`) + await x('git', [ '-C', SOURCE_DIRECTORY, 'checkout', '--quiet', - `${TAG_PREFIX}${version}`, + targetReference, ], { throwOnError: true, nodeOptions: { stdio: 'pipe', }, }) + + logStep(scope, 'Git checkout completed') } function getTokenFileCandidates(filename: string): string[] { @@ -1334,9 +1413,14 @@ async function resolveGeneratedTokenFile( } async function prepareSourceVersion(version: string): Promise { + const scope = `source:${version}` + await checkoutSourceVersion(version) + + logStep(scope, 'Recording token file modification times') const previousModificationTimes = await getTokenFileModificationTimes() + logStep(scope, 'Running pnpm install') await x('pnpm', ['install'], { throwOnError: true, nodeOptions: { @@ -1344,7 +1428,9 @@ async function prepareSourceVersion(version: string): Promise { stdio: 'pipe', }, }) + logStep(scope, 'Completed pnpm install') + logStep(scope, `Running pnpm --filter ${PACKAGE_NAME} build:esm`) await x('pnpm', ['--filter', PACKAGE_NAME, 'build:esm'], { throwOnError: true, nodeOptions: { @@ -1352,7 +1438,9 @@ async function prepareSourceVersion(version: string): Promise { stdio: 'pipe', }, }) + logStep(scope, 'Completed ESM build') + logStep(scope, `Running pnpm --filter ${PACKAGE_NAME} build:token`) await x('pnpm', ['--filter', PACKAGE_NAME, 'build:token'], { throwOnError: true, nodeOptions: { @@ -1360,31 +1448,49 @@ async function prepareSourceVersion(version: string): Promise { stdio: 'pipe', }, }) + logStep(scope, 'Completed token build') + logStep(scope, 'Resolving generated token files') const [tokenMeta, token] = await Promise.all([ resolveGeneratedTokenFile('token-meta.json', previousModificationTimes), resolveGeneratedTokenFile('token.json', previousModificationTimes), ]) + logStep(scope, `Resolved token metadata: ${path.relative(SOURCE_DIRECTORY, tokenMeta)}`) + logStep(scope, `Resolved token defaults: ${path.relative(SOURCE_DIRECTORY, token)}`) + return { tokenMeta, token } } async function readSourceDataForVersion(version: string): Promise { + const scope = `source:${version}` const tokenFiles = await prepareSourceVersion(version) + logStep(scope, 'Reading token metadata and defaults') const { tokenMeta, tokenDefaults } = await readTokenData(tokenFiles) + + logStep(scope, `Scanning component directories in ${COMPONENTS_DIRECTORY}`) const directoryEntries = await fs.readdir(COMPONENTS_DIRECTORY, { withFileTypes: true }) const componentDirectories = directoryEntries .filter(entry => entry.isDirectory()) .map(entry => entry.name) .sort((left, right) => left.localeCompare(right)) + + logStep(scope, `Found ${componentDirectories.length} component directories`) const components = await Promise.all(componentDirectories.map(componentDirectory => readComponent(componentDirectory, tokenMeta, tokenDefaults), )) + const globalTokens = getGlobalTokens(tokenMeta, tokenDefaults) + const parsedComponents = components.filter(component => component !== undefined) + + logStep( + scope, + `Parsed ${parsedComponents.length} components and ${globalTokens.length} global tokens`, + ) return { - globalTokens: getGlobalTokens(tokenMeta, tokenDefaults), - components: components.filter(component => component !== undefined), + globalTokens, + components: parsedComponents, } } @@ -1392,16 +1498,21 @@ function loadSourceData(version: string): Promise { const cachedSourceData = sourceDataCache.get(version) if (cachedSourceData) { + logStep(`source:${version}`, 'Reusing cached source data') return cachedSourceData } + logSection(`Source version: v${version}`) const sourceData = readSourceDataForVersion(version) sourceDataCache.set(version, sourceData) return sourceData } async function fetchTags(majorVersion: number): Promise { + const scope = `remote:v${majorVersion}` const tagPattern = `refs/tags/${TAG_PREFIX}${majorVersion}.*` + + logStep(scope, 'Fetching remote repository versions') const { stdout } = await x('git', [ 'ls-remote', '--tags', @@ -1417,10 +1528,14 @@ async function fetchTags(majorVersion: number): Promise { }) const lines = stdout.split(/\r?\n/).filter(Boolean) - return lines.map(line => parseRemoteTag(line, majorVersion)) + const tags = lines.map(line => parseRemoteTag(line, majorVersion)) + + logStep(scope, `Found ${tags.length} tags`) + return tags } async function fetchPublishTimes(): Promise> { + logStep('npm', `Fetching publish times for ${PACKAGE_NAME}`) const { stdout } = await x('npm', [ 'view', PACKAGE_NAME, @@ -1467,6 +1582,7 @@ async function fetchPublishTimes(): Promise> { throw new Error(`No npm publish times found for ${PACKAGE_NAME}`) } + logStep('npm', `Found publish times for ${publishTimes.size} versions`) return publishTimes } @@ -1483,6 +1599,7 @@ function isSourceChangelogChange(value: unknown): value is SourceChangelogChange } async function readChangesByVersion(): Promise> { + logStep('changelog', `Reading existing changes from ${CHANGELOG_FILE}`) const source = await fs.readFile(CHANGELOG_FILE, 'utf8') let data: unknown @@ -1525,6 +1642,7 @@ async function readChangesByVersion(): Promise> { }))) } + logStep('changelog', `Loaded changes for ${changesByVersion.size} versions`) return changesByVersion } @@ -1646,19 +1764,27 @@ async function createChangelogFile( tags: ParsedTag[], publishTimes: Map, changesByVersion: Map, + outputScope: string, ): Promise { const highestTag = getHighestBaseVersion(tags) const version = getBaseVersion(highestTag) + logStep(outputScope, `Selected source version ${version} from ${tags.length} tags`) const { components, globalTokens } = await loadSourceData(version) + const changelog = tags + .map(tag => createChangelogRecord(tag, publishTimes, changesByVersion)) + + logStep( + outputScope, + `Prepared ${components.length} components, ${globalTokens.length} global tokens and ${changelog.length} changelog entries`, + ) return { version, majorVersion: `v${highestTag.major}`, globalTokens, components, - changelog: tags - .map(tag => createChangelogRecord(tag, publishTimes, changesByVersion)), + changelog, } } @@ -1687,20 +1813,36 @@ async function buildOutputFiles( const outputFiles = new Map() for (const [major, majorTags] of groupTagsByMajor(tags)) { + const outputLabel = `v${major}` + const outputScope = `output:${outputLabel}` + + logSection(`Output group: ${outputLabel}`) outputFiles.set( `v${major}.json`, - await createChangelogFile(majorTags, publishTimes, changesByVersion), + await createChangelogFile( + majorTags, + publishTimes, + changesByVersion, + outputScope, + ), ) + logStep(outputScope, `Prepared v${major}.json`) } for (const group of groupTagsByMinor(tags)) { + const outputLabel = `v${group.major}.${group.minor}.x` + const outputScope = `output:${outputLabel}` + + logSection(`Output group: ${outputLabel}`) const changelogFile = await createChangelogFile( group.tags, publishTimes, changesByVersion, + outputScope, ) const filename = `v${changelogFile.version}.json` outputFiles.set(filename, changelogFile) + logStep(outputScope, `Prepared ${filename}`) } return outputFiles @@ -1726,13 +1868,17 @@ async function writeJsonFile( data: ChangelogFile | VersionFile, ): Promise { const file = path.join(OUTPUT_DIRECTORY, filename) + + logStep(`write:${filename}`, `Writing ${file}`) await fs.writeFile(file, `${JSON.stringify(data, null, 2)}\n`, 'utf8') + logStep(`write:${filename}`, 'Completed') } async function removeStaleMinorFiles( expectedFiles: Set, syncedMajorVersions: Set, ): Promise { + logStep('cleanup', `Scanning ${OUTPUT_DIRECTORY} for stale minor-version files`) const filenames = await fs.readdir(OUTPUT_DIRECTORY) const staleFiles = filenames.filter((filename) => { const match = filename.match(MINOR_FILE_PATTERN) @@ -1743,40 +1889,83 @@ async function removeStaleMinorFiles( && !expectedFiles.has(filename) }) - await Promise.all(staleFiles.map(filename => - fs.unlink(path.join(OUTPUT_DIRECTORY, filename)), - )) + if (staleFiles.length === 0) { + logStep('cleanup', 'No stale minor-version files found') + return + } + + for (const filename of staleFiles) { + logStep('cleanup', `Removing ${filename}`) + await fs.unlink(path.join(OUTPUT_DIRECTORY, filename)) + } + + logStep('cleanup', `Removed ${staleFiles.length} stale minor-version files`) } async function main(): Promise { - const [tagGroups, publishTimes, changesByVersion] = await Promise.all([ - Promise.all(MAJOR_VERSIONS.map(fetchTags)), - fetchPublishTimes(), - readChangesByVersion(), - ]) + const startedAt = Date.now() + const tagGroups: ParsedTag[][] = [] + + logStep('sync', 'Starting synchronization') + logStep('sync', `Remote repository: ${REMOTE_URL}`) + logStep('sync', `Source directory: ${SOURCE_DIRECTORY}`) + logStep('sync', `Output directory: ${OUTPUT_DIRECTORY}`) + logStep('sync', `Configured major versions: ${MAJOR_VERSIONS.map(version => `v${version}`).join(', ')}`) + + for (const majorVersion of MAJOR_VERSIONS) { + logSection(`Remote tags: v${majorVersion}`) + tagGroups.push(await fetchTags(majorVersion)) + } + + logSection('npm publish times') + const publishTimes = await fetchPublishTimes() + + logSection('Existing changelog changes') + const changesByVersion = await readChangesByVersion() const tags = tagGroups.flat() if (tags.length === 0) { throw new Error(`No tags matched the configured major versions: ${MAJOR_VERSIONS.join(', ')}`) } + logSection('Validation') + logStep('sync', `Validating publish times for ${tags.length} tags`) assertPublishTimes(tags, publishTimes) + logStep('sync', 'All tags have npm publish times') + const outputFiles = await buildOutputFiles(tags, publishTimes, changesByVersion) + + logSection('Version index') + logStep('version', 'Creating version.json') const versionFile = createVersionFile(tags) const syncedMajorVersions = new Set(tags.map(tag => tag.major)) + logStep('version', `Prepared mappings for ${syncedMajorVersions.size} major versions`) + logSection('Writing output files') + logStep('write', `Ensuring output directory exists: ${OUTPUT_DIRECTORY}`) await fs.mkdir(OUTPUT_DIRECTORY, { recursive: true }) - await Promise.all([ - ...[...outputFiles].map(([filename, changelog]) => - writeJsonFile(filename, changelog), - ), - writeJsonFile('version.json', versionFile), - ]) + + for (const [filename, changelog] of outputFiles) { + await writeJsonFile(filename, changelog) + } + + await writeJsonFile('version.json', versionFile) + + logSection('Cleanup') await removeStaleMinorFiles(new Set(outputFiles.keys()), syncedMajorVersions) - console.log( - `Synced ${tags.length} tags across ${syncedMajorVersions.size} major versions to ${outputFiles.size} changelog files and version.json`, + logSection('Synchronization completed') + logStep( + 'sync', + `Synced ${tags.length} tags across ${syncedMajorVersions.size} major versions to ${outputFiles.size} changelog files and version.json in ${formatDuration(startedAt)}`, ) } -await main() +try { + await main() +} +catch (error) { + logSection('Synchronization failed') + logStep('sync', error instanceof Error ? error.message : String(error)) + throw error +} From 1b04b2d402254c18335f3c602576bd346690cd7d Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Mon, 17 Aug 2026 22:07:54 +0800 Subject: [PATCH 087/106] feat(changelog): add git checkout to main branch before reading changelog - Import tinyexec library to handle git commands - Execute git checkout main command in repository directory - Use throwOnError option to ensure proper error handling - Set cwd option to repository directory for correct execution context - Use pipe option for stdio to manage output streams properly --- scripts/changelog.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/scripts/changelog.ts b/scripts/changelog.ts index 8111380..7c2b461 100644 --- a/scripts/changelog.ts +++ b/scripts/changelog.ts @@ -4,6 +4,7 @@ import fs from 'node:fs/promises' import path from 'node:path' import process from 'node:process' import { fileURLToPath } from 'node:url' +import { x } from 'tinyexec' interface ChangelogItem { component: string @@ -214,6 +215,14 @@ function parseChangelog(markdown: string): ParsedChangelog { async function main(): Promise { const repositoryDirectory = path.join(process.cwd(), 'antdv-source') + await x('git', ['checkout', 'main'], { + throwOnError: true, + nodeOptions: { + cwd: repositoryDirectory, + stdio: 'pipe', + }, + }) + const markdown = await fs.readFile( path.join(repositoryDirectory, CHANGELOG_FILE), 'utf8', From e2bf2794b53b55202a928bca59c138b2cfbbbbd5 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Mon, 17 Aug 2026 23:12:47 +0800 Subject: [PATCH 088/106] refactor(sync): update VersionFile type definition and return value - Changed VersionFile type from tuple to direct Record type - Modified return statement to return versions object directly instead of array wrapper - Updated type definition for better clarity and usage consistency --- scripts/sync.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/sync.ts b/scripts/sync.ts index 6eafdc1..e8d588d 100644 --- a/scripts/sync.ts +++ b/scripts/sync.ts @@ -148,7 +148,7 @@ interface ParsedComponentDocument { props: ParsedApi } -type VersionFile = [Record>] +type VersionFile = Record> interface ParsedTag { record: VersionRecord @@ -1860,7 +1860,7 @@ function createVersionFile(tags: ParsedTag[]): VersionFile { versions[majorVersion] = minorVersions } - return [versions] + return versions } async function writeJsonFile( From 075f65f3d8c28d1a83bb270e95106998178fe6b6 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Mon, 17 Aug 2026 23:13:37 +0800 Subject: [PATCH 089/106] fix(build): update version file name from version.json to versions.json - Changed log message from 'Creating version.json' to 'Creating versions.json' - Updated writeJsonFile call to use 'versions.json' instead of 'version.json' - Modified sync completion message to reference 'versions.json' instead of 'version.json' --- scripts/sync.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/sync.ts b/scripts/sync.ts index e8d588d..f4b4843 100644 --- a/scripts/sync.ts +++ b/scripts/sync.ts @@ -1936,7 +1936,7 @@ async function main(): Promise { const outputFiles = await buildOutputFiles(tags, publishTimes, changesByVersion) logSection('Version index') - logStep('version', 'Creating version.json') + logStep('version', 'Creating versions.json') const versionFile = createVersionFile(tags) const syncedMajorVersions = new Set(tags.map(tag => tag.major)) logStep('version', `Prepared mappings for ${syncedMajorVersions.size} major versions`) @@ -1949,7 +1949,7 @@ async function main(): Promise { await writeJsonFile(filename, changelog) } - await writeJsonFile('version.json', versionFile) + await writeJsonFile('versions.json', versionFile) logSection('Cleanup') await removeStaleMinorFiles(new Set(outputFiles.keys()), syncedMajorVersions) @@ -1957,7 +1957,7 @@ async function main(): Promise { logSection('Synchronization completed') logStep( 'sync', - `Synced ${tags.length} tags across ${syncedMajorVersions.size} major versions to ${outputFiles.size} changelog files and version.json in ${formatDuration(startedAt)}`, + `Synced ${tags.length} tags across ${syncedMajorVersions.size} major versions to ${outputFiles.size} changelog files and versions.json in ${formatDuration(startedAt)}`, ) } From d21357a4d11cc28ba64d96a803741a873964d802 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Mon, 17 Aug 2026 23:30:51 +0800 Subject: [PATCH 090/106] feat(token): add design token query command with component filtering - Add tokenArgs to handle component parameter for design token queries - Create ChangelogFile and related interfaces for component metadata - Implement resolveVersion utility with fallback to installed/package versions - Add capitalize utility function for component name matching - Load version metadata from JSON files using resolved version - Filter components by name and display their design tokens - Handle error cases when components are not found --- src/args/args.d.ts | 7 ++++- src/args/token.ts | 9 ++++++ src/commands/token.ts | 47 +++++++++++++++++++++++++++- src/types.ts | 5 +++ src/types/components.ts | 58 ++++++++++++++++++++++++++++++++++ src/utils/capitalize.ts | 4 +++ src/utils/version.ts | 69 +++++++++++++++++++++++++++++++++++++++++ 7 files changed, 197 insertions(+), 2 deletions(-) create mode 100644 src/args/token.ts create mode 100644 src/types/components.ts create mode 100644 src/utils/capitalize.ts create mode 100644 src/utils/version.ts diff --git a/src/args/args.d.ts b/src/args/args.d.ts index 36e56b2..cf34c32 100644 --- a/src/args/args.d.ts +++ b/src/args/args.d.ts @@ -1,5 +1,10 @@ import type { ParsedArgs } from 'citty' import type { bugArgs } from '@/args/bug.ts' import type { defaultArgs } from '@/args/default.ts' +import type { tokenArgs } from '@/args/token.ts' -export type OptionsArgs = ParsedArgs & Partial> +export type OptionsArgs = ParsedArgs + & Partial< + ParsedArgs + & ParsedArgs + > diff --git a/src/args/token.ts b/src/args/token.ts new file mode 100644 index 0000000..9d21b33 --- /dev/null +++ b/src/args/token.ts @@ -0,0 +1,9 @@ +import type { ArgsDef } from 'citty' + +export const tokenArgs = { + component: { + type: 'positional', + description: 'Query Design Tokens (global or component-level)', + default: '', + }, +} satisfies ArgsDef diff --git a/src/commands/token.ts b/src/commands/token.ts index c5d8a8e..56b5f6d 100644 --- a/src/commands/token.ts +++ b/src/commands/token.ts @@ -1,11 +1,56 @@ +import type { ChangelogFile } from '#/components.ts' +import type { ResolvedVersion } from '@/types.ts' +import { readFile } from 'node:fs/promises' +import { join } from 'node:path' +import process from 'node:process' import { defineCommand } from 'citty' +import { defaultArgs } from '@/args/default.ts' +import { tokenArgs } from '@/args/token.ts' +import { resolveConfig } from '@/config.ts' +import capitalize from '@/utils/capitalize.ts' +import { getDataPath } from '@/utils/loader.ts' +import { resolveVersion } from '@/utils/version.ts' + +async function loadVersionMetaData(version: ResolvedVersion): Promise { + const versionsPath = join(getDataPath(), 'versions.json') + const versionsIndex = JSON.parse(await readFile(versionsPath, 'utf-8')) + if (!Object.values(versionsIndex[version.majorVersion]).includes(version.version)) { + throw new Error(`v${version.version} not found`) + } + return JSON.parse(await readFile(join(getDataPath(), `v${version.version}.json`), 'utf-8')) as ChangelogFile +} export default defineCommand({ meta: { name: 'token', description: 'Query Design Tokens (global or component-level)', }, - run({ args }) { + args: { + ...defaultArgs, + ...tokenArgs, + }, + async run({ args }) { console.log('Parsed args:', args) + const config = resolveConfig(args) + try { + const version = await resolveVersion(config) + + console.log(version) + + const metaData = await loadVersionMetaData(version) + + const components = metaData.components.filter(c => c.name === capitalize(args.component)) + if (!components.length) { + console.log(`Error: Component ${args.component} not Found`) + process.exit(1) + } + + console.log(components.at(-1)?.tokens ?? []) + } + // eslint-disable-next-line unused-imports/no-unused-vars + catch (error) { + console.log(`Error: Component '${args.component}' not found`) + process.exit(1) + } }, }) diff --git a/src/types.ts b/src/types.ts index 3cf835f..5aa6b99 100644 --- a/src/types.ts +++ b/src/types.ts @@ -41,3 +41,8 @@ export interface AntdvIssueFields { extra: string env: ResolvedAntdvVersionEnv } + +export interface ResolvedVersion { + version: string + majorVersion: `v${number}` +} diff --git a/src/types/components.ts b/src/types/components.ts new file mode 100644 index 0000000..1c4540f --- /dev/null +++ b/src/types/components.ts @@ -0,0 +1,58 @@ +import type { ResolvedVersion } from '@/types.ts' + +export interface ChangelogFile extends ResolvedVersion { + globalTokens: ComponentPropRecord[] + components: ComponentRecord[] + changelog: ChangelogRecord[] +} + +interface ChangelogRecord extends ResolvedVersion { + date: string + changes: ChangelogChange[] +} + +interface ChangelogChange { + component: string + type: string + description: string +} + +export interface ComponentPropRecord { + name: string + type: string + default: string + description: string + descriptionZh: string +} + +export interface ComponentFaqRecord { + question: string + answer: string +} + +export interface ComponentDemoRecord { + name: string + title: string + titleZh: string + description: string + descriptionZh: string + code: string +} + +export interface ComponentRecord { + name: string + nameZh: string + category: string + categoryZh: string + description: string + descriptionZh: string + whenToUse: string + whenToUseZh: string + doc: string + docZh: string + subComponents: Record + props: ComponentPropRecord[] + tokens: ComponentPropRecord[] + faq: ComponentFaqRecord[] + demos: ComponentDemoRecord[] +} diff --git a/src/utils/capitalize.ts b/src/utils/capitalize.ts new file mode 100644 index 0000000..594393c --- /dev/null +++ b/src/utils/capitalize.ts @@ -0,0 +1,4 @@ +export default function capitalize(str: T): Capitalize { + const ret = str.charAt(0).toUpperCase() + str.slice(1) + return ret as Capitalize +} diff --git a/src/utils/version.ts b/src/utils/version.ts new file mode 100644 index 0000000..34662dd --- /dev/null +++ b/src/utils/version.ts @@ -0,0 +1,69 @@ +import type { ResolvedConfig, ResolvedVersion } from '@/types.ts' +import { readdir } from 'node:fs/promises' +import { getPackageInfo } from 'local-pkg' +import semver from 'semver' +import { getDataPath } from '@/utils/loader.ts' + +const VERSION_FILE_RE = /^v(.+)\.json$/ + +function parseVersion(version: string): ResolvedVersion { + const parsedVersion = semver.coerce(version.trim()) + + if (!parsedVersion) { + return { + version: '', + majorVersion: `v0`, + } + } + + return { + version: parsedVersion.version, + majorVersion: `v${parsedVersion.major}`, + } +} + +async function resolveInstalledVersion(cwd: string): Promise { + const packageInfo = await getPackageInfo('antdv-next', { + paths: [cwd], + }) + + return parseVersion(packageInfo?.version ?? '') +} + +export async function resolveFallBack(dataPath = getDataPath()): Promise { + const entries = await readdir(dataPath, { withFileTypes: true }) + const versions = entries + .filter(entry => entry.isFile()) + .map(entry => entry.name.match(VERSION_FILE_RE)?.[1]) + .filter((version): version is string => Boolean(version && semver.valid(version))) + .sort(semver.rcompare) + + const resolvedVersion = versions[0] && parseVersion(versions[0]) + + if (!resolvedVersion) { + throw new Error(`No valid antdv-next version files found in ${dataPath}`) + } + + return resolvedVersion +} + +export async function resolveVersion(config: ResolvedConfig): Promise { + const { version, cwd } = config + + if (version) { + const resolvedVersion = parseVersion(version) + + if (!resolvedVersion) { + throw new TypeError(`Invalid antdv-next version: ${version}`) + } + + return resolvedVersion + } + + const pkgVersion = await resolveInstalledVersion(cwd) + if (pkgVersion.version) { + return pkgVersion + } + + return await resolveFallBack() +} From aa9e4a4bb39ed3ffe258030d5ebe43a0ae91d685 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Mon, 17 Aug 2026 23:39:39 +0800 Subject: [PATCH 091/106] chore(token): add todo comment for format console display - Added TODO comment to indicate format console functionality needed - No functional changes to token command execution - Maintains existing token array output behavior --- src/commands/token.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/commands/token.ts b/src/commands/token.ts index 56b5f6d..5aaa8f9 100644 --- a/src/commands/token.ts +++ b/src/commands/token.ts @@ -45,6 +45,7 @@ export default defineCommand({ process.exit(1) } + // TODO show format console console.log(components.at(-1)?.tokens ?? []) } // eslint-disable-next-line unused-imports/no-unused-vars From a9a7892dc42e6948a36708d6c457278aead6f2b8 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Mon, 17 Aug 2026 23:40:08 +0800 Subject: [PATCH 092/106] chore(token): add component name logging for token output - Added console log to display component name before tokens output - Used capitalize function to format component name properly - Helps identify which component tokens are being displayed --- src/commands/token.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/commands/token.ts b/src/commands/token.ts index 5aaa8f9..1a4a090 100644 --- a/src/commands/token.ts +++ b/src/commands/token.ts @@ -46,6 +46,7 @@ export default defineCommand({ } // TODO show format console + console.log(`${capitalize(args.component)} Component Tokens:`) console.log(components.at(-1)?.tokens ?? []) } // eslint-disable-next-line unused-imports/no-unused-vars From 7fa62a7dfa8bce2c6f406e042c1372209f10455b Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Mon, 17 Aug 2026 23:41:57 +0800 Subject: [PATCH 093/106] fix(token): handle missing component argument and show global tokens - Add conditional check for component argument presence - Fix process.exit(1) placement to prevent duplicate execution - Display global tokens when no component is specified - Maintain existing component token lookup functionality - Preserve error handling for invalid component names --- src/commands/token.ts | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/commands/token.ts b/src/commands/token.ts index 1a4a090..acec7e0 100644 --- a/src/commands/token.ts +++ b/src/commands/token.ts @@ -39,15 +39,21 @@ export default defineCommand({ const metaData = await loadVersionMetaData(version) - const components = metaData.components.filter(c => c.name === capitalize(args.component)) - if (!components.length) { - console.log(`Error: Component ${args.component} not Found`) + if (args.component) { + const components = metaData.components.filter(c => c.name === capitalize(args.component)) + if (!components.length) { + console.log(`Error: Component ${args.component} not Found`) + process.exit(1) + } + + // TODO show format console + console.log(`${capitalize(args.component)} Component Tokens:`) + console.log(components.at(-1)?.tokens ?? []) process.exit(1) } // TODO show format console - console.log(`${capitalize(args.component)} Component Tokens:`) - console.log(components.at(-1)?.tokens ?? []) + console.log(metaData.globalTokens) } // eslint-disable-next-line unused-imports/no-unused-vars catch (error) { From bb2220bee6740705746958f57ce7f7de4216f2ee Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Mon, 17 Aug 2026 23:44:14 +0800 Subject: [PATCH 094/106] test(version): add comprehensive tests for version resolution utilities - Add unit tests for resolveVersion function with explicit version input - Test version normalization and validation scenarios - Mock local-pkg dependency for isolated testing - Verify package resolution from project path functionality - Add tests for resolveFallBack function with data file parsing - Test semantic version comparison and fallback logic - Include error handling test cases for invalid versions - Set up proper test environment with temporary data directory --- test/version.test.ts | 80 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 test/version.test.ts diff --git a/test/version.test.ts b/test/version.test.ts new file mode 100644 index 0000000..73f0609 --- /dev/null +++ b/test/version.test.ts @@ -0,0 +1,80 @@ +import { mkdir, rm, writeFile } from 'node:fs/promises' +import { join } from 'node:path' +import { getPackageInfo } from 'local-pkg' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import { resolveFallBack, resolveVersion } from '../src/utils/version' + +vi.mock('local-pkg', () => ({ + getPackageInfo: vi.fn(), +})) + +const dataPath = join(import.meta.dirname, '.version-test-data') +const mockedGetPackageInfo = vi.mocked(getPackageInfo) + +beforeEach(async () => { + mockedGetPackageInfo.mockReset() + await mkdir(dataPath, { recursive: true }) +}) + +afterEach(async () => { + await rm(dataPath, { force: true, recursive: true }) +}) + +describe('resolveVersion', () => { + it('resolves and normalizes an explicitly provided version', async () => { + await expect(resolveVersion(' v1.2.3-beta.1 ', '/project')).resolves.toEqual({ + version: '1.2.3-beta.1', + majorVersion: 'v1', + }) + expect(mockedGetPackageInfo).not.toHaveBeenCalled() + }) + + it('rejects an invalid explicitly provided version', async () => { + await expect(resolveVersion('latest', '/project')).rejects.toThrow( + 'Invalid antdv-next version: latest', + ) + }) + + it('resolves antdv-next from the provided project path', async () => { + mockedGetPackageInfo.mockResolvedValue({ + name: 'antdv-next', + version: '2.4.1', + rootPath: '/project/node_modules/antdv-next', + packageJsonPath: '/project/node_modules/antdv-next/package.json', + packageJson: {}, + }) + + await expect(resolveVersion(undefined, '/project')).resolves.toEqual({ + version: '2.4.1', + majorVersion: 'v2', + }) + expect(mockedGetPackageInfo).toHaveBeenCalledWith('antdv-next', { + paths: ['/project'], + }) + }) +}) + +describe('resolveFallBack', () => { + it('returns the greatest semantic version represented by a data file', async () => { + await Promise.all([ + writeFile(join(dataPath, 'v1.9.9.json'), '{}'), + writeFile(join(dataPath, 'v2.0.0-beta.1.json'), '{}'), + writeFile(join(dataPath, 'v2.0.0.json'), '{}'), + writeFile(join(dataPath, 'v2.json'), '{}'), + writeFile(join(dataPath, 'version.json'), '{}'), + ]) + + await expect(resolveFallBack(dataPath)).resolves.toEqual({ + version: '2.0.0', + majorVersion: 'v2', + }) + }) + + it('throws when the data directory has no valid version files', async () => { + await writeFile(join(dataPath, 'version.json'), '{}') + + await expect(resolveFallBack(dataPath)).rejects.toThrow( + `No valid antdv-next version files found in ${dataPath}`, + ) + }) +}) From 800ec3dd0765d0977e31ecd2384e689391e0fffd Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Mon, 17 Aug 2026 23:46:49 +0800 Subject: [PATCH 095/106] refactor(args): update import paths and type references for better modularity - Moved CommandArgs to OptionsArgs and updated import paths accordingly - Updated OutputFormat import to use default args module path - Renamed test descriptions to reflect new type naming conventions - Modified resolveVersion tests to use ResolvedConfig instead of separate parameters - Updated error handling tests to properly type and structure AggregateError expectations - Created helper function for creating ResolvedConfig objects in version tests --- test/args.test.ts | 9 +++++---- test/check.test.ts | 26 ++++++++++++++++++-------- test/version.test.ts | 25 ++++++++++++++++++------- 3 files changed, 41 insertions(+), 19 deletions(-) diff --git a/test/args.test.ts b/test/args.test.ts index 7f2b0de..9929398 100644 --- a/test/args.test.ts +++ b/test/args.test.ts @@ -1,8 +1,9 @@ -import type { CommandArgs, OutputFormat } from '../src/args' +import type { OptionsArgs } from '../src/args/args' +import type { OutputFormat } from '../src/args/default' import type { ResolvedConfig } from '../src/types' import { parseArgs } from 'citty' import { describe, expect, expectTypeOf, it } from 'vitest' -import { defaultArgs, OUTPUT_FORMATS } from '../src/args' +import { defaultArgs, OUTPUT_FORMATS } from '../src/args/default' describe('defaultArgs format', () => { it('accepts text, markdown, and json', () => { @@ -25,8 +26,8 @@ describe('defaultArgs format', () => { .toThrow(/Expected one of:.*text.*markdown.*json/) }) - it('preserves the format union in command and config declarations', () => { - expectTypeOf().toEqualTypeOf() + it('preserves the format union in parsed options and resolved config', () => { + expectTypeOf().toEqualTypeOf() expectTypeOf().toEqualTypeOf() }) }) diff --git a/test/check.test.ts b/test/check.test.ts index df43df0..c8eba90 100644 --- a/test/check.test.ts +++ b/test/check.test.ts @@ -57,7 +57,7 @@ describe('getLatestVersion', () => { expect(vi.getTimerCount()).toBe(0) }) - it('reports a clear aggregate error when every source fails', async () => { + it('preserves every source error when all registries fail', async () => { const fetchMock = vi.fn((input: string | URL | Request) => { const url = String(input) @@ -72,13 +72,17 @@ describe('getLatestVersion', () => { }) vi.stubGlobal('fetch', fetchMock) - const error = await getLatestVersion().catch(error => error) + const error: unknown = await getLatestVersion().catch(error => error) expect(error).toBeInstanceOf(AggregateError) expect(error).toMatchObject({ - message: 'Failed to get the latest @antdv-next/cli version from all registries', + message: 'All promises were rejected', + errors: [ + expect.objectContaining({ message: 'network unavailable' }), + expect.objectContaining({ message: `Request to ${URLS[1]} failed with status 503` }), + expect.objectContaining({ message: `Request to ${URLS[2]} returned an invalid version` }), + ], }) - expect(error.errors).toHaveLength(3) }) it('returns 0.0.0 and aborts the remaining requests when the package is not found', async () => { @@ -118,12 +122,18 @@ describe('getLatestVersion', () => { }) vi.stubGlobal('fetch', fetchMock) - const rejection = expect(getLatestVersion()).rejects.toThrow( - 'Failed to get the latest @antdv-next/cli version from all registries', - ) + const result = getLatestVersion().catch((error: unknown) => error) await vi.advanceTimersByTimeAsync(5_000) - await rejection + const error = await result + + expect(error).toBeInstanceOf(AggregateError) + expect(error).toMatchObject({ + message: 'All promises were rejected', + errors: URLS.map(url => expect.objectContaining({ + message: `Request to ${url} timed out after 5000ms`, + })), + }) expect(signals).toHaveLength(3) expect(signals.every(signal => signal.aborted)).toBe(true) expect(vi.getTimerCount()).toBe(0) diff --git a/test/version.test.ts b/test/version.test.ts index 73f0609..c724d8b 100644 --- a/test/version.test.ts +++ b/test/version.test.ts @@ -1,3 +1,4 @@ +import type { ResolvedConfig } from '../src/types' import { mkdir, rm, writeFile } from 'node:fs/promises' import { join } from 'node:path' import { getPackageInfo } from 'local-pkg' @@ -11,6 +12,14 @@ vi.mock('local-pkg', () => ({ const dataPath = join(import.meta.dirname, '.version-test-data') const mockedGetPackageInfo = vi.mocked(getPackageInfo) +function createConfig(version = '', cwd = '/project'): ResolvedConfig { + return { + cwd, + format: 'text', + version, + } +} + beforeEach(async () => { mockedGetPackageInfo.mockReset() await mkdir(dataPath, { recursive: true }) @@ -22,17 +31,19 @@ afterEach(async () => { describe('resolveVersion', () => { it('resolves and normalizes an explicitly provided version', async () => { - await expect(resolveVersion(' v1.2.3-beta.1 ', '/project')).resolves.toEqual({ - version: '1.2.3-beta.1', + await expect(resolveVersion(createConfig(' v1.2.3 '))).resolves.toEqual({ + version: '1.2.3', majorVersion: 'v1', }) expect(mockedGetPackageInfo).not.toHaveBeenCalled() }) - it('rejects an invalid explicitly provided version', async () => { - await expect(resolveVersion('latest', '/project')).rejects.toThrow( - 'Invalid antdv-next version: latest', - ) + it('returns an empty sentinel when an explicit version cannot be coerced', async () => { + await expect(resolveVersion(createConfig('latest'))).resolves.toEqual({ + version: '', + majorVersion: 'v0', + }) + expect(mockedGetPackageInfo).not.toHaveBeenCalled() }) it('resolves antdv-next from the provided project path', async () => { @@ -44,7 +55,7 @@ describe('resolveVersion', () => { packageJson: {}, }) - await expect(resolveVersion(undefined, '/project')).resolves.toEqual({ + await expect(resolveVersion(createConfig())).resolves.toEqual({ version: '2.4.1', majorVersion: 'v2', }) From 50bd2e68d60226cd5df51164f4c1071f0a037535 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Mon, 17 Aug 2026 23:47:24 +0800 Subject: [PATCH 096/106] chore(build): update gitignore with temporary build files - Add .tmp-npm-pack to ignored files - Add /antdv-source/ to ignored directories - Maintain .idea in ignored files list --- .gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index b3a4b98..cb4bf72 100644 --- a/.gitignore +++ b/.gitignore @@ -142,4 +142,6 @@ vite.config.js.timestamp-* vite.config.ts.timestamp-* .vite/ -.idea \ No newline at end of file +.idea +.tmp-npm-pack +/antdv-source/ From 03fabf1266b4981749644758cfbffb89e9d88bc5 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Tue, 18 Aug 2026 10:22:17 +0800 Subject: [PATCH 097/106] feat(token): add token command with table output support - Add console-table-printer dependency for formatted output - Implement token table rendering with Token, Type, and Default columns - Create markdown format output for tokens - Replace raw console.log with structured table display - Add global and component token display functionality - Support json, text, and markdown output formats - Integrate with existing output utility functions --- package.json | 1 + pnpm-lock.yaml | 15 +++++++++++ src/commands/token.ts | 56 +++++++++++++++++++++++++++++++++++------- src/constants/table.ts | 23 +++++++++++++++++ 4 files changed, 86 insertions(+), 9 deletions(-) create mode 100644 src/constants/table.ts diff --git a/package.json b/package.json index 3608c31..cf90c07 100644 --- a/package.json +++ b/package.json @@ -49,6 +49,7 @@ "@clack/prompts": "^1.7.0", "boxen": "^8.0.1", "citty": "^0.2.2", + "console-table-printer": "^2.16.1", "envinfo": "^7.21.0", "local-pkg": "^1.2.1", "pkg-types": "^2.3.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3019db1..bc72049 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,6 +17,9 @@ importers: citty: specifier: ^0.2.2 version: 0.2.2 + console-table-printer: + specifier: ^2.16.1 + version: 2.16.1 envinfo: specifier: ^7.21.0 version: 7.21.0 @@ -979,6 +982,9 @@ packages: confbox@0.2.4: resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==} + console-table-printer@2.16.1: + resolution: {integrity: sha512-Sc9FRJ4O9xKGNrvulNdPfK5SyBcZ6lcaRnDE4AQ/uw6IDtjHhsqyzzqcnMikjyGaiOOF2tNOKoBhbVjRvFy9Lw==} + convert-hrtime@5.0.0: resolution: {integrity: sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==} engines: {node: '>=12'} @@ -1933,6 +1939,9 @@ packages: resolution: {integrity: sha512-WszCLXwT4h2k1ufIXAgsbiTOazqqevFCIncOuUBZJ91DdvWcC5+OFkluWRQPrcuSYd8fjq+o2y1QfWqYMoAToQ==} hasBin: true + simple-wcswidth@1.1.2: + resolution: {integrity: sha512-j7piyCjAeTDSjzTSQ7DokZtMNwNlEAyxqSZeCS+CXH7fJ4jx3FuJ/mTW3mE+6JLs4VJBbcll0Kjn+KXI5t21Iw==} + sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} @@ -2990,6 +2999,10 @@ snapshots: confbox@0.2.4: {} + console-table-printer@2.16.1: + dependencies: + simple-wcswidth: 1.1.2 + convert-hrtime@5.0.0: {} convert-source-map@2.0.0: {} @@ -4121,6 +4134,8 @@ snapshots: simple-git-hooks@2.13.1: {} + simple-wcswidth@1.1.2: {} + sisteransi@1.0.5: {} source-map-js@1.2.1: {} diff --git a/src/commands/token.ts b/src/commands/token.ts index acec7e0..90ed451 100644 --- a/src/commands/token.ts +++ b/src/commands/token.ts @@ -1,14 +1,17 @@ -import type { ChangelogFile } from '#/components.ts' +import type { ChangelogFile, ComponentPropRecord } from '#/components.ts' import type { ResolvedVersion } from '@/types.ts' import { readFile } from 'node:fs/promises' import { join } from 'node:path' import process from 'node:process' import { defineCommand } from 'citty' +import { Table } from 'console-table-printer' import { defaultArgs } from '@/args/default.ts' import { tokenArgs } from '@/args/token.ts' import { resolveConfig } from '@/config.ts' +import { tableBorderStyle } from '@/constants/table.ts' import capitalize from '@/utils/capitalize.ts' import { getDataPath } from '@/utils/loader.ts' +import { output } from '@/utils/output.ts' import { resolveVersion } from '@/utils/version.ts' async function loadVersionMetaData(version: ResolvedVersion): Promise { @@ -20,6 +23,33 @@ async function loadVersionMetaData(version: ResolvedVersion): Promise { + p.addRow({ Token: token.name, Type: token.type, Default: token.default }) + }) + + return p.render() +} + +function outputTokenMarkdown(tokens: ComponentPropRecord[]): string { + let content = '\n| Token | Type | Default |\n' + content += '| --- | --- | --- |\n' + + tokens.forEach((token) => { + content += `| ${token.name} | ${token.type} | ${token.default} |\n` + }) + return content +} + export default defineCommand({ meta: { name: 'token', @@ -30,13 +60,10 @@ export default defineCommand({ ...tokenArgs, }, async run({ args }) { - console.log('Parsed args:', args) const config = resolveConfig(args) try { const version = await resolveVersion(config) - console.log(version) - const metaData = await loadVersionMetaData(version) if (args.component) { @@ -47,13 +74,24 @@ export default defineCommand({ } // TODO show format console - console.log(`${capitalize(args.component)} Component Tokens:`) - console.log(components.at(-1)?.tokens ?? []) - process.exit(1) + if (args.format !== 'json') { + console.log(`${capitalize(args.component)} Component Tokens:`) + } + const tokens = components.at(-1)?.tokens ?? [] + output({ + json: { token: tokens }, + text: outputTokenTable(tokens), + markdown: outputTokenMarkdown(tokens), + }, args.format) + + return '' } - // TODO show format console - console.log(metaData.globalTokens) + output({ + json: { token: metaData.globalTokens }, + text: outputTokenTable(metaData.globalTokens), + markdown: outputTokenMarkdown(metaData.globalTokens), + }, args.format) } // eslint-disable-next-line unused-imports/no-unused-vars catch (error) { diff --git a/src/constants/table.ts b/src/constants/table.ts new file mode 100644 index 0000000..9114002 --- /dev/null +++ b/src/constants/table.ts @@ -0,0 +1,23 @@ +import type { TableStyleDetails } from 'console-table-printer/dist/src/models/external-table' + +export const tableBorderStyle: TableStyleDetails = { + headerTop: { + left: '', + mid: '', + right: '', + other: '', + }, + headerBottom: { + left: '-', + mid: '-', + right: '-', + other: '-', + }, + tableBottom: { + left: '', + mid: '', + right: '', + other: '', + }, + vertical: '', +} From aaaa64f748cac7ef4753aa1c44c226428c355659 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Tue, 18 Aug 2026 10:22:42 +0800 Subject: [PATCH 098/106] chore(token): remove unused todo comment in token command - Removed unused todo comment about showing format console - Cleaned up code by removing commented out line - Maintained existing functionality for non-json format output --- src/commands/token.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/commands/token.ts b/src/commands/token.ts index 90ed451..a2535cb 100644 --- a/src/commands/token.ts +++ b/src/commands/token.ts @@ -73,7 +73,6 @@ export default defineCommand({ process.exit(1) } - // TODO show format console if (args.format !== 'json') { console.log(`${capitalize(args.component)} Component Tokens:`) } From bb2a7c394ebd5e3e97b0a29a4ce58ee21d7f169b Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Tue, 18 Aug 2026 10:32:48 +0800 Subject: [PATCH 099/106] feat(utils): move version metadata loading logic to dedicated function - Extracted loadVersionMetaData function from token command to loader module - Added proper type imports for ChangelogFile and ResolvedVersion in loader - Updated token command to import and use the new loadVersionMetaData function - Removed redundant data path utility usage in token command - Simplified token command imports by removing unused dependencies - Maintained same functionality while improving code organization --- src/commands/token.ts | 16 ++-------------- src/utils/loader.ts | 12 ++++++++++++ 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/commands/token.ts b/src/commands/token.ts index a2535cb..d9c066e 100644 --- a/src/commands/token.ts +++ b/src/commands/token.ts @@ -1,7 +1,4 @@ -import type { ChangelogFile, ComponentPropRecord } from '#/components.ts' -import type { ResolvedVersion } from '@/types.ts' -import { readFile } from 'node:fs/promises' -import { join } from 'node:path' +import type { ComponentPropRecord } from '#/components.ts' import process from 'node:process' import { defineCommand } from 'citty' import { Table } from 'console-table-printer' @@ -10,19 +7,10 @@ import { tokenArgs } from '@/args/token.ts' import { resolveConfig } from '@/config.ts' import { tableBorderStyle } from '@/constants/table.ts' import capitalize from '@/utils/capitalize.ts' -import { getDataPath } from '@/utils/loader.ts' +import { loadVersionMetaData } from '@/utils/loader.ts' import { output } from '@/utils/output.ts' import { resolveVersion } from '@/utils/version.ts' -async function loadVersionMetaData(version: ResolvedVersion): Promise { - const versionsPath = join(getDataPath(), 'versions.json') - const versionsIndex = JSON.parse(await readFile(versionsPath, 'utf-8')) - if (!Object.values(versionsIndex[version.majorVersion]).includes(version.version)) { - throw new Error(`v${version.version} not found`) - } - return JSON.parse(await readFile(join(getDataPath(), `v${version.version}.json`), 'utf-8')) as ChangelogFile -} - function outputTokenTable(tokens: ComponentPropRecord[]): string { const p = new Table({ style: tableBorderStyle, diff --git a/src/utils/loader.ts b/src/utils/loader.ts index eb3154e..f43c8fc 100644 --- a/src/utils/loader.ts +++ b/src/utils/loader.ts @@ -1,6 +1,18 @@ +import type { ChangelogFile } from '#/components.ts' +import type { ResolvedVersion } from '@/types.ts' +import { readFile } from 'node:fs/promises' import { join } from 'node:path' import { __dirname } from '@/constants/dirname.ts' export function getDataPath(): string { return join(__dirname, '..', 'data') } + +export async function loadVersionMetaData(version: ResolvedVersion): Promise { + const versionsPath = join(getDataPath(), 'versions.json') + const versionsIndex = JSON.parse(await readFile(versionsPath, 'utf-8')) + if (!Object.values(versionsIndex[version.majorVersion]).includes(version.version)) { + throw new Error(`v${version.version} not found`) + } + return JSON.parse(await readFile(join(getDataPath(), `v${version.version}.json`), 'utf-8')) as ChangelogFile +} From e6ed8a58eae76e43d90f7346409b93b1b3910fa9 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Tue, 18 Aug 2026 10:53:16 +0800 Subject: [PATCH 100/106] fix(sync): update Chinese name field extraction from frontmatter - Changed nameZh field to use 'subtitle' instead of 'name' or 'title' - Updated getFrontmatterField call to use correct property for Chinese names - Ensured proper extraction of subtitle field for component name display --- scripts/sync.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/sync.ts b/scripts/sync.ts index f4b4843..82e3f01 100644 --- a/scripts/sync.ts +++ b/scripts/sync.ts @@ -1255,7 +1255,7 @@ async function readComponent( const demos = await readDemos(directory, enMarkdown, zhMarkdown) const component = { name, - nameZh: getFrontmatterField(zh.frontmatter, 'name', 'title'), + nameZh: getFrontmatterField(zh.frontmatter, 'subtitle'), category: getFrontmatterField(en.frontmatter, 'category'), categoryZh: getFrontmatterField(zh.frontmatter, 'category'), description: getFrontmatterField(en.frontmatter, 'description'), From 667a1937e07eccb2d3953874879d9cc1888ce65f Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Tue, 18 Aug 2026 10:55:29 +0800 Subject: [PATCH 101/106] feat(list): implement component listing with bilingual support - Add console-table-printer for formatted table output - Implement markdown and table format options for component display - Integrate version metadata loading and component data retrieval - Add bilingual component names (English and Chinese) with descriptions - Support JSON, markdown, and table output formats - Enhance command with proper configuration resolution and version handling --- src/commands/list.ts | 55 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 53 insertions(+), 2 deletions(-) diff --git a/src/commands/list.ts b/src/commands/list.ts index cf86fd4..8c2da37 100644 --- a/src/commands/list.ts +++ b/src/commands/list.ts @@ -1,11 +1,62 @@ +import type { ComponentRecord } from '#/components.ts' import { defineCommand } from 'citty' +import { Table } from 'console-table-printer' +import { defaultArgs } from '@/args/default.ts' +import { resolveConfig } from '@/config.ts' +import { tableBorderStyle } from '@/constants/table.ts' +import { loadVersionMetaData } from '@/utils/loader.ts' +import { output } from '@/utils/output.ts' +import { resolveVersion } from '@/utils/version.ts' + +function outputMarkdown(components: ComponentRecord[]): string { + let context = '| Component | Name | Description |\n' + context += '| --- | --- | --- |\n' + + components.forEach((component) => { + context += `| ${component.name} | ${component.nameZh} | ${component.description} |\n` + }) + + return context +} + +function outputTable(components: ComponentRecord[]): string { + const p = new Table({ + style: tableBorderStyle, + columns: [ + { name: 'Component', alignment: 'left' }, + { name: 'Name', alignment: 'left' }, + { name: 'Description', alignment: 'left' }, + ], + }) + + components.forEach((component) => { + p.addRow({ + Component: component.name, + Name: component.nameZh, + Description: component.description, + }) + }) + + return p.render() +} export default defineCommand({ meta: { name: 'list', description: 'List all components with bilingual names, descriptions, and first-supported version', }, - run({ args }) { - console.log('Parsed args:', args) + args: defaultArgs, + async run({ args }) { + const config = resolveConfig(args) + const version = await resolveVersion(config) + + const metaData = await loadVersionMetaData(version) + const components = metaData.components + + output({ + text: outputTable(components), + json: components, + markdown: outputMarkdown(components), + }, args.format) }, }) From 08c26f4fe1f0948fe01ac29dace37c1827e379d7 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Tue, 18 Aug 2026 11:03:39 +0800 Subject: [PATCH 102/106] chore(test): remove pro-components dependency from ecosystem scan test - Removed @antdv-next/pro-components from test dependencies - Excluded pro-components from package writing operations - Updated expected scan results to exclude pro-components - Simplified test case by removing unnecessary dependency check --- test/env.test.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/test/env.test.ts b/test/env.test.ts index 5aa4576..d5f9de5 100644 --- a/test/env.test.ts +++ b/test/env.test.ts @@ -167,7 +167,6 @@ describe('scanEcosystem', () => { await writeProjectPackage({ dependencies: { '@antdv-next/cssinjs': '^2.0.0', - '@antdv-next/pro-components': '^1.4.0', 'unrelated-package': '^9.0.0', }, devDependencies: { @@ -185,7 +184,6 @@ describe('scanEcosystem', () => { await Promise.all([ writePackage('@antdv-next/cssinjs', '2.0.0'), writePackage('@antdv-next/icons', '3.0.0'), - writePackage('@antdv-next/pro-components', '1.4.0'), writePackage('@v-c/dialog', '5.0.0'), writePackage('@v-c/no-version'), writePackage('@v-c/optional', '2.0.0'), @@ -195,7 +193,6 @@ describe('scanEcosystem', () => { ]) await expect(scanEcosystem(projectPath)).resolves.toEqual({ - '@antdv-next/pro-components': '1.4.0', '@v-c/dialog': '5.0.0', '@v-c/optional': '2.0.0', '@v-c/peer': '4.0.0', From 088224d05f8368806c4a4b140f275d7449eef718 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Tue, 18 Aug 2026 13:19:21 +0800 Subject: [PATCH 103/106] chore(cli): remove unused todo comment from subCommands object - Removed commented out 'TODO' line in subCommands object - Cleaned up unnecessary comment that was not providing value - Maintained all functional command imports and their lazy loading behavior - Improved code clarity by removing dead comment code --- src/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index f7cae28..7a9557e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -6,7 +6,6 @@ import { description, name, version } from '../package.json' with { type: 'json' const CLI_VERSION = __CLI_VERSION__ const subCommands = { - // TODO 'bug': () => import('./commands/bug.ts').then(r => r.default), 'bug-cli': () => import('./commands/bug-cli.ts').then(r => r.default), 'changelog': () => import('./commands/changelog.ts').then(r => r.default), From bdd9569d6fd3e9c01f6bb154f9d8f20346314551 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Tue, 18 Aug 2026 13:26:59 +0800 Subject: [PATCH 104/106] feat(cli): add TODO comments for command implementations - Added TODO comment for changelog command usage and functionality - Added TODO comment for demo command to get component source code - Added TODO comment for doc command to output markdown documentation - Added TODO comment for doctor command diagnostic checks - Added TODO comment for info command to query component API details - Added TODO comment for lint command to check best practices - Added TODO comment for migrate command version migration guide - Added TODO comment for semantic command to query customization structure - Added TODO comment for setup command to configure MCP/Skill integration - Added TODO comment for upgrade command to update CLI version - Added TODO comment for usage command to scan project statistics --- src/commands/changelog.ts | 2 ++ src/commands/demo.ts | 2 ++ src/commands/doc.ts | 2 ++ src/commands/doctor.ts | 1 + src/commands/info.ts | 2 ++ src/commands/lint.ts | 2 ++ src/commands/migrate.ts | 2 ++ src/commands/semantic.ts | 2 ++ src/commands/setup.ts | 2 ++ src/commands/upgrade.ts | 1 + src/commands/usage.ts | 2 ++ 11 files changed, 20 insertions(+) diff --git a/src/commands/changelog.ts b/src/commands/changelog.ts index 73a4aa2..e6172c8 100644 --- a/src/commands/changelog.ts +++ b/src/commands/changelog.ts @@ -6,6 +6,8 @@ export default defineCommand({ description: 'Query changelog or compare API differences between versions', }, run({ args }) { + // TODO antd changelog [v1] [v2] [component] + // Changelog 条目、版本范围或跨版本 API 对比 console.log('Parsed args:', args) }, }) diff --git a/src/commands/demo.ts b/src/commands/demo.ts index dda5c2c..8d83191 100644 --- a/src/commands/demo.ts +++ b/src/commands/demo.ts @@ -6,6 +6,8 @@ export default defineCommand({ description: 'Get demo source code for a component', }, run({ args }) { + // TODO antd demo [name + // 可运行的 Demo 源码(TSX) console.log('Parsed args:', args) }, }) diff --git a/src/commands/doc.ts b/src/commands/doc.ts index 955f26b..34f0113 100644 --- a/src/commands/doc.ts +++ b/src/commands/doc.ts @@ -6,6 +6,8 @@ export default defineCommand({ description: 'Output the full API documentation for a component in markdown', }, run({ args }) { + // TODO antd doc + // 组件完整 Markdown 文档 console.log('Parsed args:', args) }, }) diff --git a/src/commands/doctor.ts b/src/commands/doctor.ts index d0c5f4b..e868f21 100644 --- a/src/commands/doctor.ts +++ b/src/commands/doctor.ts @@ -6,6 +6,7 @@ export default defineCommand({ description: 'Diagnose project-level antd configuration issues', }, run({ args }) { + // TODO antd doctor 10 项诊断检查:兼容性、重复安装、peer 依赖、SSR、babel 插件 console.log('Parsed args:', args) }, }) diff --git a/src/commands/info.ts b/src/commands/info.ts index 8f27f7f..575d646 100644 --- a/src/commands/info.ts +++ b/src/commands/info.ts @@ -6,6 +6,8 @@ export default defineCommand({ description: 'Query component API: props, type definitions, default values', }, run({ args }) { + // TODO antd info + // Props 表格,含类型、默认值、引入版本和废弃状态 console.log('Parsed args:', args) }, }) diff --git a/src/commands/lint.ts b/src/commands/lint.ts index 2f471fb..4aab1c2 100644 --- a/src/commands/lint.ts +++ b/src/commands/lint.ts @@ -6,6 +6,8 @@ export default defineCommand({ description: 'Check antdv-next usage against best practices', }, run({ args }) { + // TODO antd lint [target] + // 废弃 API、无障碍缺陷、性能问题、最佳实践 console.log('Parsed args:', args) }, }) diff --git a/src/commands/migrate.ts b/src/commands/migrate.ts index 7c4bb1c..f9d5c53 100644 --- a/src/commands/migrate.ts +++ b/src/commands/migrate.ts @@ -6,6 +6,8 @@ export default defineCommand({ description: 'Version migration guide with optional auto-fix', }, run({ args }) { + // TODO antd migrate + // 迁移清单,区分自动修复/手动处理,--apply 生成 Agent 提示 console.log('Parsed args:', args) }, }) diff --git a/src/commands/semantic.ts b/src/commands/semantic.ts index d939f44..1f526bd 100644 --- a/src/commands/semantic.ts +++ b/src/commands/semantic.ts @@ -6,6 +6,8 @@ export default defineCommand({ description: 'Query the semantic customization structure of a component', }, run({ args }) { + // antd semantic + // 语义化 classNames / styles 结构及用法示例 console.log('Parsed args:', args) }, }) diff --git a/src/commands/setup.ts b/src/commands/setup.ts index c2dcc5d..eedef56 100644 --- a/src/commands/setup.ts +++ b/src/commands/setup.ts @@ -6,6 +6,8 @@ export default defineCommand({ description: 'Set up Ant Design MCP/Skill for AI agents or GitHub Actions', }, run({ args }) { + // TODO antd setup + // 为 Claude Code、Cursor、VS Code 或 Codex 接入 Ant Design MCP/Skill console.log('Parsed args:', args) }, }) diff --git a/src/commands/upgrade.ts b/src/commands/upgrade.ts index 414d4e8..22e0a06 100644 --- a/src/commands/upgrade.ts +++ b/src/commands/upgrade.ts @@ -20,6 +20,7 @@ export default defineCommand({ process.exit(1) } + // TODO antd upgrade 将 CLI 升级到最新版本 // 执行相关的升级步骤 // step 2: 获取当前用户下的 pm,默认 npm // step 3: 根据 pm 进行运行安装 ANTDV_NEXT_CLI diff --git a/src/commands/usage.ts b/src/commands/usage.ts index 5cafc7d..871329d 100644 --- a/src/commands/usage.ts +++ b/src/commands/usage.ts @@ -6,6 +6,8 @@ export default defineCommand({ description: 'Scan project for antd component/API usage statistics', }, run({ args }) { + // antd usage [dir] + // 导入统计、子组件分布(Form.Item)、非组件导出 console.log('Parsed args:', args) }, }) From f26a4a8879e226b93d95205a0be65ca7de778703 Mon Sep 17 00:00:00 2001 From: lonewolfyx Date: Tue, 18 Aug 2026 13:44:35 +0800 Subject: [PATCH 105/106] feat(version): add version mapping configuration - Create versions.json to manage version mappings - Add version entries from 1.0 to 1.5 with their corresponding values - Set up initial version tracking structure - Include version ranges from 1.0.5 to 1.5.1 - Establish version control for future updates - Configure version data structure for application use --- data/changelog.json | 2754 ++++ data/v1.0.5.json | 25963 +++++++++++++++++++++++++++++++++++++ data/v1.1.9.json | 26464 +++++++++++++++++++++++++++++++++++++ data/v1.2.2.json | 25990 +++++++++++++++++++++++++++++++++++++ data/v1.3.7.json | 26649 ++++++++++++++++++++++++++++++++++++++ data/v1.4.6.json | 26845 ++++++++++++++++++++++++++++++++++++++ data/v1.5.1.json | 26784 ++++++++++++++++++++++++++++++++++++++ data/v1.json | 29443 ++++++++++++++++++++++++++++++++++++++++++ data/versions.json | 10 + 9 files changed, 190902 insertions(+) create mode 100644 data/changelog.json create mode 100644 data/v1.0.5.json create mode 100644 data/v1.1.9.json create mode 100644 data/v1.2.2.json create mode 100644 data/v1.3.7.json create mode 100644 data/v1.4.6.json create mode 100644 data/v1.5.1.json create mode 100644 data/v1.json create mode 100644 data/versions.json diff --git a/data/changelog.json b/data/changelog.json new file mode 100644 index 0000000..d44112a --- /dev/null +++ b/data/changelog.json @@ -0,0 +1,2754 @@ +[ + { + "version": "1.5.1", + "date": "2026-08-14", + "changelog": [ + { + "component": "", + "type": "feat", + "description": "expose `nativeElement` refs on ~20 components — Avatar.Group, Badge.Ribbon, Breadcrumb, Calendar, Card.Grid, Card.Meta, Carousel, Descriptions, Divider, Empty, FloatButton.Group, QRCode, Result, Skeleton, Space.Compact, Spin, Splitter, Transfer and Watermark — with the ref types exported from the entry (#58627~#58667)" + }, + { + "component": "form", + "type": "feat", + "description": "rule `message` accepts a render function `() => VueNode`; it is kept as-is through validation and only invoked while rendering the error, so any reactive state it reads (locale, i18n, ...) updates the displayed message without re-running validators; works with form-level and computed `rules` as well ([#714](https://github.com/antdv-next/antdv-next/pull/714))" + }, + { + "component": "tree", + "type": "feat", + "description": "`scrollTo` supports `autoExpand`, add `Tree.useTree` and export `TreeInstance` / `UseTreeConfig` (#58841)" + }, + { + "component": "table", + "type": "feat", + "description": "support `forceRender` for expandable rows (#58860)" + }, + { + "component": "float-button", + "type": "feat", + "description": "BackTop gains `showProgress`, rendering scroll progress as a ring (#58894)" + }, + { + "component": "pagination", + "type": "feat", + "description": "add `components.sizeChanger` to customize the size changer (#58831)" + }, + { + "component": "mentions", + "type": "feat", + "description": "support `popupRender` to customize the dropdown (#58582)" + }, + { + "component": "input", + "type": "feat", + "description": "ConfigProvider variant config supports the `inputSearch` / `inputPassword` / `otp` subcomponents, each resolving its own config first (#58784)" + }, + { + "component": "tooltip, popover, popconfirm", + "type": "feat", + "description": "`mouseEnterDelay` / `mouseLeaveDelay` configurable globally via ConfigProvider (#58892)" + }, + { + "component": "theme", + "type": "feat", + "description": "add the `focusOutline` seed token for shared focus styles, honored by Input, Select, Rate, Splitter and Steps; Alert gains a `borderRadius` component token (#58647, #58708, #57765)" + }, + { + "component": "image", + "type": "feat", + "description": "preview supports `wheel` to control mouse-wheel zoom (`@v-c/image@1.1.0`, #58728)" + }, + { + "component": "border-beam", + "type": "feat", + "description": "add `count` to configure the number of beams, evenly distributed (#58691)" + }, + { + "component": "locale", + "type": "feat", + "description": "add Albanian `sq_AL`; refine Traditional Chinese terminology and use Taiwan week wording in DatePicker (#58618, #58947, #58951)" + }, + { + "component": "form", + "type": "fix", + "description": "rules combining `required` and `type` no longer run type validation twice; FormItem `required` no longer derives a validation rule and only drives the required mark, aligning with antd" + }, + { + "component": "form", + "type": "fix", + "description": "function rules resolve with the form instance as argument and are re-resolved on every validation, so they can read the latest external state" + }, + { + "component": "form", + "type": "fix", + "description": "form controls now carry `aria-required` and link help and error text via `aria-describedby`" + }, + { + "component": "table", + "type": "fix", + "description": "an explicitly placed `Table.EXPAND_COLUMN` no longer loses its identity through `ref()` / `reactive()` proxies, removing the phantom empty column (`@v-c/table@1.2.0`)" + }, + { + "component": "tree-select", + "type": "fix", + "description": "preserve the selection state of disabled child nodes (`@v-c/tree-select@1.1.2`)" + }, + { + "component": "select", + "type": "fix", + "description": "the clear icon is reachable by keyboard (`@v-c/select@1.2.1`)" + }, + { + "component": "virtual-list", + "type": "fix", + "description": "`scrollTo({ key })` resolves against the latest data and retries after a data update (`@v-c/virtual-list@1.1.1`)" + }, + { + "component": "carousel", + "type": "fix", + "description": "keep the current slide when children are added instead of resetting to the first (#58845)" + }, + { + "component": "drawer", + "type": "fix", + "description": "support a disabled close button (#58853)" + }, + { + "component": "", + "type": "fix", + "description": "correct semantic style priority — ConfigProvider's root `style` now sits between context styles and component styles across 20+ components including Badge, Calendar, ColorPicker, DatePicker, Drawer, Dropdown and Modal; also fixes Divider spreading the whole semantic styles object onto its root, Masonry dropping component-level `styles.root`, and the message Holder merge order (#58550, #58564)" + }, + { + "component": "config-provider", + "type": "fix", + "description": "the `inputSearch` component config previously never reached the context and was silently dead; it now applies" + }, + { + "component": "typography", + "type": "fix", + "description": "restore the interactive ellipsis tooltip — hovering the popup no longer dismisses it (#58661, #58722)" + }, + { + "component": "button", + "type": "fix", + "description": "align loading icon styles, dropping the redundant centering and block declarations (#58712)" + }, + { + "component": "types", + "type": "fix", + "description": "export the missing `UploadRef`, `StatisticRef` and `SliderRef` types (#58700, #58798)" + }, + { + "component": "site", + "type": "fix", + "description": "harden mainland China detection for the docs site switch" + }, + { + "component": "select, table, tree", + "type": "fix", + "description": "virtual scrollbars gain `cursor: pointer` and hover feedback (#58658, #58679)" + }, + { + "component": "", + "type": "docs", + "description": "add the design system documentation ([#707](https://github.com/antdv-next/antdv-next/pull/707)) and refresh the getting-started guide" + }, + { + "component": "docs", + "type": "feat", + "description": "support multi-file demo tabs in the code panel" + }, + { + "component": "", + "type": "docs", + "description": "add demos for Avatar `overflowInFinal`, reactive Form validation messages and Tabs `more.popupRender`; document the Image preview `wheel` prop" + }, + { + "component": "sync", + "type": "chore", + "description": "sync ant-design **6.6.0** upstream changes ([#703](https://github.com/antdv-next/antdv-next/pull/703), [#710](https://github.com/antdv-next/antdv-next/pull/710))" + }, + { + "component": "deps", + "type": "chore", + "description": "upgrade `@v-c/virtual-list@1.1.1`, `@v-c/tree@1.2.0`, `@v-c/select@1.2.1`, `@v-c/tree-select@1.1.2`, `@v-c/table@1.2.0`, `@v-c/image@1.1.0`" + }, + { + "component": "", + "type": "refactor", + "description": "Button's delayed loading, Slider's tooltip toggle, Upload's progress reveal and Typography's copy feedback all move onto the shared `useDelayState` (#58690)" + } + ] + }, + { + "version": "1.5.0", + "date": "2026-08-07", + "changelog": [ + { + "component": "listy", + "type": "feat", + "description": "add the experimental Listy component with standard and virtual lists, grouped data and sticky headers, infinite-loading scenarios, semantic `classes` / `styles`, and a `scrollTo` API for scrolling to a position, item or group ([#670](https://github.com/antdv-next/antdv-next/pull/670))" + }, + { + "component": "border-beam", + "type": "feat", + "description": "add `duration`, `lineWidth` and `size` to control animation duration, beam width and beam size respectively; add demos for these options and custom containers" + }, + { + "component": "layout", + "type": "fix", + "description": "support both a `trigger` prop and slot on Layout Sider; restore the default trigger when neither is supplied, and allow an explicit `null` to hide it" + }, + { + "component": "segmented", + "type": "fix", + "description": "in controlled mode, keep the selected item on the controlled value when the consumer does not update `value` after `change`, instead of incorrectly switching to the clicked item; upgrade the primitive to `@v-c/segmented@1.0.4`" + }, + { + "component": "alert", + "type": "fix", + "description": "an object-valued `closable` now enables closing even when it does not provide `closeIcon`" + }, + { + "component": "checkbox", + "type": "fix", + "description": "Checkbox Group ignores `null` / `undefined` options and options without a valid `value`, avoiding invalid checkbox items" + }, + { + "component": "float-button", + "type": "fix", + "description": "BackTop jumps to the top without animation when the user enables `prefers-reduced-motion`; the shared `scrollTo` utility now also supports zero-duration scrolling and cancellation of unfinished animations" + }, + { + "component": "app", + "type": "fix", + "description": "with CSS variables and `component={false}`, only warn when root classes or styles would actually be dropped (#58876)" + }, + { + "component": "border-beam", + "type": "fix", + "description": "fall back to default border information when `getComputedStyle` throws on the host element, preventing BorderBeam from breaking the component tree" + }, + { + "component": "types", + "type": "fix", + "description": "correct the DatePicker semantic return value and Tour `actionsRender` declarations to match the actual component-level APIs" + }, + { + "component": "listy", + "type": "docs", + "description": "add Chinese and English component docs with demos for basic usage, virtual scrolling, grouping, imperative scrolling, rich content, infinite loading and semantic styling" + }, + { + "component": "docs", + "type": "perf", + "description": "load component demo source only when the code panel is expanded, so the browser no longer parses every demo's source and highlighted output during page initialization; development HMR remains supported and loaded source is reused across collapse and re-expand" + }, + { + "component": "sync", + "type": "chore", + "description": "sync upstream changes from ant-design **6.5.4**" + }, + { + "component": "deps", + "type": "chore", + "description": "add `@v-c/listy@1.0.2` and upgrade `@v-c/picker` to 1.3.2 ([#684](https://github.com/antdv-next/antdv-next/pull/684)), `@v-c/segmented` to 1.0.4 and `@v-c/table` to 1.1.9" + } + ] + }, + { + "version": "1.4.6", + "date": "2026-08-03", + "changelog": [ + { + "component": "date-picker", + "type": "fix", + "description": "blur no longer submits an unconfirmed partial range when using `showTime` with `allowEmpty`. Comes from the RangePicker interaction-flow refactor in `@v-c/picker@1.3.0`, where every interaction is resolved into a single action before anything executes, so event sources no longer submit or reset values on their own ([#681](https://github.com/antdv-next/antdv-next/pull/681), #58803)" + }, + { + "component": "slider", + "type": "fix", + "description": "`onFocus` / `onBlur` no longer fire more than once. Vue's `cloneVNode` merges `on*` props into an array and invokes each one — React's `cloneElement` overwrites — so an explicit dispatch on top of that duplicated the callback. The two paths are also asymmetric: `@v-c/slider`'s `Handle` declares `onFocus` as a prop but never `onBlur` ([#681](https://github.com/antdv-next/antdv-next/pull/681), #58711)" + }, + { + "component": "table", + "type": "fix", + "description": "selecting all data no longer picks up disabled rows on other pages. It relied on `checkboxPropsMap`, which only covers the current page, so records elsewhere had no `disabled` entry and read as selectable ([#681](https://github.com/antdv-next/antdv-next/pull/681), #58843)" + }, + { + "component": "table", + "type": "fix", + "description": "keep `dataIndex` accessible on the columns union ([#673](https://github.com/antdv-next/antdv-next/pull/673))" + }, + { + "component": "transfer", + "type": "fix", + "description": "deselect-all is correct while filtering. It compared key counts, but filtering narrows the keys to the visible items, so a fully-checked list read as unchecked ([#681](https://github.com/antdv-next/antdv-next/pull/681), #58844)" + }, + { + "component": "transfer", + "type": "fix", + "description": "preserve the disabled state of custom actions ([#668](https://github.com/antdv-next/antdv-next/pull/668), #58718)" + }, + { + "component": "input", + "type": "fix", + "description": "`Input.OTP` no longer renders the original value when `mask` is a string — the mask overlay was effectively doing nothing — and an explicitly supplied `type` now wins over the mask-derived one ([#681](https://github.com/antdv-next/antdv-next/pull/681), #58805, #58835)" + }, + { + "component": "input", + "type": "fix", + "description": "hide the `Input.TextArea` resize handle on touch devices ([#681](https://github.com/antdv-next/antdv-next/pull/681), #58812)" + }, + { + "component": "select", + "type": "fix", + "description": "suffix icons and selected content no longer overlap the clear icon under custom theme colours ([#681](https://github.com/antdv-next/antdv-next/pull/681), #58581)" + }, + { + "component": "select", + "type": "fix", + "description": "the clear button is reachable by keyboard — visible and outlined on focus, and a custom suffix holding focus is no longer hidden. The clear affordance is a focusable `