import { SupportedOperators } from "../types"; import Data from '../types/Generic/Data'; import { ResourceWithTypePath, ResourceWithId } from '../types/Resource'; import Relationship from '../types/Relationship'; import CreateQuery from "../types/Query/CreateQuery"; import FindQuery from "../types/Query/FindQuery"; import DeleteQuery from "../types/Query/DeleteQuery"; import UpdateQuery from "../types/Query/UpdateQuery"; import AddToRelationshipQuery from "../types/Query/AddToRelationshipQuery"; import RemoveFromRelationshipQuery from "../types/Query/RemoveFromRelationshipQuery"; export type ReturnedResource = ResourceWithTypePath & ResourceWithId; export type RelationshipUpdateReturning = { before?: Relationship, after?: Relationship }; export type FindReturning = { primary: Data, // Below, using a required property with `| undefined` plays better with // destructuring in TS than an optional property without undefined. included: ReturnedResource[] | undefined, collectionSize: number | undefined }; export type CreationReturning = { created: Data }; export type UpdateReturning = { updated: Data }; export type DeletionReturning = { deleted?: Data }; export type QueryReturning = FindReturning | CreationReturning | UpdateReturning | DeletionReturning | RelationshipUpdateReturning; export type TypeInfo = { typePath: string[]; extra?: any }; export type TypeIdMapOf = { [type: string]: { [id: string]: T | undefined } | undefined; }; export interface AdapterInstance any> { constructor: T; find(query: FindQuery): Promise; create(query: CreateQuery): Promise; update(update: UpdateQuery): Promise; delete(query: DeleteQuery): Promise; addToRelationship(query: AddToRelationshipQuery): Promise; removeFromRelationship(query: RemoveFromRelationshipQuery): Promise; getModel(typeName: string): any; getRelationshipNames(typeName: string): string[]; getTypePaths(items: {type: string, id: string}[]): Promise> }; export interface AdapterClass { new (...args: any[]): AdapterInstance<{ new (...args: any[]): any }>; getStandardizedSchema(model: any, pluralizer: any): any; // Must include the "and" and "eq" operators supportedOperators: SupportedOperators } export interface Adapter extends AdapterInstance { }