From 668d54ffc0d0f1a660b41179df205a1944539609 Mon Sep 17 00:00:00 2001 From: Ross <52366381+ROSSROSALES@users.noreply.github.com> Date: Fri, 7 Oct 2022 01:58:56 +0000 Subject: [PATCH] [Fix] `sort-prop-types`: avoid crash when autofixing Fixes #3470. --- docs/rules/sort-prop-types.md | 2 ++ lib/util/propTypesSort.js | 34 +++++++++---------- tests/lib/rules/sort-prop-types.js | 52 +++++++++++++++++++++++++++++- 3 files changed, 69 insertions(+), 19 deletions(-) diff --git a/docs/rules/sort-prop-types.md b/docs/rules/sort-prop-types.md index 3f973fad50..ec3d9f2d71 100644 --- a/docs/rules/sort-prop-types.md +++ b/docs/rules/sort-prop-types.md @@ -4,6 +4,8 @@ +🔧 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 diff --git a/lib/util/propTypesSort.js b/lib/util/propTypesSort.js index 0bf8998128..d5c7a3e44b 100644 --- a/lib/util/propTypesSort.js +++ b/lib/util/propTypesSort.js @@ -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') { diff --git a/tests/lib/rules/sort-prop-types.js b/tests/lib/rules/sort-prop-types.js index 8b3ca36442..09391a92bc 100644 --- a/tests/lib/rules/sort-prop-types.js +++ b/tests/lib/rules/sort-prop-types.js @@ -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
; + } + }); + `, + output: ` + var First = createReactClass({ + propTypes: { + /* a */ + a: PropTypes.any /* a */ + /* a */ + /* a */, + b: PropTypes.any, + /* z */ + /* z */ + z: PropTypes.string /* z */ + }, + render: function() { + return
; + } + }); + `, + errors: [ + { + messageId: 'propsNotSorted', + line: 8, + column: 13, + type: 'Property', + }, + { + messageId: 'propsNotSorted', + line: 11, + column: 13, + type: 'Property', + }, + ], + } : [], )), });