Skip to content

Commit bffab76

Browse files
authored
feat: keep-sorted by keys, for ObjectExpression #21 (#36)
1 parent f3a1065 commit bffab76

File tree

3 files changed

+66
-4
lines changed

3 files changed

+66
-4
lines changed

src/commands/keep-sorted.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,3 +56,29 @@ const arr = [
5656
{ index: 4, name: 'foo' },
5757
]
5858
```
59+
60+
#### Sort Object of Objects
61+
62+
Uses optional inline JSON configuration (like [Sort Array of Objects](#sort-array-of-objects)) to define sort keys.
63+
64+
```js
65+
/// keep-sorted { "keys": ["index","label"] }
66+
const obj = {
67+
a: { index: 3, label: 'banana' },
68+
b: { index: 2, label: 'cherry' },
69+
c: { index: 2, label: 'apple' },
70+
d: { index: 1, label: 'berry' }
71+
}
72+
```
73+
74+
Will be converted to:
75+
76+
```js
77+
/// keep-sorted { "keys": ["index","label"] }
78+
const obj = {
79+
d: { index: 1, label: 'berry' },
80+
c: { index: 2, label: 'apple' },
81+
b: { index: 2, label: 'cherry' },
82+
a: { index: 3, label: 'banana' },
83+
}
84+
```

src/commands/keep-sorted.test.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -405,4 +405,26 @@ run(
405405
`,
406406
errors: ['command-error'],
407407
},
408+
{
409+
description: 'Sort object of objects',
410+
code: $`
411+
/// keep-sorted { "keys": ["index","label"] }
412+
const obj = {
413+
a: { index: 3, label: 'banana' },
414+
b: { index: 2, label: 'cherry' },
415+
c: { index: 2, label: 'apple' },
416+
d: { index: 1, label: 'berry' }
417+
}
418+
`,
419+
output: $`
420+
/// keep-sorted { "keys": ["index","label"] }
421+
const obj = {
422+
d: { index: 1, label: 'berry' },
423+
c: { index: 2, label: 'apple' },
424+
b: { index: 2, label: 'cherry' },
425+
a: { index: 3, label: 'banana' },
426+
}
427+
`,
428+
errors: ['command-fix'],
429+
},
408430
)

src/commands/keep-sorted.ts

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,17 +72,31 @@ export const keepSorted: Command = {
7272
...(options?.keys || []),
7373
].filter(x => x != null) as string[]
7474

75-
if (objectKeys.length > 0 && node.type !== 'ArrayExpression')
76-
return ctx.reportError(`Only arrays can be sorted by keys, but got ${node.type}`)
75+
if (objectKeys.length > 0 && node.type !== 'ArrayExpression' && node.type !== 'ObjectExpression')
76+
return ctx.reportError(`Only arrays and objects can be sorted by keys, but got ${node.type}`)
7777

7878
if (node.type === 'ObjectExpression') {
7979
return sort(
8080
ctx,
8181
node,
82-
node.properties,
82+
node.properties.filter(Boolean) as (Tree.ObjectExpression | Tree.Property)[],
8383
(prop) => {
84-
if (prop.type === 'Property')
84+
if (objectKeys.length) {
85+
if (prop.type === 'Property' && prop.value.type === 'ObjectExpression') {
86+
const objectProp = prop.value
87+
return objectKeys.map((key) => {
88+
for (const innerProp of objectProp.properties) {
89+
if (innerProp.type === 'Property' && getString(innerProp.key) === key) {
90+
return getString(innerProp.value)
91+
}
92+
}
93+
return null
94+
})
95+
}
96+
}
97+
else if (prop.type === 'Property') {
8598
return getString(prop.key)
99+
}
86100
return null
87101
},
88102
)

0 commit comments

Comments
 (0)