Skip to content

Commit

Permalink
Add no-anonymous-default-export rule
Browse files Browse the repository at this point in the history
  • Loading branch information
duncanbeevers committed Jan 5, 2017
1 parent c975742 commit 949ac38
Show file tree
Hide file tree
Showing 7 changed files with 111 additions and 0 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@ This project adheres to [Semantic Versioning](http://semver.org/).
This change log adheres to standards from [Keep a CHANGELOG](http://keepachangelog.com).

## [Unreleased]
### Added
- [`no-anonymous-default-export`] rule: report anonymous default exports; literals or anonymous functions.

### Changed
- [`no-extraneous-dependencies`]: use `read-pkg-up` to simplify finding + loading `package.json` ([#680], thanks [@wtgtybhertgeghgtwtg])

Expand Down
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ This plugin intends to support linting of ES2015+ (ES6+) import/export syntax, a
* Limit the maximum number of dependencies a module can have ([`max-dependencies`])
* Forbid unassigned imports ([`no-unassigned-import`])
* Forbid named default exports ([`no-named-default`])
* Forbid literals and anonymous functions as default exports ([`no-anonymous-default-export`])

[`first`]: ./docs/rules/first.md
[`no-duplicates`]: ./docs/rules/no-duplicates.md
Expand All @@ -87,6 +88,7 @@ This plugin intends to support linting of ES2015+ (ES6+) import/export syntax, a
[`max-dependencies`]: ./docs/rules/max-dependencies.md
[`no-unassigned-import`]: ./docs/rules/no-unassigned-import.md
[`no-named-default`]: ./docs/rules/no-named-default.md
[`no-anonymous-default-export`]: ./docs/rules/no-anonymous-default-export.md

## Installation

Expand Down
25 changes: 25 additions & 0 deletions docs/rules/no-anonymous-default-export.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# no-anonymous-default-export

Reports if an unnamed literal or anonymous function is exported as a module's default.
This helps improve the grepability of the codebase by encouraging the re-use of the same identifier for the module's default export at its declaration site and at its import sites.

## Rule Details

### Fail
```js
export default 123
```

```js
export default function () {}
```

### Pass
```js
const foo = 123
export default foo
```

```js
export default function foo() {}
```
25 changes: 25 additions & 0 deletions docs/rules/no-conditional-export.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# no-conditional-export

Reports if a conditional is used as an export.
This helps improve the readability of the codebase by forbidding potentially complex sub-expressions.

## Rule Details

### Fail
```js
export default 123
```

```js
export default function () {}
```

### Pass
```js
const foo = 123
export default foo
```

```js
export default function foo() {}
```
1 change: 1 addition & 0 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ export const rules = {
'no-named-default': require('./rules/no-named-default'),
'no-named-as-default': require('./rules/no-named-as-default'),
'no-named-as-default-member': require('./rules/no-named-as-default-member'),
'no-anonymous-default-export': require('./rules/no-anonymous-default-export'),

'no-commonjs': require('./rules/no-commonjs'),
'no-amd': require('./rules/no-amd'),
Expand Down
33 changes: 33 additions & 0 deletions src/rules/no-anonymous-default-export.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
/**
* @fileoverview Rule to disallow anonymous default exports.
* @author Duncan Beevers
*/

module.exports = {
meta: {},

create: function (context) {

return {
'ExportDefaultDeclaration': (node) => {
// Export function
if (node.declaration.type === 'Literal' || node.declaration.type === 'ObjectExpression') {
context.report({
node: node,
message: 'Unexpected default export of literal',
})
return
}

if (node.declaration.type === 'FunctionDeclaration' && !node.declaration.id) {
context.report({
node: node,
message: 'Unexpected default export of anonymous function',
})
return
}
},
}

},
}
22 changes: 22 additions & 0 deletions tests/src/rules/no-anonymous-default-export.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { test, SYNTAX_CASES } from '../utils'

import { RuleTester } from 'eslint'

var ruleTester = new RuleTester()
var rule = require('rules/no-anonymous-default-export')

ruleTester.run('no-anonymous-default-export', rule, {
valid: [
test({ code: 'const foo = 123\nexport default foo' }),
test({ code: 'export default function foo() {}'}),

...SYNTAX_CASES,
],

invalid: [
test({ code: 'export default 123', errors: [{ message: 'Unexpected default export of literal' }] }),
test({ code: 'export default {}', errors: [{ message: 'Unexpected default export of literal' }] }),
test({ code: 'export default true', errors: [{ message: 'Unexpected default export of literal' }] }),
test({ code: 'export default function() {}', errors: [{ message: 'Unexpected default export of anonymous function' }] }),
],
})

0 comments on commit 949ac38

Please sign in to comment.