UNPKG

eslint-plugin-import-sorting

Version:

ESLint plugin to group and sort imports by module, à la Python isort

59 lines (58 loc) 2.51 kB
import { IMPORT_GROUPS } from "../rules/order.js"; import { getGroupNumber } from "./get-group-number.js"; import { getLinesBetween } from "./get-lines-between.js"; import { getNodeRange } from "./get-node-range.js"; function makeNewlineFixes({ fixer, nodes, sortedNodes, sourceCode, options }) { let fixes = []; for (let max = sortedNodes.length, index = 0; index < max; index++) { let sortingNode = sortedNodes.at(index); let nextSortingNode = sortedNodes.at(index + 1); if (options.newlinesBetween === "ignore" || !nextSortingNode) { continue; } let nodeGroupNumber = getGroupNumber(IMPORT_GROUPS, sortingNode); let nextNodeGroupNumber = getGroupNumber(IMPORT_GROUPS, nextSortingNode); let currentNodeRange = getNodeRange(nodes.at(index).node, sourceCode); let nextNodeRangeStart = getNodeRange(nodes.at(index + 1).node, sourceCode).at(0); let rangeToReplace = [currentNodeRange.at(1), nextNodeRangeStart]; let textBetweenNodes = sourceCode.text.slice(currentNodeRange.at(1), nextNodeRangeStart); let linesBetweenMembers = getLinesBetween(sourceCode, nodes.at(index), nodes.at(index + 1)); let rangeReplacement; if (options.newlinesBetween === "always" && nodeGroupNumber === nextNodeGroupNumber && linesBetweenMembers !== 0 || options.newlinesBetween === "never" && linesBetweenMembers > 0) { rangeReplacement = getStringWithoutInvalidNewlines(textBetweenNodes); } if (options.newlinesBetween === "always" && nodeGroupNumber !== nextNodeGroupNumber && linesBetweenMembers !== 1) { rangeReplacement = addNewlineBeforeFirstNewline( linesBetweenMembers > 1 ? getStringWithoutInvalidNewlines(textBetweenNodes) : textBetweenNodes ); let isOnSameLine = linesBetweenMembers === 0 && nodes.at(index).node.loc.end.line === nodes.at(index + 1).node.loc.start.line; if (isOnSameLine) { rangeReplacement = addNewlineBeforeFirstNewline(rangeReplacement); } } if (rangeReplacement) { fixes.push(fixer.replaceTextRange(rangeToReplace, rangeReplacement)); } } return fixes; } function getStringWithoutInvalidNewlines(value) { return value.replaceAll(/\n\s*\n/gu, "\n").replaceAll(/\n+/gu, "\n"); } function addNewlineBeforeFirstNewline(value) { let firstNewlineIndex = value.indexOf("\n"); if (firstNewlineIndex === -1) return `${value} `; return `${value.slice(0, firstNewlineIndex)} ${value.slice(firstNewlineIndex)}`; } export { makeNewlineFixes };