Skip to content

Commit d94956f

Browse files
committed
feat: Enhance objectSortKeys props.
1 parent 8e693c2 commit d94956f

File tree

4 files changed

+45
-3
lines changed

4 files changed

+45
-3
lines changed

core/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -687,7 +687,7 @@ export interface JsonViewProps<T extends object> extends React.DetailedHTMLProps
687687
/** Define the root node name. @default undefined */
688688
keyName?: string | number;
689689
/** Whether sort keys through `String.prototype.localeCompare()` @default false */
690-
objectSortKeys?: boolean | ((a: string, b: string) => number);
690+
objectSortKeys?: boolean | ((keyA: string, keyB: string, valueA: T, valueB: T) => number);
691691
/** Set the indent-width for nested objects @default 15 */
692692
indentWidth?: number;
693693
/** When set to `true`, `objects` and `arrays` are labeled with size @default true */

core/src/comps/KeyValues.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,9 @@ export const KeyValues = <T extends object>(props: KeyValuesProps<T>) => {
3535
entries =
3636
objectSortKeys === true
3737
? entries.sort(([a], [b]) => (typeof a === 'string' && typeof b === 'string' ? a.localeCompare(b) : 0))
38-
: entries.sort(([a], [b]) => (typeof a === 'string' && typeof b === 'string' ? objectSortKeys(a, b) : 0));
38+
: entries.sort(([a, valA], [b, valB]) =>
39+
typeof a === 'string' && typeof b === 'string' ? objectSortKeys(a, b, valA, valB) : 0,
40+
);
3941
}
4042

4143
const style = {

core/src/index.test.tsx

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import renderer from 'react-test-renderer';
2+
import { screen, render, waitFor, fireEvent } from '@testing-library/react';
23
import JsonView from './';
34

45
const avatar = 'https://i.imgur.com/MK3eW3As.jpg';
@@ -47,3 +48,42 @@ it('renders <JsonView /> test case', () => {
4748
expect(tree).toHaveProperty('props.onMouseEnter');
4849
expect(tree).toHaveProperty('props.onMouseLeave');
4950
});
51+
52+
it('renders <JsonView objectSortKeys /> test case', () => {
53+
render(
54+
<JsonView value={{ b: 1, a: 2 }} objectSortKeys>
55+
<JsonView.KeyName data-testid="keyname" />
56+
</JsonView>,
57+
);
58+
const keyname = screen.getAllByTestId('keyname')[0];
59+
expect(keyname.innerHTML).toEqual('a');
60+
});
61+
62+
it('renders <JsonView objectSortKeys={false} /> test case', () => {
63+
render(
64+
<JsonView value={{ b: 1, a: 2 }} objectSortKeys={false}>
65+
<JsonView.KeyName data-testid="keyname" />
66+
</JsonView>,
67+
);
68+
const keyname = screen.getAllByTestId('keyname')[0];
69+
expect(keyname.innerHTML).toEqual('b');
70+
});
71+
72+
it('renders <JsonView objectSortKeys={() => {}} /> test case', () => {
73+
render(
74+
<JsonView
75+
value={{ bool: 1, a: 2 }}
76+
objectSortKeys={(a, b, valA, valB) => {
77+
expect(a).toEqual('a');
78+
expect(b).toEqual('bool');
79+
expect(valA).toEqual(2);
80+
expect(valB).toEqual(1);
81+
return a.localeCompare(b);
82+
}}
83+
>
84+
<JsonView.KeyName data-testid="keyname" />
85+
</JsonView>,
86+
);
87+
const keyname = screen.getAllByTestId('keyname')[0];
88+
expect(keyname.innerHTML).toEqual('a');
89+
});

core/src/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ export interface JsonViewProps<T extends object>
4545
/** Define the root node name. @default undefined */
4646
keyName?: string | number;
4747
/** Whether sort keys through `String.prototype.localeCompare()` @default false */
48-
objectSortKeys?: boolean | ((a: string, b: string) => number);
48+
objectSortKeys?: boolean | ((keyA: string, keyB: string, valueA: T, valueB: T) => number);
4949
/** Set the indent-width for nested objects @default 15 */
5050
indentWidth?: number;
5151
/** When set to `true`, `objects` and `arrays` are labeled with size @default true */

0 commit comments

Comments
 (0)