UNPKG

pkg-entry-points

Version:

Get all entry-points for an npm package. Supports the `exports` field in `package.json`.

2 lines (1 loc) 2.77 kB
"use strict";var m=require("fs"),u=require("path");const b=async(e,t,r)=>{const i=await e.readdir(t);return(await Promise.all(i.map(async c=>{const s=u.join(t,c);if((await e.stat(s)).isDirectory()){const o=await b(e,s,!0);return r?o:o.map(l=>`./${u.relative(t,l)}`)}return r?s:`./${u.relative(t,s)}`}))).flat()},S=(e,t,r)=>e.readdirSync(t).filter(c=>c!=="node_modules").map(c=>{const s=u.join(t,c);if(e.statSync(s).isDirectory()){const o=S(e,s,!0);return r?o:o.map(l=>`./${u.relative(t,l)}`)}return r?s:`./${u.relative(t,s)}`}).flat(),j="*",w=e=>{const t=e.split(j),r=t[0],i=t.length-1,n=t[i],c=t.slice(1,i);return{prefix:r,middle:c,suffix:n}},v=({prefix:e,suffix:t,middle:r},i)=>{if(!i.startsWith(e)||!i.endsWith(t))return;const n=i.slice(e.length,-t.length||void 0);if(r.length===0)return n;let c=0,s="";for(const a of r){const o=n.indexOf(a,c);if(o===-1)return;const l=n.slice(c,o);if(!s)s=l;else if(s!==l)return;c=o+a.length}return s},p=(e,t,r=[],i={})=>{if(t===null||typeof t=="string"){r.length===0&&r.push("default");const n=JSON.stringify(r);if(!Object.hasOwn(i,n))if(t===null)i[n]=t;else if(t.includes(j)){const c=w(t);i[n]=e.map(s=>{const a=v(c,s);return a&&[s,a]}).filter(s=>s!==void 0)}else e.includes(t)&&(i[n]=[t])}else if(Array.isArray(t))for(const n of t)p(e,n,r,i);else if(typeof t=="object"&&t)for(const n in t){if(!Object.hasOwn(t,n))continue;const c=r.slice();c.includes(n)||c.push(n),p(e,t[n],c.sort(),i)}return i},E=(e,t)=>{if(e===null)return{};let r=Object.keys(e);r[0][0]==="."||(e={".":e},r=["."]);const n={},c=[];for(const a of r){const o=p(t,e[a]),l=a.includes(j);for(const f in o){if(!Object.hasOwn(o,f))continue;const y=o[f];if(y)for(let g of y){let d=a;if(l){const O=Array.isArray(g);d=a.split(j).join(O?g[1]:"_"),O&&([g]=g)}n[d]||(n[d]={}),n[d][f]=Array.isArray(g)?g[0]:g}else c.push([l?w(a):a,f])}}const s={};for(const a in n){if(!Object.hasOwn(n,a))continue;const o=Object.entries(n[a]).filter(([l])=>!c.some(([f,y])=>(typeof f=="string"?f===a:v(f,a))&&l===y)).map(([l,f])=>[JSON.parse(l),f]).sort(([l],[f])=>l.length-f.length);o.length>0&&(s[a]=o)}return s},h=e=>[[["default"],e]],k=(e,t)=>{var r;const i=/\.(?:json|[cm]?js|d\.ts)$/,n=Object.fromEntries(t.filter(s=>i.test(s)).map(s=>[s,h(s)]));let c=(r=e.main)!=null?r:"./index.js";c[0]!=="."&&(c=`./${c}`);for(const s of["",".js",".json"]){const a=c+s;if(t.includes(a)){n["."]=h(a),n[a]=h(a);break}}return n},A=async(e,t=m.promises)=>{const r=await t.readFile(u.join(e,"package.json"),"utf8"),i=JSON.parse(r),n=await b(t,e);return i.exports!==void 0?E(i.exports,n):k(i,n)},J=(e,t=m)=>{const r=t.readFileSync(u.join(e,"package.json"),"utf8"),i=JSON.parse(r),n=S(t,e);return i.exports!==void 0?E(i.exports,n):k(i,n)};exports.getPackageEntryPoints=A,exports.getPackageEntryPointsSync=J;