UNPKG

create-phtml-plugin

Version:
3 lines (2 loc) 8.3 kB
#!/usr/bin/env node function _interopDefault(e){return e&&"object"==typeof e&&"default"in e?e.default:e}var path=_interopDefault(require("path")),fs=_interopDefault(require("fs")),child_process=require("child_process"),https=_interopDefault(require("https")),os=_interopDefault(require("os")),readline=_interopDefault(require("readline"));const dash=/^--([^\s]+)$/;var args=process.argv.slice(2).reduce((e,t,r,s)=>(dash.test(t)?e[t.replace(dash,"$1")]=!(r+1 in s)||s[r+1]:dash.test(s[r-1])||e.to||(e.to=t),e),{});const colors={reset:"",bold:"",dim:"",underline:"",blink:"",reverse:"",hidden:"",black:"",red:"",green:"",yellow:"",blue:"",magenta:"",cyan:"",white:"",bgBlack:"",bgRed:"",bgGreen:"",bgYellow:"",bgBlue:"",bgMagenta:"",bgCyan:"",bgWhite:""},reset=colors.reset;var color=Object.keys(colors).reduce((e,t)=>{const r=colors[t];return e[t]=(e=>r+e.replace(reset,reset+r)+reset),e},{});const fse={};function copyTemplateDir(e,t,r){return fse.readdir(e).then(s=>Promise.all(s.map(s=>fse.lstat(path.resolve(e,s)).then(a=>a.isFile()?fse.readFile(path.join(e,s),"utf8").then(e=>e.replace(keys,(e,t)=>t in r?r[t]:e).replace(patchPkg,"")).then(e=>fse.writeFile(path.join(t,patchNpmIgnore(s)),e)):fse.mkdir(path.resolve(t,s)).then(()=>copyTemplateDir(path.resolve(e,s),path.resolve(t,s),r))))))}function patchNpmIgnore(e){return".npmignore"===e?".gitignore":e}["access","appendFile","chmod","chown","close","exists","fchmod","fchown","fdatasync","fstat","fsync","ftruncate","futimes","lchmod","lchown","link","lstat","mkdtemp","open","read","readdir","readFile","readlink","realpath","rename","rmdir","stat","symlink","truncate","unlink","utimes","write","write"].forEach(e=>(fse[e]=((t,...r)=>new Promise((s,a)=>fs[e](t,...r,(e,...t)=>{e?a(e):s(...t)}))),fse)),["mkdir","writeFile"].forEach(e=>{fse[e]=((t,...r)=>new Promise((s,a)=>{fs[e](t,...r,i=>{i&&"ENOENT"===i.code?fse.mkdir(path.dirname(t)).then(()=>fse[e](t,...r)).then(s):i&&"EEXIST"!==i.code?a(i):s()})}))}),["mkdirSync","writeFileSync"].forEach(e=>{fse[e]=((t,...r)=>{try{fs[e](t,...r)}catch(s){if(s&&"ENOENT"===s.code)fse.mkdirSync(path.dirname(t)),fse[e](t,...r);else if(s&&"EEXIST"!==s.code)throw s}})}),fse.copydir=((e,t)=>fse.mkdir(t).then(()=>fse.readdir(e)).then(r=>Promise.all(r.map(r=>{const s=path.resolve(e,r),a=path.resolve(t,r);return fse.lstat(s).then(e=>e.isDirectory()?fse.copydir(s,a):fse.copyFile(s,a))})).then(()=>Promise.resolve()))),fse.copydirSync=((e,t)=>{fse.mkdirSync(t),fse.readdirSync(e).forEach(r=>{const s=path.resolve(e,r),a=path.resolve(t,r);fse.lstatSync(s).isDirectory()?fse.copydirSync(s,a):fse.copyFileSync(s,a)})}),fse.copyFile=((e,t)=>fse.touchFile(t).then(()=>new Promise((r,s)=>{const a=fse.createReadStream(path.resolve(e)),i=fse.createWriteStream(path.resolve(t));function o(e){a.destroy(),i.end(),s(e)}a.on("error",o),i.on("error",o),i.on("finish",r),a.pipe(i)}))),fse.copyFileSync=((e,t)=>{fse.mkdirSync(path.dirname(t));const r=Buffer.alloc(65536);let s=1,a=0;const i=fs.openSync(e,"r"),o=fs.openSync(t,"w");for(;s>0;)s=fs.readSync(i,r,0,65536,a),fs.writeSync(o,r,0,s),a+=s;fs.closeSync(i),fs.closeSync(o)}),fse.readJson=(e=>fse.readFile(e,"utf8").then(JSON.parse)),fse.readJsonSync=(e=>JSON.parse(fse.readFileSync(e,"utf8"))),fse.rmdir=(e=>new Promise((t,r)=>{fs.rmdir(e,s=>{s&&"ENOTEMPTY"===s.code?t(fse.readdir(e).then(t=>Promise.all(t.map(t=>{const r=path.resolve(e,t);return fse.lstat(r).then(e=>e.isDirectory()?fse.rmdir(r):fse.unlink(r))}))).then(()=>fse.rmdir(e))):s?r(s):t()})})),fse.rmdirSync=(e=>{try{fs.rmdirSync(e)}catch(t){if(!t||"ENOTEMPTY"!==t.code)throw t;fse.readdirSync(e).forEach(t=>{const r=path.resolve(e,t);fse.lstatSync(r).isDirectory()?fse.rmdirSync(r):fse.unlinkSync(r)}),fse.rmdirSync(e)}}),fse.touchFile=(e=>new Promise((t,r)=>{fs.open(e,"wx",s=>{s&&"ENOENT"===s.code?fse.mkdir(path.dirname(e)).then(()=>fse.touchFile(e)).then(t):s&&"EEXIST"!==s.code?r(s):t()})})),fse.touchFileSync=(e=>{try{fs.openSync(e,"wx")}catch(t){if(t&&"ENOENT"===t.code)fse.mkdirSync(path.dirname(e)),fse.touchFileSync(e);else if(t&&"EEXIST"!==t.code)throw t}});const keys=/\$\{([^}]+)\}/g,patchPkg=',\n ".*",\n "*"';function exec(e,t){return new Promise((r,s)=>{child_process.exec(e,Object(t),(e,t,a)=>{e?s(a):r(t)})})}function pipeExec(e,t){return new Promise((r,s)=>{try{const a=Object.assign({stdio:["pipe","pipe",process.stderr]},t);r(child_process.execSync(e,a))}catch(e){s(e)}})}var githubUser=e=>new Promise((t,r)=>{https.get({hostname:"api.github.com",path:`/search/users?q=${e}+in:email`,headers:{Accept:"application/vnd.github.v3+json","user-agent":"https://github.com/sindresorhus/gh-got"}},e=>{let s="";200!==e.statusCode&&r(e.statusCode),e.on("data",e=>s+=e),e.on("end",()=>{const e=JSON.parse(s);e.items&&e.items.length?t(e.items[0].login):r("No User Found")})})});const iniLine=/\s*\n+\s*/,iniHeading=/^\[\s*(.*)\s*\]$/,iniValue=/^\s*([^\s]*)\s*=\s*(.*)\s*$/,iniObject={};let iniCurrent=iniObject;var gitConfig=fse.readFile(path.resolve(os.homedir(),".gitconfig"),"utf8").then(e=>e.split(iniLine).map(e=>{iniHeading.test(e)?iniCurrent=iniObject[e.replace(iniHeading,"$1")]={}:iniCurrent[e.replace(iniValue,"$1")]=e.replace(iniValue,"$2")})).then(()=>{if("user"in iniObject)return iniObject.user;throw"No user object in .gitconfig"});let gituser;var gitInfo=e=>gitConfig.then(async t=>{if(e in t)return t[e];if("user"===e)return gituser=await(gituser||githubUser(t.email));throw`No ${e} in .gitconfig`}),question=e=>new Promise((t,r)=>{const s=readline.createInterface({input:process.stdin,output:process.stdout});s.question(color.dim(`${e}: `),e=>{s.close(),e?t(e):r()})});async function main(){await updateArgs(),await createTemplate()}async function updateArgs(){if(args.to||(args.to="./"),args.date||(args.date=new Date(Date.now()).toLocaleDateString("en-US",{weekday:"narrow",year:"numeric",month:"long",day:"numeric"}).slice(3)),!args.title)try{args.title=await question(titlePrompt)}catch(e){args.title=titleFallback}if(args.title=formatTitle(args.title),args.id=formatId(args.id||args.title),args.idCamelCase=formatCamelCase(args["camel-case-id"]||args.id),args.npmId=args["npm-id"]||args.npm||args.id,args.desc||(args.desc=formatDesc(args.description||descFallback)),args.pkgdesc=formatPkgDesc(args["package-description"]||args.desc),!args.author)try{args.author=await gitInfo("name")}catch(e){try{args.author=await question(authorPrompt)}catch(e){args.author=authorFallback}}if(!args.email)try{args.email=await gitInfo("email")}catch(e){try{args.email=await question(emailPrompt)}catch(e){args.email=emailFallback}}if(!args.user)try{args.user=await gitInfo("user")}catch(e){try{args.user=await question(userPrompt)}catch(e){args.user=userFallback}}if(!args.keywords)try{args.keywords=await question(keywordPrompt)}catch(e){args.keywords=keywordFallback}args.keywords=formatKeywords(args.keywords),console.log("")}async function createTemplate(){const e=path.join(__dirname,"template"),t=path.resolve(process.cwd(),args.to),r={cwd:t};try{await copyTemplateDir(e,t,args);try{await exec("git init",r),await exec(`git remote add origin git@github.com:${args.user}/${args.id}.git`,r)}catch(e){}args["no-install"]||await pipeExec("npm install",r),console.log(getSuccessMessage(args)),process.exit(0)}catch(e){console.error(e),process.exit(1)}}function getSuccessMessage(){return`Success! Created ${color.bold(args.title)} at ${color.bold(args.to)}\n\nWe suggest that you begin by typing:\n cd ${path.relative(process.cwd(),args.to)}\n npm test\n\nHappy pHTML-ing!\n`}const authorFallback="pHTML Community",authorPrompt="Author Name",descFallback="...",emailFallback="jonathantneal@hotmail.com",emailPrompt="GitHub Email",keywordFallback="",keywordPrompt="Keywords",titleFallback="Example",titlePrompt="Plugin Name",userFallback="phtmlorg",userPrompt="GitHub User",formatTitle=e=>e.trim().replace(/^(phtml\s+)?/i,"pHTML "),formatDesc=e=>e.trim(),formatPkgDesc=e=>e.replace(/^[a-z]/,e=>e.toUpperCase()),formatId=e=>e.trim().replace(/[^\w]+/g,"-").replace(/^-+|-+$/g,"").toLowerCase(),formatCamelCase=e=>e.replace(/-[a-z]/g,e=>e.slice(1).toUpperCase()),formatKeywords=e=>["phtml","html","phtml-plugin"].concat(e.trim().split(/\s*,\s*/)).join('",\n "');main();