diff --git a/packages/plugin-declaration-generator/src/tsgenerator.ts b/packages/plugin-declaration-generator/src/tsgenerator.ts
index 2b746c71..27d0d3a5 100644
--- a/packages/plugin-declaration-generator/src/tsgenerator.ts
+++ b/packages/plugin-declaration-generator/src/tsgenerator.ts
@@ -1,6 +1,15 @@
import ts from 'typescript';
import fs from 'fs-extra';
+/**
+ * Tools: https://ts-ast-viewer.com/
+ */
+
+interface ExportModuleItem {
+ name: string;
+ comment?: string;
+}
+
/**
* 解析文件
*/
@@ -10,20 +19,53 @@ export function parseFile(filePath: string, options: ts.CompilerOptions) {
const service = ts.createLanguageService(host, ts.createDocumentRegistry());
const program = service.getProgram();
- const exportModules: string[] = [];
- program?.getSourceFile(filePath)?.forEachChild((node) => {
+ const exportModules: ExportModuleItem[] = [];
+ const sourceFile = program?.getSourceFile(filePath);
+ sourceFile?.forEachChild((node) => {
if (ts.isExportDeclaration(node)) {
+ // 如果为导出声明: export { foo } from 'foo'
node.exportClause?.forEachChild((exportSpec) => {
if (ts.isExportSpecifier(exportSpec)) {
- exportModules.push(exportSpec.name.text);
+ exportModules.push({
+ name: exportSpec.name.text,
+ // comment:
+ });
}
});
+ } else if (isExportFunc(node)) {
+ // 如果是方法导出: export function foo() {}
+ if (node.name) {
+ exportModules.push({
+ name: node.name.text,
+ comment: getNodeComments(node),
+ });
+ }
}
});
return { exportModules };
}
+function isExportFunc(node: ts.Node): node is ts.FunctionDeclaration {
+ if (ts.isFunctionDeclaration(node)) {
+ if (node.modifiers) {
+ return node.modifiers.some((m) => m.kind === ts.SyntaxKind.ExportKeyword);
+ }
+ }
+
+ return false;
+}
+
+function getNodeComments(node: ts.Node): string | undefined {
+ const comments = ts.getSyntheticLeadingComments(node);
+
+ if (!comments) {
+ return undefined;
+ }
+
+ return comments.map((c) => c.text).join('\n');
+}
+
class FileServiceHost implements ts.LanguageServiceHost {
constructor(public filePath: string, private options: ts.CompilerOptions) {}
diff --git a/packages/plugin-declaration-generator/test/demo/index.ts b/packages/plugin-declaration-generator/test/demo/index.ts
index d5c9e72a..a90b8b13 100644
--- a/packages/plugin-declaration-generator/test/demo/index.ts
+++ b/packages/plugin-declaration-generator/test/demo/index.ts
@@ -1,2 +1,9 @@
export { foo } from '@/foo';
export { bar } from '@/bar';
+
+/**
+ * Root export
+ */
+export function main() {
+ console.log('main');
+}