Skip to content

Commit 2bb1a04

Browse files
NotWoodsfisker
andauthored
Add prefer-blob-reading-methods rule (#2065)
Co-authored-by: fisker <[email protected]>
1 parent d90f337 commit 2bb1a04

File tree

7 files changed

+128
-0
lines changed

7 files changed

+128
-0
lines changed

configs/recommended.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ module.exports = {
7575
'unicorn/prefer-array-some': 'error',
7676
// TODO: Enable this by default when targeting a Node.js version that supports `Array#at`.
7777
'unicorn/prefer-at': 'off',
78+
'unicorn/prefer-blob-reading-methods': 'error',
7879
'unicorn/prefer-code-point': 'error',
7980
'unicorn/prefer-date-now': 'error',
8081
'unicorn/prefer-default-parameters': 'error',
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# Prefer `Blob#arrayBuffer()` over `FileReader#readAsArrayBuffer(…)` and `Blob#text()` over `FileReader#readAsText(…)`
2+
3+
💼 This rule is enabled in the ✅ `recommended` [config](https://github.com/sindresorhus/eslint-plugin-unicorn#preset-configs).
4+
5+
<!-- end auto-generated rule header -->
6+
<!-- Do not manually modify this header. Run: `npm run fix:eslint-docs` -->
7+
8+
`FileReader` predates promises, and the newer [`Blob#arrayBuffer()`](https://developer.mozilla.org/en-US/docs/Web/API/Blob/arrayBuffer) and [`Blob#text()`](https://developer.mozilla.org/en-US/docs/Web/API/Blob/text) methods are much cleaner and easier to use.
9+
10+
## Fail
11+
12+
```js
13+
const arrayBuffer = await new Promise((resolve, reject) => {
14+
const fileReader = new FileReader();
15+
fileReader.addEventListener('load', () => {
16+
resolve(fileReader.result);
17+
});
18+
fileReader.addEventListener('error', () => {
19+
reject(fileReader.error);
20+
});
21+
fileReader.readAsArrayBuffer(blob);
22+
});
23+
```
24+
25+
```js
26+
fileReader.readAsText(blob);
27+
```
28+
29+
## Pass
30+
31+
```js
32+
const arrayBuffer = await blob.arrayBuffer();
33+
```
34+
35+
```js
36+
const text = await blob.text();
37+
```
38+
39+
```js
40+
fileReader.readAsText(blob, 'ascii');
41+
```
42+
43+
```js
44+
fileReader.readAsDataURL(blob);
45+
```

readme.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ If you don't use the preset, ensure you use the same `env` and `parserOptions` c
116116
| [prefer-array-index-of](docs/rules/prefer-array-index-of.md) | Prefer `Array#{indexOf,lastIndexOf}()` over `Array#{findIndex,findLastIndex}()` when looking for the index of an item. || 🔧 | 💡 |
117117
| [prefer-array-some](docs/rules/prefer-array-some.md) | Prefer `.some(…)` over `.filter(…).length` check and `.{find,findLast}(…)`. || 🔧 | 💡 |
118118
| [prefer-at](docs/rules/prefer-at.md) | Prefer `.at()` method for index access and `String#charAt()`. | | 🔧 | 💡 |
119+
| [prefer-blob-reading-methods](docs/rules/prefer-blob-reading-methods.md) | Prefer `Blob#arrayBuffer()` over `FileReader#readAsArrayBuffer(…)` and `Blob#text()` over `FileReader#readAsText(…)`. || | |
119120
| [prefer-code-point](docs/rules/prefer-code-point.md) | Prefer `String#codePointAt(…)` over `String#charCodeAt(…)` and `String.fromCodePoint(…)` over `String.fromCharCode(…)`. || | 💡 |
120121
| [prefer-date-now](docs/rules/prefer-date-now.md) | Prefer `Date.now()` to get the number of milliseconds since the Unix Epoch. || 🔧 | |
121122
| [prefer-default-parameters](docs/rules/prefer-default-parameters.md) | Prefer default parameters over reassignment. || 🔧 | 💡 |

rules/prefer-blob-reading-methods.js

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
'use strict';
2+
const {methodCallSelector} = require('./selectors/index.js');
3+
4+
const messages = {
5+
'error/readAsArrayBuffer': 'Prefer `Blob#arrayBuffer()` over `FileReader#readAsArrayBuffer(blob)`.',
6+
'error/readAsText': 'Prefer `Blob#text()` over `FileReader#readAsText(blob)`.',
7+
};
8+
9+
const selector = methodCallSelector({
10+
methods: ['readAsText', 'readAsArrayBuffer'],
11+
argumentsLength: 1,
12+
});
13+
14+
/** @param {import('eslint').Rule.RuleContext} context */
15+
const create = () => ({
16+
[selector](node) {
17+
const method = node.callee.property;
18+
const methodName = method.name;
19+
20+
return {
21+
node: method,
22+
messageId: `error/${methodName}`,
23+
};
24+
},
25+
});
26+
27+
/** @type {import('eslint').Rule.RuleModule} */
28+
module.exports = {
29+
create,
30+
meta: {
31+
type: 'suggestion',
32+
docs: {
33+
description: 'Prefer `Blob#arrayBuffer()` over `FileReader#readAsArrayBuffer(…)` and `Blob#text()` over `FileReader#readAsText(…)`.',
34+
},
35+
messages,
36+
},
37+
};

test/prefer-blob-reading-methods.mjs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import {getTester} from './utils/test.mjs';
2+
3+
const {test} = getTester(import.meta);
4+
5+
test.snapshot({
6+
valid: [
7+
'blob.arrayBuffer()',
8+
'blob.text()',
9+
'new Response(blob).arrayBuffer()',
10+
'new Response(blob).text()',
11+
'fileReader.readAsDataURL(blob)',
12+
'fileReader.readAsBinaryString(blob)',
13+
'fileReader.readAsText(blob, "ascii")',
14+
],
15+
invalid: [
16+
'fileReader.readAsArrayBuffer(blob)',
17+
'fileReader.readAsText(blob)',
18+
],
19+
});
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# Snapshot report for `test/prefer-blob-reading-methods.mjs`
2+
3+
The actual snapshot is saved in `prefer-blob-reading-methods.mjs.snap`.
4+
5+
Generated by [AVA](https://avajs.dev).
6+
7+
## Invalid #1
8+
1 | fileReader.readAsArrayBuffer(blob)
9+
10+
> Error 1/1
11+
12+
`␊
13+
> 1 | fileReader.readAsArrayBuffer(blob)␊
14+
| ^^^^^^^^^^^^^^^^^ Prefer \`Blob#arrayBuffer()\` over \`FileReader#readAsArrayBuffer(blob)\`.␊
15+
`
16+
17+
## Invalid #2
18+
1 | fileReader.readAsText(blob)
19+
20+
> Error 1/1
21+
22+
`␊
23+
> 1 | fileReader.readAsText(blob)␊
24+
| ^^^^^^^^^^ Prefer \`Blob#text()\` over \`FileReader#readAsText(blob)\`.␊
25+
`
224 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)