65 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			65 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | #!/usr/bin/env node
 | ||
|  | 
 | ||
|  | /** | ||
|  |  * Usage: | ||
|  |  * ```sh
 | ||
|  |  * node sync-boilerplate-dependencies | ||
|  |  * ```
 | ||
|  |  * | ||
|  |  * Updates the dependency versions of the top-level `package.json` files in each sub-folder of | ||
|  |  * `./boilerplate/` and `./boilerplate/viewengine/` to match the ones in `./package.json`. | ||
|  |  */ | ||
|  | const fs = require('fs'); | ||
|  | const path = require('path'); | ||
|  | 
 | ||
|  | 
 | ||
|  | const BOILERPLATE_DIR = `${__dirname}/boilerplate`; | ||
|  | const VIEWENGINE_DIR = `${BOILERPLATE_DIR}/viewengine`; | ||
|  | const SHARED_PACKAGE_JSON_PATH = `${__dirname}/package.json`; | ||
|  | 
 | ||
|  | const sharedPkgJson = loadJsonFile(SHARED_PACKAGE_JSON_PATH); | ||
|  | const boilerplatePkgJsonPaths = [ | ||
|  |   ...collectPackageJsonFiles(BOILERPLATE_DIR), | ||
|  |   ...collectPackageJsonFiles(VIEWENGINE_DIR), | ||
|  | ]; | ||
|  | 
 | ||
|  | boilerplatePkgJsonPaths.forEach(syncDependencies); | ||
|  | 
 | ||
|  | // Helpers
 | ||
|  | function collectPackageJsonFiles(dirPath) { | ||
|  |   return fs.readdirSync(dirPath) | ||
|  |       .map(childName => `${dirPath}/${childName}`) | ||
|  |       .filter(childPath => fs.statSync(childPath).isDirectory()) | ||
|  |       .map(subDirPath => `${subDirPath}/package.json`) | ||
|  |       .filter(pkgJsonPath => fs.existsSync(pkgJsonPath)); | ||
|  | } | ||
|  | 
 | ||
|  | function loadJsonFile(filePath) { | ||
|  |   return JSON.parse(fs.readFileSync(filePath, 'utf8')); | ||
|  | } | ||
|  | 
 | ||
|  | function syncDependencies(boilerplatePkgJsonPath) { | ||
|  |   console.log(`Syncing '${path.relative(__dirname, boilerplatePkgJsonPath)}'...`); | ||
|  | 
 | ||
|  |   const boilerplatePkgJson = loadJsonFile(boilerplatePkgJsonPath); | ||
|  | 
 | ||
|  |   ['dependencies', 'devDependencies', 'peerDependencies'] | ||
|  |     .filter(depsProp => boilerplatePkgJson.hasOwnProperty(depsProp)) | ||
|  |     .forEach(depsProp => { | ||
|  |       const srcDeps = sharedPkgJson[depsProp]; | ||
|  |       const dstDeps = boilerplatePkgJson[depsProp]; | ||
|  | 
 | ||
|  |       for (const dep of Object.keys(dstDeps)) { | ||
|  |         if (!srcDeps.hasOwnProperty(dep)) { | ||
|  |           throw new Error( | ||
|  |               `Unable to update dependency '${dep}' in '${boilerplatePkgJsonPath} > ${depsProp}'. ` + | ||
|  |               `The dependency is missing from '${SHARED_PACKAGE_JSON_PATH}'.`); | ||
|  |         } | ||
|  | 
 | ||
|  |         dstDeps[dep] = srcDeps[dep]; | ||
|  |       } | ||
|  |     }); | ||
|  | 
 | ||
|  |   fs.writeFileSync(boilerplatePkgJsonPath, `${JSON.stringify(boilerplatePkgJson, null, 2)}\n`); | ||
|  | } |