164 lines
3.9 KiB
JavaScript
Executable File
164 lines
3.9 KiB
JavaScript
Executable File
#!/usr/bin/env node
|
|
|
|
const Listr = require('listr')
|
|
const { program } = require('commander')
|
|
const chalk = require('chalk')
|
|
const prompts = require('prompts')
|
|
const path = require('path')
|
|
const figlet = require('figlet')
|
|
const package = require('./package.json')
|
|
const { copy, isPathInUse } = require('./helpers/copy')
|
|
const { install, initGit, checkPackageVersion } = require('./helpers/install')
|
|
const replace = require('./helpers/replace')
|
|
|
|
// Output path to create new portal app
|
|
let projectPath = ''
|
|
|
|
// Commander parameters to specify CLI behavior
|
|
program
|
|
.name(package.name)
|
|
.version(package.version)
|
|
.arguments('[dir]')
|
|
.usage(`${chalk.yellow('[dir]')}`)
|
|
.description({
|
|
dir: 'Directory to be used on install Portal.js',
|
|
})
|
|
.action((name) => (projectPath = name))
|
|
.option('--use-npm', 'Install dependencies using npm instead yarn')
|
|
.parse(process.argv)
|
|
|
|
/**
|
|
* Method to ask a custon name if was not passed as parameter
|
|
* returns the value passed from terminal input
|
|
*/
|
|
async function promptPath() {
|
|
return prompts({
|
|
type: 'text',
|
|
name: 'path',
|
|
message: 'Choose a name to your project',
|
|
initial: '',
|
|
validate: (name) => {
|
|
projectPath = name
|
|
if (isPathInUse(projectPath)) {
|
|
return `${chalk.yellow(
|
|
'Path ' +
|
|
chalk.redBright(projectPath) +
|
|
' is already in use and is not empty.'
|
|
)}`
|
|
}
|
|
return true
|
|
},
|
|
})
|
|
}
|
|
|
|
/**
|
|
* Main method to start CLI and validate inputs
|
|
*/
|
|
async function run() {
|
|
|
|
if(checkPackageVersion(program.useNpm? 'npm' : 'yarn')) {
|
|
console.log()
|
|
console.log(`${chalk.yellowBright('Your package manager version is outdated, please update before continue.')}`)
|
|
console.log()
|
|
return
|
|
}
|
|
|
|
if (typeof projectPath === 'string') {
|
|
projectPath = projectPath.trim()
|
|
}
|
|
|
|
if (!projectPath) {
|
|
const response = await promptPath()
|
|
if (typeof response.path === 'string') {
|
|
projectPath = response.path.trim()
|
|
}
|
|
}
|
|
|
|
if (!projectPath) {
|
|
//TODO separate log methods
|
|
console.log()
|
|
console.log('Please choose a name to your project:')
|
|
console.log()
|
|
console.log('Example:')
|
|
console.log(
|
|
`${chalk.cyan(program.name())} ${chalk.yellow('ny-portal-app')}`
|
|
)
|
|
console.log()
|
|
|
|
process.exit(1)
|
|
}
|
|
|
|
const root = path.join(__dirname + '/../portal')
|
|
|
|
if (isPathInUse(projectPath)) {
|
|
console.log()
|
|
console.log(
|
|
`${chalk.yellow(
|
|
'Path ' +
|
|
chalk.redBright(projectPath) +
|
|
' is already in use and is not empty.'
|
|
)}`
|
|
)
|
|
console.log()
|
|
process.exit(1)
|
|
}
|
|
|
|
// print a fancy Portal.js in the terminal
|
|
console.log(
|
|
chalk.yellow(figlet.textSync('Portal.Js', { horizontalLayout: 'full' }))
|
|
)
|
|
|
|
console.log()
|
|
console.log(`Creating new portal.js app in ${chalk.cyan(projectPath)}`)
|
|
console.log()
|
|
|
|
//Tasks workflow
|
|
const tasks = new Listr([
|
|
{
|
|
title: 'Fetching Content',
|
|
task: () => copy(root, projectPath),
|
|
},
|
|
{
|
|
title: 'Updating Content',
|
|
task: () => replace(projectPath),
|
|
},
|
|
{
|
|
title: 'Installing Dependencies',
|
|
task: () => install(projectPath, program.useNpm),
|
|
},
|
|
{
|
|
title: 'Git Init',
|
|
task: () => initGit(projectPath),
|
|
},
|
|
])
|
|
|
|
tasks.run().then(() => {
|
|
console.log()
|
|
console.log(`${chalk.greenBright('Instalation Completed Successfully')}`)
|
|
console.log()
|
|
console.log(
|
|
`Run ${chalk.cyan('cd ' + projectPath)} and ${chalk.green(program.useNpm ? 'npm run dev' : 'yarn dev')}`
|
|
)
|
|
console.log()
|
|
console.log('Enjoy =)')
|
|
})
|
|
}
|
|
|
|
//Main CLI execution workflow
|
|
run().catch((error) => {
|
|
console.log(error.name)
|
|
if (error.install) {
|
|
console.log()
|
|
console.log(
|
|
`${chalk.redBright('Error on Create App :')}${chalk.yellow(
|
|
error.message.toString()
|
|
)}`
|
|
)
|
|
} else {
|
|
console.log(`${chalk.red('Unexpected Error. Please report it as a bug')}`)
|
|
console.log(error)
|
|
}
|
|
console.log()
|
|
process.exit(1)
|
|
})
|