shared/utils/naturalSort.ts
Rama main · réplica de lectura del repositorio original.
import emojiRegex from "emoji-regex";
import { deburr } from "es-toolkit/compat";
import naturalSort from "natural-sort";
type NaturalSortOptions = {
caseSensitive?: boolean;
direction?: "asc" | "desc";
};
const sorter = naturalSort();
const regex = emojiRegex();
const stripEmojis = (value: string) => value.replace(regex, "");
const cleanValue = (value: string) => stripEmojis(deburr(value));
function getSortByField<T extends object>(
item: T,
keyOrCallback: string | ((item: T) => string)
) {
const field =
typeof keyOrCallback === "string"
? (item as Record<string, unknown>)[keyOrCallback]
: keyOrCallback(item);
return cleanValue(typeof field === "string" ? field : "");
}
function naturalSortBy<T extends object>(
items: T[],
key: string | ((item: T) => string),
sortOptions?: NaturalSortOptions
): T[] {
if (!items) {
return [];
}
const sort = sortOptions
? naturalSort({
caseSensitive: sortOptions.caseSensitive,
direction: sortOptions.direction === "desc" ? "desc" : undefined,
})
: sorter;
// Sort a copy, `items` may be an observable array which cannot be sorted in place.
return items
.slice()
.sort((a: T, b: T) => sort(getSortByField(a, key), getSortByField(b, key)));
}
export default naturalSortBy;