diff --git a/extensions/vscode/.eslintrc.json b/extensions/vscode/.eslintrc.json
new file mode 100644
index 0000000..5a60946
--- /dev/null
+++ b/extensions/vscode/.eslintrc.json
@@ -0,0 +1,36 @@
+{
+ "root": true,
+ "parser": "@typescript-eslint/parser",
+ "parserOptions": {
+ "ecmaVersion": 2021,
+ "sourceType": "module",
+ "ecmaFeatures": { "jsx": true }
+ },
+ "plugins": ["@typescript-eslint"],
+ "extends": [
+ "eslint:recommended",
+ "plugin:@typescript-eslint/recommended"
+ ],
+ "env": {
+ "node": true,
+ "es2021": true
+ },
+ "rules": {
+ "@typescript-eslint/no-explicit-any": "off",
+ "@typescript-eslint/no-unused-vars": [
+ "warn",
+ { "argsIgnorePattern": "^_", "varsIgnorePattern": "^_" }
+ ]
+ },
+ "ignorePatterns": ["out", "node_modules", "reference", "**/*.js"],
+ "overrides": [
+ {
+ "files": ["src/webview/**/*.{ts,tsx}"],
+ "env": { "browser": true }
+ },
+ {
+ "files": ["**/__tests__/**/*.{ts,tsx}", "**/*.test.{ts,tsx}"],
+ "env": { "jest": true }
+ }
+ ]
+}
diff --git a/extensions/vscode/.gitignore b/extensions/vscode/.gitignore
new file mode 100644
index 0000000..ae7fae2
--- /dev/null
+++ b/extensions/vscode/.gitignore
@@ -0,0 +1,5 @@
+.DS_Store
+.superpowers/
+node_modules/
+reference
+out/
\ No newline at end of file
diff --git a/extensions/vscode/.vscode/launch.json b/extensions/vscode/.vscode/launch.json
new file mode 100644
index 0000000..a142310
--- /dev/null
+++ b/extensions/vscode/.vscode/launch.json
@@ -0,0 +1,13 @@
+{
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "name": "Run Extension",
+ "type": "extensionHost",
+ "request": "launch",
+ "args": ["--extensionDevelopmentPath=${workspaceFolder}"],
+ "outFiles": ["${workspaceFolder}/out/**/*.js"],
+ "preLaunchTask": "npm: compile"
+ }
+ ]
+}
diff --git a/extensions/vscode/.vscodeignore b/extensions/vscode/.vscodeignore
new file mode 100644
index 0000000..213ba03
--- /dev/null
+++ b/extensions/vscode/.vscodeignore
@@ -0,0 +1,15 @@
+src/**
+reference/**
+docs/**
+node_modules/**
+**/*.ts
+**/*.map
+tsconfig*.json
+webpack.config.js
+jest.config.js
+.gitignore
+.eslintrc.json
+.vscode/**
+.superpowers/**
+prototype.html
+resources/icon-old.svg
diff --git a/extensions/vscode/README.md b/extensions/vscode/README.md
new file mode 100644
index 0000000..0f79a01
--- /dev/null
+++ b/extensions/vscode/README.md
@@ -0,0 +1,155 @@
+
+ English | 简体中文
+
+
+# Open Code Review (VS Code Extension)
+
+A VS Code code-review extension built on the [`open-code-review`](https://www.npmjs.com/package/@alibaba-group/open-code-review) (`ocr`) CLI. It recreates the prototype experience with a Preact WebView and brings AI code review into the editor: start reviews from the sidebar, stream logs live, and apply / dismiss / flag-as-false-positive each comment inline — kept in sync with the sidebar both ways.
+
+---
+
+## Features
+
+- **Three review modes**: workspace changes, branch comparison (`--from` / `--to`), and a single commit (`--commit`).
+- **Files-to-review preview**: lists changed files from the current Git state; click a file to view its changes in the native diff view.
+- **Custom review prompt**: optionally append a `--background` hint for the current review.
+- **Streaming logs**: tail the CLI output live during review, cancel anytime.
+- **Results + two-way sync**: on completion, comment cards appear in the sidebar while CommentThreads render in the editor; apply / dismiss / false-positive actions stay in sync on both sides.
+- **Empty / cancelled / failed states**: dedicated views for no issues, user cancellation, and CLI failure (failures are retryable and surface the real error returned by the CLI).
+- **Configuration management**: view / edit the LLM provider config inside the extension (persisted via `ocr config set`).
+- **Model switching / connectivity test**: switch models and test connectivity to the LLM from the status bar.
+
+---
+
+## Prerequisites
+
+1. Install the `ocr` CLI globally:
+
+ ```bash
+ npm i -g @alibaba-group/open-code-review
+ ```
+
+2. Configure a working LLM (endpoint, API key, model). Configure it via the CLI directly, or in the extension's config view:
+
+ ```bash
+ ocr config set llm.url https://api.anthropic.com/v1/messages
+ ocr config set llm.auth_token sk-...
+ ocr config set llm.model claude-opus-4-6
+ ocr config set llm.use_anthropic true
+ ```
+
+ The config is written to `~/.opencodereview/config.json`.
+
+---
+
+## Development
+
+### Environment
+
+- Node.js ≥ 18, with **Yarn** as the package manager (the repo ships a `yarn.lock`).
+- VS Code ≥ 1.74.
+- A globally available `ocr` CLI (see "Prerequisites" above) — the extension is essentially a GUI front-end for `ocr`.
+
+### Start the dev environment
+
+```bash
+cd extensions/vscode
+yarn install # install dependencies
+yarn watch # watch-mode dev build (recommended: rebuilds out/ on change)
+```
+
+Then open the `extensions/vscode` folder in VS Code and press **F5** to launch the
+Extension Development Host (debug config is provided in `.vscode/launch.json`). In the new
+window, open a project with Git changes — you'll see the Open Code Review icon in the
+activity bar and can start a review.
+
+> After editing code: WebView changes require **reopening the sidebar** in the dev host window
+> (or running `Developer: Reload Webviews`); Extension Host changes require **restarting the
+> debug session** (the ⟳ button on the debug toolbar, or `Cmd+R` in the host window).
+
+### Scripts
+
+```bash
+yarn compile # one-off dev build (webpack development)
+yarn watch # watch-mode dev build
+yarn build # production build (webpack production; runs automatically before packaging)
+yarn test # run Jest unit tests
+yarn lint # ESLint
+yarn package # produce a distributable .vsix package (see "Build a release package")
+```
+
+### Debugging notes
+
+- **Two-way messaging**: the WebView and Extension Host communicate via `postMessage`; message
+ types live in `src/shared/messages.ts`. Both sides route through `dispatch` / `handle` — start
+ there when debugging.
+- **CLI invocation**: all `ocr` sub-commands run via `child_process.spawn` in
+ `src/extension/services/CliService.ts`. `runRaw` rejects on a non-zero CLI exit code and includes
+ the `Error:` text from stderr, which helps diagnose "review failed / connection failed".
+- **Config read/write**: `ConfigService` reads `~/.opencodereview/config.json` and delegates writes to
+ `ocr config set`. WebView fields are camelCase (e.g. `useAnthropic`) while the disk/CLI side is
+ snake_case (e.g. `use_anthropic`); the conversion lives in `src/extension/services/configParse.ts`.
+
+---
+
+## Build
+
+### Compile artifacts only
+
+```bash
+yarn build # production build (webpack production)
+```
+
+Artifacts: `out/extension.js` (Extension Host) + `out/webview.js` (WebView SPA).
+
+### Build a release package (.vsix)
+
+```bash
+yarn package # = vsce package --no-yarn
+```
+
+This command:
+
+1. Triggers `vscode:prepublish` → runs the `yarn build` production build;
+2. Excludes source, tests, and dev files per `.vscodeignore`;
+3. Produces `open-code-review-vscode-.vsix` in the current directory.
+
+> The packaging tool is `@vscode/vsce`, installed as a devDependency — no global install or network
+> download needed. `--no-yarn` skips vsce's default npm dependency-tree check (this project uses Yarn).
+
+The release package contains only the runtime essentials: `package.json`, `README.md`,
+`resources/icon.svg`, `out/extension.js`, `out/webview.js`.
+
+### Install / verify locally
+
+```bash
+code --install-extension open-code-review-vscode-.vsix
+```
+
+Or in VS Code: Extensions panel → top-right `⋯` → **Install from VSIX…** → pick the generated `.vsix` file.
+
+> To publish to the Marketplace, use `vsce publish` instead (requires a publisher account and PAT);
+> for everyday distribution the `.vsix` above is enough.
+
+---
+
+## Architecture
+
+It uses a **Monolithic WebView + Thin Extension Host** design:
+
+- The **WebView** is a separately built Preact SPA that reproduces the full visual and interactive prototype.
+- The **Extension Host** layer is thin, handling only CLI invocation, the file system, Git operations, and editor comments.
+- The two communicate via `postMessage`, with shared TypeScript types in `src/shared/` for type safety.
+
+```
+src/
+├── extension/ Extension Host (Node.js): services / providers / commands
+├── webview/ WebView SPA (Preact): views / components / store / bridge
+└── shared/ shared types and the postMessage protocol (no vscode dependency)
+```
+
+---
+
+## License
+
+Apache-2.0
diff --git a/extensions/vscode/README.zh-CN.md b/extensions/vscode/README.zh-CN.md
new file mode 100644
index 0000000..09c5a99
--- /dev/null
+++ b/extensions/vscode/README.zh-CN.md
@@ -0,0 +1,149 @@
+
+ English | 简体中文
+
+
+# Open Code Review (VSCode 插件)
+
+基于 [`open-code-review`](https://www.npmjs.com/package/@alibaba-group/open-code-review) (`ocr`) CLI 的 VSCode 代码审查插件。以 Preact WebView 还原原型交互体验,把 AI 代码审查能力集成进编辑器:在侧边栏发起审查、流式查看日志、在编辑器内逐条应用/忽略/标记误报评论,并与侧边栏双向同步。
+
+---
+
+## 功能
+
+- **三种审查模式**:工作区变更、分支对比(`--from` / `--to`)、单次提交(`--commit`)。
+- **待审查文件预览**:基于当前 Git 状态展示变更文件列表,点击文件可在原生 diff 视图中查看改动。
+- **自定义审查提示词**:可选地为本次审查追加 `--background` 提示。
+- **流式日志**:审查过程中实时滚动 CLI 输出,支持随时取消。
+- **结果展示 + 双向同步**:完成后在侧边栏列出评论卡片,同时在编辑器内渲染 CommentThread;应用/忽略/误报操作在两侧同步。
+- **空 / 取消 / 失败态**:无问题、用户取消、CLI 失败均有对应视图(失败可重试,并展示 CLI 返回的真实错误)。
+- **配置管理**:在插件内查看/编辑 LLM 提供商配置(写入通过 `ocr config set`)。
+- **模型切换 / 连通性测试**:状态栏切换模型、测试与 LLM 的连通性。
+
+---
+
+## 前置依赖
+
+1. 全局安装 `ocr` CLI:
+
+ ```bash
+ npm i -g @alibaba-group/open-code-review
+ ```
+
+2. 配置可用的 LLM(接口地址、API Key、模型)。可用 CLI 直接配置,或在插件内的配置视图填写:
+
+ ```bash
+ ocr config set llm.url https://api.anthropic.com/v1/messages
+ ocr config set llm.auth_token sk-...
+ ocr config set llm.model claude-opus-4-6
+ ocr config set llm.use_anthropic true
+ ```
+
+ 配置写入 `~/.opencodereview/config.json`。
+
+---
+
+## 开发
+
+### 环境准备
+
+- Node.js ≥ 18,包管理器使用 **Yarn**(仓库自带 `yarn.lock`)。
+- VS Code ≥ 1.74。
+- 全局可用的 `ocr` CLI(见上文「前置依赖」),插件本质上是 `ocr` 的图形前端。
+
+### 启动开发环境
+
+```bash
+cd extensions/vscode
+yarn install # 安装依赖
+yarn watch # 监听式开发构建(推荐:改代码自动重新打包 out/)
+```
+
+然后在 VS Code 中打开 `extensions/vscode` 目录,按 **F5** 启动 Extension Development Host
+(调试配置已在 `.vscode/launch.json` 提供)。在弹出的新窗口里打开一个有 Git 变更的项目,
+即可在活动栏看到 Open Code Review 图标并发起审查。
+
+> 改了代码后:WebView 改动需在开发宿主窗口里 **重新打开侧边栏**(或执行命令 `Developer: Reload Webviews`);
+> Extension Host 改动需 **重启调试**(调试工具栏的 ⟳ 或在宿主窗口按 `Cmd+R`)。
+
+### 常用脚本
+
+```bash
+yarn compile # 单次开发构建(webpack development)
+yarn watch # 监听式开发构建
+yarn build # 生产构建(webpack production,打包前自动执行)
+yarn test # 运行 Jest 单测
+yarn lint # ESLint 检查
+yarn package # 生成可分发的 .vsix 安装包(见下文「构建发布包」)
+```
+
+### 调试要点
+
+- **双端通信**:WebView 与 Extension Host 通过 `postMessage` 通信,消息类型定义在
+ `src/shared/messages.ts`。两端发收都走 `dispatch` / `handle`,定位问题先看这里。
+- **CLI 调用**:所有 `ocr` 子命令由 `src/extension/services/CliService.ts` 通过 `child_process.spawn` 执行。
+ `runRaw` 会在 CLI 退出码非 0 时 reject 并带上 stderr 中的 `Error:` 文本,便于排查“审查失败/连接失败”。
+- **配置读写**:`ConfigService` 读取 `~/.opencodereview/config.json`,写入则委托 `ocr config set`。
+ WebView 端字段为 camelCase(如 `useAnthropic`),磁盘/CLI 端为 snake_case(如 `use_anthropic`),
+ 转换在 `src/extension/services/configParse.ts`。
+
+---
+
+## 构建
+
+### 仅编译产物
+
+```bash
+yarn build # 生产构建(webpack production)
+```
+
+产物:`out/extension.js`(Extension Host)+ `out/webview.js`(WebView SPA)。
+
+### 构建发布包(.vsix)
+
+```bash
+yarn package # = vsce package --no-yarn
+```
+
+该命令会:
+
+1. 自动触发 `vscode:prepublish` → 执行 `yarn build` 生产构建;
+2. 按 `.vscodeignore` 排除源码、测试、开发文件;
+3. 在当前目录生成 `open-code-review-vscode-.vsix`。
+
+> 打包工具为 `@vscode/vsce`,已作为 devDependency 安装,无需全局安装或联网下载。
+> `--no-yarn` 用于跳过 vsce 默认的 npm 依赖树校验(本项目用 Yarn)。
+
+发布包只包含运行必需文件:`package.json`、`README.md`、`resources/icon.svg`、`out/extension.js`、`out/webview.js`。
+
+### 本地安装 / 验证
+
+```bash
+code --install-extension open-code-review-vscode-.vsix
+```
+
+或在 VS Code 中:扩展面板 → 右上角 `⋯` → **Install from VSIX…** → 选择生成的 `.vsix` 文件。
+
+> 发布到 Marketplace 时改用 `vsce publish`(需要 publisher 账号与 PAT),日常分发用上面的 `.vsix` 即可。
+
+---
+
+## 架构
+
+采用 **Monolithic WebView + Thin Extension Host** 方案:
+
+- **WebView** 是独立构建的 Preact SPA,还原原型的全部视觉与交互。
+- **Extension Host** 层轻薄,只负责 CLI 调用、文件系统、Git 操作、编辑器评论。
+- 两者通过 `postMessage` 通信,用 `src/shared/` 中的 TypeScript 共享类型保证类型安全。
+
+```
+src/
+├── extension/ Extension Host(Node.js):services / providers / commands
+├── webview/ WebView SPA(Preact):views / components / store / bridge
+└── shared/ 双端共享类型与 postMessage 协议(不依赖 vscode)
+```
+
+---
+
+## License
+
+Apache-2.0
diff --git a/extensions/vscode/jest.config.js b/extensions/vscode/jest.config.js
new file mode 100644
index 0000000..cac1d46
--- /dev/null
+++ b/extensions/vscode/jest.config.js
@@ -0,0 +1,8 @@
+module.exports = {
+ preset: 'ts-jest',
+ testEnvironment: 'node',
+ transform: {
+ '^.+\\.tsx?$': ['ts-jest', { isolatedModules: true, tsconfig: 'tsconfig.extension.json' }],
+ },
+ testMatch: ['**/__tests__/**/*.test.ts'],
+};
diff --git a/extensions/vscode/open-code-review-vscode-0.1.0.vsix b/extensions/vscode/open-code-review-vscode-0.1.0.vsix
new file mode 100644
index 0000000..5f008a1
Binary files /dev/null and b/extensions/vscode/open-code-review-vscode-0.1.0.vsix differ
diff --git a/extensions/vscode/package.json b/extensions/vscode/package.json
new file mode 100644
index 0000000..48d141f
--- /dev/null
+++ b/extensions/vscode/package.json
@@ -0,0 +1,76 @@
+{
+ "name": "open-code-review-vscode",
+ "displayName": "Open Code Review",
+ "description": "AI 代码审查 —— 基于 open-code-review CLI",
+ "version": "0.1.0",
+ "publisher": "open-code-review",
+ "license": "Apache-2.0",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/nigulasikk/open-code-review.git",
+ "directory": "extensions/vscode"
+ },
+ "engines": { "vscode": "^1.74.0" },
+ "categories": ["Other"],
+ "main": "./out/extension.js",
+ "activationEvents": ["onStartupFinished"],
+ "contributes": {
+ "viewsContainers": {
+ "activitybar": [
+ {
+ "id": "ocr-container",
+ "title": "Open Code Review",
+ "icon": "resources/icon.svg"
+ }
+ ]
+ },
+ "views": {
+ "ocr-container": [
+ { "id": "ocr.sidebar", "type": "webview", "name": "Code Review" }
+ ]
+ },
+ "commands": [
+ { "command": "ocr.review.start", "title": "OCR: 开始代码审查" },
+ { "command": "ocr.review.cancel", "title": "OCR: 取消审查" },
+ { "command": "ocr.config.open", "title": "OCR: 打开配置" },
+ { "command": "ocr.comment.apply", "title": "应用" },
+ { "command": "ocr.comment.discard", "title": "忽略" },
+ { "command": "ocr.comment.falsePositive", "title": "误报" }
+ ],
+ "menus": {
+ "comments/commentThread/title": [
+ { "command": "ocr.comment.apply", "group": "navigation@1", "when": "commentController == ocr-review && commentThread == pending" },
+ { "command": "ocr.comment.discard", "group": "navigation@2", "when": "commentController == ocr-review && commentThread =~ /^pending/" }
+ ]
+ }
+ },
+ "scripts": {
+ "compile": "webpack --mode development",
+ "watch": "webpack --mode development --watch",
+ "build": "webpack --mode production",
+ "test": "jest",
+ "lint": "eslint src --ext ts,tsx",
+ "package": "vsce package --no-yarn",
+ "vscode:prepublish": "yarn build"
+ },
+ "devDependencies": {
+ "@types/node": "^18.0.0",
+ "@types/vscode": "^1.74.0",
+ "@types/jest": "^29.5.0",
+ "ts-jest": "^29.1.0",
+ "jest": "^29.7.0",
+ "ts-loader": "^9.5.0",
+ "typescript": "^5.3.0",
+ "webpack": "^5.89.0",
+ "webpack-cli": "^5.1.0",
+ "css-loader": "^6.8.0",
+ "style-loader": "^3.3.0",
+ "eslint": "^8.56.0",
+ "@typescript-eslint/parser": "^6.18.0",
+ "@typescript-eslint/eslint-plugin": "^6.18.0",
+ "@vscode/vsce": "^3.0.0"
+ },
+ "dependencies": {
+ "preact": "^10.19.0"
+ }
+}
diff --git a/extensions/vscode/prototype.html b/extensions/vscode/prototype.html
new file mode 100644
index 0000000..de248d6
--- /dev/null
+++ b/extensions/vscode/prototype.html
@@ -0,0 +1,1833 @@
+
+
+
+
+
+
+OCR · VSCode 插件 UI 原型
+
+
+
+
+
+
+
空闲
+
审查中
+
完成
+
无问题
+
已取消
+
失败
+
+
配置:引导
+
配置:列表
+
配置:表单
+
+
+
+
+
+
+
+
+
+
+ (编辑器区域 · 仅原型展示)
+
+
+
38 import { Request, Response } from 'express' ;
+
39
+
40 export async function getUser (req: Request , res: Response ) {
+
41 const userId = req.params.id;
+
42 const result = await db.query (`SELECT * FROM users WHERE id = ${ userId}` );
+
+
+
+
[未处理]
+
+
+ 应用并下一个
+ 忽略并下一个
+ 误报并下一个
+
+
+
+
43 if (!result.rows.length) {
+
44 return res.status (404).json ({ error: 'Not found' });
+
45 }
+
46 return res.json (result.rows[0]);
+
47 }
+
48
+
49 // TODO: add input validation
+
50 export async function updateUser (req: Request , res: Response ) {
+
+
+
+
+
+
+
diff --git a/extensions/vscode/resources/icon-old.svg b/extensions/vscode/resources/icon-old.svg
new file mode 100644
index 0000000..3ce9a0e
--- /dev/null
+++ b/extensions/vscode/resources/icon-old.svg
@@ -0,0 +1 @@
+
diff --git a/extensions/vscode/resources/icon.svg b/extensions/vscode/resources/icon.svg
new file mode 100644
index 0000000..7a0e418
--- /dev/null
+++ b/extensions/vscode/resources/icon.svg
@@ -0,0 +1,21 @@
+
+
+
+
+
diff --git a/extensions/vscode/src/extension/commands.ts b/extensions/vscode/src/extension/commands.ts
new file mode 100644
index 0000000..52858b2
--- /dev/null
+++ b/extensions/vscode/src/extension/commands.ts
@@ -0,0 +1,28 @@
+import * as vscode from 'vscode';
+import { COMMANDS } from '../shared/constants';
+import { CommentProvider } from './providers/CommentProvider';
+
+export function registerCommands(comments: CommentProvider): vscode.Disposable {
+ const subs: vscode.Disposable[] = [];
+ const reg = (id: string, fn: (...args: any[]) => any) =>
+ subs.push(vscode.commands.registerCommand(id, fn));
+
+ // 标题栏按钮传入的是 CommentThread,侧边栏 / Markdown 链接传入的是 index
+ const idxOf = (arg: vscode.CommentThread | number): number =>
+ typeof arg === 'number' ? arg : comments.indexOfThread(arg);
+
+ reg(COMMANDS.commentApply, (arg: vscode.CommentThread | number) => {
+ const i = idxOf(arg);
+ if (i >= 0) comments.apply(i);
+ });
+ reg(COMMANDS.commentDiscard, (arg: vscode.CommentThread | number) => {
+ const i = idxOf(arg);
+ if (i >= 0) comments.discard(i);
+ });
+ reg(COMMANDS.commentFalsePositive, (arg: vscode.CommentThread | number) => {
+ const i = idxOf(arg);
+ if (i >= 0) comments.falsePositive(i);
+ });
+
+ return vscode.Disposable.from(...subs);
+}
diff --git a/extensions/vscode/src/extension/extension.ts b/extensions/vscode/src/extension/extension.ts
new file mode 100644
index 0000000..33704f1
--- /dev/null
+++ b/extensions/vscode/src/extension/extension.ts
@@ -0,0 +1,32 @@
+import * as vscode from 'vscode';
+import { SIDEBAR_VIEW_ID } from '../shared/constants';
+import { CliService } from './services/CliService';
+import { ConfigService } from './services/ConfigService';
+import { GitService } from './services/GitService';
+import { CommentProvider } from './providers/CommentProvider';
+import { SidebarProvider } from './providers/SidebarProvider';
+import { registerCommands } from './commands';
+
+let disposables: vscode.Disposable[] = [];
+
+export function activate(context: vscode.ExtensionContext): void {
+ const extensionUri = context.extensionUri;
+ const output = vscode.window.createOutputChannel('Open Code Review');
+ const cli = new CliService('ocr');
+ const config = new ConfigService(cli);
+ const git = new GitService(output);
+ const comments = new CommentProvider(extensionUri);
+
+ const sidebar = new SidebarProvider(extensionUri, cli, config, git, comments);
+ const viewReg = vscode.window.registerWebviewViewProvider(SIDEBAR_VIEW_ID, sidebar);
+
+ const cmdReg = registerCommands(comments);
+
+ disposables.push(viewReg, cmdReg, comments, output);
+ context.subscriptions.push(...disposables);
+}
+
+export function deactivate(): void {
+ disposables.forEach((d) => d.dispose());
+ disposables = [];
+}
diff --git a/extensions/vscode/src/extension/providers/CommentProvider.ts b/extensions/vscode/src/extension/providers/CommentProvider.ts
new file mode 100644
index 0000000..bea8f30
--- /dev/null
+++ b/extensions/vscode/src/extension/providers/CommentProvider.ts
@@ -0,0 +1,168 @@
+import * as vscode from 'vscode';
+import { ReviewComment, CommentStatus, CommentSyncState } from '../../shared/types';
+import { COMMENT_CONTROLLER_ID } from '../../shared/constants';
+import { LineOffsetTracker } from './lineOffset';
+
+export class CommentProvider {
+ private controller: vscode.CommentController;
+ // 以 comment 在 result.comments 中的原始下标为 key,与 webview 共用同一索引空间。
+ // 打不开的文件(如目录)没有 thread,但下标依旧保留,避免错位。
+ private threads = new Map();
+ private comments: ReviewComment[] = [];
+ private status = new Map();
+ private offsets = new LineOffsetTracker();
+ private syncListeners: Array<(s: CommentSyncState[]) => void> = [];
+
+ constructor(private extensionUri: vscode.Uri) {
+ this.controller = vscode.comments.createCommentController(COMMENT_CONTROLLER_ID, 'Open Code Review');
+ }
+
+ onSync(fn: (s: CommentSyncState[]) => void): void {
+ this.syncListeners.push(fn);
+ }
+
+ private emitSync(): void {
+ const states: CommentSyncState[] = this.comments.map((_, i) => ({
+ index: i, status: this.status.get(i) ?? 'pending',
+ }));
+ this.syncListeners.forEach((fn) => fn(states));
+ }
+
+ /**
+ * 展示审查评论。
+ * @param inEditor 是否在编辑器内创建 CommentThread。仅工作区模式为 true;
+ * 分支对比/单次提交模式下被审查代码不在当前工作区,行号会错位,故只在侧边栏展示。
+ */
+ async show(comments: ReviewComment[], inEditor = true): Promise {
+ this.clear();
+ // 不重排:保持与 webview(result.comments)相同的顺序与下标
+ this.comments = comments;
+ const root = vscode.workspace.workspaceFolders?.[0].uri.fsPath;
+ if (!root) return;
+
+ // 非工作区模式:只登记评论与状态供侧边栏同步,不在编辑器内放置 thread。
+ if (!inEditor) {
+ for (let i = 0; i < this.comments.length; i++) this.status.set(i, 'pending');
+ this.emitSync();
+ return;
+ }
+
+ let firstShown = -1;
+ for (let i = 0; i < this.comments.length; i++) {
+ const c = this.comments[i];
+ this.status.set(i, 'pending');
+ try {
+ const uri = vscode.Uri.file(`${root}/${c.path}`);
+ const doc = await vscode.workspace.openTextDocument(uri);
+ const range = new vscode.Range(Math.max(0, c.startLine - 1), 0, Math.max(0, c.endLine - 1), 0);
+ const body = this.renderBody(c, i, 'pending');
+ const thread = this.controller.createCommentThread(doc.uri, range, [{
+ body, mode: vscode.CommentMode.Preview,
+ author: { name: '⏳ [未处理]' },
+ }]);
+ thread.canReply = false;
+ thread.label = `Code Review (${i + 1} / ${this.comments.length})`;
+ // 有代码建议 → 'pending'(显示应用+忽略);无建议 → 'pendingNoSuggestion'(仅忽略)
+ thread.contextValue = this.hasSuggestion(c) ? 'pending' : 'pendingNoSuggestion';
+ thread.collapsibleState = vscode.CommentThreadCollapsibleState.Expanded;
+ this.threads.set(i, thread);
+ if (firstShown < 0) firstShown = i;
+ } catch { /* 文件打不开(如目录)则无 thread,但保留下标 */ }
+ }
+ if (firstShown >= 0) await this.jumpTo(firstShown);
+ this.emitSync();
+ }
+
+ private hasSuggestion(c: ReviewComment): boolean {
+ return !!(c.suggestionCode && c.suggestionCode.trim());
+ }
+
+ private renderBody(c: ReviewComment, _index: number, _status: CommentStatus): vscode.MarkdownString {
+ let md = c.content;
+ if (this.hasSuggestion(c)) {
+ md += `\n***\n\`\`\`diff\n${c.suggestionCode}\n\`\`\``;
+ } else {
+ md += `\n***\n_💡 无代码建议,请手动处理_`;
+ }
+ const s = new vscode.MarkdownString(md);
+ s.isTrusted = true;
+ return s;
+ }
+
+ async apply(index: number): Promise {
+ const c = this.comments[index];
+ if (!c) return;
+ const root = vscode.workspace.workspaceFolders?.[0].uri.fsPath;
+ if (!root) return;
+ const uri = vscode.Uri.file(`${root}/${c.path}`);
+ const doc = await vscode.workspace.openTextDocument(uri);
+ const before = doc.lineCount;
+ const start = Math.max(0, this.offsets.adjusted(c.path, c.startLine) - 1);
+ const end = Math.min(doc.lineCount - 1, this.offsets.adjusted(c.path, c.endLine) - 1);
+ if (end < start) {
+ vscode.window.showErrorMessage('应用失败:代码位置已失效,请刷新后重试。');
+ return;
+ }
+ const range = new vscode.Range(start, 0, end, doc.lineAt(end).text.length);
+ const hasSuggestion = !!(c.suggestionCode && c.suggestionCode.trim());
+
+ // 用 WorkspaceEdit 而非 editor.edit:后者要求目标编辑器为活动编辑器,
+ // 从评论标题栏按钮触发时焦点在评论控件上,会静默返回 false 导致“点不动”。
+ const edit = new vscode.WorkspaceEdit();
+ if (hasSuggestion) edit.replace(uri, range, c.suggestionCode!);
+ else edit.delete(uri, range);
+ const ok = await vscode.workspace.applyEdit(edit);
+ if (!ok) {
+ vscode.window.showErrorMessage('应用失败:无法修改文件,请检查文件是否被占用或处于只读状态。');
+ return;
+ }
+ await doc.save();
+ this.offsets.record(c.path, c.startLine, doc.lineCount - before);
+ await vscode.window.showTextDocument(doc, { selection: new vscode.Range(start, 0, start, 0), preview: false });
+ this.setStatus(index, 'applied');
+ }
+
+ discard(index: number): void { this.setStatus(index, 'discarded'); }
+ falsePositive(index: number): void { this.setStatus(index, 'falsePositive'); }
+
+ private setStatus(index: number, status: CommentStatus): void {
+ this.status.set(index, status);
+ const thread = this.threads.get(index);
+ if (thread) {
+ const label = { applied: '✅ [已应用]', discarded: '✅ [已忽略]', falsePositive: '✅ [已误报]', pending: '⏳ [未处理]' }[status];
+ thread.comments = [{ ...thread.comments[0], author: { name: label }, body: this.renderBody(this.comments[index], index, status) }] as any;
+ thread.contextValue = status;
+ thread.collapsibleState = vscode.CommentThreadCollapsibleState.Collapsed;
+ }
+ this.emitSync();
+ }
+
+ async jumpTo(index: number): Promise {
+ const thread = this.threads.get(index);
+ if (!thread) {
+ const c = this.comments[index];
+ if (c) vscode.window.showWarningMessage(`无法定位到 ${c.path}:该路径不是可打开的文件。`);
+ return;
+ }
+ await vscode.window.showTextDocument(thread.uri, { selection: thread.range, preview: false });
+ thread.collapsibleState = vscode.CommentThreadCollapsibleState.Expanded;
+ }
+
+ indexOfThread(thread: vscode.CommentThread): number {
+ for (const [i, t] of this.threads) if (t === thread) return i;
+ return -1;
+ }
+
+ clear(): void {
+ this.threads.forEach((t) => t.dispose());
+ this.threads.clear();
+ this.comments = [];
+ this.status.clear();
+ this.offsets.clear();
+ }
+
+ dispose(): void {
+ this.clear();
+ this.controller.dispose();
+ }
+}
diff --git a/extensions/vscode/src/extension/providers/SidebarProvider.ts b/extensions/vscode/src/extension/providers/SidebarProvider.ts
new file mode 100644
index 0000000..20eeb27
--- /dev/null
+++ b/extensions/vscode/src/extension/providers/SidebarProvider.ts
@@ -0,0 +1,125 @@
+import * as vscode from 'vscode';
+import { HostToWebview, WebviewToHost } from '../../shared/messages';
+import { FileChange } from '../../shared/types';
+import { CliService } from '../services/CliService';
+import { ConfigService } from '../services/ConfigService';
+import { GitService } from '../services/GitService';
+import { ReviewSession } from '../services/ReviewSession';
+import { CommentProvider } from './CommentProvider';
+
+export class SidebarProvider implements vscode.WebviewViewProvider {
+ private view?: vscode.WebviewView;
+ private session?: ReviewSession;
+
+ constructor(
+ private extensionUri: vscode.Uri,
+ private cli: CliService,
+ private config: ConfigService,
+ private git: GitService,
+ private comments: CommentProvider,
+ ) {
+ this.comments.onSync((states) => this.post({ type: 'commentSync', comments: states }));
+ }
+
+ resolveWebviewView(view: vscode.WebviewView): void {
+ this.view = view;
+ view.webview.options = { enableScripts: true, localResourceRoots: [this.extensionUri] };
+ view.webview.html = this.html(view.webview);
+ view.webview.onDidReceiveMessage((msg: WebviewToHost) => this.handle(msg));
+ }
+
+ private post(msg: HostToWebview): void {
+ this.view?.webview.postMessage(msg);
+ }
+
+ private async handle(msg: WebviewToHost): Promise {
+ const cwd = vscode.workspace.workspaceFolders?.[0].uri.fsPath ?? process.cwd();
+ switch (msg.type) {
+ case 'ready': {
+ const config = this.config.read();
+ const gitState = await this.git.getState('workspace');
+ this.post({ type: 'init', config, gitState });
+ break;
+ }
+ case 'getGitState': {
+ this.post({ type: 'gitState', gitState: await this.git.getState(msg.mode) });
+ break;
+ }
+ case 'getModeFiles': {
+ let files: FileChange[] = [];
+ if (msg.mode === 'branch' && msg.from && msg.to) {
+ files = await this.git.getBranchDiff(msg.from, msg.to);
+ } else if (msg.mode === 'commit' && msg.commit) {
+ files = await this.git.getCommitFiles(msg.commit);
+ }
+ this.post({ type: 'modeFiles', mode: msg.mode, files });
+ break;
+ }
+ case 'openFileDiff':
+ await this.git.openDiff({
+ path: msg.path, status: msg.status, mode: msg.mode,
+ from: msg.from, to: msg.to, commit: msg.commit,
+ });
+ break;
+ case 'startReview': {
+ this.session = new ReviewSession(this.cli, cwd);
+ // 仅工作区模式在编辑器内放置评论 thread;分支/提交模式代码不在工作区,会错位。
+ const inEditor = msg.options.mode === 'workspace';
+ await this.session.run(msg.options, {
+ onState: (state, error) => this.post({ type: 'stateChange', state, error }),
+ onLog: (line) => this.post({ type: 'logLine', line }),
+ onDone: (result) => {
+ this.post({ type: 'reviewDone', result });
+ if (result.comments.length) this.comments.show(result.comments, inEditor);
+ },
+ });
+ break;
+ }
+ case 'cancelReview':
+ this.session?.cancel({ onState: (state) => this.post({ type: 'stateChange', state }) });
+ break;
+ case 'getConfig':
+ this.post({ type: 'config', config: this.config.read() });
+ break;
+ case 'setConfig':
+ await this.config.set(msg.key, msg.value);
+ this.post({ type: 'config', config: this.config.read() });
+ break;
+ case 'testConnection': {
+ const r = await this.cli.testConnection();
+ this.post({ type: 'connectionResult', ok: r.ok, message: r.message });
+ break;
+ }
+ case 'checkCli': {
+ this.post({ type: 'cliStatus', installed: await this.cli.isAvailable() });
+ break;
+ }
+ case 'installCli': {
+ const ok = await this.cli.install((line) => this.post({ type: 'installLog', line }));
+ this.post({ type: 'installDone', ok });
+ this.post({ type: 'cliStatus', installed: await this.cli.isAvailable() });
+ break;
+ }
+ case 'jumpToComment':
+ await this.comments.jumpTo(msg.index);
+ break;
+ case 'commentAction':
+ if (msg.action === 'apply') await this.comments.apply(msg.index);
+ else if (msg.action === 'discard') this.comments.discard(msg.index);
+ else this.comments.falsePositive(msg.index);
+ break;
+ }
+ }
+
+ private html(webview: vscode.Webview): string {
+ const scriptUri = webview.asWebviewUri(vscode.Uri.joinPath(this.extensionUri, 'out', 'webview.js'));
+ const nonce = String(Date.now());
+ return `
+
+
+
+
+
+`;
+ }
+}
diff --git a/extensions/vscode/src/extension/providers/__tests__/lineOffset.test.ts b/extensions/vscode/src/extension/providers/__tests__/lineOffset.test.ts
new file mode 100644
index 0000000..e05e6b9
--- /dev/null
+++ b/extensions/vscode/src/extension/providers/__tests__/lineOffset.test.ts
@@ -0,0 +1,25 @@
+// src/extension/providers/__tests__/lineOffset.test.ts
+import { LineOffsetTracker } from '../lineOffset';
+
+describe('LineOffsetTracker', () => {
+ it('无变更时返回原行号', () => {
+ const t = new LineOffsetTracker();
+ expect(t.adjusted('a.ts', 10)).toBe(10);
+ });
+ it('在某行之前插入若干行,后续行号顺移', () => {
+ const t = new LineOffsetTracker();
+ t.record('a.ts', 5, +2); // 第5行起增加2行
+ expect(t.adjusted('a.ts', 10)).toBe(12);
+ expect(t.adjusted('a.ts', 3)).toBe(3); // 之前的行不受影响
+ });
+ it('删除行使后续行号回退', () => {
+ const t = new LineOffsetTracker();
+ t.record('a.ts', 5, -1);
+ expect(t.adjusted('a.ts', 10)).toBe(9);
+ });
+ it('不同文件互不影响', () => {
+ const t = new LineOffsetTracker();
+ t.record('a.ts', 1, +5);
+ expect(t.adjusted('b.ts', 10)).toBe(10);
+ });
+});
diff --git a/extensions/vscode/src/extension/providers/lineOffset.ts b/extensions/vscode/src/extension/providers/lineOffset.ts
new file mode 100644
index 0000000..cf93d77
--- /dev/null
+++ b/extensions/vscode/src/extension/providers/lineOffset.ts
@@ -0,0 +1,20 @@
+export class LineOffsetTracker {
+ private records = new Map>();
+
+ record(file: string, line: number, delta: number): void {
+ const arr = this.records.get(file) ?? [];
+ arr.push({ line, delta });
+ this.records.set(file, arr);
+ }
+
+ adjusted(file: string, line: number): number {
+ const arr = this.records.get(file) ?? [];
+ let offset = 0;
+ for (const r of arr) if (r.line < line) offset += r.delta;
+ return Math.max(0, line + offset);
+ }
+
+ clear(): void {
+ this.records.clear();
+ }
+}
diff --git a/extensions/vscode/src/extension/services/CliService.ts b/extensions/vscode/src/extension/services/CliService.ts
new file mode 100644
index 0000000..3a8972d
--- /dev/null
+++ b/extensions/vscode/src/extension/services/CliService.ts
@@ -0,0 +1,101 @@
+import { spawn } from 'child_process';
+import { CliResult, CliRunOptions, LogLine } from '../../shared/types';
+import { buildReviewArgs, extractCliError, parseCliResult, parseLogLine } from './cliParse';
+import { getShellEnv, resolveBin } from './shellEnv';
+
+export class CliService {
+ private current: ReturnType | null = null;
+
+ constructor(private cliPath: string = 'ocr') {}
+
+ async isAvailable(): Promise {
+ return new Promise((resolve) => {
+ const p = spawn(resolveBin(this.cliPath), ['--version'], { env: getShellEnv() });
+ let errored = false;
+ p.on('error', () => { errored = true; resolve(false); });
+ p.on('close', () => { if (!errored) resolve(true); });
+ });
+ }
+
+ /** 全局安装 ocr CLI,流式回显 npm 日志,按 exit code 返回是否成功。 */
+ install(onLog: (l: LogLine) => void): Promise {
+ return new Promise((resolve) => {
+ const args = [
+ 'install', '-g', '@alibaba-group/open-code-review',
+ '--loglevel', 'http', '--no-progress',
+ ];
+ onLog({ text: `$ npm ${args.join(' ')}`, level: 'info' });
+ const proc = spawn(resolveBin('npm'), args, {
+ // 非 TTY 下 npm 默认静默进度条;强制关进度条并用行式输出
+ env: { ...getShellEnv(), npm_config_progress: 'false', npm_config_color: 'false' },
+ shell: process.platform === 'win32',
+ });
+ // npm 输出可能跨 chunk 断行,按 \r\n 归一并逐行 emit,尾部残行留到下次。
+ const emitLines = (() => {
+ let buf = '';
+ return (chunk: string, level: LogLine['level'], flush = false) => {
+ buf += chunk.replace(/\r/g, '\n');
+ const parts = buf.split('\n');
+ buf = flush ? '' : (parts.pop() ?? '');
+ for (const line of parts) if (line.trim()) onLog({ text: line, level });
+ if (flush && chunk.trim() && parts.length === 0) onLog({ text: chunk, level });
+ };
+ })();
+ proc.stdout?.on('data', (d) => emitLines(d.toString(), 'info'));
+ proc.stderr?.on('data', (d) => emitLines(d.toString(), 'info'));
+ proc.on('error', (err) => { onLog({ text: String(err), level: 'error' }); resolve(false); });
+ proc.on('close', (code) => {
+ emitLines('', 'info', true);
+ onLog({ text: code === 0 ? '✓ 安装完成' : `✗ 安装失败 (exit ${code})`, level: code === 0 ? 'info' : 'error' });
+ resolve(code === 0);
+ });
+ });
+ }
+
+ /** 运行任意参数,流式回调日志,结束返回 stdout 全文。退出码非 0 时 reject,并带上 CLI 报错文本。 */
+ runRaw(args: string[], cwd: string, onLog: (l: LogLine) => void): Promise {
+ return new Promise((resolve, reject) => {
+ const proc = spawn(resolveBin(this.cliPath), args, { cwd, env: getShellEnv() });
+ this.current = proc;
+ let stdout = '';
+ let stderr = '';
+ proc.stdout.on('data', (d) => { stdout += d.toString(); });
+ proc.stderr.on('data', (d) => {
+ const text = d.toString();
+ stderr += text;
+ for (const line of text.split('\n')) {
+ const parsed = parseLogLine(line);
+ if (parsed) onLog(parsed);
+ }
+ });
+ proc.on('error', (err) => { this.current = null; reject(err); });
+ proc.on('close', (code) => {
+ this.current = null;
+ if (code === 0) { resolve(stdout); return; }
+ reject(new Error(extractCliError(stderr) || `CLI exited with code ${code}`));
+ });
+ });
+ }
+
+ async review(opts: CliRunOptions, cwd: string, onLog: (l: LogLine) => void): Promise {
+ const stdout = await this.runRaw(buildReviewArgs(opts), cwd, onLog);
+ return parseCliResult(stdout);
+ }
+
+ async testConnection(): Promise<{ ok: boolean; message?: string }> {
+ try {
+ await this.runRaw(['llm', 'test'], process.cwd(), () => {});
+ return { ok: true };
+ } catch (e) {
+ return { ok: false, message: e instanceof Error ? e.message : String(e) };
+ }
+ }
+
+ cancel(): void {
+ if (this.current && this.current.pid) {
+ this.current.kill('SIGTERM');
+ const proc = this.current;
+ setTimeout(() => { if (!proc.killed) proc.kill('SIGKILL'); }, 3000);
+ }
+ }
+}
diff --git a/extensions/vscode/src/extension/services/ConfigService.ts b/extensions/vscode/src/extension/services/ConfigService.ts
new file mode 100644
index 0000000..f2eb62b
--- /dev/null
+++ b/extensions/vscode/src/extension/services/ConfigService.ts
@@ -0,0 +1,29 @@
+import { readFileSync, existsSync } from 'fs';
+import { homedir } from 'os';
+import { join } from 'path';
+import { OcrConfig } from '../../shared/types';
+import { CliService } from './CliService';
+import { parseConfig, toConfigSetArgs } from './configParse';
+
+export class ConfigService {
+ constructor(private cli: CliService) {}
+
+ private configPath(): string {
+ return join(homedir(), '.opencodereview', 'config.json');
+ }
+
+ read(): OcrConfig | null {
+ const p = this.configPath();
+ if (!existsSync(p)) return null;
+ try {
+ return parseConfig(readFileSync(p, 'utf8'));
+ } catch {
+ return null;
+ }
+ }
+
+ async set(key: string, value: string): Promise {
+ await this.cli.runRaw(toConfigSetArgs(key, value), process.cwd(), () => {});
+ return this.read();
+ }
+}
diff --git a/extensions/vscode/src/extension/services/GitService.ts b/extensions/vscode/src/extension/services/GitService.ts
new file mode 100644
index 0000000..6d6825f
--- /dev/null
+++ b/extensions/vscode/src/extension/services/GitService.ts
@@ -0,0 +1,221 @@
+import * as vscode from 'vscode';
+import { execFile } from 'child_process';
+import { GitState, CommitInfo, FileChange, ReviewMode } from '../../shared/types';
+import { parsePorcelain, parseNameStatus, pickRepoRoot } from './gitMap';
+
+export class GitService {
+ private api: any | null = null;
+
+ constructor(private log?: vscode.OutputChannel) {}
+
+ private trace(msg: string): void {
+ this.log?.appendLine(`[git] ${msg}`);
+ }
+
+ private async ensureApi(): Promise {
+ if (this.api) return this.api;
+ const ext = vscode.extensions.getExtension('vscode.git');
+ if (!ext) return null;
+ const exports = ext.isActive ? ext.exports : await ext.activate();
+ if (!exports?.getAPI) return null;
+ this.api = exports.getAPI(1);
+ return this.api;
+ }
+
+ /**
+ * 选出与 workspace 匹配的仓库。嵌套仓库场景下 repositories 顺序不稳定,
+ * 不能直接取 [0],否则会漂移到子仓库。
+ */
+ private selectRepo(api: any): any | null {
+ const repos: any[] = api.repositories;
+ if (!repos || repos.length === 0) return null;
+ const ws = vscode.workspace.workspaceFolders?.[0].uri.fsPath;
+ const root = pickRepoRoot(repos.map((r) => r.rootUri?.fsPath ?? ''), ws);
+ return repos.find((r) => (r.rootUri?.fsPath ?? '') === root) ?? repos[0];
+ }
+
+ /** 等待至少一个仓库就绪(git 扩展异步扫描,首次可能为空)。 */
+ private async waitForRepo(timeoutMs = 5000): Promise {
+ const api = await this.ensureApi();
+ if (!api) return null;
+ if (api.repositories.length > 0) return this.selectRepo(api);
+
+ return new Promise((resolve) => {
+ let done = false;
+ const finish = (repo: any | null) => {
+ if (done) return;
+ done = true;
+ disposable?.dispose();
+ clearInterval(poll);
+ clearTimeout(timer);
+ resolve(repo);
+ };
+ const disposable = api.onDidOpenRepository?.(() => finish(this.selectRepo(api)));
+ const poll = setInterval(() => {
+ if (api.repositories.length > 0) finish(this.selectRepo(api));
+ }, 200);
+ const timer = setTimeout(() => finish(this.selectRepo(api)), timeoutMs);
+ });
+ }
+
+ async getState(mode: ReviewMode): Promise {
+ const empty: GitState = { branches: [], currentBranch: '', recentCommits: [], workspaceFiles: [] };
+ const repo = await this.waitForRepo();
+ if (!repo) {
+ this.trace(`getState(${mode}): no repo`);
+ return empty;
+ }
+
+ let currentBranch = '';
+ try {
+ currentBranch = repo.state.HEAD?.name || '';
+ } catch { /* ignore */ }
+
+ let branches: string[] = [];
+ try {
+ const refs = await repo.getBranches({ remote: true });
+ branches = refs.map((r: any) => r.name).filter(Boolean);
+ } catch { /* ignore */ }
+
+ let recentCommits: CommitInfo[] = [];
+ try {
+ const commits = await repo.log({ maxEntries: 20 });
+ recentCommits = commits.map((c: any) => ({
+ sha: c.hash.slice(0, 7),
+ message: c.message.split('\n')[0],
+ relativeTime: formatRelative(c.authorDate),
+ }));
+ } catch { /* ignore */ }
+
+ // 工作区变更直接走 git status --porcelain,避免依赖扩展懒填充的 state 数组。
+ let workspaceFiles: FileChange[] = [];
+ try {
+ const root: string = repo.rootUri?.fsPath
+ ?? vscode.workspace.workspaceFolders?.[0].uri.fsPath
+ ?? process.cwd();
+ const out = await runGit(root, ['status', '--porcelain']);
+ workspaceFiles = parsePorcelain(out);
+ this.trace(`getState(${mode}): root=${root} porcelainBytes=${out.length} files=${workspaceFiles.length}`);
+ } catch (e) {
+ this.trace(`getState(${mode}): status failed: ${e instanceof Error ? e.message : String(e)}`);
+ }
+
+ return { branches, currentBranch, recentCommits, workspaceFiles };
+ }
+
+ /** 分支对比:merge-base 三点 diff。 */
+ async getBranchDiff(from: string, to: string): Promise {
+ const root = await this.repoRoot();
+ if (!root || !from || !to) return [];
+ try {
+ const out = await runGit(root, ['diff', '--name-status', `${from}...${to}`]);
+ const files = parseNameStatus(out);
+ this.trace(`getBranchDiff(${from}...${to}): files=${files.length}`);
+ return files;
+ } catch (e) {
+ this.trace(`getBranchDiff failed: ${e instanceof Error ? e.message : String(e)}`);
+ return [];
+ }
+ }
+
+ /** 单次提交:该 commit 相对父提交的改动文件。 */
+ async getCommitFiles(sha: string): Promise {
+ const root = await this.repoRoot();
+ if (!root || !sha) return [];
+ try {
+ const out = await runGit(root, ['show', '--name-status', '--format=', sha]);
+ const files = parseNameStatus(out);
+ this.trace(`getCommitFiles(${sha}): files=${files.length}`);
+ return files;
+ } catch (e) {
+ this.trace(`getCommitFiles failed: ${e instanceof Error ? e.message : String(e)}`);
+ return [];
+ }
+ }
+
+ private async repoRoot(): Promise {
+ const repo = await this.waitForRepo();
+ if (!repo) return null;
+ return repo.rootUri?.fsPath
+ ?? vscode.workspace.workspaceFolders?.[0].uri.fsPath
+ ?? process.cwd();
+ }
+
+ /** 在 VSCode 原生 diff 视图中打开某个待审查文件。三种模式各自决定 diff 的左右两侧。 */
+ async openDiff(opts: {
+ path: string; status: FileChange['status'];
+ mode: ReviewMode; from?: string; to?: string; commit?: string;
+ }): Promise {
+ const api = await this.ensureApi();
+ const root = await this.repoRoot();
+ if (!api || !root) return;
+
+ const fileUri = vscode.Uri.file(`${root}/${opts.path}`);
+
+ // 二进制无法做文本 diff,直接打开文件本身。
+ if (opts.status === 'binary') {
+ try { await vscode.window.showTextDocument(fileUri, { preview: true }); } catch { /* ignore */ }
+ return;
+ }
+
+ // toGitUri(uri, '') 返回空文档,用于新增/删除时缺失的一侧。
+ const emptyRef = '';
+ let left: vscode.Uri;
+ let right: vscode.Uri;
+ let label: string;
+
+ if (opts.mode === 'workspace') {
+ left = api.toGitUri(fileUri, opts.status === 'added' ? emptyRef : 'HEAD');
+ right = opts.status === 'deleted' ? api.toGitUri(fileUri, emptyRef) : fileUri;
+ label = '工作区 ↔ HEAD';
+ } else if (opts.mode === 'commit' && opts.commit) {
+ left = api.toGitUri(fileUri, opts.status === 'added' ? emptyRef : `${opts.commit}^`);
+ right = opts.status === 'deleted' ? api.toGitUri(fileUri, emptyRef) : api.toGitUri(fileUri, opts.commit);
+ label = `${opts.commit}^ ↔ ${opts.commit}`;
+ } else if (opts.mode === 'branch' && opts.from && opts.to) {
+ // 文件列表用三点 diff(merge-base),逐文件 diff 也应以 merge-base 为基准。
+ const base = (await this.mergeBase(root, opts.from, opts.to)) || opts.from;
+ left = api.toGitUri(fileUri, opts.status === 'added' ? emptyRef : base);
+ right = opts.status === 'deleted' ? api.toGitUri(fileUri, emptyRef) : api.toGitUri(fileUri, opts.to);
+ label = `${opts.from}...${opts.to}`;
+ } else {
+ return;
+ }
+
+ const title = `${opts.path} (${label})`;
+ try {
+ await vscode.commands.executeCommand('vscode.diff', left, right, title, { preview: true });
+ } catch (e) {
+ this.trace(`openDiff failed: ${e instanceof Error ? e.message : String(e)}`);
+ }
+ }
+
+ private async mergeBase(root: string, from: string, to: string): Promise {
+ try {
+ const out = await runGit(root, ['merge-base', from, to]);
+ return out.trim() || null;
+ } catch {
+ return null;
+ }
+ }
+}
+
+function runGit(cwd: string, args: string[]): Promise {
+ return new Promise((resolve, reject) => {
+ execFile('git', args, { cwd, maxBuffer: 10 * 1024 * 1024 }, (err, stdout) => {
+ if (err) reject(err);
+ else resolve(stdout);
+ });
+ });
+}
+
+function formatRelative(date?: Date): string {
+ if (!date) return '';
+ const diff = Date.now() - date.getTime();
+ const h = Math.floor(diff / 3.6e6);
+ if (h < 1) return '刚刚';
+ if (h < 24) return `${h} 小时前`;
+ const d = Math.floor(h / 24);
+ if (d === 1) return '昨天';
+ return `${d} 天前`;
+}
diff --git a/extensions/vscode/src/extension/services/ReviewSession.ts b/extensions/vscode/src/extension/services/ReviewSession.ts
new file mode 100644
index 0000000..279f8c1
--- /dev/null
+++ b/extensions/vscode/src/extension/services/ReviewSession.ts
@@ -0,0 +1,48 @@
+import { CliResult, CliRunOptions, LogLine, ReviewState } from '../../shared/types';
+import { CliService } from './CliService';
+
+export function resultToState(result: CliResult): ReviewState {
+ if (result.comments.length > 0) return 'done';
+ if (result.status === 'completed_with_errors') return 'failed';
+ return 'empty';
+}
+
+export interface SessionCallbacks {
+ onState: (state: ReviewState, error?: string) => void;
+ onLog: (line: LogLine) => void;
+ onDone: (result: CliResult) => void;
+}
+
+export class ReviewSession {
+ private cancelled = false;
+
+ constructor(private cli: CliService, private cwd: string) {}
+
+ async run(opts: CliRunOptions, cb: SessionCallbacks): Promise {
+ this.cancelled = false;
+ cb.onState('running');
+ try {
+ const result = await this.cli.review(opts, this.cwd, cb.onLog);
+ if (this.cancelled) {
+ cb.onState('cancelled');
+ return;
+ }
+ cb.onState(resultToState(result));
+ cb.onDone(result);
+ } catch (e) {
+ if (this.cancelled) {
+ cb.onState('cancelled');
+ } else {
+ const msg = e instanceof Error ? e.message : String(e);
+ cb.onLog({ text: `[ocr] ${msg}`, level: 'error' });
+ cb.onState('failed', msg);
+ }
+ }
+ }
+
+ cancel(cb: Pick): void {
+ this.cancelled = true;
+ this.cli.cancel();
+ cb.onState('cancelled');
+ }
+}
diff --git a/extensions/vscode/src/extension/services/__tests__/CliService.test.ts b/extensions/vscode/src/extension/services/__tests__/CliService.test.ts
new file mode 100644
index 0000000..42ae24d
--- /dev/null
+++ b/extensions/vscode/src/extension/services/__tests__/CliService.test.ts
@@ -0,0 +1,48 @@
+// src/extension/services/__tests__/CliService.test.ts
+process.env.OCR_SKIP_SHELL_RESOLVE = '1';
+import { CliService } from '../CliService';
+
+describe('CliService.isAvailable', () => {
+ it('node 一定存在 → true', async () => {
+ const svc = new CliService('node');
+ expect(await svc.isAvailable()).toBe(true);
+ });
+ it('不存在的命令 → false', async () => {
+ const svc = new CliService('definitely-not-a-real-binary-xyz');
+ expect(await svc.isAvailable()).toBe(false);
+ });
+});
+
+describe('CliService.runRaw', () => {
+ it('收集 stdout 并在结束时 resolve', async () => {
+ // 用 node 打印一段 JSON 模拟 ocr
+ const svc = new CliService('node');
+ const logs: string[] = [];
+ const out = await svc.runRaw(
+ ['-e', 'process.stdout.write(JSON.stringify({status:"success",comments:[]}))'],
+ '.', (line) => logs.push(line.text),
+ );
+ expect(out).toContain('"status":"success"');
+ });
+
+ it('退出码非 0 时 reject,并带上 stderr 中的 Error 文本', async () => {
+ const svc = new CliService('node');
+ await expect(svc.runRaw(
+ ['-e', 'process.stderr.write("Error: bad api key\\n"); process.exit(1)'],
+ '.', () => {},
+ )).rejects.toThrow('bad api key');
+ });
+});
+
+describe('CliService.testConnection', () => {
+ it('CLI 退出码非 0 → ok=false(不再误报连接成功)', async () => {
+ const svc = new CliService('node');
+ // 覆盖默认 ['llm','test'] 不可行,这里直接验证 runRaw 的失败传播逻辑
+ const r = await svc.runRaw(
+ ['-e', 'process.stderr.write("Error: connection refused\\n"); process.exit(1)'],
+ '.', () => {},
+ ).then(() => ({ ok: true }), (e: Error) => ({ ok: false, message: e.message }));
+ expect(r.ok).toBe(false);
+ expect((r as { message: string }).message).toContain('connection refused');
+ });
+});
diff --git a/extensions/vscode/src/extension/services/__tests__/ReviewSession.test.ts b/extensions/vscode/src/extension/services/__tests__/ReviewSession.test.ts
new file mode 100644
index 0000000..20f9a2e
--- /dev/null
+++ b/extensions/vscode/src/extension/services/__tests__/ReviewSession.test.ts
@@ -0,0 +1,20 @@
+// src/extension/services/__tests__/ReviewSession.test.ts
+import { resultToState } from '../ReviewSession';
+
+describe('resultToState', () => {
+ it('有 comments → done', () => {
+ expect(resultToState({ status: 'success', comments: [{} as any], warnings: [] })).toBe('done');
+ });
+ it('success 但无 comments → empty', () => {
+ expect(resultToState({ status: 'success', comments: [], warnings: [] })).toBe('empty');
+ });
+ it('skipped 无 comments → empty', () => {
+ expect(resultToState({ status: 'skipped', comments: [], warnings: [] })).toBe('empty');
+ });
+ it('completed_with_errors 无 comments → failed', () => {
+ expect(resultToState({ status: 'completed_with_errors', comments: [], warnings: [] })).toBe('failed');
+ });
+ it('completed_with_errors 有 comments → done', () => {
+ expect(resultToState({ status: 'completed_with_errors', comments: [{} as any], warnings: [] })).toBe('done');
+ });
+});
diff --git a/extensions/vscode/src/extension/services/__tests__/cliParse.test.ts b/extensions/vscode/src/extension/services/__tests__/cliParse.test.ts
new file mode 100644
index 0000000..25145a7
--- /dev/null
+++ b/extensions/vscode/src/extension/services/__tests__/cliParse.test.ts
@@ -0,0 +1,96 @@
+import { buildReviewArgs, extractCliError, parseCliResult, parseLogLine } from '../cliParse';
+
+describe('buildReviewArgs', () => {
+ it('workspace 模式加 --format json', () => {
+ expect(buildReviewArgs({ mode: 'workspace' }))
+ .toEqual(['review', '--format', 'json']);
+ });
+
+ it('branch 模式加 --from/--to', () => {
+ expect(buildReviewArgs({ mode: 'branch', from: 'main', to: 'dev' }))
+ .toEqual(['review', '--from', 'main', '--to', 'dev', '--format', 'json']);
+ });
+
+ it('commit 模式加 --commit', () => {
+ expect(buildReviewArgs({ mode: 'commit', commit: 'abc123' }))
+ .toEqual(['review', '--commit', 'abc123', '--format', 'json']);
+ });
+
+ it('customPrompt 追加 --background', () => {
+ expect(buildReviewArgs({ mode: 'workspace', customPrompt: '关注安全' }))
+ .toEqual(['review', '--format', 'json', '--background', '关注安全']);
+ });
+
+ it('concurrency 追加 --concurrency', () => {
+ expect(buildReviewArgs({ mode: 'workspace', concurrency: 4 }))
+ .toEqual(['review', '--format', 'json', '--concurrency', '4']);
+ });
+});
+
+describe('parseCliResult', () => {
+ it('解析 success + comments + summary,字段转 camelCase', () => {
+ const raw = JSON.stringify({
+ status: 'success',
+ comments: [{
+ path: 'src/a.ts', content: 'bug', start_line: 10, end_line: 12,
+ suggestion_code: 'fix', existing_code: 'old',
+ }],
+ summary: {
+ files_reviewed: 2, comments: 1, total_tokens: 100,
+ input_tokens: 80, output_tokens: 20, elapsed: '5s',
+ },
+ });
+ const r = parseCliResult(raw);
+ expect(r.status).toBe('success');
+ expect(r.comments[0]).toEqual({
+ path: 'src/a.ts', content: 'bug', startLine: 10, endLine: 12,
+ suggestionCode: 'fix', existingCode: 'old', thinking: undefined,
+ });
+ expect(r.summary?.filesReviewed).toBe(2);
+ });
+
+ it('skipped 状态无 comments', () => {
+ const raw = JSON.stringify({ status: 'skipped', message: 'No supported files changed.', comments: [] });
+ const r = parseCliResult(raw);
+ expect(r.status).toBe('skipped');
+ expect(r.comments).toEqual([]);
+ });
+
+ it('忽略 JSON 前的非 JSON 噪声行', () => {
+ const raw = '[ocr] some log\n{"status":"success","comments":[]}';
+ const r = parseCliResult(raw);
+ expect(r.status).toBe('success');
+ });
+});
+
+describe('extractCliError', () => {
+ it('优先提取 Error: 行并去掉前缀', () => {
+ const stderr = '[ocr] starting\nError: llm request failed: 401 unauthorized\n';
+ expect(extractCliError(stderr)).toBe('llm request failed: 401 unauthorized');
+ });
+ it('多个 Error 行取最后一个', () => {
+ const stderr = 'Error: first\nError: last';
+ expect(extractCliError(stderr)).toBe('last');
+ });
+ it('无 Error 行时取最后一行非空内容', () => {
+ expect(extractCliError('foo\nbar\n\n')).toBe('bar');
+ });
+ it('空 stderr → 空字符串', () => {
+ expect(extractCliError('')).toBe('');
+ });
+});
+
+describe('parseLogLine', () => {
+ it('普通 [ocr] 行 → info', () => {
+ expect(parseLogLine('[ocr] Reviewing src/a.ts')).toEqual({ text: '[ocr] Reviewing src/a.ts', level: 'info' });
+ });
+ it('含 Retrying 的行 → warn', () => {
+ expect(parseLogLine('[llm] Retrying in 1.46s (attempt 1/3)').level).toBe('warn');
+ });
+ it('含 WARNING 的行 → warn', () => {
+ expect(parseLogLine('[ocr] WARNING [x] f: m').level).toBe('warn');
+ });
+ it('空行 → null', () => {
+ expect(parseLogLine(' ')).toBeNull();
+ });
+});
diff --git a/extensions/vscode/src/extension/services/__tests__/configParse.test.ts b/extensions/vscode/src/extension/services/__tests__/configParse.test.ts
new file mode 100644
index 0000000..6095c5a
--- /dev/null
+++ b/extensions/vscode/src/extension/services/__tests__/configParse.test.ts
@@ -0,0 +1,32 @@
+// src/extension/services/__tests__/configParse.test.ts
+import { parseConfig, toConfigSetArgs } from '../configParse';
+
+describe('parseConfig', () => {
+ it('完整 config 转 camelCase', () => {
+ const raw = JSON.stringify({
+ llm: { url: 'u', auth_token: 't', model: 'm', use_anthropic: true, auth_header: 'x-api-key' },
+ language: 'Chinese',
+ });
+ expect(parseConfig(raw)).toEqual({
+ llm: { url: 'u', authToken: 't', model: 'm', useAnthropic: true, authHeader: 'x-api-key' },
+ language: 'Chinese',
+ });
+ });
+
+ it('缺字段时给默认值', () => {
+ const cfg = parseConfig('{}');
+ expect(cfg.llm.url).toBe('');
+ expect(cfg.llm.useAnthropic).toBe(false);
+ expect(cfg.language).toBe('Chinese');
+ });
+
+ it('空字符串 → null', () => {
+ expect(parseConfig('')).toBeNull();
+ });
+});
+
+describe('toConfigSetArgs', () => {
+ it('生成 config set 参数', () => {
+ expect(toConfigSetArgs('llm.model', 'opus')).toEqual(['config', 'set', 'llm.model', 'opus']);
+ });
+});
diff --git a/extensions/vscode/src/extension/services/__tests__/gitMap.test.ts b/extensions/vscode/src/extension/services/__tests__/gitMap.test.ts
new file mode 100644
index 0000000..3cf15a1
--- /dev/null
+++ b/extensions/vscode/src/extension/services/__tests__/gitMap.test.ts
@@ -0,0 +1,119 @@
+// src/extension/services/__tests__/gitMap.test.ts
+import { mapStatusCode, parsePorcelain, parseNameStatus, pickRepoRoot } from '../gitMap';
+
+describe('mapStatusCode', () => {
+ it('VSCode git Status 枚举映射到 FileChange.status', () => {
+ // VSCode Status: INDEX_ADDED=1, MODIFIED=5, DELETED=6, UNTRACKED=7 (示例值)
+ expect(mapStatusCode('A')).toBe('added');
+ expect(mapStatusCode('M')).toBe('modified');
+ expect(mapStatusCode('D')).toBe('deleted');
+ expect(mapStatusCode('R')).toBe('renamed');
+ expect(mapStatusCode('?')).toBe('added'); // untracked 视为 added
+ expect(mapStatusCode('X')).toBe('modified'); // 未知兜底
+ });
+});
+
+describe('parsePorcelain', () => {
+ it('解析各种状态', () => {
+ const out = [
+ 'M src/a.ts',
+ ' M src/b.ts',
+ 'A src/c.ts',
+ '?? src/d.ts',
+ 'D src/e.ts',
+ ].join('\n');
+ expect(parsePorcelain(out)).toEqual([
+ { path: 'src/a.ts', status: 'modified' },
+ { path: 'src/b.ts', status: 'modified' },
+ { path: 'src/c.ts', status: 'added' },
+ { path: 'src/d.ts', status: 'added' },
+ { path: 'src/e.ts', status: 'deleted' },
+ ]);
+ });
+
+ it('重命名取新路径', () => {
+ expect(parsePorcelain('R old/x.ts -> new/x.ts')).toEqual([
+ { path: 'new/x.ts', status: 'renamed' },
+ ]);
+ });
+
+ it('去重同一路径(同时暂存+工作区变更)', () => {
+ expect(parsePorcelain('MM src/a.ts')).toEqual([
+ { path: 'src/a.ts', status: 'modified' },
+ ]);
+ });
+
+ it('空输出返回空数组', () => {
+ expect(parsePorcelain('')).toEqual([]);
+ expect(parsePorcelain('\n \n')).toEqual([]);
+ });
+});
+
+describe('parseNameStatus', () => {
+ it('解析 git diff/show --name-status 输出', () => {
+ const out = [
+ 'M\tsrc/a.ts',
+ 'A\tsrc/b.ts',
+ 'D\tsrc/c.ts',
+ ].join('\n');
+ expect(parseNameStatus(out)).toEqual([
+ { path: 'src/a.ts', status: 'modified' },
+ { path: 'src/b.ts', status: 'added' },
+ { path: 'src/c.ts', status: 'deleted' },
+ ]);
+ });
+
+ it('重命名行 R old new 取新路径', () => {
+ expect(parseNameStatus('R100\told/x.ts\tnew/x.ts')).toEqual([
+ { path: 'new/x.ts', status: 'renamed' },
+ ]);
+ });
+
+ it('去重同一路径', () => {
+ expect(parseNameStatus('M\tsrc/a.ts\nM\tsrc/a.ts')).toEqual([
+ { path: 'src/a.ts', status: 'modified' },
+ ]);
+ });
+
+ it('空输出返回空数组', () => {
+ expect(parseNameStatus('')).toEqual([]);
+ expect(parseNameStatus('\n \n')).toEqual([]);
+ });
+});
+
+describe('pickRepoRoot', () => {
+ const ws = '/Users/lost/tre/copilot-union/code-chat';
+
+ it('精确匹配 workspace 根优先(嵌套子仓库不漂移)', () => {
+ // 子仓库 chat-ui 排在前面也应选中父 code-chat
+ const roots = ['/Users/lost/tre/copilot-union/code-chat/chat-ui', ws];
+ expect(pickRepoRoot(roots, ws)).toBe(ws);
+ });
+
+ it('无精确匹配时选 workspace 的祖先仓库', () => {
+ const parent = '/Users/lost/tre/copilot-union';
+ const roots = ['/Users/lost/tre/copilot-union/code-chat/chat-ui', parent];
+ expect(pickRepoRoot(roots, ws)).toBe(parent);
+ });
+
+ it('多个祖先时选最深(最长路径)的祖先', () => {
+ const grand = '/Users/lost/tre';
+ const parent = '/Users/lost/tre/copilot-union';
+ const roots = [grand, parent];
+ expect(pickRepoRoot(roots, ws)).toBe(parent);
+ });
+
+ it('都不匹配时退回第一个', () => {
+ const roots = ['/some/other/repo', '/another/repo'];
+ expect(pickRepoRoot(roots, ws)).toBe('/some/other/repo');
+ });
+
+ it('空候选返回 null', () => {
+ expect(pickRepoRoot([], ws)).toBeNull();
+ });
+
+ it('无 workspace 路径时退回第一个', () => {
+ const roots = ['/a/repo', '/b/repo'];
+ expect(pickRepoRoot(roots, undefined)).toBe('/a/repo');
+ });
+});
diff --git a/extensions/vscode/src/extension/services/__tests__/shellEnv.test.ts b/extensions/vscode/src/extension/services/__tests__/shellEnv.test.ts
new file mode 100644
index 0000000..f5de3bb
--- /dev/null
+++ b/extensions/vscode/src/extension/services/__tests__/shellEnv.test.ts
@@ -0,0 +1,30 @@
+// src/extension/services/__tests__/shellEnv.test.ts
+process.env.OCR_SKIP_SHELL_RESOLVE = '1';
+import { parseEnvBlock, getShellEnv } from '../shellEnv';
+
+const DELIM = '_OCR_ENV_DELIM_';
+
+describe('parseEnvBlock', () => {
+ it('解析分隔标记之间的 key=value', () => {
+ const stdout = `noise\n${DELIM}\nPATH=/usr/local/bin:/usr/bin\nFOO=bar\n${DELIM}\ntrailing`;
+ expect(parseEnvBlock(stdout)).toEqual({
+ PATH: '/usr/local/bin:/usr/bin',
+ FOO: 'bar',
+ });
+ });
+
+ it('value 中含 = 时只按首个 = 切分', () => {
+ const stdout = `${DELIM}\nKEY=a=b=c\n${DELIM}`;
+ expect(parseEnvBlock(stdout)).toEqual({ KEY: 'a=b=c' });
+ });
+
+ it('无分隔标记 → 空对象', () => {
+ expect(parseEnvBlock('PATH=/usr/bin')).toEqual({});
+ });
+});
+
+describe('getShellEnv', () => {
+ it('总是包含 PATH', () => {
+ expect(getShellEnv().PATH).toBeDefined();
+ });
+});
diff --git a/extensions/vscode/src/extension/services/cliParse.ts b/extensions/vscode/src/extension/services/cliParse.ts
new file mode 100644
index 0000000..c219bce
--- /dev/null
+++ b/extensions/vscode/src/extension/services/cliParse.ts
@@ -0,0 +1,70 @@
+import { CliResult, CliRunOptions, LogLine, ReviewComment } from '../../shared/types';
+
+export function buildReviewArgs(opts: CliRunOptions): string[] {
+ const args: string[] = ['review'];
+ if (opts.mode === 'branch') {
+ if (opts.from) args.push('--from', opts.from);
+ if (opts.to) args.push('--to', opts.to);
+ } else if (opts.mode === 'commit') {
+ if (opts.commit) args.push('--commit', opts.commit);
+ }
+ args.push('--format', 'json');
+ // JSON 结果走 stdout,进度日志走 stderr,供扩展实时回显
+ // TODO: 待 CLI 发布支持 --progress-stderr 后再启用(当前已安装版本不识别该 flag)
+ // args.push('--progress-stderr');
+ if (opts.customPrompt && opts.customPrompt.trim()) {
+ args.push('--background', opts.customPrompt.trim());
+ }
+ if (typeof opts.concurrency === 'number') {
+ args.push('--concurrency', String(opts.concurrency));
+ }
+ return args;
+}
+
+function toComment(raw: any): ReviewComment {
+ return {
+ path: raw.path,
+ content: raw.content,
+ suggestionCode: raw.suggestion_code || undefined,
+ existingCode: raw.existing_code || undefined,
+ startLine: raw.start_line,
+ endLine: raw.end_line,
+ thinking: raw.thinking || undefined,
+ };
+}
+
+export function parseCliResult(stdout: string): CliResult {
+ const start = stdout.indexOf('{');
+ if (start < 0) throw new Error('no JSON in CLI output');
+ const json = JSON.parse(stdout.slice(start));
+ const s = json.summary;
+ return {
+ status: json.status,
+ message: json.message,
+ comments: Array.isArray(json.comments) ? json.comments.map(toComment) : [],
+ warnings: Array.isArray(json.warnings) ? json.warnings : [],
+ summary: s ? {
+ filesReviewed: s.files_reviewed,
+ comments: s.comments,
+ totalTokens: s.total_tokens,
+ inputTokens: s.input_tokens,
+ outputTokens: s.output_tokens,
+ elapsed: s.elapsed,
+ } : undefined,
+ };
+}
+
+/** 从 CLI stderr 中提取最有用的报错文本:优先 `Error:` 行,否则取最后一行非空内容。 */
+export function extractCliError(stderr: string): string {
+ const lines = stderr.split('\n').map((l) => l.trim()).filter(Boolean);
+ const errLine = [...lines].reverse().find((l) => /^error:/i.test(l));
+ if (errLine) return errLine.replace(/^error:\s*/i, '');
+ return lines.length ? lines[lines.length - 1] : '';
+}
+
+export function parseLogLine(raw: string): LogLine | null {
+ const text = raw.replace(/\s+$/, '');
+ if (!text.trim()) return null;
+ const level: LogLine['level'] = /retrying|warning|warn/i.test(text) ? 'warn' : 'info';
+ return { text, level };
+}
diff --git a/extensions/vscode/src/extension/services/configParse.ts b/extensions/vscode/src/extension/services/configParse.ts
new file mode 100644
index 0000000..4dcf14d
--- /dev/null
+++ b/extensions/vscode/src/extension/services/configParse.ts
@@ -0,0 +1,21 @@
+import { OcrConfig } from '../../shared/types';
+
+export function parseConfig(raw: string): OcrConfig | null {
+ if (!raw || !raw.trim()) return null;
+ const j = JSON.parse(raw);
+ const llm = j.llm || {};
+ return {
+ llm: {
+ url: llm.url || '',
+ authToken: llm.auth_token || '',
+ model: llm.model || '',
+ useAnthropic: Boolean(llm.use_anthropic),
+ authHeader: llm.auth_header || '',
+ },
+ language: j.language || 'Chinese',
+ };
+}
+
+export function toConfigSetArgs(key: string, value: string): string[] {
+ return ['config', 'set', key, value];
+}
diff --git a/extensions/vscode/src/extension/services/gitMap.ts b/extensions/vscode/src/extension/services/gitMap.ts
new file mode 100644
index 0000000..0c92b4f
--- /dev/null
+++ b/extensions/vscode/src/extension/services/gitMap.ts
@@ -0,0 +1,84 @@
+import { FileChange } from '../../shared/types';
+
+export function mapStatusCode(code: string): FileChange['status'] {
+ switch (code) {
+ case 'A': return 'added';
+ case '?': return 'added';
+ case 'D': return 'deleted';
+ case 'R': return 'renamed';
+ case 'M': return 'modified';
+ default: return 'modified';
+ }
+}
+
+/**
+ * 解析 `git status --porcelain` 输出。
+ * 每行格式:XYpath,X=暂存区状态,Y=工作区状态,'??'=未跟踪。
+ * 重命名行格式:`R old -> new`,取 new。
+ */
+export function parsePorcelain(output: string): FileChange[] {
+ const files: FileChange[] = [];
+ const seen = new Set();
+ for (const rawLine of output.split('\n')) {
+ if (!rawLine.trim()) continue;
+ const x = rawLine[0];
+ const y = rawLine[1];
+ let path = rawLine.slice(3);
+ let code: string;
+ if (x === '?' && y === '?') {
+ code = '?';
+ } else if (x === 'R' || y === 'R') {
+ code = 'R';
+ const arrow = path.indexOf(' -> ');
+ if (arrow >= 0) path = path.slice(arrow + 4);
+ } else {
+ // 取暂存区状态优先,否则工作区状态
+ const c = x !== ' ' && x !== '?' ? x : y;
+ code = c;
+ }
+ if (seen.has(path)) continue;
+ seen.add(path);
+ files.push({ path, status: mapStatusCode(code) });
+ }
+ return files;
+}
+
+/**
+ * 从候选仓库根路径中选出与 workspace 匹配的那个。
+ * VSCode git 扩展异步扫描嵌套仓库,repositories 顺序不稳定,直接取 [0] 会漂移到子仓库。
+ * 优先级:精确等于 workspace 根 > workspace 的最深祖先 > 第一个。
+ */
+export function pickRepoRoot(roots: string[], workspacePath?: string): string | null {
+ if (roots.length === 0) return null;
+ if (!workspacePath) return roots[0];
+
+ const exact = roots.find((r) => r === workspacePath);
+ if (exact) return exact;
+
+ const ancestors = roots.filter((r) => workspacePath.startsWith(r.endsWith('/') ? r : r + '/'));
+ if (ancestors.length > 0) {
+ return ancestors.reduce((deepest, r) => (r.length > deepest.length ? r : deepest));
+ }
+
+ return roots[0];
+}
+
+/**
+ * 解析 `git diff --name-status` / `git show --name-status` 输出。
+ * 每行制表符分隔:statuspath,重命名为 Roldnew(取 new)。
+ */
+export function parseNameStatus(output: string): FileChange[] {
+ const files: FileChange[] = [];
+ const seen = new Set();
+ for (const rawLine of output.split('\n')) {
+ if (!rawLine.trim()) continue;
+ const parts = rawLine.split('\t');
+ if (parts.length < 2) continue;
+ const codeChar = parts[0][0];
+ const path = parts.length >= 3 ? parts[parts.length - 1] : parts[1];
+ if (seen.has(path)) continue;
+ seen.add(path);
+ files.push({ path, status: mapStatusCode(codeChar) });
+ }
+ return files;
+}
diff --git a/extensions/vscode/src/extension/services/shellEnv.ts b/extensions/vscode/src/extension/services/shellEnv.ts
new file mode 100644
index 0000000..7958998
--- /dev/null
+++ b/extensions/vscode/src/extension/services/shellEnv.ts
@@ -0,0 +1,71 @@
+import { spawnSync } from 'child_process';
+
+const DELIM = '_OCR_ENV_DELIM_';
+
+/** 从登录 shell 的 `env` 输出中解析出 key=value(取两个分隔标记之间的内容)。 */
+export function parseEnvBlock(stdout: string): Record {
+ const start = stdout.indexOf(DELIM);
+ const end = stdout.lastIndexOf(DELIM);
+ if (start === -1 || end === -1 || end <= start) return {};
+ const block = stdout.slice(start + DELIM.length, end);
+ const env: Record = {};
+ for (const line of block.split('\n')) {
+ const eq = line.indexOf('=');
+ if (eq > 0) env[line.slice(0, eq)] = line.slice(eq + 1);
+ }
+ return env;
+}
+
+let cached: NodeJS.ProcessEnv | null = null;
+
+/**
+ * GUI 启动的 VSCode 继承的是精简 PATH,不含 nvm / homebrew / npm 全局 bin。
+ * 通过用户的登录交互式 shell(加载 ~/.zshrc、~/.zprofile 等)解析真实环境变量并缓存。
+ * Windows 下终端与 GUI 环境一致,直接用 process.env。
+ */
+export function getShellEnv(): NodeJS.ProcessEnv {
+ if (cached) return cached;
+ if (process.platform === 'win32' || process.env.OCR_SKIP_SHELL_RESOLVE) {
+ cached = process.env;
+ return cached;
+ }
+ try {
+ const shell = process.env.SHELL || '/bin/zsh';
+ const res = spawnSync(shell, ['-ilc', `echo ${DELIM}; env; echo ${DELIM}`], {
+ encoding: 'utf8',
+ timeout: 5000,
+ });
+ const parsed = parseEnvBlock(res.stdout || '');
+ cached = Object.keys(parsed).length ? { ...process.env, ...parsed } : process.env;
+ } catch {
+ cached = process.env;
+ }
+ return cached;
+}
+
+const binCache = new Map();
+
+/**
+ * 通过登录交互式 shell 解析命令的绝对路径(`command -v`),覆盖 nvm / homebrew
+ * 等用 shell function 或动态 PATH 暴露二进制的情况。解析失败时回退到原命令名
+ * (交给 spawn 在注入的 PATH 中查找)。Windows 直接返回原名。
+ */
+export function resolveBin(name: string): string {
+ if (process.platform === 'win32' || process.env.OCR_SKIP_SHELL_RESOLVE) return name;
+ const hit = binCache.get(name);
+ if (hit) return hit;
+ let resolved = name;
+ try {
+ const shell = process.env.SHELL || '/bin/zsh';
+ const res = spawnSync(shell, ['-ilc', `command -v ${name}`], {
+ encoding: 'utf8',
+ timeout: 5000,
+ });
+ const path = (res.stdout || '').trim().split('\n').pop()?.trim();
+ if (path && path.startsWith('/')) resolved = path;
+ } catch {
+ // 回退到原命令名
+ }
+ binCache.set(name, resolved);
+ return resolved;
+}
diff --git a/extensions/vscode/src/shared/constants.ts b/extensions/vscode/src/shared/constants.ts
new file mode 100644
index 0000000..5bae7d3
--- /dev/null
+++ b/extensions/vscode/src/shared/constants.ts
@@ -0,0 +1,11 @@
+export const SIDEBAR_VIEW_ID = 'ocr.sidebar';
+export const COMMENT_CONTROLLER_ID = 'ocr-review';
+
+export const COMMANDS = {
+ reviewStart: 'ocr.review.start',
+ reviewCancel: 'ocr.review.cancel',
+ configOpen: 'ocr.config.open',
+ commentApply: 'ocr.comment.apply',
+ commentDiscard: 'ocr.comment.discard',
+ commentFalsePositive: 'ocr.comment.falsePositive',
+} as const;
diff --git a/extensions/vscode/src/shared/messages.ts b/extensions/vscode/src/shared/messages.ts
new file mode 100644
index 0000000..742511c
--- /dev/null
+++ b/extensions/vscode/src/shared/messages.ts
@@ -0,0 +1,33 @@
+import {
+ CliResult, CliRunOptions, CommentSyncState, FileChange, GitState, LogLine,
+ OcrConfig, ReviewMode, ReviewState,
+} from './types';
+
+export type WebviewToHost =
+ | { type: 'ready' }
+ | { type: 'getGitState'; mode: ReviewMode }
+ | { type: 'getModeFiles'; mode: ReviewMode; from?: string; to?: string; commit?: string }
+ | { type: 'openFileDiff'; path: string; status: FileChange['status']; mode: ReviewMode; from?: string; to?: string; commit?: string }
+ | { type: 'startReview'; options: CliRunOptions }
+ | { type: 'cancelReview' }
+ | { type: 'getConfig' }
+ | { type: 'setConfig'; key: string; value: string }
+ | { type: 'testConnection' }
+ | { type: 'checkCli' }
+ | { type: 'installCli' }
+ | { type: 'jumpToComment'; index: number }
+ | { type: 'commentAction'; index: number; action: 'apply' | 'discard' | 'falsePositive' };
+
+export type HostToWebview =
+ | { type: 'init'; config: OcrConfig | null; gitState: GitState }
+ | { type: 'gitState'; gitState: GitState }
+ | { type: 'modeFiles'; mode: ReviewMode; files: FileChange[] }
+ | { type: 'logLine'; line: LogLine }
+ | { type: 'stateChange'; state: ReviewState; error?: string }
+ | { type: 'reviewDone'; result: CliResult }
+ | { type: 'config'; config: OcrConfig | null }
+ | { type: 'connectionResult'; ok: boolean; message?: string }
+ | { type: 'cliStatus'; installed: boolean }
+ | { type: 'installLog'; line: LogLine }
+ | { type: 'installDone'; ok: boolean }
+ | { type: 'commentSync'; comments: CommentSyncState[] };
diff --git a/extensions/vscode/src/shared/types.ts b/extensions/vscode/src/shared/types.ts
new file mode 100644
index 0000000..8679335
--- /dev/null
+++ b/extensions/vscode/src/shared/types.ts
@@ -0,0 +1,87 @@
+export type ReviewMode = 'workspace' | 'branch' | 'commit';
+
+export type ReviewState =
+ | 'idle' | 'running' | 'done' | 'empty' | 'cancelled' | 'failed';
+
+export type CommentStatus = 'pending' | 'applied' | 'discarded' | 'falsePositive';
+
+export interface ReviewComment {
+ path: string;
+ content: string;
+ suggestionCode?: string;
+ existingCode?: string;
+ startLine: number;
+ endLine: number;
+ thinking?: string;
+}
+
+export interface ReviewSummary {
+ filesReviewed: number;
+ comments: number;
+ totalTokens: number;
+ inputTokens: number;
+ outputTokens: number;
+ elapsed: string;
+}
+
+export interface AgentWarning {
+ type: string;
+ file: string;
+ message: string;
+}
+
+export interface CliResult {
+ status: 'success' | 'completed_with_errors' | 'completed_with_warnings' | 'skipped';
+ comments: ReviewComment[];
+ warnings: AgentWarning[];
+ summary?: ReviewSummary;
+ message?: string;
+}
+
+export interface OcrConfig {
+ llm: {
+ url: string;
+ authToken: string;
+ model: string;
+ useAnthropic: boolean;
+ authHeader?: string;
+ };
+ language: string;
+}
+
+export interface CommitInfo {
+ sha: string;
+ message: string;
+ relativeTime: string;
+}
+
+export interface FileChange {
+ path: string;
+ status: 'added' | 'modified' | 'deleted' | 'renamed' | 'binary';
+}
+
+export interface GitState {
+ branches: string[];
+ currentBranch: string;
+ recentCommits: CommitInfo[];
+ workspaceFiles: FileChange[];
+}
+
+export interface LogLine {
+ text: string;
+ level: 'info' | 'warn' | 'error';
+}
+
+export interface CliRunOptions {
+ mode: ReviewMode;
+ from?: string;
+ to?: string;
+ commit?: string;
+ customPrompt?: string;
+ concurrency?: number;
+}
+
+export interface CommentSyncState {
+ index: number;
+ status: CommentStatus;
+}
diff --git a/extensions/vscode/src/webview/App.tsx b/extensions/vscode/src/webview/App.tsx
new file mode 100644
index 0000000..047e3de
--- /dev/null
+++ b/extensions/vscode/src/webview/App.tsx
@@ -0,0 +1,87 @@
+import { useEffect, useReducer } from 'preact/hooks';
+import { reducer, initialState } from './store';
+import { bridge } from './bridge';
+import { ReviewMode, CliRunOptions, FileChange } from '../shared/types';
+import { IdleView } from './views/IdleView';
+import { RunningView } from './views/RunningView';
+import { DoneView } from './views/DoneView';
+import { EmptyView } from './views/EmptyView';
+import { CancelledView } from './views/CancelledView';
+import { FailedView } from './views/FailedView';
+import { ConfigView } from './views/ConfigView';
+import './styles/global.css';
+
+export function App() {
+ const [state, dispatch] = useReducer(reducer, initialState);
+
+ useEffect(() => {
+ bridge.onMessage((msg) => dispatch(msg));
+ bridge.post({ type: 'ready' });
+ }, []);
+
+ const configured = Boolean(state.config);
+ const start = (options: CliRunOptions) => {
+ dispatch({ type: 'startReview', mode: options.mode });
+ bridge.post({ type: 'startReview', options });
+ };
+ const onModeChange = (mode: ReviewMode) => {
+ dispatch({ type: 'filesLoading' });
+ bridge.post({ type: 'getGitState', mode });
+ };
+ const requestModeFiles = (mode: ReviewMode, from?: string, to?: string, commit?: string) => {
+ dispatch({ type: 'filesLoading' });
+ bridge.post({ type: 'getModeFiles', mode, from, to, commit });
+ };
+ const openFile = (file: FileChange, mode: ReviewMode, from?: string, to?: string, commit?: string) => {
+ bridge.post({ type: 'openFileDiff', path: file.path, status: file.status, mode, from, to, commit });
+ };
+
+ const openConfig = () => {
+ dispatch({ type: 'openConfig' });
+ dispatch({ type: 'checkingCli' });
+ bridge.post({ type: 'checkCli' });
+ };
+
+ return (
+
+
⚙
+
+
+
+
+ {state.view !== 'idle' && (
+
+ {state.view === 'running' && bridge.post({ type: 'cancelReview' })} />}
+ {state.view === 'done' && state.session.result && (
+ bridge.post({ type: 'jumpToComment', index: i })}
+ onAction={(i, action) => bridge.post({ type: 'commentAction', index: i, action })} />
+ )}
+ {state.view === 'empty' && }
+ {state.view === 'cancelled' && }
+ {state.view === 'failed' && start({ mode: 'workspace' })} />}
+
+ )}
+
+
+ {state.configOpen && (
+
{ dispatch({ type: 'installingCli' }); bridge.post({ type: 'installCli' }); }}
+ onCheckCli={() => { dispatch({ type: 'checkingCli' }); bridge.post({ type: 'checkCli' }); }}
+ onTest={() => { dispatch({ type: 'testingConn' }); bridge.post({ type: 'testConnection' }); }}
+ onSave={(entries) => entries.forEach((e) => bridge.post({ type: 'setConfig', key: e.key, value: e.value }))}
+ onClose={() => dispatch({ type: 'closeConfig' })}
+ />
+ )}
+
+ );
+}
diff --git a/extensions/vscode/src/webview/__tests__/store.test.ts b/extensions/vscode/src/webview/__tests__/store.test.ts
new file mode 100644
index 0000000..568a750
--- /dev/null
+++ b/extensions/vscode/src/webview/__tests__/store.test.ts
@@ -0,0 +1,98 @@
+import { initialState, reducer } from '../store';
+
+describe('reducer', () => {
+ it('init 设置 config 和 gitState', () => {
+ const s = reducer(initialState, {
+ type: 'init',
+ config: { llm: { url: 'u', authToken: '', model: 'm', useAnthropic: false }, language: 'Chinese' },
+ gitState: { branches: [], currentBranch: 'main', recentCommits: [], workspaceFiles: [] },
+ });
+ expect(s.config?.llm.model).toBe('m');
+ expect(s.gitState.currentBranch).toBe('main');
+ expect(s.view).toBe('idle'); // 主界面始终是 idle(review 界面)
+ expect(s.configOpen).toBe(false); // 已配置 → 不弹配置浮层
+ });
+
+ it('init 时 config 为 null → 主界面仍是 idle,且不自动弹出配置浮层', () => {
+ const s = reducer(initialState, {
+ type: 'init', config: null,
+ gitState: { branches: [], currentBranch: '', recentCommits: [], workspaceFiles: [] },
+ });
+ expect(s.view).toBe('idle');
+ expect(s.configOpen).toBe(false);
+ });
+
+ it('init / gitState / modeFiles 结束 loading;filesLoading action 开启 loading', () => {
+ const init = reducer({ ...initialState, filesLoading: true }, {
+ type: 'init', config: null,
+ gitState: { branches: [], currentBranch: '', recentCommits: [], workspaceFiles: [] },
+ });
+ expect(init.filesLoading).toBe(false);
+
+ const started = reducer(init, { type: 'filesLoading' });
+ expect(started.filesLoading).toBe(true);
+
+ const loaded = reducer(started, { type: 'gitState', gitState: init.gitState });
+ expect(loaded.filesLoading).toBe(false);
+ });
+
+ it('openConfig / closeConfig 切换配置浮层', () => {
+ const opened = reducer(initialState, { type: 'openConfig' });
+ expect(opened.configOpen).toBe(true);
+ const closed = reducer(opened, { type: 'closeConfig' });
+ expect(closed.configOpen).toBe(false);
+ });
+
+ it('config 保存后更新 config 并关闭浮层', () => {
+ const s = reducer({ ...initialState, configOpen: true }, {
+ type: 'config',
+ config: { llm: { url: 'u', authToken: 't', model: 'm', useAnthropic: false }, language: 'Chinese' },
+ });
+ expect(s.config?.llm.model).toBe('m');
+ expect(s.configOpen).toBe(false);
+ });
+
+ it('stateChange running 清空旧日志并切到 running 视图', () => {
+ const s = reducer({ ...initialState, logs: [{ text: 'old', level: 'info' }] }, { type: 'stateChange', state: 'running' });
+ expect(s.session.state).toBe('running');
+ expect(s.logs).toEqual([]);
+ expect(s.view).toBe('running');
+ });
+
+ it('logLine 追加日志', () => {
+ const s = reducer(initialState, { type: 'logLine', line: { text: 'x', level: 'info' } });
+ expect(s.logs).toHaveLength(1);
+ });
+
+ it('reviewDone 保存结果', () => {
+ const s = reducer(initialState, {
+ type: 'reviewDone',
+ result: { status: 'success', comments: [], warnings: [], summary: undefined },
+ });
+ expect(s.session.result?.status).toBe('success');
+ });
+
+ it('stateChange done → view 切 done', () => {
+ expect(reducer(initialState, { type: 'stateChange', state: 'done' }).view).toBe('done');
+ });
+
+ it('commentSync 更新评论状态映射', () => {
+ const s = reducer(initialState, { type: 'commentSync', comments: [{ index: 0, status: 'applied' }] });
+ expect(s.commentStatus[0]).toBe('applied');
+ });
+});
+
+describe('modeFiles 消息', () => {
+ it('保存 mode 对应文件列表', () => {
+ const next = reducer(initialState, {
+ type: 'modeFiles',
+ mode: 'branch',
+ files: [{ path: 'src/a.ts', status: 'modified' }],
+ });
+ expect(next.modeFiles).toEqual([{ path: 'src/a.ts', status: 'modified' }]);
+ });
+
+ it('init 时 modeFiles 为空数组', () => {
+ expect(initialState.modeFiles).toEqual([]);
+ });
+});
diff --git a/extensions/vscode/src/webview/bridge.ts b/extensions/vscode/src/webview/bridge.ts
new file mode 100644
index 0000000..756f82d
--- /dev/null
+++ b/extensions/vscode/src/webview/bridge.ts
@@ -0,0 +1,15 @@
+import { HostToWebview, WebviewToHost } from '../shared/messages';
+
+interface VsCodeApi { postMessage(msg: unknown): void; }
+declare function acquireVsCodeApi(): VsCodeApi;
+
+const vscode = acquireVsCodeApi();
+
+export const bridge = {
+ post(msg: WebviewToHost): void {
+ vscode.postMessage(msg);
+ },
+ onMessage(handler: (msg: HostToWebview) => void): void {
+ window.addEventListener('message', (e) => handler(e.data as HostToWebview));
+ },
+};
diff --git a/extensions/vscode/src/webview/components/CommentCard.tsx b/extensions/vscode/src/webview/components/CommentCard.tsx
new file mode 100644
index 0000000..59a5150
--- /dev/null
+++ b/extensions/vscode/src/webview/components/CommentCard.tsx
@@ -0,0 +1,26 @@
+import { ReviewComment, CommentStatus } from '../../shared/types';
+
+interface Props {
+ comment: ReviewComment;
+ index: number;
+ status: CommentStatus;
+ canJump: boolean;
+ onOpen: (index: number) => void;
+ onAction: (index: number, action: 'apply' | 'discard' | 'falsePositive') => void;
+}
+
+export function CommentCard({ comment, index, status, canJump, onOpen, onAction }: Props) {
+ return (
+
+ );
+}
diff --git a/extensions/vscode/src/webview/components/FileList.tsx b/extensions/vscode/src/webview/components/FileList.tsx
new file mode 100644
index 0000000..7c6c68e
--- /dev/null
+++ b/extensions/vscode/src/webview/components/FileList.tsx
@@ -0,0 +1,36 @@
+import { FileChange } from '../../shared/types';
+
+const BADGE: Record = {
+ added: 'A', modified: 'M', deleted: 'D', renamed: 'R', binary: 'B',
+};
+
+interface Props { files: FileChange[]; loading?: boolean; onOpenFile?: (file: FileChange) => void; }
+
+export function FileList({ files, loading, onOpenFile }: Props) {
+ return (
+
+
待审查文件 {loading ? '' : `(${files.length})`}
+ {loading ? (
+
+ {[68, 52, 60].map((w, i) => (
+
+ ))}
+
+ ) : files.length === 0 ? (
+
无变更文件
+ ) : (
+
+ )}
+
+ );
+}
diff --git a/extensions/vscode/src/webview/components/LogViewer.tsx b/extensions/vscode/src/webview/components/LogViewer.tsx
new file mode 100644
index 0000000..dc6fc9e
--- /dev/null
+++ b/extensions/vscode/src/webview/components/LogViewer.tsx
@@ -0,0 +1,24 @@
+import { useRef, useEffect } from 'preact/hooks';
+import { LogLine } from '../../shared/types';
+
+interface Props { logs: LogLine[]; }
+
+export function LogViewer({ logs }: Props) {
+ const ref = useRef(null);
+
+ useEffect(() => {
+ if (ref.current) ref.current.scrollTop = ref.current.scrollHeight;
+ }, [logs.length]);
+
+ return (
+
+ {logs.length === 0 ? (
+
等待输出
+ ) : (
+ logs.map((l, i) => (
+
{l.text}
+ ))
+ )}
+
+ );
+}
diff --git a/extensions/vscode/src/webview/components/Select.tsx b/extensions/vscode/src/webview/components/Select.tsx
new file mode 100644
index 0000000..bfea967
--- /dev/null
+++ b/extensions/vscode/src/webview/components/Select.tsx
@@ -0,0 +1,55 @@
+import { useState, useRef, useEffect } from 'preact/hooks';
+
+export interface SelectOption {
+ value: string;
+ label: string;
+}
+
+interface Props {
+ value: string;
+ options: SelectOption[];
+ placeholder?: string;
+ onChange: (value: string) => void;
+}
+
+export function Select({ value, options, placeholder = '请选择', onChange }: Props) {
+ const [open, setOpen] = useState(false);
+ const ref = useRef(null);
+
+ useEffect(() => {
+ if (!open) return;
+ const onDoc = (e: MouseEvent) => {
+ if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false);
+ };
+ document.addEventListener('mousedown', onDoc);
+ return () => document.removeEventListener('mousedown', onDoc);
+ }, [open]);
+
+ const selected = options.find((o) => o.value === value);
+
+ const pick = (v: string) => { onChange(v); setOpen(false); };
+
+ return (
+
+ setOpen(!open)}>
+
+ {selected ? selected.label : placeholder}
+
+
+
+ {open && (
+
+ )}
+
+ );
+}
diff --git a/extensions/vscode/src/webview/index.tsx b/extensions/vscode/src/webview/index.tsx
new file mode 100644
index 0000000..b3d4f15
--- /dev/null
+++ b/extensions/vscode/src/webview/index.tsx
@@ -0,0 +1,5 @@
+import { render } from 'preact';
+import { App } from './App';
+
+const root = document.getElementById('root');
+if (root) render( , root);
diff --git a/extensions/vscode/src/webview/store.ts b/extensions/vscode/src/webview/store.ts
new file mode 100644
index 0000000..cab524e
--- /dev/null
+++ b/extensions/vscode/src/webview/store.ts
@@ -0,0 +1,118 @@
+import { CliResult, CommentStatus, FileChange, GitState, LogLine, OcrConfig, ReviewMode, ReviewState } from '../shared/types';
+import { HostToWebview } from '../shared/messages';
+
+export type AppView = 'idle' | 'running' | 'done' | 'empty' | 'cancelled' | 'failed';
+
+export type CliStatus = 'unknown' | 'checking' | 'installed' | 'missing';
+export type ConnTest = { status: 'idle' | 'testing' | 'ok' | 'fail'; message?: string };
+
+export interface AppState {
+ view: AppView;
+ configOpen: boolean;
+ config: OcrConfig | null;
+ gitState: GitState;
+ modeFiles: FileChange[];
+ filesLoading: boolean;
+ logs: LogLine[];
+ session: { state: ReviewState; result: CliResult | null; error?: string };
+ commentStatus: Record;
+ cliStatus: CliStatus;
+ installing: boolean;
+ installLogs: LogLine[];
+ connTest: ConnTest;
+ reviewMode: ReviewMode;
+}
+
+export const initialState: AppState = {
+ view: 'idle',
+ configOpen: false,
+ config: null,
+ gitState: { branches: [], currentBranch: '', recentCommits: [], workspaceFiles: [] },
+ modeFiles: [],
+ filesLoading: true,
+ logs: [],
+ session: { state: 'idle', result: null },
+ commentStatus: {},
+ cliStatus: 'unknown',
+ installing: false,
+ installLogs: [],
+ connTest: { status: 'idle' },
+ reviewMode: 'workspace',
+};
+
+const STATE_TO_VIEW: Record = {
+ idle: 'idle', running: 'running', done: 'done',
+ empty: 'empty', cancelled: 'cancelled', failed: 'failed',
+};
+
+export type LocalAction =
+ | { type: 'openConfig' }
+ | { type: 'closeConfig' }
+ | { type: 'filesLoading' }
+ | { type: 'checkingCli' }
+ | { type: 'installingCli' }
+ | { type: 'testingConn' }
+ | { type: 'startReview'; mode: ReviewMode };
+
+export function reducer(state: AppState, msg: HostToWebview | LocalAction): AppState {
+ switch (msg.type) {
+ case 'openConfig':
+ return { ...state, configOpen: true, connTest: { status: 'idle' } };
+ case 'closeConfig':
+ return { ...state, configOpen: false, installLogs: [], connTest: { status: 'idle' } };
+ case 'filesLoading':
+ return { ...state, filesLoading: true };
+ case 'checkingCli':
+ return { ...state, cliStatus: 'checking' };
+ case 'installingCli':
+ return { ...state, installing: true, installLogs: [] };
+ case 'testingConn':
+ return { ...state, connTest: { status: 'testing' } };
+ case 'startReview':
+ return { ...state, reviewMode: msg.mode };
+ case 'cliStatus':
+ return { ...state, cliStatus: msg.installed ? 'installed' : 'missing' };
+ case 'installLog':
+ return { ...state, installLogs: [...state.installLogs, msg.line] };
+ case 'installDone':
+ return { ...state, installing: false };
+ case 'init':
+ return {
+ ...state,
+ config: msg.config,
+ gitState: msg.gitState,
+ view: 'idle',
+ filesLoading: false,
+ };
+ case 'gitState':
+ return { ...state, gitState: msg.gitState, filesLoading: false };
+ case 'modeFiles':
+ return { ...state, modeFiles: msg.files, filesLoading: false };
+ case 'config':
+ // 保存配置后:更新 config,若已配置则关闭浮层
+ return { ...state, config: msg.config, configOpen: msg.config ? false : state.configOpen };
+ case 'stateChange': {
+ const starting = msg.state === 'running';
+ return {
+ ...state,
+ logs: starting ? [] : state.logs,
+ commentStatus: starting ? {} : state.commentStatus,
+ session: { state: msg.state, result: starting ? null : state.session.result, error: msg.error },
+ view: STATE_TO_VIEW[msg.state],
+ };
+ }
+ case 'logLine':
+ return { ...state, logs: [...state.logs, msg.line] };
+ case 'reviewDone':
+ return { ...state, session: { ...state.session, result: msg.result } };
+ case 'commentSync': {
+ const commentStatus = { ...state.commentStatus };
+ for (const c of msg.comments) commentStatus[c.index] = c.status;
+ return { ...state, commentStatus };
+ }
+ case 'connectionResult':
+ return { ...state, connTest: { status: msg.ok ? 'ok' : 'fail', message: msg.message } };
+ default:
+ return state;
+ }
+}
diff --git a/extensions/vscode/src/webview/styles/global.css b/extensions/vscode/src/webview/styles/global.css
new file mode 100644
index 0000000..aa6513b
--- /dev/null
+++ b/extensions/vscode/src/webview/styles/global.css
@@ -0,0 +1,1500 @@
+/* === 1. CSS Variables ===
+ * 结构色映射到 VSCode 主题 token(带 silent-night 回退值),自动适配亮/暗主题。
+ * accent(薄荷绿)保留为品牌色,不跟随主题。 */
+:root {
+ /* 背景层:sidebar / 输入 / hover */
+ --bg: var(--vscode-sideBar-background, #0a0d12);
+ --bg-soft: var(--vscode-sideBarSectionHeader-background, #11151a);
+ --bg-deeper: var(--vscode-editor-background, #06090d);
+ --card: var(--vscode-sideBar-background, #14181e);
+ --card-soft: var(--vscode-list-hoverBackground, #1a1f27);
+ --card-quiet: var(--vscode-list-activeSelectionBackground, #20262f);
+ --card-deeper: var(--vscode-input-background, #0d1015);
+ /* 文字层 */
+ --ink: var(--vscode-foreground, #ececec);
+ --ink-soft: var(--vscode-foreground, #b8b8b2);
+ --ink-quiet: var(--vscode-descriptionForeground, #7e828a);
+ --ink-faint: var(--vscode-disabledForeground, #4f535b);
+ --moon: var(--vscode-foreground, #f3f3ef);
+ --moon-soft: var(--vscode-descriptionForeground, #b8b8b3);
+ --moon-quiet: var(--vscode-descriptionForeground, #6b6f76);
+ --moon-faint: var(--vscode-disabledForeground, #4a4f56);
+ /* 边框 */
+ --rule: var(--vscode-widget-border, rgba(255, 255, 255, 0.07));
+ --rule-soft: var(--vscode-widget-border, rgba(255, 255, 255, 0.04));
+ /* 中性叠加(微妙背景填充,用 list hover token 适配亮/暗) */
+ --fill-soft: var(--vscode-list-hoverBackground, rgba(255, 255, 255, 0.04));
+ --fill: var(--vscode-list-inactiveSelectionBackground, rgba(255, 255, 255, 0.08));
+ /* accent:薄荷绿品牌色(保留,不跟随主题) */
+ --mint: #45e6a4;
+ --mint-soft: #8ff0c2;
+ --mint-glow: rgba(69, 230, 164, 0.35);
+ --mint-tint: rgba(69, 230, 164, 0.10);
+ --font: var(--vscode-font-family, -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'Inter', system-ui, 'Helvetica Neue', 'PingFang SC', 'Noto Sans SC', sans-serif);
+ --font-display: var(--vscode-font-family, -apple-system, BlinkMacSystemFont, 'SF Pro Display', 'Inter', system-ui, 'PingFang SC', sans-serif);
+ --font-mono: var(--vscode-editor-font-family, 'JetBrains Mono', 'SF Mono', 'Berkeley Mono', Consolas, Menlo, monospace);
+}
+
+/* === 2. Global Base (silent-night-ui §2) === */
+* {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+}
+
+html {
+ scroll-behavior: smooth;
+}
+
+body {
+ background: var(--bg);
+ color: var(--ink);
+ font-family: var(--font);
+ font-size: 13px;
+ line-height: 1.55;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ text-rendering: optimizeLegibility;
+ overflow: hidden;
+ height: 100vh;
+}
+
+::-webkit-scrollbar {
+ width: 4px;
+ height: 4px;
+}
+
+::-webkit-scrollbar-track {
+ background: transparent;
+}
+
+::-webkit-scrollbar-thumb {
+ background: var(--vscode-scrollbarSlider-background, rgba(255, 255, 255, 0.08));
+ border-radius: 2px;
+}
+
+::-webkit-scrollbar-thumb:hover {
+ background: var(--vscode-scrollbarSlider-hoverBackground, rgba(255, 255, 255, 0.18));
+}
+
+::selection {
+ background: var(--vscode-editor-selectionBackground, var(--fill));
+}
+
+@keyframes pulse {
+
+ 0%,
+ 100% {
+ opacity: 1;
+ transform: scale(1);
+ }
+
+ 50% {
+ opacity: 0.45;
+ transform: scale(0.85);
+ }
+}
+
+/* === 3. Root container (sidebar host) === */
+.ocr-root {
+ position: relative;
+ z-index: 1;
+ display: flex;
+ flex-direction: column;
+ height: 100vh;
+ background: var(--card);
+ overflow: hidden;
+}
+
+.ocr-root>* {
+ position: relative;
+ z-index: 1;
+}
+
+/* === 5. Setup Region === */
+.setup {
+ padding: 0px;
+ flex-shrink: 0;
+}
+
+.mode-tabs {
+ display: flex;
+ background: var(--vscode-input-background, var(--card-deeper));
+ border: 1px solid var(--rule-soft);
+ border-radius: 8px;
+ padding: 3px;
+ margin-bottom: 12px;
+ gap: 2px;
+}
+
+.mode-tab {
+ flex: 1;
+ padding: 5px 0;
+ border: none;
+ border-radius: 6px;
+ background: transparent;
+ color: var(--ink-quiet);
+ font-family: var(--font);
+ font-size: 11.5px;
+ font-weight: 500;
+ cursor: pointer;
+ transition: background-color 0.2s, color 0.2s, box-shadow 0.2s;
+ text-align: center;
+}
+
+.mode-tab:hover:not(.active) {
+ color: var(--ink-soft);
+ background: var(--fill-soft);
+}
+
+.mode-tab.active {
+ background: var(--fill);
+ color: var(--ink);
+ font-weight: 600;
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.12);
+}
+
+.mode-params {
+ display: none;
+ margin-bottom: 12px;
+}
+
+.mode-params.active {
+ display: block;
+}
+
+.mode-param-label {
+ font-size: 11px;
+ color: var(--ink-quiet);
+ margin-bottom: 4px;
+}
+
+.mode-param-label:not(:first-child) {
+ margin-top: 8px;
+}
+
+.mode-param-input {
+ width: 100%;
+ padding: 6px 10px;
+ background: var(--card);
+ border: 1px solid var(--rule);
+ border-radius: 8px;
+ color: var(--ink);
+ font-family: var(--font-mono);
+ font-size: 12px;
+ outline: none;
+ transition: border-color 0.2s;
+}
+
+.mode-param-input:focus {
+ border-color: var(--ink-faint);
+}
+
+.mode-param-input::placeholder {
+ color: var(--ink-faint);
+}
+
+/* === 自定义 Select === */
+.select {
+ position: relative;
+ width: 100%;
+}
+
+.select-trigger {
+ width: 100%;
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ padding: 7px 10px;
+ background: var(--card);
+ border: 1px solid var(--rule);
+ border-radius: 8px;
+ color: var(--ink);
+ font-family: var(--font-mono);
+ font-size: 12px;
+ text-align: left;
+ outline: none;
+ cursor: pointer;
+ transition: border-color 0.2s;
+}
+
+.select.open .select-trigger {
+ border-color: var(--ink-faint);
+}
+
+.select-value {
+ flex: 1;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.select-value.placeholder {
+ color: var(--ink-faint);
+}
+
+.select-arrow {
+ flex-shrink: 0;
+ width: 7px;
+ height: 7px;
+ margin-right: 2px;
+ border-right: 1.5px solid var(--ink-quiet);
+ border-bottom: 1.5px solid var(--ink-quiet);
+ transform: rotate(45deg) translateY(-1px);
+ transition: transform 0.2s;
+}
+
+.select.open .select-arrow {
+ transform: rotate(-135deg) translateY(-1px);
+}
+
+.select-menu {
+ position: absolute;
+ top: calc(100% + 4px);
+ left: 0;
+ right: 0;
+ z-index: 30;
+ max-height: 260px;
+ overflow-y: auto;
+ background: var(--vscode-dropdown-background, var(--card-soft));
+ border: 1px solid var(--rule);
+ border-radius: 8px;
+ padding: 4px;
+ box-shadow: 0 12px 32px -8px rgba(0, 0, 0, 0.6);
+}
+
+.select-option {
+ padding: 6px 9px;
+ border-radius: 6px;
+ font-family: var(--font-mono);
+ font-size: 12px;
+ color: var(--ink-soft);
+ cursor: pointer;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ transition: background-color 0.12s, color 0.12s;
+}
+
+.select-option:hover {
+ background: var(--card-quiet);
+ color: var(--ink);
+}
+
+.select-option.active {
+ color: var(--mint);
+ background: var(--mint-tint);
+}
+
+.commit-list {
+ margin-top: 8px;
+ max-height: 240px;
+ overflow-y: auto;
+ padding-right: 4px;
+}
+
+.commit-row {
+ display: flex;
+ align-items: flex-start;
+ gap: 8px;
+ padding: 7px 8px;
+ border-radius: 8px;
+ cursor: pointer;
+ transition: background-color 0.15s;
+}
+
+.commit-row:hover {
+ background: var(--card-soft);
+}
+
+.commit-row.active {
+ background: var(--mint-tint);
+}
+
+.commit-radio {
+ appearance: none;
+ -webkit-appearance: none;
+ width: 14px;
+ height: 14px;
+ border: 1.5px solid var(--ink-faint);
+ border-radius: 50%;
+ background: transparent;
+ cursor: pointer;
+ flex-shrink: 0;
+ margin-top: 1px;
+ outline: none;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ transition: border-color 0.15s;
+}
+
+.commit-radio:focus,
+.commit-radio:focus-visible {
+ outline: none;
+ box-shadow: 0 0 0 3px var(--mint-tint);
+}
+
+.commit-row.active .commit-radio {
+ border-color: var(--mint);
+}
+
+.commit-row.active .commit-radio::after {
+ content: '';
+ width: 6px;
+ height: 6px;
+ border-radius: 50%;
+ background: var(--mint);
+}
+
+.commit-info {
+ flex: 1;
+ min-width: 0;
+}
+
+.commit-msg {
+ font-size: 12px;
+ color: var(--ink);
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ line-height: 1.4;
+}
+
+.commit-meta {
+ font-size: 10.5px;
+ color: var(--ink-faint);
+ font-family: var(--font-mono);
+ margin-top: 1px;
+}
+
+.commit-meta .commit-sha {
+ color: var(--ink-quiet);
+}
+
+.files-label {
+ font-size: 10.5px;
+ letter-spacing: 0.18em;
+ text-transform: uppercase;
+ color: var(--ink-quiet);
+ font-weight: 600;
+ margin-bottom: 8px;
+ display: flex;
+ align-items: center;
+ gap: 8px;
+}
+
+.files-label::before {
+ content: '';
+ width: 6px;
+ height: 6px;
+ border-radius: 50%;
+ background: var(--mint);
+ box-shadow: 0 0 6px var(--mint-glow);
+ flex-shrink: 0;
+}
+
+.file-list {
+ margin-bottom: 14px;
+}
+
+.file-scroll {
+ min-height: 90px;
+ max-height: 200px;
+ overflow-y: auto;
+ padding-right: 4px;
+}
+
+/* 内部滚动容器细滚动条(覆盖 webview 注入的粗滚动条) */
+.commit-list::-webkit-scrollbar,
+.file-scroll::-webkit-scrollbar {
+ width: 5px;
+}
+
+.commit-list::-webkit-scrollbar-track,
+.file-scroll::-webkit-scrollbar-track {
+ background: transparent;
+}
+
+.commit-list::-webkit-scrollbar-thumb,
+.file-scroll::-webkit-scrollbar-thumb {
+ background: var(--vscode-scrollbarSlider-background, rgba(255, 255, 255, 0.10));
+ border-radius: 3px;
+}
+
+.commit-list::-webkit-scrollbar-thumb:hover,
+.file-scroll::-webkit-scrollbar-thumb:hover {
+ background: var(--vscode-scrollbarSlider-hoverBackground, rgba(255, 255, 255, 0.20));
+}
+
+.file-loading {
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+ padding: 4px;
+}
+
+.skeleton-row {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ height: 22px;
+}
+
+.skeleton-bar {
+ height: 11px;
+ border-radius: 4px;
+ background: linear-gradient(
+ 90deg,
+ var(--fill-soft) 25%,
+ var(--fill) 50%,
+ var(--fill-soft) 75%
+ );
+ background-size: 200% 100%;
+ animation: shimmer 1.3s ease-in-out infinite;
+}
+
+@keyframes shimmer {
+ 0% { background-position: 200% 0; }
+ 100% { background-position: -200% 0; }
+}
+
+.file-empty {
+ min-height: 90px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ padding: 10px 4px;
+ font-size: 12px;
+ color: var(--ink-faint);
+}
+
+.file-row {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ padding: 5px 4px;
+ border-radius: 6px;
+ transition: background-color 0.15s;
+ cursor: pointer;
+}
+
+.file-row:hover {
+ background: var(--card-soft);
+}
+
+.file-row input[type="checkbox"] {
+ appearance: none;
+ -webkit-appearance: none;
+ width: 14px;
+ height: 14px;
+ border: 1.5px solid var(--ink-faint);
+ border-radius: 3px;
+ background: transparent;
+ cursor: pointer;
+ flex-shrink: 0;
+ position: relative;
+ transition: border-color 0.15s, background-color 0.15s;
+}
+
+.file-row input[type="checkbox"]:checked {
+ background: var(--mint);
+ border-color: var(--mint);
+}
+
+.file-row input[type="checkbox"]:checked::after {
+ content: '';
+ position: absolute;
+ left: 3.5px;
+ top: 1px;
+ width: 4px;
+ height: 7px;
+ border: solid #0a1010;
+ border-width: 0 1.5px 1.5px 0;
+ transform: rotate(45deg);
+}
+
+.file-name {
+ font-family: var(--font-mono);
+ font-size: 12.5px;
+ color: var(--ink);
+ flex: 1;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+.file-badge {
+ font-size: 10px;
+ font-weight: 600;
+ letter-spacing: 0.08em;
+ padding: 1px 6px;
+ border-radius: 4px;
+ flex-shrink: 0;
+}
+
+.file-badge.added {
+ color: var(--mint);
+ background: var(--mint-tint);
+}
+
+.file-badge.modified {
+ color: var(--ink-quiet);
+ background: var(--fill-soft);
+}
+
+.file-badge.deleted {
+ color: var(--ink-faint);
+ background: var(--fill-soft);
+}
+
+.primary-btn {
+ width: 100%;
+ margin-top: 12px;
+ padding: 8px 14px;
+ background: var(--mint);
+ color: #0a1010;
+ border: none;
+ border-radius: 8px;
+ font-family: var(--font);
+ font-size: 12.5px;
+ font-weight: 600;
+ cursor: pointer;
+ transition: background-color 0.2s;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 8px;
+}
+
+.primary-btn:hover {
+ background: var(--mint-soft);
+}
+
+.primary-btn:disabled {
+ background: var(--fill);
+ color: var(--ink-quiet);
+ cursor: not-allowed;
+}
+
+.skeleton-btn {
+ background: var(--fill-soft);
+ pointer-events: none;
+}
+
+.skeleton-btn .skeleton-bar {
+ height: 11px;
+}
+
+.config-fab {
+ position: absolute;
+ top: 8px;
+ right: 10px;
+ z-index: 5;
+ width: 28px;
+ height: 28px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background: none;
+ border: none;
+ border-radius: 6px;
+ color: var(--ink-quiet);
+ font-size: 15px;
+ cursor: pointer;
+ transition: background-color 0.2s, color 0.2s;
+}
+
+.config-fab:hover {
+ background: var(--fill-soft);
+ color: var(--ink);
+}
+
+/* === 6. Action Region === */
+.action-region {
+ flex: 1;
+ overflow-y: auto;
+ padding: 12px;
+ padding-top: 44px;
+}
+
+.result-region {
+ margin-top: 16px;
+ padding-top: 16px;
+ border-top: 1px solid var(--rule);
+}
+
+.idle-note {
+ text-align: center;
+ padding: 40px 20px;
+ font-size: 12.5px;
+ color: var(--ink-faint);
+ line-height: 1.6;
+}
+
+/* Running: Log Viewer */
+.log-viewer {
+ background: var(--bg-deeper);
+ border: 1px solid var(--rule-soft);
+ border-radius: 10px;
+ padding: 10px 12px;
+ font-family: var(--font-mono);
+ font-size: 11px;
+ line-height: 1.75;
+ color: var(--ink-soft);
+ max-height: 320px;
+ overflow-y: auto;
+}
+
+.logs-disclosure {
+ margin-bottom: 14px;
+}
+
+.logs-toggle {
+ display: flex;
+ align-items: center;
+ gap: 6px;
+ background: none;
+ border: none;
+ padding: 4px 0;
+ margin-bottom: 6px;
+ font-family: var(--font);
+ font-size: 11.5px;
+ color: var(--ink-quiet);
+ cursor: pointer;
+ transition: color 0.15s;
+}
+
+.logs-toggle:hover {
+ color: var(--ink-soft);
+}
+
+.logs-toggle-arrow {
+ width: 5px;
+ height: 5px;
+ border-right: 1.5px solid currentColor;
+ border-bottom: 1.5px solid currentColor;
+ transform: rotate(-45deg);
+ transition: transform 0.2s;
+}
+
+.logs-toggle-arrow.open {
+ transform: rotate(45deg);
+}
+
+.log-line {
+ white-space: pre-wrap;
+ word-break: break-all;
+}
+
+.log-line.hidden {
+ display: none;
+}
+
+.log-line .log-tag {
+ color: var(--ink-quiet);
+}
+
+.log-line .log-file {
+ color: var(--mint);
+}
+
+.log-line .log-dim {
+ color: var(--ink-faint);
+}
+
+.log-line .log-warn {
+ color: #e6a845;
+}
+
+.log-line.log-warn {
+ color: #e6a845;
+}
+
+.log-cursor {
+ display: inline-block;
+ width: 2px;
+ height: 12px;
+ background: var(--mint);
+ vertical-align: text-bottom;
+ animation: blink 1s step-end infinite;
+ margin-left: 3px;
+}
+
+@keyframes blink {
+
+ 0%,
+ 100% {
+ opacity: 1;
+ }
+
+ 50% {
+ opacity: 0;
+ }
+}
+
+.cancel-pill {
+ display: inline-flex;
+ align-items: center;
+ padding: 5px 14px;
+ background: var(--fill-soft);
+ border: 1px solid var(--rule);
+ border-radius: 999px;
+ font-family: var(--font);
+ font-size: 11.5px;
+ color: var(--ink-quiet);
+ cursor: pointer;
+ margin-top: 12px;
+ float: right;
+ transition: background-color 0.2s, color 0.2s;
+}
+
+.cancel-pill:hover {
+ background: var(--fill);
+ color: var(--ink-soft);
+}
+
+.replay-btn {
+ display: inline-flex;
+ align-items: center;
+ gap: 6px;
+ padding: 5px 12px;
+ background: var(--fill-soft);
+ border: 1px solid var(--rule);
+ border-radius: 999px;
+ font-family: var(--font);
+ font-size: 11px;
+ color: var(--ink-quiet);
+ cursor: pointer;
+ margin-top: 8px;
+ transition: background-color 0.2s, color 0.2s;
+}
+
+.replay-btn:hover {
+ background: var(--fill);
+ color: var(--ink-soft);
+}
+
+.replay-btn:disabled {
+ opacity: 0.4;
+ cursor: not-allowed;
+}
+
+/* Done: Summary */
+.done-summary {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ padding: 10px 14px;
+ background: var(--mint-tint);
+ border-radius: 10px;
+ margin-bottom: 14px;
+ font-size: 12.5px;
+ color: var(--mint);
+ font-weight: 500;
+}
+
+.done-summary .ds-dot {
+ width: 6px;
+ height: 6px;
+ border-radius: 50%;
+ background: var(--mint);
+ flex-shrink: 0;
+}
+
+/* Comment Card */
+.comment-card {
+ background: var(--card-soft);
+ border-radius: 12px;
+ padding: 14px;
+ margin-bottom: 10px;
+ transition: opacity 0.3s, max-height 0.3s, padding 0.3s, margin 0.3s;
+ max-height: 400px;
+ overflow: hidden;
+}
+
+.comment-card.dismissed {
+ opacity: 0;
+ max-height: 0;
+ padding: 0 14px;
+ margin-bottom: 0;
+}
+
+.comment-header {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ margin-bottom: 8px;
+ flex-wrap: wrap;
+}
+
+.comment-file {
+ font-family: var(--font-mono);
+ font-size: 11.5px;
+ color: var(--ink-soft);
+}
+
+.comment-line {
+ font-family: var(--font-mono);
+ font-size: 11px;
+ color: var(--ink-quiet);
+ background: var(--card-quiet);
+ padding: 1px 6px;
+ border-radius: 4px;
+}
+
+.severity-pill {
+ font-size: 10px;
+ font-weight: 600;
+ letter-spacing: 0.1em;
+ text-transform: uppercase;
+ padding: 2px 8px;
+ border-radius: 999px;
+}
+
+.severity-pill.critical {
+ background: var(--mint-tint);
+ color: var(--mint);
+}
+
+.severity-pill.warn {
+ background: var(--card-quiet);
+ color: var(--ink-soft);
+}
+
+.severity-pill.info {
+ background: var(--fill-soft);
+ color: var(--ink-quiet);
+}
+
+.comment-body {
+ font-size: 13px;
+ line-height: 1.6;
+ color: var(--ink);
+ margin-bottom: 10px;
+}
+
+.comment-actions {
+ display: flex;
+ gap: 6px;
+}
+
+.comment-actions button {
+ background: none;
+ border: 1px solid var(--rule);
+ border-radius: 6px;
+ padding: 4px 10px;
+ font-family: var(--font);
+ font-size: 11px;
+ color: var(--ink-quiet);
+ cursor: pointer;
+ transition: background-color 0.15s, color 0.15s, border-color 0.15s;
+}
+
+.comment-actions button:hover {
+ background: var(--card-quiet);
+ color: var(--ink-soft);
+ border-color: var(--rule);
+}
+
+.empty-note {
+ text-align: center;
+ padding: 40px 20px;
+}
+
+.empty-note .en-dot {
+ display: inline-block;
+ width: 8px;
+ height: 8px;
+ border-radius: 50%;
+ background: var(--mint);
+ box-shadow: 0 0 8px var(--mint-glow);
+ margin-bottom: 14px;
+}
+
+.empty-note .en-text {
+ font-size: 13px;
+ color: var(--mint);
+ font-weight: 500;
+}
+
+.cancelled-note {
+ padding: 12px 14px;
+ border-left: 2.5px solid var(--ink-faint);
+ border-radius: 0 10px 10px 0;
+ background: var(--card-soft);
+ margin-bottom: 14px;
+ font-size: 12.5px;
+ color: var(--ink-quiet);
+ line-height: 1.5;
+}
+
+.failed-card {
+ background: var(--card-soft);
+ border-radius: 12px;
+ padding: 18px;
+ text-align: center;
+}
+
+.failed-card .fc-msg {
+ font-size: 13px;
+ color: var(--ink-soft);
+ margin-bottom: 14px;
+ line-height: 1.6;
+}
+
+.failed-card .fc-detail {
+ font-family: var(--font-mono, monospace);
+ font-size: 11px;
+ color: var(--ink-soft);
+ background: rgba(0, 0, 0, 0.25);
+ border-radius: 8px;
+ padding: 8px 10px;
+ margin-bottom: 14px;
+ text-align: left;
+ white-space: pre-wrap;
+ word-break: break-word;
+ max-height: 160px;
+ overflow-y: auto;
+ user-select: text;
+}
+
+.retry-pill {
+ display: inline-flex;
+ align-items: center;
+ padding: 6px 18px;
+ background: var(--mint);
+ color: #0a1010;
+ border: none;
+ border-radius: 999px;
+ font-family: var(--font);
+ font-size: 12px;
+ font-weight: 600;
+ cursor: pointer;
+ transition: background-color 0.2s;
+}
+
+.retry-pill:hover {
+ background: var(--mint-soft);
+}
+
+/* === 7. Config Views === */
+.config-empty {
+ padding: 60px 24px;
+ text-align: center;
+}
+
+.config-empty .ce-dot {
+ display: inline-block;
+ width: 10px;
+ height: 10px;
+ border-radius: 50%;
+ background: var(--mint);
+ box-shadow: 0 0 12px var(--mint-glow);
+ margin-bottom: 20px;
+}
+
+.config-empty .ce-label {
+ font-size: 10.5px;
+ letter-spacing: 0.18em;
+ text-transform: uppercase;
+ color: var(--ink-quiet);
+ font-weight: 600;
+ margin-bottom: 16px;
+}
+
+.config-empty .ce-title {
+ font-size: 17px;
+ font-weight: 600;
+ color: var(--ink);
+ margin-bottom: 10px;
+}
+
+.config-empty .ce-desc {
+ font-size: 12.5px;
+ color: var(--ink-quiet);
+ line-height: 1.6;
+ margin-bottom: 28px;
+ max-width: 260px;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.config-empty .ce-btn {
+ display: inline-flex;
+ align-items: center;
+ gap: 6px;
+ padding: 10px 24px;
+ background: var(--mint);
+ color: #0a1010;
+ border: none;
+ border-radius: 10px;
+ font-family: var(--font);
+ font-size: 13px;
+ font-weight: 600;
+ cursor: pointer;
+ transition: background-color 0.2s;
+}
+
+.config-empty .ce-btn:hover {
+ background: var(--mint-soft);
+}
+
+.config-list {
+ padding: 14px;
+}
+
+.config-list-header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ margin-bottom: 14px;
+}
+
+.config-list-title {
+ font-size: 10.5px;
+ letter-spacing: 0.18em;
+ text-transform: uppercase;
+ color: var(--ink-quiet);
+ font-weight: 600;
+ display: flex;
+ align-items: center;
+ gap: 8px;
+}
+
+.config-list-title::before {
+ content: '';
+ width: 6px;
+ height: 6px;
+ border-radius: 50%;
+ background: var(--mint);
+ box-shadow: 0 0 6px var(--mint-glow);
+}
+
+.config-list-close {
+ background: none;
+ border: none;
+ color: var(--ink-quiet);
+ font-size: 16px;
+ cursor: pointer;
+ padding: 4px 8px;
+ border-radius: 6px;
+ transition: background-color 0.2s, color 0.2s;
+}
+
+.config-list-close:hover {
+ background: var(--card-quiet);
+ color: var(--ink);
+}
+
+.provider-card {
+ background: var(--card-soft);
+ border-radius: 12px;
+ padding: 14px;
+ margin-bottom: 8px;
+ cursor: pointer;
+ transition: background-color 0.15s;
+ display: flex;
+ align-items: center;
+ gap: 10px;
+}
+
+.provider-card:hover {
+ background: var(--card-quiet);
+}
+
+.provider-card .pc-name {
+ font-size: 13px;
+ font-weight: 600;
+ color: var(--ink);
+ flex: 1;
+}
+
+.provider-card .pc-models {
+ font-size: 11px;
+ color: var(--ink-quiet);
+}
+
+.provider-card .pc-active {
+ width: 6px;
+ height: 6px;
+ border-radius: 50%;
+ background: var(--mint);
+ box-shadow: 0 0 6px var(--mint-glow);
+}
+
+.config-add-btn {
+ width: 100%;
+ padding: 10px;
+ background: transparent;
+ border: 1px dashed var(--rule);
+ border-radius: 10px;
+ font-family: var(--font);
+ font-size: 12.5px;
+ color: var(--ink-quiet);
+ cursor: pointer;
+ margin-top: 8px;
+ transition: background-color 0.2s, color 0.2s, border-color 0.2s;
+}
+
+.config-add-btn:hover {
+ background: var(--card-soft);
+ color: var(--ink-soft);
+ border-color: var(--rule);
+}
+
+/* === Config Modal === */
+.modal-backdrop {
+ position: fixed;
+ inset: 0;
+ z-index: 50;
+ background: rgba(0, 0, 0, 0.55);
+ display: flex;
+ align-items: flex-start;
+ justify-content: center;
+ padding: 16px;
+}
+
+.modal-panel {
+ width: 100%;
+ max-width: 360px;
+ max-height: 90vh;
+ overflow-y: auto;
+ background: var(--vscode-editor-background, var(--card));
+ border: 1px solid var(--rule);
+ border-radius: 14px;
+ padding: 18px;
+ box-shadow: 0 20px 48px -12px rgba(0, 0, 0, 0.7);
+}
+
+.config-form {
+ padding: 14px;
+}
+
+.config-form-header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ margin-bottom: 18px;
+}
+
+/* === Config Wizard === */
+.wizard-steps {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ margin-bottom: 18px;
+}
+
+.wizard-step {
+ font-size: 11px;
+ color: var(--ink-faint);
+ white-space: nowrap;
+ transition: color 0.2s;
+}
+
+.wizard-step.active {
+ color: var(--ink);
+ font-weight: 600;
+}
+
+.wizard-step.done {
+ color: var(--mint);
+}
+
+.wizard-step-line {
+ flex: 1;
+ height: 1px;
+ background: var(--rule);
+}
+
+.wizard-body {
+ display: flex;
+ flex-direction: column;
+ gap: 14px;
+}
+
+.cli-status {
+ font-size: 12.5px;
+ line-height: 1.6;
+ padding: 10px 12px;
+ border-radius: 8px;
+}
+
+.cli-status.checking {
+ color: var(--ink-quiet);
+ background: var(--fill-soft);
+}
+
+.cli-status.missing {
+ color: var(--ink-soft);
+ background: var(--fill-soft);
+}
+
+.cli-status.ok {
+ color: var(--mint);
+ background: var(--mint-tint);
+}
+
+.cli-hint {
+ font-size: 11.5px;
+ color: var(--ink-quiet);
+ line-height: 1.5;
+}
+
+.cli-hint code {
+ font-family: var(--font-mono);
+ font-size: 11px;
+ color: var(--ink-soft);
+ background: var(--card-deeper);
+ padding: 1px 5px;
+ border-radius: 4px;
+}
+
+.conn-result {
+ font-size: 12px;
+ line-height: 1.5;
+ padding: 8px 12px;
+ border-radius: 8px;
+ word-break: break-word;
+}
+
+.conn-result.testing {
+ color: var(--ink-quiet);
+ background: var(--fill-soft);
+}
+
+.conn-result.ok {
+ color: var(--mint);
+ background: var(--mint-tint);
+}
+
+.conn-result.fail {
+ color: #e6a845;
+ background: var(--fill-soft);
+}
+
+.config-form-title {
+ font-size: 10.5px;
+ letter-spacing: 0.18em;
+ text-transform: uppercase;
+ color: var(--ink-quiet);
+ font-weight: 600;
+ display: flex;
+ align-items: center;
+ gap: 8px;
+}
+
+.config-form-title::before {
+ content: '';
+ width: 6px;
+ height: 6px;
+ border-radius: 50%;
+ background: var(--mint);
+ box-shadow: 0 0 6px var(--mint-glow);
+}
+
+.form-group {
+ margin-bottom: 14px;
+}
+
+.form-label {
+ font-size: 11px;
+ letter-spacing: 0.14em;
+ text-transform: uppercase;
+ color: var(--ink-quiet);
+ font-weight: 600;
+ margin-bottom: 6px;
+ display: block;
+}
+
+.form-label .optional {
+ font-weight: 400;
+ text-transform: none;
+ letter-spacing: 0;
+ color: var(--ink-faint);
+ font-size: 10.5px;
+}
+
+.form-input {
+ width: 100%;
+ padding: 8px 12px;
+ background: var(--card-soft);
+ border: 1px solid var(--rule);
+ border-radius: 8px;
+ font-family: var(--font);
+ font-size: 13px;
+ color: var(--ink);
+ outline: none;
+ transition: border-color 0.2s, box-shadow 0.2s;
+}
+
+.form-input:focus {
+ border-color: var(--mint);
+ box-shadow: 0 0 0 2px var(--mint-tint);
+}
+
+.form-input::placeholder {
+ color: var(--ink-faint);
+}
+
+.model-rows {
+ margin-bottom: 8px;
+}
+
+.model-row-entry {
+ display: grid;
+ grid-template-columns: 1fr 1fr 28px;
+ gap: 6px;
+ margin-bottom: 6px;
+ align-items: center;
+}
+
+.model-row-entry .form-input {
+ padding: 7px 10px;
+ font-size: 12px;
+}
+
+.model-row-delete {
+ background: none;
+ border: none;
+ color: var(--ink-faint);
+ font-size: 14px;
+ cursor: pointer;
+ padding: 4px;
+ border-radius: 4px;
+ transition: color 0.15s;
+ text-align: center;
+}
+
+.model-row-delete:hover {
+ color: var(--mint);
+}
+
+.model-add-btn {
+ background: none;
+ border: none;
+ color: var(--ink-quiet);
+ font-size: 12px;
+ cursor: pointer;
+ padding: 4px 0;
+ transition: color 0.15s;
+}
+
+.model-add-btn:hover {
+ color: var(--mint);
+}
+
+.advanced-section {
+ margin-bottom: 18px;
+}
+
+.advanced-section summary {
+ font-size: 12px;
+ color: var(--ink-quiet);
+ cursor: pointer;
+ list-style: none;
+ padding: 6px 0;
+ transition: color 0.15s;
+}
+
+.advanced-section summary::-webkit-details-marker {
+ display: none;
+}
+
+.advanced-section summary:hover {
+ color: var(--ink-soft);
+}
+
+.advanced-section .adv-content {
+ padding: 10px 0;
+}
+
+.toggle-row {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+}
+
+.toggle-label {
+ font-size: 12.5px;
+ color: var(--ink-soft);
+}
+
+.toggle-switch {
+ position: relative;
+ width: 36px;
+ height: 20px;
+ background: var(--card-quiet);
+ border-radius: 999px;
+ cursor: pointer;
+ transition: background-color 0.2s;
+ border: none;
+ padding: 0;
+}
+
+.toggle-switch.on {
+ background: var(--mint);
+}
+
+.toggle-switch .toggle-knob {
+ position: absolute;
+ top: 2px;
+ left: 2px;
+ width: 16px;
+ height: 16px;
+ background: white;
+ border-radius: 50%;
+ transition: transform 0.2s;
+}
+
+.toggle-switch.on .toggle-knob {
+ transform: translateX(16px);
+}
+
+.form-actions {
+ display: flex;
+ gap: 8px;
+ margin-top: 20px;
+}
+
+.form-actions .btn-cancel {
+ flex: 1;
+ padding: 9px;
+ background: transparent;
+ border: 1px solid var(--rule);
+ border-radius: 8px;
+ font-family: var(--font);
+ font-size: 12.5px;
+ color: var(--ink-quiet);
+ cursor: pointer;
+ transition: background-color 0.15s, color 0.15s;
+}
+
+.form-actions .btn-cancel:hover {
+ background: var(--card-soft);
+ color: var(--ink-soft);
+}
+
+.form-actions .btn-save {
+ flex: 1;
+ padding: 9px;
+ background: var(--mint);
+ color: #0a1010;
+ border: none;
+ border-radius: 8px;
+ font-family: var(--font);
+ font-size: 12.5px;
+ font-weight: 600;
+ cursor: pointer;
+ transition: background-color 0.2s;
+}
+
+.form-actions .btn-save:hover {
+ background: var(--mint-soft);
+}
+
+.form-actions .btn-save:disabled {
+ opacity: 0.4;
+ cursor: not-allowed;
+}
\ No newline at end of file
diff --git a/extensions/vscode/src/webview/views/CancelledView.tsx b/extensions/vscode/src/webview/views/CancelledView.tsx
new file mode 100644
index 0000000..4314dc4
--- /dev/null
+++ b/extensions/vscode/src/webview/views/CancelledView.tsx
@@ -0,0 +1,7 @@
+export function CancelledView() {
+ return (
+
+ );
+}
diff --git a/extensions/vscode/src/webview/views/ConfigView.tsx b/extensions/vscode/src/webview/views/ConfigView.tsx
new file mode 100644
index 0000000..250a123
--- /dev/null
+++ b/extensions/vscode/src/webview/views/ConfigView.tsx
@@ -0,0 +1,185 @@
+import { useState } from 'preact/hooks';
+import { OcrConfig } from '../../shared/types';
+import { CliStatus, ConnTest } from '../store';
+import { LogLine } from '../../shared/types';
+import { LogViewer } from '../components/LogViewer';
+import { Select } from '../components/Select';
+
+interface Props {
+ config: OcrConfig | null;
+ cliStatus: CliStatus;
+ installing: boolean;
+ installLogs: LogLine[];
+ connTest: ConnTest;
+ onInstall: () => void;
+ onCheckCli: () => void;
+ onTest: () => void;
+ onSave: (entries: { key: string; value: string }[]) => void;
+ onClose: () => void;
+}
+
+export function ConfigView({
+ config, cliStatus, installing, installLogs, connTest,
+ onInstall, onCheckCli, onTest, onSave, onClose,
+}: Props) {
+ const [step, setStep] = useState<1 | 2>(1);
+
+ const [url, setUrl] = useState(config?.llm.url ?? '');
+ const [token, setToken] = useState(config?.llm.authToken ?? '');
+ const [model, setModel] = useState(config?.llm.model ?? '');
+ const [useAnthropic, setUseAnthropic] = useState(config?.llm.useAnthropic ?? false);
+ const [authHeader, setAuthHeader] = useState(config?.llm.authHeader ?? '');
+
+ const canSave = url.trim() !== '' && model.trim() !== '';
+
+ const save = () => {
+ if (!canSave) return;
+ const entries = [
+ { key: 'llm.url', value: url.trim() },
+ { key: 'llm.auth_token', value: token.trim() },
+ { key: 'llm.model', value: model.trim() },
+ { key: 'llm.use_anthropic', value: String(useAnthropic) },
+ ];
+ if (authHeader) entries.push({ key: 'llm.auth_header', value: authHeader });
+ onSave(entries);
+ };
+
+ return (
+
+
e.stopPropagation()}>
+
+
+
+ 1 环境检测
+
+ 2 模型配置
+
+
+ {step === 1 ? (
+
setStep(2)}
+ />
+ ) : (
+ setStep(1)} onTest={onTest} onSave={save}
+ />
+ )}
+
+
+ );
+}
+
+function Step1({ cliStatus, installing, installLogs, onInstall, onCheckCli, onNext }: {
+ cliStatus: CliStatus; installing: boolean; installLogs: LogLine[];
+ onInstall: () => void; onCheckCli: () => void; onNext: () => void;
+}) {
+ if (installing) {
+ return (
+
+ );
+ }
+
+ if (cliStatus === 'checking' || cliStatus === 'unknown') {
+ return ;
+ }
+
+ if (cliStatus === 'missing') {
+ return (
+
+
未检测到 ocr 命令。需要全局安装后才能进行代码审查。
+
将执行:npm install -g @alibaba-group/open-code-review
+ {installLogs.length > 0 &&
}
+
+ 重新检测
+ 一键安装
+
+
+ );
+ }
+
+ // installed
+ return (
+
+
✓ ocr 命令已安装
+
+ 下一步
+
+
+ );
+}
+
+function Step2({
+ url, token, model, useAnthropic, authHeader,
+ setUrl, setToken, setModel, setUseAnthropic, setAuthHeader,
+ connTest, canSave, onBack, onTest, onSave,
+}: {
+ url: string; token: string; model: string; useAnthropic: boolean; authHeader: string;
+ setUrl: (v: string) => void; setToken: (v: string) => void; setModel: (v: string) => void;
+ setUseAnthropic: (v: boolean) => void; setAuthHeader: (v: string) => void;
+ connTest: ConnTest; canSave: boolean;
+ onBack: () => void; onTest: () => void; onSave: () => void;
+}) {
+ return (
+
+
+ 接口地址
+ setUrl((e.target as HTMLInputElement).value)} placeholder="https://api.anthropic.com/v1/messages" />
+
+
+ API 密钥
+ setToken((e.target as HTMLInputElement).value)} placeholder="sk-..." />
+
+
+ 模型
+ setModel((e.target as HTMLInputElement).value)} placeholder="claude-opus-4-6" />
+
+
+ 使用 Anthropic 协议
+ setUseAnthropic(!useAnthropic)}>
+
+
+
+
+
+ 高级选项
+
+
+
+ {connTest.status !== 'idle' && (
+
+ {connTest.status === 'testing' && '正在测试连接…'}
+ {connTest.status === 'ok' && '✓ 连接成功'}
+ {connTest.status === 'fail' && `✗ 连接失败${connTest.message ? ':' + connTest.message : ''}`}
+
+ )}
+
+
+ 上一步
+ 测试连接
+ 保存
+
+
+ );
+}
diff --git a/extensions/vscode/src/webview/views/DoneView.tsx b/extensions/vscode/src/webview/views/DoneView.tsx
new file mode 100644
index 0000000..8b555f3
--- /dev/null
+++ b/extensions/vscode/src/webview/views/DoneView.tsx
@@ -0,0 +1,41 @@
+import { useState } from 'preact/hooks';
+import { CliResult, CommentStatus, LogLine } from '../../shared/types';
+import { CommentCard } from '../components/CommentCard';
+import { LogViewer } from '../components/LogViewer';
+
+interface Props {
+ result: CliResult;
+ commentStatus: Record;
+ logs: LogLine[];
+ canJump: boolean;
+ onOpen: (index: number) => void;
+ onAction: (index: number, action: 'apply' | 'discard' | 'falsePositive') => void;
+}
+
+export function DoneView({ result, commentStatus, logs, canJump, onOpen, onAction }: Props) {
+ const [showLogs, setShowLogs] = useState(false);
+ const s = result.summary;
+ return (
+
+
+
+ {result.comments.length} 条评论 · {s?.filesReviewed ?? 0} 个文件 · {s?.elapsed ?? ''}
+
+
+ {logs.length > 0 && (
+
+ setShowLogs(!showLogs)}>
+
+ 过程日志
+
+ {showLogs && }
+
+ )}
+
+ {result.comments.map((c, i) => (
+
+ ))}
+
+ );
+}
diff --git a/extensions/vscode/src/webview/views/EmptyView.tsx b/extensions/vscode/src/webview/views/EmptyView.tsx
new file mode 100644
index 0000000..e0f2eb2
--- /dev/null
+++ b/extensions/vscode/src/webview/views/EmptyView.tsx
@@ -0,0 +1,27 @@
+import { useState } from 'preact/hooks';
+import { LogLine } from '../../shared/types';
+import { LogViewer } from '../components/LogViewer';
+
+interface Props { logs?: LogLine[]; }
+
+export function EmptyView({ logs = [] }: Props) {
+ const [showLogs, setShowLogs] = useState(false);
+ return (
+
+
+
+ {logs.length > 0 && (
+
+ setShowLogs(!showLogs)}>
+
+ 过程日志
+
+ {showLogs && }
+
+ )}
+
+ );
+}
diff --git a/extensions/vscode/src/webview/views/FailedView.tsx b/extensions/vscode/src/webview/views/FailedView.tsx
new file mode 100644
index 0000000..60b490d
--- /dev/null
+++ b/extensions/vscode/src/webview/views/FailedView.tsx
@@ -0,0 +1,12 @@
+interface Props { onRetry: () => void; error?: string; }
+export function FailedView({ onRetry, error }: Props) {
+ return (
+
+
+
审查失败。 {error ? '请检查模型配置后重试。' : '请检查 API Key 和网络连接。'}
+ {error &&
{error}
}
+
重试
+
+
+ );
+}
diff --git a/extensions/vscode/src/webview/views/IdleView.tsx b/extensions/vscode/src/webview/views/IdleView.tsx
new file mode 100644
index 0000000..2872ba2
--- /dev/null
+++ b/extensions/vscode/src/webview/views/IdleView.tsx
@@ -0,0 +1,104 @@
+import { useState, useEffect } from 'preact/hooks';
+import { GitState, ReviewMode, CliRunOptions, FileChange } from '../../shared/types';
+import { FileList } from '../components/FileList';
+import { Select } from '../components/Select';
+
+interface Props {
+ gitState: GitState;
+ modeFiles: FileChange[];
+ filesLoading: boolean;
+ configured: boolean;
+ onModeChange: (mode: ReviewMode) => void;
+ onRequestModeFiles: (mode: ReviewMode, from?: string, to?: string, commit?: string) => void;
+ onOpenFile: (file: FileChange, mode: ReviewMode, from?: string, to?: string, commit?: string) => void;
+ onStart: (options: CliRunOptions) => void;
+ running?: boolean;
+}
+
+export function IdleView({ gitState, modeFiles, filesLoading, configured, onModeChange, onRequestModeFiles, onOpenFile, onStart, running }: Props) {
+ const [mode, setMode] = useState('workspace');
+ const [from, setFrom] = useState('');
+ const [to, setTo] = useState('');
+ const [commit, setCommit] = useState('');
+ const [prompt, setPrompt] = useState('');
+
+ const switchMode = (m: ReviewMode) => { setMode(m); onModeChange(m); };
+
+ // 分支两端都选好后,拉取 diff 文件列表
+ useEffect(() => {
+ if (mode === 'branch' && from && to) onRequestModeFiles('branch', from, to);
+ }, [mode, from, to]);
+
+ // 选中某 commit 后,拉取该 commit 文件列表
+ useEffect(() => {
+ if (mode === 'commit' && commit) onRequestModeFiles('commit', undefined, undefined, commit);
+ }, [mode, commit]);
+
+ const files = mode === 'workspace' ? gitState.workspaceFiles : modeFiles;
+ // 仅在「确实发起了请求」时显示 loading:分支需选满两端,提交需选中 commit。
+ const willRequest = mode === 'workspace' || (mode === 'branch' && !!from && !!to) || (mode === 'commit' && !!commit);
+ const loading = filesLoading && willRequest;
+ // 可发起审查的前置条件:按 tab 校验选择已就绪,且有待审查文件、不在加载/审查中。
+ const selectionReady =
+ mode === 'workspace' || (mode === 'branch' && !!from && !!to) || (mode === 'commit' && !!commit);
+ const canReview = configured && !running && !loading && selectionReady && files.length > 0;
+
+ return (
+
+
+ {(['workspace', 'branch', 'commit'] as ReviewMode[]).map((m) => (
+ switchMode(m)}>
+ {m === 'workspace' ? '工作区' : m === 'branch' ? '分支对比' : '单次提交'}
+
+ ))}
+
+
+ {mode === 'branch' && (
+
+
基础引用
+
({ value: b, label: b }))} />
+ 目标引用
+ ({ value: b, label: b }))} />
+
+ )}
+
+ {mode === 'commit' && (
+
+
提交历史
+
+ {gitState.recentCommits.map((c) => (
+
setCommit(c.sha)}>
+
+
+
{c.message}
+
{c.sha} · {c.relativeTime}
+
+
+ ))}
+
+
+ )}
+
+
onOpenFile(f, mode, from, to, commit)} />
+
+
+ );
+}
diff --git a/extensions/vscode/src/webview/views/RunningView.tsx b/extensions/vscode/src/webview/views/RunningView.tsx
new file mode 100644
index 0000000..d2984ec
--- /dev/null
+++ b/extensions/vscode/src/webview/views/RunningView.tsx
@@ -0,0 +1,15 @@
+import { LogLine } from '../../shared/types';
+import { LogViewer } from '../components/LogViewer';
+
+interface Props { logs: LogLine[]; onCancel: () => void; }
+
+export function RunningView({ logs, onCancel }: Props) {
+ return (
+
+ );
+}
diff --git a/extensions/vscode/tsconfig.extension.json b/extensions/vscode/tsconfig.extension.json
new file mode 100644
index 0000000..1ebaf38
--- /dev/null
+++ b/extensions/vscode/tsconfig.extension.json
@@ -0,0 +1,13 @@
+{
+ "extends": "./tsconfig.json",
+ "compilerOptions": {
+ "module": "commonjs",
+ "moduleResolution": "node",
+ "target": "ES2021",
+ "lib": ["ES2021"],
+ "outDir": "out",
+ "types": ["node", "vscode", "jest"]
+ },
+ "include": ["src/extension/**/*", "src/shared/**/*"],
+ "exclude": ["node_modules", "out", "reference", "**/__tests__/**", "**/*.test.ts"]
+}
diff --git a/extensions/vscode/tsconfig.json b/extensions/vscode/tsconfig.json
new file mode 100644
index 0000000..3caf2c2
--- /dev/null
+++ b/extensions/vscode/tsconfig.json
@@ -0,0 +1,20 @@
+{
+ "compilerOptions": {
+ "strict": true,
+ "esModuleInterop": true,
+ "skipLibCheck": true,
+ "forceConsistentCasingInFileNames": true,
+ "resolveJsonModule": true,
+ "declaration": false,
+ "sourceMap": true,
+ "module": "ESNext",
+ "moduleResolution": "Bundler",
+ "target": "ES2021",
+ "lib": ["ES2021", "DOM", "DOM.Iterable"],
+ "jsx": "react-jsx",
+ "jsxImportSource": "preact",
+ "types": ["node", "vscode", "jest"]
+ },
+ "include": ["src/**/*"],
+ "exclude": ["node_modules", "out", "reference"]
+}
diff --git a/extensions/vscode/tsconfig.webview.json b/extensions/vscode/tsconfig.webview.json
new file mode 100644
index 0000000..833ed59
--- /dev/null
+++ b/extensions/vscode/tsconfig.webview.json
@@ -0,0 +1,14 @@
+{
+ "extends": "./tsconfig.json",
+ "compilerOptions": {
+ "module": "ESNext",
+ "moduleResolution": "Bundler",
+ "target": "ES2020",
+ "lib": ["ES2020", "DOM", "DOM.Iterable"],
+ "jsx": "react-jsx",
+ "jsxImportSource": "preact",
+ "types": []
+ },
+ "include": ["src/webview/**/*", "src/shared/**/*"],
+ "exclude": ["node_modules", "out", "reference", "**/__tests__/**", "**/*.test.ts", "**/*.test.tsx"]
+}
diff --git a/extensions/vscode/webpack.config.js b/extensions/vscode/webpack.config.js
new file mode 100644
index 0000000..823bab8
--- /dev/null
+++ b/extensions/vscode/webpack.config.js
@@ -0,0 +1,50 @@
+const path = require('path');
+
+/** @type {import('webpack').Configuration} */
+const extensionConfig = {
+ name: 'extension',
+ target: 'node',
+ entry: { extension: './src/extension/extension.ts' },
+ output: {
+ path: path.resolve(__dirname, 'out'),
+ filename: '[name].js',
+ libraryTarget: 'commonjs2',
+ },
+ externals: { vscode: 'commonjs vscode' },
+ resolve: { extensions: ['.ts', '.js'] },
+ module: {
+ rules: [
+ {
+ test: /\.ts$/,
+ exclude: /node_modules/,
+ use: { loader: 'ts-loader', options: { configFile: 'tsconfig.extension.json' } },
+ },
+ ],
+ },
+ devtool: 'source-map',
+};
+
+/** @type {import('webpack').Configuration} */
+const webviewConfig = {
+ name: 'webview',
+ target: 'web',
+ entry: { webview: './src/webview/index.tsx' },
+ output: {
+ path: path.resolve(__dirname, 'out'),
+ filename: '[name].js',
+ },
+ resolve: { extensions: ['.ts', '.tsx', '.js'] },
+ module: {
+ rules: [
+ {
+ test: /\.tsx?$/,
+ exclude: /node_modules/,
+ use: { loader: 'ts-loader', options: { configFile: 'tsconfig.webview.json' } },
+ },
+ { test: /\.css$/, use: ['style-loader', 'css-loader'] },
+ ],
+ },
+ devtool: 'source-map',
+};
+
+module.exports = [extensionConfig, webviewConfig];
diff --git a/extensions/vscode/yarn.lock b/extensions/vscode/yarn.lock
new file mode 100644
index 0000000..66e2901
--- /dev/null
+++ b/extensions/vscode/yarn.lock
@@ -0,0 +1,5019 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@azu/format-text@^1.0.1", "@azu/format-text@^1.0.2":
+ version "1.0.2"
+ resolved "https://registry.anpm.alibaba-inc.com/@azu/format-text/-/format-text-1.0.2.tgz#abd46dab2422e312bd1bfe36f0d427ab6039825d"
+ integrity sha512-Swi4N7Edy1Eqq82GxgEECXSSLyn6GOb5htRFPzBDdUkECGXtlf12ynO5oJSpWKPwCaUssOu7NfhDcCWpIC6Ywg==
+
+"@azu/style-format@^1.0.1":
+ version "1.0.1"
+ resolved "https://registry.anpm.alibaba-inc.com/@azu/style-format/-/style-format-1.0.1.tgz#b3643af0c5fee9d53e69a97c835c404bdc80f792"
+ integrity sha512-AHcTojlNBdD/3/KxIKlg8sxIWHfOtQszLvOpagLTO+bjC3u7SAszu1lf//u7JJC50aUSH+BVWDD/KvaA6Gfn5g==
+ dependencies:
+ "@azu/format-text" "^1.0.1"
+
+"@azure/abort-controller@^2.0.0", "@azure/abort-controller@^2.1.2":
+ version "2.1.2"
+ resolved "https://registry.anpm.alibaba-inc.com/@azure/abort-controller/-/abort-controller-2.1.2.tgz#42fe0ccab23841d9905812c58f1082d27784566d"
+ integrity sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==
+ dependencies:
+ tslib "^2.6.2"
+
+"@azure/core-auth@^1.10.0", "@azure/core-auth@^1.9.0":
+ version "1.10.1"
+ resolved "https://registry.anpm.alibaba-inc.com/@azure/core-auth/-/core-auth-1.10.1.tgz#68a17fa861ebd14f6fd314055798355ef6bedf1b"
+ integrity sha512-ykRMW8PjVAn+RS6ww5cmK9U2CyH9p4Q88YJwvUslfuMmN98w/2rdGRLPqJYObapBCdzBVeDgYWdJnFPFb7qzpg==
+ dependencies:
+ "@azure/abort-controller" "^2.1.2"
+ "@azure/core-util" "^1.13.0"
+ tslib "^2.6.2"
+
+"@azure/core-client@^1.9.2":
+ version "1.10.2"
+ resolved "https://registry.anpm.alibaba-inc.com/@azure/core-client/-/core-client-1.10.2.tgz#a964e00370df37c09c8770bb5c6f17fef1fc4956"
+ integrity sha512-1D2LpsU7y9xrqKjdIbsB7PlrRePw0xsVV8p+AKTlzITrWmscajryfJCdDJB/oGwvDI5HmRo04eMMADB67uwAwQ==
+ dependencies:
+ "@azure/abort-controller" "^2.1.2"
+ "@azure/core-auth" "^1.10.0"
+ "@azure/core-rest-pipeline" "^1.22.0"
+ "@azure/core-tracing" "^1.3.0"
+ "@azure/core-util" "^1.13.0"
+ "@azure/logger" "^1.3.0"
+ tslib "^2.6.2"
+
+"@azure/core-rest-pipeline@^1.17.0", "@azure/core-rest-pipeline@^1.22.0":
+ version "1.24.0"
+ resolved "https://registry.anpm.alibaba-inc.com/@azure/core-rest-pipeline/-/core-rest-pipeline-1.24.0.tgz#7582157ffebfe60d0a7fc00fd292203d8cbd3f40"
+ integrity sha512-PpLsoDQ3AMmKZ0VU+0GrmqMxgp/sExjlVm4R+nLWngeoEGAzOIPVifaxKGU5gMv+nWELUoHfvrolWD+ZS/nFJg==
+ dependencies:
+ "@azure/abort-controller" "^2.1.2"
+ "@azure/core-auth" "^1.10.0"
+ "@azure/core-tracing" "^1.3.0"
+ "@azure/core-util" "^1.13.0"
+ "@azure/logger" "^1.3.0"
+ "@typespec/ts-http-runtime" "^0.3.4"
+ tslib "^2.6.2"
+
+"@azure/core-tracing@^1.0.0", "@azure/core-tracing@^1.3.0":
+ version "1.3.1"
+ resolved "https://registry.anpm.alibaba-inc.com/@azure/core-tracing/-/core-tracing-1.3.1.tgz#e971045c901ea9c110616b0e1db272507781d5f6"
+ integrity sha512-9MWKevR7Hz8kNzzPLfX4EAtGM2b8mr50HPDBvio96bURP/9C+HjdH3sBlLSNNrvRAr5/k/svoH457gB5IKpmwQ==
+ dependencies:
+ tslib "^2.6.2"
+
+"@azure/core-util@^1.11.0", "@azure/core-util@^1.13.0":
+ version "1.13.1"
+ resolved "https://registry.anpm.alibaba-inc.com/@azure/core-util/-/core-util-1.13.1.tgz#6dff2ff6d3c9c6430c6f4d3b3e65de531f10bafe"
+ integrity sha512-XPArKLzsvl0Hf0CaGyKHUyVgF7oDnhKoP85Xv6M4StF/1AhfORhZudHtOyf2s+FcbuQ9dPRAjB8J2KvRRMUK2A==
+ dependencies:
+ "@azure/abort-controller" "^2.1.2"
+ "@typespec/ts-http-runtime" "^0.3.0"
+ tslib "^2.6.2"
+
+"@azure/identity@^4.1.0":
+ version "4.13.1"
+ resolved "https://registry.anpm.alibaba-inc.com/@azure/identity/-/identity-4.13.1.tgz#bdc091658baa59a47ee9fbab487a4bb018729bc3"
+ integrity sha512-5C/2WD5Vb1lHnZS16dNQRPMjN6oV/Upba+C9nBIs15PmOi6A3ZGs4Lr2u60zw4S04gi+u3cEXiqTVP7M4Pz3kw==
+ dependencies:
+ "@azure/abort-controller" "^2.0.0"
+ "@azure/core-auth" "^1.9.0"
+ "@azure/core-client" "^1.9.2"
+ "@azure/core-rest-pipeline" "^1.17.0"
+ "@azure/core-tracing" "^1.0.0"
+ "@azure/core-util" "^1.11.0"
+ "@azure/logger" "^1.0.0"
+ "@azure/msal-browser" "^5.5.0"
+ "@azure/msal-node" "^5.1.0"
+ open "^10.1.0"
+ tslib "^2.2.0"
+
+"@azure/logger@^1.0.0", "@azure/logger@^1.3.0":
+ version "1.3.0"
+ resolved "https://registry.anpm.alibaba-inc.com/@azure/logger/-/logger-1.3.0.tgz#5501cf85d4f52630602a8cc75df76568c969a827"
+ integrity sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA==
+ dependencies:
+ "@typespec/ts-http-runtime" "^0.3.0"
+ tslib "^2.6.2"
+
+"@azure/msal-browser@^5.5.0":
+ version "5.13.0"
+ resolved "https://registry.anpm.alibaba-inc.com/@azure/msal-browser/-/msal-browser-5.13.0.tgz#754b0a26e0a50d9df7bafda927a7200f5da212e3"
+ integrity sha512-Ea23x0U8XNFY+qJ9T44zO2BbY+AHdb+WdjmYnx36OhJ/KO+PGU5pmsNHf1DCElYX+6wyVRJz1HFeCPC/cHbRug==
+ dependencies:
+ "@azure/msal-common" "16.8.0"
+
+"@azure/msal-common@16.8.0":
+ version "16.8.0"
+ resolved "https://registry.anpm.alibaba-inc.com/@azure/msal-common/-/msal-common-16.8.0.tgz#8f077b2439d5dc8013ac2267cd09a99c4b2e442a"
+ integrity sha512-5S4RHOcInL2Nu2U217tDZbWGI6StMfcWCrA7TWvWdJmXQ+cYrrIqr84AsN62fGh2MDBysiBJPt6CfWceJfloEA==
+
+"@azure/msal-node@^5.1.0":
+ version "5.2.4"
+ resolved "https://registry.anpm.alibaba-inc.com/@azure/msal-node/-/msal-node-5.2.4.tgz#1748c8dc07dfd35d8c54ad70a22c732793d331cc"
+ integrity sha512-rpBUg9dA8UpC2WiFt3KeDKVQmmmVrfxdRnW+F1ebgou/jX/0tAvYuonaq5RUo8OaqzOrj4x/HaI8DmY56RXZ2Q==
+ dependencies:
+ "@azure/msal-common" "16.8.0"
+ jsonwebtoken "^9.0.0"
+
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.26.2", "@babel/code-frame@^7.29.7":
+ version "7.29.7"
+ resolved "https://registry.anpm.alibaba-inc.com/@babel/code-frame/-/code-frame-7.29.7.tgz#f2fbbfea87c44a21590ec515b778b2c26d8866e7"
+ integrity sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.29.7"
+ js-tokens "^4.0.0"
+ picocolors "^1.1.1"
+
+"@babel/compat-data@^7.29.7":
+ version "7.29.7"
+ resolved "https://registry.anpm.alibaba-inc.com/@babel/compat-data/-/compat-data-7.29.7.tgz#6f0237f0f36d2e51c0570a636faed9d2d0efe629"
+ integrity sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==
+
+"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9":
+ version "7.29.7"
+ resolved "https://registry.anpm.alibaba-inc.com/@babel/core/-/core-7.29.7.tgz#80c10b17248082968b57a857b91640971f2070f7"
+ integrity sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==
+ dependencies:
+ "@babel/code-frame" "^7.29.7"
+ "@babel/generator" "^7.29.7"
+ "@babel/helper-compilation-targets" "^7.29.7"
+ "@babel/helper-module-transforms" "^7.29.7"
+ "@babel/helpers" "^7.29.7"
+ "@babel/parser" "^7.29.7"
+ "@babel/template" "^7.29.7"
+ "@babel/traverse" "^7.29.7"
+ "@babel/types" "^7.29.7"
+ "@jridgewell/remapping" "^2.3.5"
+ convert-source-map "^2.0.0"
+ debug "^4.1.0"
+ gensync "^1.0.0-beta.2"
+ json5 "^2.2.3"
+ semver "^6.3.1"
+
+"@babel/generator@^7.29.7", "@babel/generator@^7.7.2":
+ version "7.29.7"
+ resolved "https://registry.anpm.alibaba-inc.com/@babel/generator/-/generator-7.29.7.tgz#cca0b8827e6bcf3ba176788e7f3b180ad6db2fa3"
+ integrity sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==
+ dependencies:
+ "@babel/parser" "^7.29.7"
+ "@babel/types" "^7.29.7"
+ "@jridgewell/gen-mapping" "^0.3.12"
+ "@jridgewell/trace-mapping" "^0.3.28"
+ jsesc "^3.0.2"
+
+"@babel/helper-compilation-targets@^7.29.7":
+ version "7.29.7"
+ resolved "https://registry.anpm.alibaba-inc.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz#7a1def704302401c47f64fa85589e974ae217042"
+ integrity sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==
+ dependencies:
+ "@babel/compat-data" "^7.29.7"
+ "@babel/helper-validator-option" "^7.29.7"
+ browserslist "^4.24.0"
+ lru-cache "^5.1.1"
+ semver "^6.3.1"
+
+"@babel/helper-globals@^7.29.7":
+ version "7.29.7"
+ resolved "https://registry.anpm.alibaba-inc.com/@babel/helper-globals/-/helper-globals-7.29.7.tgz#f04a96fbd8473241b1079243f5b3f03a3010ab7b"
+ integrity sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==
+
+"@babel/helper-module-imports@^7.29.7":
+ version "7.29.7"
+ resolved "https://registry.anpm.alibaba-inc.com/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz#ef25048a518e828d7393fac5882ddd73921d7396"
+ integrity sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==
+ dependencies:
+ "@babel/traverse" "^7.29.7"
+ "@babel/types" "^7.29.7"
+
+"@babel/helper-module-transforms@^7.29.7":
+ version "7.29.7"
+ resolved "https://registry.anpm.alibaba-inc.com/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz#b062747a5997ba138637201328bbff77960574ae"
+ integrity sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==
+ dependencies:
+ "@babel/helper-module-imports" "^7.29.7"
+ "@babel/helper-validator-identifier" "^7.29.7"
+ "@babel/traverse" "^7.29.7"
+
+"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.29.7", "@babel/helper-plugin-utils@^7.8.0":
+ version "7.29.7"
+ resolved "https://registry.anpm.alibaba-inc.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz#c0a0766f1a13617d8a17407d7ab8f9d486225ea4"
+ integrity sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==
+
+"@babel/helper-string-parser@^7.29.7":
+ version "7.29.7"
+ resolved "https://registry.anpm.alibaba-inc.com/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz#7f0871d99824d23137d60f86fcf6130fd5a1b51f"
+ integrity sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==
+
+"@babel/helper-validator-identifier@^7.29.7":
+ version "7.29.7"
+ resolved "https://registry.anpm.alibaba-inc.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz#bd87084ced0c796ec46bda492de6e83d29e89fc2"
+ integrity sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==
+
+"@babel/helper-validator-option@^7.29.7":
+ version "7.29.7"
+ resolved "https://registry.anpm.alibaba-inc.com/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz#cf315be940213b354eb4abcc0bd01ebe3f73bc2a"
+ integrity sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==
+
+"@babel/helpers@^7.29.7":
+ version "7.29.7"
+ resolved "https://registry.anpm.alibaba-inc.com/@babel/helpers/-/helpers-7.29.7.tgz#45abfde7548997e34376c3e69feb475cffb4a607"
+ integrity sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==
+ dependencies:
+ "@babel/template" "^7.29.7"
+ "@babel/types" "^7.29.7"
+
+"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.29.7":
+ version "7.29.7"
+ resolved "https://registry.anpm.alibaba-inc.com/@babel/parser/-/parser-7.29.7.tgz#837b87387cbf5ec5530cb634b3c622f68edb9334"
+ integrity sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==
+ dependencies:
+ "@babel/types" "^7.29.7"
+
+"@babel/plugin-syntax-async-generators@^7.8.4":
+ version "7.8.4"
+ resolved "https://registry.anpm.alibaba-inc.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d"
+ integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-bigint@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.anpm.alibaba-inc.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea"
+ integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-class-properties@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.anpm.alibaba-inc.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10"
+ integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-syntax-class-static-block@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.anpm.alibaba-inc.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406"
+ integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-syntax-import-attributes@^7.24.7":
+ version "7.29.7"
+ resolved "https://registry.anpm.alibaba-inc.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.29.7.tgz#6115264516e95ead0f35a41710906612e447f605"
+ integrity sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.29.7"
+
+"@babel/plugin-syntax-import-meta@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.anpm.alibaba-inc.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51"
+ integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-json-strings@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.anpm.alibaba-inc.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a"
+ integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-jsx@^7.7.2":
+ version "7.29.7"
+ resolved "https://registry.anpm.alibaba-inc.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz#622c16f9ad63782fe6e83dadc7e40330744b7f1e"
+ integrity sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.29.7"
+
+"@babel/plugin-syntax-logical-assignment-operators@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.anpm.alibaba-inc.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699"
+ integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.anpm.alibaba-inc.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9"
+ integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-numeric-separator@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.anpm.alibaba-inc.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97"
+ integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-object-rest-spread@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.anpm.alibaba-inc.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871"
+ integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-optional-catch-binding@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.anpm.alibaba-inc.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1"
+ integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-optional-chaining@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.anpm.alibaba-inc.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a"
+ integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-private-property-in-object@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.anpm.alibaba-inc.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad"
+ integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-syntax-top-level-await@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.anpm.alibaba-inc.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c"
+ integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-syntax-typescript@^7.7.2":
+ version "7.29.7"
+ resolved "https://registry.anpm.alibaba-inc.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz#7c29388932313ed58413a0343048d75d92fb5b24"
+ integrity sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.29.7"
+
+"@babel/template@^7.29.7", "@babel/template@^7.3.3":
+ version "7.29.7"
+ resolved "https://registry.anpm.alibaba-inc.com/@babel/template/-/template-7.29.7.tgz#4d9d4004f645cdd304de958c725162784ecac700"
+ integrity sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==
+ dependencies:
+ "@babel/code-frame" "^7.29.7"
+ "@babel/parser" "^7.29.7"
+ "@babel/types" "^7.29.7"
+
+"@babel/traverse@^7.29.7":
+ version "7.29.7"
+ resolved "https://registry.anpm.alibaba-inc.com/@babel/traverse/-/traverse-7.29.7.tgz#c47b07a41b95da0907d026b5dd894d98de7d2f2d"
+ integrity sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==
+ dependencies:
+ "@babel/code-frame" "^7.29.7"
+ "@babel/generator" "^7.29.7"
+ "@babel/helper-globals" "^7.29.7"
+ "@babel/parser" "^7.29.7"
+ "@babel/template" "^7.29.7"
+ "@babel/types" "^7.29.7"
+ debug "^4.3.1"
+
+"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.28.2", "@babel/types@^7.29.7", "@babel/types@^7.3.3":
+ version "7.29.7"
+ resolved "https://registry.anpm.alibaba-inc.com/@babel/types/-/types-7.29.7.tgz#8005e31d82712ee7adaef6e23c63b71a62770a92"
+ integrity sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==
+ dependencies:
+ "@babel/helper-string-parser" "^7.29.7"
+ "@babel/helper-validator-identifier" "^7.29.7"
+
+"@bcoe/v8-coverage@^0.2.3":
+ version "0.2.3"
+ resolved "https://registry.anpm.alibaba-inc.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
+ integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==
+
+"@discoveryjs/json-ext@^0.5.0":
+ version "0.5.7"
+ resolved "https://registry.anpm.alibaba-inc.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70"
+ integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==
+
+"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0":
+ version "4.9.1"
+ resolved "https://registry.anpm.alibaba-inc.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz#4e90af67bc51ddee6cdef5284edf572ec376b595"
+ integrity sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==
+ dependencies:
+ eslint-visitor-keys "^3.4.3"
+
+"@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1":
+ version "4.12.2"
+ resolved "https://registry.anpm.alibaba-inc.com/@eslint-community/regexpp/-/regexpp-4.12.2.tgz#bccdf615bcf7b6e8db830ec0b8d21c9a25de597b"
+ integrity sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==
+
+"@eslint/eslintrc@^2.1.4":
+ version "2.1.4"
+ resolved "https://registry.anpm.alibaba-inc.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad"
+ integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==
+ dependencies:
+ ajv "^6.12.4"
+ debug "^4.3.2"
+ espree "^9.6.0"
+ globals "^13.19.0"
+ ignore "^5.2.0"
+ import-fresh "^3.2.1"
+ js-yaml "^4.1.0"
+ minimatch "^3.1.2"
+ strip-json-comments "^3.1.1"
+
+"@eslint/js@8.57.1":
+ version "8.57.1"
+ resolved "https://registry.anpm.alibaba-inc.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2"
+ integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==
+
+"@humanwhocodes/config-array@^0.13.0":
+ version "0.13.0"
+ resolved "https://registry.anpm.alibaba-inc.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748"
+ integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==
+ dependencies:
+ "@humanwhocodes/object-schema" "^2.0.3"
+ debug "^4.3.1"
+ minimatch "^3.0.5"
+
+"@humanwhocodes/module-importer@^1.0.1":
+ version "1.0.1"
+ resolved "https://registry.anpm.alibaba-inc.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c"
+ integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==
+
+"@humanwhocodes/object-schema@^2.0.3":
+ version "2.0.3"
+ resolved "https://registry.anpm.alibaba-inc.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3"
+ integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==
+
+"@istanbuljs/load-nyc-config@^1.0.0":
+ version "1.1.0"
+ resolved "https://registry.anpm.alibaba-inc.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced"
+ integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==
+ dependencies:
+ camelcase "^5.3.1"
+ find-up "^4.1.0"
+ get-package-type "^0.1.0"
+ js-yaml "^3.13.1"
+ resolve-from "^5.0.0"
+
+"@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3":
+ version "0.1.6"
+ resolved "https://registry.anpm.alibaba-inc.com/@istanbuljs/schema/-/schema-0.1.6.tgz#8dc9afa2ac1506cb1a58f89940f1c124446c8df3"
+ integrity sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==
+
+"@jest/console@^29.7.0":
+ version "29.7.0"
+ resolved "https://registry.anpm.alibaba-inc.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc"
+ integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==
+ dependencies:
+ "@jest/types" "^29.6.3"
+ "@types/node" "*"
+ chalk "^4.0.0"
+ jest-message-util "^29.7.0"
+ jest-util "^29.7.0"
+ slash "^3.0.0"
+
+"@jest/core@^29.7.0":
+ version "29.7.0"
+ resolved "https://registry.anpm.alibaba-inc.com/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f"
+ integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==
+ dependencies:
+ "@jest/console" "^29.7.0"
+ "@jest/reporters" "^29.7.0"
+ "@jest/test-result" "^29.7.0"
+ "@jest/transform" "^29.7.0"
+ "@jest/types" "^29.6.3"
+ "@types/node" "*"
+ ansi-escapes "^4.2.1"
+ chalk "^4.0.0"
+ ci-info "^3.2.0"
+ exit "^0.1.2"
+ graceful-fs "^4.2.9"
+ jest-changed-files "^29.7.0"
+ jest-config "^29.7.0"
+ jest-haste-map "^29.7.0"
+ jest-message-util "^29.7.0"
+ jest-regex-util "^29.6.3"
+ jest-resolve "^29.7.0"
+ jest-resolve-dependencies "^29.7.0"
+ jest-runner "^29.7.0"
+ jest-runtime "^29.7.0"
+ jest-snapshot "^29.7.0"
+ jest-util "^29.7.0"
+ jest-validate "^29.7.0"
+ jest-watcher "^29.7.0"
+ micromatch "^4.0.4"
+ pretty-format "^29.7.0"
+ slash "^3.0.0"
+ strip-ansi "^6.0.0"
+
+"@jest/environment@^29.7.0":
+ version "29.7.0"
+ resolved "https://registry.anpm.alibaba-inc.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7"
+ integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==
+ dependencies:
+ "@jest/fake-timers" "^29.7.0"
+ "@jest/types" "^29.6.3"
+ "@types/node" "*"
+ jest-mock "^29.7.0"
+
+"@jest/expect-utils@^29.7.0":
+ version "29.7.0"
+ resolved "https://registry.anpm.alibaba-inc.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6"
+ integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==
+ dependencies:
+ jest-get-type "^29.6.3"
+
+"@jest/expect@^29.7.0":
+ version "29.7.0"
+ resolved "https://registry.anpm.alibaba-inc.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2"
+ integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==
+ dependencies:
+ expect "^29.7.0"
+ jest-snapshot "^29.7.0"
+
+"@jest/fake-timers@^29.7.0":
+ version "29.7.0"
+ resolved "https://registry.anpm.alibaba-inc.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565"
+ integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==
+ dependencies:
+ "@jest/types" "^29.6.3"
+ "@sinonjs/fake-timers" "^10.0.2"
+ "@types/node" "*"
+ jest-message-util "^29.7.0"
+ jest-mock "^29.7.0"
+ jest-util "^29.7.0"
+
+"@jest/globals@^29.7.0":
+ version "29.7.0"
+ resolved "https://registry.anpm.alibaba-inc.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d"
+ integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==
+ dependencies:
+ "@jest/environment" "^29.7.0"
+ "@jest/expect" "^29.7.0"
+ "@jest/types" "^29.6.3"
+ jest-mock "^29.7.0"
+
+"@jest/reporters@^29.7.0":
+ version "29.7.0"
+ resolved "https://registry.anpm.alibaba-inc.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7"
+ integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==
+ dependencies:
+ "@bcoe/v8-coverage" "^0.2.3"
+ "@jest/console" "^29.7.0"
+ "@jest/test-result" "^29.7.0"
+ "@jest/transform" "^29.7.0"
+ "@jest/types" "^29.6.3"
+ "@jridgewell/trace-mapping" "^0.3.18"
+ "@types/node" "*"
+ chalk "^4.0.0"
+ collect-v8-coverage "^1.0.0"
+ exit "^0.1.2"
+ glob "^7.1.3"
+ graceful-fs "^4.2.9"
+ istanbul-lib-coverage "^3.0.0"
+ istanbul-lib-instrument "^6.0.0"
+ istanbul-lib-report "^3.0.0"
+ istanbul-lib-source-maps "^4.0.0"
+ istanbul-reports "^3.1.3"
+ jest-message-util "^29.7.0"
+ jest-util "^29.7.0"
+ jest-worker "^29.7.0"
+ slash "^3.0.0"
+ string-length "^4.0.1"
+ strip-ansi "^6.0.0"
+ v8-to-istanbul "^9.0.1"
+
+"@jest/schemas@^29.6.3":
+ version "29.6.3"
+ resolved "https://registry.anpm.alibaba-inc.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03"
+ integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==
+ dependencies:
+ "@sinclair/typebox" "^0.27.8"
+
+"@jest/source-map@^29.6.3":
+ version "29.6.3"
+ resolved "https://registry.anpm.alibaba-inc.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4"
+ integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==
+ dependencies:
+ "@jridgewell/trace-mapping" "^0.3.18"
+ callsites "^3.0.0"
+ graceful-fs "^4.2.9"
+
+"@jest/test-result@^29.7.0":
+ version "29.7.0"
+ resolved "https://registry.anpm.alibaba-inc.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c"
+ integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==
+ dependencies:
+ "@jest/console" "^29.7.0"
+ "@jest/types" "^29.6.3"
+ "@types/istanbul-lib-coverage" "^2.0.0"
+ collect-v8-coverage "^1.0.0"
+
+"@jest/test-sequencer@^29.7.0":
+ version "29.7.0"
+ resolved "https://registry.anpm.alibaba-inc.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce"
+ integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==
+ dependencies:
+ "@jest/test-result" "^29.7.0"
+ graceful-fs "^4.2.9"
+ jest-haste-map "^29.7.0"
+ slash "^3.0.0"
+
+"@jest/transform@^29.7.0":
+ version "29.7.0"
+ resolved "https://registry.anpm.alibaba-inc.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c"
+ integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==
+ dependencies:
+ "@babel/core" "^7.11.6"
+ "@jest/types" "^29.6.3"
+ "@jridgewell/trace-mapping" "^0.3.18"
+ babel-plugin-istanbul "^6.1.1"
+ chalk "^4.0.0"
+ convert-source-map "^2.0.0"
+ fast-json-stable-stringify "^2.1.0"
+ graceful-fs "^4.2.9"
+ jest-haste-map "^29.7.0"
+ jest-regex-util "^29.6.3"
+ jest-util "^29.7.0"
+ micromatch "^4.0.4"
+ pirates "^4.0.4"
+ slash "^3.0.0"
+ write-file-atomic "^4.0.2"
+
+"@jest/types@^29.6.3":
+ version "29.6.3"
+ resolved "https://registry.anpm.alibaba-inc.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59"
+ integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==
+ dependencies:
+ "@jest/schemas" "^29.6.3"
+ "@types/istanbul-lib-coverage" "^2.0.0"
+ "@types/istanbul-reports" "^3.0.0"
+ "@types/node" "*"
+ "@types/yargs" "^17.0.8"
+ chalk "^4.0.0"
+
+"@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.5":
+ version "0.3.13"
+ resolved "https://registry.anpm.alibaba-inc.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz#6342a19f44347518c93e43b1ac69deb3c4656a1f"
+ integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==
+ dependencies:
+ "@jridgewell/sourcemap-codec" "^1.5.0"
+ "@jridgewell/trace-mapping" "^0.3.24"
+
+"@jridgewell/remapping@^2.3.5":
+ version "2.3.5"
+ resolved "https://registry.anpm.alibaba-inc.com/@jridgewell/remapping/-/remapping-2.3.5.tgz#375c476d1972947851ba1e15ae8f123047445aa1"
+ integrity sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==
+ dependencies:
+ "@jridgewell/gen-mapping" "^0.3.5"
+ "@jridgewell/trace-mapping" "^0.3.24"
+
+"@jridgewell/resolve-uri@^3.1.0":
+ version "3.1.2"
+ resolved "https://registry.anpm.alibaba-inc.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6"
+ integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==
+
+"@jridgewell/source-map@^0.3.3":
+ version "0.3.11"
+ resolved "https://registry.anpm.alibaba-inc.com/@jridgewell/source-map/-/source-map-0.3.11.tgz#b21835cbd36db656b857c2ad02ebd413cc13a9ba"
+ integrity sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==
+ dependencies:
+ "@jridgewell/gen-mapping" "^0.3.5"
+ "@jridgewell/trace-mapping" "^0.3.25"
+
+"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0":
+ version "1.5.5"
+ resolved "https://registry.anpm.alibaba-inc.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba"
+ integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==
+
+"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25", "@jridgewell/trace-mapping@^0.3.28":
+ version "0.3.31"
+ resolved "https://registry.anpm.alibaba-inc.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz#db15d6781c931f3a251a3dac39501c98a6082fd0"
+ integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==
+ dependencies:
+ "@jridgewell/resolve-uri" "^3.1.0"
+ "@jridgewell/sourcemap-codec" "^1.4.14"
+
+"@nodelib/fs.scandir@2.1.5":
+ version "2.1.5"
+ resolved "https://registry.anpm.alibaba-inc.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
+ integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==
+ dependencies:
+ "@nodelib/fs.stat" "2.0.5"
+ run-parallel "^1.1.9"
+
+"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
+ version "2.0.5"
+ resolved "https://registry.anpm.alibaba-inc.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b"
+ integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
+
+"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8":
+ version "1.2.8"
+ resolved "https://registry.anpm.alibaba-inc.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a"
+ integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
+ dependencies:
+ "@nodelib/fs.scandir" "2.1.5"
+ fastq "^1.6.0"
+
+"@secretlint/config-creator@^10.2.2":
+ version "10.2.2"
+ resolved "https://registry.anpm.alibaba-inc.com/@secretlint/config-creator/-/config-creator-10.2.2.tgz#5d646e83bb2aacfbd5218968ceb358420b4c2cb3"
+ integrity sha512-BynOBe7Hn3LJjb3CqCHZjeNB09s/vgf0baBaHVw67w7gHF0d25c3ZsZ5+vv8TgwSchRdUCRrbbcq5i2B1fJ2QQ==
+ dependencies:
+ "@secretlint/types" "^10.2.2"
+
+"@secretlint/config-loader@^10.2.2":
+ version "10.2.2"
+ resolved "https://registry.anpm.alibaba-inc.com/@secretlint/config-loader/-/config-loader-10.2.2.tgz#a7790c8d0301db4f6d47e6fb0f0f9482fe652d9a"
+ integrity sha512-ndjjQNgLg4DIcMJp4iaRD6xb9ijWQZVbd9694Ol2IszBIbGPPkwZHzJYKICbTBmh6AH/pLr0CiCaWdGJU7RbpQ==
+ dependencies:
+ "@secretlint/profiler" "^10.2.2"
+ "@secretlint/resolver" "^10.2.2"
+ "@secretlint/types" "^10.2.2"
+ ajv "^8.17.1"
+ debug "^4.4.1"
+ rc-config-loader "^4.1.3"
+
+"@secretlint/core@^10.2.2":
+ version "10.2.2"
+ resolved "https://registry.anpm.alibaba-inc.com/@secretlint/core/-/core-10.2.2.tgz#cd41d5c27ba07c217f0af4e0e24dbdfe5ef62042"
+ integrity sha512-6rdwBwLP9+TO3rRjMVW1tX+lQeo5gBbxl1I5F8nh8bgGtKwdlCMhMKsBWzWg1ostxx/tIG7OjZI0/BxsP8bUgw==
+ dependencies:
+ "@secretlint/profiler" "^10.2.2"
+ "@secretlint/types" "^10.2.2"
+ debug "^4.4.1"
+ structured-source "^4.0.0"
+
+"@secretlint/formatter@^10.2.2":
+ version "10.2.2"
+ resolved "https://registry.anpm.alibaba-inc.com/@secretlint/formatter/-/formatter-10.2.2.tgz#c8ce35803ad0d841cc9b6e703d6fab68a144e9c0"
+ integrity sha512-10f/eKV+8YdGKNQmoDUD1QnYL7TzhI2kzyx95vsJKbEa8akzLAR5ZrWIZ3LbcMmBLzxlSQMMccRmi05yDQ5YDA==
+ dependencies:
+ "@secretlint/resolver" "^10.2.2"
+ "@secretlint/types" "^10.2.2"
+ "@textlint/linter-formatter" "^15.2.0"
+ "@textlint/module-interop" "^15.2.0"
+ "@textlint/types" "^15.2.0"
+ chalk "^5.4.1"
+ debug "^4.4.1"
+ pluralize "^8.0.0"
+ strip-ansi "^7.1.0"
+ table "^6.9.0"
+ terminal-link "^4.0.0"
+
+"@secretlint/node@^10.1.2", "@secretlint/node@^10.2.2":
+ version "10.2.2"
+ resolved "https://registry.anpm.alibaba-inc.com/@secretlint/node/-/node-10.2.2.tgz#1d8a6ed620170bf4f29829a3a91878682c43c4d9"
+ integrity sha512-eZGJQgcg/3WRBwX1bRnss7RmHHK/YlP/l7zOQsrjexYt6l+JJa5YhUmHbuGXS94yW0++3YkEJp0kQGYhiw1DMQ==
+ dependencies:
+ "@secretlint/config-loader" "^10.2.2"
+ "@secretlint/core" "^10.2.2"
+ "@secretlint/formatter" "^10.2.2"
+ "@secretlint/profiler" "^10.2.2"
+ "@secretlint/source-creator" "^10.2.2"
+ "@secretlint/types" "^10.2.2"
+ debug "^4.4.1"
+ p-map "^7.0.3"
+
+"@secretlint/profiler@^10.2.2":
+ version "10.2.2"
+ resolved "https://registry.anpm.alibaba-inc.com/@secretlint/profiler/-/profiler-10.2.2.tgz#82c085ab1966806763bbf6edb830987f25d4e797"
+ integrity sha512-qm9rWfkh/o8OvzMIfY8a5bCmgIniSpltbVlUVl983zDG1bUuQNd1/5lUEeWx5o/WJ99bXxS7yNI4/KIXfHexig==
+
+"@secretlint/resolver@^10.2.2":
+ version "10.2.2"
+ resolved "https://registry.anpm.alibaba-inc.com/@secretlint/resolver/-/resolver-10.2.2.tgz#9c3c3e2fef00679fcce99793e76e19e575b75721"
+ integrity sha512-3md0cp12e+Ae5V+crPQYGd6aaO7ahw95s28OlULGyclyyUtf861UoRGS2prnUrKh7MZb23kdDOyGCYb9br5e4w==
+
+"@secretlint/secretlint-formatter-sarif@^10.1.2":
+ version "10.2.2"
+ resolved "https://registry.anpm.alibaba-inc.com/@secretlint/secretlint-formatter-sarif/-/secretlint-formatter-sarif-10.2.2.tgz#5c4044a6a6c9d95e2f57270d6184931f0979d649"
+ integrity sha512-ojiF9TGRKJJw308DnYBucHxkpNovDNu1XvPh7IfUp0A12gzTtxuWDqdpuVezL7/IP8Ua7mp5/VkDMN9OLp1doQ==
+ dependencies:
+ node-sarif-builder "^3.2.0"
+
+"@secretlint/secretlint-rule-no-dotenv@^10.1.2":
+ version "10.2.2"
+ resolved "https://registry.anpm.alibaba-inc.com/@secretlint/secretlint-rule-no-dotenv/-/secretlint-rule-no-dotenv-10.2.2.tgz#ea43dcc2abd1dac3288b056610361f319f5ce6e9"
+ integrity sha512-KJRbIShA9DVc5Va3yArtJ6QDzGjg3PRa1uYp9As4RsyKtKSSZjI64jVca57FZ8gbuk4em0/0Jq+uy6485wxIdg==
+ dependencies:
+ "@secretlint/types" "^10.2.2"
+
+"@secretlint/secretlint-rule-preset-recommend@^10.1.2":
+ version "10.2.2"
+ resolved "https://registry.anpm.alibaba-inc.com/@secretlint/secretlint-rule-preset-recommend/-/secretlint-rule-preset-recommend-10.2.2.tgz#27b17c38b360c6788826d28fcda28ac6e9772d0b"
+ integrity sha512-K3jPqjva8bQndDKJqctnGfwuAxU2n9XNCPtbXVI5JvC7FnQiNg/yWlQPbMUlBXtBoBGFYp08A94m6fvtc9v+zA==
+
+"@secretlint/source-creator@^10.2.2":
+ version "10.2.2"
+ resolved "https://registry.anpm.alibaba-inc.com/@secretlint/source-creator/-/source-creator-10.2.2.tgz#d600b6d4487859cdd39bbb1cf8cf744540b3f7a1"
+ integrity sha512-h6I87xJfwfUTgQ7irWq7UTdq/Bm1RuQ/fYhA3dtTIAop5BwSFmZyrchph4WcoEvbN460BWKmk4RYSvPElIIvxw==
+ dependencies:
+ "@secretlint/types" "^10.2.2"
+ istextorbinary "^9.5.0"
+
+"@secretlint/types@^10.2.2":
+ version "10.2.2"
+ resolved "https://registry.anpm.alibaba-inc.com/@secretlint/types/-/types-10.2.2.tgz#1412d8f699fd900182cbf4c2923a9df9eb321ca7"
+ integrity sha512-Nqc90v4lWCXyakD6xNyNACBJNJ0tNCwj2WNk/7ivyacYHxiITVgmLUFXTBOeCdy79iz6HtN9Y31uw/jbLrdOAg==
+
+"@sinclair/typebox@^0.27.8":
+ version "0.27.10"
+ resolved "https://registry.anpm.alibaba-inc.com/@sinclair/typebox/-/typebox-0.27.10.tgz#beefe675f1853f73676aecc915b2bd2ac98c4fc6"
+ integrity sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==
+
+"@sindresorhus/merge-streams@^2.1.0":
+ version "2.3.0"
+ resolved "https://registry.anpm.alibaba-inc.com/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz#719df7fb41766bc143369eaa0dd56d8dc87c9958"
+ integrity sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==
+
+"@sinonjs/commons@^3.0.0":
+ version "3.0.1"
+ resolved "https://registry.anpm.alibaba-inc.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd"
+ integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==
+ dependencies:
+ type-detect "4.0.8"
+
+"@sinonjs/fake-timers@^10.0.2":
+ version "10.3.0"
+ resolved "https://registry.anpm.alibaba-inc.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66"
+ integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==
+ dependencies:
+ "@sinonjs/commons" "^3.0.0"
+
+"@textlint/ast-node-types@15.7.1":
+ version "15.7.1"
+ resolved "https://registry.anpm.alibaba-inc.com/@textlint/ast-node-types/-/ast-node-types-15.7.1.tgz#20f3f9111d735be70831be61ccb3e8d4420a8c71"
+ integrity sha512-Wii5UgUKFEh9Uv6wbq1zr4/Kf+dtjiUuzPrrXzKp8H+ifkvKNzi23V4Nz+6wVyHQn5T28AFuc8VH8OtzvGYecA==
+
+"@textlint/linter-formatter@^15.2.0":
+ version "15.7.1"
+ resolved "https://registry.anpm.alibaba-inc.com/@textlint/linter-formatter/-/linter-formatter-15.7.1.tgz#6c3c12faf80328aab7879dc17c3dcb1bca18f6f5"
+ integrity sha512-TdwZ/debWYFD05K3CcoHtwvnCrza29wZxD+BjDTk/V5N7iRqkK1dTTHSD4A8AIgROLiDkHJmIKQbasbmsg8AvA==
+ dependencies:
+ "@azu/format-text" "^1.0.2"
+ "@azu/style-format" "^1.0.1"
+ "@textlint/module-interop" "15.7.1"
+ "@textlint/resolver" "15.7.1"
+ "@textlint/types" "15.7.1"
+ chalk "^4.1.2"
+ debug "^4.4.3"
+ js-yaml "^4.1.1"
+ lodash "^4.18.1"
+ pluralize "^2.0.0"
+ string-width "^4.2.3"
+ strip-ansi "^6.0.1"
+ table "^6.9.0"
+ text-table "^0.2.0"
+
+"@textlint/module-interop@15.7.1", "@textlint/module-interop@^15.2.0":
+ version "15.7.1"
+ resolved "https://registry.anpm.alibaba-inc.com/@textlint/module-interop/-/module-interop-15.7.1.tgz#55d85afdcb1c820ffdb50f91de353b20cf24f957"
+ integrity sha512-Jg+sQW2L/cRJypk59wtcMUVVpt8vmit5ZMT3gUnFwevP3A6Qp1HfOtUy9ObT4hBX3lOSGT/ekcCDxR1pL7uH1g==
+
+"@textlint/resolver@15.7.1":
+ version "15.7.1"
+ resolved "https://registry.anpm.alibaba-inc.com/@textlint/resolver/-/resolver-15.7.1.tgz#858cbce78e3c3b66354b0eb1fec77bfa8f9ee5d9"
+ integrity sha512-8XnO0pgF6mXnm41VvWmBbEIdGPhiCUt31uLZkOis1ECeg/1SoUcIT6Mx/F0e1rukq8l0UlOSeY9a31CsvRMK0g==
+
+"@textlint/types@15.7.1", "@textlint/types@^15.2.0":
+ version "15.7.1"
+ resolved "https://registry.anpm.alibaba-inc.com/@textlint/types/-/types-15.7.1.tgz#e1e433570dc76893499242974836d8c5fd7c1be2"
+ integrity sha512-Vye/GmFNBTgVzZFtIFJTmLB+s2A7oIADxNG6r9UhfPuY+Czv0z5G3xeyFZZudPlfxURsKUyPIU5XsjOFqVp33A==
+ dependencies:
+ "@textlint/ast-node-types" "15.7.1"
+
+"@types/babel__core@^7.1.14":
+ version "7.20.5"
+ resolved "https://registry.anpm.alibaba-inc.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017"
+ integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==
+ dependencies:
+ "@babel/parser" "^7.20.7"
+ "@babel/types" "^7.20.7"
+ "@types/babel__generator" "*"
+ "@types/babel__template" "*"
+ "@types/babel__traverse" "*"
+
+"@types/babel__generator@*":
+ version "7.27.0"
+ resolved "https://registry.anpm.alibaba-inc.com/@types/babel__generator/-/babel__generator-7.27.0.tgz#b5819294c51179957afaec341442f9341e4108a9"
+ integrity sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==
+ dependencies:
+ "@babel/types" "^7.0.0"
+
+"@types/babel__template@*":
+ version "7.4.4"
+ resolved "https://registry.anpm.alibaba-inc.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f"
+ integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==
+ dependencies:
+ "@babel/parser" "^7.1.0"
+ "@babel/types" "^7.0.0"
+
+"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6":
+ version "7.28.0"
+ resolved "https://registry.anpm.alibaba-inc.com/@types/babel__traverse/-/babel__traverse-7.28.0.tgz#07d713d6cce0d265c9849db0cbe62d3f61f36f74"
+ integrity sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==
+ dependencies:
+ "@babel/types" "^7.28.2"
+
+"@types/estree@^1.0.8":
+ version "1.0.9"
+ resolved "https://registry.anpm.alibaba-inc.com/@types/estree/-/estree-1.0.9.tgz#cf3f0e876d7bee15a93ab925b82bf570a3904a24"
+ integrity sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==
+
+"@types/graceful-fs@^4.1.3":
+ version "4.1.9"
+ resolved "https://registry.anpm.alibaba-inc.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4"
+ integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==
+ dependencies:
+ "@types/node" "*"
+
+"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1":
+ version "2.0.6"
+ resolved "https://registry.anpm.alibaba-inc.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7"
+ integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==
+
+"@types/istanbul-lib-report@*":
+ version "3.0.3"
+ resolved "https://registry.anpm.alibaba-inc.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf"
+ integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==
+ dependencies:
+ "@types/istanbul-lib-coverage" "*"
+
+"@types/istanbul-reports@^3.0.0":
+ version "3.0.4"
+ resolved "https://registry.anpm.alibaba-inc.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54"
+ integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==
+ dependencies:
+ "@types/istanbul-lib-report" "*"
+
+"@types/jest@^29.5.0":
+ version "29.5.14"
+ resolved "https://registry.anpm.alibaba-inc.com/@types/jest/-/jest-29.5.14.tgz#2b910912fa1d6856cadcd0c1f95af7df1d6049e5"
+ integrity sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==
+ dependencies:
+ expect "^29.0.0"
+ pretty-format "^29.0.0"
+
+"@types/json-schema@^7.0.12", "@types/json-schema@^7.0.15", "@types/json-schema@^7.0.9":
+ version "7.0.15"
+ resolved "https://registry.anpm.alibaba-inc.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841"
+ integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==
+
+"@types/node@*":
+ version "25.9.2"
+ resolved "https://registry.anpm.alibaba-inc.com/@types/node/-/node-25.9.2.tgz#fc8958e757994b71fee516f9634bdb03d1b19e9f"
+ integrity sha512-G05zqtJhcDLb8uslf5EjCxXg9G1KQxiV8OS0R26IC//Eoyitzqe8z37I7cqvnZlrlSfgocQRfSn/AHBZJJFyGw==
+ dependencies:
+ undici-types ">=7.24.0 <7.24.7"
+
+"@types/node@^18.0.0":
+ version "18.19.130"
+ resolved "https://registry.anpm.alibaba-inc.com/@types/node/-/node-18.19.130.tgz#da4c6324793a79defb7a62cba3947ec5add00d59"
+ integrity sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==
+ dependencies:
+ undici-types "~5.26.4"
+
+"@types/normalize-package-data@^2.4.3":
+ version "2.4.4"
+ resolved "https://registry.anpm.alibaba-inc.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901"
+ integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==
+
+"@types/sarif@^2.1.7":
+ version "2.1.7"
+ resolved "https://registry.anpm.alibaba-inc.com/@types/sarif/-/sarif-2.1.7.tgz#dab4d16ba7568e9846c454a8764f33c5d98e5524"
+ integrity sha512-kRz0VEkJqWLf1LLVN4pT1cg1Z9wAuvI6L97V3m2f5B76Tg8d413ddvLBPTEHAZJlnn4XSvu0FkZtViCQGVyrXQ==
+
+"@types/semver@^7.5.0":
+ version "7.7.1"
+ resolved "https://registry.anpm.alibaba-inc.com/@types/semver/-/semver-7.7.1.tgz#3ce3af1a5524ef327d2da9e4fd8b6d95c8d70528"
+ integrity sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==
+
+"@types/stack-utils@^2.0.0":
+ version "2.0.3"
+ resolved "https://registry.anpm.alibaba-inc.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8"
+ integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==
+
+"@types/vscode@^1.74.0":
+ version "1.120.0"
+ resolved "https://registry.anpm.alibaba-inc.com/@types/vscode/-/vscode-1.120.0.tgz#af36ef6e9952aa643e3682468197e319be80b4ae"
+ integrity sha512-feaT4Rst+FkTch5zz/ZbNCxoIvo55YU80Be2kiL7OJcod4+CUYf2lUBPdIJzozNnSEMq1VRTGrWEcCGFB3fBmA==
+
+"@types/yargs-parser@*":
+ version "21.0.3"
+ resolved "https://registry.anpm.alibaba-inc.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15"
+ integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==
+
+"@types/yargs@^17.0.8":
+ version "17.0.35"
+ resolved "https://registry.anpm.alibaba-inc.com/@types/yargs/-/yargs-17.0.35.tgz#07013e46aa4d7d7d50a49e15604c1c5340d4eb24"
+ integrity sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==
+ dependencies:
+ "@types/yargs-parser" "*"
+
+"@typescript-eslint/eslint-plugin@^6.18.0":
+ version "6.21.0"
+ resolved "https://registry.anpm.alibaba-inc.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz#30830c1ca81fd5f3c2714e524c4303e0194f9cd3"
+ integrity sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==
+ dependencies:
+ "@eslint-community/regexpp" "^4.5.1"
+ "@typescript-eslint/scope-manager" "6.21.0"
+ "@typescript-eslint/type-utils" "6.21.0"
+ "@typescript-eslint/utils" "6.21.0"
+ "@typescript-eslint/visitor-keys" "6.21.0"
+ debug "^4.3.4"
+ graphemer "^1.4.0"
+ ignore "^5.2.4"
+ natural-compare "^1.4.0"
+ semver "^7.5.4"
+ ts-api-utils "^1.0.1"
+
+"@typescript-eslint/parser@^6.18.0":
+ version "6.21.0"
+ resolved "https://registry.anpm.alibaba-inc.com/@typescript-eslint/parser/-/parser-6.21.0.tgz#af8fcf66feee2edc86bc5d1cf45e33b0630bf35b"
+ integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==
+ dependencies:
+ "@typescript-eslint/scope-manager" "6.21.0"
+ "@typescript-eslint/types" "6.21.0"
+ "@typescript-eslint/typescript-estree" "6.21.0"
+ "@typescript-eslint/visitor-keys" "6.21.0"
+ debug "^4.3.4"
+
+"@typescript-eslint/scope-manager@6.21.0":
+ version "6.21.0"
+ resolved "https://registry.anpm.alibaba-inc.com/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz#ea8a9bfc8f1504a6ac5d59a6df308d3a0630a2b1"
+ integrity sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==
+ dependencies:
+ "@typescript-eslint/types" "6.21.0"
+ "@typescript-eslint/visitor-keys" "6.21.0"
+
+"@typescript-eslint/type-utils@6.21.0":
+ version "6.21.0"
+ resolved "https://registry.anpm.alibaba-inc.com/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz#6473281cfed4dacabe8004e8521cee0bd9d4c01e"
+ integrity sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==
+ dependencies:
+ "@typescript-eslint/typescript-estree" "6.21.0"
+ "@typescript-eslint/utils" "6.21.0"
+ debug "^4.3.4"
+ ts-api-utils "^1.0.1"
+
+"@typescript-eslint/types@6.21.0":
+ version "6.21.0"
+ resolved "https://registry.anpm.alibaba-inc.com/@typescript-eslint/types/-/types-6.21.0.tgz#205724c5123a8fef7ecd195075fa6e85bac3436d"
+ integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==
+
+"@typescript-eslint/typescript-estree@6.21.0":
+ version "6.21.0"
+ resolved "https://registry.anpm.alibaba-inc.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz#c47ae7901db3b8bddc3ecd73daff2d0895688c46"
+ integrity sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==
+ dependencies:
+ "@typescript-eslint/types" "6.21.0"
+ "@typescript-eslint/visitor-keys" "6.21.0"
+ debug "^4.3.4"
+ globby "^11.1.0"
+ is-glob "^4.0.3"
+ minimatch "9.0.3"
+ semver "^7.5.4"
+ ts-api-utils "^1.0.1"
+
+"@typescript-eslint/utils@6.21.0":
+ version "6.21.0"
+ resolved "https://registry.anpm.alibaba-inc.com/@typescript-eslint/utils/-/utils-6.21.0.tgz#4714e7a6b39e773c1c8e97ec587f520840cd8134"
+ integrity sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==
+ dependencies:
+ "@eslint-community/eslint-utils" "^4.4.0"
+ "@types/json-schema" "^7.0.12"
+ "@types/semver" "^7.5.0"
+ "@typescript-eslint/scope-manager" "6.21.0"
+ "@typescript-eslint/types" "6.21.0"
+ "@typescript-eslint/typescript-estree" "6.21.0"
+ semver "^7.5.4"
+
+"@typescript-eslint/visitor-keys@6.21.0":
+ version "6.21.0"
+ resolved "https://registry.anpm.alibaba-inc.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz#87a99d077aa507e20e238b11d56cc26ade45fe47"
+ integrity sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==
+ dependencies:
+ "@typescript-eslint/types" "6.21.0"
+ eslint-visitor-keys "^3.4.1"
+
+"@typespec/ts-http-runtime@^0.3.0", "@typespec/ts-http-runtime@^0.3.4":
+ version "0.3.6"
+ resolved "https://registry.anpm.alibaba-inc.com/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.6.tgz#eda78b5fffb39ca86a4dadbb5a0c2600131d3570"
+ integrity sha512-jIXhD0eWQ1JA6ln/5Dltyx22UxWNrw0hZmhy2rlv6m6KgF7kplHx3g0fzi09lNmTJQRR91OlemYp3xFnvDK9og==
+ dependencies:
+ http-proxy-agent "^7.0.0"
+ https-proxy-agent "^7.0.0"
+ tslib "^2.6.2"
+
+"@ungap/structured-clone@^1.2.0":
+ version "1.3.1"
+ resolved "https://registry.anpm.alibaba-inc.com/@ungap/structured-clone/-/structured-clone-1.3.1.tgz#0e8f34854df7966b09304a18e808b23997bb9fc1"
+ integrity sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==
+
+"@vscode/vsce-sign-alpine-arm64@2.0.6":
+ version "2.0.6"
+ resolved "https://registry.anpm.alibaba-inc.com/@vscode/vsce-sign-alpine-arm64/-/vsce-sign-alpine-arm64-2.0.6.tgz#2cd244caf5e8ec543f42fb91d4df3b933641c8fa"
+ integrity sha512-wKkJBsvKF+f0GfsUuGT0tSW0kZL87QggEiqNqK6/8hvqsXvpx8OsTEc3mnE1kejkh5r+qUyQ7PtF8jZYN0mo8Q==
+
+"@vscode/vsce-sign-alpine-x64@2.0.6":
+ version "2.0.6"
+ resolved "https://registry.anpm.alibaba-inc.com/@vscode/vsce-sign-alpine-x64/-/vsce-sign-alpine-x64-2.0.6.tgz#b0e80a4792001c66e27feee2c11e821ad1fa1680"
+ integrity sha512-YoAGlmdK39vKi9jA18i4ufBbd95OqGJxRvF3n6ZbCyziwy3O+JgOpIUPxv5tjeO6gQfx29qBivQ8ZZTUF2Ba0w==
+
+"@vscode/vsce-sign-darwin-arm64@2.0.6":
+ version "2.0.6"
+ resolved "https://registry.anpm.alibaba-inc.com/@vscode/vsce-sign-darwin-arm64/-/vsce-sign-darwin-arm64-2.0.6.tgz#4b8fa1ab55f280a99985be3c06fb730e57810cce"
+ integrity sha512-5HMHaJRIQuozm/XQIiJiA0W9uhdblwwl2ZNDSSAeXGO9YhB9MH5C4KIHOmvyjUnKy4UCuiP43VKpIxW1VWP4tQ==
+
+"@vscode/vsce-sign-darwin-x64@2.0.6":
+ version "2.0.6"
+ resolved "https://registry.anpm.alibaba-inc.com/@vscode/vsce-sign-darwin-x64/-/vsce-sign-darwin-x64-2.0.6.tgz#d2c9186d9505498272cbddd8383bb038ebcf5820"
+ integrity sha512-25GsUbTAiNfHSuRItoQafXOIpxlYj+IXb4/qarrXu7kmbH94jlm5sdWSCKrrREs8+GsXF1b+l3OB7VJy5jsykw==
+
+"@vscode/vsce-sign-linux-arm64@2.0.6":
+ version "2.0.6"
+ resolved "https://registry.anpm.alibaba-inc.com/@vscode/vsce-sign-linux-arm64/-/vsce-sign-linux-arm64-2.0.6.tgz#b3d8560144040b920d8c6edd4374314b58255481"
+ integrity sha512-cfb1qK7lygtMa4NUl2582nP7aliLYuDEVpAbXJMkDq1qE+olIw/es+C8j1LJwvcRq1I2yWGtSn3EkDp9Dq5FdA==
+
+"@vscode/vsce-sign-linux-arm@2.0.6":
+ version "2.0.6"
+ resolved "https://registry.anpm.alibaba-inc.com/@vscode/vsce-sign-linux-arm/-/vsce-sign-linux-arm-2.0.6.tgz#0a27c42a4adb37e96eec78cd7bfa388cd4e9fbef"
+ integrity sha512-UndEc2Xlq4HsuMPnwu7420uqceXjs4yb5W8E2/UkaHBB9OWCwMd3/bRe/1eLe3D8kPpxzcaeTyXiK3RdzS/1CA==
+
+"@vscode/vsce-sign-linux-x64@2.0.6":
+ version "2.0.6"
+ resolved "https://registry.anpm.alibaba-inc.com/@vscode/vsce-sign-linux-x64/-/vsce-sign-linux-x64-2.0.6.tgz#ade11caeeed524fc16bd6c43ca49aea00295de8c"
+ integrity sha512-/olerl1A4sOqdP+hjvJ1sbQjKN07Y3DVnxO4gnbn/ahtQvFrdhUi0G1VsZXDNjfqmXw57DmPi5ASnj/8PGZhAA==
+
+"@vscode/vsce-sign-win32-arm64@2.0.6":
+ version "2.0.6"
+ resolved "https://registry.anpm.alibaba-inc.com/@vscode/vsce-sign-win32-arm64/-/vsce-sign-win32-arm64-2.0.6.tgz#0688968148e03eb392479c8491c72506721beffc"
+ integrity sha512-ivM/MiGIY0PJNZBoGtlRBM/xDpwbdlCWomUWuLmIxbi1Cxe/1nooYrEQoaHD8ojVRgzdQEUzMsRbyF5cJJgYOg==
+
+"@vscode/vsce-sign-win32-x64@2.0.6":
+ version "2.0.6"
+ resolved "https://registry.anpm.alibaba-inc.com/@vscode/vsce-sign-win32-x64/-/vsce-sign-win32-x64-2.0.6.tgz#74430eff41d26818c23f9826b045d8c75732eaeb"
+ integrity sha512-mgth9Kvze+u8CruYMmhHw6Zgy3GRX2S+Ed5oSokDEK5vPEwGGKnmuXua9tmFhomeAnhgJnL4DCna3TiNuGrBTQ==
+
+"@vscode/vsce-sign@^2.0.0":
+ version "2.0.9"
+ resolved "https://registry.anpm.alibaba-inc.com/@vscode/vsce-sign/-/vsce-sign-2.0.9.tgz#2ad48bb65373c1aeabb0beafddb29eb298bd6030"
+ integrity sha512-8IvaRvtFyzUnGGl3f5+1Cnor3LqaUWvhaUjAYO8Y39OUYlOf3cRd+dowuQYLpZcP3uwSG+mURwjEBOSq4SOJ0g==
+ optionalDependencies:
+ "@vscode/vsce-sign-alpine-arm64" "2.0.6"
+ "@vscode/vsce-sign-alpine-x64" "2.0.6"
+ "@vscode/vsce-sign-darwin-arm64" "2.0.6"
+ "@vscode/vsce-sign-darwin-x64" "2.0.6"
+ "@vscode/vsce-sign-linux-arm" "2.0.6"
+ "@vscode/vsce-sign-linux-arm64" "2.0.6"
+ "@vscode/vsce-sign-linux-x64" "2.0.6"
+ "@vscode/vsce-sign-win32-arm64" "2.0.6"
+ "@vscode/vsce-sign-win32-x64" "2.0.6"
+
+"@vscode/vsce@^3.0.0":
+ version "3.9.2"
+ resolved "https://registry.anpm.alibaba-inc.com/@vscode/vsce/-/vsce-3.9.2.tgz#9262d1737dba6c61d91dc56ae2901af3e1e0294a"
+ integrity sha512-XSxMosEEDO6vLxELAHVkwmhC0qe0ijZni2jB9Rcs8kQsW4lhTDQ/wMzmwFs/buotAWSnpmUp/dRWD2ufG3UYKA==
+ dependencies:
+ "@azure/identity" "^4.1.0"
+ "@secretlint/node" "^10.1.2"
+ "@secretlint/secretlint-formatter-sarif" "^10.1.2"
+ "@secretlint/secretlint-rule-no-dotenv" "^10.1.2"
+ "@secretlint/secretlint-rule-preset-recommend" "^10.1.2"
+ "@vscode/vsce-sign" "^2.0.0"
+ azure-devops-node-api "^12.5.0"
+ chalk "^4.1.2"
+ cheerio "^1.0.0-rc.9"
+ cockatiel "^3.1.2"
+ commander "^12.1.0"
+ form-data "^4.0.0"
+ glob "^13.0.6"
+ hosted-git-info "^4.0.2"
+ jsonc-parser "^3.2.0"
+ leven "^3.1.0"
+ markdown-it "^14.1.0"
+ mime "^1.3.4"
+ minimatch "^10.2.2"
+ parse-semver "^1.1.1"
+ read "^1.0.7"
+ secretlint "^10.1.2"
+ semver "^7.5.2"
+ tmp "^0.2.3"
+ typed-rest-client "^1.8.4"
+ url-join "^4.0.1"
+ xml2js "^0.5.0"
+ yauzl "^3.2.1"
+ yazl "^2.2.2"
+ optionalDependencies:
+ keytar "^7.7.0"
+
+"@webassemblyjs/ast@1.14.1", "@webassemblyjs/ast@^1.14.1":
+ version "1.14.1"
+ resolved "https://registry.anpm.alibaba-inc.com/@webassemblyjs/ast/-/ast-1.14.1.tgz#a9f6a07f2b03c95c8d38c4536a1fdfb521ff55b6"
+ integrity sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==
+ dependencies:
+ "@webassemblyjs/helper-numbers" "1.13.2"
+ "@webassemblyjs/helper-wasm-bytecode" "1.13.2"
+
+"@webassemblyjs/floating-point-hex-parser@1.13.2":
+ version "1.13.2"
+ resolved "https://registry.anpm.alibaba-inc.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz#fcca1eeddb1cc4e7b6eed4fc7956d6813b21b9fb"
+ integrity sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==
+
+"@webassemblyjs/helper-api-error@1.13.2":
+ version "1.13.2"
+ resolved "https://registry.anpm.alibaba-inc.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz#e0a16152248bc38daee76dd7e21f15c5ef3ab1e7"
+ integrity sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==
+
+"@webassemblyjs/helper-buffer@1.14.1":
+ version "1.14.1"
+ resolved "https://registry.anpm.alibaba-inc.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz#822a9bc603166531f7d5df84e67b5bf99b72b96b"
+ integrity sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==
+
+"@webassemblyjs/helper-numbers@1.13.2":
+ version "1.13.2"
+ resolved "https://registry.anpm.alibaba-inc.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz#dbd932548e7119f4b8a7877fd5a8d20e63490b2d"
+ integrity sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==
+ dependencies:
+ "@webassemblyjs/floating-point-hex-parser" "1.13.2"
+ "@webassemblyjs/helper-api-error" "1.13.2"
+ "@xtuc/long" "4.2.2"
+
+"@webassemblyjs/helper-wasm-bytecode@1.13.2":
+ version "1.13.2"
+ resolved "https://registry.anpm.alibaba-inc.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz#e556108758f448aae84c850e593ce18a0eb31e0b"
+ integrity sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==
+
+"@webassemblyjs/helper-wasm-section@1.14.1":
+ version "1.14.1"
+ resolved "https://registry.anpm.alibaba-inc.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz#9629dda9c4430eab54b591053d6dc6f3ba050348"
+ integrity sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==
+ dependencies:
+ "@webassemblyjs/ast" "1.14.1"
+ "@webassemblyjs/helper-buffer" "1.14.1"
+ "@webassemblyjs/helper-wasm-bytecode" "1.13.2"
+ "@webassemblyjs/wasm-gen" "1.14.1"
+
+"@webassemblyjs/ieee754@1.13.2":
+ version "1.13.2"
+ resolved "https://registry.anpm.alibaba-inc.com/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz#1c5eaace1d606ada2c7fd7045ea9356c59ee0dba"
+ integrity sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==
+ dependencies:
+ "@xtuc/ieee754" "^1.2.0"
+
+"@webassemblyjs/leb128@1.13.2":
+ version "1.13.2"
+ resolved "https://registry.anpm.alibaba-inc.com/@webassemblyjs/leb128/-/leb128-1.13.2.tgz#57c5c3deb0105d02ce25fa3fd74f4ebc9fd0bbb0"
+ integrity sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==
+ dependencies:
+ "@xtuc/long" "4.2.2"
+
+"@webassemblyjs/utf8@1.13.2":
+ version "1.13.2"
+ resolved "https://registry.anpm.alibaba-inc.com/@webassemblyjs/utf8/-/utf8-1.13.2.tgz#917a20e93f71ad5602966c2d685ae0c6c21f60f1"
+ integrity sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==
+
+"@webassemblyjs/wasm-edit@^1.14.1":
+ version "1.14.1"
+ resolved "https://registry.anpm.alibaba-inc.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz#ac6689f502219b59198ddec42dcd496b1004d597"
+ integrity sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==
+ dependencies:
+ "@webassemblyjs/ast" "1.14.1"
+ "@webassemblyjs/helper-buffer" "1.14.1"
+ "@webassemblyjs/helper-wasm-bytecode" "1.13.2"
+ "@webassemblyjs/helper-wasm-section" "1.14.1"
+ "@webassemblyjs/wasm-gen" "1.14.1"
+ "@webassemblyjs/wasm-opt" "1.14.1"
+ "@webassemblyjs/wasm-parser" "1.14.1"
+ "@webassemblyjs/wast-printer" "1.14.1"
+
+"@webassemblyjs/wasm-gen@1.14.1":
+ version "1.14.1"
+ resolved "https://registry.anpm.alibaba-inc.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz#991e7f0c090cb0bb62bbac882076e3d219da9570"
+ integrity sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==
+ dependencies:
+ "@webassemblyjs/ast" "1.14.1"
+ "@webassemblyjs/helper-wasm-bytecode" "1.13.2"
+ "@webassemblyjs/ieee754" "1.13.2"
+ "@webassemblyjs/leb128" "1.13.2"
+ "@webassemblyjs/utf8" "1.13.2"
+
+"@webassemblyjs/wasm-opt@1.14.1":
+ version "1.14.1"
+ resolved "https://registry.anpm.alibaba-inc.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz#e6f71ed7ccae46781c206017d3c14c50efa8106b"
+ integrity sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==
+ dependencies:
+ "@webassemblyjs/ast" "1.14.1"
+ "@webassemblyjs/helper-buffer" "1.14.1"
+ "@webassemblyjs/wasm-gen" "1.14.1"
+ "@webassemblyjs/wasm-parser" "1.14.1"
+
+"@webassemblyjs/wasm-parser@1.14.1", "@webassemblyjs/wasm-parser@^1.14.1":
+ version "1.14.1"
+ resolved "https://registry.anpm.alibaba-inc.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz#b3e13f1893605ca78b52c68e54cf6a865f90b9fb"
+ integrity sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==
+ dependencies:
+ "@webassemblyjs/ast" "1.14.1"
+ "@webassemblyjs/helper-api-error" "1.13.2"
+ "@webassemblyjs/helper-wasm-bytecode" "1.13.2"
+ "@webassemblyjs/ieee754" "1.13.2"
+ "@webassemblyjs/leb128" "1.13.2"
+ "@webassemblyjs/utf8" "1.13.2"
+
+"@webassemblyjs/wast-printer@1.14.1":
+ version "1.14.1"
+ resolved "https://registry.anpm.alibaba-inc.com/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz#3bb3e9638a8ae5fdaf9610e7a06b4d9f9aa6fe07"
+ integrity sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==
+ dependencies:
+ "@webassemblyjs/ast" "1.14.1"
+ "@xtuc/long" "4.2.2"
+
+"@webpack-cli/configtest@^2.1.1":
+ version "2.1.1"
+ resolved "https://registry.anpm.alibaba-inc.com/@webpack-cli/configtest/-/configtest-2.1.1.tgz#3b2f852e91dac6e3b85fb2a314fb8bef46d94646"
+ integrity sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==
+
+"@webpack-cli/info@^2.0.2":
+ version "2.0.2"
+ resolved "https://registry.anpm.alibaba-inc.com/@webpack-cli/info/-/info-2.0.2.tgz#cc3fbf22efeb88ff62310cf885c5b09f44ae0fdd"
+ integrity sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==
+
+"@webpack-cli/serve@^2.0.5":
+ version "2.0.5"
+ resolved "https://registry.anpm.alibaba-inc.com/@webpack-cli/serve/-/serve-2.0.5.tgz#325db42395cd49fe6c14057f9a900e427df8810e"
+ integrity sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==
+
+"@xtuc/ieee754@^1.2.0":
+ version "1.2.0"
+ resolved "https://registry.anpm.alibaba-inc.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790"
+ integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==
+
+"@xtuc/long@4.2.2":
+ version "4.2.2"
+ resolved "https://registry.anpm.alibaba-inc.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d"
+ integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
+
+acorn-import-phases@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.anpm.alibaba-inc.com/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz#16eb850ba99a056cb7cbfe872ffb8972e18c8bd7"
+ integrity sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==
+
+acorn-jsx@^5.3.2:
+ version "5.3.2"
+ resolved "https://registry.anpm.alibaba-inc.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
+ integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
+
+acorn@^8.15.0, acorn@^8.16.0, acorn@^8.9.0:
+ version "8.16.0"
+ resolved "https://registry.anpm.alibaba-inc.com/acorn/-/acorn-8.16.0.tgz#4ce79c89be40afe7afe8f3adb902a1f1ce9ac08a"
+ integrity sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==
+
+agent-base@^7.1.0, agent-base@^7.1.2:
+ version "7.1.4"
+ resolved "https://registry.anpm.alibaba-inc.com/agent-base/-/agent-base-7.1.4.tgz#e3cd76d4c548ee895d3c3fd8dc1f6c5b9032e7a8"
+ integrity sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==
+
+ajv-formats@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.anpm.alibaba-inc.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520"
+ integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==
+ dependencies:
+ ajv "^8.0.0"
+
+ajv-keywords@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.anpm.alibaba-inc.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16"
+ integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==
+ dependencies:
+ fast-deep-equal "^3.1.3"
+
+ajv@^6.12.4:
+ version "6.15.0"
+ resolved "https://registry.anpm.alibaba-inc.com/ajv/-/ajv-6.15.0.tgz#07e982c74626167aa7a2495c53817892d7139492"
+ integrity sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==
+ dependencies:
+ fast-deep-equal "^3.1.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.2"
+
+ajv@^8.0.0, ajv@^8.0.1, ajv@^8.17.1, ajv@^8.9.0:
+ version "8.20.0"
+ resolved "https://registry.anpm.alibaba-inc.com/ajv/-/ajv-8.20.0.tgz#304b3636add88ba7d936760dd50ece006dea95f9"
+ integrity sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==
+ dependencies:
+ fast-deep-equal "^3.1.3"
+ fast-uri "^3.0.1"
+ json-schema-traverse "^1.0.0"
+ require-from-string "^2.0.2"
+
+ansi-escapes@^4.2.1:
+ version "4.3.2"
+ resolved "https://registry.anpm.alibaba-inc.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e"
+ integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==
+ dependencies:
+ type-fest "^0.21.3"
+
+ansi-escapes@^7.0.0:
+ version "7.3.0"
+ resolved "https://registry.anpm.alibaba-inc.com/ansi-escapes/-/ansi-escapes-7.3.0.tgz#5395bb74b2150a4a1d6e3c2565f4aeca78d28627"
+ integrity sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==
+ dependencies:
+ environment "^1.0.0"
+
+ansi-regex@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.anpm.alibaba-inc.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
+ integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
+
+ansi-regex@^6.2.2:
+ version "6.2.2"
+ resolved "https://registry.anpm.alibaba-inc.com/ansi-regex/-/ansi-regex-6.2.2.tgz#60216eea464d864597ce2832000738a0589650c1"
+ integrity sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==
+
+ansi-styles@^4.0.0, ansi-styles@^4.1.0:
+ version "4.3.0"
+ resolved "https://registry.anpm.alibaba-inc.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
+ integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+ dependencies:
+ color-convert "^2.0.1"
+
+ansi-styles@^5.0.0:
+ version "5.2.0"
+ resolved "https://registry.anpm.alibaba-inc.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b"
+ integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==
+
+anymatch@^3.0.3:
+ version "3.1.3"
+ resolved "https://registry.anpm.alibaba-inc.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e"
+ integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==
+ dependencies:
+ normalize-path "^3.0.0"
+ picomatch "^2.0.4"
+
+argparse@^1.0.7:
+ version "1.0.10"
+ resolved "https://registry.anpm.alibaba-inc.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
+ integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
+ dependencies:
+ sprintf-js "~1.0.2"
+
+argparse@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.anpm.alibaba-inc.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
+ integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
+
+array-union@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.anpm.alibaba-inc.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
+ integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
+
+astral-regex@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31"
+ integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==
+
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.anpm.alibaba-inc.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+ integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
+
+azure-devops-node-api@^12.5.0:
+ version "12.5.0"
+ resolved "https://registry.anpm.alibaba-inc.com/azure-devops-node-api/-/azure-devops-node-api-12.5.0.tgz#38b9efd7c5ac74354fe4e8dbe42697db0b8e85a5"
+ integrity sha512-R5eFskGvOm3U/GzeAuxRkUsAl0hrAwGgWn6zAd2KrZmrEhWZVqLew4OOupbQlXUuojUzpGtq62SmdhJ06N88og==
+ dependencies:
+ tunnel "0.0.6"
+ typed-rest-client "^1.8.4"
+
+babel-jest@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.anpm.alibaba-inc.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5"
+ integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==
+ dependencies:
+ "@jest/transform" "^29.7.0"
+ "@types/babel__core" "^7.1.14"
+ babel-plugin-istanbul "^6.1.1"
+ babel-preset-jest "^29.6.3"
+ chalk "^4.0.0"
+ graceful-fs "^4.2.9"
+ slash "^3.0.0"
+
+babel-plugin-istanbul@^6.1.1:
+ version "6.1.1"
+ resolved "https://registry.anpm.alibaba-inc.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73"
+ integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@istanbuljs/load-nyc-config" "^1.0.0"
+ "@istanbuljs/schema" "^0.1.2"
+ istanbul-lib-instrument "^5.0.4"
+ test-exclude "^6.0.0"
+
+babel-plugin-jest-hoist@^29.6.3:
+ version "29.6.3"
+ resolved "https://registry.anpm.alibaba-inc.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626"
+ integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==
+ dependencies:
+ "@babel/template" "^7.3.3"
+ "@babel/types" "^7.3.3"
+ "@types/babel__core" "^7.1.14"
+ "@types/babel__traverse" "^7.0.6"
+
+babel-preset-current-node-syntax@^1.0.0:
+ version "1.2.0"
+ resolved "https://registry.anpm.alibaba-inc.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz#20730d6cdc7dda5d89401cab10ac6a32067acde6"
+ integrity sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==
+ dependencies:
+ "@babel/plugin-syntax-async-generators" "^7.8.4"
+ "@babel/plugin-syntax-bigint" "^7.8.3"
+ "@babel/plugin-syntax-class-properties" "^7.12.13"
+ "@babel/plugin-syntax-class-static-block" "^7.14.5"
+ "@babel/plugin-syntax-import-attributes" "^7.24.7"
+ "@babel/plugin-syntax-import-meta" "^7.10.4"
+ "@babel/plugin-syntax-json-strings" "^7.8.3"
+ "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
+ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
+ "@babel/plugin-syntax-numeric-separator" "^7.10.4"
+ "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
+ "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
+ "@babel/plugin-syntax-optional-chaining" "^7.8.3"
+ "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
+ "@babel/plugin-syntax-top-level-await" "^7.14.5"
+
+babel-preset-jest@^29.6.3:
+ version "29.6.3"
+ resolved "https://registry.anpm.alibaba-inc.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c"
+ integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==
+ dependencies:
+ babel-plugin-jest-hoist "^29.6.3"
+ babel-preset-current-node-syntax "^1.0.0"
+
+balanced-match@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.anpm.alibaba-inc.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
+ integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+balanced-match@^4.0.2:
+ version "4.0.4"
+ resolved "https://registry.anpm.alibaba-inc.com/balanced-match/-/balanced-match-4.0.4.tgz#bfb10662feed8196a2c62e7c68e17720c274179a"
+ integrity sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==
+
+base64-js@^1.3.1:
+ version "1.5.1"
+ resolved "https://registry.anpm.alibaba-inc.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
+ integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
+
+baseline-browser-mapping@^2.10.12:
+ version "2.10.34"
+ resolved "https://registry.anpm.alibaba-inc.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.34.tgz#dedb606362446777cfe328d30d4ee15056d06303"
+ integrity sha512-IMDedajPifLnHNY0X9n8hKxRTQ6/eTHwr5bDo04WnuqxyKw6LYtQywCuuqPZwhl3aBXMvQpJov42GLCwRRdQzw==
+
+binaryextensions@^6.11.0:
+ version "6.11.0"
+ resolved "https://registry.anpm.alibaba-inc.com/binaryextensions/-/binaryextensions-6.11.0.tgz#c36b3e6b5c59e621605709b099cda8dda824cc72"
+ integrity sha512-sXnYK/Ij80TO3lcqZVV2YgfKN5QjUWIRk/XSm2J/4bd/lPko3lvk0O4ZppH6m+6hB2/GTu+ptNwVFe1xh+QLQw==
+ dependencies:
+ editions "^6.21.0"
+
+bl@^4.0.3:
+ version "4.1.0"
+ resolved "https://registry.anpm.alibaba-inc.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a"
+ integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==
+ dependencies:
+ buffer "^5.5.0"
+ inherits "^2.0.4"
+ readable-stream "^3.4.0"
+
+boolbase@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
+ integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==
+
+boundary@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/boundary/-/boundary-2.0.0.tgz#169c8b1f0d44cf2c25938967a328f37e0a4e5efc"
+ integrity sha512-rJKn5ooC9u8q13IMCrW0RSp31pxBCHE3y9V/tp3TdWSLf8Em3p6Di4NBpfzbJge9YjjFEsD0RtFEjtvHL5VyEA==
+
+brace-expansion@^1.1.7:
+ version "1.1.15"
+ resolved "https://registry.anpm.alibaba-inc.com/brace-expansion/-/brace-expansion-1.1.15.tgz#a6d90d54067236e5f42570a3b7378d594d9b7738"
+ integrity sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+brace-expansion@^2.0.1:
+ version "2.1.1"
+ resolved "https://registry.anpm.alibaba-inc.com/brace-expansion/-/brace-expansion-2.1.1.tgz#c68b1c4111c76aae3a6fba55d496cee10c39dad8"
+ integrity sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==
+ dependencies:
+ balanced-match "^1.0.0"
+
+brace-expansion@^5.0.5:
+ version "5.0.6"
+ resolved "https://registry.anpm.alibaba-inc.com/brace-expansion/-/brace-expansion-5.0.6.tgz#ec68fe0a641a29d8711579caf641d05bae1f2285"
+ integrity sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==
+ dependencies:
+ balanced-match "^4.0.2"
+
+braces@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.anpm.alibaba-inc.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789"
+ integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==
+ dependencies:
+ fill-range "^7.1.1"
+
+browserslist@^4.24.0, browserslist@^4.28.1:
+ version "4.28.2"
+ resolved "https://registry.anpm.alibaba-inc.com/browserslist/-/browserslist-4.28.2.tgz#f50b65362ef48974ca9f50b3680566d786b811d2"
+ integrity sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==
+ dependencies:
+ baseline-browser-mapping "^2.10.12"
+ caniuse-lite "^1.0.30001782"
+ electron-to-chromium "^1.5.328"
+ node-releases "^2.0.36"
+ update-browserslist-db "^1.2.3"
+
+bs-logger@^0.2.6:
+ version "0.2.6"
+ resolved "https://registry.anpm.alibaba-inc.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8"
+ integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==
+ dependencies:
+ fast-json-stable-stringify "2.x"
+
+bser@2.1.1:
+ version "2.1.1"
+ resolved "https://registry.anpm.alibaba-inc.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05"
+ integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==
+ dependencies:
+ node-int64 "^0.4.0"
+
+buffer-crc32@~0.2.3:
+ version "0.2.13"
+ resolved "https://registry.anpm.alibaba-inc.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
+ integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==
+
+buffer-equal-constant-time@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.anpm.alibaba-inc.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819"
+ integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==
+
+buffer-from@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.anpm.alibaba-inc.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
+ integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
+
+buffer@^5.5.0:
+ version "5.7.1"
+ resolved "https://registry.anpm.alibaba-inc.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
+ integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
+ dependencies:
+ base64-js "^1.3.1"
+ ieee754 "^1.1.13"
+
+bundle-name@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.anpm.alibaba-inc.com/bundle-name/-/bundle-name-4.1.0.tgz#f3b96b34160d6431a19d7688135af7cfb8797889"
+ integrity sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==
+ dependencies:
+ run-applescript "^7.0.0"
+
+call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.anpm.alibaba-inc.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6"
+ integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==
+ dependencies:
+ es-errors "^1.3.0"
+ function-bind "^1.1.2"
+
+call-bound@^1.0.2:
+ version "1.0.4"
+ resolved "https://registry.anpm.alibaba-inc.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a"
+ integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==
+ dependencies:
+ call-bind-apply-helpers "^1.0.2"
+ get-intrinsic "^1.3.0"
+
+callsites@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.anpm.alibaba-inc.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
+ integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
+
+camelcase@^5.3.1:
+ version "5.3.1"
+ resolved "https://registry.anpm.alibaba-inc.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
+ integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
+
+camelcase@^6.2.0:
+ version "6.3.0"
+ resolved "https://registry.anpm.alibaba-inc.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a"
+ integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
+
+caniuse-lite@^1.0.30001782:
+ version "1.0.30001797"
+ resolved "https://registry.anpm.alibaba-inc.com/caniuse-lite/-/caniuse-lite-1.0.30001797.tgz#1332709e1439f01ff92085dd17001e0a45897ec0"
+ integrity sha512-l8xKG+gwAIExZGl9FrF7KUwuOmk6wbEPC9Xoy/RtnWv1XG0Q4LFlagaLpUv3Kiza3W/wm27zy0yWJEieYKAP6w==
+
+chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.anpm.alibaba-inc.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
+ integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+chalk@^5.4.1:
+ version "5.6.2"
+ resolved "https://registry.anpm.alibaba-inc.com/chalk/-/chalk-5.6.2.tgz#b1238b6e23ea337af71c7f8a295db5af0c158aea"
+ integrity sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==
+
+char-regex@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.anpm.alibaba-inc.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf"
+ integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==
+
+cheerio-select@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.anpm.alibaba-inc.com/cheerio-select/-/cheerio-select-2.1.0.tgz#4d8673286b8126ca2a8e42740d5e3c4884ae21b4"
+ integrity sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==
+ dependencies:
+ boolbase "^1.0.0"
+ css-select "^5.1.0"
+ css-what "^6.1.0"
+ domelementtype "^2.3.0"
+ domhandler "^5.0.3"
+ domutils "^3.0.1"
+
+cheerio@^1.0.0-rc.9:
+ version "1.2.0"
+ resolved "https://registry.anpm.alibaba-inc.com/cheerio/-/cheerio-1.2.0.tgz#f23b777c49021ead7475dcf3390d3535a7f896d6"
+ integrity sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==
+ dependencies:
+ cheerio-select "^2.1.0"
+ dom-serializer "^2.0.0"
+ domhandler "^5.0.3"
+ domutils "^3.2.2"
+ encoding-sniffer "^0.2.1"
+ htmlparser2 "^10.1.0"
+ parse5 "^7.3.0"
+ parse5-htmlparser2-tree-adapter "^7.1.0"
+ parse5-parser-stream "^7.1.2"
+ undici "^7.19.0"
+ whatwg-mimetype "^4.0.0"
+
+chownr@^1.1.1:
+ version "1.1.4"
+ resolved "https://registry.anpm.alibaba-inc.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
+ integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
+
+chrome-trace-event@^1.0.2:
+ version "1.0.4"
+ resolved "https://registry.anpm.alibaba-inc.com/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz#05bffd7ff928465093314708c93bdfa9bd1f0f5b"
+ integrity sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==
+
+ci-info@^3.2.0:
+ version "3.9.0"
+ resolved "https://registry.anpm.alibaba-inc.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4"
+ integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==
+
+cjs-module-lexer@^1.0.0:
+ version "1.4.3"
+ resolved "https://registry.anpm.alibaba-inc.com/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz#0f79731eb8cfe1ec72acd4066efac9d61991b00d"
+ integrity sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==
+
+cliui@^8.0.1:
+ version "8.0.1"
+ resolved "https://registry.anpm.alibaba-inc.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa"
+ integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==
+ dependencies:
+ string-width "^4.2.0"
+ strip-ansi "^6.0.1"
+ wrap-ansi "^7.0.0"
+
+clone-deep@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.anpm.alibaba-inc.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387"
+ integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==
+ dependencies:
+ is-plain-object "^2.0.4"
+ kind-of "^6.0.2"
+ shallow-clone "^3.0.0"
+
+co@^4.6.0:
+ version "4.6.0"
+ resolved "https://registry.anpm.alibaba-inc.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
+ integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==
+
+cockatiel@^3.1.2:
+ version "3.2.1"
+ resolved "https://registry.anpm.alibaba-inc.com/cockatiel/-/cockatiel-3.2.1.tgz#575f937bc4040a20ae27352a6d07c9c5a741981f"
+ integrity sha512-gfrHV6ZPkquExvMh9IOkKsBzNDk6sDuZ6DdBGUBkvFnTCqCxzpuq48RySgP0AnaqQkw2zynOFj9yly6T1Q2G5Q==
+
+collect-v8-coverage@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.anpm.alibaba-inc.com/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz#cc1f01eb8d02298cbc9a437c74c70ab4e5210b80"
+ integrity sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==
+
+color-convert@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.anpm.alibaba-inc.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+ integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+ dependencies:
+ color-name "~1.1.4"
+
+color-name@~1.1.4:
+ version "1.1.4"
+ resolved "https://registry.anpm.alibaba-inc.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+colorette@^2.0.14:
+ version "2.0.20"
+ resolved "https://registry.anpm.alibaba-inc.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a"
+ integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==
+
+combined-stream@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.anpm.alibaba-inc.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
+ integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
+ dependencies:
+ delayed-stream "~1.0.0"
+
+commander@^10.0.1:
+ version "10.0.1"
+ resolved "https://registry.anpm.alibaba-inc.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06"
+ integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==
+
+commander@^12.1.0:
+ version "12.1.0"
+ resolved "https://registry.anpm.alibaba-inc.com/commander/-/commander-12.1.0.tgz#01423b36f501259fdaac4d0e4d60c96c991585d3"
+ integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==
+
+commander@^2.20.0:
+ version "2.20.3"
+ resolved "https://registry.anpm.alibaba-inc.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
+ integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.anpm.alibaba-inc.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+ integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
+
+convert-source-map@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a"
+ integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==
+
+create-jest@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.anpm.alibaba-inc.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320"
+ integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==
+ dependencies:
+ "@jest/types" "^29.6.3"
+ chalk "^4.0.0"
+ exit "^0.1.2"
+ graceful-fs "^4.2.9"
+ jest-config "^29.7.0"
+ jest-util "^29.7.0"
+ prompts "^2.0.1"
+
+cross-spawn@^7.0.2, cross-spawn@^7.0.3:
+ version "7.0.6"
+ resolved "https://registry.anpm.alibaba-inc.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f"
+ integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==
+ dependencies:
+ path-key "^3.1.0"
+ shebang-command "^2.0.0"
+ which "^2.0.1"
+
+css-loader@^6.8.0:
+ version "6.11.0"
+ resolved "https://registry.anpm.alibaba-inc.com/css-loader/-/css-loader-6.11.0.tgz#33bae3bf6363d0a7c2cf9031c96c744ff54d85ba"
+ integrity sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==
+ dependencies:
+ icss-utils "^5.1.0"
+ postcss "^8.4.33"
+ postcss-modules-extract-imports "^3.1.0"
+ postcss-modules-local-by-default "^4.0.5"
+ postcss-modules-scope "^3.2.0"
+ postcss-modules-values "^4.0.0"
+ postcss-value-parser "^4.2.0"
+ semver "^7.5.4"
+
+css-select@^5.1.0:
+ version "5.2.2"
+ resolved "https://registry.anpm.alibaba-inc.com/css-select/-/css-select-5.2.2.tgz#01b6e8d163637bb2dd6c982ca4ed65863682786e"
+ integrity sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==
+ dependencies:
+ boolbase "^1.0.0"
+ css-what "^6.1.0"
+ domhandler "^5.0.2"
+ domutils "^3.0.1"
+ nth-check "^2.0.1"
+
+css-what@^6.1.0:
+ version "6.2.2"
+ resolved "https://registry.anpm.alibaba-inc.com/css-what/-/css-what-6.2.2.tgz#cdcc8f9b6977719fdfbd1de7aec24abf756b9dea"
+ integrity sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==
+
+cssesc@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
+ integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
+
+debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.4.1, debug@^4.4.3:
+ version "4.4.3"
+ resolved "https://registry.anpm.alibaba-inc.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a"
+ integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==
+ dependencies:
+ ms "^2.1.3"
+
+decompress-response@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc"
+ integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==
+ dependencies:
+ mimic-response "^3.1.0"
+
+dedent@^1.0.0:
+ version "1.7.2"
+ resolved "https://registry.anpm.alibaba-inc.com/dedent/-/dedent-1.7.2.tgz#34e2264ab538301e27cf7b07bf2369c19baa8dd9"
+ integrity sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==
+
+deep-extend@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.anpm.alibaba-inc.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
+ integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
+
+deep-is@^0.1.3:
+ version "0.1.4"
+ resolved "https://registry.anpm.alibaba-inc.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
+ integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
+
+deepmerge@^4.2.2:
+ version "4.3.1"
+ resolved "https://registry.anpm.alibaba-inc.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a"
+ integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==
+
+default-browser-id@^5.0.0:
+ version "5.0.1"
+ resolved "https://registry.anpm.alibaba-inc.com/default-browser-id/-/default-browser-id-5.0.1.tgz#f7a7ccb8f5104bf8e0f71ba3b1ccfa5eafdb21e8"
+ integrity sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==
+
+default-browser@^5.2.1:
+ version "5.5.0"
+ resolved "https://registry.anpm.alibaba-inc.com/default-browser/-/default-browser-5.5.0.tgz#2792e886f2422894545947cc80e1a444496c5976"
+ integrity sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==
+ dependencies:
+ bundle-name "^4.1.0"
+ default-browser-id "^5.0.0"
+
+define-lazy-prop@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f"
+ integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==
+
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+ integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
+
+detect-libc@^2.0.0:
+ version "2.1.2"
+ resolved "https://registry.anpm.alibaba-inc.com/detect-libc/-/detect-libc-2.1.2.tgz#689c5dcdc1900ef5583a4cb9f6d7b473742074ad"
+ integrity sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==
+
+detect-newline@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.anpm.alibaba-inc.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651"
+ integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==
+
+diff-sequences@^29.6.3:
+ version "29.6.3"
+ resolved "https://registry.anpm.alibaba-inc.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921"
+ integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==
+
+dir-glob@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.anpm.alibaba-inc.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
+ integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==
+ dependencies:
+ path-type "^4.0.0"
+
+doctrine@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
+ integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
+ dependencies:
+ esutils "^2.0.2"
+
+dom-serializer@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53"
+ integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==
+ dependencies:
+ domelementtype "^2.3.0"
+ domhandler "^5.0.2"
+ entities "^4.2.0"
+
+domelementtype@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.anpm.alibaba-inc.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d"
+ integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==
+
+domhandler@^5.0.2, domhandler@^5.0.3:
+ version "5.0.3"
+ resolved "https://registry.anpm.alibaba-inc.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31"
+ integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==
+ dependencies:
+ domelementtype "^2.3.0"
+
+domutils@^3.0.1, domutils@^3.2.2:
+ version "3.2.2"
+ resolved "https://registry.anpm.alibaba-inc.com/domutils/-/domutils-3.2.2.tgz#edbfe2b668b0c1d97c24baf0f1062b132221bc78"
+ integrity sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==
+ dependencies:
+ dom-serializer "^2.0.0"
+ domelementtype "^2.3.0"
+ domhandler "^5.0.3"
+
+dunder-proto@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.anpm.alibaba-inc.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a"
+ integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==
+ dependencies:
+ call-bind-apply-helpers "^1.0.1"
+ es-errors "^1.3.0"
+ gopd "^1.2.0"
+
+ecdsa-sig-formatter@1.0.11:
+ version "1.0.11"
+ resolved "https://registry.anpm.alibaba-inc.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf"
+ integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==
+ dependencies:
+ safe-buffer "^5.0.1"
+
+editions@^6.21.0:
+ version "6.22.0"
+ resolved "https://registry.anpm.alibaba-inc.com/editions/-/editions-6.22.0.tgz#3913c4eea9aa4586e17bcd25d64d5edf1790657a"
+ integrity sha512-UgGlf8IW75je7HZjNDpJdCv4cGJWIi6yumFdZ0R7A8/CIhQiWUjyGLCxdHpd8bmyD1gnkfUNK0oeOXqUS2cpfQ==
+ dependencies:
+ version-range "^4.15.0"
+
+electron-to-chromium@^1.5.328:
+ version "1.5.368"
+ resolved "https://registry.anpm.alibaba-inc.com/electron-to-chromium/-/electron-to-chromium-1.5.368.tgz#8e8d4600c5f5f01e891f8f843b4a941afb640412"
+ integrity sha512-7RckJJK4uESJF9PxvfMWd3TGqIiieUTG4HxnKaKuIpGbcr+r2ZEB3g2gAhCP3Fqm42vJSzLfgab9eva/C4/XVw==
+
+emittery@^0.13.1:
+ version "0.13.1"
+ resolved "https://registry.anpm.alibaba-inc.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad"
+ integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==
+
+emoji-regex@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
+ integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+
+encoding-sniffer@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.anpm.alibaba-inc.com/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz#396ec97ac22ce5a037ba44af1992ac9d46a7b819"
+ integrity sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==
+ dependencies:
+ iconv-lite "^0.6.3"
+ whatwg-encoding "^3.1.1"
+
+end-of-stream@^1.1.0, end-of-stream@^1.4.1:
+ version "1.4.5"
+ resolved "https://registry.anpm.alibaba-inc.com/end-of-stream/-/end-of-stream-1.4.5.tgz#7344d711dea40e0b74abc2ed49778743ccedb08c"
+ integrity sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==
+ dependencies:
+ once "^1.4.0"
+
+enhanced-resolve@^5.0.0, enhanced-resolve@^5.22.0:
+ version "5.23.0"
+ resolved "https://registry.anpm.alibaba-inc.com/enhanced-resolve/-/enhanced-resolve-5.23.0.tgz#dfdf8d1c9065e4b52f8a598356138931c07305f9"
+ integrity sha512-yJN/BOOLxcOW2aQgeif9mSnaUB8KtvmMMp56oA1kx1CRfBKbhZm2pJ+NBY+3eOboHxix8lfjWpHE0Ei5U8RbSA==
+ dependencies:
+ graceful-fs "^4.2.4"
+ tapable "^2.3.3"
+
+entities@^4.2.0, entities@^4.4.0:
+ version "4.5.0"
+ resolved "https://registry.anpm.alibaba-inc.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48"
+ integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
+
+entities@^6.0.0:
+ version "6.0.1"
+ resolved "https://registry.anpm.alibaba-inc.com/entities/-/entities-6.0.1.tgz#c28c34a43379ca7f61d074130b2f5f7020a30694"
+ integrity sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==
+
+entities@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.anpm.alibaba-inc.com/entities/-/entities-7.0.1.tgz#26e8a88889db63417dcb9a1e79a3f1bc92b5976b"
+ integrity sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==
+
+envinfo@^7.7.3:
+ version "7.21.0"
+ resolved "https://registry.anpm.alibaba-inc.com/envinfo/-/envinfo-7.21.0.tgz#04a251be79f92548541f37d13c8b6f22940c3bae"
+ integrity sha512-Lw7I8Zp5YKHFCXL7+Dz95g4CcbMEpgvqZNNq3AmlT5XAV6CgAAk6gyAMqn2zjw08K9BHfcNuKrMiCPLByGafow==
+
+environment@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.anpm.alibaba-inc.com/environment/-/environment-1.1.0.tgz#8e86c66b180f363c7ab311787e0259665f45a9f1"
+ integrity sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==
+
+error-ex@^1.3.1:
+ version "1.3.4"
+ resolved "https://registry.anpm.alibaba-inc.com/error-ex/-/error-ex-1.3.4.tgz#b3a8d8bb6f92eecc1629e3e27d3c8607a8a32414"
+ integrity sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==
+ dependencies:
+ is-arrayish "^0.2.1"
+
+es-define-property@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.anpm.alibaba-inc.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa"
+ integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==
+
+es-errors@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.anpm.alibaba-inc.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f"
+ integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==
+
+es-module-lexer@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.anpm.alibaba-inc.com/es-module-lexer/-/es-module-lexer-2.1.0.tgz#1dfcbb5ea3bbfb63f28e1fc3676c3676d1c9624c"
+ integrity sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==
+
+es-object-atoms@^1.0.0, es-object-atoms@^1.1.1:
+ version "1.1.2"
+ resolved "https://registry.anpm.alibaba-inc.com/es-object-atoms/-/es-object-atoms-1.1.2.tgz#a2d0b373205724dfa525d23b0c3e1b1ca582c99b"
+ integrity sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==
+ dependencies:
+ es-errors "^1.3.0"
+
+es-set-tostringtag@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.anpm.alibaba-inc.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d"
+ integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==
+ dependencies:
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.6"
+ has-tostringtag "^1.0.2"
+ hasown "^2.0.2"
+
+escalade@^3.1.1, escalade@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.anpm.alibaba-inc.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5"
+ integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==
+
+escape-string-regexp@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344"
+ integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==
+
+escape-string-regexp@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
+ integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
+
+eslint-scope@5.1.1:
+ version "5.1.1"
+ resolved "https://registry.anpm.alibaba-inc.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c"
+ integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==
+ dependencies:
+ esrecurse "^4.3.0"
+ estraverse "^4.1.1"
+
+eslint-scope@^7.2.2:
+ version "7.2.2"
+ resolved "https://registry.anpm.alibaba-inc.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f"
+ integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==
+ dependencies:
+ esrecurse "^4.3.0"
+ estraverse "^5.2.0"
+
+eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3:
+ version "3.4.3"
+ resolved "https://registry.anpm.alibaba-inc.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800"
+ integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
+
+eslint@^8.56.0:
+ version "8.57.1"
+ resolved "https://registry.anpm.alibaba-inc.com/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9"
+ integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==
+ dependencies:
+ "@eslint-community/eslint-utils" "^4.2.0"
+ "@eslint-community/regexpp" "^4.6.1"
+ "@eslint/eslintrc" "^2.1.4"
+ "@eslint/js" "8.57.1"
+ "@humanwhocodes/config-array" "^0.13.0"
+ "@humanwhocodes/module-importer" "^1.0.1"
+ "@nodelib/fs.walk" "^1.2.8"
+ "@ungap/structured-clone" "^1.2.0"
+ ajv "^6.12.4"
+ chalk "^4.0.0"
+ cross-spawn "^7.0.2"
+ debug "^4.3.2"
+ doctrine "^3.0.0"
+ escape-string-regexp "^4.0.0"
+ eslint-scope "^7.2.2"
+ eslint-visitor-keys "^3.4.3"
+ espree "^9.6.1"
+ esquery "^1.4.2"
+ esutils "^2.0.2"
+ fast-deep-equal "^3.1.3"
+ file-entry-cache "^6.0.1"
+ find-up "^5.0.0"
+ glob-parent "^6.0.2"
+ globals "^13.19.0"
+ graphemer "^1.4.0"
+ ignore "^5.2.0"
+ imurmurhash "^0.1.4"
+ is-glob "^4.0.0"
+ is-path-inside "^3.0.3"
+ js-yaml "^4.1.0"
+ json-stable-stringify-without-jsonify "^1.0.1"
+ levn "^0.4.1"
+ lodash.merge "^4.6.2"
+ minimatch "^3.1.2"
+ natural-compare "^1.4.0"
+ optionator "^0.9.3"
+ strip-ansi "^6.0.1"
+ text-table "^0.2.0"
+
+espree@^9.6.0, espree@^9.6.1:
+ version "9.6.1"
+ resolved "https://registry.anpm.alibaba-inc.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f"
+ integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==
+ dependencies:
+ acorn "^8.9.0"
+ acorn-jsx "^5.3.2"
+ eslint-visitor-keys "^3.4.1"
+
+esprima@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.anpm.alibaba-inc.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
+ integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
+
+esquery@^1.4.2:
+ version "1.7.0"
+ resolved "https://registry.anpm.alibaba-inc.com/esquery/-/esquery-1.7.0.tgz#08d048f261f0ddedb5bae95f46809463d9c9496d"
+ integrity sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==
+ dependencies:
+ estraverse "^5.1.0"
+
+esrecurse@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.anpm.alibaba-inc.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921"
+ integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==
+ dependencies:
+ estraverse "^5.2.0"
+
+estraverse@^4.1.1:
+ version "4.3.0"
+ resolved "https://registry.anpm.alibaba-inc.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
+ integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
+
+estraverse@^5.1.0, estraverse@^5.2.0:
+ version "5.3.0"
+ resolved "https://registry.anpm.alibaba-inc.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123"
+ integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
+
+esutils@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.anpm.alibaba-inc.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
+ integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+
+events@^3.2.0:
+ version "3.3.0"
+ resolved "https://registry.anpm.alibaba-inc.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
+ integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
+
+execa@^5.0.0:
+ version "5.1.1"
+ resolved "https://registry.anpm.alibaba-inc.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd"
+ integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==
+ dependencies:
+ cross-spawn "^7.0.3"
+ get-stream "^6.0.0"
+ human-signals "^2.1.0"
+ is-stream "^2.0.0"
+ merge-stream "^2.0.0"
+ npm-run-path "^4.0.1"
+ onetime "^5.1.2"
+ signal-exit "^3.0.3"
+ strip-final-newline "^2.0.0"
+
+exit@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.anpm.alibaba-inc.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c"
+ integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==
+
+expand-template@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.anpm.alibaba-inc.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c"
+ integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==
+
+expect@^29.0.0, expect@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.anpm.alibaba-inc.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc"
+ integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==
+ dependencies:
+ "@jest/expect-utils" "^29.7.0"
+ jest-get-type "^29.6.3"
+ jest-matcher-utils "^29.7.0"
+ jest-message-util "^29.7.0"
+ jest-util "^29.7.0"
+
+fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
+ version "3.1.3"
+ resolved "https://registry.anpm.alibaba-inc.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
+ integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+
+fast-glob@^3.2.9, fast-glob@^3.3.3:
+ version "3.3.3"
+ resolved "https://registry.anpm.alibaba-inc.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818"
+ integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==
+ dependencies:
+ "@nodelib/fs.stat" "^2.0.2"
+ "@nodelib/fs.walk" "^1.2.3"
+ glob-parent "^5.1.2"
+ merge2 "^1.3.0"
+ micromatch "^4.0.8"
+
+fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.anpm.alibaba-inc.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
+ integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
+
+fast-levenshtein@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.anpm.alibaba-inc.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+ integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
+
+fast-uri@^3.0.1:
+ version "3.1.2"
+ resolved "https://registry.anpm.alibaba-inc.com/fast-uri/-/fast-uri-3.1.2.tgz#8af3d4fc9d3e71b11572cc2673b514a7d1a8c8ec"
+ integrity sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==
+
+fastest-levenshtein@^1.0.12:
+ version "1.0.16"
+ resolved "https://registry.anpm.alibaba-inc.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5"
+ integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==
+
+fastq@^1.6.0:
+ version "1.20.1"
+ resolved "https://registry.anpm.alibaba-inc.com/fastq/-/fastq-1.20.1.tgz#ca750a10dc925bc8b18839fd203e3ef4b3ced675"
+ integrity sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==
+ dependencies:
+ reusify "^1.0.4"
+
+fb-watchman@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.anpm.alibaba-inc.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c"
+ integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==
+ dependencies:
+ bser "2.1.1"
+
+file-entry-cache@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.anpm.alibaba-inc.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027"
+ integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==
+ dependencies:
+ flat-cache "^3.0.4"
+
+fill-range@^7.1.1:
+ version "7.1.1"
+ resolved "https://registry.anpm.alibaba-inc.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292"
+ integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==
+ dependencies:
+ to-regex-range "^5.0.1"
+
+find-up@^4.0.0, find-up@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.anpm.alibaba-inc.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
+ integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
+ dependencies:
+ locate-path "^5.0.0"
+ path-exists "^4.0.0"
+
+find-up@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc"
+ integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==
+ dependencies:
+ locate-path "^6.0.0"
+ path-exists "^4.0.0"
+
+flat-cache@^3.0.4:
+ version "3.2.0"
+ resolved "https://registry.anpm.alibaba-inc.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee"
+ integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==
+ dependencies:
+ flatted "^3.2.9"
+ keyv "^4.5.3"
+ rimraf "^3.0.2"
+
+flat@^5.0.2:
+ version "5.0.2"
+ resolved "https://registry.anpm.alibaba-inc.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241"
+ integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==
+
+flatted@^3.2.9:
+ version "3.4.2"
+ resolved "https://registry.anpm.alibaba-inc.com/flatted/-/flatted-3.4.2.tgz#f5c23c107f0f37de8dbdf24f13722b3b98d52726"
+ integrity sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==
+
+form-data@^4.0.0:
+ version "4.0.5"
+ resolved "https://registry.anpm.alibaba-inc.com/form-data/-/form-data-4.0.5.tgz#b49e48858045ff4cbf6b03e1805cebcad3679053"
+ integrity sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.8"
+ es-set-tostringtag "^2.1.0"
+ hasown "^2.0.2"
+ mime-types "^2.1.12"
+
+fs-constants@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
+ integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
+
+fs-extra@^11.1.1:
+ version "11.3.5"
+ resolved "https://registry.anpm.alibaba-inc.com/fs-extra/-/fs-extra-11.3.5.tgz#07a44eff40bea53e719909a532f91a23bf0769ff"
+ integrity sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==
+ dependencies:
+ graceful-fs "^4.2.0"
+ jsonfile "^6.0.1"
+ universalify "^2.0.0"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+ integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
+
+fsevents@^2.3.2:
+ version "2.3.3"
+ resolved "https://registry.anpm.alibaba-inc.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
+ integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
+
+function-bind@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.anpm.alibaba-inc.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
+ integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
+
+gensync@^1.0.0-beta.2:
+ version "1.0.0-beta.2"
+ resolved "https://registry.anpm.alibaba-inc.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
+ integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
+
+get-caller-file@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.anpm.alibaba-inc.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
+ integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
+
+get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.anpm.alibaba-inc.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01"
+ integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==
+ dependencies:
+ call-bind-apply-helpers "^1.0.2"
+ es-define-property "^1.0.1"
+ es-errors "^1.3.0"
+ es-object-atoms "^1.1.1"
+ function-bind "^1.1.2"
+ get-proto "^1.0.1"
+ gopd "^1.2.0"
+ has-symbols "^1.1.0"
+ hasown "^2.0.2"
+ math-intrinsics "^1.1.0"
+
+get-package-type@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.anpm.alibaba-inc.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a"
+ integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==
+
+get-proto@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.anpm.alibaba-inc.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1"
+ integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==
+ dependencies:
+ dunder-proto "^1.0.1"
+ es-object-atoms "^1.0.0"
+
+get-stream@^6.0.0:
+ version "6.0.1"
+ resolved "https://registry.anpm.alibaba-inc.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7"
+ integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==
+
+github-from-package@0.0.0:
+ version "0.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce"
+ integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==
+
+glob-parent@^5.1.2:
+ version "5.1.2"
+ resolved "https://registry.anpm.alibaba-inc.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
+ integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
+ dependencies:
+ is-glob "^4.0.1"
+
+glob-parent@^6.0.2:
+ version "6.0.2"
+ resolved "https://registry.anpm.alibaba-inc.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3"
+ integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==
+ dependencies:
+ is-glob "^4.0.3"
+
+glob-to-regexp@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.anpm.alibaba-inc.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e"
+ integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==
+
+glob@^13.0.6:
+ version "13.0.6"
+ resolved "https://registry.anpm.alibaba-inc.com/glob/-/glob-13.0.6.tgz#078666566a425147ccacfbd2e332deb66a2be71d"
+ integrity sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==
+ dependencies:
+ minimatch "^10.2.2"
+ minipass "^7.1.3"
+ path-scurry "^2.0.2"
+
+glob@^7.1.3, glob@^7.1.4:
+ version "7.2.3"
+ resolved "https://registry.anpm.alibaba-inc.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
+ integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.1.1"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+globals@^13.19.0:
+ version "13.24.0"
+ resolved "https://registry.anpm.alibaba-inc.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171"
+ integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==
+ dependencies:
+ type-fest "^0.20.2"
+
+globby@^11.1.0:
+ version "11.1.0"
+ resolved "https://registry.anpm.alibaba-inc.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b"
+ integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==
+ dependencies:
+ array-union "^2.1.0"
+ dir-glob "^3.0.1"
+ fast-glob "^3.2.9"
+ ignore "^5.2.0"
+ merge2 "^1.4.1"
+ slash "^3.0.0"
+
+globby@^14.1.0:
+ version "14.1.0"
+ resolved "https://registry.anpm.alibaba-inc.com/globby/-/globby-14.1.0.tgz#138b78e77cf5a8d794e327b15dce80bf1fb0a73e"
+ integrity sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==
+ dependencies:
+ "@sindresorhus/merge-streams" "^2.1.0"
+ fast-glob "^3.3.3"
+ ignore "^7.0.3"
+ path-type "^6.0.0"
+ slash "^5.1.0"
+ unicorn-magic "^0.3.0"
+
+gopd@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.anpm.alibaba-inc.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1"
+ integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==
+
+graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.9:
+ version "4.2.11"
+ resolved "https://registry.anpm.alibaba-inc.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
+ integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
+
+graphemer@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.anpm.alibaba-inc.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6"
+ integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==
+
+handlebars@^4.7.9:
+ version "4.7.9"
+ resolved "https://registry.anpm.alibaba-inc.com/handlebars/-/handlebars-4.7.9.tgz#6f139082ab58dc4e5a0e51efe7db5ae890d56a0f"
+ integrity sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==
+ dependencies:
+ minimist "^1.2.5"
+ neo-async "^2.6.2"
+ source-map "^0.6.1"
+ wordwrap "^1.0.0"
+ optionalDependencies:
+ uglify-js "^3.1.4"
+
+has-flag@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
+has-symbols@^1.0.3, has-symbols@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.anpm.alibaba-inc.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338"
+ integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==
+
+has-tostringtag@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.anpm.alibaba-inc.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc"
+ integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==
+ dependencies:
+ has-symbols "^1.0.3"
+
+hasown@^2.0.2, hasown@^2.0.3:
+ version "2.0.4"
+ resolved "https://registry.anpm.alibaba-inc.com/hasown/-/hasown-2.0.4.tgz#8c62d8cb90beb2aad5d0a5b67581ad9854c3f003"
+ integrity sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==
+ dependencies:
+ function-bind "^1.1.2"
+
+hosted-git-info@^4.0.2:
+ version "4.1.0"
+ resolved "https://registry.anpm.alibaba-inc.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224"
+ integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==
+ dependencies:
+ lru-cache "^6.0.0"
+
+hosted-git-info@^7.0.0:
+ version "7.0.2"
+ resolved "https://registry.anpm.alibaba-inc.com/hosted-git-info/-/hosted-git-info-7.0.2.tgz#9b751acac097757667f30114607ef7b661ff4f17"
+ integrity sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==
+ dependencies:
+ lru-cache "^10.0.1"
+
+html-escaper@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.anpm.alibaba-inc.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453"
+ integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==
+
+htmlparser2@^10.1.0:
+ version "10.1.0"
+ resolved "https://registry.anpm.alibaba-inc.com/htmlparser2/-/htmlparser2-10.1.0.tgz#fe3f2e12c73b6e462d4e10395db9c1119e4d6ae4"
+ integrity sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==
+ dependencies:
+ domelementtype "^2.3.0"
+ domhandler "^5.0.3"
+ domutils "^3.2.2"
+ entities "^7.0.1"
+
+http-proxy-agent@^7.0.0:
+ version "7.0.2"
+ resolved "https://registry.anpm.alibaba-inc.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e"
+ integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==
+ dependencies:
+ agent-base "^7.1.0"
+ debug "^4.3.4"
+
+https-proxy-agent@^7.0.0:
+ version "7.0.6"
+ resolved "https://registry.anpm.alibaba-inc.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz#da8dfeac7da130b05c2ba4b59c9b6cd66611a6b9"
+ integrity sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==
+ dependencies:
+ agent-base "^7.1.2"
+ debug "4"
+
+human-signals@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.anpm.alibaba-inc.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0"
+ integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
+
+iconv-lite@0.6.3, iconv-lite@^0.6.3:
+ version "0.6.3"
+ resolved "https://registry.anpm.alibaba-inc.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501"
+ integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3.0.0"
+
+icss-utils@^5.0.0, icss-utils@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.anpm.alibaba-inc.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae"
+ integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==
+
+ieee754@^1.1.13:
+ version "1.2.1"
+ resolved "https://registry.anpm.alibaba-inc.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
+ integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
+
+ignore@^5.2.0, ignore@^5.2.4:
+ version "5.3.2"
+ resolved "https://registry.anpm.alibaba-inc.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5"
+ integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==
+
+ignore@^7.0.3:
+ version "7.0.5"
+ resolved "https://registry.anpm.alibaba-inc.com/ignore/-/ignore-7.0.5.tgz#4cb5f6cd7d4c7ab0365738c7aea888baa6d7efd9"
+ integrity sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==
+
+import-fresh@^3.2.1:
+ version "3.3.1"
+ resolved "https://registry.anpm.alibaba-inc.com/import-fresh/-/import-fresh-3.3.1.tgz#9cecb56503c0ada1f2741dbbd6546e4b13b57ccf"
+ integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==
+ dependencies:
+ parent-module "^1.0.0"
+ resolve-from "^4.0.0"
+
+import-local@^3.0.2:
+ version "3.2.0"
+ resolved "https://registry.anpm.alibaba-inc.com/import-local/-/import-local-3.2.0.tgz#c3d5c745798c02a6f8b897726aba5100186ee260"
+ integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==
+ dependencies:
+ pkg-dir "^4.2.0"
+ resolve-cwd "^3.0.0"
+
+imurmurhash@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.anpm.alibaba-inc.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+ integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==
+
+index-to-position@^1.1.0:
+ version "1.2.0"
+ resolved "https://registry.anpm.alibaba-inc.com/index-to-position/-/index-to-position-1.2.0.tgz#c800eb34dacf4dbf96b9b06c7eb78d5f704138b4"
+ integrity sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.anpm.alibaba-inc.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2, inherits@^2.0.3, inherits@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.anpm.alibaba-inc.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+ini@~1.3.0:
+ version "1.3.8"
+ resolved "https://registry.anpm.alibaba-inc.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
+ integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
+
+interpret@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.anpm.alibaba-inc.com/interpret/-/interpret-3.1.1.tgz#5be0ceed67ca79c6c4bc5cf0d7ee843dcea110c4"
+ integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==
+
+is-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.anpm.alibaba-inc.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+ integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==
+
+is-core-module@^2.16.1:
+ version "2.16.2"
+ resolved "https://registry.anpm.alibaba-inc.com/is-core-module/-/is-core-module-2.16.2.tgz#3e07450a8080ebce3fbf0cac494f4d2ab324e082"
+ integrity sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==
+ dependencies:
+ hasown "^2.0.3"
+
+is-docker@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200"
+ integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==
+
+is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.anpm.alibaba-inc.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+ integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
+
+is-fullwidth-code-point@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
+ integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+
+is-generator-fn@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.anpm.alibaba-inc.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118"
+ integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==
+
+is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.anpm.alibaba-inc.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
+ integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-inside-container@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4"
+ integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==
+ dependencies:
+ is-docker "^3.0.0"
+
+is-number@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
+ integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
+is-path-inside@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.anpm.alibaba-inc.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283"
+ integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
+
+is-plain-object@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.anpm.alibaba-inc.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
+ integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
+ dependencies:
+ isobject "^3.0.1"
+
+is-stream@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.anpm.alibaba-inc.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077"
+ integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==
+
+is-wsl@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.anpm.alibaba-inc.com/is-wsl/-/is-wsl-3.1.1.tgz#327897b26832a3eb117da6c27492d04ca132594f"
+ integrity sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==
+ dependencies:
+ is-inside-container "^1.0.0"
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+ integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
+
+isobject@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.anpm.alibaba-inc.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
+ integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==
+
+istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0:
+ version "3.2.2"
+ resolved "https://registry.anpm.alibaba-inc.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756"
+ integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==
+
+istanbul-lib-instrument@^5.0.4:
+ version "5.2.1"
+ resolved "https://registry.anpm.alibaba-inc.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d"
+ integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==
+ dependencies:
+ "@babel/core" "^7.12.3"
+ "@babel/parser" "^7.14.7"
+ "@istanbuljs/schema" "^0.1.2"
+ istanbul-lib-coverage "^3.2.0"
+ semver "^6.3.0"
+
+istanbul-lib-instrument@^6.0.0:
+ version "6.0.3"
+ resolved "https://registry.anpm.alibaba-inc.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz#fa15401df6c15874bcb2105f773325d78c666765"
+ integrity sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==
+ dependencies:
+ "@babel/core" "^7.23.9"
+ "@babel/parser" "^7.23.9"
+ "@istanbuljs/schema" "^0.1.3"
+ istanbul-lib-coverage "^3.2.0"
+ semver "^7.5.4"
+
+istanbul-lib-report@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.anpm.alibaba-inc.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d"
+ integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==
+ dependencies:
+ istanbul-lib-coverage "^3.0.0"
+ make-dir "^4.0.0"
+ supports-color "^7.1.0"
+
+istanbul-lib-source-maps@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.anpm.alibaba-inc.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551"
+ integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==
+ dependencies:
+ debug "^4.1.1"
+ istanbul-lib-coverage "^3.0.0"
+ source-map "^0.6.1"
+
+istanbul-reports@^3.1.3:
+ version "3.2.0"
+ resolved "https://registry.anpm.alibaba-inc.com/istanbul-reports/-/istanbul-reports-3.2.0.tgz#cb4535162b5784aa623cee21a7252cf2c807ac93"
+ integrity sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==
+ dependencies:
+ html-escaper "^2.0.0"
+ istanbul-lib-report "^3.0.0"
+
+istextorbinary@^9.5.0:
+ version "9.5.0"
+ resolved "https://registry.anpm.alibaba-inc.com/istextorbinary/-/istextorbinary-9.5.0.tgz#e6e13febf1c1685100ae264809a4f8f46e01dfd3"
+ integrity sha512-5mbUj3SiZXCuRf9fT3ibzbSSEWiy63gFfksmGfdOzujPjW3k+z8WvIBxcJHBoQNlaZaiyB25deviif2+osLmLw==
+ dependencies:
+ binaryextensions "^6.11.0"
+ editions "^6.21.0"
+ textextensions "^6.11.0"
+
+jest-changed-files@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.anpm.alibaba-inc.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a"
+ integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==
+ dependencies:
+ execa "^5.0.0"
+ jest-util "^29.7.0"
+ p-limit "^3.1.0"
+
+jest-circus@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.anpm.alibaba-inc.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a"
+ integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==
+ dependencies:
+ "@jest/environment" "^29.7.0"
+ "@jest/expect" "^29.7.0"
+ "@jest/test-result" "^29.7.0"
+ "@jest/types" "^29.6.3"
+ "@types/node" "*"
+ chalk "^4.0.0"
+ co "^4.6.0"
+ dedent "^1.0.0"
+ is-generator-fn "^2.0.0"
+ jest-each "^29.7.0"
+ jest-matcher-utils "^29.7.0"
+ jest-message-util "^29.7.0"
+ jest-runtime "^29.7.0"
+ jest-snapshot "^29.7.0"
+ jest-util "^29.7.0"
+ p-limit "^3.1.0"
+ pretty-format "^29.7.0"
+ pure-rand "^6.0.0"
+ slash "^3.0.0"
+ stack-utils "^2.0.3"
+
+jest-cli@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.anpm.alibaba-inc.com/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995"
+ integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==
+ dependencies:
+ "@jest/core" "^29.7.0"
+ "@jest/test-result" "^29.7.0"
+ "@jest/types" "^29.6.3"
+ chalk "^4.0.0"
+ create-jest "^29.7.0"
+ exit "^0.1.2"
+ import-local "^3.0.2"
+ jest-config "^29.7.0"
+ jest-util "^29.7.0"
+ jest-validate "^29.7.0"
+ yargs "^17.3.1"
+
+jest-config@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.anpm.alibaba-inc.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f"
+ integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==
+ dependencies:
+ "@babel/core" "^7.11.6"
+ "@jest/test-sequencer" "^29.7.0"
+ "@jest/types" "^29.6.3"
+ babel-jest "^29.7.0"
+ chalk "^4.0.0"
+ ci-info "^3.2.0"
+ deepmerge "^4.2.2"
+ glob "^7.1.3"
+ graceful-fs "^4.2.9"
+ jest-circus "^29.7.0"
+ jest-environment-node "^29.7.0"
+ jest-get-type "^29.6.3"
+ jest-regex-util "^29.6.3"
+ jest-resolve "^29.7.0"
+ jest-runner "^29.7.0"
+ jest-util "^29.7.0"
+ jest-validate "^29.7.0"
+ micromatch "^4.0.4"
+ parse-json "^5.2.0"
+ pretty-format "^29.7.0"
+ slash "^3.0.0"
+ strip-json-comments "^3.1.1"
+
+jest-diff@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.anpm.alibaba-inc.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a"
+ integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==
+ dependencies:
+ chalk "^4.0.0"
+ diff-sequences "^29.6.3"
+ jest-get-type "^29.6.3"
+ pretty-format "^29.7.0"
+
+jest-docblock@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.anpm.alibaba-inc.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a"
+ integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==
+ dependencies:
+ detect-newline "^3.0.0"
+
+jest-each@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.anpm.alibaba-inc.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1"
+ integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==
+ dependencies:
+ "@jest/types" "^29.6.3"
+ chalk "^4.0.0"
+ jest-get-type "^29.6.3"
+ jest-util "^29.7.0"
+ pretty-format "^29.7.0"
+
+jest-environment-node@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.anpm.alibaba-inc.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376"
+ integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==
+ dependencies:
+ "@jest/environment" "^29.7.0"
+ "@jest/fake-timers" "^29.7.0"
+ "@jest/types" "^29.6.3"
+ "@types/node" "*"
+ jest-mock "^29.7.0"
+ jest-util "^29.7.0"
+
+jest-get-type@^29.6.3:
+ version "29.6.3"
+ resolved "https://registry.anpm.alibaba-inc.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1"
+ integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==
+
+jest-haste-map@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.anpm.alibaba-inc.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104"
+ integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==
+ dependencies:
+ "@jest/types" "^29.6.3"
+ "@types/graceful-fs" "^4.1.3"
+ "@types/node" "*"
+ anymatch "^3.0.3"
+ fb-watchman "^2.0.0"
+ graceful-fs "^4.2.9"
+ jest-regex-util "^29.6.3"
+ jest-util "^29.7.0"
+ jest-worker "^29.7.0"
+ micromatch "^4.0.4"
+ walker "^1.0.8"
+ optionalDependencies:
+ fsevents "^2.3.2"
+
+jest-leak-detector@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.anpm.alibaba-inc.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728"
+ integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==
+ dependencies:
+ jest-get-type "^29.6.3"
+ pretty-format "^29.7.0"
+
+jest-matcher-utils@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.anpm.alibaba-inc.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12"
+ integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==
+ dependencies:
+ chalk "^4.0.0"
+ jest-diff "^29.7.0"
+ jest-get-type "^29.6.3"
+ pretty-format "^29.7.0"
+
+jest-message-util@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.anpm.alibaba-inc.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3"
+ integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==
+ dependencies:
+ "@babel/code-frame" "^7.12.13"
+ "@jest/types" "^29.6.3"
+ "@types/stack-utils" "^2.0.0"
+ chalk "^4.0.0"
+ graceful-fs "^4.2.9"
+ micromatch "^4.0.4"
+ pretty-format "^29.7.0"
+ slash "^3.0.0"
+ stack-utils "^2.0.3"
+
+jest-mock@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.anpm.alibaba-inc.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347"
+ integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==
+ dependencies:
+ "@jest/types" "^29.6.3"
+ "@types/node" "*"
+ jest-util "^29.7.0"
+
+jest-pnp-resolver@^1.2.2:
+ version "1.2.3"
+ resolved "https://registry.anpm.alibaba-inc.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e"
+ integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==
+
+jest-regex-util@^29.6.3:
+ version "29.6.3"
+ resolved "https://registry.anpm.alibaba-inc.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52"
+ integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==
+
+jest-resolve-dependencies@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.anpm.alibaba-inc.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428"
+ integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==
+ dependencies:
+ jest-regex-util "^29.6.3"
+ jest-snapshot "^29.7.0"
+
+jest-resolve@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.anpm.alibaba-inc.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30"
+ integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==
+ dependencies:
+ chalk "^4.0.0"
+ graceful-fs "^4.2.9"
+ jest-haste-map "^29.7.0"
+ jest-pnp-resolver "^1.2.2"
+ jest-util "^29.7.0"
+ jest-validate "^29.7.0"
+ resolve "^1.20.0"
+ resolve.exports "^2.0.0"
+ slash "^3.0.0"
+
+jest-runner@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.anpm.alibaba-inc.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e"
+ integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==
+ dependencies:
+ "@jest/console" "^29.7.0"
+ "@jest/environment" "^29.7.0"
+ "@jest/test-result" "^29.7.0"
+ "@jest/transform" "^29.7.0"
+ "@jest/types" "^29.6.3"
+ "@types/node" "*"
+ chalk "^4.0.0"
+ emittery "^0.13.1"
+ graceful-fs "^4.2.9"
+ jest-docblock "^29.7.0"
+ jest-environment-node "^29.7.0"
+ jest-haste-map "^29.7.0"
+ jest-leak-detector "^29.7.0"
+ jest-message-util "^29.7.0"
+ jest-resolve "^29.7.0"
+ jest-runtime "^29.7.0"
+ jest-util "^29.7.0"
+ jest-watcher "^29.7.0"
+ jest-worker "^29.7.0"
+ p-limit "^3.1.0"
+ source-map-support "0.5.13"
+
+jest-runtime@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.anpm.alibaba-inc.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817"
+ integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==
+ dependencies:
+ "@jest/environment" "^29.7.0"
+ "@jest/fake-timers" "^29.7.0"
+ "@jest/globals" "^29.7.0"
+ "@jest/source-map" "^29.6.3"
+ "@jest/test-result" "^29.7.0"
+ "@jest/transform" "^29.7.0"
+ "@jest/types" "^29.6.3"
+ "@types/node" "*"
+ chalk "^4.0.0"
+ cjs-module-lexer "^1.0.0"
+ collect-v8-coverage "^1.0.0"
+ glob "^7.1.3"
+ graceful-fs "^4.2.9"
+ jest-haste-map "^29.7.0"
+ jest-message-util "^29.7.0"
+ jest-mock "^29.7.0"
+ jest-regex-util "^29.6.3"
+ jest-resolve "^29.7.0"
+ jest-snapshot "^29.7.0"
+ jest-util "^29.7.0"
+ slash "^3.0.0"
+ strip-bom "^4.0.0"
+
+jest-snapshot@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.anpm.alibaba-inc.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5"
+ integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==
+ dependencies:
+ "@babel/core" "^7.11.6"
+ "@babel/generator" "^7.7.2"
+ "@babel/plugin-syntax-jsx" "^7.7.2"
+ "@babel/plugin-syntax-typescript" "^7.7.2"
+ "@babel/types" "^7.3.3"
+ "@jest/expect-utils" "^29.7.0"
+ "@jest/transform" "^29.7.0"
+ "@jest/types" "^29.6.3"
+ babel-preset-current-node-syntax "^1.0.0"
+ chalk "^4.0.0"
+ expect "^29.7.0"
+ graceful-fs "^4.2.9"
+ jest-diff "^29.7.0"
+ jest-get-type "^29.6.3"
+ jest-matcher-utils "^29.7.0"
+ jest-message-util "^29.7.0"
+ jest-util "^29.7.0"
+ natural-compare "^1.4.0"
+ pretty-format "^29.7.0"
+ semver "^7.5.3"
+
+jest-util@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.anpm.alibaba-inc.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc"
+ integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==
+ dependencies:
+ "@jest/types" "^29.6.3"
+ "@types/node" "*"
+ chalk "^4.0.0"
+ ci-info "^3.2.0"
+ graceful-fs "^4.2.9"
+ picomatch "^2.2.3"
+
+jest-validate@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.anpm.alibaba-inc.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c"
+ integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==
+ dependencies:
+ "@jest/types" "^29.6.3"
+ camelcase "^6.2.0"
+ chalk "^4.0.0"
+ jest-get-type "^29.6.3"
+ leven "^3.1.0"
+ pretty-format "^29.7.0"
+
+jest-watcher@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.anpm.alibaba-inc.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2"
+ integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==
+ dependencies:
+ "@jest/test-result" "^29.7.0"
+ "@jest/types" "^29.6.3"
+ "@types/node" "*"
+ ansi-escapes "^4.2.1"
+ chalk "^4.0.0"
+ emittery "^0.13.1"
+ jest-util "^29.7.0"
+ string-length "^4.0.1"
+
+jest-worker@^27.4.5:
+ version "27.5.1"
+ resolved "https://registry.anpm.alibaba-inc.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0"
+ integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==
+ dependencies:
+ "@types/node" "*"
+ merge-stream "^2.0.0"
+ supports-color "^8.0.0"
+
+jest-worker@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.anpm.alibaba-inc.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a"
+ integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==
+ dependencies:
+ "@types/node" "*"
+ jest-util "^29.7.0"
+ merge-stream "^2.0.0"
+ supports-color "^8.0.0"
+
+jest@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.anpm.alibaba-inc.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613"
+ integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==
+ dependencies:
+ "@jest/core" "^29.7.0"
+ "@jest/types" "^29.6.3"
+ import-local "^3.0.2"
+ jest-cli "^29.7.0"
+
+js-tokens@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+js-yaml@^3.13.1:
+ version "3.14.2"
+ resolved "https://registry.anpm.alibaba-inc.com/js-yaml/-/js-yaml-3.14.2.tgz#77485ce1dd7f33c061fd1b16ecea23b55fcb04b0"
+ integrity sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^4.0.0"
+
+js-yaml@^4.1.0, js-yaml@^4.1.1:
+ version "4.2.0"
+ resolved "https://registry.anpm.alibaba-inc.com/js-yaml/-/js-yaml-4.2.0.tgz#2bd9e85682dd91bd469afb809d816043b3d49524"
+ integrity sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==
+ dependencies:
+ argparse "^2.0.1"
+
+jsesc@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.anpm.alibaba-inc.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d"
+ integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==
+
+json-buffer@3.0.1:
+ version "3.0.1"
+ resolved "https://registry.anpm.alibaba-inc.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13"
+ integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==
+
+json-parse-even-better-errors@^2.3.0:
+ version "2.3.1"
+ resolved "https://registry.anpm.alibaba-inc.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
+ integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
+
+json-schema-traverse@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.anpm.alibaba-inc.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+ integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
+
+json-schema-traverse@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2"
+ integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==
+
+json-stable-stringify-without-jsonify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.anpm.alibaba-inc.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
+ integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==
+
+json5@^2.2.3:
+ version "2.2.3"
+ resolved "https://registry.anpm.alibaba-inc.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283"
+ integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
+
+jsonc-parser@^3.2.0:
+ version "3.3.1"
+ resolved "https://registry.anpm.alibaba-inc.com/jsonc-parser/-/jsonc-parser-3.3.1.tgz#f2a524b4f7fd11e3d791e559977ad60b98b798b4"
+ integrity sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==
+
+jsonfile@^6.0.1:
+ version "6.2.1"
+ resolved "https://registry.anpm.alibaba-inc.com/jsonfile/-/jsonfile-6.2.1.tgz#b6e31717f22cc37330b081ce0051ed5de53af2f6"
+ integrity sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==
+ dependencies:
+ universalify "^2.0.0"
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+jsonwebtoken@^9.0.0:
+ version "9.0.3"
+ resolved "https://registry.anpm.alibaba-inc.com/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz#6cd57ab01e9b0ac07cb847d53d3c9b6ee31f7ae2"
+ integrity sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==
+ dependencies:
+ jws "^4.0.1"
+ lodash.includes "^4.3.0"
+ lodash.isboolean "^3.0.3"
+ lodash.isinteger "^4.0.4"
+ lodash.isnumber "^3.0.3"
+ lodash.isplainobject "^4.0.6"
+ lodash.isstring "^4.0.1"
+ lodash.once "^4.0.0"
+ ms "^2.1.1"
+ semver "^7.5.4"
+
+jwa@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.anpm.alibaba-inc.com/jwa/-/jwa-2.0.1.tgz#bf8176d1ad0cd72e0f3f58338595a13e110bc804"
+ integrity sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==
+ dependencies:
+ buffer-equal-constant-time "^1.0.1"
+ ecdsa-sig-formatter "1.0.11"
+ safe-buffer "^5.0.1"
+
+jws@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.anpm.alibaba-inc.com/jws/-/jws-4.0.1.tgz#07edc1be8fac20e677b283ece261498bd38f0690"
+ integrity sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==
+ dependencies:
+ jwa "^2.0.1"
+ safe-buffer "^5.0.1"
+
+keytar@^7.7.0:
+ version "7.9.0"
+ resolved "https://registry.anpm.alibaba-inc.com/keytar/-/keytar-7.9.0.tgz#4c6225708f51b50cbf77c5aae81721964c2918cb"
+ integrity sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==
+ dependencies:
+ node-addon-api "^4.3.0"
+ prebuild-install "^7.0.1"
+
+keyv@^4.5.3:
+ version "4.5.4"
+ resolved "https://registry.anpm.alibaba-inc.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93"
+ integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==
+ dependencies:
+ json-buffer "3.0.1"
+
+kind-of@^6.0.2:
+ version "6.0.3"
+ resolved "https://registry.anpm.alibaba-inc.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
+ integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
+
+kleur@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.anpm.alibaba-inc.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e"
+ integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==
+
+leven@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.anpm.alibaba-inc.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2"
+ integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==
+
+levn@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.anpm.alibaba-inc.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade"
+ integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==
+ dependencies:
+ prelude-ls "^1.2.1"
+ type-check "~0.4.0"
+
+lines-and-columns@^1.1.6:
+ version "1.2.4"
+ resolved "https://registry.anpm.alibaba-inc.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632"
+ integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==
+
+linkify-it@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.anpm.alibaba-inc.com/linkify-it/-/linkify-it-5.0.1.tgz#10c4cecbb5c6828eabf81d3c801adc4a542dfb55"
+ integrity sha512-wVoTjP4Q6R0NW5hiZkVJaFZPWgtXfoGF+6LucL3/FtiNjmcHhYjEr5f1Kqjirc1nBW07J/ZuRFumqr2oqccEWg==
+ dependencies:
+ uc.micro "^2.0.0"
+
+loader-runner@^4.3.2:
+ version "4.3.2"
+ resolved "https://registry.anpm.alibaba-inc.com/loader-runner/-/loader-runner-4.3.2.tgz#9913d3a15971f8f635915e601fb5c9d495d918e9"
+ integrity sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==
+
+locate-path@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0"
+ integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==
+ dependencies:
+ p-locate "^4.1.0"
+
+locate-path@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286"
+ integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==
+ dependencies:
+ p-locate "^5.0.0"
+
+lodash.includes@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.anpm.alibaba-inc.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f"
+ integrity sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==
+
+lodash.isboolean@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.anpm.alibaba-inc.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6"
+ integrity sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==
+
+lodash.isinteger@^4.0.4:
+ version "4.0.4"
+ resolved "https://registry.anpm.alibaba-inc.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343"
+ integrity sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==
+
+lodash.isnumber@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.anpm.alibaba-inc.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc"
+ integrity sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==
+
+lodash.isplainobject@^4.0.6:
+ version "4.0.6"
+ resolved "https://registry.anpm.alibaba-inc.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb"
+ integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==
+
+lodash.isstring@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.anpm.alibaba-inc.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451"
+ integrity sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==
+
+lodash.memoize@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.anpm.alibaba-inc.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
+ integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==
+
+lodash.merge@^4.6.2:
+ version "4.6.2"
+ resolved "https://registry.anpm.alibaba-inc.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
+ integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
+
+lodash.once@^4.0.0:
+ version "4.1.1"
+ resolved "https://registry.anpm.alibaba-inc.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac"
+ integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==
+
+lodash.truncate@^4.4.2:
+ version "4.4.2"
+ resolved "https://registry.anpm.alibaba-inc.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193"
+ integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==
+
+lodash@^4.18.1:
+ version "4.18.1"
+ resolved "https://registry.anpm.alibaba-inc.com/lodash/-/lodash-4.18.1.tgz#ff2b66c1f6326d59513de2407bf881439812771c"
+ integrity sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==
+
+lru-cache@^10.0.1:
+ version "10.4.3"
+ resolved "https://registry.anpm.alibaba-inc.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119"
+ integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==
+
+lru-cache@^11.0.0:
+ version "11.5.1"
+ resolved "https://registry.anpm.alibaba-inc.com/lru-cache/-/lru-cache-11.5.1.tgz#f3daa3540847b9737ebc02499ddb36765e54db4a"
+ integrity sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==
+
+lru-cache@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.anpm.alibaba-inc.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
+ integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
+ dependencies:
+ yallist "^3.0.2"
+
+lru-cache@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
+ integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
+ dependencies:
+ yallist "^4.0.0"
+
+make-dir@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e"
+ integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==
+ dependencies:
+ semver "^7.5.3"
+
+make-error@^1.3.6:
+ version "1.3.6"
+ resolved "https://registry.anpm.alibaba-inc.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2"
+ integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==
+
+makeerror@1.0.12:
+ version "1.0.12"
+ resolved "https://registry.anpm.alibaba-inc.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a"
+ integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==
+ dependencies:
+ tmpl "1.0.5"
+
+markdown-it@^14.1.0:
+ version "14.2.0"
+ resolved "https://registry.anpm.alibaba-inc.com/markdown-it/-/markdown-it-14.2.0.tgz#06d48d9035e77d5b1c85adb315482fc8240289ef"
+ integrity sha512-1TGiQiJVRQ3NPmZH6sx5Cfnmg6GQm9jvC1ch4TK511NjSJvjzKLzn5pPfZRNZkRPZP0HqCioSndqH8v2nRaWVQ==
+ dependencies:
+ argparse "^2.0.1"
+ entities "^4.4.0"
+ linkify-it "^5.0.1"
+ mdurl "^2.0.0"
+ punycode.js "^2.3.1"
+ uc.micro "^2.1.0"
+
+math-intrinsics@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.anpm.alibaba-inc.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9"
+ integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==
+
+mdurl@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/mdurl/-/mdurl-2.0.0.tgz#80676ec0433025dd3e17ee983d0fe8de5a2237e0"
+ integrity sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==
+
+merge-stream@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
+ integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
+
+merge2@^1.3.0, merge2@^1.4.1:
+ version "1.4.1"
+ resolved "https://registry.anpm.alibaba-inc.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
+ integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
+
+micromatch@^4.0.0, micromatch@^4.0.4, micromatch@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.anpm.alibaba-inc.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202"
+ integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==
+ dependencies:
+ braces "^3.0.3"
+ picomatch "^2.3.1"
+
+mime-db@1.52.0:
+ version "1.52.0"
+ resolved "https://registry.anpm.alibaba-inc.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
+ integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
+
+mime-db@^1.54.0:
+ version "1.54.0"
+ resolved "https://registry.anpm.alibaba-inc.com/mime-db/-/mime-db-1.54.0.tgz#cddb3ee4f9c64530dff640236661d42cb6a314f5"
+ integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==
+
+mime-types@^2.1.12:
+ version "2.1.35"
+ resolved "https://registry.anpm.alibaba-inc.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
+ integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
+ dependencies:
+ mime-db "1.52.0"
+
+mime@^1.3.4:
+ version "1.6.0"
+ resolved "https://registry.anpm.alibaba-inc.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
+ integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
+
+mimic-fn@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.anpm.alibaba-inc.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
+ integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
+
+mimic-response@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.anpm.alibaba-inc.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9"
+ integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==
+
+minimatch@9.0.3:
+ version "9.0.3"
+ resolved "https://registry.anpm.alibaba-inc.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825"
+ integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==
+ dependencies:
+ brace-expansion "^2.0.1"
+
+minimatch@^10.2.2:
+ version "10.2.5"
+ resolved "https://registry.anpm.alibaba-inc.com/minimatch/-/minimatch-10.2.5.tgz#bd48687a0be38ed2961399105600f832095861d1"
+ integrity sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==
+ dependencies:
+ brace-expansion "^5.0.5"
+
+minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2:
+ version "3.1.5"
+ resolved "https://registry.anpm.alibaba-inc.com/minimatch/-/minimatch-3.1.5.tgz#580c88f8d5445f2bd6aa8f3cadefa0de79fbd69e"
+ integrity sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5:
+ version "1.2.8"
+ resolved "https://registry.anpm.alibaba-inc.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
+ integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
+
+minipass@^7.1.2, minipass@^7.1.3:
+ version "7.1.3"
+ resolved "https://registry.anpm.alibaba-inc.com/minipass/-/minipass-7.1.3.tgz#79389b4eb1bb2d003a9bba87d492f2bd37bdc65b"
+ integrity sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==
+
+mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3:
+ version "0.5.3"
+ resolved "https://registry.anpm.alibaba-inc.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113"
+ integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==
+
+ms@^2.1.1, ms@^2.1.3:
+ version "2.1.3"
+ resolved "https://registry.anpm.alibaba-inc.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
+mute-stream@~0.0.4:
+ version "0.0.8"
+ resolved "https://registry.anpm.alibaba-inc.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
+ integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
+
+nanoid@^3.3.12:
+ version "3.3.12"
+ resolved "https://registry.anpm.alibaba-inc.com/nanoid/-/nanoid-3.3.12.tgz#ab3d912e217a6d0a514f00a72a16543a28982c05"
+ integrity sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==
+
+napi-build-utils@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/napi-build-utils/-/napi-build-utils-2.0.0.tgz#13c22c0187fcfccce1461844136372a47ddc027e"
+ integrity sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==
+
+natural-compare@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.anpm.alibaba-inc.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
+ integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
+
+neo-async@^2.6.2:
+ version "2.6.2"
+ resolved "https://registry.anpm.alibaba-inc.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
+ integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
+
+node-abi@^3.3.0:
+ version "3.92.0"
+ resolved "https://registry.anpm.alibaba-inc.com/node-abi/-/node-abi-3.92.0.tgz#18e2214677499b8dda81ffcd095afc763d5a9802"
+ integrity sha512-KdHvFWZjEKDf0cakgFjebl371GPsISX2oZHcuyKqM7DtogIsHrqKeLTo8wBHxaXRAQlY2PsPlZmfo+9ZCxEREQ==
+ dependencies:
+ semver "^7.3.5"
+
+node-addon-api@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.anpm.alibaba-inc.com/node-addon-api/-/node-addon-api-4.3.0.tgz#52a1a0b475193e0928e98e0426a0d1254782b77f"
+ integrity sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==
+
+node-int64@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.anpm.alibaba-inc.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
+ integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==
+
+node-releases@^2.0.36:
+ version "2.0.47"
+ resolved "https://registry.anpm.alibaba-inc.com/node-releases/-/node-releases-2.0.47.tgz#521bb2786da8eb140b748841c0b3b3a75334ffc4"
+ integrity sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==
+
+node-sarif-builder@^3.2.0:
+ version "3.4.0"
+ resolved "https://registry.anpm.alibaba-inc.com/node-sarif-builder/-/node-sarif-builder-3.4.0.tgz#9c1ac026919f5977e1014f0e26d4f69f0f45becd"
+ integrity sha512-tGnJW6OKRii9u/b2WiUViTJS+h7Apxx17qsMUjsUeNDiMMX5ZFf8F8Fcz7PAQ6omvOxHZtvDTmOYKJQwmfpjeg==
+ dependencies:
+ "@types/sarif" "^2.1.7"
+ fs-extra "^11.1.1"
+
+normalize-package-data@^6.0.0:
+ version "6.0.2"
+ resolved "https://registry.anpm.alibaba-inc.com/normalize-package-data/-/normalize-package-data-6.0.2.tgz#a7bc22167fe24025412bcff0a9651eb768b03506"
+ integrity sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==
+ dependencies:
+ hosted-git-info "^7.0.0"
+ semver "^7.3.5"
+ validate-npm-package-license "^3.0.4"
+
+normalize-path@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
+ integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
+
+npm-run-path@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.anpm.alibaba-inc.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"
+ integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==
+ dependencies:
+ path-key "^3.0.0"
+
+nth-check@^2.0.1:
+ version "2.1.1"
+ resolved "https://registry.anpm.alibaba-inc.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d"
+ integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==
+ dependencies:
+ boolbase "^1.0.0"
+
+object-inspect@^1.13.3, object-inspect@^1.13.4:
+ version "1.13.4"
+ resolved "https://registry.anpm.alibaba-inc.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213"
+ integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==
+
+once@^1.3.0, once@^1.3.1, once@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.anpm.alibaba-inc.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
+ dependencies:
+ wrappy "1"
+
+onetime@^5.1.2:
+ version "5.1.2"
+ resolved "https://registry.anpm.alibaba-inc.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
+ integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
+ dependencies:
+ mimic-fn "^2.1.0"
+
+open@^10.1.0:
+ version "10.2.0"
+ resolved "https://registry.anpm.alibaba-inc.com/open/-/open-10.2.0.tgz#b9d855be007620e80b6fb05fac98141fe62db73c"
+ integrity sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==
+ dependencies:
+ default-browser "^5.2.1"
+ define-lazy-prop "^3.0.0"
+ is-inside-container "^1.0.0"
+ wsl-utils "^0.1.0"
+
+optionator@^0.9.3:
+ version "0.9.4"
+ resolved "https://registry.anpm.alibaba-inc.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734"
+ integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==
+ dependencies:
+ deep-is "^0.1.3"
+ 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-limit@^2.2.0:
+ version "2.3.0"
+ resolved "https://registry.anpm.alibaba-inc.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
+ integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
+ dependencies:
+ p-try "^2.0.0"
+
+p-limit@^3.0.2, p-limit@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.anpm.alibaba-inc.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b"
+ integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
+ dependencies:
+ yocto-queue "^0.1.0"
+
+p-locate@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.anpm.alibaba-inc.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07"
+ integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==
+ dependencies:
+ p-limit "^2.2.0"
+
+p-locate@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834"
+ integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==
+ dependencies:
+ p-limit "^3.0.2"
+
+p-map@^7.0.3:
+ version "7.0.4"
+ resolved "https://registry.anpm.alibaba-inc.com/p-map/-/p-map-7.0.4.tgz#b81814255f542e252d5729dca4d66e5ec14935b8"
+ integrity sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==
+
+p-try@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.anpm.alibaba-inc.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
+ integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
+
+parent-module@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.anpm.alibaba-inc.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
+ integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
+ dependencies:
+ callsites "^3.0.0"
+
+parse-json@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.anpm.alibaba-inc.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd"
+ integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==
+ dependencies:
+ "@babel/code-frame" "^7.0.0"
+ error-ex "^1.3.1"
+ json-parse-even-better-errors "^2.3.0"
+ lines-and-columns "^1.1.6"
+
+parse-json@^8.0.0:
+ version "8.3.0"
+ resolved "https://registry.anpm.alibaba-inc.com/parse-json/-/parse-json-8.3.0.tgz#88a195a2157025139a2317a4f2f9252b61304ed5"
+ integrity sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==
+ dependencies:
+ "@babel/code-frame" "^7.26.2"
+ index-to-position "^1.1.0"
+ type-fest "^4.39.1"
+
+parse-semver@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.anpm.alibaba-inc.com/parse-semver/-/parse-semver-1.1.1.tgz#9a4afd6df063dc4826f93fba4a99cf223f666cb8"
+ integrity sha512-Eg1OuNntBMH0ojvEKSrvDSnwLmvVuUOSdylH/pSCPNMIspLlweJyIWXCE+k/5hm3cj/EBUYwmWkjhBALNP4LXQ==
+ dependencies:
+ semver "^5.1.0"
+
+parse5-htmlparser2-tree-adapter@^7.1.0:
+ version "7.1.0"
+ resolved "https://registry.anpm.alibaba-inc.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz#b5a806548ed893a43e24ccb42fbb78069311e81b"
+ integrity sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==
+ dependencies:
+ domhandler "^5.0.3"
+ parse5 "^7.0.0"
+
+parse5-parser-stream@^7.1.2:
+ version "7.1.2"
+ resolved "https://registry.anpm.alibaba-inc.com/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz#d7c20eadc37968d272e2c02660fff92dd27e60e1"
+ integrity sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==
+ dependencies:
+ parse5 "^7.0.0"
+
+parse5@^7.0.0, parse5@^7.3.0:
+ version "7.3.0"
+ resolved "https://registry.anpm.alibaba-inc.com/parse5/-/parse5-7.3.0.tgz#d7e224fa72399c7a175099f45fc2ad024b05ec05"
+ integrity sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==
+ dependencies:
+ entities "^6.0.0"
+
+path-exists@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
+ integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+
+path-is-absolute@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.anpm.alibaba-inc.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+ integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==
+
+path-key@^3.0.0, path-key@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.anpm.alibaba-inc.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
+ integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
+
+path-parse@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.anpm.alibaba-inc.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
+ integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+
+path-scurry@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.anpm.alibaba-inc.com/path-scurry/-/path-scurry-2.0.2.tgz#6be0d0ee02a10d9e0de7a98bae65e182c9061f85"
+ integrity sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==
+ dependencies:
+ lru-cache "^11.0.0"
+ minipass "^7.1.2"
+
+path-type@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
+ integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
+
+path-type@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/path-type/-/path-type-6.0.0.tgz#2f1bb6791a91ce99194caede5d6c5920ed81eb51"
+ integrity sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==
+
+pend@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.anpm.alibaba-inc.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
+ integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==
+
+picocolors@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.anpm.alibaba-inc.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b"
+ integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
+
+picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1:
+ version "2.3.2"
+ resolved "https://registry.anpm.alibaba-inc.com/picomatch/-/picomatch-2.3.2.tgz#5a942915e26b372dc0f0e6753149a16e6b1c5601"
+ integrity sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==
+
+pirates@^4.0.4:
+ version "4.0.7"
+ resolved "https://registry.anpm.alibaba-inc.com/pirates/-/pirates-4.0.7.tgz#643b4a18c4257c8a65104b73f3049ce9a0a15e22"
+ integrity sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==
+
+pkg-dir@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.anpm.alibaba-inc.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
+ integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==
+ dependencies:
+ find-up "^4.0.0"
+
+pluralize@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/pluralize/-/pluralize-2.0.0.tgz#72b726aa6fac1edeee42256c7d8dc256b335677f"
+ integrity sha512-TqNZzQCD4S42De9IfnnBvILN7HAW7riLqsCyp8lgjXeysyPlX5HhqKAcJHHHb9XskE4/a+7VGC9zzx8Ls0jOAw==
+
+pluralize@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1"
+ integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==
+
+postcss-modules-extract-imports@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.anpm.alibaba-inc.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz#b4497cb85a9c0c4b5aabeb759bb25e8d89f15002"
+ integrity sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==
+
+postcss-modules-local-by-default@^4.0.5:
+ version "4.2.0"
+ resolved "https://registry.anpm.alibaba-inc.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz#d150f43837831dae25e4085596e84f6f5d6ec368"
+ integrity sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==
+ dependencies:
+ icss-utils "^5.0.0"
+ postcss-selector-parser "^7.0.0"
+ postcss-value-parser "^4.1.0"
+
+postcss-modules-scope@^3.2.0:
+ version "3.2.1"
+ resolved "https://registry.anpm.alibaba-inc.com/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz#1bbccddcb398f1d7a511e0a2d1d047718af4078c"
+ integrity sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==
+ dependencies:
+ postcss-selector-parser "^7.0.0"
+
+postcss-modules-values@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c"
+ integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==
+ dependencies:
+ icss-utils "^5.0.0"
+
+postcss-selector-parser@^7.0.0:
+ version "7.1.1"
+ resolved "https://registry.anpm.alibaba-inc.com/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz#e75d2e0d843f620e5df69076166f4e16f891cb9f"
+ integrity sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==
+ dependencies:
+ cssesc "^3.0.0"
+ util-deprecate "^1.0.2"
+
+postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.anpm.alibaba-inc.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514"
+ integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
+
+postcss@^8.4.33:
+ version "8.5.15"
+ resolved "https://registry.anpm.alibaba-inc.com/postcss/-/postcss-8.5.15.tgz#d1eaf677a324e9ec02196da2d3fecf4a0b9a735c"
+ integrity sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==
+ dependencies:
+ nanoid "^3.3.12"
+ picocolors "^1.1.1"
+ source-map-js "^1.2.1"
+
+preact@^10.19.0:
+ version "10.29.2"
+ resolved "https://registry.anpm.alibaba-inc.com/preact/-/preact-10.29.2.tgz#3e6069c471718b8d124d1cd67565114532e88d70"
+ integrity sha512-7tNmwg/7mzzAoB/8kSg6Hl37JraAZw3Z3A0JSY7VXlZwo82Xn0G7wKbNNs2qoF4ZEEsQGTwDAroNdqKs1ofJxQ==
+
+prebuild-install@^7.0.1:
+ version "7.1.3"
+ resolved "https://registry.anpm.alibaba-inc.com/prebuild-install/-/prebuild-install-7.1.3.tgz#d630abad2b147443f20a212917beae68b8092eec"
+ integrity sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==
+ dependencies:
+ detect-libc "^2.0.0"
+ expand-template "^2.0.3"
+ github-from-package "0.0.0"
+ minimist "^1.2.3"
+ mkdirp-classic "^0.5.3"
+ napi-build-utils "^2.0.0"
+ node-abi "^3.3.0"
+ pump "^3.0.0"
+ rc "^1.2.7"
+ simple-get "^4.0.0"
+ tar-fs "^2.0.0"
+ tunnel-agent "^0.6.0"
+
+prelude-ls@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.anpm.alibaba-inc.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
+ integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
+
+pretty-format@^29.0.0, pretty-format@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.anpm.alibaba-inc.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812"
+ integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==
+ dependencies:
+ "@jest/schemas" "^29.6.3"
+ ansi-styles "^5.0.0"
+ react-is "^18.0.0"
+
+prompts@^2.0.1:
+ version "2.4.2"
+ resolved "https://registry.anpm.alibaba-inc.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069"
+ integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==
+ dependencies:
+ kleur "^3.0.3"
+ sisteransi "^1.0.5"
+
+pump@^3.0.0:
+ version "3.0.4"
+ resolved "https://registry.anpm.alibaba-inc.com/pump/-/pump-3.0.4.tgz#1f313430527fa8b905622ebd22fe1444e757ab3c"
+ integrity sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==
+ dependencies:
+ end-of-stream "^1.1.0"
+ once "^1.3.1"
+
+punycode.js@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.anpm.alibaba-inc.com/punycode.js/-/punycode.js-2.3.1.tgz#6b53e56ad75588234e79f4affa90972c7dd8cdb7"
+ integrity sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==
+
+punycode@^2.1.0:
+ version "2.3.1"
+ resolved "https://registry.anpm.alibaba-inc.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5"
+ integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==
+
+pure-rand@^6.0.0:
+ version "6.1.0"
+ resolved "https://registry.anpm.alibaba-inc.com/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2"
+ integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==
+
+qs@^6.9.1:
+ version "6.15.2"
+ resolved "https://registry.anpm.alibaba-inc.com/qs/-/qs-6.15.2.tgz#fd55426d710403ddccc45e0f9eab16db7727ece9"
+ integrity sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==
+ dependencies:
+ side-channel "^1.1.0"
+
+queue-microtask@^1.2.2:
+ version "1.2.3"
+ resolved "https://registry.anpm.alibaba-inc.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
+ integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
+
+rc-config-loader@^4.1.3:
+ version "4.1.4"
+ resolved "https://registry.anpm.alibaba-inc.com/rc-config-loader/-/rc-config-loader-4.1.4.tgz#6cc79042ac193ebed9f082fcba7b823d9dc143cc"
+ integrity sha512-3GiwEzklkbXTDp52UR5nT8iXgYAx1V9ZG/kDZT7p60u2GCv2XTwQq4NzinMoMpNtXhmt3WkhYXcj6HH8HdwCEQ==
+ dependencies:
+ debug "^4.4.3"
+ js-yaml "^4.1.1"
+ json5 "^2.2.3"
+ require-from-string "^2.0.2"
+
+rc@^1.2.7:
+ version "1.2.8"
+ resolved "https://registry.anpm.alibaba-inc.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
+ integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
+ dependencies:
+ deep-extend "^0.6.0"
+ ini "~1.3.0"
+ minimist "^1.2.0"
+ strip-json-comments "~2.0.1"
+
+react-is@^18.0.0:
+ version "18.3.1"
+ resolved "https://registry.anpm.alibaba-inc.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e"
+ integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==
+
+read-pkg@^9.0.1:
+ version "9.0.1"
+ resolved "https://registry.anpm.alibaba-inc.com/read-pkg/-/read-pkg-9.0.1.tgz#b1b81fb15104f5dbb121b6bbdee9bbc9739f569b"
+ integrity sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==
+ dependencies:
+ "@types/normalize-package-data" "^2.4.3"
+ normalize-package-data "^6.0.0"
+ parse-json "^8.0.0"
+ type-fest "^4.6.0"
+ unicorn-magic "^0.1.0"
+
+read@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.anpm.alibaba-inc.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4"
+ integrity sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==
+ dependencies:
+ mute-stream "~0.0.4"
+
+readable-stream@^3.1.1, readable-stream@^3.4.0:
+ version "3.6.2"
+ resolved "https://registry.anpm.alibaba-inc.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967"
+ integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==
+ dependencies:
+ inherits "^2.0.3"
+ string_decoder "^1.1.1"
+ util-deprecate "^1.0.1"
+
+rechoir@^0.8.0:
+ version "0.8.0"
+ resolved "https://registry.anpm.alibaba-inc.com/rechoir/-/rechoir-0.8.0.tgz#49f866e0d32146142da3ad8f0eff352b3215ff22"
+ integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==
+ dependencies:
+ resolve "^1.20.0"
+
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.anpm.alibaba-inc.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+ integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==
+
+require-from-string@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.anpm.alibaba-inc.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
+ integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
+
+resolve-cwd@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d"
+ integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==
+ dependencies:
+ resolve-from "^5.0.0"
+
+resolve-from@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
+ integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
+
+resolve-from@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
+ integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
+
+resolve.exports@^2.0.0:
+ version "2.0.3"
+ resolved "https://registry.anpm.alibaba-inc.com/resolve.exports/-/resolve.exports-2.0.3.tgz#41955e6f1b4013b7586f873749a635dea07ebe3f"
+ integrity sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==
+
+resolve@^1.20.0:
+ version "1.22.12"
+ resolved "https://registry.anpm.alibaba-inc.com/resolve/-/resolve-1.22.12.tgz#f5b2a680897c69c238a13cd16b15671f8b73549f"
+ integrity sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==
+ dependencies:
+ es-errors "^1.3.0"
+ is-core-module "^2.16.1"
+ path-parse "^1.0.7"
+ supports-preserve-symlinks-flag "^1.0.0"
+
+reusify@^1.0.4:
+ version "1.1.0"
+ resolved "https://registry.anpm.alibaba-inc.com/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f"
+ integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==
+
+rimraf@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.anpm.alibaba-inc.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
+ integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
+ dependencies:
+ glob "^7.1.3"
+
+run-applescript@^7.0.0:
+ version "7.1.0"
+ resolved "https://registry.anpm.alibaba-inc.com/run-applescript/-/run-applescript-7.1.0.tgz#2e9e54c4664ec3106c5b5630e249d3d6595c4911"
+ integrity sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==
+
+run-parallel@^1.1.9:
+ version "1.2.0"
+ resolved "https://registry.anpm.alibaba-inc.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
+ integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==
+ dependencies:
+ queue-microtask "^1.2.2"
+
+safe-buffer@^5.0.1, safe-buffer@~5.2.0:
+ version "5.2.1"
+ resolved "https://registry.anpm.alibaba-inc.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
+ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+
+"safer-buffer@>= 2.1.2 < 3.0.0":
+ version "2.1.2"
+ resolved "https://registry.anpm.alibaba-inc.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+ integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
+sax@>=0.6.0:
+ version "1.6.0"
+ resolved "https://registry.anpm.alibaba-inc.com/sax/-/sax-1.6.0.tgz#da59637629307b97e7c4cb28e080a7bc38560d5b"
+ integrity sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==
+
+schema-utils@^4.3.0, schema-utils@^4.3.3:
+ version "4.3.3"
+ resolved "https://registry.anpm.alibaba-inc.com/schema-utils/-/schema-utils-4.3.3.tgz#5b1850912fa31df90716963d45d9121fdfc09f46"
+ integrity sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==
+ dependencies:
+ "@types/json-schema" "^7.0.9"
+ ajv "^8.9.0"
+ ajv-formats "^2.1.1"
+ ajv-keywords "^5.1.0"
+
+secretlint@^10.1.2:
+ version "10.2.2"
+ resolved "https://registry.anpm.alibaba-inc.com/secretlint/-/secretlint-10.2.2.tgz#c0cf997153a2bef0b653874dc87030daa6a35140"
+ integrity sha512-xVpkeHV/aoWe4vP4TansF622nBEImzCY73y/0042DuJ29iKIaqgoJ8fGxre3rVSHHbxar4FdJobmTnLp9AU0eg==
+ dependencies:
+ "@secretlint/config-creator" "^10.2.2"
+ "@secretlint/formatter" "^10.2.2"
+ "@secretlint/node" "^10.2.2"
+ "@secretlint/profiler" "^10.2.2"
+ debug "^4.4.1"
+ globby "^14.1.0"
+ read-pkg "^9.0.1"
+
+semver@^5.1.0:
+ version "5.7.2"
+ resolved "https://registry.anpm.alibaba-inc.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8"
+ integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==
+
+semver@^6.3.0, semver@^6.3.1:
+ version "6.3.1"
+ resolved "https://registry.anpm.alibaba-inc.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
+ integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
+
+semver@^7.3.4, semver@^7.5.3, semver@^7.5.4, semver@^7.8.0:
+ version "7.8.2"
+ resolved "https://registry.anpm.alibaba-inc.com/semver/-/semver-7.8.2.tgz#194bd65723a28cf82542d2bf176b91c26b343be1"
+ integrity sha512-c8jsqUZm3omBOI66G90z1Dyw5z622G8oLG+omfsHBJf3CWQTlOcwOjvOG6wtiNfW6anKm/eA39LMwMtMez2TiQ==
+
+semver@^7.3.5, semver@^7.5.2:
+ version "7.8.4"
+ resolved "https://registry.anpm.alibaba-inc.com/semver/-/semver-7.8.4.tgz#c73eceebae0616934be8dff28a7fd70757c8e696"
+ integrity sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==
+
+shallow-clone@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.anpm.alibaba-inc.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3"
+ integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==
+ dependencies:
+ kind-of "^6.0.2"
+
+shebang-command@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
+ integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
+ dependencies:
+ shebang-regex "^3.0.0"
+
+shebang-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
+ integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+
+side-channel-list@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.anpm.alibaba-inc.com/side-channel-list/-/side-channel-list-1.0.1.tgz#c2e0b5a14a540aebee3bbc6c3f8666cc9b509127"
+ integrity sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==
+ dependencies:
+ es-errors "^1.3.0"
+ object-inspect "^1.13.4"
+
+side-channel-map@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.anpm.alibaba-inc.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42"
+ integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==
+ dependencies:
+ call-bound "^1.0.2"
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.5"
+ object-inspect "^1.13.3"
+
+side-channel-weakmap@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.anpm.alibaba-inc.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea"
+ integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==
+ dependencies:
+ call-bound "^1.0.2"
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.5"
+ object-inspect "^1.13.3"
+ side-channel-map "^1.0.1"
+
+side-channel@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.anpm.alibaba-inc.com/side-channel/-/side-channel-1.1.1.tgz#ea02c62e05dc4bea67d4442f0fb71ee192f8e0ab"
+ integrity sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==
+ dependencies:
+ es-errors "^1.3.0"
+ object-inspect "^1.13.4"
+ side-channel-list "^1.0.1"
+ side-channel-map "^1.0.1"
+ side-channel-weakmap "^1.0.2"
+
+signal-exit@^3.0.3, signal-exit@^3.0.7:
+ version "3.0.7"
+ resolved "https://registry.anpm.alibaba-inc.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
+ integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
+
+simple-concat@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.anpm.alibaba-inc.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f"
+ integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==
+
+simple-get@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.anpm.alibaba-inc.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543"
+ integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==
+ dependencies:
+ decompress-response "^6.0.0"
+ once "^1.3.1"
+ simple-concat "^1.0.0"
+
+sisteransi@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.anpm.alibaba-inc.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed"
+ integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==
+
+slash@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
+ integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
+
+slash@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.anpm.alibaba-inc.com/slash/-/slash-5.1.0.tgz#be3adddcdf09ac38eebe8dcdc7b1a57a75b095ce"
+ integrity sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==
+
+slice-ansi@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b"
+ integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==
+ dependencies:
+ ansi-styles "^4.0.0"
+ astral-regex "^2.0.0"
+ is-fullwidth-code-point "^3.0.0"
+
+source-map-js@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.anpm.alibaba-inc.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46"
+ integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==
+
+source-map-support@0.5.13:
+ version "0.5.13"
+ resolved "https://registry.anpm.alibaba-inc.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932"
+ integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
+source-map-support@~0.5.20:
+ version "0.5.21"
+ resolved "https://registry.anpm.alibaba-inc.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f"
+ integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
+source-map@^0.6.0, source-map@^0.6.1:
+ version "0.6.1"
+ resolved "https://registry.anpm.alibaba-inc.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+source-map@^0.7.4:
+ version "0.7.6"
+ resolved "https://registry.anpm.alibaba-inc.com/source-map/-/source-map-0.7.6.tgz#a3658ab87e5b6429c8a1f3ba0083d4c61ca3ef02"
+ integrity sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==
+
+spdx-correct@^3.0.0:
+ version "3.2.0"
+ resolved "https://registry.anpm.alibaba-inc.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c"
+ integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==
+ dependencies:
+ spdx-expression-parse "^3.0.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-exceptions@^2.1.0:
+ version "2.5.0"
+ resolved "https://registry.anpm.alibaba-inc.com/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz#5d607d27fc806f66d7b64a766650fa890f04ed66"
+ integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==
+
+spdx-expression-parse@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.anpm.alibaba-inc.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679"
+ integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==
+ dependencies:
+ spdx-exceptions "^2.1.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-license-ids@^3.0.0:
+ version "3.0.23"
+ resolved "https://registry.anpm.alibaba-inc.com/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz#b069e687b1291a32f126893ed76a27a745ee2133"
+ integrity sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==
+
+sprintf-js@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.anpm.alibaba-inc.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+ integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==
+
+stack-utils@^2.0.3:
+ version "2.0.6"
+ resolved "https://registry.anpm.alibaba-inc.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f"
+ integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==
+ dependencies:
+ escape-string-regexp "^2.0.0"
+
+string-length@^4.0.1:
+ version "4.0.2"
+ resolved "https://registry.anpm.alibaba-inc.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a"
+ integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==
+ dependencies:
+ char-regex "^1.0.2"
+ strip-ansi "^6.0.0"
+
+string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
+ version "4.2.3"
+ resolved "https://registry.anpm.alibaba-inc.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
+ integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.1"
+
+string_decoder@^1.1.1:
+ version "1.3.0"
+ resolved "https://registry.anpm.alibaba-inc.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
+ integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
+ dependencies:
+ safe-buffer "~5.2.0"
+
+strip-ansi@^6.0.0, strip-ansi@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.anpm.alibaba-inc.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
+ integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+ dependencies:
+ ansi-regex "^5.0.1"
+
+strip-ansi@^7.1.0:
+ version "7.2.0"
+ resolved "https://registry.anpm.alibaba-inc.com/strip-ansi/-/strip-ansi-7.2.0.tgz#d22a269522836a627af8d04b5c3fd2c7fa3e32e3"
+ integrity sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==
+ dependencies:
+ ansi-regex "^6.2.2"
+
+strip-bom@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878"
+ integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==
+
+strip-final-newline@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
+ integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
+
+strip-json-comments@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.anpm.alibaba-inc.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
+ integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
+
+strip-json-comments@~2.0.1:
+ version "2.0.1"
+ resolved "https://registry.anpm.alibaba-inc.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+ integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==
+
+structured-source@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/structured-source/-/structured-source-4.0.0.tgz#0c9e59ee43dedd8fc60a63731f60e358102a4948"
+ integrity sha512-qGzRFNJDjFieQkl/sVOI2dUjHKRyL9dAJi2gCPGJLbJHBIkyOHxjuocpIEfbLioX+qSJpvbYdT49/YCdMznKxA==
+ dependencies:
+ boundary "^2.0.0"
+
+style-loader@^3.3.0:
+ version "3.3.4"
+ resolved "https://registry.anpm.alibaba-inc.com/style-loader/-/style-loader-3.3.4.tgz#f30f786c36db03a45cbd55b6a70d930c479090e7"
+ integrity sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==
+
+supports-color@^7.0.0, supports-color@^7.1.0:
+ version "7.2.0"
+ resolved "https://registry.anpm.alibaba-inc.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
+ integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
+ dependencies:
+ has-flag "^4.0.0"
+
+supports-color@^8.0.0:
+ version "8.1.1"
+ resolved "https://registry.anpm.alibaba-inc.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c"
+ integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
+ dependencies:
+ has-flag "^4.0.0"
+
+supports-hyperlinks@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.anpm.alibaba-inc.com/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz#b8e485b179681dea496a1e7abdf8985bd3145461"
+ integrity sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==
+ dependencies:
+ has-flag "^4.0.0"
+ supports-color "^7.0.0"
+
+supports-preserve-symlinks-flag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
+ integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
+
+table@^6.9.0:
+ version "6.9.0"
+ resolved "https://registry.anpm.alibaba-inc.com/table/-/table-6.9.0.tgz#50040afa6264141c7566b3b81d4d82c47a8668f5"
+ integrity sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==
+ dependencies:
+ ajv "^8.0.1"
+ lodash.truncate "^4.4.2"
+ slice-ansi "^4.0.0"
+ string-width "^4.2.3"
+ strip-ansi "^6.0.1"
+
+tapable@^2.3.0, tapable@^2.3.3:
+ version "2.3.3"
+ resolved "https://registry.anpm.alibaba-inc.com/tapable/-/tapable-2.3.3.tgz#5da7c9992c46038221267985ab28421a8879f160"
+ integrity sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==
+
+tar-fs@^2.0.0:
+ version "2.1.4"
+ resolved "https://registry.anpm.alibaba-inc.com/tar-fs/-/tar-fs-2.1.4.tgz#800824dbf4ef06ded9afea4acafe71c67c76b930"
+ integrity sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==
+ dependencies:
+ chownr "^1.1.1"
+ mkdirp-classic "^0.5.2"
+ pump "^3.0.0"
+ tar-stream "^2.1.4"
+
+tar-stream@^2.1.4:
+ version "2.2.0"
+ resolved "https://registry.anpm.alibaba-inc.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287"
+ integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==
+ dependencies:
+ bl "^4.0.3"
+ end-of-stream "^1.4.1"
+ fs-constants "^1.0.0"
+ inherits "^2.0.3"
+ readable-stream "^3.1.1"
+
+terminal-link@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/terminal-link/-/terminal-link-4.0.0.tgz#5f3e50329420fad97d07d624f7df1851d82963f1"
+ integrity sha512-lk+vH+MccxNqgVqSnkMVKx4VLJfnLjDBGzH16JVZjKE2DoxP57s6/vt6JmXV5I3jBcfGrxNrYtC+mPtU7WJztA==
+ dependencies:
+ ansi-escapes "^7.0.0"
+ supports-hyperlinks "^3.2.0"
+
+terser-webpack-plugin@^5.5.0:
+ version "5.6.1"
+ resolved "https://registry.anpm.alibaba-inc.com/terser-webpack-plugin/-/terser-webpack-plugin-5.6.1.tgz#47bc41bd8b8fab8383b62ec763b7394829097e7b"
+ integrity sha512-201R5j+sJpK8nFWwKVyNfZot8FaJbLZDq5evriVzbV1wDtSXDjRUDRfJzHpAaxFDMEhsZL1QkeqM61wgsS3KaQ==
+ dependencies:
+ "@jridgewell/trace-mapping" "^0.3.25"
+ jest-worker "^27.4.5"
+ schema-utils "^4.3.0"
+ terser "^5.31.1"
+
+terser@^5.31.1:
+ version "5.48.0"
+ resolved "https://registry.anpm.alibaba-inc.com/terser/-/terser-5.48.0.tgz#8b391171cfbb7ac4a88f9f04ba1cfabc54f643db"
+ integrity sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q==
+ dependencies:
+ "@jridgewell/source-map" "^0.3.3"
+ acorn "^8.15.0"
+ commander "^2.20.0"
+ source-map-support "~0.5.20"
+
+test-exclude@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e"
+ integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==
+ dependencies:
+ "@istanbuljs/schema" "^0.1.2"
+ glob "^7.1.4"
+ minimatch "^3.0.4"
+
+text-table@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.anpm.alibaba-inc.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
+ integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==
+
+textextensions@^6.11.0:
+ version "6.11.0"
+ resolved "https://registry.anpm.alibaba-inc.com/textextensions/-/textextensions-6.11.0.tgz#864535d09f49026150c96f0b0d79f1fa0869db15"
+ integrity sha512-tXJwSr9355kFJI3lbCkPpUH5cP8/M0GGy2xLO34aZCjMXBaK3SoPnZwr/oWmo1FdCnELcs4npdCIOFtq9W3ruQ==
+ dependencies:
+ editions "^6.21.0"
+
+tmp@^0.2.3:
+ version "0.2.7"
+ resolved "https://registry.anpm.alibaba-inc.com/tmp/-/tmp-0.2.7.tgz#26f4db11d1601ce8012dcb8a798ece1c06a99059"
+ integrity sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==
+
+tmpl@1.0.5:
+ version "1.0.5"
+ resolved "https://registry.anpm.alibaba-inc.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc"
+ integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==
+
+to-regex-range@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.anpm.alibaba-inc.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
+ integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
+ dependencies:
+ is-number "^7.0.0"
+
+ts-api-utils@^1.0.1:
+ version "1.4.3"
+ resolved "https://registry.anpm.alibaba-inc.com/ts-api-utils/-/ts-api-utils-1.4.3.tgz#bfc2215fe6528fecab2b0fba570a2e8a4263b064"
+ integrity sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==
+
+ts-jest@^29.1.0:
+ version "29.4.11"
+ resolved "https://registry.anpm.alibaba-inc.com/ts-jest/-/ts-jest-29.4.11.tgz#42f5de21c37ccc01a580253afae6955abbf4d0b3"
+ integrity sha512-IrFl7l9AuB/qrNw5quqvAv/hmKMb8dhWOH4jQOGo0Oq8tCeo1O86/iTFG1FaRimgUkF13l4PcepO8ATFT6Ns4g==
+ dependencies:
+ bs-logger "^0.2.6"
+ fast-json-stable-stringify "^2.1.0"
+ handlebars "^4.7.9"
+ json5 "^2.2.3"
+ lodash.memoize "^4.1.2"
+ make-error "^1.3.6"
+ semver "^7.8.0"
+ type-fest "^4.41.0"
+ yargs-parser "^21.1.1"
+
+ts-loader@^9.5.0:
+ version "9.6.0"
+ resolved "https://registry.anpm.alibaba-inc.com/ts-loader/-/ts-loader-9.6.0.tgz#50dfdea9c63ff9c5f4e89b04c1e3ce0d5d2946a1"
+ integrity sha512-dsJO0S+T7grTDWTc4a0nTygXGjKncVUpx8Y+af8EvI/D5WgTJby5UEk5eoMCB9EcLQmnvitqh99MqtjtHgAwFQ==
+ dependencies:
+ chalk "^4.1.0"
+ enhanced-resolve "^5.0.0"
+ micromatch "^4.0.0"
+ semver "^7.3.4"
+ source-map "^0.7.4"
+
+tslib@^2.2.0, tslib@^2.6.2:
+ version "2.8.1"
+ resolved "https://registry.anpm.alibaba-inc.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f"
+ integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==
+
+tunnel-agent@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.anpm.alibaba-inc.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
+ integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==
+ dependencies:
+ safe-buffer "^5.0.1"
+
+tunnel@0.0.6:
+ version "0.0.6"
+ resolved "https://registry.anpm.alibaba-inc.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c"
+ integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==
+
+type-check@^0.4.0, type-check@~0.4.0:
+ version "0.4.0"
+ resolved "https://registry.anpm.alibaba-inc.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"
+ integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==
+ dependencies:
+ prelude-ls "^1.2.1"
+
+type-detect@4.0.8:
+ version "4.0.8"
+ resolved "https://registry.anpm.alibaba-inc.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c"
+ integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==
+
+type-fest@^0.20.2:
+ version "0.20.2"
+ resolved "https://registry.anpm.alibaba-inc.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4"
+ integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==
+
+type-fest@^0.21.3:
+ version "0.21.3"
+ resolved "https://registry.anpm.alibaba-inc.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37"
+ integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==
+
+type-fest@^4.39.1, type-fest@^4.41.0, type-fest@^4.6.0:
+ version "4.41.0"
+ resolved "https://registry.anpm.alibaba-inc.com/type-fest/-/type-fest-4.41.0.tgz#6ae1c8e5731273c2bf1f58ad39cbae2c91a46c58"
+ integrity sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==
+
+typed-rest-client@^1.8.4:
+ version "1.8.11"
+ resolved "https://registry.anpm.alibaba-inc.com/typed-rest-client/-/typed-rest-client-1.8.11.tgz#6906f02e3c91e8d851579f255abf0fd60800a04d"
+ integrity sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==
+ dependencies:
+ qs "^6.9.1"
+ tunnel "0.0.6"
+ underscore "^1.12.1"
+
+typescript@^5.3.0:
+ version "5.9.3"
+ resolved "https://registry.anpm.alibaba-inc.com/typescript/-/typescript-5.9.3.tgz#5b4f59e15310ab17a216f5d6cf53ee476ede670f"
+ integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==
+
+uc.micro@^2.0.0, uc.micro@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.anpm.alibaba-inc.com/uc.micro/-/uc.micro-2.1.0.tgz#f8d3f7d0ec4c3dea35a7e3c8efa4cb8b45c9e7ee"
+ integrity sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==
+
+uglify-js@^3.1.4:
+ version "3.19.3"
+ resolved "https://registry.anpm.alibaba-inc.com/uglify-js/-/uglify-js-3.19.3.tgz#82315e9bbc6f2b25888858acd1fff8441035b77f"
+ integrity sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==
+
+underscore@^1.12.1:
+ version "1.13.8"
+ resolved "https://registry.anpm.alibaba-inc.com/underscore/-/underscore-1.13.8.tgz#a93a21186c049dbf0e847496dba72b7bd8c1e92b"
+ integrity sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ==
+
+"undici-types@>=7.24.0 <7.24.7":
+ version "7.24.6"
+ resolved "https://registry.anpm.alibaba-inc.com/undici-types/-/undici-types-7.24.6.tgz#61275b485d7fd4e9d269c7cf04ec2873c9cc0f91"
+ integrity sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==
+
+undici-types@~5.26.4:
+ version "5.26.5"
+ resolved "https://registry.anpm.alibaba-inc.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
+ integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==
+
+undici@^7.19.0:
+ version "7.27.2"
+ resolved "https://registry.anpm.alibaba-inc.com/undici/-/undici-7.27.2.tgz#f8fae968ee68377cfc61713d9cd152773716804f"
+ integrity sha512-uZsKNuzQxDMUY6M3pIMvy5tvlGmtq8XJ2oLAkfRKGNu+1VQAIvLy2xIVG5ATZl5wDXl/tddByAWCizRbOme+TA==
+
+unicorn-magic@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.anpm.alibaba-inc.com/unicorn-magic/-/unicorn-magic-0.1.0.tgz#1bb9a51c823aaf9d73a8bfcd3d1a23dde94b0ce4"
+ integrity sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==
+
+unicorn-magic@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.anpm.alibaba-inc.com/unicorn-magic/-/unicorn-magic-0.3.0.tgz#4efd45c85a69e0dd576d25532fbfa22aa5c8a104"
+ integrity sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==
+
+universalify@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.anpm.alibaba-inc.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d"
+ integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==
+
+update-browserslist-db@^1.2.3:
+ version "1.2.3"
+ resolved "https://registry.anpm.alibaba-inc.com/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz#64d76db58713136acbeb4c49114366cc6cc2e80d"
+ integrity sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==
+ dependencies:
+ escalade "^3.2.0"
+ picocolors "^1.1.1"
+
+uri-js@^4.2.2:
+ version "4.4.1"
+ resolved "https://registry.anpm.alibaba-inc.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
+ integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
+ dependencies:
+ punycode "^2.1.0"
+
+url-join@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.anpm.alibaba-inc.com/url-join/-/url-join-4.0.1.tgz#b642e21a2646808ffa178c4c5fda39844e12cde7"
+ integrity sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==
+
+util-deprecate@^1.0.1, util-deprecate@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.anpm.alibaba-inc.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+ integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
+
+v8-to-istanbul@^9.0.1:
+ version "9.3.0"
+ resolved "https://registry.anpm.alibaba-inc.com/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz#b9572abfa62bd556c16d75fdebc1a411d5ff3175"
+ integrity sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==
+ dependencies:
+ "@jridgewell/trace-mapping" "^0.3.12"
+ "@types/istanbul-lib-coverage" "^2.0.1"
+ convert-source-map "^2.0.0"
+
+validate-npm-package-license@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.anpm.alibaba-inc.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
+ integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==
+ dependencies:
+ spdx-correct "^3.0.0"
+ spdx-expression-parse "^3.0.0"
+
+version-range@^4.15.0:
+ version "4.15.0"
+ resolved "https://registry.anpm.alibaba-inc.com/version-range/-/version-range-4.15.0.tgz#89df1e921b14d37515aab5e42ed4ac0515cab2c1"
+ integrity sha512-Ck0EJbAGxHwprkzFO966t4/5QkRuzh+/I1RxhLgUKKwEn+Cd8NwM60mE3AqBZg5gYODoXW0EFsQvbZjRlvdqbg==
+
+walker@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.anpm.alibaba-inc.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f"
+ integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==
+ dependencies:
+ makeerror "1.0.12"
+
+watchpack@^2.5.1:
+ version "2.5.1"
+ resolved "https://registry.anpm.alibaba-inc.com/watchpack/-/watchpack-2.5.1.tgz#dd38b601f669e0cbf567cb802e75cead82cde102"
+ integrity sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==
+ dependencies:
+ glob-to-regexp "^0.4.1"
+ graceful-fs "^4.1.2"
+
+webpack-cli@^5.1.0:
+ version "5.1.4"
+ resolved "https://registry.anpm.alibaba-inc.com/webpack-cli/-/webpack-cli-5.1.4.tgz#c8e046ba7eaae4911d7e71e2b25b776fcc35759b"
+ integrity sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==
+ dependencies:
+ "@discoveryjs/json-ext" "^0.5.0"
+ "@webpack-cli/configtest" "^2.1.1"
+ "@webpack-cli/info" "^2.0.2"
+ "@webpack-cli/serve" "^2.0.5"
+ colorette "^2.0.14"
+ commander "^10.0.1"
+ cross-spawn "^7.0.3"
+ envinfo "^7.7.3"
+ fastest-levenshtein "^1.0.12"
+ import-local "^3.0.2"
+ interpret "^3.1.1"
+ rechoir "^0.8.0"
+ webpack-merge "^5.7.3"
+
+webpack-merge@^5.7.3:
+ version "5.10.0"
+ resolved "https://registry.anpm.alibaba-inc.com/webpack-merge/-/webpack-merge-5.10.0.tgz#a3ad5d773241e9c682803abf628d4cd62b8a4177"
+ integrity sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==
+ dependencies:
+ clone-deep "^4.0.1"
+ flat "^5.0.2"
+ wildcard "^2.0.0"
+
+webpack-sources@^3.5.0:
+ version "3.5.0"
+ resolved "https://registry.anpm.alibaba-inc.com/webpack-sources/-/webpack-sources-3.5.0.tgz#87bf7f5801a4e985b1f1c92b64b9620a02f76d08"
+ integrity sha512-HPuy+uuoTCaaoEoI1LQ3JN9+vrPBvEesnnX1jADHy728cHSMlq4wUc4afYqahq2B1mhQVZxCXOkNTnXltr+2vQ==
+
+webpack@^5.89.0:
+ version "5.107.2"
+ resolved "https://registry.anpm.alibaba-inc.com/webpack/-/webpack-5.107.2.tgz#dea14dcb177b46b29de15f952f7303691ee2b596"
+ integrity sha512-v7RhXaJbpMlV0D7hC7lb2EbnxkoeUqf9qhKr6lozx3Q48pmFrqqNRmZFUEGmi7pSwm6fCQ2H1IjvCkHqdpVdjQ==
+ dependencies:
+ "@types/estree" "^1.0.8"
+ "@types/json-schema" "^7.0.15"
+ "@webassemblyjs/ast" "^1.14.1"
+ "@webassemblyjs/wasm-edit" "^1.14.1"
+ "@webassemblyjs/wasm-parser" "^1.14.1"
+ acorn "^8.16.0"
+ acorn-import-phases "^1.0.3"
+ browserslist "^4.28.1"
+ chrome-trace-event "^1.0.2"
+ enhanced-resolve "^5.22.0"
+ es-module-lexer "^2.1.0"
+ eslint-scope "5.1.1"
+ events "^3.2.0"
+ glob-to-regexp "^0.4.1"
+ graceful-fs "^4.2.11"
+ loader-runner "^4.3.2"
+ mime-db "^1.54.0"
+ neo-async "^2.6.2"
+ schema-utils "^4.3.3"
+ tapable "^2.3.0"
+ terser-webpack-plugin "^5.5.0"
+ watchpack "^2.5.1"
+ webpack-sources "^3.5.0"
+
+whatwg-encoding@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.anpm.alibaba-inc.com/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz#d0f4ef769905d426e1688f3e34381a99b60b76e5"
+ integrity sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==
+ dependencies:
+ iconv-lite "0.6.3"
+
+whatwg-mimetype@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz#bc1bf94a985dc50388d54a9258ac405c3ca2fc0a"
+ integrity sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==
+
+which@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.anpm.alibaba-inc.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
+ integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+ dependencies:
+ isexe "^2.0.0"
+
+wildcard@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.anpm.alibaba-inc.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67"
+ integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==
+
+word-wrap@^1.2.5:
+ version "1.2.5"
+ resolved "https://registry.anpm.alibaba-inc.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34"
+ integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==
+
+wordwrap@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
+ integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==
+
+wrap-ansi@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
+ integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.anpm.alibaba-inc.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+ integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
+
+write-file-atomic@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.anpm.alibaba-inc.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd"
+ integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==
+ dependencies:
+ imurmurhash "^0.1.4"
+ signal-exit "^3.0.7"
+
+wsl-utils@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.anpm.alibaba-inc.com/wsl-utils/-/wsl-utils-0.1.0.tgz#8783d4df671d4d50365be2ee4c71917a0557baab"
+ integrity sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==
+ dependencies:
+ is-wsl "^3.1.0"
+
+xml2js@^0.5.0:
+ version "0.5.0"
+ resolved "https://registry.anpm.alibaba-inc.com/xml2js/-/xml2js-0.5.0.tgz#d9440631fbb2ed800203fad106f2724f62c493b7"
+ integrity sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==
+ dependencies:
+ sax ">=0.6.0"
+ xmlbuilder "~11.0.0"
+
+xmlbuilder@~11.0.0:
+ version "11.0.1"
+ resolved "https://registry.anpm.alibaba-inc.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3"
+ integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==
+
+y18n@^5.0.5:
+ version "5.0.8"
+ resolved "https://registry.anpm.alibaba-inc.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
+ integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==
+
+yallist@^3.0.2:
+ version "3.1.1"
+ resolved "https://registry.anpm.alibaba-inc.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
+ integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
+
+yallist@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.anpm.alibaba-inc.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
+ integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
+
+yargs-parser@^21.1.1:
+ version "21.1.1"
+ resolved "https://registry.anpm.alibaba-inc.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35"
+ integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==
+
+yargs@^17.3.1:
+ version "17.7.2"
+ resolved "https://registry.anpm.alibaba-inc.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269"
+ integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==
+ dependencies:
+ cliui "^8.0.1"
+ escalade "^3.1.1"
+ get-caller-file "^2.0.5"
+ require-directory "^2.1.1"
+ string-width "^4.2.3"
+ y18n "^5.0.5"
+ yargs-parser "^21.1.1"
+
+yauzl@^3.2.1:
+ version "3.4.0"
+ resolved "https://registry.anpm.alibaba-inc.com/yauzl/-/yauzl-3.4.0.tgz#88b2a21455f37ca7dccf2eeb33bacb4392322719"
+ integrity sha512-jIH9yLR9wqr0wOS0TpBvo/g/2UgZH5qePVbjgRliiF0BYvOZyaBknKsF+x9Iht0O6sqgnB93rCICdOZFecJuDw==
+ dependencies:
+ pend "~1.2.0"
+
+yazl@^2.2.2:
+ version "2.5.1"
+ resolved "https://registry.anpm.alibaba-inc.com/yazl/-/yazl-2.5.1.tgz#a3d65d3dd659a5b0937850e8609f22fffa2b5c35"
+ integrity sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==
+ dependencies:
+ buffer-crc32 "~0.2.3"
+
+yocto-queue@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.anpm.alibaba-inc.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
+ integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
diff --git a/package.json b/package.json
index 2809c16..cd7c498 100644
--- a/package.json
+++ b/package.json
@@ -24,4 +24,4 @@
"node": ">=14"
},
"license": "Apache-2.0"
-}
+}
\ No newline at end of file