76 lines
2.5 KiB
JavaScript
76 lines
2.5 KiB
JavaScript
import { isGroupWithOverridesOption } from './is-group-with-overrides-option.js'
|
|
import { getCommentsBefore } from './get-comments-before.js'
|
|
/**
|
|
* Determines if a comment should exist above a node when transitioning between
|
|
* groups.
|
|
*
|
|
* Checks if the group configuration requires a comment above nodes when they
|
|
* are the first element of their group following a different group. This is
|
|
* used to enforce comment separators between different sections of sorted
|
|
* code.
|
|
*
|
|
* The function returns null if:
|
|
*
|
|
* - The left and right elements are in the same or reversed group order
|
|
* - The group configuration doesn't require a comment above.
|
|
*
|
|
* @example
|
|
*
|
|
* ```ts
|
|
* const result = getCommentAboveThatShouldExist({
|
|
* options: {
|
|
* groups: [
|
|
* 'external',
|
|
* { commentAbove: 'Internal imports' },
|
|
* 'internal',
|
|
* ],
|
|
* },
|
|
* leftGroupIndex: 0, // 'external' group
|
|
* rightGroupIndex: 2, // 'internal' group
|
|
* sortingNode: internalImportNode,
|
|
* sourceCode,
|
|
* })
|
|
* // Returns: { comment: 'Internal imports', exists: false }
|
|
* ```
|
|
*
|
|
* @template T - Type of the sorting node.
|
|
* @param params - Parameters for checking comment requirements.
|
|
* @param params.options - Configuration with groups that may require comments.
|
|
* @param params.leftGroupIndex - Index of the previous element's group.
|
|
* @param params.rightGroupIndex - Index of the current element's group.
|
|
* @param params.sortingNode - Node to check for required comments.
|
|
* @param params.sourceCode - ESLint source code for accessing comments.
|
|
* @returns Object with required comment text and existence status, or null if
|
|
* no comment required.
|
|
*/
|
|
function getCommentAboveThatShouldExist({
|
|
rightGroupIndex,
|
|
leftGroupIndex,
|
|
sortingNode,
|
|
sourceCode,
|
|
options,
|
|
}) {
|
|
if (leftGroupIndex !== null && leftGroupIndex >= rightGroupIndex) {
|
|
return null
|
|
}
|
|
let rightGroup = options.groups[rightGroupIndex]
|
|
if (!rightGroup || !isGroupWithOverridesOption(rightGroup)) {
|
|
return null
|
|
}
|
|
let rightGroupCommentAbove = rightGroup.commentAbove
|
|
if (!rightGroupCommentAbove) {
|
|
return null
|
|
}
|
|
return {
|
|
comment: rightGroupCommentAbove,
|
|
exists: !!getCommentsBefore({
|
|
node: sortingNode.node,
|
|
sourceCode,
|
|
}).find(comment => commentMatches(comment.value, rightGroupCommentAbove)),
|
|
}
|
|
}
|
|
function commentMatches(comment, expected) {
|
|
return comment.toLowerCase().includes(expected.toLowerCase().trim())
|
|
}
|
|
export { getCommentAboveThatShouldExist }
|