UNPKG

@bit-ocean/cli

Version:
9 lines 11.4 kB
'use strict';var d=require('process'),commander=require('commander'),child_process=require('child_process'),kolorist=require('kolorist'),config=require('@bit-ocean/config'),h=require('fs'),u=require('path'),url=require('url'),de=require('prompts'),Ce=require('handlebars'),Ie=require('cross-fetch'),promises=require('fs/promises');var _documentCurrentScript=typeof document!=='undefined'?document.currentScript:null;function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var d__default=/*#__PURE__*/_interopDefault(d);var h__default=/*#__PURE__*/_interopDefault(h);var u__default=/*#__PURE__*/_interopDefault(u);var de__default=/*#__PURE__*/_interopDefault(de);var Ce__default=/*#__PURE__*/_interopDefault(Ce);var Ie__default=/*#__PURE__*/_interopDefault(Ie);var g=Object.freeze({name:`${config.teamConfig.TEAM_NAME} CLI`});var i=class{static info(t){process.stdout.write(`${kolorist.bgBlue(` ${g.name} `)} ${t} `);}static success(t){process.stdout.write(`${kolorist.bgBlue(` ${g.name} `)} ${kolorist.lightGreen(t)} `);}static error(t){t instanceof Error?console.error(t):process.stdout.write(`${kolorist.bgBlue(` ${g.name} `)} ${kolorist.lightRed(t)} `);}};var Z="npm view @bit-ocean/cli@latest version";function E(){let e;try{e=child_process.execSync(Z,{encoding:"utf-8"}).toString().trim();}catch{return i.error("Get latest version failed!"),null}return e}function I(){return h__default.default.readdirSync(process.cwd()).some(e=>e.includes("pnpm-workspace"))}function N(){let e=u__default.default.join(d__default.default.cwd(),".git","config"),r=h__default.default.readFileSync(e,"utf-8").match(/\[remote "origin"\][\s\S]*?url\s*=\s*(.*)/);if(!r)throw Error("remote.origin.url not found!");let o=r[1].match(/github\.com\/([^/]+)\/([^/]+)\.git/);if(!o||o.length<3)throw Error("Invalid git remote url");let[,s,a]=o;return {org:s,repo:a}}var se="bit-ocean.config.js";async function S(){try{return (await import(url.pathToFileURL(u__default.default.join(process.cwd(),se)).href)).default??null}catch{return null}}function T(){let e=u__default.default.resolve(u__default.default.dirname(url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href)))),"../package.json"),t=h__default.default.readFileSync(e,"utf-8");return JSON.parse(t)}var pe=["packages","apps"];function L(){let e=new Map;return e.set(u__default.default.resolve(d__default.default.cwd(),"package.json"),me()),I()&&fe().forEach(t=>{try{e.set(t,JSON.parse(h__default.default.readFileSync(t,"utf-8")));}catch{}}),e}function me(){return JSON.parse(h__default.default.readFileSync(u__default.default.resolve(d__default.default.cwd(),"package.json"),"utf-8"))}function le(){return pe.map(e=>[e,h__default.default.readdirSync(u__default.default.resolve(d__default.default.cwd(),e))])}function fe(){return le().map(([t,r])=>r.map(o=>u__default.default.resolve(d__default.default.cwd(),t,o,"package.json"))).flat()}var D=async()=>{let e=E();if(!e){i.error("Get version failed!");return}let t=L();t.size===0&&i.error("No package.json found!");let r=0;t.forEach((o,s)=>{let a=[],p=o.dependencies&&{...o.dependencies};p&&Object.keys(o.dependencies??{}).forEach(n=>{if(o.dependencies?.[n]&&x(n)&&!C(o.dependencies[n])&&!k(o.dependencies[n],e)){let l=R(o.dependencies[n],e);p[n]=l,a.push([n,l]);}});let m=o.devDependencies&&{...o.devDependencies};m&&Object.keys(o.devDependencies??{}).forEach(n=>{if(o.devDependencies?.[n]&&x(n)&&!C(o.devDependencies[n])&&!k(o.devDependencies[n],e)){let l=R(o.devDependencies[n],e);m[n]=l,a.push([n,l]);}});let c={...o,dependencies:p,devDependencies:m};a.length>0&&(h__default.default.writeFileSync(s,`${JSON.stringify(c,null,2)} `),a.map(([n,l])=>i.success(`Bumping ${n} to ${l} in ${o.name}`)),r+=a.length);}),r===0?i.success("No dependencies need to be bumped."):child_process.execSync("pnpm install",{stdio:"inherit"});};function R(e,t){return C(e)?e:e.includes("^")?`^${t}`:e.includes("~")?`~${t}`:t}function x(e){return e.startsWith("@bit-ocean/")}function C(e){return e.includes("workspace:")}function k(e,t){return e.includes(t)}var P=async()=>{let e=await de__default.default([{type:"select",name:"action",message:"Select which to bump:",choices:[{title:"@bit-ocean/*",value:0,description:"Bump the version of @bit-ocean/*."}]}]),{action:t}=e;switch(t){case 0:await D();break;default:i.error("No action selected!");}};var G="packages/cspell/dicts";async function F(e){try{let t=h__default.default.readFileSync(e,"utf-8").split(` `).filter((r,o,s)=>r&&s.indexOf(r)===o).sort((r,o)=>r.toLocaleLowerCase().localeCompare(o.toLocaleLowerCase()));h__default.default.writeFileSync(e,t.join(` `)),i.success(`Sorted ${e}`);}catch(t){i.error(`Error sorting ${e}: ${t.message}`);}}async function _(){h__default.default.existsSync(".cspell.txt")&&await F(".cspell.txt"),await Promise.all(h__default.default.readdirSync(G).filter(e=>e.endsWith(".txt")).map(e=>F(u__default.default.join(G,e))));}var $=async()=>{let e=await de__default.default({type:"select",name:"action",message:"Select an action:",choices:[{title:"Sort dicts",value:0,description:"Sort CSpell dictionaries alphabetically."}]}),{action:t}=e;switch(t){case 0:_();break;default:i.error("No action selected!");}};var B=async e=>{let t=u.resolve(undefined,"../assets/engineering/bit-ocean.config.hbs"),r=u.resolve(d.cwd(),"bit-ocean.config.js"),o=h__default.default.readFileSync(t,"utf-8"),s=Ce__default.default.compile(o)(e);try{h__default.default.writeFileSync(r,s),i.success("bit-ocean.config.js has been created!");}catch(a){i.error(a);}};var Ne=new Set(["dependabot[bot]","eslint[bot]","greenkeeper[bot]","semantic-release-bot"]),j=3,O=100,Se=(e,t)=>`https://api.github.com/repos/${e}/${t}/contributors?per_page=${O}`,ve="ghp_*";async function U(e){return e==null?null:await(await Ie__default.default(e,{method:"GET",headers:{Accept:"application/vnd.github.v3+json",Authorization:ve}})).json()}async function*Te(e=1){let{org:t,repo:r}=await S()??{};if(!t||!r)throw new Error("Missing org or repo in bit-ocean.config.js!");let o=0;do{let s=await U(`${Se(t,r)}&page=${e}`);if(!Array.isArray(s))throw new Error(s?.message??"An error occurred");let a=s.filter(p=>p.contributions>=j);yield a,o=a.length;}while(o===O)}function Le(e,t=5){let r=e.length>t?t:e.length,o=["<!---------------------------------------------"," | DO NOT MODIFY THIS FILE MANUALLY |"," | |"," | THIS FILE HAS BEEN AUTOMATICALLY GENERATED |"," | |"," | YOU CAN REGENERATE THIS FILE USING |"," | |"," | @bit-ocean/cli |"," ---------------------------------------------->","","# Contributors","","Thanks goes to these wonderful people:","","<!-- prettier-ignore-start -->","<!-- markdownlint-disable -->","<table>"],s=0;for(let a of e){s%r===0&&(s!==0&&o.push(" </tr>"),o.push(" <tr>"));let p=`<img src="${a.avatar_url}&size=100" width="100px;" alt=""/>`,m=`<sub><b>${a.name||a.login}</b></sub>`;o.push(` <td align="center"><a href="${a.html_url}">${p}<br />${m}</a></td>`),++s;}s%r!==0&&o.push(" </tr>"),o.push("</table>"),o.push(""),o.push("<!-- markdownlint-restore -->"),o.push("<!-- prettier-ignore-end -->"),o.push(""),o.push(`This list is auto-generated using \`@bit-ocean/cli\`. It shows the top ${O} contributors with > ${j} contributions.`),o.push(""),h__default.default.writeFileSync(u__default.default.join(process.cwd(),"CONTRIBUTORS.md"),o.join(` `));}async function Re(){let e=[];for await(let r of Te())e.push(...r);let t=await Promise.allSettled(e.filter(r=>r.login&&r.type!=="Bot"&&!Ne.has(r.login)).map(r=>U(r.url)));Le(t.map(r=>r.status==="fulfilled"?r.value:null).filter(r=>r?.login!=null),5);}var H=()=>Re().then(()=>i.success("Generate contributors successfully!")).catch(e=>{i.error("Generate contributors failed!"),i.error(e),d.exit(1);});var W=async e=>{let{packageName:t}=e,r=u.resolve(undefined,"../assets/templates/monorepo-lib"),o=u.resolve(d.cwd(),"bit-ocean.config.js","../packages",t);try{let s=await _e(r),a=async p=>{let m=u.resolve(o,p.relativePath),c=0;if(p.type==="dir")await promises.mkdir(m);else {let n=await promises.readFile(p.path,"utf-8"),l=Ce__default.default.compile(n)(e);await promises.writeFile(m,l),c=Buffer.byteLength(l,"utf-8");}i.success(`CREATED ${u.relative(d.cwd(),m)}${c?` (${c} bytes)`:""}`);};try{await promises.rm(o,{recursive:!0});}catch{}for(await promises.mkdir(o);s.length;)await a(s.shift());}catch(s){i.error(s);}};async function _e(e){let t=[];async function r(o,s=0){try{let p=(await promises.readdir(o,{withFileTypes:!0})).map(async m=>{let c=u.join(o,m.name),n=u.relative(e,c.endsWith(".hbs")?c.slice(0,-4):c);m.isDirectory()?(t.push({type:"dir",path:c,relativePath:n,level:s}),await r(c,s+1)):t.push({type:"file",path:c,relativePath:n,level:s});});await Promise.all(p);}catch(a){i.error(a);}}return await r(e),t.toSorted((o,s)=>o.level-s.level)}var J=async()=>{let e=N(),t=await de__default.default([{type:"select",name:"action",message:"Select a generator:",choices:[{title:"Monorepo Lib",value:0,description:"Generate a monorepo lib."},{title:"Config",value:1,description:"Generate bit-ocean.config.js."},{title:"Contributors",value:2,description:"Generate CONTRIBUTORS.md."}]},{type:(c,n)=>n.action===0?"text":null,name:"packageName",message:"Enter the lib name:",initial:"my-lib"},{type:(c,n)=>n.action===0?"text":null,name:"packageDescription",message:"Enter the lib description:",initial:"My lib description."},{type:(c,n)=>n.action===0?"text":null,name:"packageOrgName",message:"Enter the npm org name:",initial:e.org,hint:(c,n)=>`Your lib name will be: @${n.packageOrgName}/${n.packageName}`},{type:(c,n)=>n.action===1?"text":null,name:"repo",message:"Enter the GitHub repository name:",initial:e.repo},{type:(c,n)=>n.action===1?"text":null,name:"org",message:"Enter the GitHub organization name:",initial:e.org},{type:(c,n)=>n.action===1?"text":null,name:"repo",message:"Enter the GitHub repository name:",initial:e.repo}]),{action:r,packageName:o,packageOrgName:s,packageDescription:a,org:p=e.org,repo:m=e.repo}=t;switch(r){case 0:W({packageName:o,packageOrgName:s,packageDescription:a,repo:m,org:p});break;case 1:B({repo:m,org:p});break;case 2:H();break;default:i.error("No action selected!");}};commander.program.name(g.name).description("Universal CLI tools for Bit Ocean.").version(T().version,"-v, --version","Output the current version.").helpOption("-h, --help","Output usage information.").helpCommand(false);commander.program.command("cspell").summary("CSpell related scripts.").description("CSpell related scripts.").action($);commander.program.command("engineering").summary("Engineering tools.").description("Engineering tools.").option("-c, --check","Check the engineering tools.").action(e=>{let{check:t}=e;t?i.info("Check the engineering tools."):i.info("Engineering tools.");});commander.program.command("g").description("Generators").action(J);commander.program.command("bump").description("Bump the version of the deps.").action(P);commander.program.on("command:*",()=>{i.error("Action not found!"),d.exit(1);});commander.program.parse(d.argv);//# sourceMappingURL=index.cjs.map //# sourceMappingURL=index.cjs.map