eslint-plugin-perfectionist
Version:
ESLint plugin for sorting various data such as objects, imports, types, enums, JSX props, etc.
53 lines (52 loc) • 1.75 kB
JavaScript
import { isGroupWithOverridesOption } from '../is-group-with-overrides-option.js'
import { isNewlinesBetweenOption } from '../is-newlines-between-option.js'
import { UnreachableCaseError } from '../unreachable-case-error.js'
import { computeOrderedValue } from './compute-ordered-value.js'
function buildSubgroupOrderComparator({ groups, order }) {
return (a, b) => {
let subgroupContainingA = computeSubgroupContainingNode(a, groups)
let subgroupContainingB = computeSubgroupContainingNode(b, groups)
if (
!subgroupContainingA ||
!subgroupContainingB ||
subgroupContainingA !== subgroupContainingB
) {
return 0
}
return computeOrderedValue(
subgroupContainingA.indexOf(a.group) -
subgroupContainingB.indexOf(b.group),
order,
)
}
}
function computeSubgroupContainingNode(sortingNode, groups) {
for (let group of groups) {
if (isNewlinesBetweenOption(group)) {
continue
}
if (typeof group === 'string' || Array.isArray(group)) {
if (doesStringSubgroupContainsNode(sortingNode, group)) {
return group
}
continue
}
/* v8 ignore else -- @preserve Exhaustive guard for unsupported group option. */
if (isGroupWithOverridesOption(group)) {
if (doesStringSubgroupContainsNode(sortingNode, group.group)) {
return group.group
}
continue
}
/* v8 ignore next -- @preserve Exhaustive guard for unsupported group option. */
throw new UnreachableCaseError(group)
}
return null
}
function doesStringSubgroupContainsNode(sortingNode, subgroup) {
if (typeof subgroup === 'string') {
return false
}
return subgroup.includes(sortingNode.group)
}
export { buildSubgroupOrderComparator }