@conecli/cone-cli
Version:
松果编辑器命令行工具
106 lines (94 loc) • 2.61 kB
JavaScript
/*
* @Description:
* @Author: cdtangxiejun
* @version:
* @Date: 2024-09-04 09:37:48
* @LastEditors: cdtangxiejun
* @LastEditTime: 2024-09-20 09:46:42
*/
'use strict'
const shell = require('shelljs')
const { homedir } = require('os')
const fs = require('fs-extra')
const path = require('path')
const chalk = require('chalk')
const config = require('../configs/conecli.json')
const { TEMPLATE_DIR } = require('../utils/const')
const logger = require('../utils/logger')
const packageConfig = require('../package.json')
const { downloadRepoByConfig, copySync } = require('../utils/util')
const inquirer = require('inquirer')
const mkdirp = require('mkdirp')
const { checkProjectName, hasGit } = require('../utils/env')
const generate = require('../utils/generate')
async function run(toDir, projectName) {
// 是否必须git 待验证
if (!hasGit()) {
logger.fatal(`${packageConfig.name} requires git, please install it.`)
}
// 下载cone-app-template模板
const templateTmp = path.join(homedir(), TEMPLATE_DIR, 'cone-app-template')
await downloadRepoByConfig(
'cone-app-template',
config['cone-app-template'],
templateTmp
).catch((err) => {
logger.fatal(err.message)
})
// render template files
const templatePath = templateTmp
const data = { projectName }
await generate(templatePath, toDir, data, [
'cone-module/**',
'cone-service/**',
'caddy/**',
'nginx/**',
'build/**',
'node_modules/**',
])
shell.cd(projectName)
shell.touch('.cone')
logger.success(chalk.green('cone env initialize completed'))
}
/**
* 初始化编辑器壳子工程
* @param {*} projectName
* @returns
*/
module.exports = async function initProjectAction(projectName) {
//工程位置是否替换当前文件夹目录,当没有给工程名时,认为需要替换
const inPlace = !projectName || projectName === '.'
const name = inPlace ? path.relative('../', process.cwd()) : projectName
// 工程目标位置
const toDir = path.resolve(projectName || '.')
checkProjectName(name)
// 如果存在,询问是否替换
if (fs.existsSync(toDir)) {
const answers = await inquirer
.prompt([
{
type: 'confirm',
message: inPlace
? 'Generate project in current directory?'
: 'Target directory exists. Continue?',
name: 'ok',
},
])
.catch(logger.fatal)
if (answers.ok) {
await run(toDir, name)
}
} else {
const made = mkdirp.sync(toDir)
if (made) {
await run(toDir, name)
} else {
logger.fatal(`create target directory ${toDir} failed`)
}
}
return {
destDir: toDir,
inPlace,
destDirName: name,
}
}