@stacksjs/dtsx
Version:
A modern, fast .d.ts generation tool, powered by Bun.
10 lines (8 loc) • 4.55 kB
JavaScript
// @bun
function G(q,Q={}){let{entryPoints:H,keepExported:W=!0,keep:J=[],remove:B=[],shakableKinds:j=["type","interface"],debug:O=!1}=Q,C=O?console.log.bind(console,"[tree-shake]"):()=>{},U=new Map;for(let $ of q)U.set($.name,$);let X=K(q);C("Dependency graph:",Object.fromEntries(Array.from(X.entries()).map(([$,z])=>[$,Array.from(z)])));let Z=new Set;if(H&&H.length>0){for(let $ of H)if(U.has($))Z.add($)}else{let $=new Set(j);for(let z of q){if(W&&z.isExported){Z.add(z.name);continue}if(A(z.name,J)){Z.add(z.name);continue}if(!$.has(z.kind))Z.add(z.name)}}if(H&&H.length>0&&J.length>0){for(let $ of q)if(A($.name,J))Z.add($.name)}C("Entry points:",Array.from(Z));let w=D(Z,X);C("Reachable:",Array.from(w));let L=new Set,V=[];for(let $ of q){let z=$.name;if(w.has(z)){L.add(z);continue}if(A(z,B)){V.push(z);continue}if(!j.includes($.kind)){L.add(z);continue}V.push(z)}C("Keeping:",Array.from(L)),C("Removing:",V);let M=q.filter(($)=>L.has($.name)),Y={totalBefore:q.length,totalAfter:M.length,removedCount:V.length,reductionPercent:q.length>0?Math.round(V.length/q.length*100):0};return{declarations:M,removed:V,dependencyGraph:X,stats:Y}}function K(q){let Q=new Map,H=new Set;for(let W=0;W<q.length;W++)H.add(q[W].name);for(let W of q){let J=new Set,B=F(W);for(let j of B)if(H.has(j)&&j!==W.name)J.add(j);Q.set(W.name,J)}return Q}function F(q){let Q=new Set;if(q.typeAnnotation)I(q.typeAnnotation,Q);if(q.extends)I(q.extends,Q);if(q.text)x(q.text,Q);if(q.members)for(let H of q.members){let W=F(H);for(let J of W)Q.add(J)}if(q.parameters){for(let H of q.parameters)if(H.type)I(H.type,Q)}if(q.returnType)I(q.returnType,Q);return Q}var b=new Set(["string","number","boolean","object","any","unknown","never","void","null","undefined","symbol","bigint","true","false","Array","Object","String","Number","Boolean","Function","Symbol","Promise","Map","Set","WeakMap","WeakSet","Record","Partial","Required","Readonly","Pick","Omit","Exclude","Extract","NonNullable","Parameters","ReturnType","InstanceType","ConstructorParameters","ThisParameterType","OmitThisParameter","ThisType","Uppercase","Lowercase","Capitalize","Uncapitalize","Awaited","keyof","typeof","infer","extends","readonly","const","new"]),S=/\b([A-Z]\w*)\b/g,_=/\btypeof\s+([$A-Z_a-z][$\w]*)/g;function I(q,Q){S.lastIndex=0;let H;while((H=S.exec(q))!==null){let W=H[1];if(!b.has(W))Q.add(W)}_.lastIndex=0;while((H=_.exec(q))!==null)Q.add(H[1])}function x(q,Q){I(q,Q)}function D(q,Q){let H=new Set,W=Array.from(q);while(W.length>0){let J=W.pop();if(H.has(J))continue;H.add(J);let B=Q.get(J);if(B){for(let j of B)if(!H.has(j))W.push(j)}}return H}function A(q,Q){for(let H of Q)if(typeof H==="string"){if(H.includes("*")){if(new RegExp(`^${H.replace(/\*/g,".*").replace(/\?/g,".")}$`).test(q))return!0}else if(q===H)return!0}else if(H.test(q))return!0;return!1}function E(q,Q={}){let H=q.split(`
`),W=[],J=null;for(let X=0;X<H.length;X++){let Z=H[X],w=Z.trim();if(!J&&(w===""||w.startsWith("//")))continue;if(!J){let L=w.match(/^(export\s+)?(declare\s+)?(interface|type|enum|class|function|const|let|var)\s+(\w+)/);if(L){let[,V,,M,Y]=L;if(J={name:Y,kind:M,isExported:!!V,start:X,lines:[Z],braceCount:0},J.braceCount+=(Z.match(/\{/g)||[]).length,J.braceCount-=(Z.match(/\}/g)||[]).length,J.braceCount===0&&(w.endsWith(";")||!w.includes("{")))W.push({name:J.name,kind:J.kind,isExported:J.isExported,start:J.start,end:X,text:J.lines.join(`
`)}),J=null;continue}}if(J){if(J.lines.push(Z),J.braceCount+=(Z.match(/\{/g)||[]).length,J.braceCount-=(Z.match(/\}/g)||[]).length,J.braceCount<=0&&(w.endsWith("}")||w.endsWith(";")))W.push({name:J.name,kind:J.kind,isExported:J.isExported,start:J.start,end:X,text:J.lines.join(`
`)}),J=null}}if(W.length===0)return{content:q,removed:[]};let B=W.map((X)=>({name:X.name,kind:X.kind,isExported:X.isExported,text:X.text})),j=G(B,Q),O=new Set(j.declarations.map((X)=>X.name)),C=new Set;for(let X of W)if(!O.has(X.name))for(let Z=X.start;Z<=X.end;Z++)C.add(Z);return{content:H.filter((X,Z)=>!C.has(Z)).join(`
`).replace(/\n{3,}/g,`
`),removed:j.removed}}function v(q,Q={}){return G(q,{...Q,debug:!1}).removed}function P(q,Q){let H=K(Q),W=H.get(q)||new Set,J=D(new Set([q]),H);J.delete(q);let B=[];for(let[j,O]of H)if(j!==q&&O.has(q))B.push(j);return{directDependencies:Array.from(W),transitiveDependencies:Array.from(J),dependents:B}}function k(q={}){return{shake:(Q)=>G(Q,q),shakeContent:(Q)=>E(Q,q),findUnused:(Q)=>v(Q,q),analyzeDependencies:(Q,H)=>P(Q,H),buildGraph:K,extractRefs:F}}
export{G as qe,K as re,F as se,E as te,v as ue,P as ve,k as we};