Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add
prefer-event-target
rule (#1792)
Co-authored-by: fisker Cheung <lionkay@gmail.com> Co-authored-by: Sindre Sorhus <sindresorhus@gmail.com>
- Loading branch information
1 parent
6f5ecf5
commit 166524a
Showing
7 changed files
with
194 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
# Prefer `EventTarget` over `EventEmitter` | ||
|
||
<!-- Do not manually modify RULE_NOTICE part. Run: `npm run generate-rule-notices` --> | ||
<!-- RULE_NOTICE --> | ||
✅ *This rule is part of the [recommended](https://github.com/sindresorhus/eslint-plugin-unicorn#recommended-config) config.* | ||
<!-- /RULE_NOTICE --> | ||
|
||
While [`EventEmitter`](https://nodejs.org/api/events.html#class-eventemitter) is only available in Node.js, [`EventTarget`](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget) is also available in *Deno* and browsers. | ||
|
||
This rule reduces the bundle size and makes your code more cross-platform friendly. | ||
|
||
See the [differences](https://nodejs.org/api/events.html#eventtarget-and-event-api) between `EventEmitter` and `EventTarget`. | ||
|
||
## Fail | ||
|
||
```js | ||
import {EventEmitter} from 'node:event'; | ||
|
||
class Foo extends EventEmitter {} | ||
``` | ||
|
||
```js | ||
const emitter = new EventEmitter(); | ||
``` | ||
|
||
## Pass | ||
|
||
```js | ||
class Foo extends EventTarget {} | ||
``` | ||
|
||
```js | ||
const target = new EventTarget(); | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
'use strict'; | ||
const {matches} = require('./selectors/index.js'); | ||
|
||
const MESSAGE_ID = 'prefer-event-target'; | ||
const messages = { | ||
[MESSAGE_ID]: 'Prefer `EventTarget` over `EventEmitter`.', | ||
}; | ||
|
||
const selector = [ | ||
'Identifier', | ||
'[name="EventEmitter"]', | ||
matches([ | ||
'ClassDeclaration > .superClass', | ||
'ClassExpression > .superClass', | ||
'NewExpression > .callee', | ||
]), | ||
].join(''); | ||
|
||
/** @param {import('eslint').Rule.RuleContext} context */ | ||
const create = () => ({ | ||
[selector](node) { | ||
return { | ||
node, | ||
messageId: MESSAGE_ID, | ||
}; | ||
}, | ||
}); | ||
|
||
/** @type {import('eslint').Rule.RuleModule} */ | ||
module.exports = { | ||
create, | ||
meta: { | ||
type: 'suggestion', | ||
docs: { | ||
description: 'Prefer `EventTarget` over `EventEmitter`.', | ||
}, | ||
messages, | ||
}, | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
import outdent from 'outdent'; | ||
import {getTester} from './utils/test.mjs'; | ||
|
||
const {test} = getTester(import.meta); | ||
|
||
test.snapshot({ | ||
valid: [ | ||
'class Foo {}', | ||
'class Foo extends OtherClass {}', | ||
'class Foo extends EventTarget {}', | ||
'const Foo = class extends EventTarget {}', | ||
'const Foo = class extends foo.EventTarget {}', | ||
'const Foo = class extends foo.bar.EventTarget {}', | ||
'class Foo extends foo.EventEmitter {}', | ||
'class Foo extends foo.bar.EventEmitter {}', | ||
'class EventEmitter extends Foo {}', | ||
'const Foo = class EventEmitter extends Foo {}', | ||
'new Foo(EventEmitter)', | ||
'new foo.EventEmitter()', | ||
], | ||
invalid: [ | ||
'class Foo extends EventEmitter {}', | ||
'class Foo extends EventEmitter { someMethod() {} }', | ||
'const Foo = class extends EventEmitter {}', | ||
outdent` | ||
class Foo extends EventEmitter { | ||
addListener() {} | ||
removeListener() {} | ||
} | ||
`, | ||
], | ||
}); | ||
|
||
test.snapshot({ | ||
valid: [ | ||
'EventTarget()', | ||
'new EventTarget', | ||
'const target = new EventTarget;', | ||
'const target = EventTarget()', | ||
'const target = new Foo(EventEmitter);', | ||
'EventEmitter()', | ||
'const emitter = EventEmitter()', | ||
], | ||
invalid: [ | ||
'new EventEmitter', | ||
'const emitter = new EventEmitter;', | ||
], | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
# Snapshot report for `test/prefer-event-target.mjs` | ||
|
||
The actual snapshot is saved in `prefer-event-target.mjs.snap`. | ||
|
||
Generated by [AVA](https://avajs.dev). | ||
|
||
## Invalid #1 | ||
1 | class Foo extends EventEmitter {} | ||
|
||
> Error 1/1 | ||
`␊ | ||
> 1 | class Foo extends EventEmitter {}␊ | ||
| ^^^^^^^^^^^^ Prefer \`EventTarget\` over \`EventEmitter\`.␊ | ||
` | ||
|
||
## Invalid #2 | ||
1 | class Foo extends EventEmitter { someMethod() {} } | ||
|
||
> Error 1/1 | ||
`␊ | ||
> 1 | class Foo extends EventEmitter { someMethod() {} }␊ | ||
| ^^^^^^^^^^^^ Prefer \`EventTarget\` over \`EventEmitter\`.␊ | ||
` | ||
|
||
## Invalid #3 | ||
1 | const Foo = class extends EventEmitter {} | ||
|
||
> Error 1/1 | ||
`␊ | ||
> 1 | const Foo = class extends EventEmitter {}␊ | ||
| ^^^^^^^^^^^^ Prefer \`EventTarget\` over \`EventEmitter\`.␊ | ||
` | ||
|
||
## Invalid #4 | ||
1 | class Foo extends EventEmitter { | ||
2 | addListener() {} | ||
3 | removeListener() {} | ||
4 | } | ||
|
||
> Error 1/1 | ||
`␊ | ||
> 1 | class Foo extends EventEmitter {␊ | ||
| ^^^^^^^^^^^^ Prefer \`EventTarget\` over \`EventEmitter\`.␊ | ||
2 | addListener() {}␊ | ||
3 | removeListener() {}␊ | ||
4 | }␊ | ||
` | ||
|
||
## Invalid #1 | ||
1 | new EventEmitter | ||
|
||
> Error 1/1 | ||
`␊ | ||
> 1 | new EventEmitter␊ | ||
| ^^^^^^^^^^^^ Prefer \`EventTarget\` over \`EventEmitter\`.␊ | ||
` | ||
|
||
## Invalid #2 | ||
1 | const emitter = new EventEmitter; | ||
|
||
> Error 1/1 | ||
`␊ | ||
> 1 | const emitter = new EventEmitter;␊ | ||
| ^^^^^^^^^^^^ Prefer \`EventTarget\` over \`EventEmitter\`.␊ | ||
` |
Binary file not shown.