fgo-init
Version:
fgo project initializer
72 lines • 3.48 kB
JavaScript
//----------------------------------------------------------------- phase 1 : check folder
const fs = require('fs');
const ph = require('path');
const root = ph.resolve('.');
if (fs.readdirSync(root).length > 0) {
console.error('not empty directory, process faluire');
process.exit(1);
}
//----------------------------------------------------------------- phase 2 : project informations
const calculateProjectName = function(s) {
var resp = s.trim().toLowerCase().replace(/[^a-z]+/gm,' ').trim().split(' ').filter((item)=>{return item.trim()!='';});
if (resp.length == 0) throw new Error('wrong project name : ' + s);
if (resp[0] != 'fgo') resp.unshift('fgo');
return resp.join('-');
};
const calculateProjectDescription = function(s) {
var resp = s.trim().toLowerCase().replace(/[^a-z]+/gm,' ').trim().split(' ').filter((item)=>{return item.trim()!='';});
if (resp.length == 0) throw new Error('wrong project description : ' + s);
if (resp[0] != 'fgo') resp.unshift('fgo');
return resp.join(' ');
};
const calculateProjectKeywords = function(s) {
var resp = s.trim().toLowerCase().replace(/[^a-z]+/gm,' ').trim().split(' ').filter((item)=>{return item.trim()!='';});
if (resp.length == 0) throw new Error('wrong project keywords : ' + s);
if (resp[0] != 'fgo') resp.unshift('fgo');
var unique = [];
resp.forEach(item => {
if (unique.indexOf(item)<0) unique.push(item);
});
return unique;
};
const readline = require('readline').createInterface({
input: process.stdin,
output: process.stdout
});
const info = {
name: calculateProjectName(ph.basename(root)),
description: null,
keywords: null
};
readline.question('project name (' + info.name + ') : ',(answer)=>{
if (typeof answer == 'string' && answer.trim() != '')
info.name = calculateProjectName(answer.trim());
readline.pause();
info.description = calculateProjectDescription(info.name);
readline.question('project description (' + info.description + ') : ',(answer)=>{
if (typeof answer == 'string' && answer.trim() != '')
info.description = calculateProjectDescription(answer.trim());
readline.pause();
info.keywords = calculateProjectKeywords(info.name + ' ' + info.description);
readline.question('project keywords (' + info.keywords.join(',') + ') : ',(answer)=>{
if (typeof answer == 'string' && answer.trim() != '')
info.keywords = calculateProjectKeywords(answer.trim());
readline.close();
const AdmZip = require('adm-zip');
const template = new AdmZip(ph.join(__dirname,'template.zip'));
template.extractAllToAsync(root,true,true,(error)=>{
if (error instanceof Error) throw error;
console.log('generating with info :',info);
const exec = require('child_process').exec;
exec('npm install --save-dev @types/node typescript rimraf');
var pkg = JSON.parse(fs.readFileSync('package.json','utf8'));
pkg.name = info.name;
pkg.description = info.description;
pkg.keywords = info.keywords;
fs.writeFileSync('package.json',JSON.stringify(pkg,null,2),'utf8');
console.log('generated successfully');
});
});
});
});