| 
									
										
										
										
											2017-07-27 08:29:17 +01:00
										 |  |  | const fs = require('fs-extra'); | 
					
						
							|  |  |  | const glob = require('glob'); | 
					
						
							|  |  |  | const path = require('canonical-path'); | 
					
						
							|  |  |  | const shelljs = require('shelljs'); | 
					
						
							|  |  |  | const yargs = require('yargs'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const SHARED_PATH = path.resolve(__dirname, 'shared'); | 
					
						
							|  |  |  | const SHARED_NODE_MODULES_PATH = path.resolve(SHARED_PATH, 'node_modules'); | 
					
						
							|  |  |  | const BOILERPLATE_BASE_PATH = path.resolve(SHARED_PATH, 'boilerplate'); | 
					
						
							| 
									
										
										
										
											2017-08-22 21:31:15 +02:00
										 |  |  | const BOILERPLATE_COMMON_BASE_PATH = path.resolve(BOILERPLATE_BASE_PATH, 'common'); | 
					
						
							| 
									
										
										
										
											2017-07-27 08:29:17 +01:00
										 |  |  | const EXAMPLES_BASE_PATH = path.resolve(__dirname, '../../content/examples'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-22 21:31:15 +02:00
										 |  |  | const BOILERPLATE_PATHS = { | 
					
						
							|  |  |  |   cli: [ | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |     'src/environments/environment.prod.ts', 'src/environments/environment.ts', | 
					
						
							| 
									
										
										
										
											2019-05-09 15:56:24 -05:00
										 |  |  |     'src/assets/.gitkeep', 'browserslist', 'src/favicon.ico', 'karma.conf.js', | 
					
						
							|  |  |  |     'src/polyfills.ts', 'src/test.ts', 'tsconfig.app.json', 'tsconfig.spec.json', | 
					
						
							| 
									
										
										
										
											2020-02-13 16:58:04 +02:00
										 |  |  |     'tslint.json', 'e2e/src/app.po.ts', 'e2e/protractor-puppeteer.conf.js', | 
					
						
							|  |  |  |     'e2e/protractor.conf.js', 'e2e/tsconfig.json', '.editorconfig', 'angular.json', 'package.json', | 
					
						
							|  |  |  |     'tsconfig.json', 'tslint.json' | 
					
						
							| 
									
										
										
										
											2017-08-22 21:31:15 +02:00
										 |  |  |   ], | 
					
						
							|  |  |  |   systemjs: [ | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |     'src/systemjs-angular-loader.js', 'src/systemjs.config.js', 'src/tsconfig.json', | 
					
						
							|  |  |  |     'bs-config.json', 'bs-config.e2e.json', 'package.json', 'tslint.json' | 
					
						
							| 
									
										
										
										
											2017-08-22 21:31:15 +02:00
										 |  |  |   ], | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |   common: ['src/styles.css'] | 
					
						
							| 
									
										
										
										
											2017-08-22 21:31:15 +02:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2017-07-27 08:29:17 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-29 12:59:32 +01:00
										 |  |  | // All paths in this tool are relative to the current boilerplate folder, i.e boilerplate/i18n
 | 
					
						
							|  |  |  | // This maps the CLI files that exists in a parent folder
 | 
					
						
							|  |  |  | const cliRelativePath = BOILERPLATE_PATHS.cli.map(file => `../cli/${file}`); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  | BOILERPLATE_PATHS.i18n = [...cliRelativePath, 'angular.json', 'package.json']; | 
					
						
							| 
									
										
										
										
											2017-10-30 23:39:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  | BOILERPLATE_PATHS['service-worker'] = [...cliRelativePath, 'angular.json', 'package.json']; | 
					
						
							| 
									
										
										
										
											2019-01-10 22:08:51 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-12 20:12:17 +02:00
										 |  |  | BOILERPLATE_PATHS.testing = [ | 
					
						
							|  |  |  |   ...cliRelativePath, | 
					
						
							|  |  |  |   'angular.json', | 
					
						
							| 
									
										
										
										
											2019-06-18 07:59:54 -04:00
										 |  |  |   'tsconfig.app.json', | 
					
						
							|  |  |  |   'tsconfig.spec.json' | 
					
						
							| 
									
										
										
										
											2019-05-12 20:12:17 +02:00
										 |  |  | ]; | 
					
						
							| 
									
										
										
										
											2018-10-05 14:30:35 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  | BOILERPLATE_PATHS.universal = [...cliRelativePath, 'angular.json', 'package.json']; | 
					
						
							| 
									
										
										
										
											2018-07-16 22:52:59 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-20 15:10:47 +00:00
										 |  |  | BOILERPLATE_PATHS['getting-started'] = [ | 
					
						
							|  |  |  |   ...cliRelativePath, | 
					
						
							|  |  |  |   'src/styles.css' | 
					
						
							|  |  |  | ]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-05 21:20:05 +00:00
										 |  |  | BOILERPLATE_PATHS.ivy = { | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |   systemjs: ['rollup-config.js', 'tsconfig-aot.json'], | 
					
						
							| 
									
										
										
										
											2019-05-09 15:56:24 -05:00
										 |  |  |   cli: ['tsconfig.app.json'] | 
					
						
							| 
									
										
										
										
											2019-02-05 21:20:05 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-24 08:45:34 -08:00
										 |  |  | BOILERPLATE_PATHS.schematics = [ | 
					
						
							|  |  |  |   ...cliRelativePath, | 
					
						
							|  |  |  |   'angular.json' | 
					
						
							|  |  |  | ]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-22 14:30:31 -05:00
										 |  |  | BOILERPLATE_PATHS['cli-ajs'] = [ | 
					
						
							|  |  |  |   ...cliRelativePath, | 
					
						
							|  |  |  |   'package.json' | 
					
						
							|  |  |  | ]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-27 08:29:17 +01:00
										 |  |  | const EXAMPLE_CONFIG_FILENAME = 'example-config.json'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class ExampleBoilerPlate { | 
					
						
							|  |  |  |   /** | 
					
						
							|  |  |  |    * Add boilerplate files to all the examples | 
					
						
							|  |  |  |    */ | 
					
						
							| 
									
										
										
										
											2019-02-05 21:20:05 +00:00
										 |  |  |   add(ivy = false) { | 
					
						
							| 
									
										
										
										
											2017-07-27 08:29:17 +01:00
										 |  |  |     // Get all the examples folders, indicated by those that contain a `example-config.json` file
 | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |     const exampleFolders = | 
					
						
							|  |  |  |         this.getFoldersContaining(EXAMPLES_BASE_PATH, EXAMPLE_CONFIG_FILENAME, 'node_modules'); | 
					
						
							| 
									
										
										
										
											2017-07-27 08:29:17 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-05 21:20:05 +00:00
										 |  |  |     if (!fs.existsSync(SHARED_NODE_MODULES_PATH)) { | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |       throw new Error( | 
					
						
							|  |  |  |           `The shared node_modules folder for the examples (${SHARED_NODE_MODULES_PATH}) is missing.\n` + | 
					
						
							|  |  |  |           `Perhaps you need to run "yarn example-use-npm" or "yarn example-use-local" to install the dependencies?`); | 
					
						
							| 
									
										
										
										
											2019-02-05 21:20:05 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (ivy) { | 
					
						
							| 
									
										
										
										
											2019-10-16 23:07:01 +03:00
										 |  |  |       shelljs.exec(`yarn --cwd ${SHARED_PATH} ngcc --properties es2015 browser module main --first-only --create-ivy-entry-points`); | 
					
						
							| 
									
										
										
										
											2019-02-05 21:20:05 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     exampleFolders.forEach(exampleFolder => { | 
					
						
							|  |  |  |       const exampleConfig = this.loadJsonFile(path.resolve(exampleFolder, EXAMPLE_CONFIG_FILENAME)); | 
					
						
							| 
									
										
										
										
											2017-10-06 14:48:37 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-27 08:29:17 +01:00
										 |  |  |       // Link the node modules - requires admin access (on Windows) because it adds symlinks
 | 
					
						
							|  |  |  |       const destinationNodeModules = path.resolve(exampleFolder, 'node_modules'); | 
					
						
							|  |  |  |       fs.ensureSymlinkSync(SHARED_NODE_MODULES_PATH, destinationNodeModules); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-22 21:31:15 +02:00
										 |  |  |       const boilerPlateType = exampleConfig.projectType || 'cli'; | 
					
						
							|  |  |  |       const boilerPlateBasePath = path.resolve(BOILERPLATE_BASE_PATH, boilerPlateType); | 
					
						
							| 
									
										
										
										
											2017-07-27 08:29:17 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-22 21:31:15 +02:00
										 |  |  |       // Copy the boilerplate specific files
 | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |       BOILERPLATE_PATHS[boilerPlateType].forEach( | 
					
						
							|  |  |  |           filePath => this.copyFile(boilerPlateBasePath, exampleFolder, filePath)); | 
					
						
							| 
									
										
										
										
											2017-08-22 21:31:15 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |       // Copy the boilerplate common files
 | 
					
						
							| 
									
										
										
										
											2019-03-20 15:10:47 +00:00
										 |  |  |       const useCommonBoilerplate = exampleConfig.useCommonBoilerplate !== false; | 
					
						
							| 
									
										
										
										
											2019-05-12 20:12:17 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-20 15:10:47 +00:00
										 |  |  |       if (useCommonBoilerplate) { | 
					
						
							|  |  |  |         BOILERPLATE_PATHS.common.forEach(filePath => this.copyFile(BOILERPLATE_COMMON_BASE_PATH, exampleFolder, filePath)); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2019-02-05 21:20:05 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |       // Copy Ivy specific files
 | 
					
						
							| 
									
										
										
										
											2019-02-15 12:53:58 +01:00
										 |  |  |       if (ivy) { | 
					
						
							|  |  |  |         const ivyBoilerPlateType = boilerPlateType === 'systemjs' ? 'systemjs' : 'cli'; | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |         const ivyBoilerPlateBasePath = | 
					
						
							|  |  |  |             path.resolve(BOILERPLATE_BASE_PATH, 'ivy', ivyBoilerPlateType); | 
					
						
							|  |  |  |         BOILERPLATE_PATHS.ivy[ivyBoilerPlateType].forEach( | 
					
						
							|  |  |  |             filePath => this.copyFile(ivyBoilerPlateBasePath, exampleFolder, filePath)); | 
					
						
							| 
									
										
										
										
											2019-02-05 21:20:05 +00:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2017-07-27 08:29:17 +01:00
										 |  |  |     }); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /** | 
					
						
							|  |  |  |    * Remove all the boilerplate files from all the examples | 
					
						
							|  |  |  |    */ | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |   remove() { shelljs.exec('git clean -xdfq', {cwd: EXAMPLES_BASE_PATH}); } | 
					
						
							| 
									
										
										
										
											2017-07-27 08:29:17 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |   main() { | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |     yargs.usage('$0 <cmd> [args]') | 
					
						
							|  |  |  |         .command('add', 'add the boilerplate to each example', (yrgs) => this.add(yrgs.argv.ivy)) | 
					
						
							|  |  |  |         .command('remove', 'remove the boilerplate from each example', () => this.remove()) | 
					
						
							|  |  |  |         .demandCommand(1, 'Please supply a command from the list above') | 
					
						
							|  |  |  |         .argv; | 
					
						
							| 
									
										
										
										
											2017-07-27 08:29:17 +01:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   getFoldersContaining(basePath, filename, ignore) { | 
					
						
							|  |  |  |     const pattern = path.resolve(basePath, '**', filename); | 
					
						
							|  |  |  |     const ignorePattern = path.resolve(basePath, '**', ignore, '**'); | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |     return glob.sync(pattern, {ignore: [ignorePattern]}).map(file => path.dirname(file)); | 
					
						
							| 
									
										
										
										
											2017-07-27 08:29:17 +01:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   copyFile(sourceFolder, destinationFolder, filePath) { | 
					
						
							|  |  |  |     const sourcePath = path.resolve(sourceFolder, filePath); | 
					
						
							| 
									
										
										
										
											2017-10-30 23:39:58 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     // normalize path if needed
 | 
					
						
							|  |  |  |     filePath = this.normalizePath(filePath); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-27 08:29:17 +01:00
										 |  |  |     const destinationPath = path.resolve(destinationFolder, filePath); | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |     fs.copySync(sourcePath, destinationPath, {overwrite: true}); | 
					
						
							| 
									
										
										
										
											2017-07-27 08:29:17 +01:00
										 |  |  |     fs.chmodSync(destinationPath, 444); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-20 13:47:58 +00:00
										 |  |  |   loadJsonFile(filePath) { return fs.readJsonSync(filePath, {throws: false}) || {}; } | 
					
						
							| 
									
										
										
										
											2017-10-30 23:39:58 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |   normalizePath(filePath) { | 
					
						
							|  |  |  |     // transform for example ../cli/src/tsconfig.app.json to src/tsconfig.app.json
 | 
					
						
							|  |  |  |     return filePath.replace(/\.{2}\/\w+\//, ''); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2017-07-27 08:29:17 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module.exports = new ExampleBoilerPlate(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // If this file was run directly then run the main function,
 | 
					
						
							|  |  |  | if (require.main === module) { | 
					
						
							|  |  |  |   module.exports.main(); | 
					
						
							| 
									
										
										
										
											2017-08-22 21:31:15 +02:00
										 |  |  | } |