import * as clause from "./clause"; export interface Loader { context?: Context; load(key: T): Promise; loadMany?(keys: T[]): Promise<(V | null)[]>; clearAll(): any; } export interface LoaderFactory { name: string; createLoader(context?: Context): Loader; } export interface ConfigurableLoaderFactory extends LoaderFactory { createConfigurableLoader(options: EdgeQueryableDataOptions, context?: Context): Loader; } export declare type EdgeQueryableDataOptions = Partial>; export interface PrimableLoader extends Loader { prime(d: Data): void; } interface cache { getLoader(name: string, create: () => Loader): Loader; getCachedRows(options: queryOptions): Data[] | null; getCachedRow(options: queryOptions): Data | null; primeCache(options: queryOptions, rows: Data[]): void; primeCache(options: queryOptions, rows: Data): void; clearCache(): void; } interface queryOptions { fields: string[]; tableName: string; clause: clause.Clause; orderby?: string; } export interface Context { getViewer(): Viewer; cache?: cache; } export interface Viewer { viewerID: ID | null; viewer: () => Promise; instanceKey: () => string; context?: Context; } export interface Ent { id: ID; viewer: Viewer; privacyPolicy: PrivacyPolicy; nodeType: string; } export declare type Data = { [key: string]: any; }; export interface EntConstructor { new (viewer: Viewer, data: Data): T; } export declare type ID = string | number; export interface DataOptions { tableName: string; context?: Context; } export interface SelectBaseDataOptions extends DataOptions { fields: string[]; } export interface SelectDataOptions extends SelectBaseDataOptions { key: string; } export interface QueryableDataOptions extends SelectBaseDataOptions, QueryDataOptions { } export interface QueryDataOptions { distinct?: boolean; clause: clause.Clause; orderby?: string; groupby?: string; limit?: number; } export interface LoadRowOptions extends QueryableDataOptions { } export interface LoadRowsOptions extends QueryableDataOptions { } export interface CreateRowOptions extends DataOptions { fields: Data; fieldsToLog?: Data; } export interface EditRowOptions extends CreateRowOptions { key: string; } interface LoadableEntOptions { loaderFactory: LoaderFactory; ent: EntConstructor; } export interface LoadEntOptions extends LoadableEntOptions, SelectBaseDataOptions { } export interface LoadCustomEntOptions extends SelectBaseDataOptions { ent: EntConstructor; } export interface EditEntOptions extends LoadableEntOptions, EditRowOptions { } declare enum privacyResult { Allow = 200, Deny = 401, Skip = 307 } export interface PrivacyResult { result: privacyResult; error?: PrivacyError; } export interface PrivacyError extends Error { privacyPolicy: PrivacyPolicy; ent?: Ent; } export declare function Allow(): PrivacyResult; export declare function Skip(): PrivacyResult; export declare function Deny(): PrivacyResult; export declare function DenyWithReason(e: PrivacyError): PrivacyResult; export interface PrivacyPolicyRule { apply(v: Viewer, ent?: Ent): Promise; } export interface PrivacyPolicy { rules: PrivacyPolicyRule[]; } export {};