77 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			77 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								#!/usr/bin/env node
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @license
							 | 
						||
| 
								 | 
							
								 * Copyright Google Inc. 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;
							 | 
						||
| 
								 | 
							
								}
							 |