diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts
index bb0f54cc5b309..3e45fdaf4c0a8 100644
--- a/src/compiler/checker.ts
+++ b/src/compiler/checker.ts
@@ -391,10 +391,17 @@ namespace ts {
if (!mainModule) {
return;
}
- // if module symbol has already been merged - it is safe to use it.
- // otherwise clone it
- mainModule = mainModule.flags & SymbolFlags.Merged ? mainModule : cloneSymbol(mainModule);
- mergeSymbol(mainModule, moduleAugmentation.symbol);
+ // obtain item referenced by 'export='
+ mainModule = resolveExternalModuleSymbol(mainModule);
+ if (mainModule.flags & SymbolFlags.Namespace) {
+ // if module symbol has already been merged - it is safe to use it.
+ // otherwise clone it
+ mainModule = mainModule.flags & SymbolFlags.Merged ? mainModule : cloneSymbol(mainModule);
+ mergeSymbol(mainModule, moduleAugmentation.symbol);
+ }
+ else {
+ error(moduleName, Diagnostics.Cannot_augment_module_0_because_it_resolves_to_a_non_module_entity, moduleName.text);
+ }
}
}
@@ -887,7 +894,7 @@ namespace ts {
error(node.name, Diagnostics.Module_0_has_no_default_export, symbolToString(moduleSymbol));
}
else if (!exportDefaultSymbol && allowSyntheticDefaultImports) {
- return resolveSymbol(moduleSymbol.exports["export="]) || resolveSymbol(moduleSymbol);
+ return resolveExternalModuleSymbol(moduleSymbol) || resolveSymbol(moduleSymbol);
}
return exportDefaultSymbol;
}
@@ -1178,7 +1185,7 @@ namespace ts {
// An external module with an 'export =' declaration resolves to the target of the 'export =' declaration,
// and an external module with no 'export =' declaration resolves to the module itself.
function resolveExternalModuleSymbol(moduleSymbol: Symbol): Symbol {
- return moduleSymbol && resolveSymbol(moduleSymbol.exports["export="]) || moduleSymbol;
+ return moduleSymbol && getMergedSymbol(resolveSymbol(moduleSymbol.exports["export="])) || moduleSymbol;
}
// An external module with an 'export =' declaration may be referenced as an ES6 module provided the 'export ='
@@ -1193,8 +1200,8 @@ namespace ts {
return symbol;
}
- function getExportAssignmentSymbol(moduleSymbol: Symbol): Symbol {
- return moduleSymbol.exports["export="];
+ function hasExportAssignmentSymbol(moduleSymbol: Symbol): boolean {
+ return moduleSymbol.exports["export="] !== undefined;
}
function getExportsOfModuleAsArray(moduleSymbol: Symbol): Symbol[] {
@@ -14836,7 +14843,7 @@ namespace ts {
else {
// export * from "foo"
const moduleSymbol = resolveExternalModuleName(node, node.moduleSpecifier);
- if (moduleSymbol && moduleSymbol.exports["export="]) {
+ if (moduleSymbol && hasExportAssignmentSymbol(moduleSymbol)) {
error(node.moduleSpecifier, Diagnostics.Module_0_uses_export_and_cannot_be_used_with_export_Asterisk, symbolToString(moduleSymbol));
}
}
@@ -15660,7 +15667,7 @@ namespace ts {
return true;
}
- const hasExportAssignment = getExportAssignmentSymbol(moduleSymbol) !== undefined;
+ const hasExportAssignment = hasExportAssignmentSymbol(moduleSymbol);
// if module has export assignment then 'resolveExternalModuleSymbol' will return resolved symbol for export assignment
// otherwise it will return moduleSymbol itself
moduleSymbol = resolveExternalModuleSymbol(moduleSymbol);
@@ -16019,7 +16026,7 @@ namespace ts {
if (!isExternalOrCommonJsModule(file)) {
mergeSymbolTable(globals, file.locals);
}
- if (file.moduleAugmentations) {
+ if (file.moduleAugmentations.length) {
(augmentations || (augmentations = [])).push(file.moduleAugmentations);
}
});
diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json
index 1300b474ff355..05d207664f02c 100644
--- a/src/compiler/diagnosticMessages.json
+++ b/src/compiler/diagnosticMessages.json
@@ -1811,6 +1811,10 @@
"category": "Error",
"code": 2670
},
+ "Cannot augment module '{0}' because it resolves to a non-module entity.": {
+ "category": "Error",
+ "code": 2671
+ },
"Import declaration '{0}' is using private name '{1}'.": {
"category": "Error",
"code": 4000
diff --git a/tests/baselines/reference/augmentExportEquals1.errors.txt b/tests/baselines/reference/augmentExportEquals1.errors.txt
new file mode 100644
index 0000000000000..2d15e6d622a41
--- /dev/null
+++ b/tests/baselines/reference/augmentExportEquals1.errors.txt
@@ -0,0 +1,26 @@
+tests/cases/compiler/file2.ts(6,16): error TS2671: Cannot augment module './file1' because it resolves to a non-module entity.
+tests/cases/compiler/file3.ts(3,8): error TS2503: Cannot find namespace 'x'.
+
+
+==== tests/cases/compiler/file3.ts (1 errors) ====
+ import x = require("./file1");
+ import "./file2";
+ let a: x.A; // should not work
+ ~
+!!! error TS2503: Cannot find namespace 'x'.
+==== tests/cases/compiler/file1.ts (0 errors) ====
+ var x = 1;
+ export = x;
+
+==== tests/cases/compiler/file2.ts (1 errors) ====
+
+ import x = require("./file1");
+
+ // augmentation for './file1'
+ // should error since './file1' does not have namespace meaning
+ declare module "./file1" {
+ ~~~~~~~~~
+!!! error TS2671: Cannot augment module './file1' because it resolves to a non-module entity.
+ interface A { a }
+ }
+
\ No newline at end of file
diff --git a/tests/baselines/reference/augmentExportEquals1.js b/tests/baselines/reference/augmentExportEquals1.js
new file mode 100644
index 0000000000000..98322c01a34c9
--- /dev/null
+++ b/tests/baselines/reference/augmentExportEquals1.js
@@ -0,0 +1,36 @@
+//// [tests/cases/compiler/augmentExportEquals1.ts] ////
+
+//// [file1.ts]
+var x = 1;
+export = x;
+
+//// [file2.ts]
+
+import x = require("./file1");
+
+// augmentation for './file1'
+// should error since './file1' does not have namespace meaning
+declare module "./file1" {
+ interface A { a }
+}
+
+//// [file3.ts]
+import x = require("./file1");
+import "./file2";
+let a: x.A; // should not work
+
+//// [file1.js]
+define(["require", "exports"], function (require, exports) {
+ "use strict";
+ var x = 1;
+ return x;
+});
+//// [file2.js]
+define(["require", "exports"], function (require, exports) {
+ "use strict";
+});
+//// [file3.js]
+define(["require", "exports", "./file2"], function (require, exports) {
+ "use strict";
+ var a; // should not work
+});
diff --git a/tests/baselines/reference/augmentExportEquals1_1.errors.txt b/tests/baselines/reference/augmentExportEquals1_1.errors.txt
new file mode 100644
index 0000000000000..aa89aa0c1d3e7
--- /dev/null
+++ b/tests/baselines/reference/augmentExportEquals1_1.errors.txt
@@ -0,0 +1,29 @@
+tests/cases/compiler/file2.ts(6,16): error TS2671: Cannot augment module 'file1' because it resolves to a non-module entity.
+tests/cases/compiler/file3.ts(3,8): error TS2503: Cannot find namespace 'x'.
+
+
+==== tests/cases/compiler/file3.ts (1 errors) ====
+ import x = require("file1");
+ import "file2";
+ let a: x.A; // should not work
+ ~
+!!! error TS2503: Cannot find namespace 'x'.
+==== tests/cases/compiler/file1.d.ts (0 errors) ====
+
+ declare module "file1" {
+ var x: number;
+ export = x;
+ }
+
+==== tests/cases/compiler/file2.ts (1 errors) ====
+ ///
+ import x = require("file1");
+
+ // augmentation for 'file1'
+ // should error since 'file1' does not have namespace meaning
+ declare module "file1" {
+ ~~~~~~~
+!!! error TS2671: Cannot augment module 'file1' because it resolves to a non-module entity.
+ interface A { a }
+ }
+
\ No newline at end of file
diff --git a/tests/baselines/reference/augmentExportEquals1_1.js b/tests/baselines/reference/augmentExportEquals1_1.js
new file mode 100644
index 0000000000000..08f032ff33f1c
--- /dev/null
+++ b/tests/baselines/reference/augmentExportEquals1_1.js
@@ -0,0 +1,33 @@
+//// [tests/cases/compiler/augmentExportEquals1_1.ts] ////
+
+//// [file1.d.ts]
+
+declare module "file1" {
+ var x: number;
+ export = x;
+}
+
+//// [file2.ts]
+///
+import x = require("file1");
+
+// augmentation for 'file1'
+// should error since 'file1' does not have namespace meaning
+declare module "file1" {
+ interface A { a }
+}
+
+//// [file3.ts]
+import x = require("file1");
+import "file2";
+let a: x.A; // should not work
+
+//// [file2.js]
+define(["require", "exports"], function (require, exports) {
+ "use strict";
+});
+//// [file3.js]
+define(["require", "exports", "file2"], function (require, exports) {
+ "use strict";
+ var a; // should not work
+});
diff --git a/tests/baselines/reference/augmentExportEquals2.errors.txt b/tests/baselines/reference/augmentExportEquals2.errors.txt
new file mode 100644
index 0000000000000..b078a6623d7c0
--- /dev/null
+++ b/tests/baselines/reference/augmentExportEquals2.errors.txt
@@ -0,0 +1,25 @@
+tests/cases/compiler/file2.ts(4,16): error TS2671: Cannot augment module './file1' because it resolves to a non-module entity.
+tests/cases/compiler/file3.ts(3,8): error TS2503: Cannot find namespace 'x'.
+
+
+==== tests/cases/compiler/file3.ts (1 errors) ====
+ import x = require("./file1");
+ import "./file2";
+ let a: x.A; // should not work
+ ~
+!!! error TS2503: Cannot find namespace 'x'.
+==== tests/cases/compiler/file1.ts (0 errors) ====
+
+ function foo() {}
+ export = foo;
+
+==== tests/cases/compiler/file2.ts (1 errors) ====
+ import x = require("./file1");
+
+ // should error since './file1' does not have namespace meaning
+ declare module "./file1" {
+ ~~~~~~~~~
+!!! error TS2671: Cannot augment module './file1' because it resolves to a non-module entity.
+ interface A { a }
+ }
+
\ No newline at end of file
diff --git a/tests/baselines/reference/augmentExportEquals2.js b/tests/baselines/reference/augmentExportEquals2.js
new file mode 100644
index 0000000000000..fc373173e3c44
--- /dev/null
+++ b/tests/baselines/reference/augmentExportEquals2.js
@@ -0,0 +1,35 @@
+//// [tests/cases/compiler/augmentExportEquals2.ts] ////
+
+//// [file1.ts]
+
+function foo() {}
+export = foo;
+
+//// [file2.ts]
+import x = require("./file1");
+
+// should error since './file1' does not have namespace meaning
+declare module "./file1" {
+ interface A { a }
+}
+
+//// [file3.ts]
+import x = require("./file1");
+import "./file2";
+let a: x.A; // should not work
+
+//// [file1.js]
+define(["require", "exports"], function (require, exports) {
+ "use strict";
+ function foo() { }
+ return foo;
+});
+//// [file2.js]
+define(["require", "exports"], function (require, exports) {
+ "use strict";
+});
+//// [file3.js]
+define(["require", "exports", "./file2"], function (require, exports) {
+ "use strict";
+ var a; // should not work
+});
diff --git a/tests/baselines/reference/augmentExportEquals2_1.errors.txt b/tests/baselines/reference/augmentExportEquals2_1.errors.txt
new file mode 100644
index 0000000000000..8e02f21176ae5
--- /dev/null
+++ b/tests/baselines/reference/augmentExportEquals2_1.errors.txt
@@ -0,0 +1,29 @@
+tests/cases/compiler/file2.ts(6,16): error TS2671: Cannot augment module 'file1' because it resolves to a non-module entity.
+tests/cases/compiler/file3.ts(3,8): error TS2503: Cannot find namespace 'x'.
+
+
+==== tests/cases/compiler/file3.ts (1 errors) ====
+ import x = require("file1");
+ import "file2";
+ let a: x.A; // should not work
+ ~
+!!! error TS2503: Cannot find namespace 'x'.
+==== tests/cases/compiler/file1.d.ts (0 errors) ====
+
+ declare module "file1" {
+ function foo(): void;
+ export = foo;
+ }
+
+==== tests/cases/compiler/file2.ts (1 errors) ====
+
+ ///
+ import x = require("file1");
+
+ // should error since './file1' does not have namespace meaning
+ declare module "file1" {
+ ~~~~~~~
+!!! error TS2671: Cannot augment module 'file1' because it resolves to a non-module entity.
+ interface A { a }
+ }
+
\ No newline at end of file
diff --git a/tests/baselines/reference/augmentExportEquals2_1.js b/tests/baselines/reference/augmentExportEquals2_1.js
new file mode 100644
index 0000000000000..9046157bb2626
--- /dev/null
+++ b/tests/baselines/reference/augmentExportEquals2_1.js
@@ -0,0 +1,33 @@
+//// [tests/cases/compiler/augmentExportEquals2_1.ts] ////
+
+//// [file1.d.ts]
+
+declare module "file1" {
+ function foo(): void;
+ export = foo;
+}
+
+//// [file2.ts]
+
+///
+import x = require("file1");
+
+// should error since './file1' does not have namespace meaning
+declare module "file1" {
+ interface A { a }
+}
+
+//// [file3.ts]
+import x = require("file1");
+import "file2";
+let a: x.A; // should not work
+
+//// [file2.js]
+define(["require", "exports"], function (require, exports) {
+ "use strict";
+});
+//// [file3.js]
+define(["require", "exports", "file2"], function (require, exports) {
+ "use strict";
+ var a; // should not work
+});
diff --git a/tests/baselines/reference/augmentExportEquals3.errors.txt b/tests/baselines/reference/augmentExportEquals3.errors.txt
new file mode 100644
index 0000000000000..9fe63d84fb625
--- /dev/null
+++ b/tests/baselines/reference/augmentExportEquals3.errors.txt
@@ -0,0 +1,31 @@
+tests/cases/compiler/file2.ts(6,15): error TS2665: Module augmentation cannot introduce new names in the top level scope.
+tests/cases/compiler/file2.ts(7,9): error TS2665: Module augmentation cannot introduce new names in the top level scope.
+
+
+==== tests/cases/compiler/file1.ts (0 errors) ====
+
+ function foo() {}
+ namespace foo {
+ export var v = 1;
+ }
+ export = foo;
+
+==== tests/cases/compiler/file2.ts (2 errors) ====
+ import x = require("./file1");
+ x.b = 1;
+
+ // OK - './file1' is a namespace
+ declare module "./file1" {
+ interface A { a }
+ ~
+!!! error TS2665: Module augmentation cannot introduce new names in the top level scope.
+ let b: number;
+ ~
+!!! error TS2665: Module augmentation cannot introduce new names in the top level scope.
+ }
+
+==== tests/cases/compiler/file3.ts (0 errors) ====
+ import * as x from "./file1";
+ import "./file2";
+ let a: x.A;
+ let b = x.b;
\ No newline at end of file
diff --git a/tests/baselines/reference/augmentExportEquals3.js b/tests/baselines/reference/augmentExportEquals3.js
new file mode 100644
index 0000000000000..82cfa5f216656
--- /dev/null
+++ b/tests/baselines/reference/augmentExportEquals3.js
@@ -0,0 +1,47 @@
+//// [tests/cases/compiler/augmentExportEquals3.ts] ////
+
+//// [file1.ts]
+
+function foo() {}
+namespace foo {
+ export var v = 1;
+}
+export = foo;
+
+//// [file2.ts]
+import x = require("./file1");
+x.b = 1;
+
+// OK - './file1' is a namespace
+declare module "./file1" {
+ interface A { a }
+ let b: number;
+}
+
+//// [file3.ts]
+import * as x from "./file1";
+import "./file2";
+let a: x.A;
+let b = x.b;
+
+//// [file1.js]
+define(["require", "exports"], function (require, exports) {
+ "use strict";
+ function foo() { }
+ var foo;
+ (function (foo) {
+ foo.v = 1;
+ })(foo || (foo = {}));
+ return foo;
+});
+//// [file2.js]
+define(["require", "exports", "./file1"], function (require, exports, x) {
+ "use strict";
+ x.b = 1;
+});
+//// [file3.js]
+define(["require", "exports", "./file1", "./file2"], function (require, exports, x) {
+ "use strict";
+ var a;
+ var b = x.b;
+});
diff --git a/tests/baselines/reference/augmentExportEquals3_1.errors.txt b/tests/baselines/reference/augmentExportEquals3_1.errors.txt
new file mode 100644
index 0000000000000..9fb0ce5f16924
--- /dev/null
+++ b/tests/baselines/reference/augmentExportEquals3_1.errors.txt
@@ -0,0 +1,34 @@
+tests/cases/compiler/file2.ts(7,15): error TS2665: Module augmentation cannot introduce new names in the top level scope.
+tests/cases/compiler/file2.ts(8,9): error TS2665: Module augmentation cannot introduce new names in the top level scope.
+
+
+==== tests/cases/compiler/file1.d.ts (0 errors) ====
+ declare module "file1" {
+ function foo(): void;
+ namespace foo {
+ export var v: number;
+ }
+ export = foo;
+ }
+
+
+==== tests/cases/compiler/file2.ts (2 errors) ====
+ ///
+ import x = require("file1");
+ x.b = 1;
+
+ // OK - './file1' is a namespace
+ declare module "file1" {
+ interface A { a }
+ ~
+!!! error TS2665: Module augmentation cannot introduce new names in the top level scope.
+ let b: number;
+ ~
+!!! error TS2665: Module augmentation cannot introduce new names in the top level scope.
+ }
+
+==== tests/cases/compiler/file3.ts (0 errors) ====
+ import * as x from "file1";
+ import "file2";
+ let a: x.A;
+ let b = x.b;
\ No newline at end of file
diff --git a/tests/baselines/reference/augmentExportEquals3_1.js b/tests/baselines/reference/augmentExportEquals3_1.js
new file mode 100644
index 0000000000000..fc6b7b1cec35e
--- /dev/null
+++ b/tests/baselines/reference/augmentExportEquals3_1.js
@@ -0,0 +1,40 @@
+//// [tests/cases/compiler/augmentExportEquals3_1.ts] ////
+
+//// [file1.d.ts]
+declare module "file1" {
+ function foo(): void;
+ namespace foo {
+ export var v: number;
+ }
+ export = foo;
+}
+
+
+//// [file2.ts]
+///
+import x = require("file1");
+x.b = 1;
+
+// OK - './file1' is a namespace
+declare module "file1" {
+ interface A { a }
+ let b: number;
+}
+
+//// [file3.ts]
+import * as x from "file1";
+import "file2";
+let a: x.A;
+let b = x.b;
+
+//// [file2.js]
+define(["require", "exports", "file1"], function (require, exports, x) {
+ "use strict";
+ x.b = 1;
+});
+//// [file3.js]
+define(["require", "exports", "file1", "file2"], function (require, exports, x) {
+ "use strict";
+ var a;
+ var b = x.b;
+});
diff --git a/tests/baselines/reference/augmentExportEquals4.errors.txt b/tests/baselines/reference/augmentExportEquals4.errors.txt
new file mode 100644
index 0000000000000..20f7cc32d9ffd
--- /dev/null
+++ b/tests/baselines/reference/augmentExportEquals4.errors.txt
@@ -0,0 +1,31 @@
+tests/cases/compiler/file2.ts(6,15): error TS2665: Module augmentation cannot introduce new names in the top level scope.
+tests/cases/compiler/file2.ts(7,9): error TS2665: Module augmentation cannot introduce new names in the top level scope.
+
+
+==== tests/cases/compiler/file1.ts (0 errors) ====
+
+ class foo {}
+ namespace foo {
+ export var v = 1;
+ }
+ export = foo;
+
+==== tests/cases/compiler/file2.ts (2 errors) ====
+ import x = require("./file1");
+ x.b = 1;
+
+ // OK - './file1' is a namespace
+ declare module "./file1" {
+ interface A { a }
+ ~
+!!! error TS2665: Module augmentation cannot introduce new names in the top level scope.
+ let b: number;
+ ~
+!!! error TS2665: Module augmentation cannot introduce new names in the top level scope.
+ }
+
+==== tests/cases/compiler/file3.ts (0 errors) ====
+ import * as x from "./file1";
+ import "./file2";
+ let a: x.A;
+ let b = x.b;
\ No newline at end of file
diff --git a/tests/baselines/reference/augmentExportEquals4.js b/tests/baselines/reference/augmentExportEquals4.js
new file mode 100644
index 0000000000000..ee0fc1892c2d1
--- /dev/null
+++ b/tests/baselines/reference/augmentExportEquals4.js
@@ -0,0 +1,51 @@
+//// [tests/cases/compiler/augmentExportEquals4.ts] ////
+
+//// [file1.ts]
+
+class foo {}
+namespace foo {
+ export var v = 1;
+}
+export = foo;
+
+//// [file2.ts]
+import x = require("./file1");
+x.b = 1;
+
+// OK - './file1' is a namespace
+declare module "./file1" {
+ interface A { a }
+ let b: number;
+}
+
+//// [file3.ts]
+import * as x from "./file1";
+import "./file2";
+let a: x.A;
+let b = x.b;
+
+//// [file1.js]
+define(["require", "exports"], function (require, exports) {
+ "use strict";
+ var foo = (function () {
+ function foo() {
+ }
+ return foo;
+ }());
+ var foo;
+ (function (foo) {
+ foo.v = 1;
+ })(foo || (foo = {}));
+ return foo;
+});
+//// [file2.js]
+define(["require", "exports", "./file1"], function (require, exports, x) {
+ "use strict";
+ x.b = 1;
+});
+//// [file3.js]
+define(["require", "exports", "./file1", "./file2"], function (require, exports, x) {
+ "use strict";
+ var a;
+ var b = x.b;
+});
diff --git a/tests/baselines/reference/augmentExportEquals4_1.errors.txt b/tests/baselines/reference/augmentExportEquals4_1.errors.txt
new file mode 100644
index 0000000000000..a401f7a24cfed
--- /dev/null
+++ b/tests/baselines/reference/augmentExportEquals4_1.errors.txt
@@ -0,0 +1,35 @@
+tests/cases/compiler/file2.ts(7,15): error TS2665: Module augmentation cannot introduce new names in the top level scope.
+tests/cases/compiler/file2.ts(8,9): error TS2665: Module augmentation cannot introduce new names in the top level scope.
+
+
+==== tests/cases/compiler/file1.d.ts (0 errors) ====
+
+ declare module "file1" {
+ class foo {}
+ namespace foo {
+ export var v: number;
+ }
+ export = foo;
+ }
+
+
+==== tests/cases/compiler/file2.ts (2 errors) ====
+ ///
+ import x = require("file1");
+ x.b = 1;
+
+ // OK - './file1' is a namespace
+ declare module "file1" {
+ interface A { a }
+ ~
+!!! error TS2665: Module augmentation cannot introduce new names in the top level scope.
+ let b: number;
+ ~
+!!! error TS2665: Module augmentation cannot introduce new names in the top level scope.
+ }
+
+==== tests/cases/compiler/file3.ts (0 errors) ====
+ import * as x from "file1";
+ import "file2";
+ let a: x.A;
+ let b = x.b;
\ No newline at end of file
diff --git a/tests/baselines/reference/augmentExportEquals4_1.js b/tests/baselines/reference/augmentExportEquals4_1.js
new file mode 100644
index 0000000000000..b4ba932d44b4c
--- /dev/null
+++ b/tests/baselines/reference/augmentExportEquals4_1.js
@@ -0,0 +1,41 @@
+//// [tests/cases/compiler/augmentExportEquals4_1.ts] ////
+
+//// [file1.d.ts]
+
+declare module "file1" {
+ class foo {}
+ namespace foo {
+ export var v: number;
+ }
+ export = foo;
+}
+
+
+//// [file2.ts]
+///
+import x = require("file1");
+x.b = 1;
+
+// OK - './file1' is a namespace
+declare module "file1" {
+ interface A { a }
+ let b: number;
+}
+
+//// [file3.ts]
+import * as x from "file1";
+import "file2";
+let a: x.A;
+let b = x.b;
+
+//// [file2.js]
+define(["require", "exports", "file1"], function (require, exports, x) {
+ "use strict";
+ x.b = 1;
+});
+//// [file3.js]
+define(["require", "exports", "file1", "file2"], function (require, exports, x) {
+ "use strict";
+ var a;
+ var b = x.b;
+});
diff --git a/tests/baselines/reference/augmentExportEquals5.js b/tests/baselines/reference/augmentExportEquals5.js
new file mode 100644
index 0000000000000..49b6c3fed564a
--- /dev/null
+++ b/tests/baselines/reference/augmentExportEquals5.js
@@ -0,0 +1,94 @@
+//// [tests/cases/compiler/augmentExportEquals5.ts] ////
+
+//// [express.d.ts]
+
+
+declare module Express {
+ export interface Request { }
+ export interface Response { }
+ export interface Application { }
+}
+
+declare module "express" {
+ function e(): e.Express;
+ namespace e {
+ interface IRoute {
+ all(...handler: RequestHandler[]): IRoute;
+ }
+
+ interface IRouterMatcher {
+ (name: string|RegExp, ...handlers: RequestHandler[]): T;
+ }
+
+ interface IRouter extends RequestHandler {
+ route(path: string): IRoute;
+ }
+
+ export function Router(options?: any): Router;
+
+ export interface Router extends IRouter {}
+
+ interface Errback { (err: Error): void; }
+
+ interface Request extends Express.Request {
+
+ get (name: string): string;
+ }
+
+ interface Response extends Express.Response {
+ charset: string;
+ }
+
+ interface ErrorRequestHandler {
+ (err: any, req: Request, res: Response, next: Function): any;
+ }
+
+ interface RequestHandler {
+ (req: Request, res: Response, next: Function): any;
+ }
+
+ interface Handler extends RequestHandler {}
+
+ interface RequestParamHandler {
+ (req: Request, res: Response, next: Function, param: any): any;
+ }
+
+ interface Application extends IRouter, Express.Application {
+ routes: any;
+ }
+
+ interface Express extends Application {
+ createApplication(): Application;
+ }
+
+ var static: any;
+ }
+
+ export = e;
+}
+
+//// [augmentation.ts]
+///
+import * as e from "express";
+declare module "express" {
+ interface Request {
+ id: number;
+ }
+}
+
+//// [consumer.ts]
+import { Request } from "express";
+import "./augmentation";
+let x: Request;
+const y = x.id;
+
+//// [augmentation.js]
+define(["require", "exports"], function (require, exports) {
+ "use strict";
+});
+//// [consumer.js]
+define(["require", "exports", "./augmentation"], function (require, exports) {
+ "use strict";
+ var x;
+ var y = x.id;
+});
diff --git a/tests/baselines/reference/augmentExportEquals5.symbols b/tests/baselines/reference/augmentExportEquals5.symbols
new file mode 100644
index 0000000000000..f255bf8c065c9
--- /dev/null
+++ b/tests/baselines/reference/augmentExportEquals5.symbols
@@ -0,0 +1,194 @@
+=== tests/cases/compiler/express.d.ts ===
+
+
+declare module Express {
+>Express : Symbol(Express, Decl(express.d.ts, 0, 0))
+
+ export interface Request { }
+>Request : Symbol(Request, Decl(express.d.ts, 2, 24))
+
+ export interface Response { }
+>Response : Symbol(Response, Decl(express.d.ts, 3, 32))
+
+ export interface Application { }
+>Application : Symbol(Application, Decl(express.d.ts, 4, 33))
+}
+
+declare module "express" {
+ function e(): e.Express;
+>e : Symbol(, Decl(express.d.ts, 8, 26), Decl(express.d.ts, 9, 28), Decl(augmentation.ts, 1, 29))
+>e : Symbol(e, Decl(express.d.ts, 8, 26), Decl(express.d.ts, 9, 28))
+>Express : Symbol(Express, Decl(express.d.ts, 54, 9))
+
+ namespace e {
+>e : Symbol(, Decl(express.d.ts, 8, 26), Decl(express.d.ts, 9, 28), Decl(augmentation.ts, 1, 29))
+
+ interface IRoute {
+>IRoute : Symbol(IRoute, Decl(express.d.ts, 10, 17))
+
+ all(...handler: RequestHandler[]): IRoute;
+>all : Symbol(all, Decl(express.d.ts, 11, 26))
+>handler : Symbol(handler, Decl(express.d.ts, 12, 16))
+>RequestHandler : Symbol(RequestHandler, Decl(express.d.ts, 40, 9))
+>IRoute : Symbol(IRoute, Decl(express.d.ts, 10, 17))
+ }
+
+ interface IRouterMatcher {
+>IRouterMatcher : Symbol(IRouterMatcher, Decl(express.d.ts, 13, 9))
+>T : Symbol(T, Decl(express.d.ts, 15, 33))
+
+ (name: string|RegExp, ...handlers: RequestHandler[]): T;
+>name : Symbol(name, Decl(express.d.ts, 16, 13))
+>RegExp : Symbol(RegExp, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
+>handlers : Symbol(handlers, Decl(express.d.ts, 16, 33))
+>RequestHandler : Symbol(RequestHandler, Decl(express.d.ts, 40, 9))
+>T : Symbol(T, Decl(express.d.ts, 15, 33))
+ }
+
+ interface IRouter extends RequestHandler {
+>IRouter : Symbol(IRouter, Decl(express.d.ts, 17, 9))
+>T : Symbol(T, Decl(express.d.ts, 19, 26))
+>RequestHandler : Symbol(RequestHandler, Decl(express.d.ts, 40, 9))
+
+ route(path: string): IRoute;
+>route : Symbol(route, Decl(express.d.ts, 19, 53))
+>path : Symbol(path, Decl(express.d.ts, 20, 18))
+>IRoute : Symbol(IRoute, Decl(express.d.ts, 10, 17))
+ }
+
+ export function Router(options?: any): Router;
+>Router : Symbol(Router, Decl(express.d.ts, 21, 9), Decl(express.d.ts, 23, 54))
+>options : Symbol(options, Decl(express.d.ts, 23, 31))
+>Router : Symbol(Router, Decl(express.d.ts, 21, 9), Decl(express.d.ts, 23, 54))
+
+ export interface Router extends IRouter {}
+>Router : Symbol(Router, Decl(express.d.ts, 21, 9), Decl(express.d.ts, 23, 54))
+>IRouter : Symbol(IRouter, Decl(express.d.ts, 17, 9))
+>Router : Symbol(Router, Decl(express.d.ts, 21, 9), Decl(express.d.ts, 23, 54))
+
+ interface Errback { (err: Error): void; }
+>Errback : Symbol(Errback, Decl(express.d.ts, 25, 58))
+>err : Symbol(err, Decl(express.d.ts, 27, 29))
+>Error : Symbol(Error, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
+
+ interface Request extends Express.Request {
+>Request : Symbol(Request, Decl(express.d.ts, 27, 49), Decl(augmentation.ts, 2, 26))
+>Express.Request : Symbol(Express.Request, Decl(express.d.ts, 2, 24))
+>Express : Symbol(Express, Decl(express.d.ts, 0, 0))
+>Request : Symbol(Express.Request, Decl(express.d.ts, 2, 24))
+
+ get (name: string): string;
+>get : Symbol(get, Decl(express.d.ts, 29, 51))
+>name : Symbol(name, Decl(express.d.ts, 31, 17))
+ }
+
+ interface Response extends Express.Response {
+>Response : Symbol(Response, Decl(express.d.ts, 32, 9))
+>Express.Response : Symbol(Express.Response, Decl(express.d.ts, 3, 32))
+>Express : Symbol(Express, Decl(express.d.ts, 0, 0))
+>Response : Symbol(Express.Response, Decl(express.d.ts, 3, 32))
+
+ charset: string;
+>charset : Symbol(charset, Decl(express.d.ts, 34, 53))
+ }
+
+ interface ErrorRequestHandler {
+>ErrorRequestHandler : Symbol(ErrorRequestHandler, Decl(express.d.ts, 36, 9))
+
+ (err: any, req: Request, res: Response, next: Function): any;
+>err : Symbol(err, Decl(express.d.ts, 39, 13))
+>req : Symbol(req, Decl(express.d.ts, 39, 22))
+>Request : Symbol(Request, Decl(express.d.ts, 27, 49), Decl(augmentation.ts, 2, 26))
+>res : Symbol(res, Decl(express.d.ts, 39, 36))
+>Response : Symbol(Response, Decl(express.d.ts, 32, 9))
+>next : Symbol(next, Decl(express.d.ts, 39, 51))
+>Function : Symbol(Function, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
+ }
+
+ interface RequestHandler {
+>RequestHandler : Symbol(RequestHandler, Decl(express.d.ts, 40, 9))
+
+ (req: Request, res: Response, next: Function): any;
+>req : Symbol(req, Decl(express.d.ts, 43, 13))
+>Request : Symbol(Request, Decl(express.d.ts, 27, 49), Decl(augmentation.ts, 2, 26))
+>res : Symbol(res, Decl(express.d.ts, 43, 26))
+>Response : Symbol(Response, Decl(express.d.ts, 32, 9))
+>next : Symbol(next, Decl(express.d.ts, 43, 41))
+>Function : Symbol(Function, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
+ }
+
+ interface Handler extends RequestHandler {}
+>Handler : Symbol(Handler, Decl(express.d.ts, 44, 9))
+>RequestHandler : Symbol(RequestHandler, Decl(express.d.ts, 40, 9))
+
+ interface RequestParamHandler {
+>RequestParamHandler : Symbol(RequestParamHandler, Decl(express.d.ts, 46, 51))
+
+ (req: Request, res: Response, next: Function, param: any): any;
+>req : Symbol(req, Decl(express.d.ts, 49, 13))
+>Request : Symbol(Request, Decl(express.d.ts, 27, 49), Decl(augmentation.ts, 2, 26))
+>res : Symbol(res, Decl(express.d.ts, 49, 26))
+>Response : Symbol(Response, Decl(express.d.ts, 32, 9))
+>next : Symbol(next, Decl(express.d.ts, 49, 41))
+>Function : Symbol(Function, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
+>param : Symbol(param, Decl(express.d.ts, 49, 57))
+ }
+
+ interface Application extends IRouter, Express.Application {
+>Application : Symbol(Application, Decl(express.d.ts, 50, 9))
+>IRouter : Symbol(IRouter, Decl(express.d.ts, 17, 9))
+>Application : Symbol(Application, Decl(express.d.ts, 50, 9))
+>Express.Application : Symbol(Express.Application, Decl(express.d.ts, 4, 33))
+>Express : Symbol(Express, Decl(express.d.ts, 0, 0))
+>Application : Symbol(Express.Application, Decl(express.d.ts, 4, 33))
+
+ routes: any;
+>routes : Symbol(routes, Decl(express.d.ts, 52, 81))
+ }
+
+ interface Express extends Application {
+>Express : Symbol(Express, Decl(express.d.ts, 54, 9))
+>Application : Symbol(Application, Decl(express.d.ts, 50, 9))
+
+ createApplication(): Application;
+>createApplication : Symbol(createApplication, Decl(express.d.ts, 56, 47))
+>Application : Symbol(Application, Decl(express.d.ts, 50, 9))
+ }
+
+ var static: any;
+>static : Symbol(static, Decl(express.d.ts, 60, 11))
+ }
+
+ export = e;
+>e : Symbol(e, Decl(express.d.ts, 8, 26), Decl(express.d.ts, 9, 28))
+}
+
+=== tests/cases/compiler/augmentation.ts ===
+///
+import * as e from "express";
+>e : Symbol(e, Decl(augmentation.ts, 1, 6))
+
+declare module "express" {
+ interface Request {
+>Request : Symbol(Request, Decl(express.d.ts, 27, 49), Decl(augmentation.ts, 2, 26))
+
+ id: number;
+>id : Symbol(id, Decl(augmentation.ts, 3, 23))
+ }
+}
+
+=== tests/cases/compiler/consumer.ts ===
+import { Request } from "express";
+>Request : Symbol(Request, Decl(consumer.ts, 0, 8))
+
+import "./augmentation";
+let x: Request;
+>x : Symbol(x, Decl(consumer.ts, 2, 3))
+>Request : Symbol(Request, Decl(consumer.ts, 0, 8))
+
+const y = x.id;
+>y : Symbol(y, Decl(consumer.ts, 3, 5))
+>x.id : Symbol(Request.id, Decl(augmentation.ts, 3, 23))
+>x : Symbol(x, Decl(consumer.ts, 2, 3))
+>id : Symbol(Request.id, Decl(augmentation.ts, 3, 23))
+
diff --git a/tests/baselines/reference/augmentExportEquals5.types b/tests/baselines/reference/augmentExportEquals5.types
new file mode 100644
index 0000000000000..42b79674dfd70
--- /dev/null
+++ b/tests/baselines/reference/augmentExportEquals5.types
@@ -0,0 +1,194 @@
+=== tests/cases/compiler/express.d.ts ===
+
+
+declare module Express {
+>Express : any
+
+ export interface Request { }
+>Request : Request
+
+ export interface Response { }
+>Response : Response
+
+ export interface Application { }
+>Application : Application
+}
+
+declare module "express" {
+ function e(): e.Express;
+>e : typeof
+>e : any
+>Express : Express
+
+ namespace e {
+>e : typeof
+
+ interface IRoute {
+>IRoute : IRoute
+
+ all(...handler: RequestHandler[]): IRoute;
+>all : (...handler: RequestHandler[]) => IRoute
+>handler : RequestHandler[]
+>RequestHandler : RequestHandler
+>IRoute : IRoute
+ }
+
+ interface IRouterMatcher {
+>IRouterMatcher : IRouterMatcher
+>T : T
+
+ (name: string|RegExp, ...handlers: RequestHandler[]): T;
+>name : string | RegExp
+>RegExp : RegExp
+>handlers : RequestHandler[]
+>RequestHandler : RequestHandler
+>T : T
+ }
+
+ interface IRouter extends RequestHandler {
+>IRouter : IRouter
+>T : T
+>RequestHandler : RequestHandler
+
+ route(path: string): IRoute;
+>route : (path: string) => IRoute
+>path : string
+>IRoute : IRoute
+ }
+
+ export function Router(options?: any): Router;
+>Router : (options?: any) => Router
+>options : any
+>Router : Router
+
+ export interface Router extends IRouter {}
+>Router : Router
+>IRouter : IRouter
+>Router : Router
+
+ interface Errback { (err: Error): void; }
+>Errback : Errback
+>err : Error
+>Error : Error
+
+ interface Request extends Express.Request {
+>Request : Request
+>Express.Request : any
+>Express : any
+>Request : Express.Request
+
+ get (name: string): string;
+>get : (name: string) => string
+>name : string
+ }
+
+ interface Response extends Express.Response {
+>Response : Response
+>Express.Response : any
+>Express : any
+>Response : Express.Response
+
+ charset: string;
+>charset : string
+ }
+
+ interface ErrorRequestHandler {
+>ErrorRequestHandler : ErrorRequestHandler
+
+ (err: any, req: Request, res: Response, next: Function): any;
+>err : any
+>req : Request
+>Request : Request
+>res : Response
+>Response : Response
+>next : Function
+>Function : Function
+ }
+
+ interface RequestHandler {
+>RequestHandler : RequestHandler
+
+ (req: Request, res: Response, next: Function): any;
+>req : Request
+>Request : Request
+>res : Response
+>Response : Response
+>next : Function
+>Function : Function
+ }
+
+ interface Handler extends RequestHandler {}
+>Handler : Handler
+>RequestHandler : RequestHandler
+
+ interface RequestParamHandler {
+>RequestParamHandler : RequestParamHandler
+
+ (req: Request, res: Response, next: Function, param: any): any;
+>req : Request
+>Request : Request
+>res : Response
+>Response : Response
+>next : Function
+>Function : Function
+>param : any
+ }
+
+ interface Application extends IRouter, Express.Application {
+>Application : Application
+>IRouter : IRouter
+>Application : Application
+>Express.Application : any
+>Express : any
+>Application : Express.Application
+
+ routes: any;
+>routes : any
+ }
+
+ interface Express extends Application {
+>Express : Express
+>Application : Application
+
+ createApplication(): Application;
+>createApplication : () => Application
+>Application : Application
+ }
+
+ var static: any;
+>static : any
+ }
+
+ export = e;
+>e : typeof e
+}
+
+=== tests/cases/compiler/augmentation.ts ===
+///
+import * as e from "express";
+>e : typeof e
+
+declare module "express" {
+ interface Request {
+>Request : Request
+
+ id: number;
+>id : number
+ }
+}
+
+=== tests/cases/compiler/consumer.ts ===
+import { Request } from "express";
+>Request : any
+
+import "./augmentation";
+let x: Request;
+>x : Request
+>Request : Request
+
+const y = x.id;
+>y : number
+>x.id : number
+>x : Request
+>id : number
+
diff --git a/tests/baselines/reference/augmentExportEquals6.js b/tests/baselines/reference/augmentExportEquals6.js
new file mode 100644
index 0000000000000..94dfa389c6d1c
--- /dev/null
+++ b/tests/baselines/reference/augmentExportEquals6.js
@@ -0,0 +1,64 @@
+//// [tests/cases/compiler/augmentExportEquals6.ts] ////
+
+//// [file1.ts]
+
+class foo {}
+namespace foo {
+ export class A {}
+ export namespace B { export let a; }
+}
+export = foo;
+
+//// [file2.ts]
+import x = require("./file1");
+x.B.b = 1;
+
+// OK - './file1' is a namespace
+declare module "./file1" {
+ interface A { a: number }
+ namespace B {
+ export let b: number;
+ }
+}
+
+//// [file3.ts]
+import * as x from "./file1";
+import "./file2";
+let a: x.A;
+let b = a.a;
+let c = x.B.b;
+
+//// [file1.js]
+define(["require", "exports"], function (require, exports) {
+ "use strict";
+ var foo = (function () {
+ function foo() {
+ }
+ return foo;
+ }());
+ var foo;
+ (function (foo) {
+ var A = (function () {
+ function A() {
+ }
+ return A;
+ }());
+ foo.A = A;
+ var B;
+ (function (B) {
+ })(B = foo.B || (foo.B = {}));
+ })(foo || (foo = {}));
+ return foo;
+});
+//// [file2.js]
+define(["require", "exports", "./file1"], function (require, exports, x) {
+ "use strict";
+ x.B.b = 1;
+});
+//// [file3.js]
+define(["require", "exports", "./file1", "./file2"], function (require, exports, x) {
+ "use strict";
+ var a;
+ var b = a.a;
+ var c = x.B.b;
+});
diff --git a/tests/baselines/reference/augmentExportEquals6.symbols b/tests/baselines/reference/augmentExportEquals6.symbols
new file mode 100644
index 0000000000000..24f8ef7c9030e
--- /dev/null
+++ b/tests/baselines/reference/augmentExportEquals6.symbols
@@ -0,0 +1,67 @@
+=== tests/cases/compiler/file1.ts ===
+
+class foo {}
+>foo : Symbol(, Decl(file1.ts, 0, 0), Decl(file1.ts, 1, 12), Decl(file2.ts, 1, 10))
+
+namespace foo {
+>foo : Symbol(, Decl(file1.ts, 0, 0), Decl(file1.ts, 1, 12), Decl(file2.ts, 1, 10))
+
+ export class A {}
+>A : Symbol(A, Decl(file1.ts, 2, 15), Decl(file2.ts, 4, 26))
+
+ export namespace B { export let a; }
+>B : Symbol(B, Decl(file1.ts, 3, 21), Decl(file2.ts, 5, 29))
+>a : Symbol(a, Decl(file1.ts, 4, 35))
+}
+export = foo;
+>foo : Symbol(foo, Decl(file1.ts, 0, 0), Decl(file1.ts, 1, 12))
+
+=== tests/cases/compiler/file2.ts ===
+import x = require("./file1");
+>x : Symbol(x, Decl(file2.ts, 0, 0))
+
+x.B.b = 1;
+>x.B.b : Symbol(x.B.b, Decl(file2.ts, 7, 18))
+>x.B : Symbol(x.B, Decl(file1.ts, 3, 21), Decl(file2.ts, 5, 29))
+>x : Symbol(x, Decl(file2.ts, 0, 0))
+>B : Symbol(x.B, Decl(file1.ts, 3, 21), Decl(file2.ts, 5, 29))
+>b : Symbol(x.B.b, Decl(file2.ts, 7, 18))
+
+// OK - './file1' is a namespace
+declare module "./file1" {
+ interface A { a: number }
+>A : Symbol(A, Decl(file1.ts, 2, 15), Decl(file2.ts, 4, 26))
+>a : Symbol(a, Decl(file2.ts, 5, 17))
+
+ namespace B {
+>B : Symbol(B, Decl(file1.ts, 3, 21), Decl(file2.ts, 5, 29))
+
+ export let b: number;
+>b : Symbol(b, Decl(file2.ts, 7, 18))
+ }
+}
+
+=== tests/cases/compiler/file3.ts ===
+import * as x from "./file1";
+>x : Symbol(x, Decl(file3.ts, 0, 6))
+
+import "./file2";
+let a: x.A;
+>a : Symbol(a, Decl(file3.ts, 2, 3))
+>x : Symbol(x, Decl(file3.ts, 0, 6))
+>A : Symbol(x.A, Decl(file1.ts, 2, 15), Decl(file2.ts, 4, 26))
+
+let b = a.a;
+>b : Symbol(b, Decl(file3.ts, 3, 3))
+>a.a : Symbol(x.A.a, Decl(file2.ts, 5, 17))
+>a : Symbol(a, Decl(file3.ts, 2, 3))
+>a : Symbol(x.A.a, Decl(file2.ts, 5, 17))
+
+let c = x.B.b;
+>c : Symbol(c, Decl(file3.ts, 4, 3))
+>x.B.b : Symbol(x.B.b, Decl(file2.ts, 7, 18))
+>x.B : Symbol(x.B, Decl(file1.ts, 3, 21), Decl(file2.ts, 5, 29))
+>x : Symbol(x, Decl(file3.ts, 0, 6))
+>B : Symbol(x.B, Decl(file1.ts, 3, 21), Decl(file2.ts, 5, 29))
+>b : Symbol(x.B.b, Decl(file2.ts, 7, 18))
+
diff --git a/tests/baselines/reference/augmentExportEquals6.types b/tests/baselines/reference/augmentExportEquals6.types
new file mode 100644
index 0000000000000..1a2b2b22ccb2f
--- /dev/null
+++ b/tests/baselines/reference/augmentExportEquals6.types
@@ -0,0 +1,69 @@
+=== tests/cases/compiler/file1.ts ===
+
+class foo {}
+>foo :
+
+namespace foo {
+>foo : typeof
+
+ export class A {}
+>A : A
+
+ export namespace B { export let a; }
+>B : typeof B
+>a : any
+}
+export = foo;
+>foo : foo
+
+=== tests/cases/compiler/file2.ts ===
+import x = require("./file1");
+>x : typeof x
+
+x.B.b = 1;
+>x.B.b = 1 : number
+>x.B.b : number
+>x.B : typeof x.B
+>x : typeof x
+>B : typeof x.B
+>b : number
+>1 : number
+
+// OK - './file1' is a namespace
+declare module "./file1" {
+ interface A { a: number }
+>A : A
+>a : number
+
+ namespace B {
+>B : typeof B
+
+ export let b: number;
+>b : number
+ }
+}
+
+=== tests/cases/compiler/file3.ts ===
+import * as x from "./file1";
+>x : typeof x
+
+import "./file2";
+let a: x.A;
+>a : x.A
+>x : any
+>A : x.A
+
+let b = a.a;
+>b : number
+>a.a : number
+>a : x.A
+>a : number
+
+let c = x.B.b;
+>c : number
+>x.B.b : number
+>x.B : typeof x.B
+>x : typeof x
+>B : typeof x.B
+>b : number
+
diff --git a/tests/baselines/reference/augmentExportEquals6_1.js b/tests/baselines/reference/augmentExportEquals6_1.js
new file mode 100644
index 0000000000000..c7c560183cc2d
--- /dev/null
+++ b/tests/baselines/reference/augmentExportEquals6_1.js
@@ -0,0 +1,38 @@
+//// [tests/cases/compiler/augmentExportEquals6_1.ts] ////
+
+//// [file1.d.ts]
+
+declare module "file1" {
+ class foo {}
+ namespace foo {
+ class A {}
+ }
+ export = foo;
+}
+
+
+//// [file2.ts]
+///
+import x = require("file1");
+
+// OK - './file1' is a namespace
+declare module "file1" {
+ interface A { a: number }
+}
+
+//// [file3.ts]
+import * as x from "file1";
+import "file2";
+let a: x.A;
+let b = a.a;
+
+//// [file2.js]
+define(["require", "exports"], function (require, exports) {
+ "use strict";
+});
+//// [file3.js]
+define(["require", "exports", "file2"], function (require, exports) {
+ "use strict";
+ var a;
+ var b = a.a;
+});
diff --git a/tests/baselines/reference/augmentExportEquals6_1.symbols b/tests/baselines/reference/augmentExportEquals6_1.symbols
new file mode 100644
index 0000000000000..5c45af00a48d7
--- /dev/null
+++ b/tests/baselines/reference/augmentExportEquals6_1.symbols
@@ -0,0 +1,45 @@
+=== tests/cases/compiler/file1.d.ts ===
+
+declare module "file1" {
+ class foo {}
+>foo : Symbol(, Decl(file1.d.ts, 1, 24), Decl(file1.d.ts, 2, 16), Decl(file2.ts, 1, 28))
+
+ namespace foo {
+>foo : Symbol(, Decl(file1.d.ts, 1, 24), Decl(file1.d.ts, 2, 16), Decl(file2.ts, 1, 28))
+
+ class A {}
+>A : Symbol(A, Decl(file1.d.ts, 3, 19), Decl(file2.ts, 4, 24))
+ }
+ export = foo;
+>foo : Symbol(foo, Decl(file1.d.ts, 1, 24), Decl(file1.d.ts, 2, 16))
+}
+
+
+=== tests/cases/compiler/file2.ts ===
+///
+import x = require("file1");
+>x : Symbol(x, Decl(file2.ts, 0, 0))
+
+// OK - './file1' is a namespace
+declare module "file1" {
+ interface A { a: number }
+>A : Symbol(A, Decl(file1.d.ts, 3, 19), Decl(file2.ts, 4, 24))
+>a : Symbol(a, Decl(file2.ts, 5, 17))
+}
+
+=== tests/cases/compiler/file3.ts ===
+import * as x from "file1";
+>x : Symbol(x, Decl(file3.ts, 0, 6))
+
+import "file2";
+let a: x.A;
+>a : Symbol(a, Decl(file3.ts, 2, 3))
+>x : Symbol(x, Decl(file3.ts, 0, 6))
+>A : Symbol(x.A, Decl(file1.d.ts, 3, 19), Decl(file2.ts, 4, 24))
+
+let b = a.a;
+>b : Symbol(b, Decl(file3.ts, 3, 3))
+>a.a : Symbol(x.A.a, Decl(file2.ts, 5, 17))
+>a : Symbol(a, Decl(file3.ts, 2, 3))
+>a : Symbol(x.A.a, Decl(file2.ts, 5, 17))
+
diff --git a/tests/baselines/reference/augmentExportEquals6_1.types b/tests/baselines/reference/augmentExportEquals6_1.types
new file mode 100644
index 0000000000000..a9cc78056c860
--- /dev/null
+++ b/tests/baselines/reference/augmentExportEquals6_1.types
@@ -0,0 +1,45 @@
+=== tests/cases/compiler/file1.d.ts ===
+
+declare module "file1" {
+ class foo {}
+>foo :
+
+ namespace foo {
+>foo : typeof
+
+ class A {}
+>A : A
+ }
+ export = foo;
+>foo : foo
+}
+
+
+=== tests/cases/compiler/file2.ts ===
+///
+import x = require("file1");
+>x : typeof x
+
+// OK - './file1' is a namespace
+declare module "file1" {
+ interface A { a: number }
+>A : A
+>a : number
+}
+
+=== tests/cases/compiler/file3.ts ===
+import * as x from "file1";
+>x : typeof x
+
+import "file2";
+let a: x.A;
+>a : x.A
+>x : any
+>A : x.A
+
+let b = a.a;
+>b : number
+>a.a : number
+>a : x.A
+>a : number
+
diff --git a/tests/cases/compiler/augmentExportEquals1.ts b/tests/cases/compiler/augmentExportEquals1.ts
new file mode 100644
index 0000000000000..4479fd063b962
--- /dev/null
+++ b/tests/cases/compiler/augmentExportEquals1.ts
@@ -0,0 +1,19 @@
+// @module: amd
+// @filename: file1.ts
+var x = 1;
+export = x;
+
+// @filename: file2.ts
+
+import x = require("./file1");
+
+// augmentation for './file1'
+// should error since './file1' does not have namespace meaning
+declare module "./file1" {
+ interface A { a }
+}
+
+// @filename: file3.ts
+import x = require("./file1");
+import "./file2";
+let a: x.A; // should not work
\ No newline at end of file
diff --git a/tests/cases/compiler/augmentExportEquals1_1.ts b/tests/cases/compiler/augmentExportEquals1_1.ts
new file mode 100644
index 0000000000000..6afc6e70910ba
--- /dev/null
+++ b/tests/cases/compiler/augmentExportEquals1_1.ts
@@ -0,0 +1,22 @@
+// @module: amd
+
+// @filename: file1.d.ts
+declare module "file1" {
+ var x: number;
+ export = x;
+}
+
+// @filename: file2.ts
+///
+import x = require("file1");
+
+// augmentation for 'file1'
+// should error since 'file1' does not have namespace meaning
+declare module "file1" {
+ interface A { a }
+}
+
+// @filename: file3.ts
+import x = require("file1");
+import "file2";
+let a: x.A; // should not work
\ No newline at end of file
diff --git a/tests/cases/compiler/augmentExportEquals2.ts b/tests/cases/compiler/augmentExportEquals2.ts
new file mode 100644
index 0000000000000..1d4c1fae35c61
--- /dev/null
+++ b/tests/cases/compiler/augmentExportEquals2.ts
@@ -0,0 +1,19 @@
+// @module: amd
+
+// @filename: file1.ts
+function foo() {}
+export = foo;
+
+// @filename: file2.ts
+import x = require("./file1");
+
+// should error since './file1' does not have namespace meaning
+declare module "./file1" {
+ interface A { a }
+}
+
+// @filename: file3.ts
+// @filename: file3.ts
+import x = require("./file1");
+import "./file2";
+let a: x.A; // should not work
\ No newline at end of file
diff --git a/tests/cases/compiler/augmentExportEquals2_1.ts b/tests/cases/compiler/augmentExportEquals2_1.ts
new file mode 100644
index 0000000000000..b6aeb21efd051
--- /dev/null
+++ b/tests/cases/compiler/augmentExportEquals2_1.ts
@@ -0,0 +1,22 @@
+// @module: amd
+
+// @filename: file1.d.ts
+declare module "file1" {
+ function foo(): void;
+ export = foo;
+}
+
+// @filename: file2.ts
+
+///
+import x = require("file1");
+
+// should error since './file1' does not have namespace meaning
+declare module "file1" {
+ interface A { a }
+}
+
+// @filename: file3.ts
+import x = require("file1");
+import "file2";
+let a: x.A; // should not work
\ No newline at end of file
diff --git a/tests/cases/compiler/augmentExportEquals3.ts b/tests/cases/compiler/augmentExportEquals3.ts
new file mode 100644
index 0000000000000..81a0e1d5448f2
--- /dev/null
+++ b/tests/cases/compiler/augmentExportEquals3.ts
@@ -0,0 +1,24 @@
+// @module: amd
+
+// @filename: file1.ts
+function foo() {}
+namespace foo {
+ export var v = 1;
+}
+export = foo;
+
+// @filename: file2.ts
+import x = require("./file1");
+x.b = 1;
+
+// OK - './file1' is a namespace
+declare module "./file1" {
+ interface A { a }
+ let b: number;
+}
+
+// @filename: file3.ts
+import * as x from "./file1";
+import "./file2";
+let a: x.A;
+let b = x.b;
\ No newline at end of file
diff --git a/tests/cases/compiler/augmentExportEquals3_1.ts b/tests/cases/compiler/augmentExportEquals3_1.ts
new file mode 100644
index 0000000000000..ad329643fa57c
--- /dev/null
+++ b/tests/cases/compiler/augmentExportEquals3_1.ts
@@ -0,0 +1,27 @@
+// @module: amd
+// @filename: file1.d.ts
+declare module "file1" {
+ function foo(): void;
+ namespace foo {
+ export var v: number;
+ }
+ export = foo;
+}
+
+
+// @filename: file2.ts
+///
+import x = require("file1");
+x.b = 1;
+
+// OK - './file1' is a namespace
+declare module "file1" {
+ interface A { a }
+ let b: number;
+}
+
+// @filename: file3.ts
+import * as x from "file1";
+import "file2";
+let a: x.A;
+let b = x.b;
\ No newline at end of file
diff --git a/tests/cases/compiler/augmentExportEquals4.ts b/tests/cases/compiler/augmentExportEquals4.ts
new file mode 100644
index 0000000000000..85294682f5cc8
--- /dev/null
+++ b/tests/cases/compiler/augmentExportEquals4.ts
@@ -0,0 +1,24 @@
+// @module: amd
+
+// @filename: file1.ts
+class foo {}
+namespace foo {
+ export var v = 1;
+}
+export = foo;
+
+// @filename: file2.ts
+import x = require("./file1");
+x.b = 1;
+
+// OK - './file1' is a namespace
+declare module "./file1" {
+ interface A { a }
+ let b: number;
+}
+
+// @filename: file3.ts
+import * as x from "./file1";
+import "./file2";
+let a: x.A;
+let b = x.b;
\ No newline at end of file
diff --git a/tests/cases/compiler/augmentExportEquals4_1.ts b/tests/cases/compiler/augmentExportEquals4_1.ts
new file mode 100644
index 0000000000000..467d0af38ef39
--- /dev/null
+++ b/tests/cases/compiler/augmentExportEquals4_1.ts
@@ -0,0 +1,28 @@
+// @module: amd
+
+// @filename: file1.d.ts
+declare module "file1" {
+ class foo {}
+ namespace foo {
+ export var v: number;
+ }
+ export = foo;
+}
+
+
+// @filename: file2.ts
+///
+import x = require("file1");
+x.b = 1;
+
+// OK - './file1' is a namespace
+declare module "file1" {
+ interface A { a }
+ let b: number;
+}
+
+// @filename: file3.ts
+import * as x from "file1";
+import "file2";
+let a: x.A;
+let b = x.b;
\ No newline at end of file
diff --git a/tests/cases/compiler/augmentExportEquals5.ts b/tests/cases/compiler/augmentExportEquals5.ts
new file mode 100644
index 0000000000000..3250a40f131ed
--- /dev/null
+++ b/tests/cases/compiler/augmentExportEquals5.ts
@@ -0,0 +1,82 @@
+// @module: amd
+
+// @filename: express.d.ts
+
+declare module Express {
+ export interface Request { }
+ export interface Response { }
+ export interface Application { }
+}
+
+declare module "express" {
+ function e(): e.Express;
+ namespace e {
+ interface IRoute {
+ all(...handler: RequestHandler[]): IRoute;
+ }
+
+ interface IRouterMatcher {
+ (name: string|RegExp, ...handlers: RequestHandler[]): T;
+ }
+
+ interface IRouter extends RequestHandler {
+ route(path: string): IRoute;
+ }
+
+ export function Router(options?: any): Router;
+
+ export interface Router extends IRouter {}
+
+ interface Errback { (err: Error): void; }
+
+ interface Request extends Express.Request {
+
+ get (name: string): string;
+ }
+
+ interface Response extends Express.Response {
+ charset: string;
+ }
+
+ interface ErrorRequestHandler {
+ (err: any, req: Request, res: Response, next: Function): any;
+ }
+
+ interface RequestHandler {
+ (req: Request, res: Response, next: Function): any;
+ }
+
+ interface Handler extends RequestHandler {}
+
+ interface RequestParamHandler {
+ (req: Request, res: Response, next: Function, param: any): any;
+ }
+
+ interface Application extends IRouter, Express.Application {
+ routes: any;
+ }
+
+ interface Express extends Application {
+ createApplication(): Application;
+ }
+
+ var static: any;
+ }
+
+ export = e;
+}
+
+// @filename: augmentation.ts
+///
+import * as e from "express";
+declare module "express" {
+ interface Request {
+ id: number;
+ }
+}
+
+// @filename: consumer.ts
+import { Request } from "express";
+import "./augmentation";
+let x: Request;
+const y = x.id;
\ No newline at end of file
diff --git a/tests/cases/compiler/augmentExportEquals6.ts b/tests/cases/compiler/augmentExportEquals6.ts
new file mode 100644
index 0000000000000..a0dd50c53f0fd
--- /dev/null
+++ b/tests/cases/compiler/augmentExportEquals6.ts
@@ -0,0 +1,28 @@
+// @module: amd
+
+// @filename: file1.ts
+class foo {}
+namespace foo {
+ export class A {}
+ export namespace B { export let a; }
+}
+export = foo;
+
+// @filename: file2.ts
+import x = require("./file1");
+x.B.b = 1;
+
+// OK - './file1' is a namespace
+declare module "./file1" {
+ interface A { a: number }
+ namespace B {
+ export let b: number;
+ }
+}
+
+// @filename: file3.ts
+import * as x from "./file1";
+import "./file2";
+let a: x.A;
+let b = a.a;
+let c = x.B.b;
\ No newline at end of file
diff --git a/tests/cases/compiler/augmentExportEquals6_1.ts b/tests/cases/compiler/augmentExportEquals6_1.ts
new file mode 100644
index 0000000000000..aaee43bae746f
--- /dev/null
+++ b/tests/cases/compiler/augmentExportEquals6_1.ts
@@ -0,0 +1,26 @@
+// @module: amd
+
+// @filename: file1.d.ts
+declare module "file1" {
+ class foo {}
+ namespace foo {
+ class A {}
+ }
+ export = foo;
+}
+
+
+// @filename: file2.ts
+///
+import x = require("file1");
+
+// OK - './file1' is a namespace
+declare module "file1" {
+ interface A { a: number }
+}
+
+// @filename: file3.ts
+import * as x from "file1";
+import "file2";
+let a: x.A;
+let b = a.a;
\ No newline at end of file