mirror of
https://github.com/filiprojek/nork.git
synced 2025-02-20 01:22:58 +01:00
207 lines
6.0 KiB
JavaScript
207 lines
6.0 KiB
JavaScript
#!/usr/bin/env node
|
|
const inquirer = require('inquirer')
|
|
const path = require('path')
|
|
const fs = require('fs-extra')
|
|
const colors = require('colors')
|
|
const pad = require('pad')
|
|
|
|
const langToLanguage = lang => {
|
|
switch (lang) {
|
|
case 'js':
|
|
return 'Javascript'
|
|
case 'ts':
|
|
return 'Typescript'
|
|
default:
|
|
return 'Unknown language'
|
|
}
|
|
}
|
|
|
|
const logError = errorMsg => {
|
|
console.log(colors.bgYellow.red(errorMsg))
|
|
return
|
|
}
|
|
|
|
const logSuccess = (msg = false) => {
|
|
if (!msg) {
|
|
msg = 'Success!'
|
|
}
|
|
console.log(colors.cyan(msg))
|
|
return
|
|
}
|
|
|
|
const logHelp = (specific = false, command = false) => {
|
|
let spc = 40
|
|
|
|
if (specific) {
|
|
// log specific help
|
|
if (specific == 'make') {
|
|
console.log(`Usage: ${specific}:[component]`)
|
|
console.log()
|
|
console.log(pad(' make:controller', spc), 'create a new controller')
|
|
console.log(pad(' make:middleware', spc), 'create a new middleware')
|
|
console.log(pad(' make:model', spc), 'create a new model')
|
|
console.log(pad(' make:route', spc), 'create a new route')
|
|
console.log(pad(' make:test', spc), 'create a new test')
|
|
console.log(pad(' make:view', spc), 'create a new view')
|
|
return
|
|
}
|
|
console.log(`Usage: ${specific} [options]`)
|
|
return
|
|
}
|
|
|
|
console.log('Usage: nork <command> [options]')
|
|
console.log()
|
|
console.log('Options:')
|
|
console.log(pad(' -v, --version', spc), 'output the version number')
|
|
console.log(pad(' -h, --help', spc), 'output usage information')
|
|
console.log()
|
|
console.log('Commands:')
|
|
console.log(pad(' create [app-name]', spc), 'create a new project')
|
|
console.log(pad(' make:controller', spc), 'create a new controller')
|
|
console.log(pad(' make:middleware', spc), 'create a new middleware')
|
|
console.log(pad(' make:model', spc), 'create a new model')
|
|
console.log(pad(' make:route', spc), 'create a new route')
|
|
console.log(pad(' make:test', spc), 'create a new test')
|
|
console.log(pad(' make:view', spc), 'create a new view')
|
|
|
|
console.log()
|
|
console.log(' Run', colors.cyan('nork help <command>'), 'for detailed usage of given command.')
|
|
|
|
if (command) {
|
|
console.log(colors.red('Unknown command'), colors.bold.blue(command))
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
;(async () => {
|
|
if (process.argv[2] == 'create') {
|
|
// get info about new project
|
|
const data = { lang: 'ts' }
|
|
const questions = [
|
|
{
|
|
type: 'input',
|
|
name: 'project_name',
|
|
message: 'Enter project name:',
|
|
},
|
|
{
|
|
type: 'list',
|
|
message: "Pick the technology you're using:",
|
|
name: 'lang',
|
|
choices: [
|
|
{ name: 'Typescript', value: 'ts' },
|
|
{ name: 'Javascript', value: 'js' },
|
|
],
|
|
},
|
|
{
|
|
type: 'input',
|
|
name: 'author',
|
|
message: 'Enter your name:',
|
|
},
|
|
]
|
|
// remove first question if project name is already known
|
|
if (process.argv[3]) {
|
|
questions.shift()
|
|
}
|
|
|
|
let answers = await inquirer.prompt(questions)
|
|
data.project_name = answers.project_name ? answers.project_name : process.argv[3]
|
|
data.lang = answers.lang
|
|
data.author = answers.author
|
|
|
|
// copy skeleton to new project
|
|
fs.copySync(path.join(__dirname, './skeletons/express-' + data.lang), process.cwd())
|
|
|
|
// edit package.json file
|
|
const pkgJson = require(path.join(process.cwd(), 'package.json'))
|
|
|
|
pkgJson.name = data.project_name
|
|
pkgJson.author = data.author
|
|
|
|
fs.writeFile(path.join(process.cwd(), 'package.json'), JSON.stringify(pkgJson, null, 2), err => {
|
|
if (err) return logError(err)
|
|
})
|
|
|
|
console.log(colors.yellow('Project settings'))
|
|
console.log(colors.yellow('------------------'))
|
|
console.log(pad(colors.gray('Project name: '), 30), data.project_name)
|
|
console.log(pad(colors.gray('Author: '), 30), data.author)
|
|
console.log(pad(colors.gray('Language: '), 30), langToLanguage(data.lang))
|
|
|
|
return logSuccess(`Project ${data.project_name} created successfully!`)
|
|
}
|
|
|
|
if (process.argv[2] == 'make') {
|
|
if (!process.argv[3] || !process.argv[4]) return logHelp('make')
|
|
|
|
const component = process.argv[3]
|
|
const norkcfg = require(path.join(process.cwd(), 'norkconfig.json'))
|
|
|
|
let tsComponents = ['controller', 'middleware', 'route']
|
|
|
|
if (tsComponents.includes(component)) {
|
|
let src = path.join(__dirname, './make-files/express-' + norkcfg.lang + '/' + component + '.' + norkcfg.lang)
|
|
let dest = path.join(process.cwd(), './src/' + component + 's' + '/' + process.argv[4] + '.' + norkcfg.lang)
|
|
|
|
try {
|
|
fs.copySync(src, dest, { overwrite: false, errorOnExist: true })
|
|
} catch (err) {
|
|
return logError(err.message)
|
|
}
|
|
return logSuccess()
|
|
}
|
|
|
|
if (component == 'model') {
|
|
let src = path.join(__dirname, './make-files/express-' + norkcfg.lang + '/' + component + '.js')
|
|
let dest = path.join(process.cwd(), './src/' + component + 's' + '/' + process.argv[4] + '.js')
|
|
|
|
try {
|
|
fs.copySync(src, dest, { overwrite: false, errorOnExist: true })
|
|
} catch (err) {
|
|
return logError(err.message)
|
|
}
|
|
return logSuccess()
|
|
}
|
|
|
|
if (component == 'view') {
|
|
let src = path.join(__dirname, './make-files/express-' + norkcfg.lang + '/' + component + '.ejs')
|
|
let dest = path.join(process.cwd(), './src/' + component + 's' + '/' + process.argv[4] + '.ejs')
|
|
|
|
try {
|
|
fs.copySync(src, dest, { overwrite: false, errorOnExist: true })
|
|
} catch (err) {
|
|
return logError(err.message)
|
|
}
|
|
return logSuccess()
|
|
}
|
|
|
|
if (component == 'test') {
|
|
let src = path.join(__dirname, './make-files/express-' + norkcfg.lang + '/' + component + '.js')
|
|
let dest = path.join(process.cwd(), './src/' + component + 's' + '/' + process.argv[4] + '.test.js')
|
|
|
|
try {
|
|
fs.copySync(src, dest, { overwrite: false, errorOnExist: true })
|
|
} catch (err) {
|
|
return logError(err.message)
|
|
}
|
|
return logSuccess()
|
|
}
|
|
}
|
|
|
|
if (process.argv[2] == '-v' || process.argv[2] == '--version') {
|
|
const pkgJson = require(path.join(__dirname, '../package.json'))
|
|
return console.log('nork', pkgJson.version)
|
|
}
|
|
|
|
if (process.argv[2] == 'help' || process.argv[2] == '-h' || process.argv[2] == '--help') {
|
|
if (process.argv[3]) {
|
|
return logHelp(process.argv[3])
|
|
}
|
|
return logHelp()
|
|
}
|
|
|
|
|
|
process.argv.splice(0, 2)
|
|
logHelp(false, process.argv.join(' '))
|
|
})()
|