angular-cn/tools/inline-package-json-deps.js

77 lines
2.7 KiB
JavaScript

#!/usr/bin/env node
/**
* @license
* Copyright Google LLC All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/
/*
* Script that updates a dependencies in a specified `package.json` file to be
* based on the dependencies of the specified base `package.json`. This allows
* developers to sync dependencies between two `package.json` files without having
* to manually copy versions all the time.
*
* e.g. `/package.json` defines the project dependencies. The `dev-infra/package.json`
* uses a subset of these dependencies and declares these as dependencies for the shared
* package. The dependencies should be the same as the one from `/package.json` as those
* versions are used for testing and development. We don't want mismatching versions.
*/
const fs = require('fs');
const args = process.argv.slice(2);
const [inputPackageJsonPath, basePackageJsonPath, outputPath] = args;
const BASE_DEPENDENCY_MARKER = '<from-root>';
if (!inputPackageJsonPath || !basePackageJsonPath || !outputPath) {
console.error('Usage: ./inline-package-json-deps.js <input-pkg-json> <base-pkg-json> <out-path>');
process.exit(1);
}
const inputPackageJson = JSON.parse(fs.readFileSync(inputPackageJsonPath, 'utf8'));
const basePackageJson = JSON.parse(fs.readFileSync(basePackageJsonPath, 'utf8'));
const result = {...inputPackageJson};
if (inputPackageJson.dependencies) {
inlineDependenciesFromBase(inputPackageJson.dependencies);
}
if (inputPackageJson.peerDependencies) {
inlineDependenciesFromBase(inputPackageJson.peerDependencies);
}
fs.writeFileSync(outputPath, JSON.stringify(result, null, 2));
/**
* Updates dependencies which have their version set to the base marker,
* to match the version from the base `package.json` file.
*/
function inlineDependenciesFromBase(deps) {
Object.keys(deps).forEach(name => {
const value = deps[name];
if (value !== BASE_DEPENDENCY_MARKER) {
return;
}
const linkedVersion = getDependency(basePackageJson, name);
if (linkedVersion === null) {
console.error(`Could not find base version for: ${name}`);
console.error(
`Either set a version for ${name} in "${basePackageJsonPath}", or use ` +
`an explicit version in "${inputPackageJson}"`);
process.exit(1);
}
deps[name] = linkedVersion;
});
}
/** Gets the version of the specified package from the given package object. */
function getDependency(packageJson, name) {
if (packageJson.dependencies && packageJson.dependencies[name]) {
return packageJson.dependencies[name];
}
if (packageJson.devDependencies && packageJson.devDependencies[name]) {
return packageJson.devDependencies[name];
}
return null;
}