236 lines
6.3 KiB
Markdown
236 lines
6.3 KiB
Markdown
|
# @npmcli/package-json
|
||
|
|
||
|
[![npm version](https://img.shields.io/npm/v/@npmcli/package-json)](https://www.npmjs.com/package/@npmcli/package-json)
|
||
|
[![Build Status](https://img.shields.io/github/workflow/status/npm/package-json/node-ci)](https://github.com/npm/package-json)
|
||
|
|
||
|
Programmatic API to update `package.json` files. Updates and saves files the
|
||
|
same way the **npm cli** handles them.
|
||
|
|
||
|
## Install
|
||
|
|
||
|
`npm install @npmcli/package-json`
|
||
|
|
||
|
## Usage:
|
||
|
|
||
|
```js
|
||
|
const PackageJson = require('@npmcli/package-json')
|
||
|
const pkgJson = await PackageJson.load(path)
|
||
|
// $ cat package.json
|
||
|
// {
|
||
|
// "name": "foo",
|
||
|
// "version": "1.0.0",
|
||
|
// "dependencies": {
|
||
|
// "a": "^1.0.0",
|
||
|
// "abbrev": "^1.1.1"
|
||
|
// }
|
||
|
// }
|
||
|
|
||
|
pkgJson.update({
|
||
|
dependencies: {
|
||
|
a: '^1.0.0',
|
||
|
b: '^1.2.3',
|
||
|
},
|
||
|
workspaces: [
|
||
|
'./new-workspace',
|
||
|
],
|
||
|
})
|
||
|
|
||
|
await pkgJson.save()
|
||
|
// $ cat package.json
|
||
|
// {
|
||
|
// "name": "foo",
|
||
|
// "version": "1.0.0",
|
||
|
// "dependencies": {
|
||
|
// "a": "^1.0.0",
|
||
|
// "b": "^1.2.3"
|
||
|
// },
|
||
|
// "workspaces": [
|
||
|
// "./new-workspace"
|
||
|
// ]
|
||
|
// }
|
||
|
```
|
||
|
|
||
|
## API:
|
||
|
|
||
|
### `constructor()`
|
||
|
|
||
|
Creates a new empty instance of `PackageJson`.
|
||
|
|
||
|
---
|
||
|
|
||
|
### `async PackageJson.create(path)`
|
||
|
|
||
|
Creates an empty `package.json` at the given path. If one already exists
|
||
|
it will be overwritten.
|
||
|
|
||
|
---
|
||
|
|
||
|
### `async PackageJson.load(path, opts = {})`
|
||
|
|
||
|
Loads a `package.json` at the given path.
|
||
|
|
||
|
- `opts`: `Object` can contain:
|
||
|
- `create`: `Boolean` if true, a new package.json will be created if one does not already exist. Will not clobber ane existing package.json that can not be parsed.
|
||
|
|
||
|
### Example:
|
||
|
|
||
|
Loads contents of a `package.json` file located at `./`:
|
||
|
|
||
|
```js
|
||
|
const PackageJson = require('@npmcli/package-json')
|
||
|
const pkgJson = new PackageJson()
|
||
|
await pkgJson.load('./')
|
||
|
```
|
||
|
|
||
|
Throws an error in case a `package.json` file is missing or has invalid contents.
|
||
|
|
||
|
---
|
||
|
|
||
|
### **static** `async PackageJson.load(path)`
|
||
|
|
||
|
Convenience static method that returns a new instance and loads the contents of a `package.json` file from that location.
|
||
|
|
||
|
- `path`: `String` that points to the folder from where to read the `package.json` from
|
||
|
|
||
|
### Example:
|
||
|
|
||
|
Loads contents of a `package.json` file located at `./`:
|
||
|
|
||
|
```js
|
||
|
const PackageJson = require('@npmcli/package-json')
|
||
|
const pkgJson = await PackageJson.load('./')
|
||
|
```
|
||
|
|
||
|
---
|
||
|
|
||
|
### `async PackageJson.normalize()`
|
||
|
|
||
|
Intended for normalizing package.json files in a node_modules tree. Some light normalization is done to ensure that it is ready for use in `@npmcli/arborist`
|
||
|
|
||
|
- `path`: `String` that points to the folder from where to read the `package.json` from
|
||
|
- `opts`: `Object` can contain:
|
||
|
- `strict`: `Boolean` enables optional strict mode when applying the `normalizeData` step
|
||
|
- `steps`: `Array` optional normalization steps that will be applied to the `package.json` file, replacing the default steps
|
||
|
- `root`: `Path` optional git root to provide when applying the `gitHead` step
|
||
|
- `changes`: `Array` if provided, a message about each change that was made to the packument will be added to this array
|
||
|
|
||
|
---
|
||
|
|
||
|
### **static** `async PackageJson.normalize(path, opts = {})`
|
||
|
|
||
|
Convenience static that calls `load` before calling `normalize`
|
||
|
|
||
|
- `path`: `String` that points to the folder from where to read the `package.json` from
|
||
|
- `opts`: `Object` can contain:
|
||
|
- `strict`: `Boolean` enables optional strict mode when applying the `normalizeData` step
|
||
|
- `steps`: `Array` optional normalization steps that will be applied to the `package.json` file, replacing the default steps
|
||
|
- `root`: `Path` optional git root to provide when applying the `gitHead` step
|
||
|
- `changes`: `Array` if provided, a message about each change that was made to the packument will be added to this array
|
||
|
|
||
|
---
|
||
|
|
||
|
### `async PackageJson.prepare()`
|
||
|
|
||
|
Like `normalize` but intended for preparing package.json files for publish.
|
||
|
|
||
|
---
|
||
|
|
||
|
### **static** `async PackageJson.prepare(path, opts = {})`
|
||
|
|
||
|
Convenience static that calls `load` before calling `prepare`
|
||
|
|
||
|
- `path`: `String` that points to the folder from where to read the `package.json` from
|
||
|
- `opts`: `Object` can contain:
|
||
|
- `strict`: `Boolean` enables optional strict mode when applying the `normalizeData` step
|
||
|
- `steps`: `Array` optional normalization steps that will be applied to the `package.json` file, replacing the default steps
|
||
|
- `root`: `Path` optional git root to provide when applying the `gitHead` step
|
||
|
- `changes`: `Array` if provided, a message about each change that was made to the packument will be added to this array
|
||
|
|
||
|
---
|
||
|
|
||
|
### `async PackageJson.fix()`
|
||
|
|
||
|
Like `normalize` but intended for the `npm pkg fix` command.
|
||
|
|
||
|
---
|
||
|
|
||
|
### `PackageJson.update(content)`
|
||
|
|
||
|
Updates the contents of a `package.json` with the `content` provided.
|
||
|
|
||
|
- `content`: `Object` containing the properties to be updated/replaced in the
|
||
|
`package.json` file.
|
||
|
|
||
|
Special properties like `dependencies`, `devDependencies`,
|
||
|
`optionalDependencies`, `peerDependencies` will have special logic to handle
|
||
|
the update of these options, such as sorting and deduplication.
|
||
|
|
||
|
### Example:
|
||
|
|
||
|
Adds a new script named `new-script` to your `package.json` `scripts` property:
|
||
|
|
||
|
```js
|
||
|
const PackageJson = require('@npmcli/package-json')
|
||
|
const pkgJson = await PackageJson.load('./')
|
||
|
pkgJson.update({
|
||
|
scripts: {
|
||
|
...pkgJson.content.scripts,
|
||
|
'new-script': 'echo "Bom dia!"'
|
||
|
}
|
||
|
})
|
||
|
```
|
||
|
|
||
|
**NOTE:** When working with dependencies, it's important to provide values for
|
||
|
all known dependency types as the update logic has some interdependence in
|
||
|
between these properties.
|
||
|
|
||
|
### Example:
|
||
|
|
||
|
A safe way to add a `devDependency` AND remove all peer dependencies of an
|
||
|
existing `package.json`:
|
||
|
|
||
|
```js
|
||
|
const PackageJson = require('@npmcli/package-json')
|
||
|
const pkgJson = await PackageJson.load('./')
|
||
|
pkgJson.update({
|
||
|
dependencies: pkgJson.content.dependencies,
|
||
|
devDependencies: {
|
||
|
...pkgJson.content.devDependencies,
|
||
|
foo: '^foo@1.0.0',
|
||
|
},
|
||
|
peerDependencies: {},
|
||
|
optionalDependencies: pkgJson.content.optionalDependencies,
|
||
|
})
|
||
|
```
|
||
|
|
||
|
---
|
||
|
|
||
|
### **get** `PackageJson.content`
|
||
|
|
||
|
Getter that retrieves the normalized `Object` read from the loaded
|
||
|
`package.json` file.
|
||
|
|
||
|
### Example:
|
||
|
|
||
|
```js
|
||
|
const PackageJson = require('@npmcli/package-json')
|
||
|
const pkgJson = await PackageJson.load('./')
|
||
|
pkgJson.content
|
||
|
// -> {
|
||
|
// name: 'foo',
|
||
|
// version: '1.0.0'
|
||
|
// }
|
||
|
```
|
||
|
|
||
|
---
|
||
|
|
||
|
### `async PackageJson.save()`
|
||
|
|
||
|
Saves the current `content` to the same location used when calling
|
||
|
`load()`.
|
||
|
|
||
|
## LICENSE
|
||
|
|
||
|
[ISC](./LICENSE)
|
||
|
|