ryoppippi/pkg-to-jsr

GitHub: ryoppippi/pkg-to-jsr

一个零配置的包配置转换工具,将 package.json 自动生成为符合 JSR 规范的 jsr.json。

Stars: 27 | Forks: 1

# pkg-to-jsr 🚀 [![npm version](https://img.shields.io/npm/v/pkg-to-jsr?color=yellow)](https://npmjs.com/package/pkg-to-jsr) [![npm downloads](https://img.shields.io/npm/dm/pkg-to-jsr?color=yellow)](https://npmjs.com/package/pkg-to-jsr) pkg-to-jsr 是一个零配置的生成器,可以从现有的 `package.json` 生成 `jsr.json` 文件,由 zod-mini 提供支持,实现快速的运行时验证。 它简化了在 [JSR](https://jsr.io) 上发布软件包的准备过程。 ## ✨ 功能 - 🔧 无需配置 — 运行即可! - 🪄 自动从 `package.json` 生成 `jsr.json` - 📦 轻松处理复杂的 `exports` 配置 - 🎯 支持 `include` 和 `exclude` 选项以精确控制发布 - 🚀 简化 JSR 发布的工作流 ## 📥 安装 你可以无需安装直接使用 npx 运行 pkg-to-jsr: ``` npx pkg-to-jsr ``` 或者使用其他包管理器: ``` # 使用 Yarn yarn dlx pkg-to-jsr # 使用 pnpm pnpm dlx pkg-to-jsr # 使用 Bun bunx pkg-to-jsr ``` 全局安装: ``` npm install -g pkg-to-jsr ``` ## 🚀 用法 在项目目录中运行以下命令: ``` npx pkg-to-jsr ``` 这将根据你的 `package.json` 生成一个 `jsr.json` 文件。 ### 选项 - `--root `:指定包含 `package.json` 文件的根目录(默认:当前工作目录) ## 📚 示例 以下是 pkg-to-jsr 将 `package.json` 转换为 `jsr.json` 的示例: ### 基础示例 **package.json**: ``` { "name": "package", "jsrName": "@scope/package", "version": "1.0.0", "exports": "./index.js" } ``` **生成的 jsr.json**: ``` { "name": "@scope/package", "version": "1.0.0", "exports": { ".": "./index.js" } } ``` ### 复杂 exports 示例 **package.json**: ``` { "name": "package", "author": "ryoppippi", "version": "1.0.0", "exports": { ".": { "jsr": "./src/index.ts", "import": "./dist/index.js", "types": "./dist/index.d.ts" }, "./utils": { "jsr": "./src/utils.ts", "import": "./dist/utils.js", "types": "./dist/utils.d.ts" } }, "files": [ "dist", "!dist/**/*.test.js" ], "jsrInclude": [ "src" ], "jsrExclude": [ "src/**/*.test.ts" ] } ``` **生成的 jsr.json**: ``` { "name": "@ryoppippi/package", "version": "1.0.0", "exports": { ".": "./src/index.ts", "./utils": "./src/utils.ts" }, "publish": { "include": ["dist", "src"], "exclude": ["dist/**/*.test.js", "src/**/*.test.ts"] } } ``` ## 🔧 工作原理 pkg-to-jsr 执行以下步骤: 1. 🔍 定位你的 `package.json` 文件 2. 📤 提取相关信息,如 `name`、`version` 和 `exports` 3. ✍️ 生成一个结构正确的 `jsr.json` 文件用于 JSR 更多实现细节请参考[源代码](./src)。 你可以在[测试](./tests)中查看示例项目。 ### 名称处理 pkg-to-jsr 使用以下逻辑确定 `jsr.json` 的包名: 1. 🏷️ 如果 `package.json` 中存在 `jsrName` 字段且格式正确(`@scope/package-name`),则使用该名称。 2. 📦 如果未提供 `jsrName`,则检查 `package.json` 中的 `name` 字段。如果该字段符合 JSR 格式,则使用它。 3. 🔧 如果 `name` 不是 JSR 格式,则将 `name` 和 `author` 字段组合。例如,若 `name` 为 `"package"`,`author` 为 `"ryoppippi"`,则生成 `@ryoppippi/package`。 4. ❌ 如果以上方法均未生成有效名称,则抛出错误。 这种方法在确保符合 JSR 命名规范的同时提供了最大灵活性。 ### exports 处理 该工具智能处理各种 `exports` 配置: - 🧵 字符串 exports 被转换为对象格式 - 🧩 处理带有 `jsr`、`import` 及其他条件的复杂 exports - 🏆 如果 exports 中指定了 `jsr` 字段,则其优先级高于其他字段 - ⚠️ 对无效或不支持的 exports 发出警告并跳过 ### 发布配置 pkg-to-jsr 通过合并和过滤多个来源的信息来生成 `jsr.json` 中的 `publish.include` 和 `publish.exclude` 字段: 1. 📂 `package.json` 中的 `jsrInclude` 数组:所有条目均视为包含候选 2. 🚫 `package.json` 中的 `jsrExclude` 数组:所有条目均视为排除候选 3. 📁 `package.json` 中的 `files` 数组: - 不以 `!` 开头的文件视为包含 - 以 `!` 开头的文件视为排除(移除 `!`) `jsr.json` 中最终的 `include` 和 `exclude` 列表是这些来源的合并与过滤结果: - `include` 列表合并了 `jsrInclude` 和 `files` 中的正项,并排除任何在 `jsrExclude` 中的路径 - `exclude` 列表合并了 `jsrExclude` 和 `files` 中的负项(移除 `!`),并排除任何在 `jsrInclude` 中的路径 这种方法在保持与现有 `files` 配置兼容的同时,提供了对发布内容的细粒度控制,并允许明确的包含与排除规则。 示例: **package.json**: ``` { "files": [ "dist", "src", "!dist/**/*.test.js" ], "jsrInclude": [ "src", "types" ], "jsrExclude": [ "src/**/*.test.ts", "dist" ] } ``` **生成的 jsr.json**: ``` { "publish": { "include": ["src", "types"], "exclude": ["dist/**/*.test.js", "src/**/*.test.ts"] } } ``` 在此示例中: - `src` 因同时存在于 `files` 和 `jsrInclude` 中而被包含 - `types` 因存在于 `jsrInclude` 中而被包含 - `dist` 因存在于 `jsrExclude` 中而被排除(覆盖 `files` 中的存在) - `dist` 和 `src` 中的测试文件被排除 这种合并和过滤后的配置确保包含所有必要文件,同时尊重明确的包含与排除规则,为 JSR 发布提供精确的内容控制。 ## 🤝 贡献 欢迎贡献!请随时提交 Pull Request。 ## 📄 许可证 [MIT](./LICENSE)
标签:CLI 工具, GNU通用公共许可证, JavaScript 工具, JSR, jsr.json, MITM代理, Node.js, npm, package.json, SEO 工具, TypeScript, Zod, 二进制发布, 代码转换, 前端构建, 包管理, 发布工具, 安全插件, 开发效率, 开源工具, 数据可视化, 模块化, 网络可观测性, 自动化攻击, 自动化生成, 零配置工具, 项目初始化