Procházet zdrojové kódy

feat(docs): Render optional & initialized modifiers in method params

Relates to #89
Michael Bromley před 6 roky
rodič
revize
e0ccbf58e3

+ 2 - 0
scripts/docs/typescript-docgen-types.ts

@@ -3,6 +3,8 @@ import ts from 'typescript';
 export interface MethodParameterInfo {
     name: string;
     type: string;
+    optional: boolean;
+    initializer?: string;
 }
 
 export interface MemberInfo {

+ 4 - 0
scripts/docs/typescript-docs-parser.ts

@@ -133,6 +133,8 @@ export class TypescriptDocsParser {
             const parameters = statement.parameters.map(p => ({
                 name: p.name.getText(),
                 type: p.type ? p.type.getText() : '',
+                optional: !!p.questionToken,
+                initializer: p.initializer && p.initializer.getText(),
             }));
             return {
                 ...info,
@@ -244,6 +246,8 @@ export class TypescriptDocsParser {
                     parameters = member.parameters.map(p => ({
                         name: p.name.getText(),
                         type: p.type ? p.type.getText() : '',
+                        optional: !!p.questionToken,
+                        initializer: p.initializer && p.initializer.getText(),
                     }));
                     result.push({
                         ...memberInfo,

+ 7 - 11
scripts/docs/typescript-docs-renderer.ts

@@ -164,9 +164,7 @@ export class TypescriptDocsRenderer {
             .map(member => {
                 if (member.kind === 'method') {
                     const args = member.parameters
-                        .map(p => {
-                            return `${p.name}: ${p.type}`;
-                        })
+                        .map(p => this.renderParameter(p, p.type))
                         .join(', ');
                     if (member.fullText === 'constructor') {
                         return `  constructor(${args})`;
@@ -220,11 +218,7 @@ export class TypescriptDocsRenderer {
 
     private renderFunctionSignature(functionInfo: FunctionInfo, knownTypeMap: TypeMap): string {
         const { fullText, parameters, type } = functionInfo;
-        const args = parameters
-                  .map(p => {
-                      return `${p.name}: ${p.type}`;
-                  })
-                  .join(', ');
+        const args = parameters.map(p => this.renderParameter(p, p.type)).join(', ');
         let output = '';
         output += `\`\`\`TypeScript\n`;
         output += `function ${fullText}(${args}): ${type ? type.getText() : 'void'}\n`;
@@ -255,9 +249,7 @@ export class TypescriptDocsRenderer {
                     : '';
             } else {
                 const args = member.parameters
-                    .map(p => {
-                        return `${p.name}: ${this.renderType(p.type, knownTypeMap, docsUrl)}`;
-                    })
+                    .map(p => this.renderParameter(p, this.renderType(p.type, knownTypeMap, docsUrl)))
                     .join(', ');
                 if (member.fullText === 'constructor') {
                     type = `(${args}) => ${title}`;
@@ -272,6 +264,10 @@ export class TypescriptDocsRenderer {
         return output;
     }
 
+    private renderParameter(p: MethodParameterInfo, typeString: string): string {
+        return `${p.name}${p.optional ? '?' : ''}: ${typeString}${p.initializer ? ` = ${p.initializer}` : ''}`;
+    }
+
     private renderGenerationInfoShortcode(info: DeclarationInfo): string {
         const sourceFile = info.sourceFile.replace(/^\.\.\//, '');
         return `{{< generation-info sourceFile="${sourceFile}" sourceLine="${info.sourceLine}" packageName="${info.packageName}">}}\n\n`;