Skip to content

Commit

Permalink
[Fix] sort-prop-types: avoid crash when autofixing
Browse files Browse the repository at this point in the history
  • Loading branch information
ROSSROSALES authored and ljharb committed Oct 7, 2022
1 parent dfd64ae commit 4243dcc
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 18 deletions.
2 changes: 2 additions & 0 deletions docs/rules/sort-prop-types.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

<!-- end auto-generated rule header -->

🔧 This rule is automatically fixable using the `--fix` [flag](https://eslint.org/docs/latest/user-guide/command-line-interface#--fix) on the command line.

Some developers prefer to sort prop type declarations alphabetically to be able to find necessary declaration easier at the later time. Others feel that it adds complexity and becomes burden to maintain.

## Rule Details
Expand Down
34 changes: 16 additions & 18 deletions lib/util/propTypesSort.js
Original file line number Diff line number Diff line change
Expand Up @@ -127,29 +127,27 @@ function fixPropTypesSort(fixer, context, declarations, ignoreCase, requiredFirs
const node = allNodes[i];
let commentAfter = [];
let commentBefore = [];
let newStart = 0;
let newEnd = 0;
try {
commentBefore = sourceCode.getCommentsBefore(node);
commentAfter = sourceCode.getCommentsAfter(node);
} catch (e) { /**/ }
if (commentAfter.length === 0 && commentBefore.length === 0) {
commentnodeMap.set(node, { start: node.range[0], end: node.range[1], hasComment: false });
} else {
const firstCommentBefore = commentBefore[0];
if (commentBefore.length === 1) {
commentnodeMap.set(node, { start: firstCommentBefore.range[0], end: node.range[1], hasComment: true });
}
const firstCommentAfter = commentAfter[0];
if (commentAfter.length === 1) {
commentnodeMap.set(node, { start: node.range[0], end: firstCommentAfter.range[1], hasComment: true });
}
if (commentBefore.length === 1 && commentAfter.length === 1) {
commentnodeMap.set(node, {
start: firstCommentBefore.range[0],
end: firstCommentAfter.range[1],
hasComment: true,
});
}

if (commentAfter.length === 0 || commentBefore.length === 0) {
newStart = node.range[0];
newEnd = node.range[1];
}

const firstCommentBefore = commentBefore[0];
if (commentBefore.length >= 1) {
newStart = firstCommentBefore.range[0];
}
const lastCommentAfter = commentAfter[commentAfter.length - 1];
if (commentAfter.length >= 1) {
newEnd = lastCommentAfter.range[1];
}
commentnodeMap.set(node, { start: newStart, end: newEnd, hasComment: true });
}
const nodeGroups = allNodes.reduce((acc, curr) => {
if (curr.type === 'ExperimentalSpreadProperty' || curr.type === 'SpreadElement') {
Expand Down
50 changes: 50 additions & 0 deletions tests/lib/rules/sort-prop-types.js
Original file line number Diff line number Diff line change
Expand Up @@ -2098,6 +2098,56 @@ ruleTester.run('sort-prop-types', rule, {
type: 'Property',
},
],
} : [],
semver.satisfies(eslintPkg.version, '> 3') ? {
code: `
var First = createReactClass({
propTypes: {
/* z */
/* z */
z: PropTypes.string /* z */,
/* a */
a: PropTypes.any /* a */
/* a */
/* a */,
b: PropTypes.any
},
render: function() {
return <div />;
}
});
`,
output: `
var First = createReactClass({
propTypes: {
/* a */
a: PropTypes.any /* a */
/* a */
/* a */,
b: PropTypes.any,
/* z */
/* z */
z: PropTypes.string /* z */
},
render: function() {
return <div />;
}
});
`,
errors: [
{
messageId: 'propsNotSorted',
line: 8,
column: 13,
type: 'Property',
},
{
messageId: 'propsNotSorted',
line: 11,
column: 13,
type: 'Property',
},
],
} : []
)),
});

0 comments on commit 4243dcc

Please sign in to comment.