tsdoc-markdown
Version:
Generates markdown documentation from TypeScript source code.
4 lines (3 loc) • 6.71 kB
JavaScript
import { createRequire } from 'module';import path from 'path';import {fileURLToPath} from 'url';const __filename = fileURLToPath(import.meta.url);const __dirname = path.dirname(__filename);const require = createRequire(import.meta.url);
import{relative as R,resolve as h}from"node:path/posix";import{ModifierFlags as E,ModuleKind as $,NodeFlags as z,ScriptTarget as J,SyntaxKind as n,createProgram as B,displayPartsToString as F,forEachChild as A,getCombinedModifierFlags as _,isArrowFunction as j,isClassDeclaration as k,isEnumDeclaration as U,isFunctionDeclaration as q,isIdentifier as V,isInterfaceDeclaration as Q,isMethodDeclaration as v,isModuleDeclaration as G,isPropertyDeclaration as L,isPropertySignature as H,isTypeAliasDeclaration as W,isVariableDeclaration as X,isVariableStatement as Y}from"typescript";var D=({checker:e,symbol:t,doc_type:a})=>({name:t.getName(),documentation:F(t.getDocumentationComment(e)),type:e.typeToString(e.getTypeOfSymbolAtLocation(t,t.valueDeclaration)),jsDocs:t.getJsDocTags(),...a!==void 0&&{doc_type:a}}),C=e=>(e==null?void 0:e.getJsDocTags().some(({name:t})=>t==="internal"))??!1,Z=({checker:e,symbol:t,doc_type:a,skipInternal:r})=>{let{members:p}=t.valueDeclaration,s=p.filter(u=>{if(!r)return!0;let{symbol:m}=u;return!C(m)}).map(u=>{var l;let m=F(u.symbol.getDocumentationComment(e)),o=(l=u.initializer)==null?void 0:l.getText();return{name:u.name.getText(),...o!==void 0&&{type:o},...m!==""&&{documentation:m}}});return{name:t.getName(),documentation:F(t.getDocumentationComment(e)),properties:s,jsDocs:t.getJsDocTags(),doc_type:a??"enum"}},tt=({checker:e,symbol:t,skipInternal:a})=>{let r=D({checker:e,symbol:t,doc_type:"class"}),p=e.getTypeOfSymbolAtLocation(t,t.valueDeclaration);return r.constructors=p.getConstructSignatures().filter(s=>a?!s.getJsDocTags().some(({name:u})=>u==="internal"):!0).map(s=>nt({checker:e,signature:s})).filter(({documentation:s})=>s!==void 0&&s!==""),r},et=e=>{let t=_(e);return(v(e)||L(e))&&e.name.kind===n.PrivateIdentifier?!1:(t&E.Export)!==0||(t&E.Public)!==0||k(e.parent)&&[E.None,E.Static].includes(t)},x=e=>!v(e)&&!L(e)?void 0:(_(e)&E.Static)!==0,nt=({checker:e,signature:t})=>{var r;let a={parameters:t.parameters.map(p=>D({checker:e,symbol:p})),returnType:e.typeToString(t.getReturnType()),documentation:F(t.getDocumentationComment(e))};return t.declaration!=null&&"modifiers"in t.declaration?{...a,visibility:((r=t.declaration.modifiers)==null?void 0:r[0].kind)===n.PrivateKeyword?"private":"public"}:{...a,visibility:"public"}},I=e=>j(e)?e:A(e,I),it=e=>[n.TypePredicate,n.TypeReference,n.FunctionType,n.ConstructorType,n.TypeQuery,n.TypeLiteral,n.ArrayType,n.TupleType,n.OptionalType,n.RestType,n.UnionType,n.IntersectionType,n.ConditionalType,n.InferType,n.ParenthesizedType,n.ThisType,n.TypeOperator,n.IndexedAccessType,n.MappedType,n.LiteralType,n.NamedTupleMember,n.TemplateLiteralType,n.ImportType].includes(e),K=e=>{if(e.parent)return X(e.parent)&&V(e.parent.name)?e.parent.name.text:K(e.parent)},M=e=>{let{parent:t}=e;return t?t.kind===n.SourceFile||t.kind===n.ClassDeclaration?!0:t.kind===n.FunctionDeclaration||t.kind===n.FunctionExpression||t.kind===n.ArrowFunction||t.kind===n.PropertyAssignment||t.kind===n.ObjectLiteralExpression?!1:M(t):!1},b=({skipInternal:e,symbol:t,skipValue:a,fn:r})=>e&&C(t)?a:r(),P=({checker:e,node:t,types:a,skipInternal:r,...p})=>{if(!et(t))return[];let s=[],u=({details:o,node:l})=>{s.push({...o,...N({node:l,...p})})},m=({symbol:o,doc_type:l,isStatic:i,node:y})=>{if(!o)return;b({symbol:o,skipInternal:r,skipValue:void 0,fn:()=>{let d={...D({checker:e,symbol:o,doc_type:l}),isStatic:i};u({node:y,details:d})}})};if(k(t)&&t.name){let o=e.getSymbolAtLocation(t.name);o&&b({symbol:o,skipInternal:r,skipValue:[],fn:()=>{let i={...tt({checker:e,symbol:o,skipInternal:r}),methods:[],properties:[],jsDocs:o.getJsDocTags(),...N({node:t,...p})};return A(t,f=>{var g,T;let d=P({node:f,checker:e,types:a,skipInternal:r,...p}),c=({fileName:S,...O})=>O;(g=i.methods)==null||g.push(...d.filter(({doc_type:S})=>S==="method"||S==="function").map(c)),(T=i.properties)==null||T.push(...d.filter(({doc_type:S})=>S==="property").map(c))}),s.push(i),s}})}else if(G(t))A(t,l=>{let i=P({node:l,checker:e,types:a,skipInternal:r,...p});s.push(...i)});else if(v(t)){let o=e.getSymbolAtLocation(t.name),l=x(t);m({symbol:o,doc_type:"method",isStatic:l,node:t})}else if(q(t)){let o=e.getSymbolAtLocation(t.name??t);m({symbol:o,doc_type:"function",node:t})}else{let o=I(t),l=o!==void 0?e.getSymbolAtLocation(o.parent.name):void 0;if(o!==void 0&&l!==void 0){if(r&&C(l))return[];let i=M(o)?void 0:K(o),y=D({checker:e,symbol:l,doc_type:"function"});u({node:t,details:{...y,name:i!==void 0?`${i}.${y.name}`:y.name}})}else if(L(t)){let i=e.getSymbolAtLocation(t.name),y=x(t);m({symbol:i,doc_type:"property",isStatic:y,node:t})}else if(Y(t)){let{declarationList:{declarations:i,flags:y}}=t;if((y&z.Const)!==0){let{symbol:d}=i[0];m({symbol:d,doc_type:"const",node:t})}}else if(a&&Q(t)){let i=e.getSymbolAtLocation(t.name);i&&b({symbol:i,skipInternal:r,skipValue:[],fn:()=>{let f=t.members.filter(c=>H(c)&&c.name!==void 0&&V(c.name)).map(c=>e.getSymbolAtLocation(c.name)).filter(c=>c!==void 0).filter(c=>!r||!C(c)).map(c=>D({checker:e,symbol:c})),d={...D({checker:e,doc_type:"interface",symbol:i}),properties:f,...N({node:t,...p})};return s.push(d),s}})}else if(a&&W(t)){let i=e.getSymbolAtLocation(t.name);i&&b({symbol:i,skipInternal:r,skipValue:[],fn:()=>{let f=t.getChildren().find(({kind:c})=>it(c)),d={...D({checker:e,doc_type:"type",symbol:i}),...N({node:t,...p}),type:f==null?void 0:f.getText().replace(/^"|"$/g,"")};return s.push(d),s}})}else if(U(t)){let i=e.getSymbolAtLocation(t.name);b({symbol:i,skipInternal:r,skipValue:[],fn:()=>{if(r&&C(i))return[];let f=Z({checker:e,symbol:i,skipInternal:r});return u({node:t,details:f}),s}})}}return s},w={target:J.ES2020,module:$.CommonJS,strictNullChecks:!0},N=({repo:e,node:t,sourceFile:a})=>{let{fileName:r}=a;if(e===void 0)return{fileName:r};let{url:p,branch:s}=e,{line:u}=a.getLineAndCharacterOfPosition(t.getStart()),m=R(process.cwd(),a.fileName),o=`${p.replace(/\/+$/,"")}/tree/${s??"main"}/${m.replace(/^\.\.\//,"")}#L${u+1}`;return{fileName:r,url:o}},st=({inputFiles:e,options:t})=>{let{compilerOptions:a,explore:r,repo:p,types:s,skipInternal:u}=t??{explore:!1,compilerOptions:w,types:!1,skipInternal:!1},m=r??!1,o=s??!1,l=u??!1,i=B(e,a??w),y=i.getSourceFiles(),f=e.map(T=>h(T)),d=y.filter(({isDeclarationFile:T,fileName:S})=>!T&&(m||f.includes(h(S)))),c=i.getTypeChecker(),g=[];for(let T of d)A(T,S=>{let O=P({checker:c,node:S,sourceFile:T,repo:p,types:o,skipInternal:l});g.push(...O)});return g};export{st as a};
//# sourceMappingURL=chunk-MQ67SAUG.mjs.map