@sanpjs/create-sanp-app
Version:
@sanpjs/create-sanp-app
82 lines (80 loc) • 2.49 kB
JavaScript
const path = require('path');
const fse = require('fs-extra');
const prompts = require('prompts');
const {logger, boxen, color, ora, i18n} = require('@sanpjs/utils');
const Generator = require('@sanpjs/generator').default;
const $t = i18n({
ignoreKnown: true,
localesDir: path.join(__dirname, '../locales')
});
exports.default = async argv => {
const {cwd, args} = argv;
const version = require('../package').version;
const templatePath = path.join(__dirname, '../templates');
const choices = [];
const files = fse.readdirSync(templatePath);
let spinner = null;
files.forEach(file => {
!path.extname(file) &&
choices.push({
title: `${file} ${$t('project')}`,
value: file
});
});
const answers = args.tpl
? args
: await prompts([
{
type: 'select',
name: 'tpl',
message: $t('Select the type of project'),
initial: 0,
choices
}
]);
// generate template
const generate = new Generator({
templateDir: path.resolve(templatePath, answers.tpl),
outputDir: cwd,
templateVars: {version, ...args},
actions: [
{
type: 'add',
files: '**',
filters: {
'tsconfig.json': '!ts',
'typings.d.ts': '!ts'
}
},
{
type: 'move',
patterns: {
'**/**.ts': from => {
return args.ts ? from : from.replace(/\.ts$/, '.js');
}
}
},
{
type: 'move',
patterns: {
'**/_*': from => {
return from.replace(/\/_([^/]+)$/, '/.$1');
}
}
}
],
after: () => {
spinner && spinner.succeed($t('Generate complete!'));
logger.log(
boxen(
` Sanp ${version}
${$t('Run')} ${color.green('yarn')} ${$t('to install dependencies')}
${$t('Start with')} ${color.bold('yarn/npm start')}`,
{padding: 1, borderStyle: 'round'}
)
);
}
});
spinner = ora($t('Generating directory structure...')).start();
await generate.run();
};