UNPKG

fgo-init

Version:

fgo project initializer

72 lines 3.48 kB
#!/usr/bin/env node //----------------------------------------------------------------- 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'); }); }); }); });