Update package.json with ease
Update package.json with ease - Now with isomorphic support! ๐
A Node.js ES module library for programmatically reading, modifying, and writing package.json files with advanced version management capabilities.
โจ Now with isomorphic support! Use in browsers, serverless environments, or any JavaScript runtime without filesystem dependencies.
author.name)npm install --save update-pkg-extended
or
yarn add update-pkg-extended
or
pnpm add update-pkg-extended
Note: This package is an ES module and requires Node.js 18 or higher.
Use the isomorphic core to manipulate package.json data without filesystem dependencies:
import { Pkg } from 'update-pkg-extended/core'
// Create from existing package.json data
const packageData = {
name: 'my-package',
version: '1.0.0',
description: 'A sample package'
}
const pkg = new Pkg(packageData)
// Manipulate the data
pkg.set('author.name', 'John Doe')
pkg.version.newMinor() // 1.1.0
pkg.append('keywords', 'awesome')
// Get the updated JSON
const updatedJson = pkg.stringify()
console.log(updatedJson)
For Node.js environments with filesystem access:
import Pkg from 'update-pkg-extended'
// Traditional usage - reads from filesystem
const pkg = new Pkg()
// Update package.json fields
pkg.set('author.name', 'panz3r')
pkg.version.newMinor()
// Save to filesystem
pkg.saveSync()
// or async
await pkg.save()
Combine isomorphic data manipulation with filesystem operations:
import Pkg from 'update-pkg-extended'
// Start with provided data instead of reading from filesystem
const pkg = new Pkg('.', {
data: { name: 'my-app', version: '1.0.0' },
create: true
})
// Manipulate the data
pkg.set('description', 'My awesome app')
pkg.version.newPatch()
// Save to filesystem when ready
await pkg.save()
In environments without filesystem access:
import { Pkg } from 'update-pkg-extended/core'
// Fetch package.json from API or other source
const response = await fetch('/api/package-json')
const packageData = await response.json()
// Manipulate the data
const pkg = new Pkg(packageData)
pkg.set('version', '2.0.0')
pkg.set('scripts.build', 'webpack --mode=production')
// Send updated data back to API
const updatedData = pkg.data
await fetch('/api/package-json', {
method: 'PUT',
body: JSON.stringify(updatedData),
headers: { 'Content-Type': 'application/json' }
})
import Pkg from 'update-pkg-extended'
const pkg = new Pkg()
pkg.data //=> package.json object
// Update package.json fields
pkg.set('author.name', 'panz3r')
// Get version
pkg.version.get() // => '0.0.9'
// Update minor version
pkg.version.newMinor() // => '0.1.0'
// Save synchronously
pkg.saveSync()
// or using Promise
pkg.save().then(/* ... */)
const Pkg = require('update-pkg-extended').default
const pkg = new Pkg()
// ... rest of the usage is the same
update-pkg-extended - Main entry point, exports Node.js version for backward compatibilityupdate-pkg-extended/core - Isomorphic core, works in any JavaScript environmentupdate-pkg-extended/node - Explicit Node.js version with filesystem operations(From update-pkg-extended/core)
Create a new isomorphic Pkg instance for manipulating package.json data.
Type: object
Optional package.json data object.
Type: object
Type: object
Alternative way to provide package.json data: new Pkg({ data: packageJson })
Create a new Node.js Pkg instance with filesystem support.
Type: string
Default: './'
Directory where a package.json can be found or will be created.
Type: boolean
Default: false
Create package.json when it does not exist.
Type: object
Provide package.json data directly instead of reading from filesystem (isomorphic mode).
Type: object
Default: {}
The package.json data object.
Set value by the given keyPath using dot notation.
pkg.set('author.name', 'panz3r')
pkg.set('scripts.test', 'ava')
Get value by the given keyPath. Returns defaultValue if keyPath is not found.
pkg.get('author.name') // => 'panz3r'
pkg.get('nonexistent', 'default') // => 'default'
Update keyPath value using updateFn function.
updateFn is invoked with the current keyPath value.
Append value to the given keyPath.
Prepend value to the given keyPath.
Type: Version
Manage version field in a semver-compatible way
Return formatted version (0.0.3) if segment is not specified, otherwise returns the required segment
Type: string
Default: undefined
Specify required version segment, should be one of major, minor, patch, prerelease or prelease (backward compatibility)
Increment major version and reset all others fields
pkg.version.get() // => '0.0.3'
// New major version
pkg.version.newMajor() // => '1.0.0'
Increment minor version and reset patch field
pkg.version.get() // => '0.0.3'
// New minor version
pkg.version.newMinor() // => '0.1.0'
Increment or set major
pkg.version.get() // => '0.0.3'
// Increment major version
pkg.version.major() // => '1.0.3'
// Set major version to specified value
pkg.version.major(3) // => '3.0.3'
Increment or set minor version
pkg.version.get() // => '0.0.3'
// Increment minor version
pkg.version.minor() // => '0.1.3'
// Set minor version to specified value
pkg.version.minor(3) // => '0.3.3'
Increment or set patch version
pkg.version.get() // => '0.0.3'
// Increment minor version
pkg.version.patch() // => '0.0.4'
// Set minor version to specified value
pkg.version.patch(9) // => '0.0.9'
Increment or set prerelease version
pkg.version.get() // => '0.0.3'
// Set prerelease version to specified value
pkg.version.prerelease('beta', 9) // => '0.0.3-beta.9'
// Increment prerelease version
pkg.version.prerelease('beta') // => '0.0.4-beta.0'
// Increment prerelease version
pkg.version.prerelease('beta') // => '0.0.4-beta.1'
N.B: Bumping prerelease version when it is not set will also bump patch version
Type: function
Return: Promise
Save data to package.json.
Type: function
Return: this
Save data to package.json synchronously.
(Available in both isomorphic and Node.js versions)
Type: function
Return: string
Get the package.json content as a formatted JSON string.
Type: number
Default: 2
Number of spaces for indentation.
import { Pkg } from 'update-pkg-extended/core'
const pkg = new Pkg({ name: 'test', version: '1.0.0' })
const jsonString = pkg.stringify()
// Returns formatted JSON string with newline at end
The v6.x release introduces isomorphic support while maintaining full backward compatibility.
// This continues to work exactly as before
import Pkg from 'update-pkg-extended'
const pkg = new Pkg()
pkg.set('version', '2.0.0')
pkg.saveSync()
// For environments without filesystem access
import { Pkg } from 'update-pkg-extended/core'
const pkg = new Pkg({ name: 'my-app', version: '1.0.0' })
pkg.set('description', 'My awesome app')
const updatedJson = pkg.stringify()
// Combine provided data with filesystem operations
import Pkg from 'update-pkg-extended'
const pkg = new Pkg('.', {
data: { name: 'my-app', version: '1.0.0' },
create: true
})
pkg.set('description', 'Updated')
await pkg.save()
None! This release is fully backward compatible.
update-pkg-extended/core for browser/serverless usagedata option/core and /node sub-imports| Environment | Entry Point | Filesystem | Notes |
|---|---|---|---|
| Node.js | update-pkg-extended |
โ | Full traditional support |
| Browser | update-pkg-extended/core |
โ | Isomorphic core only |
| Serverless | update-pkg-extended/core |
โ | Perfect for edge functions |
| Deno/Bun | update-pkg-extended/core |
โ | Use isomorphic core |
| Web Workers | update-pkg-extended/core |
โ | Manipulate data only |
This project is written in TypeScript and features comprehensive TypeScript support with full type definitions.
The library exports the following main types:
Pkg - Available from both core and node entry points (isomorphic or Node.js functionality)PkgCore - Isomorphic core class (also exported as Pkg from core entry)Version - Version manipulation classPkgCoreOptions - Options for creating a core Pkg instancePkgOptions - Options for creating a Node.js Pkg instance (extends PkgCoreOptions)PackageData - Type definition for package.json structureVersionSegment - Type for version segments ('major' | 'minor' | 'patch' | 'prerelease' | 'prelease')import Pkg, { PkgOptions, VersionSegment } from 'update-pkg-extended'
import { Pkg as CorePkg } from 'update-pkg-extended/core'
// Node.js usage with filesystem
const nodeOptions: PkgOptions = { create: true, data: { name: 'test' } }
const nodePkg = new Pkg('./my-project', nodeOptions)
// Isomorphic usage
const corePkg = new CorePkg({ name: 'isomorphic-pkg', version: '1.0.0' })
// Type-safe version segment access
const segment: VersionSegment = 'major'
const majorVersion = corePkg.version.get(segment)
// Type-safe property setting
corePkg.set('author.name', 'TypeScript Developer')
corePkg.set('engines.node', '>=18')
// Get formatted output
const jsonString: string = corePkg.stringify()
This project uses TypeScript and requires a build step:
# Install dependencies
pnpm install
# Build TypeScript to JavaScript
pnpm run build
# Run tests
pnpm test
# Run tests with coverage
pnpm run coverage
pnpm run build - Compile TypeScript to JavaScript in dist/ folderpnpm run clean - Remove compiled dist/ folderpnpm test - Build and run all testspnpm run coverage - Run tests with 100% coverage requirementVersion feature is inspired by ciena-blueplanetโs versionyMade with :sparkles: & :heart: by Mattia Panzeri and contributors