@ortoo/angular-resource
Version:
Magical CRUD resource management for angular
381 lines (380 loc) • 10.4 kB
TypeScript
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
import { Observable } from 'rxjs/Observable';
import { Subject } from 'rxjs/Subject';
import { EventEmitter, Handler, Subscription } from './emitter';
export { Handler as EventHandler } from './emitter';
export declare type ModelOrModelArray = Model | ModelArray<Model>;
export declare type ObjectId = string;
export interface Deferred<T> {
promise: Promise<T>;
resolve: (val?: T) => void;
reject: (err: Error) => void;
}
export interface ArrayEmitter<T> extends Array<T> {
$emitter: EventEmitter;
$subject: BehaviorSubject<ArrayEmitter<T>>;
on: {
(name: string, handler: Handler): void;
};
off: {
(name: string, handler: Handler): void;
};
listen: {
(name: string, handler: Handler): Subscription;
};
once: {
(name: string, handler: Handler): void;
};
addListener: {
(name: string, handler: Handler): void;
};
removeListener: {
(name: string, handler: Handler): void;
};
}
export interface Model {
_id?: ObjectId;
$created: boolean;
$deleted: boolean;
$promise: Promise<Model>;
$subject: BehaviorSubject<Model>;
$resolvedSubject: Subject<Model>;
$deferred: Deferred<Model>;
$resolved: boolean;
$loc: LocalModel;
$id: string;
$save: {
(): Promise<Model>;
};
$remove: {
(noPrompt?: boolean, skipLocal?: boolean): Promise<boolean>;
};
$delete: {
(): Promise<boolean>;
};
$type: {
(): string;
};
$reset: {
(): void;
};
$refresh: {
(): void;
};
$toObject: {
(): any;
};
$updateServer: {
(val: any): void;
};
}
export interface Resource<T> {
get?: {
(id: string, force?: boolean): T;
(ids: string[], force?: boolean): ModelArray<T>;
(ids: string | string[], force?: boolean): (ModelArray<T> | T);
};
query?: {
(qry: any, limit?: number): Query<T>;
};
chain?: ChainFunction;
type?: {
(): string;
};
collect?: {
(seeds: Model | ModelArray<T>, relation: CollectionSearcher): Collection<T>;
};
updateOrCreate?: {
(val: any): T;
};
dispose: {
(): void;
};
addListener: {
(name: string, handler: Handler): void;
};
emit: {
(fnName: string, ...data: any[]): void;
};
listen: {
(name: string, handler: Handler): Subscription;
};
off: {
(name: string, handler: Handler): void;
};
on: {
(name: string, handler: Handler): void;
};
once: {
(name: string, handler: Handler): void;
};
removeListener: {
(name: string, handler: Handler): void;
};
new (val?: any, fromLoc?: boolean, lastRequested?: (number | Date)): T;
}
export interface ResourceFactory<T> {
(url: string, rootKey: string, rootKeyPlural?: string): Resource<T>;
Chain?: Chain;
}
export interface LocalModel {
_id?: ObjectId;
$emitter: EventEmitter;
$created: boolean;
$createdAt: number;
$deleted: boolean;
$promise: Promise<LocalModel>;
$deferred: Deferred<LocalModel>;
$resolved: boolean;
$resync: any[];
$dbsync: Promise<void>;
$saveprom: Promise<any>;
$mod: Model;
$id: string;
$dbresync: boolean;
$serv: ServerModel;
$save: {
(vals: any): Promise<LocalModel>;
};
$remove: {
(skipServer?: boolean): Promise<boolean>;
};
$delete: {
(): Promise<boolean>;
};
$refresh: {
(): void;
};
$toObject: {
(): any;
};
$updateServer: {
(val: any): void;
};
}
export interface LocalResource {
(val: any, fromServ?: boolean, mod?: any, lastRequested?: (Date | number)): void;
get?: {
(ids: (string[] | string), force?: boolean, transform?: Function): (ModelArray<Model> | Model);
};
query?: {
(qry: any, limit: number, Resource: any): Query<Model>;
};
collect?: {
(Resource: Resource<Model>, seeds: Model | ModelArray<Model>, relation: CollectionSearcher): Collection<Model>;
};
}
export interface LocalResourceFactory {
(url: string, rootKey: string, rootKeyPlural: string): LocalResource;
}
export interface ServerModel {
_id?: ObjectId;
$id: string;
$emitter: EventEmitter;
$deleted: boolean;
$promise: Promise<ServerModel>;
$resolved: boolean;
$fetching: boolean;
$deferred: Deferred<ServerModel>;
$save: {
(patch: JSONPatch): Promise<ServerModel>;
};
$remove: {
(): Promise<boolean>;
};
$delete: {
(): Promise<boolean>;
};
$refresh: {
(): void;
};
$toObject: {
(): any;
};
$updateServer: {
(val: any): void;
};
$updateVal: {
(val: any): void;
};
}
export interface ServerResource {
(val?: any, id?: string): void;
get?: {
(ids: (string[] | string), force?: boolean, transform?: Function): (any[] | any);
};
}
export interface ServerResourceFactory {
(url: string, rootKey: string, rootKeyPlural: string): ServerResource;
}
export interface ModelArray<T> extends Array<T> {
$promise?: Promise<ModelArray<T>>;
}
export interface Query<T> extends ArrayEmitter<T> {
$refresh: {
(force?: boolean): Promise<Query<T>>;
};
$promise: Promise<Query<T>>;
$subject: BehaviorSubject<Query<T>>;
$resolvedSubject: Subject<Query<T>>;
$resolved: boolean;
$Model: any;
$serverResults?: Query<T>;
$skip?: number;
$hasNext: boolean;
$hasPrev: boolean;
extend: {
(obj: any, noSanitize?: boolean, retServer?: boolean): Promise<Query<T>>;
};
replace: {
(qry: any, retServer?: boolean): Promise<Query<T>>;
};
get: {
(...args: any[]): any;
};
next: {
(num?: number): Promise<Query<T>>;
};
prev: {
(num?: number): Promise<Query<T>>;
};
chain: {
(Model: any, qryFn: QueryFunction): Query<Model>;
};
transform: Function;
currentLimit: number;
currentSkip: number;
loading: boolean;
hasNext: boolean;
hasPrev: boolean;
}
export interface QueryList {
(qry: any, limit: number, Resource: any, toRes: {
(id: string): Model;
}): Query<Model>;
refresh?: {
(): any;
};
}
export interface QueryFactory {
(url: string, rootKey: string, rootKeyPlural: string, db: Database): QueryList;
}
export declare type QueryFunction = (this: Query<Model>, results: Model[]) => any;
export declare type MultiQueryFunction = (this: Query<Model>, results: Model[][]) => any;
export interface ChainFunction {
(origQry: ChainableQuery<Model>, modelOrQryFn: (Resource<Model> | QueryFunction), qryFn?: QueryFunction): Query<Model>;
}
export interface Chain extends ChainFunction {
all?: {
(origQueries: Array<ChainableQuery<Model>>, Model: Resource<Model>, qryFn: MultiQueryFunction): Query<Model>;
};
}
export interface ChainableQuery<T> extends Array<T> {
$emitter: EventEmitter;
$promise: Promise<T[]>;
}
export interface Seeds extends Array<Model> {
on?: {
(name: string, handler: Handler): void;
};
removeListener?: {
(name: string, handler: Handler): void;
};
}
export interface CollectionFactory<T> {
(): CollectionStatic<T>;
}
export interface CollectionStatic<T> {
new (Resource: Resource<T>, seeds: Model | Seeds, searcherOrProp: CollectionSearcher): Collection<T>;
}
export interface Collection<T> extends ArrayEmitter<T> {
$promise: Promise<Collection<T>>;
$resolved: boolean;
chain: {
(Model: any, qryFn: QueryFunction): Query<T>;
};
check: {
(): void;
};
}
export interface CollectionSearcher {
(objs: Model[]): Observable<(Model[] | string[])>;
}
export interface SocketFactory {
(url: string, rootKey: string, rootKeyPlural?: string): Socket;
}
export interface Socket {
get: {
(ids: string[]): Promise<any>;
};
query: {
(query: any): Promise<any>;
};
patch: {
(id: string, patch: JSONPatch): Promise<any>;
};
create: {
(data: any): Promise<any>;
};
remove: {
(id: string): Promise<any>;
};
}
export interface DatabaseFactory {
(): Database;
}
export declare abstract class Database {
abstract update(res: LocalModel): Promise<any>;
abstract query(qry: any): Promise<string[]>;
abstract qryIsSimple(qry: any): boolean;
}
export declare type JSONPatch = (OpPatch | OpPatch[]);
export declare type OpPatch = AddPath | RemovePath | ReplacePath | MovePath | CopyPath | TestPath;
export interface Patch {
op: string;
}
export interface AddPath extends Patch {
path: string;
value: any;
}
export interface RemovePath extends Patch {
path: string;
}
export interface ReplacePath extends Patch {
path: string;
value: any;
}
export interface MovePath extends Patch {
from: string;
path: string;
}
export interface CopyPath extends Patch {
from: string;
path: string;
}
export interface TestPath extends Patch {
path: string;
value: any;
}
export interface LocalForage {
getItem<T>(key: string): Promise<T>;
getItem<T>(key: string, callback: (err: any, value: T) => void): void;
setItem<T>(key: string, value: T): Promise<T>;
setItem<T>(key: string, value: T, callback: (err: any, value: T) => void): void;
removeItem(key: string): Promise<void>;
removeItem(key: string, callback: (err: any) => void): void;
clear(): Promise<void>;
clear(callback: (err: any) => void): void;
length(): Promise<number>;
length(callback: (err: any, numberOfKeys: number) => void): void;
key(keyIndex: number): Promise<string>;
key(keyIndex: number, callback: (err: any, key: string) => void): void;
keys(): Promise<string[]>;
keys(callback: (err: any, keys: string[]) => void): void;
iterate(iteratee: (value: any, key: string, iterationNumber: number) => any): Promise<any>;
iterate(iteratee: (value: any, key: string, iterationNumber: number) => any, callback: (err: any, result: any) => void): void;
driver(): string;
}
export interface Plugin<T> {
(Resource: Resource<T>, modelName: string): void;
}