// @flow import { deburr } from 'lodash'; import naturalSort from 'natural-sort'; type NaturalSortOptions = { caseSensitive?: boolean, direction?: 'asc' | 'desc', }; const sorter = naturalSort(); function getSortByField( item: T, keyOrCallback: string | (T => string) ) { if (typeof keyOrCallback === 'string') { return deburr(item[keyOrCallback]); } return keyOrCallback(item); } function naturalSortBy( items: T[], key: string | (T => string), sortOptions?: NaturalSortOptions ): T[] { if (!items) return []; const sort = sortOptions ? naturalSort(sortOptions) : sorter; return items.sort((a: any, b: any): -1 | 0 | 1 => sort(getSortByField(a, key), getSortByField(b, key)) ); } export default naturalSortBy;