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.
- π Isomorphic: Works in browsers, Node.js, serverless, and any JavaScript environment
- π Filesystem Support: Optional Node.js filesystem operations for traditional workflows
- π― Version Management: Advanced semantic version manipulation with prerelease support
- π Method Chaining: Fluent API for streamlined package.json manipulation
- π§ Dot Notation: Deep property access using dot notation (e.g.,
author.name) - π¦ TypeScript: Full TypeScript support with comprehensive type definitions
- π§ͺ 100% Test Coverage: Thoroughly tested with comprehensive test suite
npm install --save update-pkg-extendedor
yarn add update-pkg-extendedor
pnpm add update-pkg-extendedNote: 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 sameupdate-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 endThe 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.
- β¨ Isomorphic Core: Import from
update-pkg-extended/corefor browser/serverless usage - π§ Data Option: Pass package.json data directly via the
dataoption - π¦ New Entry Points: Access specific functionality via
/coreand/nodesub-imports - π― stringify() Method: Convert package data to formatted JSON string
| 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 asPkgfrom 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 coveragepnpm run build- Compile TypeScript to JavaScript indist/folderpnpm run clean- Remove compileddist/folderpnpm test- Build and run all testspnpm run coverage- Run tests with 100% coverage requirement
- Original codebase credits goes to EGOIST's update-pkg
Versionfeature is inspired by ciena-blueplanet's versiony
Made with β¨ & β€οΈ by Mattia Panzeri and contributors