UNPKG

@boat/cli

Version:

A simple CLI to start your Boat projects

188 lines (163 loc) 6.7 kB
import * as shell from 'shelljs'; import * as program from 'commander'; import * as chalk from 'chalk'; import * as pathExists from 'path-exists'; import * as inquirer from 'inquirer'; import * as fs from 'fs'; import * as path from 'path'; export function generate(type?: string, name?: string) { if (type && name) { gen(type, name); } else { inquirer.prompt([{ type: 'list', choices: [ 'feature', 'interface', 'class', 'middleware' ], name: 'type', message: 'What would you like to generate?' }, { type: 'input', name: 'name', message: 'What would you like to name it?', validate: function (input: string) { if (input) { return true; } }, filter: function (input: string) { let item = input.replace(' ', '-'); return item; } }]).then(answers => { gen(answers.type, answers.name); }) } } function replaceAll(orig: string, search: string, replacement: string) { var target = orig; let resp = target.split(search).join(replacement); console.log(resp); return resp; }; function gen(type: string, name: string) { if (type == 'feature') { let names = nameOperator(name, 'feature'); let controllerPath = path.join(__dirname, '../generators/feature/controller.ts.tmpl'); let controller = fs.readFileSync(controllerPath, { encoding: 'utf-8' }); controller = replaceAll(controller, '$CAMEL_CASE', names.$CAMEL_CASE); controller = replaceAll(controller, '$HYPHEN_CASE', names.$HYPHEN_CASE); let featurePath = path.join(__dirname, '../generators/feature/feature.ts.tmpl'); let feature = fs.readFileSync(featurePath, { encoding: 'utf-8' }); feature = replaceAll(feature, '$CAMEL_CASE', names.$CAMEL_CASE); feature = replaceAll(feature, '$HYPHEN_CASE', names.$HYPHEN_CASE); let pt = path.join(process.cwd(), 'src/features/', names.$HYPHEN_CASE) if (!fs.existsSync(pt)) { fs.mkdirSync(pt); fs.writeFile(pt + '/' + names.$HYPHEN_CASE + '.controller.ts', controller); fs.writeFile(pt + '/' + names.$HYPHEN_CASE + '.feature.ts', feature); } else { console.log(chalk.red.bold('A feature with that name already exists.')); process.exit(1); } } else if (type == 'interface') { let names = nameOperator(name, 'interface'); let interfacePath = path.join(__dirname, '../generators/interface/interface.ts.tmpl'); let intf = fs.readFileSync(interfacePath, { encoding: 'utf-8' }); intf = replaceAll(intf, '$CAMEL_CASE', names.$CAMEL_CASE); let pt = path.join(process.cwd(), 'src/models/') if (!fs.existsSync(pt)) { fs.mkdirSync(pt); } if (!fs.existsSync(pt + '/' + names.$HYPHEN_CASE + '.interface.ts')) { fs.writeFile(pt + '/' + names.$HYPHEN_CASE + '.interface.ts', intf); } else { console.log(chalk.red.bold('An interface with that name already exists.')); process.exit(1); } } else if (type == 'class') { let names = nameOperator(name, 'class'); let classPath = path.join(__dirname, '../generators/class/class.ts.tmpl'); let klass = fs.readFileSync(classPath, { encoding: 'utf-8' }); klass = replaceAll(klass, '$CAMEL_CASE', names.$CAMEL_CASE); let pt = path.join(process.cwd(), 'src/models/') if (!fs.existsSync(pt)) { fs.mkdirSync(pt); } if (!fs.existsSync(pt + '/' + names.$HYPHEN_CASE + '.class.ts')) { fs.writeFile(pt + '/' + names.$HYPHEN_CASE + '.class.ts', klass); } else { console.log(chalk.red.bold('A class with that name already exists.')); process.exit(1); } } else if (type == 'middleware') { let names = nameOperator(name, 'middleware'); names.$CAMEL_CASE = lowercaseFirstLetter(names.$CAMEL_CASE); let middlewarePath = path.join(__dirname, '../generators/middleware/middleware.ts.tmpl'); let middleware = fs.readFileSync(middlewarePath, { encoding: 'utf-8' }); middleware = replaceAll(middleware, '$CAMEL_CASE', names.$CAMEL_CASE); let pt = path.join(process.cwd(), 'src/middlewares/') if (!fs.existsSync(pt)) { fs.mkdirSync(pt); } if (!fs.existsSync(pt + '/' + names.$HYPHEN_CASE + '.middleware.ts')) { fs.writeFile(pt + '/' + names.$HYPHEN_CASE + '.middleware.ts', middleware); } else { console.log(chalk.red.bold('A middleware with that name already exists.')); process.exit(1); } // } else if (type == 'module') { } else { console.error(chalk.red.bold('Invalid type')); } } function capitalizeFirstLetter(string: string) { return string.charAt(0).toUpperCase() + string.slice(1); } function lowercaseFirstLetter(string: string) { return string.charAt(0).toLowerCase() + string.slice(1); } export function nameOperator(name: string, type: string): cases { if (name.indexOf('-') > -1) { name = name.toLowerCase(); name = name.replace('-' + type.toLowerCase(), ''); shell.exec('echo ' + name); let nameArray: string[] = name.split(/\s*\-\s*/g); for (let i = 0; i < nameArray.length; i++) { nameArray[i] = capitalizeFirstLetter(nameArray[i]); } return { $CAMEL_CASE: nameArray.join(''), $HYPHEN_CASE: name } } else { // name = name.replace('-' + type, '').replace(type, ''); let s = name.replace(/([A-Z])/g, ' $1').trim().split(' '); let t = name.replace(/([A-Z])/g, ' $1').trim().split(' '); for (let i = 0; i < s.length; i++) { s[i] = s[i].toLowerCase(); if (s[i] == type.toLowerCase()) { s.splice(s.indexOf(type.toLowerCase()), 1); } else { s[i] = capitalizeFirstLetter(s[i]); } } for (let i = 0; i < t.length; i++) { t[i] = t[i].toLowerCase(); if (t[i] == type.toLowerCase()) { t.splice(t.indexOf(type.toLowerCase()), 1); } } return { $CAMEL_CASE: s.join(''), $HYPHEN_CASE: t.join('-') } } } interface cases { $CAMEL_CASE: string; $HYPHEN_CASE: string; }