Skip to content

Commit c1ce8a6

Browse files
author
vvo
committed
feat: sort object keys in a deterministic way
Again easier when testing
1 parent 3e2e7b8 commit c1ce8a6

File tree

5 files changed

+22
-1
lines changed

5 files changed

+22
-1
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ Features:
1919
- supports nesting
2020
- props: supports string, number, function (inlined as `prop={function () {code;}}`), object, ReactElement (inlined), regex..
2121
- order props alphabetically
22+
- sort object keys in a deterministic order (`o={{a: 1, b:2}} === o={{b:2, a:1}}`)
2223
- React's documentation indent style for JSX
2324

2425
## Setup

index-test.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,4 +151,12 @@ describe(`reactElementToJSXString(ReactElement)`, () => {
151151
reactElementToJSXString(null);
152152
}).toThrow('react-element-to-jsx-string: Expected a ReactElement');
153153
});
154+
155+
it('ignores object keys order (sortobject)', () => {
156+
expect(
157+
reactElementToJSXString(<div o={{a: 1, b: 2}}/>)
158+
).toEqual(
159+
reactElementToJSXString(<div o={{b: 2, a: 1}}/>)
160+
);
161+
});
154162
});

index.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import React from 'react';
2-
import stringify from 'stringify-object';
32
import collapse from 'collapse-white-space';
43
import {isElement} from 'react-addons-test-utils';
4+
import stringify from 'stringify-object';
5+
import sortobject from 'sortobject';
56

67
export default function reactElementToJSXString(ReactElement) {
78
return toJSXString({ReactElement});
@@ -115,6 +116,11 @@ function recurse({lvl, inline}) {
115116
}
116117

117118
function stringifyObject(obj) {
119+
// sortobject fails on some types, like regex
120+
if (Object.keys(obj).length > 0) {
121+
obj = sortobject(obj);
122+
}
123+
118124
return collapse(stringify(obj))
119125
.replace(/{ /g, '{')
120126
.replace(/ }/g, '}')

npm-shrinkwrap.json

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
"dependencies": {
3232
"collapse-white-space": "^1.0.0",
3333
"react-addons-test-utils": "^0.14.0",
34+
"sortobject": "^1.0.0",
3435
"stringify-object": "^2.3.0"
3536
}
3637
}

0 commit comments

Comments
 (0)