From eff7b6163849803d19f6e8035477360c9e7e4766 Mon Sep 17 00:00:00 2001 From: h7ml Date: Sat, 14 Dec 2024 14:20:10 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat(readme):=20=E6=9B=B4=E6=96=B0=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E5=B9=B6=E6=B7=BB=E5=8A=A0=E6=96=B0=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修订 README-zh.md 和 README.md,优化语言表述和格式 - 增加新的命令行选项说明,包括 --extension 和 --rename - 添加多个示例用法,展示不同场景下的翻译操作 - 更新环境变量和示例部分,使其更加清晰易懂 --- README-zh.md | 143 ++++++---- README.md | 41 ++- package.json | 2 + pnpm-lock.yaml | 734 ++++++++++--------------------------------------- src/index.ts | 175 +++++++++--- 5 files changed, 395 insertions(+), 700 deletions(-) diff --git a/README-zh.md b/README-zh.md index 540ca7a..becf4ba 100644 --- a/README-zh.md +++ b/README-zh.md @@ -1,42 +1,42 @@ -以下是经过修订和整合的 `ai-markdown-translator` 文档,其中结合了 `npx` 和 `./ai-markdown-translator` 的示例: +这是合并后的`ai-markdown-translator`文档的修订版本,包括了`npx`和`./ai-markdown-translator`的示例: --- # ai-markdown-translator
- NPM版本 - CI - Release - NPM下载 + NPM版 + 持续集成 + 发布 + NPM下载量 NPM许可证 GitHub Stars GitHub问题 - GitHub分支 + GitHub Forks GitHub贡献者
[English](README.md) | [中文](README-zh.md) -`ai-markdown-translator` 是一个命令行工具,能利用 OpenAI 的语言模型将 Markdown 文件从一种语言翻译成另一种语言。它在翻译内容的同时保持了 Markdown 语法的完整性。 +`ai-markdown-translator` 是一个命令行工具,使用 OpenAI 的语言模型将 Markdown 文件从一种语言翻译为另一种语言。它在翻译内容时保留 Markdown 语法。 ## 特性 -- 使用 OpenAI 的模型将 Markdown 文件翻译成任何受支持的语言。 -- 在翻译过程中保持 Markdown 语法。 -- 通过命令行参数或环境变量灵活配置。 +- 将 Markdown 文件翻译成 OpenAI 模型支持的任何语言。 +- 在翻译过程中保留 Markdown 语法。 +- 通过命令行参数或环境变量进行灵活配置。 ## 先决条件 - Node.js(v14 或更高版本) -- npm(通常与 Node.js 一起提供) +- npm(通常随 Node.js 一起安装) - OpenAI API 密钥 ## 安装 1. 克隆此仓库或下载源代码。 2. 在终端中导航到项目目录。 -3. 安装依赖: +3. 安装依赖项: ```bash npm install @@ -50,93 +50,116 @@ npm run build ## 脚本 -- `build`:将 TypeScript 文件编译成 JavaScript。 -- `start`:使用 Node.js 运行编译的 JavaScript。 -- `lint`:运行 ESLint 以检查 TypeScript 文件中的代码质量问题。 -- `lint:fix`:自动修复 TypeScript 文件中的 linting 问题。 -- `format`:使用 Prettier 格式化`src`目录中多种文件类型的代码。 -- `format:check`:检查代码格式,但不进行修改`src`目录中多种文件类型的代码。 -- `postbuild`:使编译的`index.js`文件可执行。 -- `changelog`:基于常规提交生成更新日志。 -- `version`:在版本控制时更新更新日志并将其暂存为提交。 -- `test`:构建项目并运行测试。 +- `build`: 将 TypeScript 文件编译为 JavaScript。 +- `start`: 使用 Node.js 运行编译后的 JavaScript。 +- `lint`: 运行 ESLint 检查 TypeScript 文件中的代码质量问题。 +- `lint:fix`: 自动修复 TypeScript 文件中的 lint 问题。 +- `format`: 使用 Prettier 为 `src` 目录中的各种文件类型格式化代码。 +- `format:check`: 不做任何更改地检查 `src` 目录中各种文件类型的代码格式。 +- `postbuild`: 使编译后的 `index.js` 文件可执行。 +- `changelog`: 根据常规提交生成变更日志。 +- `version`: 在版本更新时更新变更日志并将其暂存以供提交。 +- `test`: 构建项目并运行测试。 -## 使用方法 +## 用法 -你可以使用 Node.js、`npx`或者作为独立的可执行文件运行 CLI 工具(如果你打包过它)。 +您可以使用 Node.js、`npx` 或作为独立可执行文件(如果您已将其打包)来运行 CLI 工具。 ### 使用 Node.js ```bash -node dist/index.js --input <输入文件> --output <输出文件> --language <目标语言> [选项] +node dist/index.js --input --output --language [options] ``` ### 使用 npx ```bash -npx ai-markdown-translator -i <输入文件> -o <输出文件> -l <目标语言> [选项] +npx ai-markdown-translator -i -o -l [options] ``` 例如: ```bash -npx ai-markdown-translator -u https://gitee.com/h7ml/ai-markdown-translator/raw/main/README.md -o output.md -l "Italian" +npx ai-markdown-translator -u https://gitee.com/h7ml/ai-markdown-translator/raw/main/README.md -o output.md -l "意大利语" ``` -### 使用独立的可执行文件 +### 使用独立可执行文件 ```bash -./ai-markdown-translator --input <输入文件> --output <输出文件> --language <目标语言> [选项] +./ai-markdown-translator --input --output --language [options] ``` ## 选项 -- `--input`, `-i`:输入 Markdown 文件(`--url`的替代选项)。 -- `--url`, `-u`:要翻译的 Markdown 文件的 URL(`--input`的替代选项)。 -- `--output`, `-o`:输出 Markdown 文件(如果未提供,则默认为输入文件名)。 -- `--language`, `-l`:翻译的目标语言(必需)。 -- `--openai-url`:OpenAI API URL (默认:使用 `OPENAI_URL` 环境变量)。 -- `--api-key`:OpenAI API 密钥 (默认:使用 `API_KEY` 环境变量)。 -- `--model`:要使用的 OpenAI 模型 (默认:使用 `MODEL` 环境变量或 `gpt-3.5-turbo`)。 -- `--help`, `-h`:显示帮助。 -- `--show-version`, `-v`:显示版本。 +- `--input`, `-i`: 输入 Markdown 文件或目录(与 `--url` 替代)。此选项允许您指定要翻译的 Markdown 文件或目录的路径。 +- `--url`, `-u`: 要翻译的 Markdown 文件的 URL(与 `--input` 替代)。使用此选项提供希望翻译的 Markdown 文件的直接链接。 -> 注意:`--input` 和 `--url` 是互斥的;你必须提供其中之一。 +- `--extension`, `-e`: 指定要翻译的文件扩展名(例如,`md`)。如果未提供,将处理所有文件。此选项允许您根据文件扩展名筛选要翻译的文件。 + +- `--rename`: 是否修改文件名。如果为真,输出文件将命名为 `-translated.`。此选项允许您指定是否希望在翻译后的文件名后附加后缀。 + +- `--output`, `-o`: 输出 Markdown 文件(如果未提供,则默认为输入文件名)。此选项允许您指定保存翻译内容的输出文件名。 + +- `--language`, `-l`: 目标语言(必需)。此选项指定希望将 Markdown 内容翻译成的语言。 + +- `--openai-url`: OpenAI API URL(默认值:使用 `OPENAI_URL` 环境变量)。此选项允许您在需要时指定 OpenAI API 的自定义 URL。 + +- `--api-key`: OpenAI API 密钥(默认值:使用 `API_KEY` 环境变量)。此选项用于提供您的 OpenAI API 密钥以进行身份验证。 + +- `--model`: 要使用的 OpenAI 模型(默认值:使用 `MODEL` 环境变量或 `gpt-3.5-turbo`)。此选项允许您指定要用于翻译的 OpenAI 模型。 + +- `--help`, `-h`: 显示帮助。此选项显示命令行工具的帮助信息。 + +- `--show-version`, `-v`: 显示版本。此选项显示该工具的当前版本。 + +> 注意:`--input` 和 `--url` 是互斥的;您必须提供其中之一。 ## 环境变量 -你可以设置以下环境变量,而不是将它们作为命令行参数传递: +您可以设置以下环境变量,而不是作为命令行参数传递它们: -- `OPENAI_URL`:OpenAI API 的 URL。 -- `API_KEY`:你的 OpenAI API 密钥。 -- `MODEL`:要使用的 OpenAI 模型(例如,`'gpt-3.5-turbo'`)。 +- `OPENAI_URL`: OpenAI API 的 URL。 +- `API_KEY`: 您的 OpenAI API 密钥。 +- `MODEL`: 要使用的 OpenAI 模型(例如,`'gpt-3.5-turbo'`)。 -你可以在项目根目录中的`.env`文件中设置这些变量,或者在你的 shell 中导出它们。 +您可以在项目根目录中的 `.env` 文件中设置这些变量或在您的 shell 中导出它们。 ## 示例 1. **将 Markdown 文件从英语翻译成西班牙语:** ```bash -npx ai-markdown-translator -i english.md -o spanish.md -l "Spanish" +npx ai-markdown-translator -i english.md -o spanish.md -l "西班牙语" ``` 2. **使用特定的 OpenAI 模型进行翻译:** ```bash -npx ai-markdown-translator -i input.md -o output.md -l "French" --model "gpt-4" +npx ai-markdown-translator -i input.md -o output.md -l "法语" --model "gpt-4" +``` + +3. **使用自定义 OpenAI URL 和 API 密钥进行翻译:** + +```bash +npx ai-markdown-translator -i input.md -o output.md -l "德语" --openai-url "https://api.302.ai/v1/chat/completions" --api-key "sk-302-api-key" +``` + +4. **翻译 URL 的 Markdown 内容:** + +```bash +npx ai-markdown-translator -u https://gitee.com/h7ml/ai-markdown-translator/raw/main/README.md -o output.md -l "意大利语" ``` -3. **使用自定义的 OpenAI URL 和 API 密钥进行翻译:** +5. **翻译目录中的所有 Markdown 文件并重命名:** ```bash -npx ai-markdown-translator -i input.md -o output.md -l "German" --openai-url "https://api.302.ai/v1/chat/completions" --api-key "sk-302-api-key" +npx ai-markdown-translator -i ./markdown-files -l "中文" --rename ``` -4. **翻译 URL 中的 Markdown 内容:** +6. **翻译 Markdown 文件并指定输出文件名:** ```bash -npx ai-markdown-translator -u https://gitee.com/h7ml/ai-markdown-translator/raw/main/README.md -o output.md -l "Italian" +npx ai-markdown-translator -i example.md -o translated_example.md -l "日语" ``` ## 许可证 @@ -145,22 +168,22 @@ npx ai-markdown-translator -u https://gitee.com/h7ml/ai-markdown-translator/raw/ ## Git 信息 -- **仓库**:[h7ml/ai-markdown-translator](https://github.com/h7ml/ai-markdown-translator) -- **问题**:[报告问题](https://github.com/h7ml/ai-markdown-translator/issues) +- **仓库**: [h7ml/ai-markdown-translator](https://github.com/h7ml/ai-markdown-translator) +- **问题**: [报告问题](https://github.com/h7ml/ai-markdown-translator/issues) ## 版本信息 -- **当前版本**:1.0.7 -- **NPM 包**:[ai-markdown-translator](https://www.npmjs.com/package/ai-markdown-translator) +- **当前版本**: 1.0.7 +- **NPM 包**: [ai-markdown-translator](https://www.npmjs.com/package/ai-markdown-translator) ## CI 信息 -此项目使用 GitHub Actions 进行持续集成。CI 工作流包括: +该项目使用 GitHub Actions 进行持续集成。CI 工作流程包括: -- 使用 ESLint 对代码进行 linting -- 运行测试(如果适用) +- 使用 ESLint 对代码进行 lint +- 运行测试(如适用) - 构建项目 -- 缓存依赖以加速构建 +- 缓存依赖项以加快构建速度 ## 贡献 @@ -168,8 +191,8 @@ npx ai-markdown-translator -u https://gitee.com/h7ml/ai-markdown-translator/raw/ ## 支持 -如果你遇到任何问题或有任何问题,请在这个仓库中打开一个 issue。 +如果您遇到任何问题或有任何疑问,请在此仓库中打开一个问题。 --- -这个版本将 `npx` 和独立可执行文件 (`./ai-markdown-translator`) 的使用示例合并成了一个连贯的部分。如果你想进行任何进一步的调整,请告诉我! +此版本将`npx`和独立可执行文件(`./ai-markdown-translator`)的使用示例合并为一个统一的部分。如果您需要进一步调整,请告诉我! \ No newline at end of file diff --git a/README.md b/README.md index 064e4e8..85eff6f 100644 --- a/README.md +++ b/README.md @@ -91,15 +91,26 @@ npx ai-markdown-translator -u https://gitee.com/h7ml/ai-markdown-translator/raw/ ## Options -- `--input`, `-i`: Input Markdown file (alternative to `--url`). -- `--url`, `-u`: URL of a Markdown file to translate (alternative to `--input`). -- `--output`, `-o`: Output Markdown file (if not provided, defaults to the input file name). -- `--language`, `-l`: Target language for translation (required). -- `--openai-url`: OpenAI API URL (default: uses `OPENAI_URL` environment variable). -- `--api-key`: OpenAI API Key (default: uses `API_KEY` environment variable). -- `--model`: OpenAI Model to use (default: uses `MODEL` environment variable or `gpt-3.5-turbo`). -- `--help`, `-h`: Show help. -- `--show-version`, `-v`: Show version. +- `--input`, `-i`: Input Markdown file or directory (alternative to `--url`). This option allows you to specify the path to the Markdown file or directory you want to translate. +- `--url`, `-u`: URL of a Markdown file to translate (alternative to `--input`). Use this option to provide a direct link to a Markdown file that you want to translate. + +- `--extension`, `-e`: Specify the file extension to translate (e.g., `md`). If not provided, all files will be processed. This option allows you to filter which files to translate based on their extension. + +- `--rename`: Whether to modify the file name. If true, the output file will be named `-translated.`. This option allows you to specify if you want to append a suffix to the translated file name. + +- `--output`, `-o`: Output Markdown file (if not provided, defaults to the input file name). This option allows you to specify the name of the output file where the translated content will be saved. + +- `--language`, `-l`: Target language for translation (required). This option specifies the language into which you want the Markdown content to be translated. + +- `--openai-url`: OpenAI API URL (default: uses `OPENAI_URL` environment variable). This option allows you to specify a custom URL for the OpenAI API if needed. + +- `--api-key`: OpenAI API Key (default: uses `API_KEY` environment variable). This option is used to provide your OpenAI API key for authentication. + +- `--model`: OpenAI Model to use (default: uses `MODEL` environment variable or `gpt-3.5-turbo`). This option allows you to specify which OpenAI model to use for translation. + +- `--help`, `-h`: Show help. This option displays the help information for the command-line tool. + +- `--show-version`, `-v`: Show version. This option displays the current version of the tool. > Note: `--input` and `--url` are mutually exclusive; you must provide one or the other. @@ -139,6 +150,18 @@ npx ai-markdown-translator -i input.md -o output.md -l "German" --openai-url "ht npx ai-markdown-translator -u https://gitee.com/h7ml/ai-markdown-translator/raw/main/README.md -o output.md -l "Italian" ``` +5. **Translate all Markdown files in a directory and rename them:** + +```bash +npx ai-markdown-translator -i ./markdown-files -l "Chinese" --rename +``` + +6. **Translate a Markdown file and specify the output file name:** + +```bash +npx ai-markdown-translator -i example.md -o translated_example.md -l "Japanese" +``` + ## License [MIT License](LICENSE) diff --git a/package.json b/package.json index 8fb089b..0abb433 100644 --- a/package.json +++ b/package.json @@ -28,8 +28,10 @@ "CHANGELOG.md" ], "dependencies": { + "@types/glob": "^8.1.0", "axios": "^1.4.0", "dotenv": "^16.0.3", + "glob": "^11.0.0", "yargs": "^17.7.2" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c1dd217..4abe913 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,12 +8,18 @@ importers: .: dependencies: + '@types/glob': + specifier: ^8.1.0 + version: 8.1.0 axios: specifier: ^1.4.0 version: 1.7.9 dotenv: specifier: ^16.0.3 version: 16.4.7 + glob: + specifier: ^11.0.0 + version: 11.0.0 yargs: specifier: ^17.7.2 version: 17.7.2 @@ -51,9 +57,6 @@ importers: husky: specifier: ^9.1.7 version: 9.1.7 - pkg: - specifier: ^5.8.1 - version: 5.8.1 prettier: specifier: ^2.0.0 version: 2.8.8 @@ -67,27 +70,10 @@ packages: resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} - '@babel/generator@7.18.2': - resolution: {integrity: sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-string-parser@7.25.9': - resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} - engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.25.9': resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} - '@babel/parser@7.18.4': - resolution: {integrity: sha512-FDge0dFazETFcxGw/EXzOkN8uJp0PC7Qbm+Pe9T+av2zlBpOgunFHkQPPn+eRuClU73JF+98D531UgayY89tow==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/types@7.19.0': - resolution: {integrity: sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA==} - engines: {node: '>=6.9.0'} - '@commitlint/cli@19.6.0': resolution: {integrity: sha512-v17BgGD9w5KnthaKxXnEg6KLq6DYiAxyiN44TpiRtqyW8NSq+Kx99mkEG8Qo6uu6cI5eMzMojW2muJxjmPnF8w==} engines: {node: '>=v18'} @@ -202,23 +188,9 @@ packages: resolution: {integrity: sha512-e5+YUKENATs1JgYHMzTr2MW/NDcXGfYFAuOQU8gJgF/kEh4EqKgfGrfLI67bMD4tbhZVlkigz/9YYwWcbOFthg==} engines: {node: '>=10.13.0'} - '@jridgewell/gen-mapping@0.3.5': - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} - engines: {node: '>=6.0.0'} - - '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} - - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} - - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -235,9 +207,15 @@ packages: '@types/conventional-commits-parser@5.0.1': resolution: {integrity: sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==} + '@types/glob@8.1.0': + resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} + '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/minimatch@5.1.2': + resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + '@types/node@18.19.67': resolution: {integrity: sha512-wI8uHusga+0ZugNp0Ol/3BqQfEcCCNfojtO6Oou9iVNGPTL6QNSdnUdqq85fRgIorLhLMuPIKpsN98QE9Nh+KQ==} @@ -331,10 +309,6 @@ packages: add-stream@1.0.0: resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} - agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} - ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -345,10 +319,18 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -362,32 +344,22 @@ packages: asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - at-least-node@1.0.0: - resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} - engines: {node: '>= 4.0.0'} - axios@1.7.9: resolution: {integrity: sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==} balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -400,12 +372,6 @@ packages: resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -507,9 +473,6 @@ packages: engines: {node: '>=18'} hasBin: true - core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - cosmiconfig-typescript-loader@5.1.0: resolution: {integrity: sha512-7PtBB+6FdsOvZyJtlF3hEPpACq7RQX6BVGsgC7/lfVXnKMvNCu/XY3ykreqG5w/rBNdu2z8LCIKoF3kpHHdHlA==} engines: {node: '>=v16'} @@ -544,14 +507,6 @@ packages: supports-color: optional: true - decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} - - deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -559,10 +514,6 @@ packages: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} - detect-libc@2.0.3: - resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} - engines: {node: '>=8'} - dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -579,11 +530,14 @@ packages: resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} engines: {node: '>=12'} + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} @@ -658,10 +612,6 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - expand-template@2.0.3: - resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} - engines: {node: '>=6'} - fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -720,26 +670,17 @@ packages: debug: optional: true + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} + form-data@4.0.1: resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} engines: {node: '>= 6'} - from2@2.3.0: - resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} - - fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - - fs-extra@9.1.0: - resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} - engines: {node: '>=10'} - fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} @@ -759,9 +700,6 @@ packages: engines: {node: '>=18'} hasBin: true - github-from-package@0.0.0: - resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} - glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -770,8 +708,14 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} + glob@11.0.0: + resolution: {integrity: sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==} + engines: {node: 20 || >=22} + hasBin: true + glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported global-directory@4.0.1: resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} @@ -785,9 +729,6 @@ packages: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} @@ -800,30 +741,15 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - has@1.0.4: - resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==} - engines: {node: '>= 0.4.0'} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - hosted-git-info@7.0.2: resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} engines: {node: ^16.14.0 || >=18.0.0} - https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} - husky@9.1.7: resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} engines: {node: '>=18'} hasBin: true - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -849,27 +775,13 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - ini@4.1.1: resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - into-stream@6.0.0: - resolution: {integrity: sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==} - engines: {node: '>=10'} - is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - is-core-module@2.15.1: - resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} - engines: {node: '>= 0.4'} - - is-core-module@2.9.0: - resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==} - is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -898,12 +810,13 @@ packages: resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==} engines: {node: '>=8'} - isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + jackspeak@4.0.2: + resolution: {integrity: sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==} + engines: {node: 20 || >=22} + jiti@1.21.6: resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} hasBin: true @@ -915,11 +828,6 @@ packages: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true - jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -935,9 +843,6 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - jsonparse@1.3.1: resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} engines: {'0': node >= 0.2.0} @@ -990,6 +895,10 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@11.0.2: + resolution: {integrity: sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==} + engines: {node: 20 || >=22} + meow@12.1.1: resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} engines: {node: '>=16.10'} @@ -1014,9 +923,9 @@ packages: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} - mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} + minimatch@10.0.1: + resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} + engines: {node: 20 || >=22} minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -1024,18 +933,13 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - multistream@4.1.0: - resolution: {integrity: sha512-J1XDiAmmNpRCBfIWJv+n0ymC4ABcf/Pl+5YvC5B/D2f/2+8PtHvCNxMPKiQcZyi922Hq69J2YOpb1pTywfifyw==} - - napi-build-utils@1.0.2: - resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} - natural-compare-lite@1.4.0: resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} @@ -1045,19 +949,6 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - node-abi@3.71.0: - resolution: {integrity: sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw==} - engines: {node: '>=10'} - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - normalize-package-data@6.0.2: resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} engines: {node: ^16.14.0 || >=18.0.0} @@ -1069,10 +960,6 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} - p-is-promise@3.0.0: - resolution: {integrity: sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==} - engines: {node: '>=8'} - p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -1089,6 +976,9 @@ packages: resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -1117,8 +1007,9 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + path-scurry@2.0.0: + resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} + engines: {node: 20 || >=22} path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} @@ -1131,24 +1022,6 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - pkg-fetch@3.4.2: - resolution: {integrity: sha512-0+uijmzYcnhC0hStDjm/cl2VYdrmVVBpe7Q8k9YBojxmR5tG8mvR9/nooQq3QSXiQqORDVOTY3XqMEqJVIzkHA==} - hasBin: true - - pkg@5.8.1: - resolution: {integrity: sha512-CjBWtFStCfIiT4Bde9QpJy0KeH19jCfwZRJqHFDFXfhUklCx8JoFmMj3wgnEYIwGmZVNkhsStPHEOnrtrQhEXA==} - hasBin: true - peerDependencies: - node-notifier: '>=9.0.1' - peerDependenciesMeta: - node-notifier: - optional: true - - prebuild-install@7.1.1: - resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} - engines: {node: '>=10'} - hasBin: true - prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -1162,19 +1035,9 @@ packages: engines: {node: '>=10.13.0'} hasBin: true - process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - - progress@2.0.3: - resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} - engines: {node: '>=0.4.0'} - proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - pump@3.0.2: - resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} - punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -1182,10 +1045,6 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true - read-package-up@11.0.0: resolution: {integrity: sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==} engines: {node: '>=18'} @@ -1194,13 +1053,6 @@ packages: resolution: {integrity: sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==} engines: {node: '>=18'} - readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -1217,10 +1069,6 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} - resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true - reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -1232,12 +1080,6 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - semver@7.6.3: resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} engines: {node: '>=10'} @@ -1251,11 +1093,9 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - simple-concat@1.0.1: - resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - - simple-get@4.0.1: - resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} @@ -1281,26 +1121,21 @@ packages: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} - stream-meter@1.0.4: - resolution: {integrity: sha512-4sOEtrbgFotXwnEuzzsQBYEV1elAeFSO8rSGeTwabuX1RRn/kEq9JVH7I0MRBhKVRR0sJkr0M0QCH7yOLf9fhQ==} - string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} - string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - - string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} @@ -1310,17 +1145,6 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} - supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - - tar-fs@2.1.1: - resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} - - tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} - temp-dir@3.0.0: resolution: {integrity: sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==} engines: {node: '>=14.16'} @@ -1342,17 +1166,10 @@ packages: tinyexec@0.3.1: resolution: {integrity: sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==} - to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} @@ -1362,9 +1179,6 @@ packages: peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -1394,25 +1208,12 @@ packages: resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} engines: {node: '>=18'} - universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} - uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -1429,6 +1230,10 @@ packages: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} @@ -1436,18 +1241,10 @@ packages: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - yargs@17.7.2: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} @@ -1468,26 +1265,8 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/generator@7.18.2': - dependencies: - '@babel/types': 7.19.0 - '@jridgewell/gen-mapping': 0.3.5 - jsesc: 2.5.2 - - '@babel/helper-string-parser@7.25.9': {} - '@babel/helper-validator-identifier@7.25.9': {} - '@babel/parser@7.18.4': - dependencies: - '@babel/types': 7.19.0 - - '@babel/types@7.19.0': - dependencies: - '@babel/helper-string-parser': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - to-fast-properties: 2.0.0 - '@commitlint/cli@19.6.0(@types/node@18.19.67)(typescript@5.7.2)': dependencies: '@commitlint/format': 19.5.0 @@ -1643,22 +1422,14 @@ snapshots: '@hutson/parse-repository-url@5.0.0': {} - '@jridgewell/gen-mapping@0.3.5': - dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 - - '@jridgewell/resolve-uri@3.1.2': {} - - '@jridgewell/set-array@1.2.1': {} - - '@jridgewell/sourcemap-codec@1.5.0': {} - - '@jridgewell/trace-mapping@0.3.25': + '@isaacs/cliui@8.0.2': dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 '@nodelib/fs.scandir@2.1.5': dependencies: @@ -1676,8 +1447,15 @@ snapshots: dependencies: '@types/node': 18.19.67 + '@types/glob@8.1.0': + dependencies: + '@types/minimatch': 5.1.2 + '@types/node': 18.19.67 + '@types/json-schema@7.0.15': {} + '@types/minimatch@5.1.2': {} + '@types/node@18.19.67': dependencies: undici-types: 5.26.5 @@ -1791,12 +1569,6 @@ snapshots: add-stream@1.0.0: {} - agent-base@6.0.2: - dependencies: - debug: 4.4.0 - transitivePeerDependencies: - - supports-color - ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -1813,10 +1585,14 @@ snapshots: ansi-regex@5.0.1: {} + ansi-regex@6.1.0: {} + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 + ansi-styles@6.2.1: {} + argparse@2.0.1: {} array-ify@1.0.0: {} @@ -1825,8 +1601,6 @@ snapshots: asynckit@0.4.0: {} - at-least-node@1.0.0: {} - axios@1.7.9: dependencies: follow-redirects: 1.15.9 @@ -1837,27 +1611,18 @@ snapshots: balanced-match@1.0.2: {} - base64-js@1.5.1: {} - - bl@4.1.0: - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 - brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - braces@3.0.3: + brace-expansion@2.0.1: dependencies: - fill-range: 7.1.1 + balanced-match: 1.0.2 - buffer@5.7.1: + braces@3.0.3: dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 + fill-range: 7.1.1 callsites@3.1.0: {} @@ -1868,14 +1633,6 @@ snapshots: chalk@5.3.0: {} - chownr@1.1.4: {} - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - cliui@8.0.1: dependencies: string-width: 4.2.3 @@ -1994,8 +1751,6 @@ snapshots: dependencies: meow: 13.2.0 - core-util-is@1.0.3: {} - cosmiconfig-typescript-loader@5.1.0(@types/node@18.19.67)(cosmiconfig@9.0.0(typescript@5.7.2))(typescript@5.7.2): dependencies: '@types/node': 18.19.67 @@ -2024,18 +1779,10 @@ snapshots: dependencies: ms: 2.1.3 - decompress-response@6.0.0: - dependencies: - mimic-response: 3.1.0 - - deep-extend@0.6.0: {} - deep-is@0.1.4: {} delayed-stream@1.0.0: {} - detect-libc@2.0.3: {} - dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -2050,11 +1797,11 @@ snapshots: dotenv@16.4.7: {} + eastasianwidth@0.2.0: {} + emoji-regex@8.0.0: {} - end-of-stream@1.4.4: - dependencies: - once: 1.4.0 + emoji-regex@9.2.2: {} env-paths@2.2.1: {} @@ -2153,8 +1900,6 @@ snapshots: esutils@2.0.3: {} - expand-template@2.0.3: {} - fast-deep-equal@3.1.3: {} fast-diff@1.3.0: {} @@ -2208,30 +1953,19 @@ snapshots: follow-redirects@1.15.9: {} + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + form-data@4.0.1: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 - from2@2.3.0: - dependencies: - inherits: 2.0.4 - readable-stream: 2.3.8 - - fs-constants@1.0.0: {} - - fs-extra@9.1.0: - dependencies: - at-least-node: 1.0.0 - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - fs.realpath@1.0.0: {} - function-bind@1.1.2: {} - get-caller-file@2.0.5: {} git-raw-commits@4.0.0: @@ -2256,8 +1990,6 @@ snapshots: - conventional-commits-filter - conventional-commits-parser - github-from-package@0.0.0: {} - glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -2266,6 +1998,15 @@ snapshots: dependencies: is-glob: 4.0.3 + glob@11.0.0: + dependencies: + foreground-child: 3.3.0 + jackspeak: 4.0.2 + minimatch: 10.0.1 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 2.0.0 + glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -2292,8 +2033,6 @@ snapshots: merge2: 1.4.1 slash: 3.0.0 - graceful-fs@4.2.11: {} - graphemer@1.4.0: {} handlebars@4.7.8: @@ -2307,27 +2046,12 @@ snapshots: has-flag@4.0.0: {} - has@1.0.4: {} - - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - hosted-git-info@7.0.2: dependencies: lru-cache: 10.4.3 - https-proxy-agent@5.0.1: - dependencies: - agent-base: 6.0.2 - debug: 4.4.0 - transitivePeerDependencies: - - supports-color - husky@9.1.7: {} - ieee754@1.2.1: {} - ignore@5.3.2: {} import-fresh@3.3.0: @@ -2348,25 +2072,10 @@ snapshots: inherits@2.0.4: {} - ini@1.3.8: {} - ini@4.1.1: {} - into-stream@6.0.0: - dependencies: - from2: 2.3.0 - p-is-promise: 3.0.0 - is-arrayish@0.2.1: {} - is-core-module@2.15.1: - dependencies: - hasown: 2.0.2 - - is-core-module@2.9.0: - dependencies: - has: 1.0.4 - is-extglob@2.1.1: {} is-fullwidth-code-point@3.0.0: {} @@ -2385,10 +2094,12 @@ snapshots: dependencies: text-extensions: 2.4.0 - isarray@1.0.0: {} - isexe@2.0.0: {} + jackspeak@4.0.2: + dependencies: + '@isaacs/cliui': 8.0.2 + jiti@1.21.6: {} js-tokens@4.0.0: {} @@ -2397,8 +2108,6 @@ snapshots: dependencies: argparse: 2.0.1 - jsesc@2.5.2: {} - json-buffer@3.0.1: {} json-parse-even-better-errors@2.3.1: {} @@ -2409,12 +2118,6 @@ snapshots: json-stable-stringify-without-jsonify@1.0.1: {} - jsonfile@6.1.0: - dependencies: - universalify: 2.0.1 - optionalDependencies: - graceful-fs: 4.2.11 - jsonparse@1.3.1: {} keyv@4.5.4: @@ -2456,6 +2159,8 @@ snapshots: lru-cache@10.4.3: {} + lru-cache@11.0.2: {} + meow@12.1.1: {} meow@13.2.0: {} @@ -2473,7 +2178,9 @@ snapshots: dependencies: mime-db: 1.52.0 - mimic-response@3.1.0: {} + minimatch@10.0.1: + dependencies: + brace-expansion: 2.0.1 minimatch@3.1.2: dependencies: @@ -2481,31 +2188,16 @@ snapshots: minimist@1.2.8: {} - mkdirp-classic@0.5.3: {} + minipass@7.1.2: {} ms@2.1.3: {} - multistream@4.1.0: - dependencies: - once: 1.4.0 - readable-stream: 3.6.2 - - napi-build-utils@1.0.2: {} - natural-compare-lite@1.4.0: {} natural-compare@1.4.0: {} neo-async@2.6.2: {} - node-abi@3.71.0: - dependencies: - semver: 7.6.3 - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - normalize-package-data@6.0.2: dependencies: hosted-git-info: 7.0.2 @@ -2525,8 +2217,6 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 - p-is-promise@3.0.0: {} - p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 @@ -2543,6 +2233,8 @@ snapshots: dependencies: p-limit: 4.0.0 + package-json-from-dist@1.0.1: {} + parent-module@1.0.1: dependencies: callsites: 3.1.0 @@ -2568,7 +2260,10 @@ snapshots: path-key@3.1.1: {} - path-parse@1.0.7: {} + path-scurry@2.0.0: + dependencies: + lru-cache: 11.0.2 + minipass: 7.1.2 path-type@4.0.0: {} @@ -2576,55 +2271,6 @@ snapshots: picomatch@2.3.1: {} - pkg-fetch@3.4.2: - dependencies: - chalk: 4.1.2 - fs-extra: 9.1.0 - https-proxy-agent: 5.0.1 - node-fetch: 2.7.0 - progress: 2.0.3 - semver: 7.6.3 - tar-fs: 2.1.1 - yargs: 16.2.0 - transitivePeerDependencies: - - encoding - - supports-color - - pkg@5.8.1: - dependencies: - '@babel/generator': 7.18.2 - '@babel/parser': 7.18.4 - '@babel/types': 7.19.0 - chalk: 4.1.2 - fs-extra: 9.1.0 - globby: 11.1.0 - into-stream: 6.0.0 - is-core-module: 2.9.0 - minimist: 1.2.8 - multistream: 4.1.0 - pkg-fetch: 3.4.2 - prebuild-install: 7.1.1 - resolve: 1.22.8 - stream-meter: 1.0.4 - transitivePeerDependencies: - - encoding - - supports-color - - prebuild-install@7.1.1: - dependencies: - detect-libc: 2.0.3 - expand-template: 2.0.3 - github-from-package: 0.0.0 - minimist: 1.2.8 - mkdirp-classic: 0.5.3 - napi-build-utils: 1.0.2 - node-abi: 3.71.0 - pump: 3.0.2 - rc: 1.2.8 - simple-get: 4.0.1 - tar-fs: 2.1.1 - tunnel-agent: 0.6.0 - prelude-ls@1.2.1: {} prettier-linter-helpers@1.0.0: @@ -2633,28 +2279,12 @@ snapshots: prettier@2.8.8: {} - process-nextick-args@2.0.1: {} - - progress@2.0.3: {} - proxy-from-env@1.1.0: {} - pump@3.0.2: - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - punycode@2.3.1: {} queue-microtask@1.2.3: {} - rc@1.2.8: - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - read-package-up@11.0.0: dependencies: find-up-simple: 1.0.0 @@ -2669,22 +2299,6 @@ snapshots: type-fest: 4.30.0 unicorn-magic: 0.1.0 - readable-stream@2.3.8: - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - - readable-stream@3.6.2: - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - require-directory@2.1.1: {} require-from-string@2.0.2: {} @@ -2693,12 +2307,6 @@ snapshots: resolve-from@5.0.0: {} - resolve@1.22.8: - dependencies: - is-core-module: 2.15.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - reusify@1.0.4: {} rimraf@3.0.2: @@ -2709,10 +2317,6 @@ snapshots: dependencies: queue-microtask: 1.2.3 - safe-buffer@5.1.2: {} - - safe-buffer@5.2.1: {} - semver@7.6.3: {} shebang-command@2.0.0: @@ -2721,13 +2325,7 @@ snapshots: shebang-regex@3.0.0: {} - simple-concat@1.0.1: {} - - simple-get@4.0.1: - dependencies: - decompress-response: 6.0.0 - once: 1.4.0 - simple-concat: 1.0.1 + signal-exit@4.1.0: {} slash@3.0.0: {} @@ -2749,29 +2347,25 @@ snapshots: split2@4.2.0: {} - stream-meter@1.0.4: - dependencies: - readable-stream: 2.3.8 - string-width@4.2.3: dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - string_decoder@1.1.1: - dependencies: - safe-buffer: 5.1.2 - - string_decoder@1.3.0: + string-width@5.1.2: dependencies: - safe-buffer: 5.2.1 + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 - strip-json-comments@2.0.1: {} + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 strip-json-comments@3.1.1: {} @@ -2779,23 +2373,6 @@ snapshots: dependencies: has-flag: 4.0.0 - supports-preserve-symlinks-flag@1.0.0: {} - - tar-fs@2.1.1: - dependencies: - chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.2 - tar-stream: 2.2.0 - - tar-stream@2.2.0: - dependencies: - bl: 4.1.0 - end-of-stream: 1.4.4 - fs-constants: 1.0.0 - inherits: 2.0.4 - readable-stream: 3.6.2 - temp-dir@3.0.0: {} tempfile@5.0.0: @@ -2810,14 +2387,10 @@ snapshots: tinyexec@0.3.1: {} - to-fast-properties@2.0.0: {} - to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - tr46@0.0.3: {} - tslib@1.14.1: {} tsutils@3.21.0(typescript@5.7.2): @@ -2825,10 +2398,6 @@ snapshots: tslib: 1.14.1 typescript: 5.7.2 - tunnel-agent@0.6.0: - dependencies: - safe-buffer: 5.2.1 - type-check@0.4.0: dependencies: prelude-ls: 1.2.1 @@ -2846,26 +2415,15 @@ snapshots: unicorn-magic@0.1.0: {} - universalify@2.0.1: {} - uri-js@4.4.1: dependencies: punycode: 2.3.1 - util-deprecate@1.0.2: {} - validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - which@2.0.2: dependencies: isexe: 2.0.0 @@ -2880,24 +2438,18 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + wrappy@1.0.2: {} y18n@5.0.8: {} - yargs-parser@20.2.9: {} - yargs-parser@21.1.1: {} - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.9 - yargs@17.7.2: dependencies: cliui: 8.0.1 diff --git a/src/index.ts b/src/index.ts index 211b813..66714af 100644 --- a/src/index.ts +++ b/src/index.ts @@ -7,6 +7,7 @@ import yargs from 'yargs'; import { hideBin } from 'yargs/helpers'; import * as path from 'path'; import * as os from 'os'; +import * as glob from 'glob'; config(); @@ -50,6 +51,9 @@ function readMarkdownFile(filePath: string): string { if (!fs.existsSync(filePath)) { throw new Error(`输入文件 ${filePath} 不存在。`); } + if (fs.lstatSync(filePath).isDirectory()) { + throw new Error(`错误: ${filePath} 是一个目录。`); + } return fs.readFileSync(filePath, 'utf-8'); } @@ -102,7 +106,6 @@ async function translateText( model: model, messages: [{ role: 'user', content: prompt }], }; - try { const response = await axios.post(openaiUrl, data, { headers }); if (response.status === 200) { @@ -203,13 +206,80 @@ async function getContentFromUrl(urlString: string): Promise { } } +async function translateDirectory( + inputDir: string, + outputDir: string, + targetLanguage: string, + openaiUrl: string, + apiKey: string, + model: string, + fileExtension: string | null, + rename: string | null, +) { + // 使用glob递归获取所有文件 + const pattern = fileExtension ? `**/*.${fileExtension}` : '**/*'; + const markdownFiles = glob.sync(`${inputDir}/${pattern}`, { nodir: true }); + + for (const file of markdownFiles) { + const relativePath = path.relative(inputDir, file); // 获取相对路径 + const content = readMarkdownFile(file); + + const translatedContent = await translateText( + content, + targetLanguage, + openaiUrl, + apiKey, + model, + ); + + if (translatedContent) { + let modifiedContent = translatedContent; // 创建可修改的变量 + // 校验是否含有代码块标记,如果有则删除第一行和最后一行 + if (modifiedContent.startsWith('```')) { + const endOfFirstLine = modifiedContent.indexOf('\n'); + modifiedContent = modifiedContent.slice(endOfFirstLine + 1).trim(); + } + + if (modifiedContent.endsWith('```')) { + const startOfLastLine = modifiedContent.lastIndexOf('\n'); + modifiedContent = modifiedContent.slice(0, startOfLastLine).trim(); + } + + // 根据相对路径生成输出文件路径 + const outputFileName = rename + ? path.join( + outputDir, + path.dirname(relativePath), + `${path.basename(file, path.extname(file))}-${rename}${path.extname(file)}`, + ) + : path.join( + outputDir, + path.dirname(relativePath), + `${path.basename(file, path.extname(file))}${path.extname(file)}`, + ); + + // 确保输出目录存在 + const outputDirPath = path.dirname(outputFileName); + if (!fs.existsSync(outputDirPath)) { + fs.mkdirSync(outputDirPath, { recursive: true }); + } + + // 写入翻译后的文件 + writeMarkdownFile(outputFileName, modifiedContent); + console.log(`翻译完成。输出已保存到 ${outputFileName}。`); + } else { + console.log('翻译失败。'); + } + } +} + async function main() { const defaultApiKey = await getDefaultApiKey(); const argv = await yargs(hideBin(process.argv)) .option('input', { alias: 'i', - description: '输入的Markdown文件', + description: '输入的Markdown文件或文件夹', type: 'string', }) .option('url', { @@ -217,6 +287,16 @@ async function main() { description: '输入的Markdown URL地址', type: 'string', }) + .option('extension', { + alias: 'e', + description: '指定要翻译的文件后缀(例如 md)', + type: 'string', + }) + .option('rename', { + description: '是否修改文件名称', + type: 'string', + default: null, + }) .check((argv) => { if (!argv.input && !argv.url) { throw new Error('必须提供 --input 或 --url 参数之一'); @@ -278,56 +358,71 @@ async function main() { throw new Error('需要提供API Key。请通过--api-key参数或API_KEY环境变量提供。'); } - let markdownContent: string; + let markdownContent: string | null = null; if (argv.url) { markdownContent = await getContentFromUrl(argv.url as string); } else if (argv.input) { - markdownContent = readMarkdownFile(argv.input as string); + const inputPath = argv.input as string; + const stats = fs.statSync(inputPath); + if (stats.isDirectory()) { + const outputDir = argv.output || inputPath; + await translateDirectory( + inputPath, + outputDir, + argv.language, + argv['openai-url'] as string, + argv['api-key'] as string, + argv.model as string, + argv.extension || null, + argv.rename, + ); + } else { + markdownContent = readMarkdownFile(inputPath); + } } else { throw new Error('必须提供 --input 或 --url 参数之一'); } - if (markdownContent.startsWith('```')) { - markdownContent = markdownContent.slice(3).trim(); - } - if (markdownContent.endsWith('```')) { - markdownContent = markdownContent.slice(0, -3).trim(); - } - - if (!argv.output && argv.input) { - argv.output = argv.input; - } - - if (typeof argv.output !== 'string') { - throw new Error('输出文件名无效。'); - } + if (markdownContent) { + if (markdownContent.startsWith('```')) { + markdownContent = markdownContent.slice(3).trim(); + } + if (markdownContent.endsWith('```')) { + markdownContent = markdownContent.slice(0, -3).trim(); + } - const translatedContent = await translateText( - markdownContent, - argv.language, - argv['openai-url'] as string, - argv['api-key'] as string, - argv.model as string, - ); + if (!argv.output && argv.input) { + argv.output = argv.input; + } - if (translatedContent) { - let modifiedContent = translatedContent; // Create a mutable variable - // 校验下第一行是否含有``` 和 最后是否含有``` 如果是的话 那么删掉第一行和最后行 - if (modifiedContent.startsWith('```')) { - const endOfFirstLine = modifiedContent.indexOf('\n'); - // 删除整行代码块标记(包括```和可能的语言标识符) - modifiedContent = modifiedContent.slice(endOfFirstLine + 1).trim(); + if (typeof argv.output !== 'string') { + throw new Error('输出文件名无效。'); } - if (modifiedContent.endsWith('```')) { - const startOfLastLine = modifiedContent.lastIndexOf('\n'); - // 删除整行代码块标记 - modifiedContent = modifiedContent.slice(0, startOfLastLine).trim(); + const translatedContent = await translateText( + markdownContent, + argv.language, + argv['openai-url'] as string, + argv['api-key'] as string, + argv.model as string, + ); + + if (translatedContent) { + let modifiedContent = translatedContent; + if (modifiedContent.startsWith('```')) { + const endOfFirstLine = modifiedContent.indexOf('\n'); + modifiedContent = modifiedContent.slice(endOfFirstLine + 1).trim(); + } + + if (modifiedContent.endsWith('```')) { + const startOfLastLine = modifiedContent.lastIndexOf('\n'); + modifiedContent = modifiedContent.slice(0, startOfLastLine).trim(); + } + writeMarkdownFile(argv.output, modifiedContent); + console.log(`翻译完成。输出已保存到 ${argv.output}。`); + } else { + console.log('翻译失败。'); } - writeMarkdownFile(argv.output, modifiedContent); - console.log(`翻译完成。输出已保存到 ${argv.output}。`); - } else { - console.log('翻译失败。'); } } catch (error: Error | unknown) { console.error(`错误: ${error instanceof Error ? error.message : String(error)}`); From 73722a2bdabeb874a49e13fc74f34acce94009e0 Mon Sep 17 00:00:00 2001 From: h7ml Date: Sat, 14 Dec 2024 14:21:06 +0800 Subject: [PATCH 2/2] =?UTF-8?q?build:=20=E6=9B=B4=E6=96=B0=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E7=89=88=E6=9C=AC=E8=87=B3=201.0.8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 README-zh.md 和 README.md 中将当前版本信息从 1.0.7 修改为 1.0.8 - 在 package.json 中更新版本号至 1.0.8 --- README-zh.md | 4 ++-- README.md | 2 +- package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README-zh.md b/README-zh.md index becf4ba..8bd8fb6 100644 --- a/README-zh.md +++ b/README-zh.md @@ -173,7 +173,7 @@ npx ai-markdown-translator -i example.md -o translated_example.md -l "日语" ## 版本信息 -- **当前版本**: 1.0.7 +- **当前版本**: 1.0.8 - **NPM 包**: [ai-markdown-translator](https://www.npmjs.com/package/ai-markdown-translator) ## CI 信息 @@ -195,4 +195,4 @@ npx ai-markdown-translator -i example.md -o translated_example.md -l "日语" --- -此版本将`npx`和独立可执行文件(`./ai-markdown-translator`)的使用示例合并为一个统一的部分。如果您需要进一步调整,请告诉我! \ No newline at end of file +此版本将`npx`和独立可执行文件(`./ai-markdown-translator`)的使用示例合并为一个统一的部分。如果您需要进一步调整,请告诉我! diff --git a/README.md b/README.md index 85eff6f..7e82cd7 100644 --- a/README.md +++ b/README.md @@ -173,7 +173,7 @@ npx ai-markdown-translator -i example.md -o translated_example.md -l "Japanese" ## Version Information -- **Current Version**: 1.0.7 +- **Current Version**: 1.0.8 - **NPM Package**: [ai-markdown-translator](https://www.npmjs.com/package/ai-markdown-translator) ## CI Information diff --git a/package.json b/package.json index 0abb433..66a6660 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ai-markdown-translator", - "version": "1.0.7", + "version": "1.0.8", "description": "CLI tool to translate Markdown files using OpenAI's language models while preserving the original formatting.", "main": "dist/index.js", "type": "module",