#!/usr/bin/node /** * * @author yutent * @date 2022/10/10 15:17:36 */ import { red, cyan, blue, gray } from 'kolorist' import prompts from 'prompts' import fs from 'iofs' import { resolve, join, dirname } from 'path' import { writePackageJson, writeGitIgnore, writePrettierrc, writePm2File } from './lib/demo-config.js' import { writeMainJs, writeAppJs, writeModelJs } from './lib/demo-js.js' const CURRENT_DIR = process.cwd() const root = dirname( import.meta.url.slice(process.platform === 'win32' ? 10 : 7) ) const { version } = JSON.parse(fs.cat(join(root, './package.json'))) const DEFAULT_NAME = 'gm5-app' let args = process.argv.slice(2) let targetDir = '' function isEmpty(dir) { let list = fs.ls(dir) if (list && list.length) { return false } return true } function sleep(num = 1) { return new Promise(resolve => setTimeout(resolve, num * 1000)) } function printHelp() { console.log('Usage: create-five {command} [arguments]') console.log(' ', 'create-five init', '一个快速创建Five.js项目的小工具') console.log(' ', 'create-five -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 } } ]) console.log() if (res.projectName === undefined) { console.log('已取消操作~~') process.exit() } if (res.projectName === '.') { res.projectName = DEFAULT_NAME } 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初始化项目...')) console.log('[c---------]', '10%') fs.mkdir(join(targetDir, 'apps')) fs.mkdir(join(targetDir, 'models')) fs.mkdir(join(targetDir, 'config')) fs.mkdir(join(targetDir, 'data')) fs.mkdir(join(targetDir, 'public')) fs.mkdir(join(targetDir, 'views')) console.log('[ooc-------]', '30%') writePackageJson(join(targetDir, 'package.json'), res.projectName) writeGitIgnore(join(targetDir, '.gitignore')) writePrettierrc(join(targetDir, '.prettierrc.yaml')) writePm2File(join(targetDir, 'app.dev.yaml'), { name: res.projectName, env: 'development', cluster: false }) writePm2File(join(targetDir, 'app.yaml'), { name: res.projectName, cluster: false }) console.log('[oooooc----]', '60%') writeMainJs(join(targetDir, 'app.js')) writeAppJs(join(targetDir, 'apps/index.js')) writeModelJs(join(targetDir, 'models/index.js')) console.log('[oooooooooo]', '100%') console.log(cyan('初始化完成, 可依次执行以下命令启动项目: ')) console.log(blue('cd ' + res.projectName)) console.log(blue('npm i')) console.log(blue('pm2 start app.dev.yaml'), gray('# 开发模式')) console.log(blue('pm2 start app.yaml'), gray('# 生产模式')) console.log('访问地址: ', cyan('http://127.0.0.1:3000')) break } })()