eslint-plugin-perfectionist
Version:
ESLint plugin for sorting various data such as objects, imports, types, enums, JSX props, etc.
110 lines (109 loc) • 3.32 kB
JavaScript
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' })
const getCommentAboveThatShouldExist = require('./get-comment-above-that-should-exist.js')
const isCommentAboveOption = require('./is-comment-above-option.js')
const getCommentsBefore = require('./get-comments-before.js')
const getGroupIndex = require('./get-group-index.js')
let makeCommentAboveFixes = ({ sortedNodes, sourceCode, options, fixer }) => {
let allAutoAddedComments = new Set(
options.groups
.filter(group => isCommentAboveOption.isCommentAboveOption(group))
.map(({ commentAbove }) => commentAbove),
)
let fixes = []
let firstNodeFixes = makeCommentAboveFix({
nextSortedSortingNode: sortedNodes[0],
sortedSortingNode: null,
allAutoAddedComments,
sourceCode,
options,
fixer,
})
fixes.push(...firstNodeFixes)
for (let i = 0; i < sortedNodes.length - 1; i++) {
let sortedSortingNode = sortedNodes.at(i)
let nextSortedSortingNode = sortedNodes.at(i + 1)
let nodeFixes = makeCommentAboveFix({
nextSortedSortingNode,
allAutoAddedComments,
sortedSortingNode,
sourceCode,
options,
fixer,
})
fixes.push(...nodeFixes)
}
return fixes
}
let makeCommentAboveFix = ({
nextSortedSortingNode,
allAutoAddedComments,
sortedSortingNode,
sourceCode,
options,
fixer,
}) => {
let leftGroupIndex = sortedSortingNode
? getGroupIndex.getGroupIndex(options.groups, sortedSortingNode)
: -1
let rightGroupIndex = getGroupIndex.getGroupIndex(
options.groups,
nextSortedSortingNode,
)
let commentAboveThatShouldExist =
getCommentAboveThatShouldExist.getCommentAboveThatShouldExist({
options: {
...options,
groups: options.groups,
},
sortingNode: nextSortedSortingNode,
rightGroupIndex,
leftGroupIndex,
sourceCode,
})
let commentsBefore = getCommentsBefore.getCommentsBefore({
node: nextSortedSortingNode.node,
sourceCode,
})
let autoAddedCommentsAboveToRemove = commentsBefore
.filter(
comment =>
!(commentAboveThatShouldExist == null
? void 0
: commentAboveThatShouldExist.comment) ||
comment.value.slice(1) !== commentAboveThatShouldExist.comment,
)
.filter(
comment =>
comment.type === 'Line' &&
allAutoAddedComments.has(comment.value.slice(1)),
)
let fixes = []
for (let autoAddedCommentAboveToRemove of autoAddedCommentsAboveToRemove) {
let nextToken = sourceCode.getTokenAfter(autoAddedCommentAboveToRemove)
fixes.push(
fixer.removeRange([
autoAddedCommentAboveToRemove.range[0],
nextToken.range[0],
]),
)
}
if (commentAboveThatShouldExist && !commentAboveThatShouldExist.exists) {
let nodeToPutCommentBefore
let isFirstToken = !sourceCode.getTokenBefore(nextSortedSortingNode.node)
if (isFirstToken || !commentsBefore[0]) {
nodeToPutCommentBefore = nextSortedSortingNode.node
} else {
;[nodeToPutCommentBefore] = commentsBefore
}
fixes.push(
fixer.insertTextBeforeRange(
nodeToPutCommentBefore.range,
`// ${commentAboveThatShouldExist.comment}
`,
),
)
}
return fixes
}
exports.makeCommentAboveFixes = makeCommentAboveFixes