multi-package-json-manager
v1.0.8
Published
Manage and update multiple package.json files. Useful for monorepos among other things
Downloads
20
Maintainers
Readme
Multi Package Json Manager
Manage multiple package.json files. Usefull for monorepos and other stuff.
Example usage
Creating an instance and providing options
let rootPath = resolve(__dirname, '..');
let manager = new Manager(rootPath);
// add packages by using a glob file string, relative to rootPath
manager.addPackageJsons('packages/*/package.json');
// you can enable a test run and provide a output dir to write all JSON files to a test directory
manager.enableTestRun(true, '.jsonTestOutput');
// You can set key order priority as well as spaces/indent to use for the formatted output
manager.setIndent(4);
manager.setKeyOrder([
'name',
'private',
'version',
'description',
'author',
'license',
'main',
'type',
'types',
'typings',
'homepage',
'scripts',
'dependencies',
'devDependencies',
'optionalDependencies',
'peerDependencies',
'author',
'keywords',
])
Using variables
You can add variables that can be used when setting package.json values, as is shown below
manager.addVariables({
email : '[email protected]',
name : 'Robin Radic',
github: {
urls : {
organisation : 'https://github.com/robinradic',
organisationIO: 'https://robinradic.github.io',
},
repository: 'npm-packages',
owner : 'robinradic',
},
});
Managing package.json's
manager
// set(path:string, value:any, fileFilter?: FileFilterCallback)
// is without any typechecking and can be a dot-notated path
.set('author', {
email: '{{email}}',
name : '{{name}}',
url : '{{github.urls.organisation}}',
})
// setKey<K extends keyof PackageJson>(key: K, value: T[K], fileFilter?: FileFilterCallback)
// Uses type checking for both key and value and provides code-completion
.setKey('bugs', {
email: '[email protected]',
url : '{{github.urls.organisation}}/{{github.repository}}/issues',
})
// merge(value: PackageJson, fileFilter?: FileFilterCallback)
// Uses type checking for both key and value and provides code-completion
.merge({
homepage: '{{github.urls.organisationIO}}/{{github.repository}}/packages/{{dirName}}',
})
.setKey('license', 'MIT')
.setKey('engines', {
node: '>=12',
})
.setKey('os', [ 'linux', 'darwin' ], (details) => {
let tuxOnlyPackages = ['@radic/console','package-b'];
return details.pkg.name.includes(tuxOnlyPackages) === false;
})
.setKey('private', false)
.setKey('publishConfig', {
access: 'public',
})
.setKey('repository', {
type : 'git',
url : '{{github.urls.organisation}}.git',
directory: 'packages/{{dirName}}',
})
Filter a change
Each of these methods have a last optional fileFilter?: FileFilterCallback
parameter that you can provide with a filter callback
manager.setKey('os', [ 'linux', 'darwin' ], (details) => {
let tuxOnlyPackages = ['@radic/console','package-b'];
return details.pkg.name.includes(tuxOnlyPackages) === false;
})
The callback and it's details parameter:
export type FileFilterCallback = (fileDetails: FilePackageDetails) => boolean
export interface FilePackageDetails {
absoluteFilePath: string;
relativeFilePath: string;
dirName: string;
pkg: PackageJson;
names: {
hasScope:boolean
/** @example @company/my-package */
full:string
/** @example @company */
scope: string
/** @example company */
scopeName: string
/** @example my-package */
withoutScope: string
}
}
Applying all changes
The hardest part is to run the manager
manager.run();