diff --git a/src/rules/order.js b/src/rules/order.js index 36b25147a..05d6454c0 100644 --- a/src/rules/order.js +++ b/src/rules/order.js @@ -242,10 +242,18 @@ function makeOutOfOrderReport(context, imported) { reportOutOfOrder(context, imported, outOfOrder, 'before'); } -function getSorter(ascending) { - const multiplier = ascending ? 1 : -1; +function getSorter(alphabetizeOptions) { + const multiplier = alphabetizeOptions.order === 'asc' ? 1 : -1; + let collate; + if (alphabetizeOptions.caseInsensitive) { + if (alphabetizeOptions.caseFirst === 'lower') { + collate = swapCase; + } else { + collate = (s) => String(s).toLowerCase(); + } + } - return function importsSorter(importA, importB) { + function importsSorter(importA, importB) { let result; if (importA < importB) { @@ -257,10 +265,12 @@ function getSorter(ascending) { } return result * multiplier; - }; + } + return collate ? (a, b) => importsSorter(collate(a), collate(b)) : importsSorter; } function swapCase(input) { + input = String(input); let result = ''; for (let i = 0; i < input.length; i++) { const lower = input[i].toLowerCase(); @@ -280,14 +290,10 @@ function mutateRanksToAlphabetize(imported, alphabetizeOptions) { const groupRanks = Object.keys(groupedByRanks); - const sorterFn = getSorter(alphabetizeOptions.order === 'asc'); - const comparator = - alphabetizeOptions.caseInsensitive === 'invert' ? (a, b) => sorterFn(swapCase(String(a)), swapCase(String(b))) - : alphabetizeOptions.caseInsensitive ? (a, b) => sorterFn(String(a).toLowerCase(), String(b).toLowerCase()) - : (a, b) => sorterFn(a, b); + const sorterFn = getSorter(alphabetizeOptions); // sort imports locally within their group groupRanks.forEach(function(groupRank) { - groupedByRanks[groupRank].sort(comparator); + groupedByRanks[groupRank].sort(sorterFn); }); // assign globally unique rank to each import