Skip to content

Add command line flag to allow synthetic default exports #5577

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
Nov 26, 2015
Merged
Show file tree
Hide file tree
Changes from 3 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
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

do we need to add more description that we are not adding anything to the emitted code, but that it is just an illusion to match what the loader would do.

},
{
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 @@ -2109,6 +2109,10 @@
"category": "Message",
"code": 6010
},
"Allow default imports from modules with no default export": {
"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 @@ -2360,6 +2360,7 @@ namespace ts {
noImplicitReturns?: boolean;
noFallthroughCasesInSwitch?: boolean;
forceConsistentCasingInFileNames?: boolean;
allowSyntheticDefaultImports?: boolean;
allowJs?: boolean;
/* @internal */ stripInternal?: boolean;

Expand Down
22 changes: 22 additions & 0 deletions tests/baselines/reference/allowSyntheticDefaultImports1.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
//// [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]
var Foo = (function () {
function Foo() {
}
return Foo;
})();
exports.Foo = Foo;
//// [a.js]
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
}

40 changes: 40 additions & 0 deletions tests/baselines/reference/allowSyntheticDefaultImports2.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
//// [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) {
var Foo;
return {
setters:[],
execute: function() {
Foo = (function () {
function Foo() {
}
return Foo;
})();
exports_1("Foo", Foo);
}
}
});
//// [a.js]
System.register(["./b"], function(exports_1) {
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;
}

41 changes: 41 additions & 0 deletions tests/baselines/reference/allowSyntheticDefaultImports3.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
//// [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) {
var Foo;
return {
setters:[],
execute: function() {
Foo = (function () {
function Foo() {
}
return Foo;
})();
exports_1("Foo", Foo);
}
}
});
//// [a.js]
System.register(["./b"], function(exports_1) {
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());
}
}
});
16 changes: 16 additions & 0 deletions tests/baselines/reference/allowSyntheticDefaultImports4.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
//// [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]
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

27 changes: 27 additions & 0 deletions tests/baselines/reference/allowSyntheticDefaultImports5.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
//// [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) {
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