create-fite-app/index.js

181 lines
4.6 KiB
JavaScript
Raw Normal View History

2022-10-21 12:14:00 +08:00
#!/usr/bin/env node
2022-10-10 19:26:24 +08:00
/**
*
* @author yutent<yutent.io@gmail.com>
* @date 2022/10/10 15:17:36
*/
import { request } from 'https'
2022-10-21 11:59:49 +08:00
import { red, cyan, blue } from 'kolorist'
2022-10-21 11:46:50 +08:00
import prompts from 'prompts'
2022-10-10 19:26:24 +08:00
import fs from 'iofs'
2023-02-21 17:44:45 +08:00
import { resolve, join, dirname, normalize } from 'path'
2022-10-21 11:46:50 +08:00
import {
writePackageJson,
writeConfigFile,
writeGitIgnore,
writePrettierrc
} from './lib/demo-config.js'
2022-10-10 19:26:24 +08:00
import { writeHtmlFile } from './lib/demo-html.js'
import { writeLogo } from './lib/logo.js'
import {
writeMainJs,
writeAppVue,
writeHomeVue,
writeAboutVue,
writeHelloVue,
writeRouter,
writeStore
} from './lib/demo-js.js'
2023-02-25 22:22:11 +08:00
const NODE_VERSION = +process.versions.node.split('.').slice(0, 2).join('.')
2022-10-21 11:46:50 +08:00
const CURRENT_DIR = process.cwd()
2023-02-21 17:44:45 +08:00
const root = normalize(
dirname(import.meta.url.slice(process.platform === 'win32' ? 8 : 7))
2023-01-13 11:42:24 +08:00
)
2022-10-11 15:39:24 +08:00
2023-03-01 11:20:07 +08:00
const DEFAULT_NAME = 'fite-app'
2022-10-21 11:46:50 +08:00
let targetDir = ''
2023-02-25 22:22:11 +08:00
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()
}
2022-10-21 11:46:50 +08:00
function isEmpty(dir) {
let list = fs.ls(dir)
if (list && list.length) {
return false
}
return true
}
function getVueLiveVersion() {
return new Promise(yes => {
2023-03-01 11:20:07 +08:00
request('https://registry.npmmirror.com/fite', res => {
let data = ''
res.on('data', chunk => (data += chunk))
res.on('end', _ => {
try {
data = JSON.parse(data)
yes(data['dist-tags'].latest)
} catch (e) {
2023-03-01 11:20:07 +08:00
yes('0.3.1')
}
})
}).end()
})
}
2022-10-21 11:46:50 +08:00
function sleep(num = 1) {
return new Promise(resolve => setTimeout(resolve, num * 1000))
}
2022-10-10 19:26:24 +08:00
2022-10-21 11:46:50 +08:00
!(async function () {
2023-02-25 22:22:11 +08:00
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()
2022-10-21 11:46:50 +08:00
}
2023-02-25 22:22:11 +08:00
return null
}
2023-02-25 22:22:11 +08:00
},
{
name: 'isSPA',
type: 'toggle',
message: _ => `是否初始化为单页应用? (否则为多页应用)`,
initial: true,
active: '是',
inactive: '否'
}
])
2023-02-25 22:22:11 +08:00
console.log()
if (res.projectName === undefined) {
console.log('已取消操作~~')
process.exit()
}
2022-10-10 19:26:24 +08:00
2023-02-25 22:22:11 +08:00
if (res.projectName === '.') {
res.projectName = DEFAULT_NAME
}
2023-02-21 17:44:45 +08:00
2023-02-25 22:22:11 +08:00
targetDir = normalize(targetDir)
2022-10-10 19:26:24 +08:00
2023-02-25 22:22:11 +08:00
console.log('指定的项目名为: %s', cyan(res.projectName))
console.log('项目目录为: %s', cyan(targetDir))
2022-10-10 19:26:24 +08:00
2023-02-25 22:22:11 +08:00
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)
}
2022-10-10 19:26:24 +08:00
2023-02-25 22:22:11 +08:00
console.log(cyan('\n初始化项目...'))
2023-02-25 22:22:11 +08:00
let vueLiveVer = await getVueLiveVersion()
2022-10-10 19:26:24 +08:00
2023-02-25 22:22:11 +08:00
fs.mkdir(join(targetDir, 'src'))
2022-10-21 11:46:50 +08:00
2023-02-25 22:22:11 +08:00
console.log('[c---------]', '10%')
2022-10-21 11:46:50 +08:00
2023-02-25 22:22:11 +08:00
writePackageJson(join(targetDir, 'package.json'), res.projectName, vueLiveVer)
writeConfigFile(join(targetDir, 'vue.live.js'))
writeGitIgnore(join(targetDir, '.gitignore'))
writePrettierrc(join(targetDir, '.prettierrc.yaml'))
2022-10-21 11:46:50 +08:00
2023-02-25 22:22:11 +08:00
console.log('[ooc-------]', '30%')
2022-10-21 11:46:50 +08:00
2023-02-25 22:22:11 +08:00
writeHtmlFile(join(targetDir, 'index.html'))
2022-10-21 11:46:50 +08:00
2023-02-25 22:22:11 +08:00
writeLogo(join(targetDir, 'src/assets/logo.svg'))
fs.cp(join(root, 'lib/favicon.ico'), join(targetDir, 'public/favicon.ico'))
2022-10-21 11:46:50 +08:00
2023-02-25 22:22:11 +08:00
console.log('[oooooc----]', '60%')
2022-10-21 11:46:50 +08:00
2023-02-25 22:22:11 +08:00
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)
2022-10-21 11:46:50 +08:00
2023-02-25 22:22:11 +08:00
console.log('[oooooooooo]', '100%')
console.log(cyan('初始化完成, 可依次执行以下命令启动项目: '))
console.log(blue('npm i'))
console.log(blue('npm start'))
2022-10-21 11:46:50 +08:00
})()