Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion src/compiler/checker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ namespace ts {
const compilerOptions = host.getCompilerOptions();
const languageVersion = compilerOptions.target || ScriptTarget.ES3;
const modulekind = compilerOptions.module ? compilerOptions.module : languageVersion === ScriptTarget.ES6 ? ModuleKind.ES6 : ModuleKind.None;
const allowSyntheticDefaultImports = typeof compilerOptions.allowSyntheticDefaultImports !== "undefined" ? compilerOptions.allowSyntheticDefaultImports : modulekind === ModuleKind.System;

const emitResolver = createResolver();

Expand Down Expand Up @@ -768,9 +769,12 @@ namespace ts {
const moduleSymbol = resolveExternalModuleName(node, (<ImportDeclaration>node.parent).moduleSpecifier);
if (moduleSymbol) {
const exportDefaultSymbol = resolveSymbol(moduleSymbol.exports["default"]);
if (!exportDefaultSymbol) {
if (!exportDefaultSymbol && !allowSyntheticDefaultImports) {
error(node.name, Diagnostics.Module_0_has_no_default_export, symbolToString(moduleSymbol));
}
else if (!exportDefaultSymbol && allowSyntheticDefaultImports) {
return resolveSymbol(moduleSymbol.exports["export="]) || resolveSymbol(moduleSymbol);
}
return exportDefaultSymbol;
}
}
Expand Down
9 changes: 7 additions & 2 deletions src/compiler/commandLineParser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -280,10 +280,15 @@ namespace ts {
type: "boolean",
description: Diagnostics.Disallow_inconsistently_cased_references_to_the_same_file
},
{
name: "allowSyntheticDefaultImports",
type: "boolean",
description: Diagnostics.Allow_default_imports_from_modules_with_no_default_export_This_does_not_affect_code_emit_just_typechecking
},
{
name: "allowJs",
type: "boolean",
description: Diagnostics.Allow_javascript_files_to_be_compiled,
description: Diagnostics.Allow_javascript_files_to_be_compiled
}
];

Expand Down Expand Up @@ -488,7 +493,7 @@ namespace ts {
fileNames: getFileNames(),
errors
};

function getFileNames(): string[] {
let fileNames: string[] = [];
if (hasProperty(json, "files")) {
Expand Down
4 changes: 4 additions & 0 deletions src/compiler/diagnosticMessages.json
Original file line number Diff line number Diff line change
Expand Up @@ -2117,6 +2117,10 @@
"category": "Message",
"code": 6010
},
"Allow default imports from modules with no default export. This does not affect code emit, just typechecking.": {
"category": "Message",
"code": 6011
},
"Specify ECMAScript target version: 'ES3' (default), 'ES5', or 'ES2015' (experimental)": {
"category": "Message",
"code": 6015
Expand Down
1 change: 1 addition & 0 deletions src/compiler/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2372,6 +2372,7 @@ namespace ts {
noImplicitReturns?: boolean;
noFallthroughCasesInSwitch?: boolean;
forceConsistentCasingInFileNames?: boolean;
allowSyntheticDefaultImports?: boolean;
allowJs?: boolean;
/* @internal */ stripInternal?: boolean;

Expand Down
24 changes: 24 additions & 0 deletions tests/baselines/reference/allowSyntheticDefaultImports1.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
//// [tests/cases/compiler/allowSyntheticDefaultImports1.ts] ////

//// [a.ts]
import Namespace from "./b";
export var x = new Namespace.Foo();

//// [b.ts]
export class Foo {
member: string;
}


//// [b.js]
"use strict";
var Foo = (function () {
function Foo() {
}
return Foo;
})();
exports.Foo = Foo;
//// [a.js]
"use strict";
var b_1 = require("./b");
exports.x = new b_1["default"].Foo();
18 changes: 18 additions & 0 deletions tests/baselines/reference/allowSyntheticDefaultImports1.symbols
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
=== tests/cases/compiler/a.ts ===
import Namespace from "./b";
>Namespace : Symbol(Namespace, Decl(a.ts, 0, 6))

export var x = new Namespace.Foo();
>x : Symbol(x, Decl(a.ts, 1, 10))
>Namespace.Foo : Symbol(Namespace.Foo, Decl(b.ts, 0, 0))
>Namespace : Symbol(Namespace, Decl(a.ts, 0, 6))
>Foo : Symbol(Namespace.Foo, Decl(b.ts, 0, 0))

=== tests/cases/compiler/b.ts ===
export class Foo {
>Foo : Symbol(Foo, Decl(b.ts, 0, 0))

member: string;
>member : Symbol(member, Decl(b.ts, 0, 18))
}

19 changes: 19 additions & 0 deletions tests/baselines/reference/allowSyntheticDefaultImports1.types
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
=== tests/cases/compiler/a.ts ===
import Namespace from "./b";
>Namespace : typeof Namespace

export var x = new Namespace.Foo();
>x : Namespace.Foo
>new Namespace.Foo() : Namespace.Foo
>Namespace.Foo : typeof Namespace.Foo
>Namespace : typeof Namespace
>Foo : typeof Namespace.Foo

=== tests/cases/compiler/b.ts ===
export class Foo {
>Foo : Foo

member: string;
>member : string
}

42 changes: 42 additions & 0 deletions tests/baselines/reference/allowSyntheticDefaultImports2.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
//// [tests/cases/compiler/allowSyntheticDefaultImports2.ts] ////

//// [a.ts]
import Namespace from "./b";
export var x = new Namespace.Foo();

//// [b.ts]
export class Foo {
member: string;
}

//// [b.js]
System.register([], function(exports_1) {
"use strict";
var Foo;
return {
setters:[],
execute: function() {
Foo = (function () {
function Foo() {
}
return Foo;
})();
exports_1("Foo", Foo);
}
}
});
//// [a.js]
System.register(["./b"], function(exports_1) {
"use strict";
var b_1;
var x;
return {
setters:[
function (b_1_1) {
b_1 = b_1_1;
}],
execute: function() {
exports_1("x", x = new b_1["default"].Foo());
}
}
});
17 changes: 17 additions & 0 deletions tests/baselines/reference/allowSyntheticDefaultImports2.symbols
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
=== tests/cases/compiler/a.ts ===
import Namespace from "./b";
>Namespace : Symbol(Namespace, Decl(a.ts, 0, 6))

export var x = new Namespace.Foo();
>x : Symbol(x, Decl(a.ts, 1, 10))
>Namespace.Foo : Symbol(Namespace.Foo, Decl(b.ts, 0, 0))
>Namespace : Symbol(Namespace, Decl(a.ts, 0, 6))
>Foo : Symbol(Namespace.Foo, Decl(b.ts, 0, 0))

=== tests/cases/compiler/b.ts ===
export class Foo {
>Foo : Symbol(Foo, Decl(b.ts, 0, 0))

member: string;
>member : Symbol(member, Decl(b.ts, 0, 18))
}
18 changes: 18 additions & 0 deletions tests/baselines/reference/allowSyntheticDefaultImports2.types
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
=== tests/cases/compiler/a.ts ===
import Namespace from "./b";
>Namespace : typeof Namespace

export var x = new Namespace.Foo();
>x : Namespace.Foo
>new Namespace.Foo() : Namespace.Foo
>Namespace.Foo : typeof Namespace.Foo
>Namespace : typeof Namespace
>Foo : typeof Namespace.Foo

=== tests/cases/compiler/b.ts ===
export class Foo {
>Foo : Foo

member: string;
>member : string
}
14 changes: 14 additions & 0 deletions tests/baselines/reference/allowSyntheticDefaultImports3.errors.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
tests/cases/compiler/a.ts(1,8): error TS1192: Module '"tests/cases/compiler/b"' has no default export.


==== tests/cases/compiler/a.ts (1 errors) ====
import Namespace from "./b";
~~~~~~~~~
!!! error TS1192: Module '"tests/cases/compiler/b"' has no default export.
export var x = new Namespace.Foo();

==== tests/cases/compiler/b.ts (0 errors) ====
export class Foo {
member: string;
}

43 changes: 43 additions & 0 deletions tests/baselines/reference/allowSyntheticDefaultImports3.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
//// [tests/cases/compiler/allowSyntheticDefaultImports3.ts] ////

//// [a.ts]
import Namespace from "./b";
export var x = new Namespace.Foo();

//// [b.ts]
export class Foo {
member: string;
}


//// [b.js]
System.register([], function(exports_1) {
"use strict";
var Foo;
return {
setters:[],
execute: function() {
Foo = (function () {
function Foo() {
}
return Foo;
})();
exports_1("Foo", Foo);
}
}
});
//// [a.js]
System.register(["./b"], function(exports_1) {
"use strict";
var b_1;
var x;
return {
setters:[
function (b_1_1) {
b_1 = b_1_1;
}],
execute: function() {
exports_1("x", x = new b_1["default"].Foo());
}
}
});
17 changes: 17 additions & 0 deletions tests/baselines/reference/allowSyntheticDefaultImports4.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
//// [tests/cases/compiler/allowSyntheticDefaultImports4.ts] ////

//// [b.d.ts]
declare class Foo {
member: string;
}
export = Foo;

//// [a.ts]
import Foo from "./b";
export var x = new Foo();


//// [a.js]
"use strict";
var b_1 = require("./b");
exports.x = new b_1["default"]();
18 changes: 18 additions & 0 deletions tests/baselines/reference/allowSyntheticDefaultImports4.symbols
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
=== tests/cases/compiler/b.d.ts ===
declare class Foo {
>Foo : Symbol(Foo, Decl(b.d.ts, 0, 0))

member: string;
>member : Symbol(member, Decl(b.d.ts, 0, 19))
}
export = Foo;
>Foo : Symbol(Foo, Decl(b.d.ts, 0, 0))

=== tests/cases/compiler/a.ts ===
import Foo from "./b";
>Foo : Symbol(Foo, Decl(a.ts, 0, 6))

export var x = new Foo();
>x : Symbol(x, Decl(a.ts, 1, 10))
>Foo : Symbol(Foo, Decl(a.ts, 0, 6))

19 changes: 19 additions & 0 deletions tests/baselines/reference/allowSyntheticDefaultImports4.types
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
=== tests/cases/compiler/b.d.ts ===
declare class Foo {
>Foo : Foo

member: string;
>member : string
}
export = Foo;
>Foo : Foo

=== tests/cases/compiler/a.ts ===
import Foo from "./b";
>Foo : typeof Foo

export var x = new Foo();
>x : Foo
>new Foo() : Foo
>Foo : typeof Foo

28 changes: 28 additions & 0 deletions tests/baselines/reference/allowSyntheticDefaultImports5.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
//// [tests/cases/compiler/allowSyntheticDefaultImports5.ts] ////

//// [b.d.ts]
declare class Foo {
member: string;
}
export = Foo;

//// [a.ts]
import Foo from "./b";
export var x = new Foo();


//// [a.js]
System.register(["./b"], function(exports_1) {
"use strict";
var b_1;
var x;
return {
setters:[
function (b_1_1) {
b_1 = b_1_1;
}],
execute: function() {
exports_1("x", x = new b_1["default"]());
}
}
});
18 changes: 18 additions & 0 deletions tests/baselines/reference/allowSyntheticDefaultImports5.symbols
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
=== tests/cases/compiler/b.d.ts ===
declare class Foo {
>Foo : Symbol(Foo, Decl(b.d.ts, 0, 0))

member: string;
>member : Symbol(member, Decl(b.d.ts, 0, 19))
}
export = Foo;
>Foo : Symbol(Foo, Decl(b.d.ts, 0, 0))

=== tests/cases/compiler/a.ts ===
import Foo from "./b";
>Foo : Symbol(Foo, Decl(a.ts, 0, 6))

export var x = new Foo();
>x : Symbol(x, Decl(a.ts, 1, 10))
>Foo : Symbol(Foo, Decl(a.ts, 0, 6))

19 changes: 19 additions & 0 deletions tests/baselines/reference/allowSyntheticDefaultImports5.types
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
=== tests/cases/compiler/b.d.ts ===
declare class Foo {
>Foo : Foo

member: string;
>member : string
}
export = Foo;
>Foo : Foo

=== tests/cases/compiler/a.ts ===
import Foo from "./b";
>Foo : typeof Foo

export var x = new Foo();
>x : Foo
>new Foo() : Foo
>Foo : typeof Foo

Loading