| 
									
										
										
										
											2020-03-17 12:58:17 +01:00
										 |  |  | #!/usr/bin/env node
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * @license | 
					
						
							| 
									
										
										
										
											2020-05-19 12:08:49 -07:00
										 |  |  |  * Copyright Google LLC All Rights Reserved. | 
					
						
							| 
									
										
										
										
											2020-03-17 12:58:17 +01:00
										 |  |  |  * | 
					
						
							|  |  |  |  * 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; | 
					
						
							|  |  |  | } |