Skip to content

Commit 1739d6b

Browse files
fatfiszljharb
authored andcommittedNov 28, 2017
Handle call expressions in the no-anonymous-default-export rule
1 parent 697afb2 commit 1739d6b

File tree

3 files changed

+28
-5
lines changed

3 files changed

+28
-5
lines changed
 

‎docs/rules/no-anonymous-default-export.md

+6
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ The complete default configuration looks like this.
1616
"allowArrowFunction": false,
1717
"allowAnonymousClass": false,
1818
"allowAnonymousFunction": false,
19+
"allowCallExpression": true, // The true value here is for backward compatibility
1920
"allowLiteral": false,
2021
"allowObject": false
2122
}]
@@ -33,6 +34,9 @@ export default class {}
3334

3435
export default function () {}
3536

37+
/* eslint import/no-anonymous-default-export: [2, {"allowCallExpression": false}] */
38+
export default foo(bar)
39+
3640
export default 123
3741

3842
export default {}
@@ -59,6 +63,8 @@ export default class {}
5963
/* eslint import/no-anonymous-default-export: [2, {"allowAnonymousFunction": true}] */
6064
export default function () {}
6165

66+
export default foo(bar)
67+
6268
/* eslint import/no-anonymous-default-export: [2, {"allowLiteral": true}] */
6369
export default 123
6470

‎src/rules/no-anonymous-default-export.js

+17-5
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,12 @@ const defs = {
1414
description: 'If `false`, will report default export of an arrow function',
1515
message: 'Assign arrow function to a variable before exporting as module default',
1616
},
17+
CallExpression: {
18+
option: 'allowCallExpression',
19+
description: 'If `false`, will report default export of a function call',
20+
message: 'Assign call result to a variable before exporting as module default',
21+
default: true,
22+
},
1723
ClassDeclaration: {
1824
option: 'allowAnonymousClass',
1925
description: 'If `false`, will report default export of an anonymous class',
@@ -43,18 +49,24 @@ const defs = {
4349
},
4450
}
4551

46-
const schemaProperties = Object.keys(defs).
47-
map((key) => defs[key]).
48-
reduce((acc, def) => {
52+
const schemaProperties = Object.keys(defs)
53+
.map((key) => defs[key])
54+
.reduce((acc, def) => {
4955
acc[def.option] = {
5056
description: def.description,
5157
type: 'boolean',
52-
default: false,
5358
}
5459

5560
return acc
5661
}, {})
5762

63+
const defaults = Object.keys(defs)
64+
.map((key) => defs[key])
65+
.reduce((acc, def) => {
66+
acc[def.option] = def.hasOwnProperty('default') ? def.default : false
67+
return acc
68+
}, {})
69+
5870
module.exports = {
5971
meta: {
6072
schema: [
@@ -67,7 +79,7 @@ module.exports = {
6779
},
6880

6981
create: function (context) {
70-
const options = Object.assign({}, context.options[0])
82+
const options = Object.assign({}, defaults, context.options[0])
7183

7284
return {
7385
'ExportDefaultDeclaration': (node) => {

‎tests/src/rules/no-anonymous-default-export.js

+5
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ ruleTester.run('no-anonymous-default-export', rule, {
2121
test({ code: 'export default \'foo\'', options: [{ allowLiteral: true }] }),
2222
test({ code: 'export default `foo`', options: [{ allowLiteral: true }] }),
2323
test({ code: 'export default {}', options: [{ allowObject: true }] }),
24+
test({ code: 'export default foo(bar)', options: [{ allowCallExpression: true }] }),
2425

2526
// Allow forbidden types with multiple options
2627
test({ code: 'export default 123', options: [{ allowLiteral: true, allowObject: true }] }),
@@ -31,6 +32,9 @@ ruleTester.run('no-anonymous-default-export', rule, {
3132
test({ code: 'const foo = 123\nexport { foo }' }),
3233
test({ code: 'const foo = 123\nexport { foo as default }' }),
3334

35+
// Allow call expressions by default for backwards compatibility
36+
test({ code: 'export default foo(bar)' }),
37+
3438
...SYNTAX_CASES,
3539
],
3640

@@ -43,6 +47,7 @@ ruleTester.run('no-anonymous-default-export', rule, {
4347
test({ code: 'export default \'foo\'', errors: [{ message: 'Assign literal to a variable before exporting as module default' }] }),
4448
test({ code: 'export default `foo`', errors: [{ message: 'Assign literal to a variable before exporting as module default' }] }),
4549
test({ code: 'export default {}', errors: [{ message: 'Assign object to a variable before exporting as module default' }] }),
50+
test({ code: 'export default foo(bar)', options: [{ allowCallExpression: false }], errors: [{ message: 'Assign call result to a variable before exporting as module default' }] }),
4651

4752
// Test failure with non-covering exception
4853
test({ code: 'export default 123', options: [{ allowObject: true }], errors: [{ message: 'Assign literal to a variable before exporting as module default' }] }),

0 commit comments

Comments
 (0)
Please sign in to comment.