diff --git a/index.js b/index.js index 0840d33..8c178c7 100755 --- a/index.js +++ b/index.js @@ -28,17 +28,27 @@ import { writeStore } from './lib/demo-js.js' +const NODE_VERSION = +process.versions.node.split('.').slice(0, 2).join('.') const CURRENT_DIR = process.cwd() const root = normalize( dirname(import.meta.url.slice(process.platform === 'win32' ? 8 : 7)) ) -const VERSION = '1.0.1' const DEFAULT_NAME = 'vue-live-app' -let args = process.argv.slice(2) let targetDir = '' +if (NODE_VERSION < 16.6) { + console.log(red('Error: 你当前的环境不满足 Vue-live 构建工具的要求')) + console.log( + 'Vue-live 需要Node.js版本在 %s 以上, \n你当前的Node.js版本为: %s', + blue('v16.6.0'), + red(process.version), + '\n\n' + ) + process.exit() +} + function isEmpty(dir) { let list = fs.ls(dir) if (list && list.length) { @@ -68,125 +78,103 @@ function sleep(num = 1) { return new Promise(resolve => setTimeout(resolve, num * 1000)) } -function printHelp() { - console.log('Usage: vue-live-cli {command} [arguments]') - console.log(' ', 'vue-live-cli init', '初始化一个符合vue-live的vue项目') - console.log(' ', 'vue-live-cli -h[--help]', '打印帮助信息') - console.log() - process.exit() -} - !(async function () { - switch (args[0]) { - case '-v': - case '--version': - console.log('v' + VERSION) - break - - case '-h': - case '--help': - printHelp() - break - - default: - let res = await prompts([ - { - name: 'projectName', - type: 'text', - message: '项目名称(也是目录名, 只能为英文、数字、-):', - initial: DEFAULT_NAME, - validate: val => /^[a-zA-Z\d\-\.]+$/.test(val), - onState: ({ value }) => (targetDir = join(CURRENT_DIR, value)) - }, - { - name: 'shouldOverwrite', - type: _ => (isEmpty(targetDir) ? null : 'toggle'), - message: _ => - `目录 ${cyan(targetDir)} 非空, 是否${red('删除')}目录下所有的文件?`, - initial: false, - active: '是', - inactive: '否' - }, - { - name: 'confirmCheck', - type: shouldOverwrite => { - if (shouldOverwrite === false) { - console.log(red('✖') + ' 操作取消~~') - process.exit() - } - return null - } + let res = await prompts([ + { + name: 'projectName', + type: 'text', + message: '项目名称(也是目录名, 只能为英文、数字、-):', + initial: DEFAULT_NAME, + validate: val => /^[a-zA-Z\d\-\.]+$/.test(val), + onState: ({ value }) => (targetDir = join(CURRENT_DIR, value)) + }, + { + name: 'shouldOverwrite', + type: _ => (isEmpty(targetDir) ? null : 'toggle'), + message: _ => + `目录 ${cyan(targetDir)} 非空, 是否${red('删除')}目录下所有的文件?`, + initial: false, + active: '是', + inactive: '否' + }, + { + name: 'confirmCheck', + type: shouldOverwrite => { + if (shouldOverwrite === false) { + console.log(red('✖') + ' 操作取消~~') + process.exit() } - ]) - - console.log() - - if (res.projectName === undefined) { - console.log('已取消操作~~') - process.exit() + return null } + }, + { + name: 'isSPA', + type: 'toggle', + message: _ => `是否初始化为单页应用? (否则为多页应用)`, + initial: true, + active: '是', + inactive: '否' + } + ]) - if (res.projectName === '.') { - res.projectName = DEFAULT_NAME - } + console.log() - targetDir = normalize(targetDir) - - console.log('指定的项目名为: %s', cyan(res.projectName)) - console.log('项目目录为: %s', cyan(targetDir)) - - if (res.shouldOverwrite) { - console.log(red('目录非空, 1s 后将清空目录~~')) - await sleep(1) - let list = fs.ls(targetDir) - list.forEach(it => fs.rm(it, true)) - } else { - console.log(red('程序将在 1s 后初始化项目~~')) - await sleep(1) - } - - console.log(cyan('\n初始化项目...')) - - let vueLiveVer = await getVueLiveVersion() - - fs.mkdir(join(targetDir, 'src')) - - console.log('[c---------]', '10%') - - writePackageJson( - join(targetDir, 'package.json'), - res.projectName, - vueLiveVer - ) - writeConfigFile(join(targetDir, 'vue.live.js')) - writeGitIgnore(join(targetDir, '.gitignore')) - writePrettierrc(join(targetDir, '.prettierrc.yaml')) - - console.log('[ooc-------]', '30%') - - writeHtmlFile(join(targetDir, 'index.html')) - - writeLogo(join(targetDir, 'src/assets/logo.svg')) - fs.cp( - join(root, 'lib/favicon.ico'), - join(targetDir, 'public/favicon.ico') - ) - - console.log('[oooooc----]', '60%') - - writeMainJs(join(targetDir, 'src/main.js')) - writeAppVue(join(targetDir, 'src/app.vue')) - writeHomeVue(join(targetDir, 'src/views/home.vue')) - writeAboutVue(join(targetDir, 'src/views/about.vue')) - writeHelloVue(join(targetDir, 'src/components/hello.vue')) - writeRouter(join(targetDir, 'src/router.js')) - writeStore(join(targetDir, 'src/store.js'), vueLiveVer) - - console.log('[oooooooooo]', '100%') - console.log(cyan('初始化完成, 可依次执行以下命令启动项目: ')) - console.log(blue('npm i')) - console.log(blue('npm start')) - - break + if (res.projectName === undefined) { + console.log('已取消操作~~') + process.exit() } + + if (res.projectName === '.') { + res.projectName = DEFAULT_NAME + } + + targetDir = normalize(targetDir) + + console.log('指定的项目名为: %s', cyan(res.projectName)) + console.log('项目目录为: %s', cyan(targetDir)) + + if (res.shouldOverwrite) { + console.log(red('目录非空, 1s 后将清空目录~~')) + await sleep(1) + let list = fs.ls(targetDir) + list.forEach(it => fs.rm(it, true)) + } else { + console.log(red('程序将在 1s 后初始化项目~~')) + await sleep(1) + } + + console.log(cyan('\n初始化项目...')) + + let vueLiveVer = await getVueLiveVersion() + + fs.mkdir(join(targetDir, 'src')) + + console.log('[c---------]', '10%') + + writePackageJson(join(targetDir, 'package.json'), res.projectName, vueLiveVer) + writeConfigFile(join(targetDir, 'vue.live.js')) + writeGitIgnore(join(targetDir, '.gitignore')) + writePrettierrc(join(targetDir, '.prettierrc.yaml')) + + console.log('[ooc-------]', '30%') + + writeHtmlFile(join(targetDir, 'index.html')) + + writeLogo(join(targetDir, 'src/assets/logo.svg')) + fs.cp(join(root, 'lib/favicon.ico'), join(targetDir, 'public/favicon.ico')) + + console.log('[oooooc----]', '60%') + + writeMainJs(join(targetDir, 'src/main.js')) + writeAppVue(join(targetDir, 'src/app.vue')) + writeHomeVue(join(targetDir, 'src/views/home.vue')) + writeAboutVue(join(targetDir, 'src/views/about.vue')) + writeHelloVue(join(targetDir, 'src/components/hello.vue')) + writeRouter(join(targetDir, 'src/router.js')) + writeStore(join(targetDir, 'src/store.js'), vueLiveVer) + + console.log('[oooooooooo]', '100%') + console.log(cyan('初始化完成, 可依次执行以下命令启动项目: ')) + console.log(blue('npm i')) + console.log(blue('npm start')) })()