/**
 * Generated by veryExpress@0.6.3-alpha 
 * https://github.com/Justin26l/VeryExpress
 */

export type FieldOperators = {
  $in?: string[] | number[];
  $nin?: string[] | number[];
  $gt?: number | string;
  $gte?: number | string;
  $lt?: number | string;
  $lte?: number | string;
  $like?: string;
  $raw?: string;
};

export type FieldFilter<V> = V | FieldOperators;

export type Select = string[];

export type Filter<T = any> = {
  [K in keyof T]?: FieldFilter<T[K]>;
} & {
  $and?: Filter<T>[];
  $or?: Filter<T>[];
};

export type Join = string[];

export type SortOrder = "ASC" | "DESC";

export type VexPagination = {
  page?: number;
  perPage?: number;
  sort?: Record<string, SortOrder>;
};

export type PaginatedResult<T> = {
  data: T[];
  total?: number;
  page?: number;
  perPage?: number;
};

export interface VexRequest<T = any> {
    select?: Select;
    filter?: Filter<T>;
    join?: Join;
};