From dfed58a30fb9e3e38527d4fe76f839c848562d75 Mon Sep 17 00:00:00 2001 From: Gerrit Birkeland Date: Tue, 31 May 2022 20:24:07 -0600 Subject: [PATCH] Support for "declare global" modules CC: @Zamiel --- CHANGELOG.md | 4 ++++ src/lib/converter/converter.ts | 23 ++++++++++++++++++- src/test/behaviorTests.ts | 8 +++++++ src/test/converter2/behavior/declareGlobal.ts | 9 ++++++++ 4 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 src/test/converter2/behavior/declareGlobal.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index bde708bd4..5747ea4c3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Unreleased +### Features + +- Added support for documenting a module's global declarations as its exports if it contains no real exports. + ### Bug Fixes - Restore support for TS 4.0 through 4.5, #1945. diff --git a/src/lib/converter/converter.ts b/src/lib/converter/converter.ts index 04f3d96c1..0b740d2bf 100644 --- a/src/lib/converter/converter.ts +++ b/src/lib/converter/converter.ts @@ -469,7 +469,7 @@ function getSymbolForModuleLike( function getExports( context: Context, - node: ts.SourceFile | ts.ModuleBlock, + node: ts.SourceFile, symbol: ts.Symbol | undefined ): ts.Symbol[] { let result: ts.Symbol[]; @@ -496,6 +496,27 @@ function getExports( result = context.checker .getExportsOfModule(symbol) .filter((s) => !hasAllFlags(s.flags, ts.SymbolFlags.Prototype)); + + if (result.length === 0) { + const globalDecl = node.statements.find( + (s) => + ts.isModuleDeclaration(s) && + s.flags & ts.NodeFlags.GlobalAugmentation + ); + + if (globalDecl) { + const globalSymbol = context.getSymbolAtLocation(globalDecl); + if (globalSymbol) { + result = context.checker + .getExportsOfModule(globalSymbol) + .filter((exp) => + exp.declarations?.some( + (d) => d.getSourceFile() === node + ) + ); + } + } + } } else { // Global file with no inferred top level symbol, get all symbols declared in this file. const sourceFile = node.getSourceFile(); diff --git a/src/test/behaviorTests.ts b/src/test/behaviorTests.ts index 5f5179a77..2ad7ae0e6 100644 --- a/src/test/behaviorTests.ts +++ b/src/test/behaviorTests.ts @@ -81,6 +81,14 @@ export const behaviorTests: Record< "WithoutReadonlyNumeric" ); }, + + declareGlobal(project) { + equal( + project.children?.map((c) => c.name), + ["DeclareGlobal"] + ); + }, + duplicateHeritageClauses(project) { const b = query(project, "B"); equal(b.extendedTypes?.map(String), ["A"]); diff --git a/src/test/converter2/behavior/declareGlobal.ts b/src/test/converter2/behavior/declareGlobal.ts new file mode 100644 index 000000000..c8f65e77a --- /dev/null +++ b/src/test/converter2/behavior/declareGlobal.ts @@ -0,0 +1,9 @@ +import { SyntaxKind } from "typescript"; + +declare global { + interface DeclareGlobal { + method(kind: SyntaxKind): void; + } +} + +namespace NotIncluded {}