Ctrl K
ComunidadGuías…

shared/utils/naturalSort.ts

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
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;