diff --git a/src/compiler/declarationEmitter.ts b/src/compiler/declarationEmitter.ts
index 278a9cf4a5f..b85c79e775c 100644
--- a/src/compiler/declarationEmitter.ts
+++ b/src/compiler/declarationEmitter.ts
@@ -148,8 +148,8 @@ namespace ts {
moduleElementDeclarationEmitInfo = [];
}
- if (!isBundledEmit && isExternalModule(sourceFile) && sourceFile.moduleAugmentations.length && !resultHasExternalModuleIndicator) {
- // if file was external module with augmentations - this fact should be preserved in .d.ts as well.
+ if (!isBundledEmit && isExternalModule(sourceFile) && !resultHasExternalModuleIndicator) {
+ // if file was external module this fact should be preserved in .d.ts as well.
// in case if we didn't write any external module specifiers in .d.ts we need to emit something
// that will force compiler to think that this file is an external module - 'export {}' is a reasonable choice here.
write("export {};");
@@ -651,6 +651,9 @@ namespace ts {
}
function emitExportAssignment(node: ExportAssignment) {
+ if (isSourceFile(node.parent)) {
+ resultHasExternalModuleIndicator = true; // Top-level exports are external module indicators
+ }
if (node.expression.kind === SyntaxKind.Identifier) {
write(node.isExportEquals ? "export = " : "export default ");
writeTextOfNode(currentText, node.expression);
@@ -745,6 +748,7 @@ namespace ts {
const modifiers = getModifierFlags(node);
// If the node is exported
if (modifiers & ModifierFlags.Export) {
+ resultHasExternalModuleIndicator = true; // Top-level exports are external module indicators
write("export ");
}
@@ -901,6 +905,7 @@ namespace ts {
}
function emitExportDeclaration(node: ExportDeclaration) {
+ resultHasExternalModuleIndicator = true; // Top-level exports are external module indicators
emitJsDocComments(node);
write("export ");
if (node.exportClause) {
diff --git a/tests/baselines/reference/bindingPatternOmittedExpressionNesting.js b/tests/baselines/reference/bindingPatternOmittedExpressionNesting.js
index e2dff308879..0a8542ee637 100644
--- a/tests/baselines/reference/bindingPatternOmittedExpressionNesting.js
+++ b/tests/baselines/reference/bindingPatternOmittedExpressionNesting.js
@@ -9,3 +9,4 @@ var _b, _c, _d, _e;
//// [bindingPatternOmittedExpressionNesting.d.ts]
+export {};
diff --git a/tests/baselines/reference/commentsExternalModules.js b/tests/baselines/reference/commentsExternalModules.js
index 82c6fa53b82..6271c677e65 100644
--- a/tests/baselines/reference/commentsExternalModules.js
+++ b/tests/baselines/reference/commentsExternalModules.js
@@ -169,3 +169,4 @@ export declare module m4 {
function fooExport(): number;
}
//// [commentsExternalModules_1.d.ts]
+export {};
diff --git a/tests/baselines/reference/commonSourceDirectory.js b/tests/baselines/reference/commonSourceDirectory.js
index 5569ae6d52b..ca705a5b34e 100644
--- a/tests/baselines/reference/commonSourceDirectory.js
+++ b/tests/baselines/reference/commonSourceDirectory.js
@@ -28,3 +28,4 @@ foo_1.x + bar_1.y;
//// [/app/bin/index.d.ts]
///
+export {};
diff --git a/tests/baselines/reference/commonjsSafeImport.js b/tests/baselines/reference/commonjsSafeImport.js
index 5eb560f8bb9..3bf05800aa9 100644
--- a/tests/baselines/reference/commonjsSafeImport.js
+++ b/tests/baselines/reference/commonjsSafeImport.js
@@ -24,3 +24,4 @@ _10_lib_1.Foo();
//// [10_lib.d.ts]
export declare function Foo(): void;
//// [main.d.ts]
+export {};
diff --git a/tests/baselines/reference/emptyDeclarationEmitIsModule.js b/tests/baselines/reference/emptyDeclarationEmitIsModule.js
new file mode 100644
index 00000000000..fb0cea6365e
--- /dev/null
+++ b/tests/baselines/reference/emptyDeclarationEmitIsModule.js
@@ -0,0 +1,30 @@
+//// [tests/cases/compiler/emptyDeclarationEmitIsModule.ts] ////
+
+//// [module.ts]
+import * as i from "./index";
+class Foo {}
+//// [index.ts]
+import {} from "./module";
+export interface Bar {
+ x: string
+}
+
+//// [index.js]
+"use strict";
+exports.__esModule = true;
+//// [module.js]
+"use strict";
+exports.__esModule = true;
+var Foo = /** @class */ (function () {
+ function Foo() {
+ }
+ return Foo;
+}());
+
+
+//// [index.d.ts]
+export interface Bar {
+ x: string;
+}
+//// [module.d.ts]
+export {};
diff --git a/tests/baselines/reference/emptyDeclarationEmitIsModule.symbols b/tests/baselines/reference/emptyDeclarationEmitIsModule.symbols
new file mode 100644
index 00000000000..60b0fd65204
--- /dev/null
+++ b/tests/baselines/reference/emptyDeclarationEmitIsModule.symbols
@@ -0,0 +1,15 @@
+=== tests/cases/compiler/module.ts ===
+import * as i from "./index";
+>i : Symbol(i, Decl(module.ts, 0, 6))
+
+class Foo {}
+>Foo : Symbol(Foo, Decl(module.ts, 0, 29))
+
+=== tests/cases/compiler/index.ts ===
+import {} from "./module";
+export interface Bar {
+>Bar : Symbol(Bar, Decl(index.ts, 0, 26))
+
+ x: string
+>x : Symbol(Bar.x, Decl(index.ts, 1, 22))
+}
diff --git a/tests/baselines/reference/emptyDeclarationEmitIsModule.types b/tests/baselines/reference/emptyDeclarationEmitIsModule.types
new file mode 100644
index 00000000000..1a49aa948da
--- /dev/null
+++ b/tests/baselines/reference/emptyDeclarationEmitIsModule.types
@@ -0,0 +1,15 @@
+=== tests/cases/compiler/module.ts ===
+import * as i from "./index";
+>i : typeof i
+
+class Foo {}
+>Foo : Foo
+
+=== tests/cases/compiler/index.ts ===
+import {} from "./module";
+export interface Bar {
+>Bar : Bar
+
+ x: string
+>x : string
+}
diff --git a/tests/baselines/reference/es6ImportDefaultBinding.js b/tests/baselines/reference/es6ImportDefaultBinding.js
index 5629c9b8cdc..bdc9b4b8463 100644
--- a/tests/baselines/reference/es6ImportDefaultBinding.js
+++ b/tests/baselines/reference/es6ImportDefaultBinding.js
@@ -22,3 +22,4 @@ var x = defaultBinding;
declare var a: number;
export default a;
//// [es6ImportDefaultBinding_1.d.ts]
+export {};
diff --git a/tests/baselines/reference/es6ImportDefaultBindingAmd.js b/tests/baselines/reference/es6ImportDefaultBindingAmd.js
index d8a13efa2d6..1f6b3c97c8f 100644
--- a/tests/baselines/reference/es6ImportDefaultBindingAmd.js
+++ b/tests/baselines/reference/es6ImportDefaultBindingAmd.js
@@ -29,3 +29,4 @@ define(["require", "exports", "es6ImportDefaultBindingAmd_0"], function (require
declare var a: number;
export default a;
//// [es6ImportDefaultBindingAmd_1.d.ts]
+export {};
diff --git a/tests/baselines/reference/es6ImportDefaultBindingFollowedWithNamedImport.js b/tests/baselines/reference/es6ImportDefaultBindingFollowedWithNamedImport.js
index a5b7700c36c..ff8d6538b04 100644
--- a/tests/baselines/reference/es6ImportDefaultBindingFollowedWithNamedImport.js
+++ b/tests/baselines/reference/es6ImportDefaultBindingFollowedWithNamedImport.js
@@ -51,3 +51,4 @@ export declare var m: number;
declare const _default: {};
export default _default;
//// [es6ImportDefaultBindingFollowedWithNamedImport_1.d.ts]
+export {};
diff --git a/tests/baselines/reference/es6ImportDefaultBindingFollowedWithNamedImport1.js b/tests/baselines/reference/es6ImportDefaultBindingFollowedWithNamedImport1.js
index 54a4d434606..31194c308ba 100644
--- a/tests/baselines/reference/es6ImportDefaultBindingFollowedWithNamedImport1.js
+++ b/tests/baselines/reference/es6ImportDefaultBindingFollowedWithNamedImport1.js
@@ -41,3 +41,4 @@ var x1 = defaultBinding6;
declare var a: number;
export default a;
//// [es6ImportDefaultBindingFollowedWithNamedImport1_1.d.ts]
+export {};
diff --git a/tests/baselines/reference/es6ImportDefaultBindingFollowedWithNamedImport1InEs5.js b/tests/baselines/reference/es6ImportDefaultBindingFollowedWithNamedImport1InEs5.js
index 46e52a43135..ef9ab7215bc 100644
--- a/tests/baselines/reference/es6ImportDefaultBindingFollowedWithNamedImport1InEs5.js
+++ b/tests/baselines/reference/es6ImportDefaultBindingFollowedWithNamedImport1InEs5.js
@@ -45,3 +45,4 @@ var x = es6ImportDefaultBindingFollowedWithNamedImport1InEs5_0_6.default;
declare var a: number;
export default a;
//// [es6ImportDefaultBindingFollowedWithNamedImport1InEs5_1.d.ts]
+export {};
diff --git a/tests/baselines/reference/es6ImportDefaultBindingFollowedWithNamedImportInEs5.js b/tests/baselines/reference/es6ImportDefaultBindingFollowedWithNamedImportInEs5.js
index 90875ff5878..3c55a05f25e 100644
--- a/tests/baselines/reference/es6ImportDefaultBindingFollowedWithNamedImportInEs5.js
+++ b/tests/baselines/reference/es6ImportDefaultBindingFollowedWithNamedImportInEs5.js
@@ -47,3 +47,4 @@ export declare var a: number;
export declare var x: number;
export declare var m: number;
//// [es6ImportDefaultBindingFollowedWithNamedImportInEs5_1.d.ts]
+export {};
diff --git a/tests/baselines/reference/es6ImportDefaultBindingFollowedWithNamespaceBinding.js b/tests/baselines/reference/es6ImportDefaultBindingFollowedWithNamespaceBinding.js
index 4fbac48bd36..2c86e062635 100644
--- a/tests/baselines/reference/es6ImportDefaultBindingFollowedWithNamespaceBinding.js
+++ b/tests/baselines/reference/es6ImportDefaultBindingFollowedWithNamespaceBinding.js
@@ -17,3 +17,4 @@ var x = nameSpaceBinding.a;
//// [es6ImportDefaultBindingFollowedWithNamespaceBinding_0.d.ts]
export declare var a: number;
//// [es6ImportDefaultBindingFollowedWithNamespaceBinding_1.d.ts]
+export {};
diff --git a/tests/baselines/reference/es6ImportDefaultBindingFollowedWithNamespaceBinding1.js b/tests/baselines/reference/es6ImportDefaultBindingFollowedWithNamespaceBinding1.js
index eb90b4882b0..039b4a3dce8 100644
--- a/tests/baselines/reference/es6ImportDefaultBindingFollowedWithNamespaceBinding1.js
+++ b/tests/baselines/reference/es6ImportDefaultBindingFollowedWithNamespaceBinding1.js
@@ -20,3 +20,4 @@ var x = defaultBinding;
declare var a: number;
export default a;
//// [es6ImportDefaultBindingFollowedWithNamespaceBinding_1.d.ts]
+export {};
diff --git a/tests/baselines/reference/es6ImportDefaultBindingFollowedWithNamespaceBinding1InEs5.js b/tests/baselines/reference/es6ImportDefaultBindingFollowedWithNamespaceBinding1InEs5.js
index a6217abb784..9183663850b 100644
--- a/tests/baselines/reference/es6ImportDefaultBindingFollowedWithNamespaceBinding1InEs5.js
+++ b/tests/baselines/reference/es6ImportDefaultBindingFollowedWithNamespaceBinding1InEs5.js
@@ -24,3 +24,4 @@ var x = es6ImportDefaultBindingFollowedWithNamespaceBindingInEs5_0_1.default;
declare var a: number;
export default a;
//// [es6ImportDefaultBindingFollowedWithNamespaceBindingInEs5_1.d.ts]
+export {};
diff --git a/tests/baselines/reference/es6ImportDefaultBindingFollowedWithNamespaceBindingInEs5.js b/tests/baselines/reference/es6ImportDefaultBindingFollowedWithNamespaceBindingInEs5.js
index 5586054319a..9d87535274b 100644
--- a/tests/baselines/reference/es6ImportDefaultBindingFollowedWithNamespaceBindingInEs5.js
+++ b/tests/baselines/reference/es6ImportDefaultBindingFollowedWithNamespaceBindingInEs5.js
@@ -21,3 +21,4 @@ var x = nameSpaceBinding.a;
//// [es6ImportDefaultBindingFollowedWithNamespaceBindingInEs5_0.d.ts]
export declare var a: number;
//// [es6ImportDefaultBindingFollowedWithNamespaceBindingInEs5_1.d.ts]
+export {};
diff --git a/tests/baselines/reference/es6ImportDefaultBindingInEs5.js b/tests/baselines/reference/es6ImportDefaultBindingInEs5.js
index 165f58b9246..a6175197d8e 100644
--- a/tests/baselines/reference/es6ImportDefaultBindingInEs5.js
+++ b/tests/baselines/reference/es6ImportDefaultBindingInEs5.js
@@ -20,3 +20,4 @@ Object.defineProperty(exports, "__esModule", { value: true });
declare var a: number;
export = a;
//// [es6ImportDefaultBindingInEs5_1.d.ts]
+export {};
diff --git a/tests/baselines/reference/es6ImportNameSpaceImport.js b/tests/baselines/reference/es6ImportNameSpaceImport.js
index c9013259e8e..7ab8a62bf6f 100644
--- a/tests/baselines/reference/es6ImportNameSpaceImport.js
+++ b/tests/baselines/reference/es6ImportNameSpaceImport.js
@@ -23,3 +23,4 @@ var x = nameSpaceBinding.a;
//// [es6ImportNameSpaceImport_0.d.ts]
export declare var a: number;
//// [es6ImportNameSpaceImport_1.d.ts]
+export {};
diff --git a/tests/baselines/reference/es6ImportNameSpaceImportAmd.js b/tests/baselines/reference/es6ImportNameSpaceImportAmd.js
index 44a0635f7a2..17a0509f093 100644
--- a/tests/baselines/reference/es6ImportNameSpaceImportAmd.js
+++ b/tests/baselines/reference/es6ImportNameSpaceImportAmd.js
@@ -26,3 +26,4 @@ define(["require", "exports", "es6ImportNameSpaceImportAmd_0"], function (requir
//// [es6ImportNameSpaceImportAmd_0.d.ts]
export declare var a: number;
//// [es6ImportNameSpaceImportAmd_1.d.ts]
+export {};
diff --git a/tests/baselines/reference/es6ImportNameSpaceImportInEs5.js b/tests/baselines/reference/es6ImportNameSpaceImportInEs5.js
index 1eced8142cb..4382d8f16b2 100644
--- a/tests/baselines/reference/es6ImportNameSpaceImportInEs5.js
+++ b/tests/baselines/reference/es6ImportNameSpaceImportInEs5.js
@@ -23,3 +23,4 @@ var x = nameSpaceBinding.a;
//// [es6ImportNameSpaceImportInEs5_0.d.ts]
export declare var a: number;
//// [es6ImportNameSpaceImportInEs5_1.d.ts]
+export {};
diff --git a/tests/baselines/reference/es6ImportNamedImport.js b/tests/baselines/reference/es6ImportNamedImport.js
index 92e56660cc7..0ce1c57403e 100644
--- a/tests/baselines/reference/es6ImportNamedImport.js
+++ b/tests/baselines/reference/es6ImportNamedImport.js
@@ -87,3 +87,4 @@ export declare var z1: number;
export declare var z2: number;
export declare var aaaa: number;
//// [es6ImportNamedImport_1.d.ts]
+export {};
diff --git a/tests/baselines/reference/es6ImportNamedImportAmd.js b/tests/baselines/reference/es6ImportNamedImportAmd.js
index 8f1a7cb013b..6b7a4bd5743 100644
--- a/tests/baselines/reference/es6ImportNamedImportAmd.js
+++ b/tests/baselines/reference/es6ImportNamedImportAmd.js
@@ -82,3 +82,4 @@ export declare var z1: number;
export declare var z2: number;
export declare var aaaa: number;
//// [es6ImportNamedImportAmd_1.d.ts]
+export {};
diff --git a/tests/baselines/reference/es6ImportNamedImportInEs5.js b/tests/baselines/reference/es6ImportNamedImportInEs5.js
index 8cedfa664a8..9226170d84b 100644
--- a/tests/baselines/reference/es6ImportNamedImportInEs5.js
+++ b/tests/baselines/reference/es6ImportNamedImportInEs5.js
@@ -87,3 +87,4 @@ export declare var z1: number;
export declare var z2: number;
export declare var aaaa: number;
//// [es6ImportNamedImportInEs5_1.d.ts]
+export {};
diff --git a/tests/baselines/reference/exportClassExtendingIntersection.js b/tests/baselines/reference/exportClassExtendingIntersection.js
index a6e1f52804c..9b99e90d511 100644
--- a/tests/baselines/reference/exportClassExtendingIntersection.js
+++ b/tests/baselines/reference/exportClassExtendingIntersection.js
@@ -119,3 +119,4 @@ export declare class MyExtendedClass extends MyExtendedClass_base {
extendedClassProperty: number;
}
//// [Main.d.ts]
+export {};
diff --git a/tests/baselines/reference/exportStarFromEmptyModule.js b/tests/baselines/reference/exportStarFromEmptyModule.js
index 2730778930d..be7de642a6a 100644
--- a/tests/baselines/reference/exportStarFromEmptyModule.js
+++ b/tests/baselines/reference/exportStarFromEmptyModule.js
@@ -68,3 +68,4 @@ export declare class A {
static q: any;
}
//// [exportStarFromEmptyModule_module4.d.ts]
+export {};
diff --git a/tests/baselines/reference/moduleAugmentationGlobal4.js b/tests/baselines/reference/moduleAugmentationGlobal4.js
index a47e4c6673a..dd1c589e43b 100644
--- a/tests/baselines/reference/moduleAugmentationGlobal4.js
+++ b/tests/baselines/reference/moduleAugmentationGlobal4.js
@@ -36,7 +36,6 @@ declare global {
}
}
export { };
-export {};
//// [f2.d.ts]
declare global {
interface Something {
@@ -44,7 +43,6 @@ declare global {
}
}
export { };
-export {};
//// [f3.d.ts]
import "./f1";
import "./f2";
diff --git a/tests/baselines/reference/moduleAugmentationInAmbientModule1.js b/tests/baselines/reference/moduleAugmentationInAmbientModule1.js
index 7bd3c93496c..fe6aabc0a5e 100644
--- a/tests/baselines/reference/moduleAugmentationInAmbientModule1.js
+++ b/tests/baselines/reference/moduleAugmentationInAmbientModule1.js
@@ -36,3 +36,4 @@ x.foo().x;
//// [main.d.ts]
///
+export {};
diff --git a/tests/baselines/reference/multiImportExport.js b/tests/baselines/reference/multiImportExport.js
index 01dc798bf1d..69276cbac9b 100644
--- a/tests/baselines/reference/multiImportExport.js
+++ b/tests/baselines/reference/multiImportExport.js
@@ -67,3 +67,4 @@ export = Math;
//// [Drawing.d.ts]
export import Math = require('./Math/Math');
//// [consumer.d.ts]
+export {};
diff --git a/tests/baselines/reference/shorthand-property-es5-es6.js b/tests/baselines/reference/shorthand-property-es5-es6.js
index 671ce39795c..814d9cd2efd 100644
--- a/tests/baselines/reference/shorthand-property-es5-es6.js
+++ b/tests/baselines/reference/shorthand-property-es5-es6.js
@@ -11,3 +11,4 @@ var bar = { foo: foo, baz: baz };
//// [test.d.ts]
+export {};
diff --git a/tests/baselines/reference/shorthand-property-es6-amd.js b/tests/baselines/reference/shorthand-property-es6-amd.js
index 9469357eea2..35d92784173 100644
--- a/tests/baselines/reference/shorthand-property-es6-amd.js
+++ b/tests/baselines/reference/shorthand-property-es6-amd.js
@@ -14,3 +14,4 @@ define(["require", "exports", "./foo"], function (require, exports, foo_1) {
//// [test.d.ts]
+export {};
diff --git a/tests/baselines/reference/shorthand-property-es6-es6.js b/tests/baselines/reference/shorthand-property-es6-es6.js
index 42c80db10a0..4800de59b7e 100644
--- a/tests/baselines/reference/shorthand-property-es6-es6.js
+++ b/tests/baselines/reference/shorthand-property-es6-es6.js
@@ -11,3 +11,4 @@ const bar = { foo, baz };
//// [test.d.ts]
+export {};
diff --git a/tests/baselines/reference/typeCheckObjectCreationExpressionWithUndefinedCallResolutionData.js b/tests/baselines/reference/typeCheckObjectCreationExpressionWithUndefinedCallResolutionData.js
index df12050eaf6..558650a2a31 100644
--- a/tests/baselines/reference/typeCheckObjectCreationExpressionWithUndefinedCallResolutionData.js
+++ b/tests/baselines/reference/typeCheckObjectCreationExpressionWithUndefinedCallResolutionData.js
@@ -29,3 +29,4 @@ f.foo();
//// [file1.d.ts]
export declare function foo(): any;
//// [file2.d.ts]
+export {};
diff --git a/tests/baselines/reference/unusedImportDeclaration.js b/tests/baselines/reference/unusedImportDeclaration.js
index df84d925cd1..2bfcb7c2e5f 100644
--- a/tests/baselines/reference/unusedImportDeclaration.js
+++ b/tests/baselines/reference/unusedImportDeclaration.js
@@ -38,3 +38,4 @@ declare class TesterB {
}
export = TesterB;
//// [unusedImportDeclaration_testerA.d.ts]
+export {};
diff --git a/tests/baselines/reference/withImportDecl.js b/tests/baselines/reference/withImportDecl.js
index 5c9d693c006..2bf5879ec9b 100644
--- a/tests/baselines/reference/withImportDecl.js
+++ b/tests/baselines/reference/withImportDecl.js
@@ -91,3 +91,4 @@ export declare class A {
}
//// [withImportDecl_1.d.ts]
///
+export {};
diff --git a/tests/cases/compiler/emptyDeclarationEmitIsModule.ts b/tests/cases/compiler/emptyDeclarationEmitIsModule.ts
new file mode 100644
index 00000000000..a96b6d75763
--- /dev/null
+++ b/tests/cases/compiler/emptyDeclarationEmitIsModule.ts
@@ -0,0 +1,9 @@
+// @declaration: true
+// @filename: module.ts
+import * as i from "./index";
+class Foo {}
+// @filename: index.ts
+import {} from "./module";
+export interface Bar {
+ x: string
+}
\ No newline at end of file