eslint-plugin-import-sorting
Version:
ESLint plugin to group and sort imports by module, à la Python isort
59 lines (58 loc) • 2.51 kB
JavaScript
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
};