export declare type SourceData = Record; export declare type OneOrMore = T | T[]; export declare type DataHandler = (data: T[]) => T[]; export interface Processor { /** * Load new data. * @param source - New data */ load: (source: T[]) => Processor; /** * Search by text on multiple fields. Or you can provide a custom search function. * * @example * processor.search('ttt') // search on all fields * processor.search('ttt', ['name']) // search on 'name' fields * processor.search(data => data.filter(item => item.name === 'ttt')) // custom search function */ search: (searcher: string | ((val: T[]) => T[]), fields?: (keyof T)[] | undefined) => Processor; /** * Filter by a query object * * @example * processor.filter({ * name: ["Paul Lee", "Donald Clark"] // name equal to "Paul Lee" or "Donald Clark" * sex: "female", // and sex equal to "female" * age: (val) => val > 18 // and age greater than 18 * }); */ filter: (option: { [key in keyof T]?: T[key] | ((val: T[key]) => boolean) | (T[key] | ((val: T[key]) => boolean))[]; }) => Processor; /** * Same with [lodash/orderby](https://lodash.com/docs/4.17.15#orderBy). Or provide a custom sort function likes `Array.sort` * * @example * processor.sort("name"); // single field asc * processor.sort("name", "desc"); // single field desc * processor.sort(["name", "age"]); // multiple fields asc * processor.sort(["name", "age"], ["acs", "desc"]); // multiple fields with different orders */ sort: (option: keyof T | (keyof T)[] | ((a: T, b: T) => number), order?: "acs" | "desc" | "ascing" | "descing" | ("acs" | "desc" | "ascing" | "descing")[] | undefined) => Processor; /** * Page data. * @param size - Page size. Optional, if not provided, * all data will be returned and the * current page will be set to 1. * * @param current - Current page. Default 1. */ page: (size?: number, current?: number) => Processor; /** * Set callback function, it will be called when result update. * * @example * processor.onUpdate(result => { * console.log(result); * }) */ onUpdate: (callback: OnUpdateCallback) => Processor; /** * Calculate immediately. */ exec: () => Result; } export interface Result { /** Paged data */ current: T[]; /** Current page */ page: number; /** Total number of page */ pageCount: number; /** Total number of data handled by filter, search, sort */ total: number; } export declare type OnUpdateCallback = (result: Result) => void; /** * Create a processor instance. * @param source - Source data. * @param wait - debounce wating time (ms). Default 10. */ export declare function createProcessor(source?: T[]): Processor;