#!/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 = ''; if (!inputPackageJsonPath || !basePackageJsonPath || !outputPath) { console.error('Usage: ./inline-package-json-deps.js '); 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; }