Skip to content

Commit c53a069

Browse files
dbrewer5ljharb
authored andcommitted
[New] order: added caseInsensitive as an additional option to alphabetize
- imp: mutateRanksToAlphabetizeV2 added to handle case insensitive sorting - tests: add two test cases for alphabetize.caseInsensitive: true - docs: added documentation for new options: alphabetize.caseInsensitive - imp: merged mutateRanksToAlphabetizeV2 to original - changelog: updated with caseInsensitive addition
1 parent 4e8960d commit c53a069

4 files changed

Lines changed: 67 additions & 6 deletions

File tree

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ This project adheres to [Semantic Versioning](http://semver.org/).
55
This change log adheres to standards from [Keep a CHANGELOG](http://keepachangelog.com).
66

77
## [Unreleased]
8+
### Added
9+
- [`order`]: added `caseInsensitive` as an additional option to `alphabetize` ([#1586], thanks [@dbrewer5])
10+
811
### Fixed
912
- [`no-unused-modules`]: fix usage of `import/extensions` settings ([#1560], thanks [@stekycz])
1013

@@ -625,6 +628,7 @@ for info on changes for earlier releases.
625628

626629
[`memo-parser`]: ./memo-parser/README.md
627630

631+
[#1586]: https://github.com/benmosher/eslint-plugin-import/pull/1586
628632
[#1563]: https://github.com/benmosher/eslint-plugin-import/pull/1563
629633
[#1560]: https://github.com/benmosher/eslint-plugin-import/pull/1560
630634
[#1551]: https://github.com/benmosher/eslint-plugin-import/pull/1551
@@ -1046,3 +1050,4 @@ for info on changes for earlier releases.
10461050
[@randallreedjr]: https://github.com/randallreedjr
10471051
[@Pessimistress]: https://github.com/Pessimistress
10481052
[@stekycz]: https://github.com/stekycz
1053+
[@dbrewer5]: https://github.com/dbrewer5

docs/rules/order.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,16 +189,18 @@ import index from './';
189189
import sibling from './foo';
190190
```
191191

192-
### `alphabetize: {order: asc|desc|ignore}`:
192+
### `alphabetize: {order: asc|desc|ignore, caseInsensitive: true|false}`:
193193

194194
Sort the order within each group in alphabetical manner based on **import path**:
195195

196196
- `order`: use `asc` to sort in ascending order, and `desc` to sort in descending order (default: `ignore`).
197+
- `caseInsensitive`: use `true` to ignore case, and `false` to consider case (default: `false`).
197198

198199
Example setting:
199200
```js
200201
alphabetize: {
201202
order: 'asc', /* sort in ascending order. Options: ['ignore', 'asc', 'desc'] */
203+
caseInsensitive: true /* ignore case. Options: [true, false] */
202204
}
203205
```
204206

@@ -210,12 +212,14 @@ import React, { PureComponent } from 'react';
210212
import aTypes from 'prop-types';
211213
import { compose, apply } from 'xcompose';
212214
import * as classnames from 'classnames';
215+
import blist from 'BList';
213216
```
214217

215218
While this will pass:
216219

217220
```js
218221
/* eslint import/order: ["error", {"alphabetize": true}] */
222+
import blist from 'BList';
219223
import * as classnames from 'classnames';
220224
import aTypes from 'prop-types';
221225
import React, { PureComponent } from 'react';

src/rules/order.js

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ function importsSorterDesc(importA, importB) {
267267
return 0
268268
}
269269

270-
function mutateRanksToAlphabetize(imported, order) {
270+
function mutateRanksToAlphabetize(imported, alphabetizeOptions) {
271271
const groupedByRanks = imported.reduce(function(acc, importedItem) {
272272
if (!Array.isArray(acc[importedItem.rank])) {
273273
acc[importedItem.rank] = []
@@ -278,10 +278,11 @@ function mutateRanksToAlphabetize(imported, order) {
278278

279279
const groupRanks = Object.keys(groupedByRanks)
280280

281-
const sorterFn = order === 'asc' ? importsSorterAsc : importsSorterDesc
281+
const sorterFn = alphabetizeOptions.order === 'asc' ? importsSorterAsc : importsSorterDesc
282+
const comparator = alphabetizeOptions.caseInsensitive ? (a, b) => sorterFn(String(a).toLowerCase(), String(b).toLowerCase()) : (a, b) => sorterFn(a, b);
282283
// sort imports locally within their group
283284
groupRanks.forEach(function(groupRank) {
284-
groupedByRanks[groupRank].sort(sorterFn)
285+
groupedByRanks[groupRank].sort(comparator)
285286
})
286287

287288
// assign globally unique rank to each import
@@ -487,8 +488,9 @@ function makeNewlinesBetweenReport (context, imported, newlinesBetweenImports) {
487488
function getAlphabetizeConfig(options) {
488489
const alphabetize = options.alphabetize || {}
489490
const order = alphabetize.order || 'ignore'
491+
const caseInsensitive = alphabetize.caseInsensitive || false
490492

491-
return {order}
493+
return {order, caseInsensitive}
492494
}
493495

494496
module.exports = {
@@ -540,6 +542,10 @@ module.exports = {
540542
alphabetize: {
541543
type: 'object',
542544
properties: {
545+
caseInsensitive: {
546+
type: 'boolean',
547+
default: false,
548+
},
543549
order: {
544550
enum: ['ignore', 'asc', 'desc'],
545551
default: 'ignore',
@@ -604,7 +610,7 @@ module.exports = {
604610
}
605611

606612
if (alphabetize.order !== 'ignore') {
607-
mutateRanksToAlphabetize(imported, alphabetize.order)
613+
mutateRanksToAlphabetize(imported, alphabetize)
608614
}
609615

610616
makeOutOfOrderReport(context, imported)

tests/src/rules/order.js

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1870,5 +1870,51 @@ ruleTester.run('order', rule, {
18701870
message: '`bar` import should occur before import of `Bar`',
18711871
}],
18721872
}),
1873+
// Option alphabetize {order: 'asc': caseInsensitive: true}
1874+
test({
1875+
code: `
1876+
import b from 'foo';
1877+
import a from 'Bar';
1878+
1879+
import index from './';
1880+
`,
1881+
output: `
1882+
import a from 'Bar';
1883+
import b from 'foo';
1884+
1885+
import index from './';
1886+
`,
1887+
options: [{
1888+
groups: ['external', 'index'],
1889+
alphabetize: {order: 'asc', caseInsensitive: true},
1890+
}],
1891+
errors: [{
1892+
ruleID: 'order',
1893+
message: '`Bar` import should occur before import of `foo`',
1894+
}],
1895+
}),
1896+
// Option alphabetize {order: 'desc': caseInsensitive: true}
1897+
test({
1898+
code: `
1899+
import a from 'Bar';
1900+
import b from 'foo';
1901+
1902+
import index from './';
1903+
`,
1904+
output: `
1905+
import b from 'foo';
1906+
import a from 'Bar';
1907+
1908+
import index from './';
1909+
`,
1910+
options: [{
1911+
groups: ['external', 'index'],
1912+
alphabetize: {order: 'desc', caseInsensitive: true},
1913+
}],
1914+
errors: [{
1915+
ruleID: 'order',
1916+
message: '`foo` import should occur before import of `Bar`',
1917+
}],
1918+
}),
18731919
].filter((t) => !!t),
18741920
})

0 commit comments

Comments
 (0)