bun patch
Persistently patch node_modules packages in a git-friendly way
bun patch persistently patches packages in node_modules in a maintainable, git-friendly way.
Sometimes you need a small change to a package in node_modules/ to fix a bug or add a feature. bun patch lets you do this without vendoring the entire package.
Features:
- Generates
.patchfiles that Bun applies to dependencies innode_moduleson install .patchfiles can be committed to your repository and reused across installs, projects, and machines"patchedDependencies"inpackage.jsonkeeps track of patched packages- Patches packages in
node_modules/while preserving the integrity of Bun’s Global Cache - Test your changes locally before committing them with
bun patch --commit <pkg> - To preserve disk space and keep
bun installfast, patched packages are committed to the Global Cache and shared across projects where possible
Step 1. Prepare the package for patching
Use bun patch <pkg> to prepare the package for patching:
# you can supply the package name
bun patch react
# ...and a precise version in case multiple versions are installed
bun patch [email protected]
# or the path to the package
bun patch node_modules/reactDon’t skip bun patch <pkg>. It ensures the package folder in node_modules/ contains a fresh copy of the package with no symlinks or hardlinks to Bun’s cache.
If you skip it, you might end up editing the package globally in the cache.
Step 2. Test your changes locally
bun patch <pkg> makes it safe to edit <pkg> in node_modules/ directly, while preserving the integrity of Bun’s Global Cache. It works by re-creating an unlinked clone of the package in node_modules/ and diffing it against the original package in the Global Cache.
Step 3. Commit your changes
Once you’re happy with your changes, run bun patch --commit <path or pkg>.
Bun generates a patch file in patches/, updates your package.json and lockfile, and starts using the patched package:
# you can supply the path to the patched package
bun patch --commit node_modules/react
# ... or the package name and optionally the version
bun patch --commit [email protected]
# choose the directory to store the patch files
bun patch --commit react --patches-dir=mypatches
# `patch-commit` is available for compatibility with pnpm
bun patch-commit reactCLI Usage
bun patch <package>@<version>Patch Generation
--commitbooleanInstall a package containing modifications in dir
--patches-dirstringThe directory to put the patch file in (only if --commit is used)
Dependency Management
--productionbooleanDon’t install devDependencies. Alias: -p
--ignore-scriptsbooleanSkip lifecycle scripts in the project’s package.json (dependency scripts are never run)
--trustbooleanAdd to trustedDependencies in the project’s package.json and install the package(s)
--globalbooleanInstall globally. Alias: -g
--omitstringExclude dev, optional, or peer dependencies from install
Project Files & Lockfiles
--yarnbooleanWrite a yarn.lock file (yarn v1). Alias: -y
--no-savebooleanDon’t update package.json or save a lockfile
--savebooleandefault: trueSave to package.json (true by default)
--frozen-lockfilebooleanDisallow changes to lockfile
--save-text-lockfilebooleanSave a text-based lockfile
--lockfile-onlybooleanGenerate a lockfile without installing dependencies
Installation Control
--backendstringdefault: clonefilePlatform-specific optimizations for installing dependencies. Possible values: clonefile (default),
hardlink, symlink, copyfile
--linkerstringLinker strategy (one of isolated or hoisted)
--dry-runbooleanDon’t install anything
--forcebooleanAlways request the latest versions from the registry & reinstall all dependencies. Alias: -f
--no-verifybooleanSkip verifying integrity of newly downloaded packages
Network & Registry
--castringProvide a Certificate Authority signing certificate
--cafilestringSame as --ca, but as a file path to the certificate
--registrystringUse a specific registry by default, overriding .npmrc, bunfig.toml, and environment
variables
--network-concurrencynumberdefault: 48Maximum number of concurrent network requests (default 48)
Performance & Resource
--concurrent-scriptsnumberMaximum number of concurrent jobs for lifecycle scripts (default: 2x CPU cores)
Caching
--cache-dirstringStore & load cached data from a specific directory path
--no-cachebooleanIgnore manifest cache entirely
Output & Logging
--silentbooleanDon’t log anything
--quietbooleanOnly show tarball name when packing
--verbosebooleanExcessively verbose logging
--no-progressbooleanDisable the progress bar
--no-summarybooleanDon’t print a summary
Platform Targeting
--cpustringOverride CPU architecture for optional dependencies (e.g., x64, arm64, * for
all)
--osstringOverride operating system for optional dependencies (e.g., linux, darwin, * for
all)
Global Configuration & Context
--configstringSpecify path to config file (bunfig.toml). Alias: -c
--cwdstringSet a specific current working directory
Help
--helpbooleanPrint this help menu. Alias: -h