ryoppippi/pkg-to-jsr
GitHub: ryoppippi/pkg-to-jsr
一个零配置的包配置转换工具,将 package.json 自动生成为符合 JSR 规范的 jsr.json。
Stars: 27 | Forks: 1
# pkg-to-jsr 🚀
[](https://npmjs.com/package/pkg-to-jsr)
[](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, 二进制发布, 代码转换, 前端构建, 包管理, 发布工具, 安全插件, 开发效率, 开源工具, 数据可视化, 模块化, 网络可观测性, 自动化攻击, 自动化生成, 零配置工具, 项目初始化