eslint-plugin-import-sorting
Version:
ESLint plugin to group and sort imports by module, à la Python isort
59 lines (58 loc) • 2.69 kB
JavaScript
;
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
const order = require("../rules/order.cjs");
const getGroupNumber = require("./get-group-number.cjs");
const getLinesBetween = require("./get-lines-between.cjs");
const getNodeRange = require("./get-node-range.cjs");
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.getGroupNumber(order.IMPORT_GROUPS, sortingNode);
let nextNodeGroupNumber = getGroupNumber.getGroupNumber(order.IMPORT_GROUPS, nextSortingNode);
let currentNodeRange = getNodeRange.getNodeRange(nodes.at(index).node, sourceCode);
let nextNodeRangeStart = getNodeRange.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.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)}`;
}
exports.makeNewlineFixes = makeNewlineFixes;