Synchronizes
package.jsonfields and arbitrary files in a monorepo
- Auto-discovery of packages via
package.jsonworkspaces and/orlerna.json - Optional manual control of destination packages
- Helpful defaults
- Detailed "dry run" mode
- Summary of operations
- Sync arbitrary files (e.g.
README.md)
Requires Node.js >=22.5.1
npm install sync-monorepo-packages --save-devor
npx sync-monorepo-packages --helpsync-monorepo-packages v2.0.0
Synchronize files and metadata across packages in a monorepo
USAGE
$ sync-monorepo-packages [options]
OPTIONS
-D, --dry-run Do not sync; print what would have changed (implies --verbose) [boolean]
-f, --fields, --field Fields in source package.json to sync [string[]] default: ["keywords","author","repository","license","engines","publishConfig"]
--force Overwrite destination file(s) [boolean]
-l, --lerna Path to lerna.json, if any [string]
--no-package-json Sync package.json [boolean] default: true
-p, --packages Dirs/globs containing destination packages [string[]]
-s, --source Path to source package.json [string]
--no-summary Print summary [boolean] default: true
-v, --verbose Print change details [boolean]
-h, --help Show help information [boolean]
--version Show version number [boolean]
The library exports async generator functions that stream results as they happen:
import {
syncPackageJsons,
summarizePackageChanges,
syncFile,
summarizeFileCopies,
} from 'sync-monorepo-packages';
// Sync package.json fields
const pkgResults = [];
for await (const change of syncPackageJsons({dryRun: true})) {
console.log(change.toString());
pkgResults.push(change);
}
const summary = summarizePackageChanges(pkgResults);
if (summary.success) console.log(summary.success);
// Sync arbitrary files
const fileResults = [];
for await (const result of syncFile(['LICENSE', 'README.md'])) {
fileResults.push(result);
}
const fileSummary = summarizeFileCopies(fileResults);
if (fileSummary.success) console.log(fileSummary.success);- If there are other fields which would make sense to copy as a default, please suggest!
- Use at your own risk!
--dry-runis your friend - When copying files, directories may be created relative to the dirpath of
lerna.jsonorpackage.json. For example, if you want to syncfoo/bar.mdto each package,packages/*/foo/bar.mdwill be the result.
- ESM only. No CommonJS build. Use
importinstead ofrequire. - RxJS removed. The public API is now async iterables (
AsyncGenerator<T>) instead of RxJSObservable<T>. Thesummarize*functions now acceptT[]arrays and return a singleSummaryobject. yargsreplaced by@boneskull/bargs. No user-visible differences; same flags supported.- Node.js ≥ 22.5.1 required (was ≥ 18).
Copyright © 2019 Christopher Hiller. Licensed Apache-2.0