import { ModelCtor } from '../model'; export const adapterKey = Symbol('Model Adapter'); export type QueryPredicate = (...args: any[]) => any; export interface QueryOptions { predicate?: QueryPredicate; } export interface GetOptions extends QueryOptions { index?: string; } export interface JoinOptions { predicate?: (row: any) => void; } export interface Adapter { ensure(): Promise; save(model: M, replace?: boolean): Promise; delete(model: M): Promise; all(ctor: ModelCtor, opts?: QueryOptions): Promise; find( ctor: ModelCtor, filter: Partial, opts?: QueryOptions, ): Promise; findOne( ctor: ModelCtor, filter: Partial, opts?: QueryOptions, ): Promise; get(ctor: ModelCtor, value: any, opts?: GetOptions): Promise; getOne(ctor: ModelCtor, value: any, opts?: GetOptions): Promise; join(model: M, relationshipKey: string, opts?: JoinOptions): Promise; } export namespace Adapter { export function fromModel(model: any): T { return model[adapterKey] || model.constructor[adapterKey]; } }