diff options
-rw-r--r-- | js/globals.ts | 7 | ||||
-rw-r--r-- | js/lib.web_assembly.d.ts | 6 | ||||
-rw-r--r-- | tools/ts_library_builder/ast_util.ts | 15 | ||||
-rw-r--r-- | tools/ts_library_builder/build_library.ts | 10 | ||||
-rw-r--r-- | tools/ts_library_builder/test.ts | 10 | ||||
-rw-r--r-- | tools/ts_library_builder/testdata/globals.ts | 4 |
6 files changed, 45 insertions, 7 deletions
diff --git a/js/globals.ts b/js/globals.ts index 45a4ccb01..af99ae7e0 100644 --- a/js/globals.ts +++ b/js/globals.ts @@ -104,3 +104,10 @@ export type TextDecoder = textEncoding.TextDecoder; window.performance = new performanceUtil.Performance(); window.workerMain = workers.workerMain; + +// below are interfaces that are available in TypeScript but +// have different signatures +export interface ImportMeta { + url: string; + main: boolean; +} diff --git a/js/lib.web_assembly.d.ts b/js/lib.web_assembly.d.ts index ccefdd077..8c357840a 100644 --- a/js/lib.web_assembly.d.ts +++ b/js/lib.web_assembly.d.ts @@ -170,10 +170,4 @@ declare namespace WebAssembly { } } -// TODO Move ImportMeta intos its own lib.import_meta.d.ts file? -interface ImportMeta { - url: string; - main: boolean; -} - /* eslint-enable @typescript-eslint/no-unused-vars, @typescript-eslint/no-explicit-any */ diff --git a/tools/ts_library_builder/ast_util.ts b/tools/ts_library_builder/ast_util.ts index f18daa398..b43145e75 100644 --- a/tools/ts_library_builder/ast_util.ts +++ b/tools/ts_library_builder/ast_util.ts @@ -73,6 +73,21 @@ export function addTypeAlias( }); } +/** Add a declaration of an interface to a node */ +export function addInterfaceDeclaration( + node: StatementedNode, + interfaceDeclaration: InterfaceDeclaration +) { + const interfaceStructure = interfaceDeclaration.getStructure(); + + return node.addInterface({ + name: interfaceStructure.name, + properties: interfaceStructure.properties, + docs: interfaceStructure.docs, + hasDeclareKeyword: true + }); +} + /** Add a declaration of a variable to a node */ export function addVariableDeclaration( node: StatementedNode, diff --git a/tools/ts_library_builder/build_library.ts b/tools/ts_library_builder/build_library.ts index 0006a8aa4..c2d0ef109 100644 --- a/tools/ts_library_builder/build_library.ts +++ b/tools/ts_library_builder/build_library.ts @@ -2,6 +2,7 @@ import { writeFileSync } from "fs"; import { join } from "path"; import * as prettier from "prettier"; import { + InterfaceDeclaration, ExpressionStatement, NamespaceDeclarationKind, Project, @@ -11,6 +12,7 @@ import { TypeGuards } from "ts-morph"; import { + addInterfaceDeclaration, addInterfaceProperty, addSourceComment, addTypeAlias, @@ -219,6 +221,7 @@ export function mergeGlobal({ node: ExpressionStatement; } >(); + const globalInterfaces: InterfaceDeclaration[] = []; // For every augmentation of the global variable in source file, we want // to extract the type and add it to the global variable map @@ -243,6 +246,8 @@ export function mergeGlobal({ } } } + } else if (TypeGuards.isInterfaceDeclaration(node) && node.isExported()) { + globalInterfaces.push(node); } }); @@ -277,6 +282,11 @@ export function mergeGlobal({ ); } + // We need to copy over any interfaces + for (const interfaceDeclaration of globalInterfaces) { + addInterfaceDeclaration(targetSourceFile, interfaceDeclaration); + } + // We need to ensure that we only namespace each source file once, so we // will use this map for tracking that. const sourceFileMap = new Map<SourceFile, string>(); diff --git a/tools/ts_library_builder/test.ts b/tools/ts_library_builder/test.ts index b1a4ae344..c4c923490 100644 --- a/tools/ts_library_builder/test.ts +++ b/tools/ts_library_builder/test.ts @@ -162,7 +162,7 @@ function buildLibraryMerge() { assert(targetSourceFile.getNamespace("moduleF") != null); assert.equal(targetSourceFile.getNamespaces().length, 4); assert(targetSourceFile.getInterface("FooBar") != null); - assert.equal(targetSourceFile.getInterfaces().length, 1); + assert.equal(targetSourceFile.getInterfaces().length, 2); const variableDeclarations = targetSourceFile.getVariableDeclarations(); assert.equal(variableDeclarations[0].getType().getText(), `FooBar`); assert.equal(variableDeclarations[1].getType().getText(), `FooBar`); @@ -188,6 +188,14 @@ function buildLibraryMerge() { assert.equal(typeAliases[0].getName(), "Bar"); assert.equal(typeAliases[0].getType().getText(), "moduleC.Bar"); assert.equal(typeAliases.length, 1); + const exportedInterface = targetSourceFile.getInterfaceOrThrow("FizzBuzz"); + const interfaceProperties = exportedInterface.getStructure().properties; + assert(interfaceProperties != null); + assert.equal(interfaceProperties!.length, 2); + assert.equal(interfaceProperties![0].name, "foo"); + assert.equal(interfaceProperties![0].type, "string"); + assert.equal(interfaceProperties![1].name, "bar"); + assert.equal(interfaceProperties![1].type, "number"); } function testInlineFiles() { diff --git a/tools/ts_library_builder/testdata/globals.ts b/tools/ts_library_builder/testdata/globals.ts index c6c6f9476..4fff7e8f9 100644 --- a/tools/ts_library_builder/testdata/globals.ts +++ b/tools/ts_library_builder/testdata/globals.ts @@ -9,3 +9,7 @@ foobarbaz.process = moduleE.process; foobarbaz.reprocess = moduleD.reprocess; foobarbaz.Bar = moduleC.Bar; export type Bar = moduleC.Bar; +export interface FizzBuzz { + foo: string; + bar: number; +} |