summaryrefslogtreecommitdiff
path: root/tools/ts_library_builder
diff options
context:
space:
mode:
authorBartek IwaƄczuk <biwanczuk@gmail.com>2019-03-25 05:23:24 +0100
committerRyan Dahl <ry@tinyclouds.org>2019-03-25 00:23:24 -0400
commit5ae78eb1de378f04d0b9d54842bcb898053467d6 (patch)
tree4d0d6a97e6af1f3c3a0a70f1ebe34bdd9d32ac3e /tools/ts_library_builder
parent3cc90d9bcf4be58bf88b433ae410f42fa4ad69c7 (diff)
Update ts_library_builder (#1920)
Diffstat (limited to 'tools/ts_library_builder')
-rw-r--r--tools/ts_library_builder/ast_util.ts15
-rw-r--r--tools/ts_library_builder/build_library.ts10
-rw-r--r--tools/ts_library_builder/test.ts10
-rw-r--r--tools/ts_library_builder/testdata/globals.ts4
4 files changed, 38 insertions, 1 deletions
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;
+}