ivue-cli
Version:
131 lines (106 loc) • 3.72 kB
JavaScript
const { getRepoList, getTagList } = require('./http')
const ora = require('ora')
const inquirer = require('inquirer')
const path = require('path')
const util = require('util')
const chalk = require('chalk')
const downloadGitRepo = require('download-git-repo') // 不支持Promise
// 添加加载动画
async function wrapLoading(fn, message, ...args) {
// 使用ora初始化,传入提示信息 message
const spinner = ora(message)
// 开始加载动画
spinner.start()
try {
// 执行传入方法 fn
const result = await fn(...args)
// 状态为修改为成功
spinner.succeed()
return result
} catch (error) {
// 状态为修改为失败
spinner.fail('Requset failed, refetch...')
}
}
class Generator {
constructor (name, targetDir){
// 目录名称
this.name = name;
// 创建位置
this.targetDir = targetDir;
// 对 download-git-repo 进行 promise 化改造
this.downloadGitRepo = util.promisify(downloadGitRepo)
}
// 下载远程模版
// 1) 拼接下载地址
// 2) 调用下载方法
async download(repo, tag) {
// 1) 拼接下载地址
// const requestUrl = `zhurong-cli/${repo}${tag?'#' + tag:''}`
const requestUrl = 'https://gitee.com/jianzhenghui/spa-template.git'
// 2)调用下载方法
await wrapLoading(
this.downloadGitRepo, // 远程下载方法
'waiting download template', // 加载提示信息
requestUrl, // 参数1: 下载地址
path.resolve(process.cwd(), this.targetDir)) // 参数2: 创建位置
}
// 获取用户选择的模板
// 1)从远程拉取模板数据
// 2)用户选择自己新下载的模板名称
// 3)return 用户选择的名称
async getRepo() {
// 1) 从远程仓库拉去模版数据
const repoList = await wrapLoading(getRepoList, 'waiting fetch template')
if(!repoList) return
// 过滤我们需要的模版名称
const repos = repoList.map(item => item.name)
// 2) 用户选择自己新下载的模版名称
const { repo } = await inquirer.prompt({
name: 'repo',
type: 'list',
choices: repos,
message: 'Please choose a template to create project'
})
// 3) return 用户选择的名称
return repo
}
// 获取用户选择的版本
// 1) 基于repo结果,远程拉去对应的tag列表
// 2)用户选择自己需要下载的tag
// 3) return 用户选择的tag
async getTag(repo) {
// 1)基于repo结果, 远程拉取对应的tag列表
const tags = await wrapLoading(getTagList, 'waiting fetch tag', repo)
if(!tags) return
// 过滤需要的tag名称
const tagsList = tags.map(item => item.name)
// 2) 用户选择自己需要下载的tag
const { tag } = await inquirer.prompt({
name: 'tag',
type: 'list',
choices: tagsList,
message: 'Please choose a tag to craete project'
})
// 3) return 用户选择的tag
return tag
}
// 核心创建逻辑
// 1) 获取模版名称
// 2) 获取tag名称
// 3) 下载模版到模版目录
// 核心创建逻辑
async create(){
// 1) 获取模版名称
const repo = await this.getRepo()
// 2) 获取tag名称
const tag = await this.getTag(repo)
// 3)下载模版到模版目录
await this.download(repo, tag)
// 4) 模版使用提示
console.log(`\r\nSuccessfully created project ${chalk.cyan(this.name)}`)
console.log(`\r\n cd ${chalk.cyan(this.name)}`)
console.log(' npm run dev\r\n')
}
}
module.exports = Generator