From bf49e8a56d54ffe293d9d12bd772a366f34dc26a Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Thu, 17 Oct 2019 17:16:50 -0700 Subject: [PATCH] Ensure export= symbol from JavaScript always has a valueDeclaration --- src/compiler/binder.ts | 3 ++- ...avascriptImportDefaultBadExport.errors.txt | 16 ++++++++++++++++ .../javascriptImportDefaultBadExport.symbols | 17 +++++++++++++++++ .../javascriptImportDefaultBadExport.types | 19 +++++++++++++++++++ .../javascriptImportDefaultBadExport.ts | 12 ++++++++++++ 5 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/javascriptImportDefaultBadExport.errors.txt create mode 100644 tests/baselines/reference/javascriptImportDefaultBadExport.symbols create mode 100644 tests/baselines/reference/javascriptImportDefaultBadExport.types create mode 100644 tests/cases/compiler/javascriptImportDefaultBadExport.ts diff --git a/src/compiler/binder.ts b/src/compiler/binder.ts index e3fcc4624cf57..fff191ac82160 100644 --- a/src/compiler/binder.ts +++ b/src/compiler/binder.ts @@ -2691,7 +2691,8 @@ namespace ts { const flags = exportAssignmentIsAlias(node) ? SymbolFlags.Alias // An export= with an EntityNameExpression or a ClassExpression exports all meanings of that identifier or class : SymbolFlags.Property | SymbolFlags.ExportValue | SymbolFlags.ValueModule; - declareSymbol(file.symbol.exports!, file.symbol, node, flags | SymbolFlags.Assignment, SymbolFlags.None); + const symbol = declareSymbol(file.symbol.exports!, file.symbol, node, flags | SymbolFlags.Assignment, SymbolFlags.None); + setValueDeclaration(symbol, node); } function bindThisPropertyAssignment(node: BindablePropertyAssignmentExpression | PropertyAccessExpression | LiteralLikeElementAccessExpression) { diff --git a/tests/baselines/reference/javascriptImportDefaultBadExport.errors.txt b/tests/baselines/reference/javascriptImportDefaultBadExport.errors.txt new file mode 100644 index 0000000000000..71ff85e2155fe --- /dev/null +++ b/tests/baselines/reference/javascriptImportDefaultBadExport.errors.txt @@ -0,0 +1,16 @@ +/b.js(1,8): error TS1259: Module '"/a"' can only be default-imported using the 'esModuleInterop' flag + + +==== /a.js (0 errors) ==== + // https://github.com/microsoft/TypeScript/issues/34481 + + + const alias = {}; + module.exports = alias; + +==== /b.js (1 errors) ==== + import a from "./a"; + ~ +!!! error TS1259: Module '"/a"' can only be default-imported using the 'esModuleInterop' flag +!!! related TS2594 /a.js:5:1: This module is declared with using 'export =', and can only be used with a default import when using the 'esModuleInterop' flag. + \ No newline at end of file diff --git a/tests/baselines/reference/javascriptImportDefaultBadExport.symbols b/tests/baselines/reference/javascriptImportDefaultBadExport.symbols new file mode 100644 index 0000000000000..b5506996aff79 --- /dev/null +++ b/tests/baselines/reference/javascriptImportDefaultBadExport.symbols @@ -0,0 +1,17 @@ +=== /a.js === +// https://github.com/microsoft/TypeScript/issues/34481 + + +const alias = {}; +>alias : Symbol(alias, Decl(a.js, 3, 5)) + +module.exports = alias; +>module.exports : Symbol("/a", Decl(a.js, 0, 0)) +>module : Symbol(export=, Decl(a.js, 3, 17)) +>exports : Symbol(export=, Decl(a.js, 3, 17)) +>alias : Symbol(alias, Decl(a.js, 3, 5)) + +=== /b.js === +import a from "./a"; +>a : Symbol(a, Decl(b.js, 0, 6)) + diff --git a/tests/baselines/reference/javascriptImportDefaultBadExport.types b/tests/baselines/reference/javascriptImportDefaultBadExport.types new file mode 100644 index 0000000000000..81d68cbdf964c --- /dev/null +++ b/tests/baselines/reference/javascriptImportDefaultBadExport.types @@ -0,0 +1,19 @@ +=== /a.js === +// https://github.com/microsoft/TypeScript/issues/34481 + + +const alias = {}; +>alias : {} +>{} : {} + +module.exports = alias; +>module.exports = alias : {} +>module.exports : {} +>module : { "/a": {}; } +>exports : {} +>alias : {} + +=== /b.js === +import a from "./a"; +>a : any + diff --git a/tests/cases/compiler/javascriptImportDefaultBadExport.ts b/tests/cases/compiler/javascriptImportDefaultBadExport.ts new file mode 100644 index 0000000000000..c1f2455e11d69 --- /dev/null +++ b/tests/cases/compiler/javascriptImportDefaultBadExport.ts @@ -0,0 +1,12 @@ +// https://github.com/microsoft/TypeScript/issues/34481 + +// @allowJs: true +// @checkJs: true +// @noEmit: true + +// @Filename: /a.js +const alias = {}; +module.exports = alias; + +// @Filename: /b.js +import a from "./a";