UNPKG

@stacksjs/dtsx

Version:

A modern, fast .d.ts generation tool, powered by Bun.

19 lines (17 loc) 5.1 kB
// @bun function R(W,F={}){let{mergeInterfaces:U=!0,mergeNamespaces:j=!0,mergeTypes:q=!1,mergeEnums:V=!0,deduplicateIdentical:Y=!0,conflictStrategy:Z="last",preserveAllComments:z=!0}=F,$=[],H=0,X=new Map,J=[];for(let O of W){let Q=`${O.kind}:${O.name}`,G=X.get(Q);if(!G)G=[],X.set(Q,G),J.push(Q);G.push(O)}let B=[];for(let O of J){let Q=X.get(O),G=Q[0];if(Q.length===1){B.push(G);continue}if(!(G.kind==="interface"&&U||G.kind==="module"&&j||G.kind==="type"&&q||G.kind==="enum"&&V)){B.push(...Q);continue}let w=Q;if(Y)w=K(Q);if(w.length===1){B.push(w[0]);continue}let L;switch(G.kind){case"interface":L=I(w,Z,z);break;case"module":L=_(w,Z,z);break;case"enum":L=A(w,Z,z);break;case"type":L=E(w,Z,z);break;default:L=w[0]}B.push(L),H+=w.length-1,$.push({name:G.name,kind:G.kind,sourceCount:w.length,memberCount:L.members?.length||0})}return{declarations:B,mergedCount:H,merges:$}}function K(W){let F=new Map;for(let U of W){let j=N(U.text);if(!F.has(j))F.set(j,U);else{let q=F.get(j);if((U.leadingComments?.length||0)>(q.leadingComments?.length||0))F.set(j,U)}}return Array.from(F.values())}function N(W){return W.replace(/\s+/g," ").replace(/;\s*/g,";").trim()}function I(W,F,U){let j=W[0],q=new Map,V=[],Y=U?new Set:null;for(let Q of W){if(U&&Q.leadingComments&&Y){for(let G of Q.leadingComments)if(!Y.has(G))Y.add(G),V.push(G)}if(Q.members)for(let G of Q.members)if(!q.get(G.name))q.set(G.name,G);else switch(F){case"first":break;case"last":q.set(G.name,G);break;case"error":throw Error(`Conflicting member '${G.name}' in interface '${j.name}'`)}}let Z=Array.from(q.values()),z=Z.map((Q)=>` ${Q.text}`).join(` `),$=j.generics||"",H=j.extends||"",X=new Set;for(let Q of W)if(Q.extends){let G=Q.extends.split(",");for(let h of G){let w=h.trim();if(w)X.add(w)}}if(X.size>0)H=`extends ${Array.from(X).join(", ")}`;let J=j.isExported?"export ":"",B=j.modifiers?.includes("declare")?"declare ":"",O=`${J}${B}interface ${j.name}${$} ${H} { ${z} }`;return{...j,members:Z,leadingComments:V.length>0?V:j.leadingComments,text:O.replace(/\s+\{/," {").replace(/\{\s*\n\s*\n/,`{ `),extends:H||void 0}}function _(W,F,U){let j=W[0],q=new Map,V=[],Y=U?new Set:null;for(let J of W){if(U&&J.leadingComments&&Y){for(let B of J.leadingComments)if(!Y.has(B))Y.add(B),V.push(B)}if(J.members)for(let B of J.members){let O=`${B.kind}:${B.name}`;if(!q.get(O))q.set(O,B);else switch(F){case"first":break;case"last":q.set(O,B);break;case"error":throw Error(`Conflicting member '${B.name}' in namespace '${j.name}'`)}}}let Z=Array.from(q.values()),z=Z.map((J)=>` ${J.text}`).join(` `),$=j.isExported?"export ":"",H=j.modifiers?.includes("declare")?"declare ":"",X=`${$}${H}namespace ${j.name} { ${z} }`;return{...j,members:Z,leadingComments:V.length>0?V:j.leadingComments,text:X}}function A(W,F,U){let j=W[0],q=new Map,V=[],Y=U?new Set:null;for(let B of W){if(U&&B.leadingComments&&Y){for(let O of B.leadingComments)if(!Y.has(O))Y.add(O),V.push(O)}if(B.members)for(let O of B.members)if(!q.get(O.name))q.set(O.name,O);else switch(F){case"first":break;case"last":q.set(O.name,O);break;case"error":throw Error(`Conflicting member '${O.name}' in enum '${j.name}'`)}}let Z=Array.from(q.values()),z=Z.map((B)=>` ${B.name}${B.value!==void 0?` = ${B.value}`:""}`).join(`, `),$=j.isExported?"export ":"",H=j.modifiers?.includes("declare")?"declare ":"",X=j.modifiers?.includes("const")?"const ":"",J=`${$}${H}${X}enum ${j.name} { ${z} }`;return{...j,members:Z,leadingComments:V.length>0?V:j.leadingComments,text:J}}function E(W,F,U){let j=W[0],q=[],V=U?new Set:null,Y=[],Z=new Set;for(let J of W){if(U&&J.leadingComments&&V){for(let B of J.leadingComments)if(!V.has(B))V.add(B),q.push(B)}if(J.typeAnnotation&&!Z.has(J.typeAnnotation))Z.add(J.typeAnnotation),Y.push(J.typeAnnotation)}if(Y.length<=1)return{...j,leadingComments:q.length>0?q:j.leadingComments};let z=Y.join(" | "),$=j.isExported?"export ":"",H=j.generics||"",X=`${$}type ${j.name}${H} = ${z}`;return{...j,typeAnnotation:z,leadingComments:q.length>0?q:j.leadingComments,text:X}}function D(W,F={}){let U=W.split(` `),j=new Map,q=null,V=0;for(let $=0;$<U.length;$++){let H=U[$],X=H.match(/^(export\s+)?(declare\s+)?interface\s+(\w+)/);if(X&&!q){q={name:X[3],start:$,lines:[H]},V=(H.match(/\{/g)||[]).length-(H.match(/\}/g)||[]).length;continue}if(q){if(q.lines.push(H),V+=(H.match(/\{/g)||[]).length-(H.match(/\}/g)||[]).length,V<=0){let J=j.get(q.name)||[];J.push({start:q.start,end:$,content:q.lines}),j.set(q.name,J),q=null,V=0}}}let Y=Array.from(j.entries()).filter(([,$])=>$.length>1);if(Y.length===0)return W;let Z=[...U],z=new Set;for(let[$,H]of Y){if(H.length<=1)continue;let[X,...J]=H,B=[],O=new Set;for(let h of H)for(let w of h.content){let L=w.trim();if(L.startsWith("interface")||L.startsWith("export")||L==="{"||L==="}")continue;if(L&&!O.has(L))O.add(L),B.push(w)}for(let h of J)for(let w=h.start;w<=h.end;w++)z.add(w);let Q=X.content[0],G=[Q.endsWith("{")?Q:`${Q} {`,...B,"}"];for(let h=X.start;h<=X.end;h++)z.add(h);Z[X.start]=G.join(` `)}return Z.filter(($,H)=>!z.has(H)||Z[H].includes("interface")).join(` `).replace(/\n{3,}/g,` `)} export{R as a,D as b};