UNPKG

eslint-plugin-perfectionist

Version:

ESLint plugin for sorting various data such as objects, imports, types, enums, JSX props, etc.

52 lines (51 loc) 1.6 kB
import { computeOrderedValue } from './compute-ordered-value.js' import { buildStringFormatter } from './build-string-formatter.js' import { convertBooleanToSign } from '../convert-boolean-to-sign.js' /** * Cache for pre-computed character index maps to avoid recalculating for the * same custom alphabets across multiple comparisons. */ var alphabetCache = /* @__PURE__ */ new Map() function compareByCustomSort( a, b, { specialCharacters, ignoreCase, alphabet, order }, ) { let formatString = buildStringFormatter({ specialCharacters, ignoreCase, }) let indexByCharacters = alphabetCache.get(alphabet) if (!indexByCharacters) { indexByCharacters = /* @__PURE__ */ new Map() for (let [index, character] of [...alphabet].entries()) { indexByCharacters.set(character, index) } alphabetCache.set(alphabet, indexByCharacters) } let aValue = formatString(a) let bValue = formatString(b) let minLength = Math.min(aValue.length, bValue.length) for (let i = 0; i < minLength; i++) { let aCharacter = aValue[i] let bCharacter = bValue[i] let indexOfA = indexByCharacters.get(aCharacter) let indexOfB = indexByCharacters.get(bCharacter) indexOfA ??= Infinity indexOfB ??= Infinity if (indexOfA !== indexOfB) { return computeOrderedValue( convertBooleanToSign(indexOfA - indexOfB > 0), order, ) } } if (aValue.length === bValue.length) { return 0 } return computeOrderedValue( convertBooleanToSign(aValue.length - bValue.length > 0), order, ) } export { compareByCustomSort }