From d55dcc61cc7c85dbe8bc13856d9b2ac8ecde8c71 Mon Sep 17 00:00:00 2001 From: TruongSinh Tran-Nguyen Date: Fri, 17 Apr 2015 20:29:05 +0300 Subject: [PATCH] `exports.default` in ES5 vs `exports["default"]` in ES3 --- src/compiler/checker.ts | 9 ++++++- src/compiler/emitter.ts | 12 +++++++-- .../reference/exportAndImport-es3-amd.js | 27 +++++++++++++++++++ .../reference/exportAndImport-es3-amd.types | 18 +++++++++++++ .../reference/exportAndImport-es3.js | 24 +++++++++++++++++ .../reference/exportAndImport-es3.types | 18 +++++++++++++ .../reference/exportAndImport-es5-amd.js | 27 +++++++++++++++++++ .../reference/exportAndImport-es5-amd.types | 18 +++++++++++++ .../reference/exportAndImport-es5.js | 24 +++++++++++++++++ .../reference/exportAndImport-es5.types | 18 +++++++++++++ .../compiler/es6ImportDefaultBindingAmd.ts | 1 + .../compiler/es6ImportDefaultBindingDts.ts | 1 + ...ndingFollowedWithNamedImport1WithExport.ts | 1 + ...faultBindingFollowedWithNamedImportDts1.ts | 1 + ...indingFollowedWithNamedImportWithExport.ts | 1 + ...FollowedWithNamespaceBinding1WithExport.ts | 1 + ...BindingFollowedWithNamespaceBindingDts1.ts | 1 + .../es6ImportDefaultBindingMergeErrors.ts | 1 + .../es6ImportDefaultBindingWithExport.ts | 1 + .../es6/modules/exportAndImport-es3-amd.ts | 12 +++++++++ .../es6/modules/exportAndImport-es3.ts | 12 +++++++++ .../es6/modules/exportAndImport-es5-amd.ts | 12 +++++++++ .../es6/modules/exportAndImport-es5.ts | 12 +++++++++ .../conformance/es6/modules/exportStar-amd.ts | 1 + .../conformance/es6/modules/exportStar.ts | 1 + .../es6/modules/exportsAndImports1-amd.ts | 1 + .../es6/modules/exportsAndImports2-amd.ts | 1 + .../es6/modules/exportsAndImports3-amd.ts | 1 + .../es6/modules/exportsAndImports4-amd.ts | 1 + .../es6/modules/exportsAndImports4.ts | 1 + 30 files changed, 256 insertions(+), 3 deletions(-) create mode 100644 tests/baselines/reference/exportAndImport-es3-amd.js create mode 100644 tests/baselines/reference/exportAndImport-es3-amd.types create mode 100644 tests/baselines/reference/exportAndImport-es3.js create mode 100644 tests/baselines/reference/exportAndImport-es3.types create mode 100644 tests/baselines/reference/exportAndImport-es5-amd.js create mode 100644 tests/baselines/reference/exportAndImport-es5-amd.types create mode 100644 tests/baselines/reference/exportAndImport-es5.js create mode 100644 tests/baselines/reference/exportAndImport-es5.types create mode 100644 tests/cases/conformance/es6/modules/exportAndImport-es3-amd.ts create mode 100644 tests/cases/conformance/es6/modules/exportAndImport-es3.ts create mode 100644 tests/cases/conformance/es6/modules/exportAndImport-es5-amd.ts create mode 100644 tests/cases/conformance/es6/modules/exportAndImport-es5.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 2490c32fedc..f5b022f1ca4 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -11412,7 +11412,14 @@ module ts { let node = getDeclarationOfAliasSymbol(symbol); if (node) { if (node.kind === SyntaxKind.ImportClause) { - return getGeneratedNameForNode(node.parent) + ".default"; + let defaultKeyword: string; + + if (languageVersion === ScriptTarget.ES3) { + defaultKeyword = "[\"default\"]"; + } else { + defaultKeyword = ".default"; + } + return getGeneratedNameForNode(node.parent) + defaultKeyword; } if (node.kind === SyntaxKind.ImportSpecifier) { let moduleName = getGeneratedNameForNode(node.parent.parent.parent); diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 82916c3c9ae..4436416618c 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -2452,7 +2452,11 @@ var __param = this.__param || function(index, decorator) { return function (targ writeLine(); emitStart(node); if (node.flags & NodeFlags.Default) { - write("exports.default"); + if (languageVersion === ScriptTarget.ES3) { + write("exports[\"default\"]"); + } else { + write("exports.default"); + } } else { emitModuleMemberName(node); @@ -4548,7 +4552,11 @@ var __param = this.__param || function(index, decorator) { return function (targ writeLine(); emitStart(node); emitContainingModuleName(node); - write(".default = "); + if (languageVersion === ScriptTarget.ES3) { + write("[\"default\"] = "); + } else { + write(".default = "); + } emit(node.expression); write(";"); emitEnd(node); diff --git a/tests/baselines/reference/exportAndImport-es3-amd.js b/tests/baselines/reference/exportAndImport-es3-amd.js new file mode 100644 index 00000000000..a4552e70d68 --- /dev/null +++ b/tests/baselines/reference/exportAndImport-es3-amd.js @@ -0,0 +1,27 @@ +//// [tests/cases/conformance/es6/modules/exportAndImport-es3-amd.ts] //// + +//// [m1.ts] + +export default function f1() { +} + +//// [m2.ts] +import f1 from "./m1"; +export default function f2() { + f1(); +} + + +//// [m1.js] +define(["require", "exports"], function (require, exports) { + function f1() { + } + exports["default"] = f1; +}); +//// [m2.js] +define(["require", "exports", "./m1"], function (require, exports, m1_1) { + function f2() { + m1_1["default"](); + } + exports["default"] = f2; +}); diff --git a/tests/baselines/reference/exportAndImport-es3-amd.types b/tests/baselines/reference/exportAndImport-es3-amd.types new file mode 100644 index 00000000000..30709c49f86 --- /dev/null +++ b/tests/baselines/reference/exportAndImport-es3-amd.types @@ -0,0 +1,18 @@ +=== tests/cases/conformance/es6/modules/m1.ts === + +export default function f1() { +>f1 : () => void, Symbol(f1, Decl(m1.ts, 0, 0)) +} + +=== tests/cases/conformance/es6/modules/m2.ts === +import f1 from "./m1"; +>f1 : () => void, Symbol(f1, Decl(m2.ts, 0, 6)) + +export default function f2() { +>f2 : () => void, Symbol(f2, Decl(m2.ts, 0, 22)) + + f1(); +>f1() : void +>f1 : () => void, Symbol(f1, Decl(m2.ts, 0, 6)) +} + diff --git a/tests/baselines/reference/exportAndImport-es3.js b/tests/baselines/reference/exportAndImport-es3.js new file mode 100644 index 00000000000..5f467509b68 --- /dev/null +++ b/tests/baselines/reference/exportAndImport-es3.js @@ -0,0 +1,24 @@ +//// [tests/cases/conformance/es6/modules/exportAndImport-es3.ts] //// + +//// [m1.ts] + +export default function f1() { +} + +//// [m2.ts] +import f1 from "./m1"; +export default function f2() { + f1(); +} + + +//// [m1.js] +function f1() { +} +exports["default"] = f1; +//// [m2.js] +var m1_1 = require("./m1"); +function f2() { + m1_1["default"](); +} +exports["default"] = f2; diff --git a/tests/baselines/reference/exportAndImport-es3.types b/tests/baselines/reference/exportAndImport-es3.types new file mode 100644 index 00000000000..eafd103f33a --- /dev/null +++ b/tests/baselines/reference/exportAndImport-es3.types @@ -0,0 +1,18 @@ +=== tests/cases/conformance/es6/modules/m1.ts === + +export default function f1() { +>f1 : () => void, Symbol(f1, Decl(m1.ts, 0, 0)) +} + +=== tests/cases/conformance/es6/modules/m2.ts === +import f1 from "./m1"; +>f1 : () => void, Symbol(f1, Decl(m2.ts, 0, 6)) + +export default function f2() { +>f2 : () => void, Symbol(f2, Decl(m2.ts, 0, 22)) + + f1(); +>f1() : void +>f1 : () => void, Symbol(f1, Decl(m2.ts, 0, 6)) +} + diff --git a/tests/baselines/reference/exportAndImport-es5-amd.js b/tests/baselines/reference/exportAndImport-es5-amd.js new file mode 100644 index 00000000000..4966af874f7 --- /dev/null +++ b/tests/baselines/reference/exportAndImport-es5-amd.js @@ -0,0 +1,27 @@ +//// [tests/cases/conformance/es6/modules/exportAndImport-es5-amd.ts] //// + +//// [m1.ts] + +export default function f1() { +} + +//// [m2.ts] +import f1 from "./m1"; +export default function f2() { + f1(); +} + + +//// [m1.js] +define(["require", "exports"], function (require, exports) { + function f1() { + } + exports.default = f1; +}); +//// [m2.js] +define(["require", "exports", "./m1"], function (require, exports, m1_1) { + function f2() { + m1_1.default(); + } + exports.default = f2; +}); diff --git a/tests/baselines/reference/exportAndImport-es5-amd.types b/tests/baselines/reference/exportAndImport-es5-amd.types new file mode 100644 index 00000000000..30709c49f86 --- /dev/null +++ b/tests/baselines/reference/exportAndImport-es5-amd.types @@ -0,0 +1,18 @@ +=== tests/cases/conformance/es6/modules/m1.ts === + +export default function f1() { +>f1 : () => void, Symbol(f1, Decl(m1.ts, 0, 0)) +} + +=== tests/cases/conformance/es6/modules/m2.ts === +import f1 from "./m1"; +>f1 : () => void, Symbol(f1, Decl(m2.ts, 0, 6)) + +export default function f2() { +>f2 : () => void, Symbol(f2, Decl(m2.ts, 0, 22)) + + f1(); +>f1() : void +>f1 : () => void, Symbol(f1, Decl(m2.ts, 0, 6)) +} + diff --git a/tests/baselines/reference/exportAndImport-es5.js b/tests/baselines/reference/exportAndImport-es5.js new file mode 100644 index 00000000000..02d0e43e5a9 --- /dev/null +++ b/tests/baselines/reference/exportAndImport-es5.js @@ -0,0 +1,24 @@ +//// [tests/cases/conformance/es6/modules/exportAndImport-es5.ts] //// + +//// [m1.ts] + +export default function f1() { +} + +//// [m2.ts] +import f1 from "./m1"; +export default function f2() { + f1(); +} + + +//// [m1.js] +function f1() { +} +exports.default = f1; +//// [m2.js] +var m1_1 = require("./m1"); +function f2() { + m1_1.default(); +} +exports.default = f2; diff --git a/tests/baselines/reference/exportAndImport-es5.types b/tests/baselines/reference/exportAndImport-es5.types new file mode 100644 index 00000000000..30709c49f86 --- /dev/null +++ b/tests/baselines/reference/exportAndImport-es5.types @@ -0,0 +1,18 @@ +=== tests/cases/conformance/es6/modules/m1.ts === + +export default function f1() { +>f1 : () => void, Symbol(f1, Decl(m1.ts, 0, 0)) +} + +=== tests/cases/conformance/es6/modules/m2.ts === +import f1 from "./m1"; +>f1 : () => void, Symbol(f1, Decl(m2.ts, 0, 6)) + +export default function f2() { +>f2 : () => void, Symbol(f2, Decl(m2.ts, 0, 22)) + + f1(); +>f1() : void +>f1 : () => void, Symbol(f1, Decl(m2.ts, 0, 6)) +} + diff --git a/tests/cases/compiler/es6ImportDefaultBindingAmd.ts b/tests/cases/compiler/es6ImportDefaultBindingAmd.ts index 659f29251c5..29fb41396e9 100644 --- a/tests/cases/compiler/es6ImportDefaultBindingAmd.ts +++ b/tests/cases/compiler/es6ImportDefaultBindingAmd.ts @@ -1,5 +1,6 @@ // @module: amd // @declaration: true +// @target: ES5 // @filename: es6ImportDefaultBindingAmd_0.ts var a = 10; diff --git a/tests/cases/compiler/es6ImportDefaultBindingDts.ts b/tests/cases/compiler/es6ImportDefaultBindingDts.ts index 282a48da7de..8b8a9787fdd 100644 --- a/tests/cases/compiler/es6ImportDefaultBindingDts.ts +++ b/tests/cases/compiler/es6ImportDefaultBindingDts.ts @@ -1,5 +1,6 @@ // @module: commonjs // @declaration: true +// @target: ES5 // @filename: server.ts class c { } diff --git a/tests/cases/compiler/es6ImportDefaultBindingFollowedWithNamedImport1WithExport.ts b/tests/cases/compiler/es6ImportDefaultBindingFollowedWithNamedImport1WithExport.ts index 9913fbb8fe2..23ec8767d94 100644 --- a/tests/cases/compiler/es6ImportDefaultBindingFollowedWithNamedImport1WithExport.ts +++ b/tests/cases/compiler/es6ImportDefaultBindingFollowedWithNamedImport1WithExport.ts @@ -1,5 +1,6 @@ // @module: commonjs // @declaration: true +// @target: ES5 // @filename: server.ts var a = 10; diff --git a/tests/cases/compiler/es6ImportDefaultBindingFollowedWithNamedImportDts1.ts b/tests/cases/compiler/es6ImportDefaultBindingFollowedWithNamedImportDts1.ts index 724f9ee40d0..7940f211ec7 100644 --- a/tests/cases/compiler/es6ImportDefaultBindingFollowedWithNamedImportDts1.ts +++ b/tests/cases/compiler/es6ImportDefaultBindingFollowedWithNamedImportDts1.ts @@ -1,5 +1,6 @@ // @module: commonjs // @declaration: true +// @target: ES5 // @filename: server.ts class a { } diff --git a/tests/cases/compiler/es6ImportDefaultBindingFollowedWithNamedImportWithExport.ts b/tests/cases/compiler/es6ImportDefaultBindingFollowedWithNamedImportWithExport.ts index 5454a260c3f..341a7c6c896 100644 --- a/tests/cases/compiler/es6ImportDefaultBindingFollowedWithNamedImportWithExport.ts +++ b/tests/cases/compiler/es6ImportDefaultBindingFollowedWithNamedImportWithExport.ts @@ -1,5 +1,6 @@ // @module: amd // @declaration: true +// @target: ES5 // @filename: server.ts export var a = 10; diff --git a/tests/cases/compiler/es6ImportDefaultBindingFollowedWithNamespaceBinding1WithExport.ts b/tests/cases/compiler/es6ImportDefaultBindingFollowedWithNamespaceBinding1WithExport.ts index ced69da29cb..e9f8c9e5a14 100644 --- a/tests/cases/compiler/es6ImportDefaultBindingFollowedWithNamespaceBinding1WithExport.ts +++ b/tests/cases/compiler/es6ImportDefaultBindingFollowedWithNamespaceBinding1WithExport.ts @@ -1,5 +1,6 @@ // @module: amd // @declaration: true +// @target: ES5 // @filename: server.ts var a = 10; diff --git a/tests/cases/compiler/es6ImportDefaultBindingFollowedWithNamespaceBindingDts1.ts b/tests/cases/compiler/es6ImportDefaultBindingFollowedWithNamespaceBindingDts1.ts index 50ac1454554..80038a40ba2 100644 --- a/tests/cases/compiler/es6ImportDefaultBindingFollowedWithNamespaceBindingDts1.ts +++ b/tests/cases/compiler/es6ImportDefaultBindingFollowedWithNamespaceBindingDts1.ts @@ -1,5 +1,6 @@ // @module: amd // @declaration: true +// @target: ES5 // @filename: server.ts class a { } diff --git a/tests/cases/compiler/es6ImportDefaultBindingMergeErrors.ts b/tests/cases/compiler/es6ImportDefaultBindingMergeErrors.ts index b055ef5dce9..1d87fde5784 100644 --- a/tests/cases/compiler/es6ImportDefaultBindingMergeErrors.ts +++ b/tests/cases/compiler/es6ImportDefaultBindingMergeErrors.ts @@ -1,4 +1,5 @@ // @module: commonjs +// @target: ES5 // @filename: es6ImportDefaultBindingMergeErrors_0.ts var a = 10; diff --git a/tests/cases/compiler/es6ImportDefaultBindingWithExport.ts b/tests/cases/compiler/es6ImportDefaultBindingWithExport.ts index 0c544c9eba5..5bc98d15de9 100644 --- a/tests/cases/compiler/es6ImportDefaultBindingWithExport.ts +++ b/tests/cases/compiler/es6ImportDefaultBindingWithExport.ts @@ -1,5 +1,6 @@ // @module: amd // @declaration: true +// @target: ES5 // @filename: server.ts var a = 10; diff --git a/tests/cases/conformance/es6/modules/exportAndImport-es3-amd.ts b/tests/cases/conformance/es6/modules/exportAndImport-es3-amd.ts new file mode 100644 index 00000000000..725230dbe6d --- /dev/null +++ b/tests/cases/conformance/es6/modules/exportAndImport-es3-amd.ts @@ -0,0 +1,12 @@ +//@module: amd +//@target: ES3 + +// @filename: m1.ts +export default function f1() { +} + +// @filename: m2.ts +import f1 from "./m1"; +export default function f2() { + f1(); +} diff --git a/tests/cases/conformance/es6/modules/exportAndImport-es3.ts b/tests/cases/conformance/es6/modules/exportAndImport-es3.ts new file mode 100644 index 00000000000..fbb6ad5f20b --- /dev/null +++ b/tests/cases/conformance/es6/modules/exportAndImport-es3.ts @@ -0,0 +1,12 @@ +//@module: commonjs +//@target: ES3 + +// @filename: m1.ts +export default function f1() { +} + +// @filename: m2.ts +import f1 from "./m1"; +export default function f2() { + f1(); +} diff --git a/tests/cases/conformance/es6/modules/exportAndImport-es5-amd.ts b/tests/cases/conformance/es6/modules/exportAndImport-es5-amd.ts new file mode 100644 index 00000000000..5f14d398c6f --- /dev/null +++ b/tests/cases/conformance/es6/modules/exportAndImport-es5-amd.ts @@ -0,0 +1,12 @@ +//@module: amd +//@target: ES5 + +// @filename: m1.ts +export default function f1() { +} + +// @filename: m2.ts +import f1 from "./m1"; +export default function f2() { + f1(); +} diff --git a/tests/cases/conformance/es6/modules/exportAndImport-es5.ts b/tests/cases/conformance/es6/modules/exportAndImport-es5.ts new file mode 100644 index 00000000000..801e482d944 --- /dev/null +++ b/tests/cases/conformance/es6/modules/exportAndImport-es5.ts @@ -0,0 +1,12 @@ +//@module: commonjs +//@target: ES5 + +// @filename: m1.ts +export default function f1() { +} + +// @filename: m2.ts +import f1 from "./m1"; +export default function f2() { + f1(); +} diff --git a/tests/cases/conformance/es6/modules/exportStar-amd.ts b/tests/cases/conformance/es6/modules/exportStar-amd.ts index ffa8b0a7f10..df19fb636ca 100644 --- a/tests/cases/conformance/es6/modules/exportStar-amd.ts +++ b/tests/cases/conformance/es6/modules/exportStar-amd.ts @@ -1,4 +1,5 @@ // @module: amd +// @target: ES5 // @filename: t1.ts export var x = 1; diff --git a/tests/cases/conformance/es6/modules/exportStar.ts b/tests/cases/conformance/es6/modules/exportStar.ts index 6d820d9c424..300d05cdd4c 100644 --- a/tests/cases/conformance/es6/modules/exportStar.ts +++ b/tests/cases/conformance/es6/modules/exportStar.ts @@ -1,4 +1,5 @@ // @module: commonjs +// @target: ES5 // @filename: t1.ts export var x = 1; diff --git a/tests/cases/conformance/es6/modules/exportsAndImports1-amd.ts b/tests/cases/conformance/es6/modules/exportsAndImports1-amd.ts index 0c4d1de1e6b..e688c0467ba 100644 --- a/tests/cases/conformance/es6/modules/exportsAndImports1-amd.ts +++ b/tests/cases/conformance/es6/modules/exportsAndImports1-amd.ts @@ -1,4 +1,5 @@ // @module: amd +// @target: ES5 // @filename: t1.ts var v = 1; diff --git a/tests/cases/conformance/es6/modules/exportsAndImports2-amd.ts b/tests/cases/conformance/es6/modules/exportsAndImports2-amd.ts index 72e462f0eed..f9c6032c1bc 100644 --- a/tests/cases/conformance/es6/modules/exportsAndImports2-amd.ts +++ b/tests/cases/conformance/es6/modules/exportsAndImports2-amd.ts @@ -1,4 +1,5 @@ // @module: amd +// @target: ES5 // @filename: t1.ts export var x = "x"; diff --git a/tests/cases/conformance/es6/modules/exportsAndImports3-amd.ts b/tests/cases/conformance/es6/modules/exportsAndImports3-amd.ts index b634f6f7764..f804d98a44e 100644 --- a/tests/cases/conformance/es6/modules/exportsAndImports3-amd.ts +++ b/tests/cases/conformance/es6/modules/exportsAndImports3-amd.ts @@ -1,4 +1,5 @@ // @module: amd +// @target: ES5 // @filename: t1.ts export var v = 1; diff --git a/tests/cases/conformance/es6/modules/exportsAndImports4-amd.ts b/tests/cases/conformance/es6/modules/exportsAndImports4-amd.ts index d542a5ae718..1533ea2b6f8 100644 --- a/tests/cases/conformance/es6/modules/exportsAndImports4-amd.ts +++ b/tests/cases/conformance/es6/modules/exportsAndImports4-amd.ts @@ -1,4 +1,5 @@ // @module: amd +// @target: ES5 // @filename: t1.ts export default "hello"; diff --git a/tests/cases/conformance/es6/modules/exportsAndImports4.ts b/tests/cases/conformance/es6/modules/exportsAndImports4.ts index f0770674196..fd4be0816d6 100644 --- a/tests/cases/conformance/es6/modules/exportsAndImports4.ts +++ b/tests/cases/conformance/es6/modules/exportsAndImports4.ts @@ -1,4 +1,5 @@ // @module: commonjs +// @target: ES5 // @filename: t1.ts export default "hello";