@armor/create-armor-ui
Version:
A CLI tool for generating Armor UI apps.
173 lines (141 loc) • 6.46 kB
JavaScript
;
var _environments = _interopRequireDefault(require("./environments"));
var _angularCode = _interopRequireDefault(require("./angular-code"));
var _angularJson = _interopRequireDefault(require("./angular-json"));
var _npmInstalls = _interopRequireDefault(require("./npm-installs"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const program = require('commander');
const chalk = require('chalk');
const exec = require('child-process-promise').exec;
const oneLine = require('common-tags').oneLine;
const Listr = require('listr');
const fs = require('fs');
const requireText = require('require-text'); // Config Defaults
const packageJsonDefaults = require('../defaults/package-defaults');
const tslintConfigDefaults = require('../defaults/tslint');
const styleDefaults = require('../defaults/styles/styles-defaults');
const themeLightDefaults = require('../defaults/styles/theme-light-defaults');
const preCommitHooksDefaults = require('../defaults/git/pre-commit-hooks');
const preCommitConfigDefaults = require('../defaults/git/pre-commit-config');
const editorConfigDefaults = requireText('../defaults/ci-cd/.editorconfig', require);
const jenkinsFileDefaults = requireText('../defaults/ci-cd/Jenkinsfile', require);
const karmaConfDefaults = requireText('../defaults/ci-cd/karma.conf.js', require);
const validateCoverageFile = requireText('../defaults/ci-cd/validate-coverage', require);
const copyDistToS3Script = requireText('../defaults/ci-cd/copy-to-dist-s3.sh', require); // External Tasks
function create(name) {
return exec(oneLine`ng new ${name}
--style="scss"
--routing=true
--prefix="app"
--skip-git=true
`);
}
function addPreCommitHookFiles(ctx) {
fs.writeFileSync(`${ctx.name}/.pre-commit-hooks.yaml`, preCommitHooksDefaults);
fs.writeFileSync(`${ctx.name}/.pre-commit-config.yaml`, preCommitConfigDefaults);
}
function addCiCdFiles(ctx) {
exec(`mkdirp ${ctx.name}/tools/deploy ${ctx.name}/tools/karma`).then(() => {
fs.writeFileSync(`${ctx.name}/Jenkinsfile`, jenkinsFileDefaults);
fs.writeFileSync(`${ctx.name}/.editorconfig`, editorConfigDefaults);
fs.writeFileSync(`${ctx.name}/tools/deploy/copy-dist-to-s3.sh`, copyDistToS3Script);
fs.writeFileSync(`${ctx.name}/tools/karma/validate-coverage.js`, validateCoverageFile);
});
}
function addNpmScript(ctx) {
const pkg = JSON.parse(fs.readFileSync(`${ctx.name}/package.json`));
pkg.scripts = packageJsonDefaults;
fs.writeFileSync(`${ctx.name}/package.json`, JSON.stringify(pkg));
exec(`json -I -f ${ctx.name}/package.json`);
}
function overwriteTslintConfig(ctx) {
fs.writeFileSync(`${ctx.name}/tslint.json`, JSON.stringify(tslintConfigDefaults));
exec(`json -I -f ${ctx.name}/tslint.json`);
}
function overwriteKarmaConf(ctx) {
fs.writeFileSync(`${ctx.name}/karma.conf.js`, karmaConfDefaults);
}
function generateModule(ctx) {
return exec(`cd ${ctx.name} && ng generate module main --routing=true`);
}
function installStyles(ctx) {
fs.copyFileSync(`${ctx.name}/node_modules/@armor/brandkit/assets/preflight.css`, `${ctx.name}/src/assets/preflight.css`);
exec(`mkdirp ${ctx.name}/src/styles/themes`).then(() => {
fs.writeFileSync(`${ctx.name}/src/styles/styles.scss`, styleDefaults);
fs.writeFileSync(`${ctx.name}/src/styles/themes/theme-light.scss`, themeLightDefaults);
});
}
function addExampleComponent(ctx) {
// Default Components
const helloArmorComponentHtml = requireText('../defaults/hello-armor/hello-armor.component.html', require);
const helloArmorComponentTs = requireText('../defaults/hello-armor/hello-armor.component.ts', require);
const helloArmorComponentSpecTs = requireText('../defaults/hello-armor/hello-armor.component.spec.ts', require);
exec(`cd ${ctx.name} && ng generate component main/hello-armor --export=true --module main`).then(() => {
fs.writeFileSync(`${ctx.name}/src/app/main/hello-armor/hello-armor.component.ts`, helloArmorComponentTs);
fs.writeFileSync(`${ctx.name}/src/app/main/hello-armor/hello-armor.component.spec.ts`, helloArmorComponentSpecTs);
fs.writeFileSync(`${ctx.name}/src/app/main/hello-armor/hello-armor.component.html`, helloArmorComponentHtml);
});
}
function postInstall(ctx) {
const output = [chalk.green(`\nYour App '${ctx.name}' has been created! \n`), chalk.yellow('Next Steps:'), chalk.default(`- cd to ${ctx.name}/`), chalk.default('- init your git repo & push up to origin'), chalk.default('- install pre-commit \'pip install pre-commit\' (if you haven\'t already)'), chalk.default('- update .pre-commit-config.yaml to point to your new repo'), chalk.default('- run \'pre-commit install\''), chalk.default('- run \'npm run start\' to start your app (defaults to TDE)')];
console.log(output.join('\n'));
}
/**
* All the tasks we run to generate the app, some are defined in external
* modules. see 'External Tasks' above. Shorter tasks are in this file,
* below the Listr object.
* @type {Listr}
*/
const createTasks = new Listr([{
title: ' Generate App Via Angular CLI, This May Take A Few Minutes',
task: ctx => create(ctx.name)
}, {
title: ' Adding pre-commit-hook files',
task: ctx => addPreCommitHookFiles(ctx)
}, {
title: ' Adding CI/CD files',
task: ctx => addCiCdFiles(ctx)
}, {
title: ' Install @armor Modules',
task: ctx => _npmInstalls.default.dependencies(ctx)
}, {
title: ' Install @armor Peer Dependencies',
task: ctx => _npmInstalls.default.peers(ctx)
}, {
title: ' Add Npm Scripts',
task: ctx => addNpmScript(ctx)
}, {
title: ' Overwrite tslint.json',
task: ctx => overwriteTslintConfig(ctx)
}, {
title: ' Overwrite karma.conf.js',
task: ctx => overwriteKarmaConf(ctx)
}, {
title: ' Update Angular.json',
task: ctx => (0, _angularJson.default)(ctx.name)
}, {
title: ' Generate Module',
task: ctx => generateModule(ctx)
}, {
title: ' Install Default Styles',
task: ctx => installStyles(ctx)
}, {
title: ' Overwrite Angular Code',
task: ctx => (0, _angularCode.default)(ctx)
}, {
title: ' Install Armor Environments',
task: ctx => (0, _environments.default)(ctx)
}, {
title: ' Generate Example Component',
task: ctx => addExampleComponent(ctx)
}]);
program.version('0.0.1');
program.command('*').action(name => {
createTasks.run({
name
}).then(ctx => {
postInstall(ctx);
});
});
program.parse(process.argv);