| 
									
										
										
										
											2017-03-15 22:41:15 +01:00
										 |  |  | const fs = fsExtra = require('fs-extra'); | 
					
						
							|  |  |  | const globby = require('globby'); | 
					
						
							|  |  |  | const path = require('path'); | 
					
						
							|  |  |  | const Q = require("q"); | 
					
						
							|  |  |  | const shelljs = require('shelljs'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-02 16:53:41 +02:00
										 |  |  | const EXAMPLES_PATH = path.join(__dirname, '/../../content/examples'); | 
					
						
							|  |  |  | const SHARED_PATH = path.join(__dirname, '/shared'); | 
					
						
							|  |  |  | const BOILERPLATE_PATH = path.join(SHARED_PATH, 'boilerplate'); | 
					
						
							| 
									
										
										
										
											2017-03-15 22:41:15 +01:00
										 |  |  | const EXAMPLES_TESTING_PATH = path.join(EXAMPLES_PATH, 'testing'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const files = { | 
					
						
							|  |  |  |   exampleBoilerplate: [ | 
					
						
							|  |  |  |     'src/styles.css', | 
					
						
							| 
									
										
										
										
											2017-03-28 19:29:47 +02:00
										 |  |  |     'src/systemjs-angular-loader.js', | 
					
						
							| 
									
										
										
										
											2017-03-15 22:41:15 +01:00
										 |  |  |     'src/systemjs.config.js', | 
					
						
							|  |  |  |     'src/tsconfig.json', | 
					
						
							|  |  |  |     'bs-config.json', | 
					
						
							|  |  |  |     'bs-config.e2e.json', | 
					
						
							|  |  |  |     'package.json', | 
					
						
							|  |  |  |     'tslint.json' | 
					
						
							|  |  |  |   ], | 
					
						
							|  |  |  |   exampleUnitTestingBoilerplate: [ | 
					
						
							|  |  |  |     'src/browser-test-shim.js', | 
					
						
							|  |  |  |     'karma-test-shim.js', | 
					
						
							|  |  |  |     'karma.conf.js' | 
					
						
							|  |  |  |   ], | 
					
						
							|  |  |  |   exampleConfigFilename: 'example-config.json' | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // requires admin access because it adds symlinks
 | 
					
						
							|  |  |  | function add() { | 
					
						
							| 
									
										
										
										
											2017-04-02 16:53:41 +02:00
										 |  |  |   const realPath = path.join(SHARED_PATH, '/node_modules'); | 
					
						
							| 
									
										
										
										
											2017-03-15 22:41:15 +01:00
										 |  |  |   const nodeModulesPaths = getNodeModulesPaths(EXAMPLES_PATH); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // we install the examples modules first
 | 
					
						
							|  |  |  |   installNodeModules(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   nodeModulesPaths.map((linkPath) => { | 
					
						
							|  |  |  |     fs.ensureSymlinkSync(realPath, linkPath); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return copyExampleBoilerplate(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function copyExampleBoilerplate() { | 
					
						
							|  |  |  |   console.log('Copying example boilerplate files'); | 
					
						
							|  |  |  |   const examplePaths = getExamplePaths(EXAMPLES_PATH); | 
					
						
							|  |  |  |   // Make boilerplate files read-only to avoid that they be edited by mistake.
 | 
					
						
							|  |  |  |   const destFileMode = '444'; | 
					
						
							|  |  |  |   let foo = copyFiles(files.exampleBoilerplate, BOILERPLATE_PATH, examplePaths, destFileMode) | 
					
						
							|  |  |  |     // copy the unit test boilerplate
 | 
					
						
							|  |  |  |     .then(() => { | 
					
						
							|  |  |  |       const unittestPaths = getUnitTestingPaths(EXAMPLES_PATH); | 
					
						
							|  |  |  |       return copyFiles(files.exampleUnitTestingBoilerplate, EXAMPLES_TESTING_PATH, unittestPaths, destFileMode); | 
					
						
							|  |  |  |     }) | 
					
						
							|  |  |  |     .catch((err) => { | 
					
						
							|  |  |  |       console.error(err); | 
					
						
							|  |  |  |       throw err; | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Copies fileNames into destPaths, setting the mode of the
 | 
					
						
							|  |  |  | // files at the destination as optional_destFileMode if given.
 | 
					
						
							|  |  |  | // returns a promise
 | 
					
						
							|  |  |  | function copyFiles(fileNames, originPath, destPaths, optional_destFileMode) { | 
					
						
							|  |  |  |   const copy = Q.denodeify(fsExtra.copy); | 
					
						
							|  |  |  |   const chmod = Q.denodeify(fsExtra.chmod); | 
					
						
							|  |  |  |   let copyPromises = []; | 
					
						
							|  |  |  |   destPaths.map((destPath) => { | 
					
						
							|  |  |  |     fileNames.forEach((fileName) => { | 
					
						
							|  |  |  |       const originName = path.join(originPath, fileName); | 
					
						
							|  |  |  |       const destName = path.join(destPath, fileName); | 
					
						
							|  |  |  |       let p = copy(originName, destName, { clobber: true}); | 
					
						
							|  |  |  |       if(optional_destFileMode !== undefined) { | 
					
						
							|  |  |  |         p = p.then(() => { | 
					
						
							|  |  |  |           return chmod(destName, optional_destFileMode); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       copyPromises.push(p); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return Q.all(copyPromises); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function getExamplePaths(basePath, includeBase) { | 
					
						
							|  |  |  |   // includeBase defaults to false
 | 
					
						
							|  |  |  |   return getPaths(basePath, files.exampleConfigFilename, includeBase); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function getFilenames(basePath, filename, includeBase) { | 
					
						
							|  |  |  |   let includePatterns = [path.join(basePath, "**/" + filename)]; | 
					
						
							|  |  |  |   if (!includeBase) { | 
					
						
							|  |  |  |     // ignore (skip) the top level version.
 | 
					
						
							|  |  |  |     includePatterns.push("!" + path.join(basePath, "/" + filename)); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   // ignore (skip) the files in BOILERPLATE_PATH.
 | 
					
						
							|  |  |  |   includePatterns.push("!" + path.join(BOILERPLATE_PATH, "/" + filename)); | 
					
						
							|  |  |  |   const nmPattern = path.join(basePath, "**/node_modules/**"); | 
					
						
							|  |  |  |   return globby.sync(includePatterns, {ignore: [nmPattern]}); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function getNodeModulesPaths(basePath) { | 
					
						
							|  |  |  |   return getExamplePaths(basePath).map((examplePath) => { | 
					
						
							|  |  |  |     return path.join(examplePath, "/node_modules"); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function getPaths(basePath, filename, includeBase) { | 
					
						
							|  |  |  |   const filenames = getFilenames(basePath, filename, includeBase); | 
					
						
							|  |  |  |   return filenames.map((fileName) => { | 
					
						
							|  |  |  |     return path.dirname(fileName); | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function getUnitTestingPaths(basePath) { | 
					
						
							|  |  |  |   const examples = getPaths(basePath, files.exampleConfigFilename, true); | 
					
						
							|  |  |  |   return examples.filter((example) => { | 
					
						
							|  |  |  |     const exampleConfig = fs.readJsonSync(`${example}/${files.exampleConfigFilename}`, {throws: false}); | 
					
						
							|  |  |  |     return exampleConfig && !!exampleConfig.unittesting; | 
					
						
							|  |  |  |   }); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function installNodeModules() { | 
					
						
							| 
									
										
										
										
											2017-04-02 16:53:41 +02:00
										 |  |  |   shelljs.exec('yarn', {cwd: SHARED_PATH}); | 
					
						
							| 
									
										
										
										
											2017-03-15 22:41:15 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function remove() { | 
					
						
							|  |  |  |   shelljs.exec('git clean -xdf', {cwd: EXAMPLES_PATH}); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module.exports = { | 
					
						
							|  |  |  |   add: add, | 
					
						
							|  |  |  |   remove: remove | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // being executed from shell script
 | 
					
						
							|  |  |  | switch (process.argv[2]) { | 
					
						
							|  |  |  |   case 'add': | 
					
						
							|  |  |  |     add(); | 
					
						
							|  |  |  |     break; | 
					
						
							|  |  |  |   case 'remove': | 
					
						
							|  |  |  |     remove(); | 
					
						
							|  |  |  |     break; | 
					
						
							|  |  |  |   default: | 
					
						
							|  |  |  |     console.error(`There is no function with the name: ${process.argv}`); | 
					
						
							|  |  |  | } |