Skip to content

Commit

Permalink
fix #328: properly suppress default when looking at * exports.
Browse files Browse the repository at this point in the history
  • Loading branch information
benmosher committed May 11, 2016
1 parent 90fefa3 commit ee80204
Show file tree
Hide file tree
Showing 9 changed files with 46 additions and 10 deletions.
12 changes: 8 additions & 4 deletions src/core/getExports.js
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,8 @@ export default class ExportMap {
if (this.namespace.has(name)) return true
if (this.reexports.has(name)) return true

for (let dep of this.dependencies.values()) {
// default exports must be explicitly re-exported (#328)
if (name !== 'default') for (let dep of this.dependencies.values()) {
let innerMap = dep()

// todo: report as unresolved?
Expand Down Expand Up @@ -264,7 +265,9 @@ export default class ExportMap {
return deep
}

for (let dep of this.dependencies.values()) {

// default exports must be explicitly re-exported (#328)
if (name !== 'default') for (let dep of this.dependencies.values()) {
let innerMap = dep()
// todo: report as unresolved?
if (!innerMap) continue
Expand Down Expand Up @@ -298,7 +301,8 @@ export default class ExportMap {
return imported.get(local)
}

for (let dep of this.dependencies.values()) {
// default exports must be explicitly re-exported (#328)
if (name !== 'default') for (let dep of this.dependencies.values()) {
let innerMap = dep()
// todo: report as unresolved?
if (!innerMap) continue
Expand All @@ -321,7 +325,7 @@ export default class ExportMap {
callback.call(thisArg, getImport().get(local), name, this))

this.dependencies.forEach(dep => dep().forEach((v, n) =>
callback.call(thisArg, v, n, this)))
n !== 'default' && callback.call(thisArg, v, n, this)))
}

// todo: keys, values, entries?
Expand Down
2 changes: 1 addition & 1 deletion src/rules/export.js
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ module.exports = function (context) {
return
}
let any = false
remoteExports.forEach((v, name) => (any = true) && addNamed(name, node))
remoteExports.forEach((v, name) => name !== 'default' && (any = true) && addNamed(name, node))

if (!any) {
context.report(node.source,
Expand Down
1 change: 1 addition & 0 deletions tests/files/deep-es7/b.js
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
export * as c from './c'
export default 'b'
3 changes: 2 additions & 1 deletion tests/files/deep/b.js
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
import * as c from './c'
export { c }
export { c }
export default 'b'
3 changes: 3 additions & 0 deletions tests/files/re-export.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
export const c = 'foo'

export * from './named-exports'

// #328: this exports only 'foo', not the default.
export * from './bar'
6 changes: 6 additions & 0 deletions tests/src/rules/default.js
Original file line number Diff line number Diff line change
Expand Up @@ -115,5 +115,11 @@ ruleTester.run('default', rule, {
parser: 'babel-eslint',
errors: ['No default export found in module.'],
}),

// #328: * exports do not include default
test({
code: 'import barDefault from "./re-export"',
errors: [`No default export found in module.`],
}),
],
})
13 changes: 9 additions & 4 deletions tests/src/rules/export.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ ruleTester.run('export', rule, {
test({ code: 'export { bar }; export * from "./export-all"' }),
test({ code: 'export * from "./export-all"' }),
test({ code: 'export * from "./does-not-exist"' }),

// #328: "export * from" does not export a default
test({ code: 'export default foo; export * from "./bar"' }),
],

invalid: [
Expand All @@ -29,10 +32,6 @@ ruleTester.run('export', rule, {
code: 'export default foo; export default bar',
errors: ['Multiple default exports.', 'Multiple default exports.'],
}),
test({
code: 'export default foo; export * from "./default-export"',
errors: ['Multiple default exports.', 'Multiple default exports.'],
}),
test({
code: 'export default function foo() {}; ' +
'export default function bar() {}',
Expand Down Expand Up @@ -99,5 +98,11 @@ ruleTester.run('export', rule, {
'Multiple exports of name \'bar\'.'],
}),


// #328: "export * from" does not export a default
test({
code: 'export * from "./default-export"',
errors: [`No named exports found in module './default-export'.`],
}),
],
})
6 changes: 6 additions & 0 deletions tests/src/rules/named.js
Original file line number Diff line number Diff line change
Expand Up @@ -217,5 +217,11 @@ ruleTester.run('named', rule, {
// todo: better error message
errors: ["common not found via re-export-default.js -> common.js"],
}),

// #328: * exports do not include default
test({
code: 'import { default as barDefault } from "./re-export"',
errors: [`default not found in './re-export'`],
}),
],
})
10 changes: 10 additions & 0 deletions tests/src/rules/namespace.js
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ const valid = [

// names.default is valid export
test({ code: "import * as names from './default-export';" }),
test({ code: "import * as names from './default-export'; console.log(names.default)" }),
test({
code: 'export * as names from "./default-export"',
parser: 'babel-eslint',
Expand Down Expand Up @@ -164,6 +165,12 @@ const invalid = [
errors: [error('c', 'names')],
}),

// #328: * exports do not include default
test({
code: 'import * as ree from "./re-export"; console.log(ree.default)',
errors: [`'default' not found in imported namespace 'ree'.`],
}),

]

///////////////////////
Expand All @@ -177,6 +184,9 @@ const invalid = [
test({ parser, code: `import * as a from "./${folder}/a"; var {b:{c:{d:{e}}}} = a` }),
test({ parser, code: `import { b } from "./${folder}/a"; var {c:{d:{e}}} = b` }))

// deep namespaces should include explicitly exported defaults
test({ parser, code: `import * as a from "./${folder}/a"; console.log(a.b.default)` }),

invalid.push(
test({
parser,
Expand Down

0 comments on commit ee80204

Please sign in to comment.