UNPKG

@armor/create-armor-ui

Version:

A CLI tool for generating Armor UI apps.

173 lines (141 loc) 6.46 kB
#!/usr/bin/env node "use strict"; 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);