2017-07-27 03:29:17 -04: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 15:31:15 -04:00
|
|
|
const BOILERPLATE_COMMON_BASE_PATH = path.resolve(BOILERPLATE_BASE_PATH, 'common');
|
2017-07-27 03:29:17 -04:00
|
|
|
const EXAMPLES_BASE_PATH = path.resolve(__dirname, '../../content/examples');
|
|
|
|
|
2017-08-22 15:31:15 -04:00
|
|
|
const BOILERPLATE_PATHS = {
|
|
|
|
cli: [
|
2019-03-20 09:47:58 -04:00
|
|
|
'src/environments/environment.prod.ts', 'src/environments/environment.ts',
|
2019-05-09 16:56:24 -04: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 09:58:04 -05: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 15:31:15 -04:00
|
|
|
],
|
|
|
|
systemjs: [
|
2019-03-20 09:47:58 -04: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 15:31:15 -04:00
|
|
|
],
|
2019-03-20 09:47:58 -04:00
|
|
|
common: ['src/styles.css']
|
2017-08-22 15:31:15 -04:00
|
|
|
};
|
2017-07-27 03:29:17 -04:00
|
|
|
|
2017-10-29 07:59:32 -04: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}`);
|
|
|
|
|
2020-04-09 04:42:19 -04:00
|
|
|
BOILERPLATE_PATHS.elements = [...cliRelativePath, 'package.json', 'src/polyfills.ts'];
|
2019-10-29 22:22:58 -04:00
|
|
|
|
2019-03-20 09:47:58 -04:00
|
|
|
BOILERPLATE_PATHS.i18n = [...cliRelativePath, 'angular.json', 'package.json'];
|
2017-10-30 18:39:58 -04:00
|
|
|
|
2019-03-20 09:47:58 -04:00
|
|
|
BOILERPLATE_PATHS['service-worker'] = [...cliRelativePath, 'angular.json', 'package.json'];
|
2019-01-10 15:08:51 -05:00
|
|
|
|
2019-05-12 14:12:17 -04:00
|
|
|
BOILERPLATE_PATHS.testing = [
|
|
|
|
...cliRelativePath,
|
|
|
|
'angular.json',
|
2019-06-18 07:59:54 -04:00
|
|
|
'tsconfig.app.json',
|
|
|
|
'tsconfig.spec.json'
|
2019-05-12 14:12:17 -04:00
|
|
|
];
|
2018-10-05 15:30:35 -04:00
|
|
|
|
2019-03-20 09:47:58 -04:00
|
|
|
BOILERPLATE_PATHS.universal = [...cliRelativePath, 'angular.json', 'package.json'];
|
2018-07-16 15:52:59 -04:00
|
|
|
|
2019-03-20 11:10:47 -04:00
|
|
|
BOILERPLATE_PATHS['getting-started'] = [
|
|
|
|
...cliRelativePath,
|
|
|
|
'src/styles.css'
|
|
|
|
];
|
|
|
|
|
2019-01-24 11:45:34 -05:00
|
|
|
BOILERPLATE_PATHS.schematics = [
|
|
|
|
...cliRelativePath,
|
|
|
|
'angular.json'
|
|
|
|
];
|
|
|
|
|
2019-05-22 15:30:31 -04:00
|
|
|
BOILERPLATE_PATHS['cli-ajs'] = [
|
|
|
|
...cliRelativePath,
|
|
|
|
'package.json'
|
|
|
|
];
|
|
|
|
|
2020-04-06 15:57:58 -04:00
|
|
|
BOILERPLATE_PATHS.viewengine = {
|
|
|
|
systemjs: ['rollup-config.js', 'tsconfig-aot.json'],
|
|
|
|
cli: ['tsconfig.json']
|
|
|
|
};
|
|
|
|
|
2017-07-27 03:29:17 -04:00
|
|
|
const EXAMPLE_CONFIG_FILENAME = 'example-config.json';
|
|
|
|
|
|
|
|
class ExampleBoilerPlate {
|
|
|
|
/**
|
|
|
|
* Add boilerplate files to all the examples
|
|
|
|
*/
|
2020-04-06 15:57:58 -04:00
|
|
|
add(viewengine = false) {
|
2017-07-27 03:29:17 -04:00
|
|
|
// Get all the examples folders, indicated by those that contain a `example-config.json` file
|
2019-03-20 09:47:58 -04:00
|
|
|
const exampleFolders =
|
|
|
|
this.getFoldersContaining(EXAMPLES_BASE_PATH, EXAMPLE_CONFIG_FILENAME, 'node_modules');
|
2017-07-27 03:29:17 -04:00
|
|
|
|
2019-02-05 16:20:05 -05:00
|
|
|
if (!fs.existsSync(SHARED_NODE_MODULES_PATH)) {
|
2019-03-20 09:47:58 -04:00
|
|
|
throw new Error(
|
|
|
|
`The shared node_modules folder for the examples (${SHARED_NODE_MODULES_PATH}) is missing.\n` +
|
2020-04-09 04:42:19 -04:00
|
|
|
'Perhaps you need to run "yarn example-use-npm" or "yarn example-use-local" to install the dependencies?');
|
2019-02-05 16:20:05 -05:00
|
|
|
}
|
|
|
|
|
2020-04-06 15:57:58 -04:00
|
|
|
if (!viewengine) {
|
2019-10-16 16:07:01 -04:00
|
|
|
shelljs.exec(`yarn --cwd ${SHARED_PATH} ngcc --properties es2015 browser module main --first-only --create-ivy-entry-points`);
|
2019-02-05 16:20:05 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
exampleFolders.forEach(exampleFolder => {
|
|
|
|
const exampleConfig = this.loadJsonFile(path.resolve(exampleFolder, EXAMPLE_CONFIG_FILENAME));
|
2017-10-06 09:48:37 -04:00
|
|
|
|
2017-07-27 03:29:17 -04: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 15:31:15 -04:00
|
|
|
const boilerPlateType = exampleConfig.projectType || 'cli';
|
|
|
|
const boilerPlateBasePath = path.resolve(BOILERPLATE_BASE_PATH, boilerPlateType);
|
2017-07-27 03:29:17 -04:00
|
|
|
|
2017-08-22 15:31:15 -04:00
|
|
|
// Copy the boilerplate specific files
|
2019-03-20 09:47:58 -04:00
|
|
|
BOILERPLATE_PATHS[boilerPlateType].forEach(
|
|
|
|
filePath => this.copyFile(boilerPlateBasePath, exampleFolder, filePath));
|
2017-08-22 15:31:15 -04:00
|
|
|
|
|
|
|
// Copy the boilerplate common files
|
2019-03-20 11:10:47 -04:00
|
|
|
const useCommonBoilerplate = exampleConfig.useCommonBoilerplate !== false;
|
2019-05-12 14:12:17 -04:00
|
|
|
|
2019-03-20 11:10:47 -04:00
|
|
|
if (useCommonBoilerplate) {
|
|
|
|
BOILERPLATE_PATHS.common.forEach(filePath => this.copyFile(BOILERPLATE_COMMON_BASE_PATH, exampleFolder, filePath));
|
|
|
|
}
|
2019-02-05 16:20:05 -05:00
|
|
|
|
2020-04-06 15:57:58 -04:00
|
|
|
// Copy ViewEngine (pre-Ivy) specific files
|
|
|
|
if (viewengine) {
|
|
|
|
const veBoilerPlateType = boilerPlateType === 'systemjs' ? 'systemjs' : 'cli';
|
|
|
|
const veBoilerPlateBasePath =
|
|
|
|
path.resolve(BOILERPLATE_BASE_PATH, 'viewengine', veBoilerPlateType);
|
|
|
|
BOILERPLATE_PATHS.viewengine[veBoilerPlateType].forEach(
|
|
|
|
filePath => this.copyFile(veBoilerPlateBasePath, exampleFolder, filePath));
|
2019-02-05 16:20:05 -05:00
|
|
|
}
|
2017-07-27 03:29:17 -04:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Remove all the boilerplate files from all the examples
|
|
|
|
*/
|
2019-03-20 09:47:58 -04:00
|
|
|
remove() { shelljs.exec('git clean -xdfq', {cwd: EXAMPLES_BASE_PATH}); }
|
2017-07-27 03:29:17 -04:00
|
|
|
|
|
|
|
main() {
|
2019-03-20 09:47:58 -04:00
|
|
|
yargs.usage('$0 <cmd> [args]')
|
2020-04-06 15:57:58 -04:00
|
|
|
.command('add', 'add the boilerplate to each example', yrgs => this.add(yrgs.argv.viewengine))
|
2019-03-20 09:47:58 -04:00
|
|
|
.command('remove', 'remove the boilerplate from each example', () => this.remove())
|
|
|
|
.demandCommand(1, 'Please supply a command from the list above')
|
|
|
|
.argv;
|
2017-07-27 03:29:17 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
getFoldersContaining(basePath, filename, ignore) {
|
|
|
|
const pattern = path.resolve(basePath, '**', filename);
|
|
|
|
const ignorePattern = path.resolve(basePath, '**', ignore, '**');
|
2019-03-20 09:47:58 -04:00
|
|
|
return glob.sync(pattern, {ignore: [ignorePattern]}).map(file => path.dirname(file));
|
2017-07-27 03:29:17 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
copyFile(sourceFolder, destinationFolder, filePath) {
|
|
|
|
const sourcePath = path.resolve(sourceFolder, filePath);
|
2017-10-30 18:39:58 -04:00
|
|
|
|
|
|
|
// normalize path if needed
|
|
|
|
filePath = this.normalizePath(filePath);
|
|
|
|
|
2017-07-27 03:29:17 -04:00
|
|
|
const destinationPath = path.resolve(destinationFolder, filePath);
|
2019-03-20 09:47:58 -04:00
|
|
|
fs.copySync(sourcePath, destinationPath, {overwrite: true});
|
2017-07-27 03:29:17 -04:00
|
|
|
fs.chmodSync(destinationPath, 444);
|
|
|
|
}
|
|
|
|
|
2019-03-20 09:47:58 -04:00
|
|
|
loadJsonFile(filePath) { return fs.readJsonSync(filePath, {throws: false}) || {}; }
|
2017-10-30 18:39:58 -04:00
|
|
|
|
|
|
|
normalizePath(filePath) {
|
|
|
|
// transform for example ../cli/src/tsconfig.app.json to src/tsconfig.app.json
|
|
|
|
return filePath.replace(/\.{2}\/\w+\//, '');
|
|
|
|
}
|
2017-07-27 03:29:17 -04: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 15:31:15 -04:00
|
|
|
}
|