https://github.com/jchip/publish-util
Some util to clean up package.json for npm publish
https://github.com/jchip/publish-util
Last synced: 10 months ago
JSON representation
Some util to clean up package.json for npm publish
- Host: GitHub
- URL: https://github.com/jchip/publish-util
- Owner: jchip
- Created: 2021-05-01T20:04:21.000Z (about 5 years ago)
- Default Branch: main
- Last Pushed: 2024-04-05T16:55:13.000Z (about 2 years ago)
- Last Synced: 2025-08-29T01:38:45.945Z (10 months ago)
- Language: JavaScript
- Size: 26.4 KB
- Stars: 1
- Watchers: 1
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# publish-util
Clean up `package.json` for publishing.
Your `package.json`:
```json
{
"name": "...",
"version": "...",
"description": "...",
"scripts": {
"test": "...",
"coverage": "...",
"build": "...",
"prepack": "npm run build && publish-util-prepack",
"postpack": "publish-util-postpack"
},
"publishUtil": {
"remove": ["devDependencies", { "scripts": ["test", "coverage", "build"] }],
"keep": ["options"]
},
"dependencies": {
"react": "^17.0.0",
"react-dom": "^17.0.0"
},
"devDependencies": {
"tap": "^15.0.0",
"publish-util": "^1.0.0"
},
"nyc": {
"reporter": ["lcov", "text", "text-summary"]
},
"options": {}
}
```
Your `package.json` published:
```json
{
"name": "...",
"version": "...",
"description": "...",
"scripts": {
"postpack": "publish-util-postpack"
},
"dependencies": {
"react": "^17.0.0",
"react-dom": "^17.0.0"
},
"options": {}
}
```
## Usage
Just install this to your module:
`npm install --save-dev publish-util`
It will automatically add `prepack` and `postpack` scripts to your package.json for you.
Out of the box it will clean up non-standard fields plus `workspaces` and `devDependencies` from your `package.json`. To keep `devDependencies`, see [details below](#removing-non-standard-fields)
## Publishing
This module offers a custom publishing script to fix some behaviors of `npm publish`.
The problem is that before any thing can process `package.json`, `npm publish` will load and upload it to the registry as packument (meta for the package).
If you want the copy of `package.json` after this module processed it to be the packument meta, then use the `do-publish` command:
`npx do-publish`
The script use whatever version of `npm` you have to do the actual work. It takes all CLI arguments that `npm publish` accepts and will pass them through.
## `publishUtil` configs:
You can configure some behaviors with `publishUtil` in your `package.json`.
| Config | Description | Default |
| ----------------- | ----------------------------------------------------------------------- | ------- |
| `rename` | object map of keys to rename from `package.json` - done before `remove` | |
| `remove` | array of keys and nesting keys to remove from `package.json` | |
| `keep` | array of keys and nesting keys to keep from `package.json`. | |
| `removeExtraKeys` | remove top level non-standard fields. | `true` |
| `autoPostPack` | insert `scripts.postpack` if it's missing. | `true` |
| `silent` | don't log message with console | `false` |
- `publishUtil` is removed automatically.
- `rename` details. The rename config is an object map, with key being the field to rename, and its value being the target name.
For example:
```json
{
"publishUtil": {
"rename": {
"scripts.foo": "scripts.renamedFoo"
}
}
}
```
- `scripts.prepublishOnly` is removed automatically if it's just `"publish-util-prepublishonly"`. Add it to `publishUtil.keep` to keep it:
```json
{
"publishUtil": {
"keep": [{ "scripts": ["prepublishOnly"] }]
}
}
```
- Can't remove `scripts.postpack` because npm needs that to restore `package.json`.
- Can't use `prepack` because `npm publish` uploads meta data before that so if you want to publish with different `dependencies` it will break.
### `remove` and `keep` formats
The config `remove` and `keep` can be:
- Array of strings that are either keys in the object or a regular expression to match keys in the object.
- To specify a regular expression, use the format `"//"`
- To reach into a nesting object, use an object of keys and array of keys/regex.
For example, to reach `pkg.key1.key2`, and `pkg.key1.xyz*`:
```json
[
{
"key1": ["key2", "/xyz.*/"]
}
]
```
## Removing Non-standard Fields
These top level fields are considered standard fields:
- all top level fields defined at [npm package.json](https://docs.npmjs.com/cli/v7/configuring-npm/package-json), except `workspaces` and `devDependencies`
- And these fields: `module`
Any extra top level fields not in the standard fields are automatically removed.
- To skip this automatic removal, set `publishUtil.removeExtraKeys` to `false`.
- You can also add fields to `publishUtil.keep` to avoid them being removed.
For example, to keep `devDependencies`:
```json
{
"publishUtil": {
"keep": ["devDependencies"]
}
}
```
## Auto `postpack` Insert
If you don't have a `scripts.postpack`, then it's automatically added with `"publish-util-postpack"` to ensure your package.json is restored after packing.
- Set `publishUtil.autoPostPack` to `false` to skip this.
## Dry Run and Verify
To verify `package.json` content.
1. Run `npm run prepack`
2. Inspect `package.json` to ensure everything is in order
3. Run `npm run postpack` to restore `package.json`
4. Inspect `package.json` again
Using `npm pack`
1. Run `npm pack`
2. Inspect `package.json` to ensure it's not modified
3. Look for the `.tgz` file and extract it
4. Inspect `package/package.json` to ensure it's as expected.