import { OptimizerHints } from "./optimizer"; import { PipeLineIsHelper } from "./optimizer/is"; interface DefaultEngines { name: string; } interface DefaultDb { modelName: string; } export interface Populeration { addEngine: AddEngineFn; addDb: AddDbFn; addRelation: AddRelationsFn; model: (modelName: ModelName) => ModelQueryBuilder; getModelsByEngine: (engineName: Engines["name"]) => Record; getModelsByDb: (db: any) => Record; newQueryBuilder: ) => QueryBuilder, ModelName extends Db["modelName"] = Db["modelName"]>(fn: Fn) => Fn; } interface ModelQueryBuilder { findMany: (query?: FilterQuery) => QueryBuilder & Promise; findOne: (query?: FilterQuery) => QueryBuilder; fillPopulations: (populationObject: Populate) => FilledPopulations; } export interface AggregatorOptions extends IOptions { db: any; model: any; } export interface EngineInfo { name: Name; aggregator: (options: AggregatorOptions) => Promise; transformModelName?: ({ modelName, model, db, }: { modelName: string; model: any; db: any; }) => string; optimizer?: (useOptimizer: boolean, options: AggregatorOptions) => AggregatorOptions; useOptimizer?: boolean; pipeLineIsHelper?: PipeLineIsHelper; } interface AddEngineFn { (engine: EngineInfo): Populeration; } interface DbInfo { engine: Engine; db: any; idField: string; defaultRequired: boolean; models: Record; } interface AddDbFn { (options: DbInfo): Populeration; } interface ModelThroughRelation { name: Db["modelName"]; model1Field: string; model2Field: string; } declare type ModelRelationsObject = { [field in string]: RelationOptions | Db["modelName"]; }; interface AddRelationsFn { (modelName: Db["modelName"], relations: ModelRelationsObject): Populeration; } export declare function createPopurelation(): Populeration; declare type AllProps = "query" | "sort" | "limit" | "skip" | "populate" | "project" | "withCount" | "rawPipeline" | "invisible" | "addFields" | "count"; declare type NullifyOthers = T & { [key in Exclude]?: undefined; }; export declare type QueryPipeline = NullifyOthers<{ query: FilterQuery; }>; export declare type SortPipeline = NullifyOthers<{ sort: SortQuery; }>; export declare type LimitPipeline = NullifyOthers<{ limit: number; }>; export declare type SkipPipeline = NullifyOthers<{ skip: number; }>; export declare type PopulatePipeline = NullifyOthers<{ parentIdField: string; myIdField: string; field: string; populate: PopulatePipelineOptions; }>; export declare type ProjectPipeline = NullifyOthers<{ project: Project; }>; export declare type WithCountPipeline = NullifyOthers<{ withCount: true; countKey: string; docsKey: string; docsPipelines: Pipeline[]; }>; export declare type RawPipeline = NullifyOthers<{ rawPipeline: any; }>; export declare type AddFieldsPipeline = NullifyOthers<{ addFields: AddFields; }>; export declare type CountPipeline = NullifyOthers<{ count: true; countKey: string; }>; export declare type OptimizerPipeline = NullifyOthers<{ invisible: true; optimizer: true; useOptimizer: boolean | undefined; hints: Partial | undefined; }>; export declare type Pipeline = QueryPipeline | SortPipeline | LimitPipeline | SkipPipeline | PopulatePipeline | ProjectPipeline | WithCountPipeline | RawPipeline | AddFieldsPipeline | CountPipeline | OptimizerPipeline; interface IOptions { readonly modelName: ModelName; readonly transformedModelName: string; readonly findOne: boolean; readonly pipelines: Pipeline[]; } declare type FilterQuery = { [key in string]?: any; }; declare type Project = { [key in string]?: any; }; declare type SortQuery = { [key in string]?: any; }; declare type AddFields = { [key in string]?: any; }; export interface PopulatePipelineOptions { required: boolean; matchesMany: boolean; modelName: string; transformedModelName: string; alreadyPopulated?: boolean; foreignField: string; through?: ModelThroughRelation; localField: string; globalPathPrefix: string; localPathPrefix: string; children?: Record; } interface PopulateOptions { required?: boolean; matchesMany?: boolean; model?: Db["modelName"]; /** * @deprecated Not supported yet */ through?: ModelThroughRelation; localField?: string; foreignField?: string; populate?: Populate; } export interface FilledPopulateOptions { required: boolean; matchesMany: boolean; model: Db["modelName"]; /** * @deprecated Not supported yet */ through?: ModelThroughRelation; localField: string; foreignField: string; populate?: FilledPopulations; } export declare type FilledPopulations = Record>; export interface RelationOptions { required?: boolean; matchesMany: boolean; model: Db["modelName"]; /** * @deprecated Not supported yet */ through?: ModelThroughRelation; localField?: string; foreignField?: string; } declare type Populate = { [key in string]: 1 | true | PopulateOptions; }; declare type WithCount = { [count in CountKey]: number; } & { [docs in DocsKey]: Doc; }; export interface QueryBuilder { where: (query?: FilterQuery) => QueryBuilder; project: (project: Project) => QueryBuilder; populate: { (field: string): QueryBuilder; (field: string, options: PopulateOptions): QueryBuilder; (bulkPopulate: Populate): QueryBuilder; }; sort: (sort?: SortQuery) => QueryBuilder; limit: (number?: number) => QueryBuilder; skip: (number?: number) => QueryBuilder; withCount: { (keys: { countKey: CountKey; docsKey: DocsKey; skip?: number; limit?: number; queryBuilder?: (queryBuilder: QueryBuilder) => QueryBuilder; }): QueryBuilder, ModelName, Engines, Db>; (keys: { skip?: number; limit?: number; queryBuilder?: (queryBuilder: QueryBuilder) => QueryBuilder; }): QueryBuilder, ModelName, Engines, Db>; (include?: true): QueryBuilder, ModelName, Engines, Db>; (include: false): QueryBuilder; }; rawPipeline: (pipeline: any) => QueryBuilder; addFields: (newFields?: AddFields) => QueryBuilder; count: () => QueryBuilder<{ count: number; }, ModelName, Engines, Db>; as: () => QueryBuilder; queryBuilder: ) => QueryBuilder) | undefined | null>(fn: Fn) => Fn extends undefined ? QueryBuilder : ReturnType>; optimizer: (options?: { use?: boolean; hints?: Partial; } | boolean) => QueryBuilder; inspect: (fn?: (aggregators: { optimizedOptions: AggregatorOptions; unoptimizedOptions: AggregatorOptions; }) => void) => QueryBuilder; exec(): Promise; } export declare const getLastSkipAndLimitIndex: (pipelines: Pipeline[]) => number; export {};