declare module 'oblak' { // helpers type AnyFunction = (...params) => TReturn; namespace Tools { type SettingsFunction = (obj) => any; // express type ExpressMiddleware = (req: any, res?: any, next?: any) => TReturn; type ExpressAsyncMiddleware = ExpressMiddleware>; interface Domain { settings: SettingsFunction; command: { only: { ifExists: () => any; ifNotExists: () => any; ifValidatedBy: (validator: string | object | AnyFunction) => any; ifState: (condition: AnyFunction) => any; after: (rule: AnyFunction) => any; } }; event: { settings: SettingsFunction; }; } interface Readmodels { settings: SettingsFunction; extendEvent: (obj: any) => any; extendPreEvent: (obj: any) => any; only: { ifExists: () => any; ifNotExists: () => any; if: (condition: Function) => any; }, identifier: (obj: any) => any; } interface Saga { settings: SettingsFunction; only: { ifExists: () => any; ifNotExists: () => any; if: (condition: Function) => any; }; shouldHandle: () => any; identifier: () => Oblak.EventIdentityDefinition; } interface Rest { services: (fn: AnyFunction) => ExpressMiddleware, readmodels: { one: (cmd: any, options?: any) => ExpressMiddleware; list: (cmd: any, options?: any) => ExpressMiddleware; }, command: (cmd: any, options?: any) => ExpressMiddleware, async: (asyncMiddleware: ExpressAsyncMiddleware ) => ExpressMiddleware; } } interface Tools { saga: Tools.Saga; readmodels: Tools.Readmodels; domain: Tools.Domain; rest: Tools.Rest; } class Oblak { static tools : Tools; static debug : () => Oblak; use: AnyFunction; addHook: AnyFunction; run: AnyFunction>; init: AnyFunction>; clear: AnyFunction>; } export = Oblak; } declare namespace Oblak { interface PlainObject { [key: string]: any; } interface OblakMetadataBase { [key: string]: any; timestamp: number; correlationId: string; causationId: string; } interface OblakDomainEvent { payload: PlainObject; metadata: OblakMetadataBase; context: string; name: string; aggregate: { name: string; id: string; revision; }; fullname: string; } interface OblakReadmodelEvent { payload: PlainObject; metadata: OblakMetadataBase; context: string; aggregate: { name: string; id: string; revision: number; }; event: { name: string; id: string; } fullname: string; } type EventIdentityDefinition = string | ((event: OblakDomainEvent) => string); type AggregateFunction = (id?: string) => T; namespace Data { interface ReadmodelCollectionEvents { create: string; update: string; delete: string; any: string; } interface DomainEvents { } interface ReadModelsEvents { } interface Events { domain: DomainEvents; readmodels: ReadModelsEvents; } interface Exports { events: Events; } } interface Data extends Data.Exports {} namespace Api { interface Writable { getDomain: () => Domain; } interface ReadableDomain { getDomain: () => DomainReadable; } interface Readable { getReadmodels: () => Readmodels; } interface Base { getServices: () => any; } interface Domain {} interface DomainReadable {} interface Readmodels {} type Command = (payload?:TPayload, metadata?:PlainObject) => TReturn; type ReadableAggregate = (id:string) => Promise; interface ReadmodelQuery extends PromiseLike { find: () => ReadmodelQuery; skip: () => ReadmodelQuery; size: () => ReadmodelQuery; } } namespace Saga { interface Api extends Api.Base, Api.Readable, Api.Writable {} interface Model { id: string; set(attribute: any, value?: any): void; get(attr: string): any; destroy(): void; } type ReactionMiddleware = (event: OblakDomainEvent, saga: Model, app: Api) => void | Promise; type Reaction = Array | ReactionMiddleware; interface Identity { [key: string]: EventIdentityDefinition; } interface Reactions { [key: string]: Reaction; } type Command = (payload?: TPayload, metadata?: PlainObject) => TReturn; interface Exports { identity: Identity; reactions: Reactions; } } interface Saga extends Saga.Exports {} namespace Readmodel { interface Api extends Api.Base, Api.Readable {} interface Elasticsearch6IntexMappings { properties: any; } interface Elasticsearch6Intex { mappings: Elasticsearch6IntexMappings; } interface Elasticsearch6RepositorySettings { index: Elasticsearch6Intex; } interface MongodbRepositorySettings { indexes: Array; } interface Model { id: string; set(attribute: any, value?: any): void; get(attr: string): any; destroy(): void; } type ReactionMiddleware = (event: OblakDomainEvent, viewmodel: Model, app: Api) => void | Promise; type Reaction = Array | ReactionMiddleware; interface Identity { [key: string]: EventIdentityDefinition; } interface Reactions { [key: string]: Reaction; } interface OblakAggregators { [key: string]: any; } interface OblakRepositorySettings { aggregators: OblakAggregators; } interface RepositorySettings { elasticsearch6?: Elasticsearch6RepositorySettings; mongodb?: MongodbRepositorySettings; oblak?: OblakRepositorySettings; } interface Exports { schema?: string; initialState?: PlainObject; identity: Identity; reactions: Reactions; repositorySettings?: RepositorySettings; } } interface Readmodel extends Readmodel.Exports {} namespace Domain { interface Api extends Api.Base, Api.Readable, Api.ReadableDomain {} interface Command { payload: TPayload; metadata: OblakMetadataBase; } interface ModelApply { (name: string, payload: PlainObject, metadata: OblakMetadataBase): void; } interface Model { id: string; apply: TApply; /** * Gets an attribute of the vm. * @param attr The attribute name. * @return The result value. * * @example: * aggregate.get('firstname'); // returns 'Jack' */ get(attr: string): any; /** * Sets attributes for the aggregate. * * @example: * aggregate.set('firstname', 'Jack'); * // or * aggregate.set({ * firstname: 'Jack', * lastname: 'X-Man' * }); */ set(attribute: any, value?: any): void; /** * Marks this aggregate as destroyed. */ destroy(): void; /** * Returns true if this aggregate is destroyed. */ isDestroyed(): boolean; } interface GenericModelApply extends ModelApply { [key: string]: (payload?: PlainObject, metadata?: OblakMetadataBase) => void; } type CommandMiddleware = (command?: Command, aggregate?: Model, app?: Api) => void | Promise; type CommandMiddlewares = Array> | CommandMiddleware; type EventMiddleware = (event?: OblakDomainEvent, aggregate?: Model) => void; type EVentMiddlewares = Array | EventMiddleware; interface Commands { [key: string]: CommandMiddlewares; } interface Events { [key: string]: EVentMiddlewares; } interface Aggregate extends Exports> { } interface Exports { /** * Aggregates initial stae */ initialState: PlainObject; /** * Aggregate command defintion */ commands: TCommands; /** * Your aggregate event definitions */ events: Events; /** * Aggreagte ID Generator fuction */ idGenerator: (command?: Command, app?: Api) => void | Promise; } } interface Aggregate extends Domain.Aggregate {} }