Node.js utilities and TypeScript definitions for package.json, tsconfig.json, and other configuration files.
# ✨ Auto-detect
npx nypm install pkg-types
# npm
npm install pkg-types
# yarn
yarn add pkg-types
# pnpm
pnpm add pkg-types
# bun
bun install pkg-types
# deno
deno install npm:pkg-typesReads any package file format (package.json, package.json5, or package.yaml) with automatic format detection.
import{readPackage}from"pkg-types";constlocalPackage=awaitreadPackage();// orconstpkg=awaitreadPackage("/fully/resolved/path/to/folder");Writes package data with format detection based on file extension.
import{writePackage}from"pkg-types";awaitwritePackage("path/to/package.json",pkg);awaitwritePackage("path/to/package.json5",pkg);awaitwritePackage("path/to/package.yaml",pkg);Finds the nearest package file (package.json, package.json5, or package.yaml).
import{findPackage}from"pkg-types";constfilename=awaitfindPackage();// orconstfilename=awaitfindPackage("/fully/resolved/path/to/folder");import{readPackageJSON}from"pkg-types";constlocalPackageJson=awaitreadPackageJSON();// orconstpackageJson=awaitreadPackageJSON("/fully/resolved/path/to/folder");import{writePackageJSON}from"pkg-types";awaitwritePackageJSON("path/to/package.json",pkg);import{resolvePackageJSON}from"pkg-types";constfilename=awaitresolvePackageJSON();// orconstpackageJson=awaitresolvePackageJSON("/fully/resolved/path/to/folder");Reads a package file and passes a proxied PackageJson to a callback (the callback may mutate it in-place or return a new object). The updated package is then written back using the same file format (.json/.json5/.yaml). The proxy auto-creates common map fields (e.g. scripts, dependencies) when accessed.
import{updatePackage}from"pkg-types";awaitupdatePackage("path/to/package",(pkg)=>{pkg.version="1.0.1";pkg.dependencies.lodash="^4.17.21";});Returns a new PackageJson that reorders known top-level fields according to the convention and alphabetically sorts certain nested maps (like dependencies, devDependencies, optionalDependencies, peerDependencies and scripts). Unknown top-level keys retain their original relative order. The input object is not mutated.
import{sortPackage}from"pkg-types";constsorted=sortPackage(pkg);Normalizes a PackageJson for stable output: sorts top-level fields and dependency maps, and removes dependency fields (dependencies, devDependencies, optionalDependencies, peerDependencies) if they are not plain objects. Returns a new normalized object.
import{normalizePackage}from"pkg-types";constnormalized=normalizePackage(pkg);import{readTSConfig}from"pkg-types";consttsconfig=awaitreadTSConfig();// orconsttsconfig2=awaitreadTSConfig("/fully/resolved/path/to/folder");import{writeTSConfig}from"pkg-types";awaitwriteTSConfig("path/to/tsconfig.json",tsconfig);import{resolveTSConfig}from"pkg-types";constfilename=awaitresolveTSConfig();// orconsttsconfig=awaitresolveTSConfig("/fully/resolved/path/to/folder");import{findFile}from"pkg-types";constfilename=awaitfindFile("README.md",{startingFrom: id,rootPattern: /^node_modules$/,test: (filename)=>filename.endsWith(".md"),});import{findNearestFile}from"pkg-types";constfilename=awaitfindNearestFile("package.json");import{findFarthestFile}from"pkg-types";constfilename=awaitfindFarthestFile("package.json");Find path to the lock file (yarn.lock, package-lock.json, pnpm-lock.yaml, npm-shrinkwrap.json, bun.lockb, bun.lock, deno.lock) or throws an error.
import{resolveLockfile}from"pkg-types";constlockfile=awaitresolveLockfile(".");Try to detect workspace dir by in order:
- Farthest workspace file (
pnpm-workspace.yaml,lerna.json,turbo.json,rush.json,deno.json,deno.jsonc) - Closest
.git/configfile - Farthest lockfile
- Farthest
package.jsonfile
If fails, throws an error.
import{findWorkspaceDir}from"pkg-types";constworkspaceDir=awaitfindWorkspaceDir(".");Finds closest .git/config file.
import{resolveGitConfig}from"pkg-types";constgitConfig=awaitresolveGitConfig(".");Finds and reads closest .git/config file into a JS object.
import{readGitConfig}from"pkg-types";constgitConfigObj=awaitreadGitConfig(".");Stringifies git config object into INI text format and writes it to a file.
import{writeGitConfig}from"pkg-types";awaitwriteGitConfig(".git/config",gitConfigObj);Parses a git config file in INI text format into a JavaScript object.
import{parseGitConfig}from"pkg-types";constgitConfigObj=parseGitConfig(gitConfigINI);Stringifies a git config object into a git config file INI text format.
import{stringifyGitConfig}from"pkg-types";constgitConfigINI=stringifyGitConfig(gitConfigObj);- Note: In order to make types work, you need to install
typescriptas a devDependency.
You can directly use typed interfaces:
importtype{TSConfig,PackageJson,GitConfig}from"pkg-types";You can use define utilities for type support and auto-completion when working in plain .js files. These functions simply return the input object but provide TypeScript type hints.
Provides type safety and auto-completion for package.json objects.
import{definePackageJSON}from"pkg-types";constpkg=definePackageJSON({name: "my-package",version: "1.0.0",// TypeScript will provide auto-completion here});Provides type safety and auto-completion for tsconfig.json objects.
import{defineTSConfig}from"pkg-types";consttsconfig=defineTSConfig({compilerOptions: {target: "ES2020",// TypeScript will provide auto-completion here},});Provides type safety and auto-completion for git config objects.
import{defineGitConfig}from"pkg-types";constgitConfig=defineGitConfig({user: {name: "John Doe",email: "john@example.com",},// TypeScript will provide auto-completion here});Published under the MIT license.
Made by @pi0, @danielroe and community 💛