export type ColumnAccessor = string | ((item: T) => any); export type GroupKey = ColumnAccessor | Array>; export type AggregateEntry = [string, ColumnAccessor?, number?]; export type AggregateEntries = AggregateEntry | AggregateEntry[]; export type OrderDirection = "asc" | "desc" | "ASC" | "DESC"; export interface GroupByOptions { /** * When true, throw if a string grouping key is missing on any object. * Default: missing keys are grouped under `"undefined"`. */ strict?: boolean; } export interface AggregateSpec { sum?: AggregateEntries; avg?: AggregateEntries; min?: AggregateEntries; max?: AggregateEntries; distinctCount?: AggregateEntries; count?: [string] | [string][]; } export interface GroupRow { key: any; items?: T[]; [alias: string]: any; } export interface GroupBucket { items?: T[]; [alias: string]: any; } export interface GroupResult { data: Record>; sum(alias: string, columnName: ColumnAccessor): GroupResult; min(alias: string, columnName: ColumnAccessor): GroupResult; max(alias: string, columnName: ColumnAccessor): GroupResult; avg( alias: string, columnName: ColumnAccessor, decimals?: number ): GroupResult; distinctCount(alias: string, columnName: ColumnAccessor): GroupResult; count(alias: string): GroupResult; aggregate(spec: AggregateSpec): GroupResult; reduce( alias: string, reducer: (accumulator: any, item: T, index: number, items: T[]) => any, initial?: any ): GroupResult; orderBy( field: "key" | string | ((group: GroupBucket, key: any) => any), direction?: OrderDirection ): GroupResult; omitItems(): GroupResult; where(predicate: (item: T) => boolean): GroupResult; toArray(): GroupRow[]; readonly keys: any[]; readonly firstGroup: T[]; readonly lastGroup: T[]; } declare function groupBy( data: T[], key: GroupKey, options?: GroupByOptions ): GroupResult; declare const groupjs_by: { groupBy: typeof groupBy; }; export = groupjs_by;