UNPKG

recently-published

Version:

A simple CLI tool to get the most recently published versions of a package on npm or see which install package versions were most recently published.

3 lines (2 loc) 9.06 kB
#!/usr/bin/env node "use strict";var ee=Object.create;var x=Object.defineProperty;var te=Object.getOwnPropertyDescriptor;var ne=Object.getOwnPropertyNames;var oe=Object.getPrototypeOf,re=Object.prototype.hasOwnProperty;var V=(e,t,o,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of ne(t))!re.call(e,r)&&r!==o&&x(e,r,{get:()=>t[r],enumerable:!(n=te(t,r))||n.enumerable});return e};var h=(e,t,o)=>(o=e!=null?ee(oe(e)):{},V(t||!e||!e.__esModule?x(o,"default",{value:e,enumerable:!0}):o,e)),se=e=>V(x({},"__esModule",{value:!0}),e);var ge={};module.exports=se(ge);var Q=require("commander");var $="recently-published";var I="0.16.0";var R=h(require("semver/functions/parse.js"),1),L=h(require("validate-npm-package-name"),1);var M=h(require("util"),1),N=require("child_process"),j=h(require("p-limit"),1),P=M.default.promisify(N.exec);async function A(e,t,o){let n=(0,j.default)(t??10);return await Promise.all(e.map(r=>n(()=>o(r))))}var F=async e=>{try{let{stdout:t}=await P(`npm view ${e} time --json`),o=JSON.parse(t);return delete o.created,delete o.modified,Object.entries(o).map(([n,r])=>({name:e,version:n,...(0,R.default)(n),publishDate:new Date(r)}))}catch(t){console.error(t.message),process.exit(1)}},E=async()=>{try{let{stdout:e}=await P("npm list --json"),t=JSON.parse(e);if(!t.dependencies)throw new Error("No installed packages found in this directory");return Object.entries(t.dependencies).map(([o,n])=>({name:o,...n}))}catch(e){console.error(e.message),process.exit(1)}},J=e=>{if(e===void 0)return!0;let t=(0,L.default)(e);return!(!t.validForNewPackages&&!t.validForOldPackages)};var m=require("ink"),Y=require("react");var T=require("ink"),W=h(require("ink-spinner"),1),u=require("react/jsx-runtime"),B=({count:e,total:t})=>(0,u.jsx)(u.Fragment,{children:(0,u.jsxs)(T.Text,{children:[`${t===0||e===0?"Fetching metadata for packages":`Fetched metadata for ${e} of ${t} packages`}`,(0,u.jsx)(T.Text,{color:"green",children:(0,u.jsx)(W.default,{type:"simpleDots"})})]})});var X=h(require("react"),1),g=require("ink"),H=require("object-hash"),d=require("react/jsx-runtime"),k=class extends X.default.Component{getConfig(){return{data:this.props.data,columns:this.props.columns||this.getDataKeys(),padding:this.props.padding||1,header:this.props.header||ae,cell:this.props.cell||le,skeleton:this.props.skeleton||pe}}getDataKeys(){let t=new Set;for(let o of this.props.data)for(let n in o)t.add(n);return Array.from(t)}getColumns(){let{columns:t,padding:o}=this.getConfig();return t.map(n=>{let r=String(n).length,s=this.props.data.map(l=>{let p=l[n];return p==null?0:String(p).length}),i=Math.max(...s,r)+o*2;return{column:n,width:i,key:String(n)}})}getHeadings(){let{columns:t}=this.getConfig();return t.reduce((o,n)=>({...o,[n]:n}),{})}header=b({cell:this.getConfig().skeleton,padding:this.getConfig().padding,skeleton:{component:this.getConfig().skeleton,line:"\u2500",left:"\u250C",right:"\u2510",cross:"\u252C"}});heading=b({cell:this.getConfig().header,padding:this.getConfig().padding,skeleton:{component:this.getConfig().skeleton,line:" ",left:"",right:"",cross:""}});separator=b({cell:this.getConfig().skeleton,padding:this.getConfig().padding,skeleton:{component:this.getConfig().skeleton,line:" ",left:"",right:"",cross:""}});data=b({cell:this.getConfig().cell,padding:this.getConfig().padding,skeleton:{component:this.getConfig().skeleton,line:" ",left:"",right:"",cross:""}});footer=b({cell:this.getConfig().skeleton,padding:this.getConfig().padding,skeleton:{component:this.getConfig().skeleton,line:"",left:"",right:"",cross:""}});render(){let t=this.getColumns(),o=this.getHeadings();return(0,d.jsxs)(g.Box,{flexDirection:"column",children:[this.header({key:"header",columns:t,data:{}}),this.heading({key:"heading",columns:t,data:o}),this.props.data.map((n,r)=>{let s=`row-${(0,H.sha1)(n)}-${r}`;return(0,d.jsxs)(g.Box,{flexDirection:"column",children:[this.separator({key:`separator-${s}`,columns:t,data:{}}),this.data({key:`data-${s}`,columns:t,data:n})]},s)}),this.footer({key:"footer",columns:t,data:{}})]})}};function b(e){let t=e.skeleton;return o=>(0,d.jsxs)(g.Box,{flexDirection:"row",children:[...ce(()=>(0,d.jsx)(d.Fragment,{}),o.columns.map((n,r)=>{let s=o.data[n.column];if(s==null){let i=`${o.key}-empty-${n.key}`;return(0,d.jsx)(e.cell,{column:r,children:t.line.repeat(n.width)},i)}else{let i=`${o.key}-cell-${n.key}`,l=0,p=n.width-String(s).length-e.padding+2;return(0,d.jsx)(e.cell,{column:r,children:`${t.line.repeat(l)}${String(s)}${t.line.repeat(p)}`},i)}}))]})}function ae(e){return(0,d.jsx)(g.Text,{bold:!0,color:"blue",children:e.children})}function le(e){return(0,d.jsx)(g.Text,{children:e.children})}function pe(e){return(0,d.jsx)(g.Text,{bold:!0,children:e.children})}var z=()=>(0,d.jsx)(d.Fragment,{});function ce(e,t){return t.reduce((o,n,r)=>o.length===0?[n]:[...o,e(r),n],[])}var _=require("zustand/vanilla"),U=require("zustand");function w(e){let o=Math.floor((new Date().getTime()-e.getTime())/1e3),n=Math.floor(o/31536e3);return n>1?`${n} years ago`:(n=Math.floor(o/2592e3),n>1?`${n} months ago`:(n=Math.floor(o/86400),n>1?`${n} days ago`:(n=Math.floor(o/3600),n>1?`${n} hours ago`:(n=Math.floor(o/60),n>1?`${n} minutes ago`:`${Math.floor(o)} seconds ago`))))}function D(e){let t=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],n=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"][e.getDay()],r=t[e.getMonth()],s=e.getDate(),i=e.getFullYear(),l=e.getHours(),p=e.getMinutes().toString().padStart(2,"0"),c=l>=12?"PM":"AM";return l=l%12||12,`${n} ${r} ${s} ${i} ${l}:${p} ${c}`}var G=require("semver"),v=(e,t)=>t.display==="all"?e:e.slice(0,parseInt(t.display)),K=(e,t)=>t.includePrerelease?e:e.filter(o=>Array.isArray(o.prerelease)&&o.prerelease.length==0),S=e=>e.sort((t,o)=>{let n=o.publishDate.getTime()-t.publishDate.getTime();return n===0?(0,G.compare)(o.version,t.version):n});var de=(0,_.createStore)((e,t)=>({packages:[],count:0,isLoading:!0,tableData:[],packageName:null,setPackages:o=>e({packages:o}),setCount:o=>e({count:o}),setIsLoading:o=>e({isLoading:o}),setTableData:o=>e({tableData:o}),setPackageName:o=>e({packageName:o}),fetchVersionsForAllNodeModules:async o=>{let n=await E();t().setPackages(n);let s=(await A(n,100,async({name:c,version:f})=>{let y=await P(`npm view ${c} time'[${f}]'`);return t().setCount(t().count+1),y})).map(({stdout:c})=>c.replace(/[\n\r]/g,"")),i=n==null?void 0:n.map((c,f)=>(c.publishDate=new Date(s[f]),c)),l=S(i),p=v(l,o).map(({name:c,version:f,publishDate:y})=>({name:c,version:f,publishDate:y,relativePublishDate:w(y),formattedPublishDate:D(y)}));t().setIsLoading(!1),t().setTableData(p)},fetchVersionsForSpecificPackage:async(o,n)=>{t().setPackageName(o),t().setIsLoading(!0),t().setCount(0);let r=await F(o),s=K(r,n),i=S(s),l=v(i,n).map(({version:p,publishDate:c})=>({version:p,publishDate:c,relativePublishDate:w(c),formattedPublishDate:D(c)}));t().setIsLoading(!1),t().setTableData(l)}})),C=e=>(0,U.useStore)(de,e);var a=require("react/jsx-runtime"),me=({options:e,optionalPackageName:t})=>{let{packages:o,count:n,isLoading:r,fetchVersionsForAllNodeModules:s,fetchVersionsForSpecificPackage:i}=C(p=>p),{exit:l}=(0,m.useApp)();return(0,Y.useEffect)(()=>{(async()=>{t?await i(t,e):await s(e),setTimeout(()=>{l()},200)})()},[t,e]),(0,a.jsx)(a.Fragment,{children:r&&(0,a.jsx)(B,{total:o.length,count:n})})},ue=({options:e,optionalPackageName:t})=>{let{isLoading:o,tableData:n}=C(i=>i),{write:r}=(0,m.useStdout)();if(e.json&&!o)return r(JSON.stringify(n,null,2)),(0,a.jsx)(a.Fragment,{});let s=t?n==null?void 0:n.map(({version:i,relativePublishDate:l,formattedPublishDate:p})=>({Version:i,Published:l,Date:p})):n==null?void 0:n.map(({name:i,version:l,relativePublishDate:p,formattedPublishDate:c})=>({Name:i,Version:l,Published:p,Date:c}));return(0,a.jsx)(a.Fragment,{children:(0,a.jsxs)(m.Box,{flexDirection:"column",children:[t&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(m.Box,{flexDirection:"column",children:(0,a.jsx)(m.Text,{color:"green",children:t})}),(0,a.jsx)(m.Spacer,{})]}),(0,a.jsx)(k,{data:s,skeleton:z})]})})},q=async(e,t)=>{let{waitUntilExit:o}=(0,m.render)((0,a.jsx)(me,{options:e,optionalPackageName:t}),{stdout:process.stderr});await o();let{unmount:n}=(0,m.render)((0,a.jsx)(ue,{options:e,optionalPackageName:t}),{stdout:process.stdout});n()};var Z=new Q.Command;Z.name($).version(I).argument("[optionalPackageName]","Optional package name whose recently published versions you want to see. If not provided, will display recently published packages installed in the current directory.").option("-d, --display <number>",'Number of recently published versions you would like displayed or "all" if you want to display all of them',"10").option("-ip, --includePrerelease","Include prerelease versions from the list of recently published versions").option("--json","Output the result in JSON format").action(async(e,t)=>{J(e)||(console.error("Invalid input. Please provide a valid npm package name (including scope). Versions ranges are not supported."),process.exit(1)),await q(t,e)});Z.parse(process.argv);