tsdoc-markdown
Version:
Generates markdown documentation from TypeScript source code.
4 lines (3 loc) • 5.91 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 K,resolve as v}from"path/posix";import{ModifierFlags as D,ModuleKind as M,NodeFlags as $,ScriptTarget as R,SyntaxKind as n,createProgram as z,displayPartsToString as b,forEachChild as E,getCombinedModifierFlags as P,isArrowFunction as k,isClassDeclaration as x,isEnumDeclaration as B,isFunctionDeclaration as V,isIdentifier as h,isInterfaceDeclaration as j,isMethodDeclaration as F,isModuleDeclaration as J,isPropertyDeclaration as A,isPropertySignature as U,isTypeAliasDeclaration as q,isVariableDeclaration as Q,isVariableStatement as G}from"typescript";var T=({checker:e,symbol:t,doc_type:r})=>({name:t.getName(),documentation:b(t.getDocumentationComment(e)),type:e.typeToString(e.getTypeOfSymbolAtLocation(t,t.valueDeclaration)),jsDocs:t.getJsDocTags(),...r!==void 0&&{doc_type:r}}),H=({checker:e,symbol:t,doc_type:r})=>{let{members:l}=t.valueDeclaration,c=l.map(y=>{var i;let u=b(y.symbol.getDocumentationComment(e)),o=(i=y.initializer)==null?void 0:i.getText();return{name:y.name.getText(),...o!==void 0&&{type:o},...u!==""&&{documentation:u}}});return{name:t.getName(),documentation:b(t.getDocumentationComment(e)),properties:c,jsDocs:t.getJsDocTags(),doc_type:r??"enum"}},W=({checker:e,symbol:t})=>{let r=T({checker:e,symbol:t,doc_type:"class"}),l=e.getTypeOfSymbolAtLocation(t,t.valueDeclaration);return r.constructors=l.getConstructSignatures().map(c=>Y({checker:e,signature:c})).filter(({documentation:c})=>c!==void 0&&c!==""),r},X=e=>{let t=P(e);return(F(e)||A(e))&&e.name.kind===n.PrivateIdentifier?!1:(t&D.Export)!==0||(t&D.Public)!==0||x(e.parent)&&[D.None,D.Static].includes(t)},L=e=>!F(e)&&!A(e)?void 0:(P(e)&D.Static)!==0,Y=({checker:e,signature:t})=>{var l;let r={parameters:t.parameters.map(c=>T({checker:e,symbol:c})),returnType:e.typeToString(t.getReturnType()),documentation:b(t.getDocumentationComment(e))};return t.declaration!=null&&"modifiers"in t.declaration?{...r,visibility:((l=t.declaration.modifiers)==null?void 0:l[0].kind)===n.PrivateKeyword?"private":"public"}:{...r,visibility:"public"}},_=e=>k(e)?e:E(e,_),Z=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),w=e=>{if(e.parent)return Q(e.parent)&&h(e.parent.name)?e.parent.name.text:w(e.parent)},I=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:I(t):!1},N=({checker:e,node:t,types:r,...l})=>{if(!X(t))return[];let c=[],y=({details:o,node:i})=>{c.push({...o,...g({node:i,...l})})},u=({symbol:o,doc_type:i,isStatic:s,node:a})=>{if(!o)return;let m={...T({checker:e,symbol:o,doc_type:i}),isStatic:s};y({node:a,details:m})};if(x(t)&&t.name){let o=e.getSymbolAtLocation(t.name);if(o){let i={...W({checker:e,symbol:o}),methods:[],properties:[],...g({node:t,...l})};E(t,a=>{var S,d;let m=N({node:a,checker:e,types:r,...l}),p=({fileName:f,...C})=>C;(S=i.methods)==null||S.push(...m.filter(({doc_type:f})=>f==="method"||f==="function").map(p)),(d=i.properties)==null||d.push(...m.filter(({doc_type:f})=>f==="property").map(p))}),c.push(i)}}else if(J(t))E(t,i=>{let s=N({node:i,checker:e,types:r,...l});c.push(...s)});else if(F(t)){let o=e.getSymbolAtLocation(t.name),i=L(t);u({symbol:o,doc_type:"method",isStatic:i,node:t})}else if(V(t)){let o=e.getSymbolAtLocation(t.name??t);u({symbol:o,doc_type:"function",node:t})}else{let o=_(t),i=o!==void 0?e.getSymbolAtLocation(o.parent.name):void 0;if(o!==void 0&&i!==void 0){let s=I(o)?void 0:w(o),a=T({checker:e,symbol:i,doc_type:"function"});y({node:t,details:{...a,name:s!==void 0?`${s}.${a.name}`:a.name}})}else if(A(t)){let s=e.getSymbolAtLocation(t.name),a=L(t);u({symbol:s,doc_type:"property",isStatic:a,node:t})}else if(G(t)){let{declarationList:{declarations:s,flags:a}}=t;if((a&$.Const)!==0){let{symbol:p}=s[0];u({symbol:p,doc_type:"const",node:t})}}else if(r&&j(t)){let s=e.getSymbolAtLocation(t.name);if(s){let a=t.members.filter(p=>U(p)&&p.name!==void 0&&h(p.name)).map(p=>e.getSymbolAtLocation(p.name)).filter(p=>p!==void 0).map(p=>T({checker:e,symbol:p})),m={...T({checker:e,doc_type:"interface",symbol:s}),properties:a,...g({node:t,...l})};c.push(m)}}else if(r&&q(t)){let s=e.getSymbolAtLocation(t.name);if(s){let a=t.getChildren().find(({kind:p})=>Z(p)),m={...T({checker:e,doc_type:"type",symbol:s}),...g({node:t,...l}),type:a==null?void 0:a.getText().replace(/^"|"$/g,"")};c.push(m)}}else if(B(t)){let s=e.getSymbolAtLocation(t.name),a=H({checker:e,symbol:s});y({node:t,details:a})}}return c},O={target:R.ES2020,module:M.CommonJS,strictNullChecks:!0},g=({repo:e,node:t,sourceFile:r})=>{let{fileName:l}=r;if(e===void 0)return{fileName:l};let{url:c,branch:y}=e,{line:u}=r.getLineAndCharacterOfPosition(t.getStart()),o=K(process.cwd(),r.fileName),i=`${c.replace(/\/+$/,"")}/tree/${y??"main"}/${o.replace(/^\.\.\//,"")}#L${u+1}`;return{fileName:l,url:i}},nt=({inputFiles:e,options:t})=>{let{compilerOptions:r,explore:l,repo:c,types:y}=t??{explore:!1,compilerOptions:O,types:!1},u=l??!1,o=y??!1,i=z(e,r??O),s=i.getSourceFiles(),a=e.map(d=>v(d)),m=s.filter(({isDeclarationFile:d,fileName:f})=>!d&&(u||a.includes(v(f)))),p=i.getTypeChecker(),S=[];for(let d of m)E(d,f=>{let C=N({checker:p,node:f,sourceFile:d,repo:c,types:o});S.push(...C)});return S};export{nt as a};
//# sourceMappingURL=chunk-HDQJBSCU.mjs.map