UNPKG

@stacksjs/dtsx

Version:

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

20 lines (19 loc) 13.4 kB
// @bun function t(z){return z.endsWith(".vue")}function y(z){let J={script:null,scriptSetup:null},Z=/<script\b([^>]*)>([\s\S]*?)<\/script>/gi,X;while((X=Z.exec(z))!==null){let Q=X[1]||"",H=/lang\s*=\s*["']([^"']+)["']/i.exec(Q)?.[1]?.toLowerCase()??"js",$={content:X[2]??"",attrs:Q,setup:/\bsetup\b/.test(Q),lang:H};if($.setup)J.scriptSetup=$;else J.script=$}return J}function D(z,J){let Z=z[J];J++;while(J<z.length){let X=z[J];if(X==="\\"){J+=2;continue}if(X===Z)return J+1;J++}return J}function K(z,J){J++;let Z=0;while(J<z.length){let X=z[J];if(X==="\\"){J+=2;continue}if(X==="`"&&Z===0)return J+1;if(X==="$"&&z[J+1]==="{"){Z++,J+=2;continue}if(X==="}"){if(Z>0)Z--;J++;continue}J++}return J}function V(z,J){if(z[J+1]==="/"){let Z=z.indexOf(` `,J+2);return Z===-1?z.length:Z+1}if(z[J+1]==="*"){let Z=z.indexOf("*/",J+2);return Z===-1?z.length:Z+2}return J+1}function G(z,J,Z,X){let Q=0,H=J;while(H<z.length){let $=z[H];if($==='"'||$==="'"){H=D(z,H);continue}if($==="`"){H=K(z,H);continue}if($==="/"&&(z[H+1]==="/"||z[H+1]==="*")){H=V(z,H);continue}if($===Z)Q++;else if($===X){if(Q--,Q===0)return H}H++}return-1}function O(z,J){let Z=0,X=J;while(X<z.length){let Q=z[X];if(Q==='"'||Q==="'"){X=D(z,X);continue}if(Q==="`"){X=K(z,X);continue}if(Q==="/"&&(z[X+1]==="/"||z[X+1]==="*")){X=V(z,X);continue}if(Q==="="&&z[X+1]===">"){X+=2;continue}if(Q==="<")Z++;else if(Q===">"){if(Z--,Z===0)return X}X++}return-1}function q(z,J=","){let Z=[],X=0,Q="",H=0;while(H<z.length){let $=z[H];if($==='"'||$==="'"){let F=D(z,H);Q+=z.slice(H,F),H=F;continue}if($==="`"){let F=K(z,H);Q+=z.slice(H,F),H=F;continue}if($==="/"&&(z[H+1]==="/"||z[H+1]==="*")){H=V(z,H);continue}if($==="{"||$==="["||$==="("||$==="<")X++;else if($==="}"||$==="]"||$===")"||$===">")X--;if($===J&&X===0){Z.push(Q),Q="",H++;continue}Q+=$,H++}if(Q.trim()!=="")Z.push(Q);return Z}function P(z){let J=z.trim();if(!J.startsWith("{"))return[];let Z=G(J,0,"{","}");if(Z===-1)return[];let X=J.slice(1,Z),Q=[];for(let H of q(X)){let $=-1,F=0;for(let U=0;U<H.length;U++){let Y=H[U];if(Y==='"'||Y==="'"){U=D(H,U)-1;continue}if(Y==="`"){U=K(H,U)-1;continue}if(Y==="{"||Y==="["||Y==="("||Y==="<")F++;else if(Y==="}"||Y==="]"||Y===")"||Y===">")F--;else if(Y===":"&&F===0){$=U;break}}if($!==-1){Q.push({key:w(H.slice(0,$).trim()),value:H.slice($+1).trim(),isMethod:!1});continue}let B=/^([A-Za-z_$][\w$]*|['"][^'"]+['"])\s*\(/.exec(H.trim());if(B){Q.push({key:w(B[1]),value:H.trim(),isMethod:!0});continue}let W=H.trim();if(W)Q.push({key:w(W),value:"",isMethod:!1})}return Q}function w(z){if(z.startsWith("'")&&z.endsWith("'")||z.startsWith('"')&&z.endsWith('"'))return z.slice(1,-1);return z}function v(z){return/^[A-Za-z_$][\w$]*$/.test(z)?z:JSON.stringify(z)}function j(z,J){let Z=new RegExp(`\\b${J}\\b`,"g"),X;while((X=Z.exec(z))!==null){let Q=X.index+X[0].length;while(Q<z.length&&/\s/.test(z[Q]))Q++;let H=null;if(z[Q]==="<"){let B=O(z,Q);if(B===-1)return null;H=z.slice(Q+1,B).trim(),Q=B+1;while(Q<z.length&&/\s/.test(z[Q]))Q++}if(z[Q]!=="(")continue;let $=G(z,Q,"(",")");if($===-1)return null;let F=q(z.slice(Q+1,$));return{generic:H,arg:F.length>0?F[0].trim():null}}return null}function u(z,J){let Z=f(z,J);if(!Z)return null;return Z.kind==="interface"?z.slice(Z.bodyStart,Z.end):z.slice(Z.bodyStart,Z.end).trim()}function f(z,J){let X=new RegExp(`\\binterface\\s+${J}\\b[^{]*\\{`,"m").exec(z);if(X){let $=X.index+X[0].length-1,F=G(z,$,"{","}");if(F!==-1)return{kind:"interface",start:X.index,end:F+1,bodyStart:$}}let H=new RegExp(`\\btype\\s+${J}\\b[^=]*=`,"m").exec(z);if(H){let $=H.index+H[0].length,F=0,B=$;while($<z.length){let W=z[$];if(W==='"'||W==="'"){$=D(z,$);continue}if(W==="`"){$=K(z,$);continue}if(W==="{"||W==="["||W==="("||W==="<")F++;else if(W==="}"||W==="]"||W===")"||W===">")F--;else if((W===";"||W===` `)&&F===0)break;$++}return{kind:"type",start:H.index,end:$,bodyStart:B}}return null}var E={String:"string",Number:"number",Boolean:"boolean",Array:"unknown[]",Object:"Record<string, unknown>",Function:"(...args: any[]) => any",Symbol:"symbol",Promise:"Promise<unknown>",Date:"Date",BigInt:"bigint"};function l(z){let J=z.search(/\bas\s+PropType\s*</);if(J===-1)return null;let Z=z.indexOf("<",J),X=O(z,Z);if(X===-1)return null;if(z.slice(X+1).trim()!=="")return null;return z.slice(Z+1,X).trim()}function R(z){let J=z.trim(),Z=l(J);if(Z!==null)return{type:Z,optional:!0};if(J==="null")return{type:"unknown",optional:!0};if(J.startsWith("[")){let X=G(J,0,"[","]");if(X!==-1){let Q=q(J.slice(1,X)).map((H)=>R(H).type).filter((H)=>H!=="unknown");return{type:Q.length>0?[...new Set(Q)].join(" | "):"unknown",optional:!0}}}if(J.startsWith("{")){let X=P(J),Q=X.find((B)=>B.key==="type"),H=X.find((B)=>B.key==="required"),$=Q?R(Q.value).type:"unknown",F=!(H&&H.value.trim()==="true");return{type:$,optional:F}}if(E[J])return{type:E[J],optional:!0};if(/^[A-Za-z_$][\w$.]*$/.test(J))return{type:J,optional:!0};return{type:"unknown",optional:!0}}function b(z){let J=z.trim();if(J.startsWith("{")){let Z=P(J);if(Z.length===0)return"{}";return`{ ${Z.map((Q)=>{if(Q.isMethod||Q.value==="")return`${v(Q.key)}?: unknown`;let H=R(Q.value);return`${v(Q.key)}${H.optional?"?":""}: ${H.type}`}).join(", ")} }`}if(J.startsWith("[")){let Z=G(J,0,"[","]");if(Z===-1)return null;let X=q(J.slice(1,Z)).map((Q)=>w(Q.trim())).filter((Q)=>Q!=="");if(X.length===0)return"{}";return`{ ${X.map((Q)=>`${v(Q)}?: unknown`).join(", ")} }`}return null}function m(z){let J=z.trim();if(!J.startsWith("["))return null;let Z=G(J,0,"[","]");if(Z===-1)return null;let X=q(J.slice(1,Z)).map((Q)=>Q.trim());if(X.length===0)return"{}";if(!X.every((Q)=>Q.startsWith("'")&&Q.endsWith("'")||Q.startsWith('"')&&Q.endsWith('"')))return"string[]";return`[${X.map((Q)=>JSON.stringify(w(Q))).join(", ")}]`}function h(z){let J=z.trim();if(!J.startsWith("{"))return null;let Z=P(J);if(Z.length===0)return"{}";return`{ ${Z.map((Q)=>`${JSON.stringify(Q.key)}: (...args: any[]) => void`).join(", ")} }`}function g(z){return m(z)??h(z)}function d(z){let J=[],Z=0,X="",Q=0;while(Q<z.length){let H=z[Q];if(H==='"'||H==="'"){let $=D(z,Q);X+=z.slice(Q,$),Q=$;continue}if(H==="`"){let $=K(z,Q);X+=z.slice(Q,$),Q=$;continue}if(H==="/"&&(z[Q+1]==="/"||z[Q+1]==="*")){let $=V(z,Q);X+=z.slice(Q,$),Q=$;continue}if(H==="="&&z[Q+1]===">"){X+="=>",Q+=2;continue}if(H==="{"||H==="["||H==="("||H==="<")Z++;else if(H==="}"||H==="]"||H===")"||H===">")Z--;if((H===";"||H===","||H===` `)&&Z===0){if(X.trim()!=="")J.push(X.trim());X="",Q++;continue}X+=H,Q++}if(X.trim()!=="")J.push(X.trim());return J}function x(z){let J=z.trim();if(!J.startsWith("{"))return null;let Z=G(J,0,"{","}");if(Z===-1||J.slice(Z+1).trim()!=="")return null;let X=d(J.slice(1,Z));if(X.length===0)return"{}";let Q=[];for(let H of X){let $=/^\(\s*\w+\s*:\s*/.exec(H);if(!$)return null;let F=$[0].length,B=H[F];if(B!=="'"&&B!=='"'&&B!=="`")return null;let W=D(H,F),U=H.slice(F+1,W-1),Y=G(H,H.indexOf("(",0),"(",")");if(Y===-1)return null;let N=H.slice(F,Y),_=q(N).slice(1),A=H.slice(Y+1).trim();if(A.startsWith(":"))A=A.slice(1).trim();if(A==="")A="void";Q.push(`${JSON.stringify(U)}: (${_.map((L)=>L.trim()).join(", ")}) => ${A}`)}return`{ ${Q.join(", ")} }`}function a(z){let J=z;for(let Z of["defineProps","defineEmits","defineExpose","defineOptions"])J=s(J,Z);return J}function s(z,J){let Z=new RegExp(`\\b${J}\\b`,"g"),X=[],Q=z,H;while((H=Z.exec(z))!==null){let $=z.lastIndexOf(` `,H.index)+1,F=z.slice($,H.index),B=/^\s*(?:(?:const|let|var)\s+[A-Za-z_$][\w$]*\s*(?::[^=]+)?=\s*)?(withDefaults\s*\(\s*)?$/.exec(F);if(!B)continue;let W=H.index+H[0].length;while(W<z.length&&/\s/.test(z[W]))W++;if(z[W]==="<"){let N=O(z,W);if(N===-1)continue;W=N+1;while(W<z.length&&/\s/.test(z[W]))W++}if(z[W]!=="(")continue;let U=G(z,W,"(",")");if(U===-1)continue;if(B[1]){let N=$+F.length-B[1].length,_=z.indexOf("(",N);if(_!==-1){let A=G(z,_,"(",")");if(A!==-1)U=A}}let Y=U+1;while(Y<z.length&&z[Y]!==` `&&/\s|;/.test(z[Y]))Y++;if(z[Y]===` `)Y++;X.push([$,Y])}for(let $=X.length-1;$>=0;$--)Q=Q.slice(0,X[$][0])+Q.slice(X[$][1]);return Q}function o(z){let J=/\bexport\s+default\b/g,Z;while((Z=J.exec(z))!==null){let X=Z.index+Z[0].length;while(X<z.length&&/\s/.test(z[X]))X++;let Q=-1,H=-1,$=-1;if(z[X]==="{")Q=X,H=G(z,X,"{","}"),$=H;else if(z.startsWith("defineComponent",X)){let W=z.indexOf("(",X);if(W!==-1){let U=W+1;while(U<z.length&&/\s/.test(z[U]))U++;if(z[U]==="{")Q=U,H=G(z,U,"{","}"),$=G(z,W,"(",")")}}if(Q===-1||H===-1||$===-1)return{options:null,script:z,passthrough:!0};let F=$+1;if(z[F]===";")F++;let B=(z.slice(0,Z.index)+z.slice(F)).trim();return{options:z.slice(Q,H+1),script:B,passthrough:!1}}return{options:null,script:z,passthrough:!1}}function k(z,J){let Z=P(z).find((X)=>X.key===J);return Z&&Z.value!==""?Z.value:null}function S(z,J){let Z=p(z),X=z;for(let Q=Z.length-1;Q>=0;Q--){let H=Z[Q],$=X.slice(0,H.start)+X.slice(H.end);if(new RegExp(`\\b${H.name}\\b`).test($))continue;if(new RegExp(`\\btypeof\\s+${H.name}\\b`).test(J))continue;X=$}return X}function p(z){let J=[],Z=/^[ \t]*(const|let|var|(?:async[ \t]+)?function)[ \t]+([A-Za-z_$][\w$]*)[ \t]*(?::[^=\n]+)?=?/gm,X;while((X=Z.exec(z))!==null){let Q=z.lastIndexOf(` `,X.index)+1;if(/\bexport\b/.test(z.slice(Q,X.index)))continue;let H=X[1],$=X[2],F=X.index+X[0].length,B=-1;if(H.endsWith("function")){let W=z.indexOf("(",F);if(W===-1)continue;let U=G(z,W,"(",")");if(U===-1)continue;F=U+1;while(F<z.length&&/\s/.test(z[F]))F++;if(z[F]===":")while(F<z.length&&z[F]!=="{"&&z[F]!==` `)F++;while(F<z.length&&/\s/.test(z[F])&&z[F]!==` `)F++;if(z[F]!=="{")continue;let Y=G(z,F,"{","}");if(Y===-1)continue;B=Y+1}else{let W=0;while(F<z.length){let U=z[F];if(U==='"'||U==="'"){F=D(z,F);continue}if(U==="`"){F=K(z,F);continue}if(U==="/"&&(z[F+1]==="/"||z[F+1]==="*")){F=V(z,F);continue}if(U==="{"||U==="["||U==="(")W++;else if(U==="}"||U==="]"||U===")")W--;else if(U===";"&&W===0){B=F+1;break}else if(U===` `&&W===0){B=F;break}F++}if(B===-1)B=z.length}if(z[B]===` `)B++;J.push({name:$,start:X.index,end:B})}return J}function T(z,J,Z){let X=z.indexOf(Z);if(X===-1)return z;let Q=z.lastIndexOf(` `,X)+1;if(/\bexport\b/.test(z.slice(Q,X)))return z;let H=z.slice(0,X)+z.slice(X+Z.length);if(new RegExp(`\\b${J}\\b`).test(H))return z;return H}function r(z){let J="",Z=0,X=()=>{for(let H=J.length-1;H>=0;H--)if(!/\s/.test(J[H]))return J[H];return""},Q=(H)=>{for(let $=H;$<z.length;$++)if(!/\s/.test(z[$]))return z[$];return""};while(Z<z.length){let H=z[Z];if(H==='"'||H==="'"){let $=D(z,Z);J+=z.slice(Z,$),Z=$;continue}if(H==="`"){let $=K(z,Z);J+=z.slice(Z,$),Z=$;continue}if(H==="/"&&z[Z+1]==="*"){let $=V(z,Z);J+=z.slice(Z,$).replace(/\s*\n\s*/g," "),Z=$;continue}if(H==="/"&&z[Z+1]==="/"){let $=Z+2;while($<z.length&&z[$]!==` `)$++;let F=z.slice(Z+2,$).trim();if(F!==""&&!F.includes("*/"))J+=`/* ${F} */`;Z=$;continue}if(H===` `){let $=X(),F=Q(Z+1);if($===""||F===""){Z++;continue}let B=c(J);if(!B&&("{;,(<:=[".includes($)||"}),]>;|&".includes(F))){if(!J.endsWith(" ")&&!J.endsWith(";"))J+=" "}else if(B){if(!J.endsWith(" "))J+=" "}else{if(J.endsWith(" "))J=J.slice(0,-1);J+="; "}Z++;while(Z<z.length&&(z[Z]===" "||z[Z]==="\t"))Z++;continue}J+=H,Z++}return J}function c(z){let J=z.length-1;while(J>=0&&/\s/.test(z[J]))J--;if(J<1||z[J]!=="/"||z[J-1]!=="*")return!1;let Z=z.lastIndexOf("/*",J);if(Z===-1)return!1;for(let X=Z-1;X>=0;X--){let Q=z[X];if(/\s/.test(Q))continue;return"{;,(<:".includes(Q)}return!0}function i(z,J){let Z=[z,J].filter((X)=>X!==null);for(let X of Z){let Q=j(X,"defineProps");if(!Q)continue;if(Q.generic){let H=Q.generic;if(H.startsWith("{"))return{type:H};if(/^[A-Za-z_$][\w$]*$/.test(H)){for(let $ of Z){let F=f($,H);if(!F)continue;let B=u($,H);if(B===null)continue;return{type:B,inlinedLocal:{name:H,declText:$.slice(F.start,F.end)}}}return{type:H}}return{type:H}}if(Q.arg){let H=b(Q.arg);if(H!==null)return{type:H}}}return null}function n(z,J){let Z=[z,J].filter((X)=>X!==null);for(let X of Z){let Q=j(X,"defineEmits");if(!Q)continue;if(Q.generic)return x(Q.generic)??Q.generic;if(Q.arg){let H=g(Q.arg);if(H!==null)return H}}return null}function e(z,J){let Z=[z,J].filter((X)=>X!==null);for(let X of Z){let Q=j(X,"defineExpose");if(!Q||!Q.arg||!Q.arg.startsWith("{"))continue;let H=P(Q.arg);if(H.length===0)return null;return`{ ${H.map((F)=>{let B=F.isMethod||/=>|^\s*function\b/.test(F.value);return`${v(F.key)}: ${B?"(...args: any[]) => any":"unknown"}`}).join(", ")} }`}return null}function zz(z){let J=y(z),Z="",X=null,Q=null;if(J.script){let I=o(J.script.content);if(I.passthrough)return J.scriptSetup?`${J.script.content} ${J.scriptSetup.content}`:J.script.content;if(Z=I.script,I.options){let C=k(I.options,"props");if(C)X=b(C);let M=k(I.options,"emits");if(M)Q=g(M)}}let H=J.scriptSetup?.content??null,$=H!==null?a(H):null,F=i(H,H!==null?null:Z),B=F?.type??X??"{}",W=n(H,null)??Q,U=e(H,null),Y=F?.inlinedLocal;if(Y){if(Z=T(Z,Y.name,Y.declText),$!==null)$=T($,Y.name,Y.declText)}let N=[B,U??"{}"];if(W)N.push("{}","{}","{}","{}","{}",W);let _=r(`DefineComponent<${N.join(", ")}>`),A=[],L=S(Z,_);if(L.trim()!=="")A.push(L);if($&&$.trim()!==""){let I=S($,_);if(I.trim()!=="")A.push(I)}return A.push("import type { DefineComponent } from 'vue'"),A.push(`type __DtsxComponentType = ${_}`),A.push("const __dtsx_component__: __DtsxComponentType = null as unknown as __DtsxComponentType"),A.push("export default __dtsx_component__"),A.join(` `)} export{t as lf,y as mf,G as nf,b as of,a as pf,o as qf,zz as rf};