UNPKG

jgb-cli

Version:

```shell npm i -g jgb-cli #全局安装 ```

121 lines (110 loc) 3.07 kB
import chalk from 'chalk'; import * as crypto from 'crypto'; import * as downloadRepo from 'download-git-repo'; import * as fs from 'fs'; import * as inquirer from 'inquirer'; import { logger } from 'jgb-shared/lib/Logger'; import * as path from 'path'; import * as rimraf from 'rimraf'; import * as tildify from 'tildify'; import * as home from 'user-home'; import checkVersion from '../utils/checkVersion'; import generate from '../utils/generate'; export default async function init( template: string, rawName: string, program: any ) { const inPlace = !rawName || rawName === '.'; const name = inPlace ? path.relative('../', process.cwd()) : rawName; const to = path.resolve(rawName || '.'); const clone = program.clone || false; const offline = program.offline || false; const tmp = path.join(home, '.jgb_templates', md5(template)); /** * use offline cache */ if (offline) { console.log(`> Use cached template at ${chalk.yellow(tildify(tmp))}`); template = tmp; } if (fs.existsSync(to)) { inquirer .prompt([ { type: 'confirm', message: inPlace ? 'Generate project in current directory?' : 'Target directory exists. Continue?', name: 'ok' } ]) .then(async (answers: any) => { if (answers.ok) { await run(); } }) .catch(); } else { await run(); } async function run() { if (isLocalPath(template)) { const templatePath = getTemplatePath(template); if (fs.existsSync(templatePath)) { await gen(templatePath); } else { logger.warning(`Local template "${template}" not found.`); } } else { await checkVersion(); await downloadAndGenerate(); } } async function downloadAndGenerate() { logger.info('downloading template ...'); if (fs.existsSync(tmp)) { await new Promise(resolve => { rimraf(tmp, resolve); }); } return new Promise(resolve => { logger.info(`template: ${template}`); downloadRepo(template, tmp, { clone }, async err => { if (err) { logger.error( 'Failed to download repo ' + template + ': ' + err.message.trim() ); return resolve(); } await gen(tmp); resolve(); }); }); } async function gen(templatePath: string) { generate(name, templatePath, to, err => { if (err) { logger.error(err); } console.log(); logger.info(`Generated "${name}".`); }); } } function isLocalPath(templatePath: string) { // templatePath example: // .jgb_templates // E:\workspace\jgb_templates\standard return /^[./]|(^[a-zA-Z]:)/.test(templatePath); } function getTemplatePath(templatePath: string) { return path.isAbsolute(templatePath) ? templatePath : path.normalize(path.join(process.cwd(), templatePath)); } function md5(str: string) { const hash = crypto.createHash('md5'); hash.update(str); return hash.digest('hex'); }