UNPKG

npx-scope-finder

Version:

A tool to find executable (npx-compatible) packages within a specific npm scope

1 lines 2.99 kB
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require(`p-limit`);c=s(c);var l=class extends Error{retryAfter;constructor(e,t){super(e),this.retryAfter=t}};async function u(e,t={}){let{timeout:n=1e4,retries:r=3,retryDelay:i=1e3}=t,a=null;for(let t=0;t<=r;t++)try{let t=new AbortController,r=setTimeout(()=>t.abort(),n),i=await fetch(e,{signal:t.signal,headers:{Accept:`application/json`}});if(clearTimeout(r),!i.ok){let e=i.status===429?d(i.headers.get(`Retry-After`)):void 0;throw new l(`HTTP error! status: ${i.status}`,e)}return await i.json()}catch(e){if(a=e,t<r){let n=i*2**t,r=e instanceof l&&e.retryAfter!=null&&e.retryAfter>0?Math.max(e.retryAfter*1e3,n):n;await new Promise(e=>setTimeout(e,r))}}throw a}function d(e){if(e==null)return;let t=Number(e);return Number.isFinite(t)?t:void 0}function f(e,t,n){return{name:e,description:t.description,version:t.version,bin:t.bin,dependencies:t.dependencies,scripts:t.scripts,keywords:t.keywords,links:{npm:`https://www.npmjs.com/package/${e}`,repository:t.repository?.url?.replace(/^git\+/,``).replace(/\.git$/,``),homepage:t.homepage},original:n}}async function p(e,t={}){if(!e.startsWith(`@`))throw Error(`Scope must start with "@"`);let{concurrency:n=10,maxPages:r=5,includeOriginal:i=!1,logger:a}=t,o=(0,c.default)(n),s=[],l=0;for(let n=0;n<r;n++){let n=await u(`https://registry.npmjs.org/-/v1/search?text=${encodeURIComponent(e)}&size=250&from=${l}`,t);if(!n.objects||!Array.isArray(n.objects))throw Error(`Invalid search response format`);let r=n.objects.filter(t=>t.package.name.startsWith(e)).map(e=>e.package.name);if(s.push(...r),l+=n.objects.length,l>=n.total||n.objects.length<250)break}if(s.length===0)return[];let d=s.map(e=>o(async()=>i?{packageName:e,packageInfo:await u(`https://registry.npmjs.org/${encodeURIComponent(e)}`,t),isFullMetadata:!0}:{packageName:e,versionInfo:await u(`https://registry.npmjs.org/${encodeURIComponent(e)}/latest`,t),isFullMetadata:!1})),p=await Promise.allSettled(d),h=[];for(let e of p){if(e.status===`rejected`){a?.error(`Error fetching package details:`,e.reason);continue}let t=e.value;if(t.isFullMetadata){let{packageName:e,packageInfo:n}=t;if(!n[`dist-tags`]||!n.versions){a?.error(`Invalid package info format:`,e);continue}let r=n[`dist-tags`].latest,i=n.versions[r];m(i)&&h.push(f(e,i,n))}else{let{packageName:e,versionInfo:n}=t;if(!n||!n.version){a?.error(`Invalid package info format:`,e);continue}m(n)&&h.push(f(e,n))}}return h}function m(e){return!!e.bin}exports.npxFinder=p;