import DataLoader from 'dataloader'; type MatchingKeyof = keyof { [P in keyof T as T[P] extends V ? P : never]: P; }; export declare abstract class Loader { config: any; idLoaders: PrimaryKeyLoader[]; constructor(config: any); abstract init(factory: DataLoaderFactory): any; abstract getDataLoader(cached: any, factory: DataLoaderFactory, filters?: FilterType): DataLoader | DataLoader; addIdLoader(loader: PrimaryKeyLoader): void; } export interface LoaderConfig { fetch: (ids: KeyType[], context: any) => Promise; extractId?: MatchingKeyof | ((item: ReturnType) => KeyType); idLoader?: PrimaryKeyLoader | PrimaryKeyLoader[]; options?: DataLoader.Options; } export declare class PrimaryKeyLoader extends Loader { config: LoaderConfig; extractId: (obj: ReturnType) => KeyType; constructor(config: LoaderConfig); init(factory: DataLoaderFactory): DataLoader; getDataLoader(cached: DataLoader): DataLoader; } export interface ManyJoinedType { key: KeyType; value: ReturnType; } export interface BaseManyLoaderConfig { skipCache?: boolean; maxBatchSize?: number; cacheKeyFn?: (key: KeyType) => string; keysFromFilter?: (filter: FilterType | undefined) => KeyType[]; idLoader?: PrimaryKeyLoader | PrimaryKeyLoader[]; } export declare abstract class BaseManyLoader extends Loader { config: BaseManyLoaderConfig; constructor(config: BaseManyLoaderConfig); init(factory: DataLoaderFactory): Map; prime(loader: PrimaryKeyLoader, factory: DataLoaderFactory, items: any): void; abstract groupItems(items: ReturnType[] | ManyJoinedType[], dedupekeys: Map): Record; abstract filterItems(items: ReturnType[] | ManyJoinedType[], filters: FilterType | undefined): ReturnType[] | ManyJoinedType[]; getDataLoader(cached: Map>, factory: DataLoaderFactory, filters?: FilterType): DataLoader; getCache(cached: Map>, filters?: FilterType): Map> | undefined; } export interface OneToManyLoaderConfig extends BaseManyLoaderConfig { fetch: (keys: KeyType[], filters: FilterType, context: any) => Promise; extractKey?: MatchingKeyof | ((item: ReturnType) => KeyType); matchKey?: (key: KeyType, item: ReturnType) => boolean; } export declare class OneToManyLoader extends BaseManyLoader { constructor(config: OneToManyLoaderConfig); filterItems: (items: ReturnType[], filters: FilterType | undefined) => ReturnType[]; groupItems: (items: ReturnType[], dedupekeys: Map) => Record; } export interface ManyJoinedLoaderConfig extends BaseManyLoaderConfig { fetch: (keys: KeyType[], filters: FilterType, context: any) => Promise[]>; } export declare class ManyJoinedLoader extends BaseManyLoader { constructor(config: ManyJoinedLoaderConfig); groupItems(items: ManyJoinedType[]): Record; filterItems(items: ManyJoinedType[], filters: FilterType | undefined): ManyJoinedType[]; prime(loader: PrimaryKeyLoader, factory: DataLoaderFactory, items: ManyJoinedType[]): void; } export interface ManyToManyLoaderConfig extends BaseManyLoaderConfig { fetch: (keys: KeyType[], filters: FilterType, context: any) => Promise; extractKeys?: MatchingKeyof | ((item: ReturnType) => KeyType[]); matchKey?: (key: KeyType, item: ReturnType) => boolean; } export declare class ManyToManyLoader extends BaseManyLoader { constructor(config: ManyToManyLoaderConfig); filterItems: (items: ReturnType[], filters: FilterType | undefined) => ReturnType[]; groupItems: (items: ReturnType[], dedupekeys: Map) => Record; } export interface ParentDocumentLoaderConfig { fetch: (ids: KeyType[], context: any) => Promise; childIds: (item: ReturnType) => KeyType[]; parentId?: MatchingKeyof | ((item: ReturnType) => KeyType); idLoader?: PrimaryKeyLoader | PrimaryKeyLoader[]; options?: DataLoader.Options; } export declare class ParentDocumentLoader extends Loader { config: ParentDocumentLoaderConfig; childIds: (obj: ReturnType) => KeyType[]; parentId: (obj: ReturnType) => KeyType; constructor(config: ParentDocumentLoaderConfig); init(factory: DataLoaderFactory): DataLoader; getDataLoader(cached: DataLoader): DataLoader; } export interface BestMatchLoaderConfig extends Omit, 'extractId'> { fetch: (keys: KeyType[], context: any) => Promise; scoreMatch?: (key: KeyType, item: ReturnType) => number; } export declare class BestMatchLoader extends Loader { constructor(config: BestMatchLoaderConfig); init(factory: DataLoaderFactory): DataLoader; getDataLoader(cached: DataLoader): DataLoader; } export interface FilteredStorageObject { loader: DataLoader; cache?: Map>; } export declare class DataLoaderFactory { private loaders; context: ContextType; constructor(context?: ContextType); get(loader: PrimaryKeyLoader): DataLoader; get(loader: BestMatchLoader): DataLoader; get(loader: BaseManyLoader, filters?: FilterType): DataLoader; prime(loader: PrimaryKeyLoader, values: ReturnType | ReturnType[]): void; loadMany(loader: PrimaryKeyLoader, keys: KeyType[]): Promise; loadMany(loader: ParentDocumentLoader, keys: KeyType[]): Promise; loadMany(loader: BestMatchLoader, keys: KeyType[]): Promise; loadMany(loader: BaseManyLoader, keys: KeyType[], filters?: FilterType): Promise; getCache(loader: PrimaryKeyLoader, filters?: FilterType): Map> | undefined; getCache(loader: BestMatchLoader, filters?: FilterType): Map> | undefined; getCache(loader: BaseManyLoader, filters?: FilterType): Map> | undefined; clear(): void; } export {};