Skip to content

Commit 9cee20e

Browse files
author
Michael Hadley
authored
Merge pull request #1 from bsonntag/feature/case-sensitive-option
Add case sensitive option
2 parents 8084b93 + 8f718ea commit 9cee20e

File tree

3 files changed

+79
-2
lines changed

3 files changed

+79
-2
lines changed

README.md

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,3 +40,39 @@ Then configure the rule under the rules section.
4040
}
4141
}
4242
```
43+
44+
## Rule Options
45+
46+
```json
47+
{
48+
"sort-destructure-keys/sort-destructure-keys": [2, {"caseSensitive": false}]
49+
}
50+
```
51+
52+
### `caseSensitive`
53+
54+
When `true` the rule will enforce properties to be in case-sensitive order. Default is `false`.
55+
56+
Example of **incorrect** code for the `{"caseSensitive": false}` option:
57+
58+
```js
59+
let {B, a, c} = obj;
60+
```
61+
62+
Example of **correct** code for the `{"caseSensitive": false}` option:
63+
64+
```js
65+
let {a, B, c} = obj;
66+
```
67+
68+
Example of **incorrect** code for the `{"caseSensitive": true}` option:
69+
70+
```js
71+
let {a, B, c} = obj;
72+
```
73+
74+
Example of **correct** code for the `{"caseSensitive": true}` option:
75+
76+
```js
77+
let {B, a, c} = obj;
78+
```

lib/rules/sort-destructure-keys.js

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,17 @@ module.exports = {
4444
messages: {
4545
sort: `Expected object keys to be in sorted order. Expected {{first}} to be before {{second}}.`
4646
},
47-
schema: []
47+
schema: [
48+
{
49+
type: 'object',
50+
properties: {
51+
caseSensitive: {
52+
type: 'boolean',
53+
}
54+
},
55+
additionalProperties: false
56+
}
57+
]
4858
},
4959

5060
create(context) {
@@ -59,14 +69,18 @@ module.exports = {
5969
return;
6070
}
6171

72+
const options = context.options[0] || {};
73+
const caseSensitive = options.caseSensitive || false;
6274
let prevNode = null;
6375

6476
for (const nextNode of node.properties) {
6577
if (prevNode && !isRestProperty(nextNode)) {
6678
const prevName = getNodeName(prevNode.key);
6779
const nextName = getNodeName(nextNode.key);
80+
const first = caseSensitive ? prevName : prevName.toLowerCase();
81+
const second = caseSensitive ? nextName : nextName.toLowerCase();
6882

69-
if (naturalCompare(prevName.toLowerCase(), nextName.toLowerCase()) > 0) {
83+
if (naturalCompare(first, second) > 0) {
7084
context.report({
7185
node: nextNode,
7286
messageId: 'sort',

tests/lib/rules/sort-destructure-keys.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,18 @@ ruleTester.run('sort-destructure-keys', rule, {
3131
'const {...other} = someObj;',
3232
'const func = ({a, b}) => a + b;',
3333
'const {a: {b, c}, d: {e, f: {g}}} = someObj;',
34+
{
35+
code: 'const {a, b} = someObj;',
36+
options: [{ caseSensitive: true }]
37+
},
38+
{
39+
code: 'const {B, a} = someObj;',
40+
options: [{ caseSensitive: true }]
41+
},
42+
{
43+
code: 'const {aCc, abb} = someObj;',
44+
options: [{ caseSensitive: true }]
45+
}
3446
],
3547
invalid: [
3648
{
@@ -65,5 +77,20 @@ ruleTester.run('sort-destructure-keys', rule, {
6577
code: 'const {a, c: {e, d}, b = c} = someObj;',
6678
errors: [msg('e', 'd')]
6779
},
80+
{
81+
code: 'const {b, a} = someObj;',
82+
errors: just('b', 'a'),
83+
options: [{ caseSensitive: true }]
84+
},
85+
{
86+
code: 'const {a, B} = someObj;',
87+
errors: just('a', 'B'),
88+
options: [{ caseSensitive: true }]
89+
},
90+
{
91+
code: 'const {abc, aBd} = someObj;',
92+
errors: just('abc', 'aBd'),
93+
options: [{ caseSensitive: true }]
94+
},
6895
]
6996
});

0 commit comments

Comments
 (0)