ソースを参照

chore: Update docgen script to work with latest TS API

Michael Bromley 1 年間 前
コミット
385137dadf
1 ファイル変更20 行追加13 行削除
  1. 20 13
      scripts/docs/typescript-docs-parser.ts

+ 20 - 13
scripts/docs/typescript-docs-parser.ts

@@ -1,6 +1,6 @@
 import fs from 'fs';
 import path from 'path';
-import ts, { HeritageClause, JSDocTag, SyntaxKind } from 'typescript';
+import ts, { HeritageClause, JSDocTag, Modifier, NodeArray, SyntaxKind } from 'typescript';
 
 import { notNullOrUndefined } from '../../packages/common/src/shared-utils';
 
@@ -78,14 +78,19 @@ export class TypescriptDocsParser {
     private getStatementsWithSourceLocation(
         sourceFiles: ts.SourceFile[],
     ): Array<{ statement: ts.Statement; sourceFile: string; sourceLine: number }> {
-        return sourceFiles.reduce((st, sf) => {
-            const statementsWithSources = sf.statements.map(statement => {
-                const sourceFile = path.relative(path.join(__dirname, '..'), sf.fileName).replace(/\\/g, '/');
-                const sourceLine = sf.getLineAndCharacterOfPosition(statement.getStart()).line + 1;
-                return { statement, sourceFile, sourceLine };
-            });
-            return [...st, ...statementsWithSources];
-        }, [] as Array<{ statement: ts.Statement; sourceFile: string; sourceLine: number }>);
+        return sourceFiles.reduce(
+            (st, sf) => {
+                const statementsWithSources = sf.statements.map(statement => {
+                    const sourceFile = path
+                        .relative(path.join(__dirname, '..'), sf.fileName)
+                        .replace(/\\/g, '/');
+                    const sourceLine = sf.getLineAndCharacterOfPosition(statement.getStart()).line + 1;
+                    return { statement, sourceFile, sourceLine };
+                });
+                return [...st, ...statementsWithSources];
+            },
+            [] as Array<{ statement: ts.Statement; sourceFile: string; sourceLine: number }>,
+        );
     }
 
     /**
@@ -237,9 +242,11 @@ export class TypescriptDocsParser {
         members: ts.NodeArray<ts.TypeElement | ts.ClassElement | ts.EnumMember>,
     ): Array<PropertyInfo | MethodInfo> {
         const result: Array<PropertyInfo | MethodInfo> = [];
+        const hasModifiers = (member: any): member is { modifiers: NodeArray<Modifier> } =>
+            Array.isArray(member.modifiers);
 
         for (const member of members) {
-            const modifiers = member.modifiers ? member.modifiers.map(m => m.getText()) : [];
+            const modifiers = hasModifiers(member) ? member.modifiers.map(m => m.getText()) : [];
             const isPrivate = modifiers.includes('private');
             if (
                 !isPrivate &&
@@ -255,8 +262,8 @@ export class TypescriptDocsParser {
                 const name = member.name
                     ? member.name.getText()
                     : ts.isIndexSignatureDeclaration(member)
-                    ? '[index]'
-                    : 'constructor';
+                      ? '[index]'
+                      : 'constructor';
                 let description = '';
                 let type = '';
                 let defaultValue = '';
@@ -292,7 +299,7 @@ export class TypescriptDocsParser {
                     fullText,
                     name,
                     description: this.restoreTokens(description),
-                    type,
+                    type: type.replace(/`/g, '\\`'),
                     modifiers,
                     since,
                     experimental,