think-cli
Version:
A simple CLI for scaffolding Thinkjs projects.
75 lines (65 loc) • 2.01 kB
JavaScript
const helper = require('think-helper');
const inquirer = require('inquirer');
const fs = require('fs');
const path = require('path');
const os = require('os');
const chalk = require('chalk');
const utils = require('../../lib/utils');
const getOptions = require('../../lib/options');
const logger = require('../../lib/logger');
/**
* Padding.
*/
console.log();
process.on('exit', function() {
console.log();
});
/**
* Start.
*/
const appRootPath = path.resolve('./');
if (!utils.isThinkApp(appRootPath)) {
logger.error(
'Please execute the command in the ' +
chalk.yellow.underline.bold('thinkjs project') +
' root directory'
);
}
const filepath = path.join(appRootPath, 'src/common');
const isMultiModule = helper.isDirectory(filepath);
const packageJSONPath = path.join(appRootPath, 'package.json');
const packageJSON = require(packageJSONPath);
const templateInfo = {
projectName: packageJSON.name || path.relative('../', process.cwd()),
templateName: 'think-template/standard',
clone: false,
isMultiModule
};
const metaConf = getOptions(path.join(__dirname, '../../default_template'), { name: templateInfo.projectName });
const prompts = utils.compose(addMultiModulePrompt, formatPrompts)(metaConf.prompts)(templateInfo);
inquirer
.prompt(prompts)
.then(metadata => {
packageJSON.thinkjs = Object.assign(templateInfo, { metadata });
fs.writeFileSync(packageJSONPath, Buffer.from(JSON.stringify(packageJSON, null, ' '), 'binary'));
console.log('');
logger.success('Migration successful');
});
function formatPrompts(prompts) {
return Object
.keys(prompts)
.map(key => Object.assign({ name: key }, prompts[key]));
}
function addMultiModulePrompt(prompts) {
return options => {
const multiModulePrompt = {
name: 'defaultModule',
type: 'string',
message: 'Please enter a default module name',
default: 'home'
};
return options.isMultiModule
? [...prompts, multiModulePrompt]
: prompts;
};
}