Skip to content

feat(eslint-plugin): add rule for unnecessary array allocations#4048

Open
tido64 wants to merge 7 commits intomainfrom
tido/no-unnecessary-arrays
Open

feat(eslint-plugin): add rule for unnecessary array allocations#4048
tido64 wants to merge 7 commits intomainfrom
tido/no-unnecessary-arrays

Conversation

@tido64
Copy link
Member

@tido64 tido64 commented Mar 26, 2026

Description

Added a rule for unnecessary array allocations

Test plan

% yarn test test/no-unnecessary-arrays.test.ts
 PASS  test/no-unnecessary-arrays.test.ts
  no unnecessary array allocations
    no-unnecessary-arrays
      valid
        ✓ [].filter(); (18 ms)
        ✓ [].flatMap(); (2 ms)
        ✓ [].map(); (1 ms)
        ✓ [].reduce(); (1 ms)
        ✓ [].reduceRight(); (2 ms)
        ✓ Array.from([]).filter(); (1 ms)
        ✓ Array.from([]).flatMap(); (1 ms)
        ✓ Array.from([]).map(); (1 ms)
        ✓ Array.from([]).reduce(); (1 ms)
        ✓ Array.from([]).reduceRight(); (1 ms)
        ✓ const a = []; a.filter(); (2 ms)
        ✓ const a = []; a.flatMap(); (1 ms)
        ✓ const a = []; a.map(); (1 ms)
        ✓ const a = []; a.reduce(); (1 ms)
        ✓ const a = []; a.reduceRight(); (2 ms)
        ✓ let a; a.map().filter(); (1 ms)
        ✓ let a; a.map().flatMap(); (1 ms)
        ✓ let a; a.map().map(); (1 ms)
        ✓ let a; a.map().reduce(); (1 ms)
        ✓ let a; a.map().reduceRight(); (1 ms)
        ✓ function f(a) { return a.map().filter(); } (2 ms)
        ✓ function f(a) { return a.map().flatMap(); } (1 ms)
        ✓ function f(a) { return a.map().map(); } (2 ms)
        ✓ function f(a) { return a.map().reduce(); } (1 ms)
        ✓ function f(a) { return a.map().reduceRight(); } (1 ms)
      invalid
        ✓ [].map().filter(); (2 ms)
        ✓ [].map().flatMap(); (1 ms)
        ✓ [].map().map(); (2 ms)
        ✓ [].map().reduce(); (1 ms)
        ✓ [].map().reduceRight();
        ✓ Array.from([]).map().filter(); (2 ms)
        ✓ Array.from([]).map().flatMap(); (1 ms)
        ✓ Array.from([]).map().map(); (1 ms)
        ✓ Array.from([]).map().reduce(); (2 ms)
        ✓ Array.from([]).map().reduceRight();
        ✓ const a = []; a.map().filter();
        ✓ const a = []; a.map().flatMap();
        ✓ const a = []; a.map().map();
        ✓ const a = []; a.map().reduce(); (1 ms)
        ✓ const a = []; a.map().reduceRight(); (1 ms)
        ✓ let a: string[]; a.map().filter(); (1 ms)
        ✓ let a: string[]; a.map().flatMap(); (1 ms)
        ✓ let a: string[]; a.map().map(); (1 ms)
        ✓ let a: string[]; a.map().reduce(); (1 ms)
        ✓ let a: string[]; a.map().reduceRight(); (1 ms)
        ✓ [].map().filter().filter(); (1 ms)
        ✓ [].map().filter().flatMap(); (1 ms)
        ✓ [].map().filter().map(); (1 ms)
        ✓ [].map().filter().reduce(); (1 ms)
        ✓ [].map().filter().reduceRight(); (1 ms)
        ✓ function f(a: string[]): string[] { return a.map().filter(); } (1 ms)
        ✓ function f(a: string[]): string[] { return a.map().flatMap(); } (2 ms)
        ✓ function f(a: string[]): string[] { return a.map().map(); } (1 ms)
        ✓ function f(a: string[]): string[] { return a.map().reduce(); } (1 ms)
        ✓ function f(a: string[]): string[] { return a.map().reduceRight(); } (1 ms)
        ✓ function f(a = []) { return a.map().filter(); } (1 ms)
        ✓ function f(a = []) { return a.map().flatMap(); } (4 ms)
        ✓ function f(a = []) { return a.map().map(); } (1 ms)
        ✓ function f(a = []) { return a.map().reduce(); } (1 ms)
        ✓ function f(a = []) { return a.map().reduceRight(); } (1 ms)
        ✓ function f(...a) { return a.map().filter(); } (1 ms)
        ✓ function f(...a) { return a.map().flatMap(); } (1 ms)
        ✓ function f(...a) { return a.map().map(); } (1 ms)
        ✓ function f(...a) { return a.map().reduce(); }
        ✓ function f(...a) { return a.map().reduceRight(); } (1 ms)

---------------------------|---------|----------|---------|---------|-------------------
File                       | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
---------------------------|---------|----------|---------|---------|-------------------
All files                  |   95.34 |    93.18 |     100 |   95.34 |
 helpers                   |   93.75 |    88.23 |     100 |   93.75 |
  ast.js                   |   93.75 |    88.23 |     100 |   93.75 | 59
 rules                     |   96.29 |    96.29 |     100 |   96.29 |
  no-unnecessary-arrays.js |   96.29 |    96.29 |     100 |   96.29 | 61
---------------------------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests:       65 passed, 65 total
Snapshots:   0 total
Time:        0.764 s, estimated 1 s
image

@github-actions github-actions bot added feature: eslint This is related to ESLint feature: oxlint labels Mar 26, 2026
@tido64 tido64 force-pushed the tido/no-unnecessary-arrays branch from 611647e to 7c28cb8 Compare March 26, 2026 13:38
@tido64 tido64 force-pushed the tido/no-unnecessary-arrays branch from 7c28cb8 to a981317 Compare March 26, 2026 13:43
@tido64 tido64 force-pushed the tido/no-unnecessary-arrays branch from 2fbe394 to 0022029 Compare March 26, 2026 16:10
@tido64 tido64 force-pushed the tido/no-unnecessary-arrays branch from 0022029 to e47a742 Compare March 26, 2026 16:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feature: eslint This is related to ESLint feature: oxlint

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant