diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json
index 899b4292f04..710981fc196 100644
--- a/src/compiler/diagnosticMessages.json
+++ b/src/compiler/diagnosticMessages.json
@@ -2751,7 +2751,12 @@
"Resolving real path for '{0}', result '{1}'": {
"category": "Message",
"code": 6130
- },
+ },
+ "Cannot compile modules using option '{0}' unless the '--module' flag is provided with a valid module type.": {
+ "category": "Error",
+ "code": 6131
+ },
+
"Variable '{0}' implicitly has an '{1}' type.": {
"category": "Error",
"code": 7005
diff --git a/src/compiler/program.ts b/src/compiler/program.ts
index 52547cb165d..4f9b82c9c6d 100644
--- a/src/compiler/program.ts
+++ b/src/compiler/program.ts
@@ -2089,8 +2089,14 @@ namespace ts {
}
// Cannot specify module gen that isn't amd or system with --out
- if (outFile && options.module && !(options.module === ModuleKind.AMD || options.module === ModuleKind.System)) {
- programDiagnostics.add(createCompilerDiagnostic(Diagnostics.Only_amd_and_system_modules_are_supported_alongside_0, options.out ? "out" : "outFile"));
+ if (outFile) {
+ if (options.module && !(options.module === ModuleKind.AMD || options.module === ModuleKind.System)) {
+ programDiagnostics.add(createCompilerDiagnostic(Diagnostics.Only_amd_and_system_modules_are_supported_alongside_0, options.out ? "out" : "outFile"));
+ }
+ else if (options.module === undefined && firstExternalModuleSourceFile) {
+ const span = getErrorSpanForNode(firstExternalModuleSourceFile, firstExternalModuleSourceFile.externalModuleIndicator);
+ programDiagnostics.add(createFileDiagnostic(firstExternalModuleSourceFile, span.start, span.length, Diagnostics.Cannot_compile_modules_using_option_0_unless_the_module_flag_is_provided_with_a_valid_module_type, options.out ? "out" : "outFile"));
+ }
}
// there has to be common source directory if user specified --outdir || --sourceRoot
diff --git a/tests/baselines/reference/outModuleConcatUnspecifiedModuleKind.errors.txt b/tests/baselines/reference/outModuleConcatUnspecifiedModuleKind.errors.txt
new file mode 100644
index 00000000000..f0613367140
--- /dev/null
+++ b/tests/baselines/reference/outModuleConcatUnspecifiedModuleKind.errors.txt
@@ -0,0 +1,11 @@
+tests/cases/compiler/a.ts(2,14): error TS6131: Cannot compile modules using option 'outFile' unless the '--module' flag is provided with a valid module type.
+
+
+==== tests/cases/compiler/a.ts (1 errors) ====
+
+ export class A { } // module
+ ~
+!!! error TS6131: Cannot compile modules using option 'outFile' unless the '--module' flag is provided with a valid module type.
+
+==== tests/cases/compiler/b.ts (0 errors) ====
+ var x = 0; // global
\ No newline at end of file
diff --git a/tests/baselines/reference/outModuleConcatUnspecifiedModuleKind.js b/tests/baselines/reference/outModuleConcatUnspecifiedModuleKind.js
new file mode 100644
index 00000000000..48548400f7f
--- /dev/null
+++ b/tests/baselines/reference/outModuleConcatUnspecifiedModuleKind.js
@@ -0,0 +1,11 @@
+//// [tests/cases/compiler/outModuleConcatUnspecifiedModuleKind.ts] ////
+
+//// [a.ts]
+
+export class A { } // module
+
+//// [b.ts]
+var x = 0; // global
+
+//// [out.js]
+var x = 0; // global
diff --git a/tests/baselines/reference/typeReferenceDirectives11.errors.txt b/tests/baselines/reference/typeReferenceDirectives11.errors.txt
new file mode 100644
index 00000000000..b19efcebb90
--- /dev/null
+++ b/tests/baselines/reference/typeReferenceDirectives11.errors.txt
@@ -0,0 +1,18 @@
+/mod1.ts(2,17): error TS6131: Cannot compile modules using option 'out' unless the '--module' flag is provided with a valid module type.
+
+
+==== /mod2.ts (0 errors) ====
+
+ import {foo} from "./mod1";
+ export const bar = foo();
+==== /types/lib/index.d.ts (0 errors) ====
+
+
+ interface Lib { x }
+
+==== /mod1.ts (1 errors) ====
+
+ export function foo(): Lib { return {x: 1} }
+ ~~~
+!!! error TS6131: Cannot compile modules using option 'out' unless the '--module' flag is provided with a valid module type.
+
\ No newline at end of file
diff --git a/tests/baselines/reference/typeReferenceDirectives11.symbols b/tests/baselines/reference/typeReferenceDirectives11.symbols
deleted file mode 100644
index 875bb2a0900..00000000000
--- a/tests/baselines/reference/typeReferenceDirectives11.symbols
+++ /dev/null
@@ -1,23 +0,0 @@
-=== /mod2.ts ===
-
-import {foo} from "./mod1";
->foo : Symbol(foo, Decl(mod2.ts, 1, 8))
-
-export const bar = foo();
->bar : Symbol(bar, Decl(mod2.ts, 2, 12))
->foo : Symbol(foo, Decl(mod2.ts, 1, 8))
-
-=== /types/lib/index.d.ts ===
-
-
-interface Lib { x }
->Lib : Symbol(Lib, Decl(index.d.ts, 0, 0))
->x : Symbol(Lib.x, Decl(index.d.ts, 2, 15))
-
-=== /mod1.ts ===
-
-export function foo(): Lib { return {x: 1} }
->foo : Symbol(foo, Decl(mod1.ts, 0, 0))
->Lib : Symbol(Lib, Decl(index.d.ts, 0, 0))
->x : Symbol(x, Decl(mod1.ts, 1, 37))
-
diff --git a/tests/baselines/reference/typeReferenceDirectives11.types b/tests/baselines/reference/typeReferenceDirectives11.types
deleted file mode 100644
index 93d80b7988a..00000000000
--- a/tests/baselines/reference/typeReferenceDirectives11.types
+++ /dev/null
@@ -1,26 +0,0 @@
-=== /mod2.ts ===
-
-import {foo} from "./mod1";
->foo : () => Lib
-
-export const bar = foo();
->bar : Lib
->foo() : Lib
->foo : () => Lib
-
-=== /types/lib/index.d.ts ===
-
-
-interface Lib { x }
->Lib : Lib
->x : any
-
-=== /mod1.ts ===
-
-export function foo(): Lib { return {x: 1} }
->foo : () => Lib
->Lib : Lib
->{x: 1} : { x: number; }
->x : number
->1 : number
-
diff --git a/tests/baselines/reference/typeReferenceDirectives12.errors.txt b/tests/baselines/reference/typeReferenceDirectives12.errors.txt
new file mode 100644
index 00000000000..8eee7c04ee3
--- /dev/null
+++ b/tests/baselines/reference/typeReferenceDirectives12.errors.txt
@@ -0,0 +1,37 @@
+/main.ts(1,14): error TS6131: Cannot compile modules using option 'out' unless the '--module' flag is provided with a valid module type.
+
+
+==== /mod2.ts (0 errors) ====
+ import { Cls } from "./main";
+ import "./mod1";
+
+ export const cls = Cls;
+ export const foo = new Cls().foo();
+ export const bar = Cls.bar();
+==== /types/lib/index.d.ts (0 errors) ====
+
+
+ interface Lib { x }
+
+==== /main.ts (1 errors) ====
+ export class Cls {
+ ~~~
+!!! error TS6131: Cannot compile modules using option 'out' unless the '--module' flag is provided with a valid module type.
+ x
+ }
+
+==== /mod1.ts (0 errors) ====
+ ///
+
+ import {Cls} from "./main";
+ Cls.prototype.foo = function() { return undefined; }
+
+ declare module "./main" {
+ interface Cls {
+ foo(): Lib;
+ }
+ namespace Cls {
+ function bar(): Lib;
+ }
+ }
+
\ No newline at end of file
diff --git a/tests/baselines/reference/typeReferenceDirectives12.symbols b/tests/baselines/reference/typeReferenceDirectives12.symbols
deleted file mode 100644
index 30b24c39284..00000000000
--- a/tests/baselines/reference/typeReferenceDirectives12.symbols
+++ /dev/null
@@ -1,68 +0,0 @@
-=== /mod2.ts ===
-import { Cls } from "./main";
->Cls : Symbol(Cls, Decl(mod2.ts, 0, 8))
-
-import "./mod1";
-
-export const cls = Cls;
->cls : Symbol(cls, Decl(mod2.ts, 3, 12))
->Cls : Symbol(Cls, Decl(mod2.ts, 0, 8))
-
-export const foo = new Cls().foo();
->foo : Symbol(foo, Decl(mod2.ts, 4, 12))
->new Cls().foo : Symbol(Cls.foo, Decl(mod1.ts, 6, 19))
->Cls : Symbol(Cls, Decl(mod2.ts, 0, 8))
->foo : Symbol(Cls.foo, Decl(mod1.ts, 6, 19))
-
-export const bar = Cls.bar();
->bar : Symbol(bar, Decl(mod2.ts, 5, 12))
->Cls.bar : Symbol(Cls.bar, Decl(mod1.ts, 9, 19))
->Cls : Symbol(Cls, Decl(mod2.ts, 0, 8))
->bar : Symbol(Cls.bar, Decl(mod1.ts, 9, 19))
-
-=== /types/lib/index.d.ts ===
-
-
-interface Lib { x }
->Lib : Symbol(Lib, Decl(index.d.ts, 0, 0))
->x : Symbol(Lib.x, Decl(index.d.ts, 2, 15))
-
-=== /main.ts ===
-export class Cls {
->Cls : Symbol(Cls, Decl(main.ts, 0, 0), Decl(mod1.ts, 5, 25), Decl(mod1.ts, 8, 5))
-
- x
->x : Symbol(Cls.x, Decl(main.ts, 0, 18))
-}
-
-=== /mod1.ts ===
-///
-
-import {Cls} from "./main";
->Cls : Symbol(Cls, Decl(mod1.ts, 2, 8))
-
-Cls.prototype.foo = function() { return undefined; }
->Cls.prototype.foo : Symbol(Cls.foo, Decl(mod1.ts, 6, 19))
->Cls.prototype : Symbol(Cls.prototype)
->Cls : Symbol(Cls, Decl(mod1.ts, 2, 8))
->prototype : Symbol(Cls.prototype)
->foo : Symbol(Cls.foo, Decl(mod1.ts, 6, 19))
->undefined : Symbol(undefined)
-
-declare module "./main" {
- interface Cls {
->Cls : Symbol(Cls, Decl(main.ts, 0, 0), Decl(mod1.ts, 5, 25), Decl(mod1.ts, 8, 5))
-
- foo(): Lib;
->foo : Symbol(Cls.foo, Decl(mod1.ts, 6, 19))
->Lib : Symbol(Lib, Decl(index.d.ts, 0, 0))
- }
- namespace Cls {
->Cls : Symbol(Cls, Decl(main.ts, 0, 0), Decl(mod1.ts, 5, 25), Decl(mod1.ts, 8, 5))
-
- function bar(): Lib;
->bar : Symbol(bar, Decl(mod1.ts, 9, 19))
->Lib : Symbol(Lib, Decl(index.d.ts, 0, 0))
- }
-}
-
diff --git a/tests/baselines/reference/typeReferenceDirectives12.types b/tests/baselines/reference/typeReferenceDirectives12.types
deleted file mode 100644
index bd429b91f1c..00000000000
--- a/tests/baselines/reference/typeReferenceDirectives12.types
+++ /dev/null
@@ -1,73 +0,0 @@
-=== /mod2.ts ===
-import { Cls } from "./main";
->Cls : typeof Cls
-
-import "./mod1";
-
-export const cls = Cls;
->cls : typeof Cls
->Cls : typeof Cls
-
-export const foo = new Cls().foo();
->foo : Lib
->new Cls().foo() : Lib
->new Cls().foo : () => Lib
->new Cls() : Cls
->Cls : typeof Cls
->foo : () => Lib
-
-export const bar = Cls.bar();
->bar : Lib
->Cls.bar() : Lib
->Cls.bar : () => Lib
->Cls : typeof Cls
->bar : () => Lib
-
-=== /types/lib/index.d.ts ===
-
-
-interface Lib { x }
->Lib : Lib
->x : any
-
-=== /main.ts ===
-export class Cls {
->Cls : Cls
-
- x
->x : any
-}
-
-=== /mod1.ts ===
-///
-
-import {Cls} from "./main";
->Cls : typeof Cls
-
-Cls.prototype.foo = function() { return undefined; }
->Cls.prototype.foo = function() { return undefined; } : () => any
->Cls.prototype.foo : () => Lib
->Cls.prototype : Cls
->Cls : typeof Cls
->prototype : Cls
->foo : () => Lib
->function() { return undefined; } : () => any
->undefined : undefined
-
-declare module "./main" {
- interface Cls {
->Cls : Cls
-
- foo(): Lib;
->foo : () => Lib
->Lib : Lib
- }
- namespace Cls {
->Cls : typeof Cls
-
- function bar(): Lib;
->bar : () => Lib
->Lib : Lib
- }
-}
-
diff --git a/tests/cases/compiler/outModuleConcatUnspecifiedModuleKind.ts b/tests/cases/compiler/outModuleConcatUnspecifiedModuleKind.ts
new file mode 100644
index 00000000000..976a47e2f78
--- /dev/null
+++ b/tests/cases/compiler/outModuleConcatUnspecifiedModuleKind.ts
@@ -0,0 +1,8 @@
+// @target: ES5
+// @outFile: out.js
+
+// @Filename: a.ts
+export class A { } // module
+
+// @Filename: b.ts
+var x = 0; // global
\ No newline at end of file