// @flow export type IObservableMapInitialValues = IMapEntries | KeyValueMap | IMap export interface IMobxConfigurationOptions { +enforceActions?: boolean | "strict" | "never" | "always" | "observed"; computedRequiresReaction?: boolean; isolateGlobalState?: boolean; disableErrorBoundaries?: boolean; arrayBuffer?: number; reactionScheduler?: (f: () => void) => void; } declare export function configure(options: IMobxConfigurationOptions): void export interface IAutorunOptions { delay?: number; name?: string; scheduler?: (callback: () => void) => any; onError?: (error: any) => void; } export interface IReactionOptions extends IAutorunOptions { fireImmediately?: boolean; equals?: IEqualsComparer; } export interface IInterceptable { interceptors: IInterceptor[] | any; intercept(handler: IInterceptor): Lambda; } export type IEqualsComparer = (a: T, b: T) => boolean export type IInterceptor = (change: T) => T export type IMapEntry = [K, V] export type IMapEntries = IMapEntry[] export interface IMap { clear(): void; delete(key: K): boolean; forEach(callbackfn: (value: V, index: K, map: IMap) => void, thisArg?: any): void; get(key: K): V | any; has(key: K): boolean; set(key: K, value?: V): any; size: number; } declare export function isObservableMap(x: any): boolean export interface IComputedValueOptions { get?: () => T; set?: (value: T) => void; name?: string; equals?: IEqualsComparer; context?: any; } type PropertyDescriptor = { enumerable?: boolean, configurable?: boolean, writable?: boolean, value?: T, get?: () => T, set?: (value: T) => void } export interface IComputed { (func: () => T, setter?: (value: T) => void): IComputedValue; (func: () => T, options: IComputedValueOptions): IComputedValue; (target: Object, key: string, baseDescriptor?: PropertyDescriptor<*>): void; struct(target: Object, key: string, baseDescriptor?: PropertyDescriptor<*>): void; } export interface IDependencyTree { name: string; dependencies?: IDependencyTree[]; } export interface IObserverTree { name: string; observers?: IObserverTree[]; } export interface IAtom { reportObserved: () => void; reportChanged: () => void; } export interface IComputedValue { get(): T; set(value: T): void; observe(listener: (newValue: T, oldValue: T) => void, fireImmediately?: boolean): Lambda; } export interface IObservable {} export interface IDepTreeNode { name: string; observing?: IObservable[]; } export interface IDerivation { name: string; } export interface IReactionPublic { dispose: () => void; trace: (enterBreakPoint?: boolean) => void; } declare export class IListenable { observe(handler: (change: any, oldValue?: any) => void, fireImmediately?: boolean): Lambda; } export interface IObservableArray extends Array { spliceWithArray(index: number, deleteCount?: number, newItems?: T[]): T[]; observe( listener: (changeData: IArrayChange | IArraySplice) => void, fireImmediately?: boolean ): Lambda; intercept(handler: IInterceptor | IArrayWillSplice>): Lambda; intercept(handler: IInterceptor | IArraySplice>): Lambda; intercept(handler: IInterceptor | IArraySplice>): Lambda; clear(): T[]; replace(newItems: T[]): T[]; find( predicate: (item: T, index: number, array: Array) => boolean, thisArg?: any, fromIndex?: number ): T | any; findIndex( predicate: (item: T, index: number, array: Array) => boolean, thisArg?: any, fromIndex?: number ): number; remove(value: T): boolean; } export interface IArrayChange { type: "update"; object: IObservableArray; index: number; newValue: T; oldValue: T; } export interface IArraySplice { type: "splice"; object: IObservableArray; index: number; added: T[]; addedCount: number; removed: T[]; removedCount: number; } export interface IArrayWillChange { type: "update"; object: IObservableArray; index: number; newValue: T; } export interface IArrayWillSplice { type: "splice"; object: IObservableArray; index: number; added: T[]; removedCount: number; } export type KeyValueMap = { [key: string]: V } export interface IMapChange { object: ObservableMap; type: "update" | "add" | "delete"; name: K; newValue?: any; oldValue?: any; } export interface IMapWillChange { object: ObservableMap; type: "update" | "add" | "delete"; name: K; newValue?: any; } export interface IObservableObject {} export interface IObjectChange { name: string; object: any; type: "update" | "add" | "remove"; oldValue?: any; newValue: any; } export interface IObjectWillChange { object: any; type: "update" | "add" | "remove"; name: string; newValue: any; } export interface IValueWillChange { object: any; type: "update"; newValue: T; } export interface IValueDidChange extends IValueWillChange { oldValue: ?T; } export interface IObservableValue { get(): T; set(value: T): void; intercept(handler: IInterceptor>): Lambda; observe(listener: (change: IValueDidChange) => void, fireImmediately?: boolean): Lambda; } export interface IEnhancer { (newValue: T, oldValue: T | void, name: string): T; } export interface IObservableFactory { // observable overloads (target: Object, key: string, baseDescriptor?: PropertyDescriptor<*>): any; (value: Array): IObservableArray; (value: null | void): IObservableValue; (value: null | void): IObservableValue; (value: IMap): ObservableMap; (value: T): T; } export type IObservableDecorator = { (target: Object, property: string, descriptor?: PropertyDescriptor<*>): void, enhancer: IEnhancer } export type CreateObservableOptions = { name?: string, deep?: boolean, defaultDecorator?: IObservableDecorator } declare export class IObservableFactories { box(value?: T, options?: CreateObservableOptions): IObservableValue; array(initialValues?: T[], options?: CreateObservableOptions): IObservableArray; map( initialValues?: IObservableMapInitialValues, options?: CreateObservableOptions ): ObservableMap; object(props: T, options?: CreateObservableOptions): T & IObservableObject; ref( target: Object, property?: string, descriptor?: PropertyDescriptor<*> ): IObservableDecorator; shallow( target: Object, property?: string, descriptor?: PropertyDescriptor<*> ): IObservableDecorator; deep( target: Object, property?: string, descriptor?: PropertyDescriptor<*> ): IObservableDecorator; } export interface Lambda { (): void; name?: string; } export interface IActionFactory { (a1: any, a2?: any, a3?: any, a4?: any, a6?: any): any; bound(target: Object, propertyKey: string, descriptor?: PropertyDescriptor<*>): void; } declare export class ObservableMap { constructor(initialData?: IMapEntries | KeyValueMap, valueModeFunc?: Function): this; has(key: K): boolean; set(key: K, value: V): void; delete(key: K): boolean; get(key: K): V; keys(): Iterator; values(): Iterator; entries(): IMapEntries & Iterator>; forEach(callback: (value: V, key: K, object: KeyValueMap) => void, thisArg?: any): void; merge(other: ObservableMap | KeyValueMap): ObservableMap; clear(): void; replace(other: ObservableMap | KeyValueMap): ObservableMap; size: number; toJS(): Map; toPOJO(): KeyValueMap; toJSON(): KeyValueMap; toString(): string; observe(listener: (changes: IMapChange) => void, fireImmediately?: boolean): Lambda; intercept(handler: IInterceptor>): Lambda; } declare export function action( targetOrName: any, propertyKeyOrFuc?: any, descriptor?: PropertyDescriptor<*> ): any declare export function action(name: string, func: T): T declare export function action(func: T): T declare export function runInAction(name: string, block: () => T): T declare export function runInAction(block: () => T): T declare export function isAction(thing: any): boolean declare export function autorun( nameOrFunction: string | ((r: IReactionPublic) => any), options?: IAutorunOptions ): any declare export function reaction( expression: (r: IReactionPublic) => T, effect: (arg: T, r: IReactionPublic) => void, opts?: IReactionOptions ): () => void export interface IWhenOptions { name?: string; timeout?: number; onError?: (error: any) => void; } declare export function when( cond: () => boolean, effect: Lambda, options?: IWhenOptions ): () => void declare export function when(cond: () => boolean, options?: IWhenOptions): Promise declare export function computed( target: any, key?: string, baseDescriptor?: PropertyDescriptor<*> ): any declare export function extendObservable( target: A, properties: B, decorators?: any, options?: any ): A & B declare export function intercept( object: Object, property: string, handler: IInterceptor ): Lambda declare export function isComputed(value: any): boolean declare export function isComputedProp(value: any, property: string): boolean declare export function isObservable(value: any): boolean declare export function isObservableProp(value: any, property: string): boolean declare export var comparer: { identity: IEqualsComparer, structural: IEqualsComparer, default: IEqualsComparer } declare export var observable: IObservableFactory & IObservableFactories & { deep: { struct(initialValue?: T): T }, ref: { struct(initialValue?: T): T } } declare export function observe( value: IObservableValue | IComputedValue, listener: (change: IValueDidChange) => void, fireImmediately?: boolean ): Lambda declare export function observe( observableArray: IObservableArray, listener: (change: IArrayChange | IArraySplice) => void, fireImmediately?: boolean ): Lambda declare export function observe( observableMap: ObservableMap, listener: (change: IMapChange) => void, fireImmediately?: boolean ): Lambda declare export function observe( observableMap: ObservableMap, property: string, listener: (change: IValueDidChange) => void, fireImmediately?: boolean ): Lambda declare export function observe( object: any, listener: (change: IObjectChange) => void, fireImmediately?: boolean ): Lambda declare export function observe( object: any, property: string, listener: (change: IValueDidChange) => void, fireImmediately?: boolean ): Lambda export interface ToJSOptions { detectCycles?: boolean; exportMapsAsObjects?: boolean; } declare export function toJS(source: T, options?: ToJSOptions): T declare export function untracked(action: () => T): T declare export function spy(listener: (change: any) => void): Lambda declare export function transaction(action: () => T, thisArg?: any, report?: boolean): T declare export function isObservableArray(thing: any): boolean declare export function isObservableObject(thing: T): boolean declare export function isArrayLike(x: any): boolean declare export class Reaction { name: string; isDisposed: boolean; constructor(name: string, onInvalidate: () => void): this; schedule(): void; isScheduled(): boolean; track(fn: () => void): void; dispose(): void; getDisposer(): Lambda & { $mosbservable: Reaction }; toString(): string; trace(enterBreakPoint?: boolean): void; } declare export function createAtom( name: string, onBecomeObservedHandler?: () => void, onBecomeUnobservedHandler?: () => void ): IAtom declare export function decorate(target: T, decorators: any): T declare export function flow(fn: (...args: any[]) => T): (...args: any[]) => Promise declare export function flow( name: string, fn: (...args: any[]) => T ): (...args: any[]) => Promise declare export function keys(map: ObservableMap): K[] declare export function keys(obj: any): string[] declare export function values(map: ObservableMap): T[] declare export function values(ar: IObservableArray): T[] declare export function values(obj: any): any[] declare export function set(obj: ObservableMap, values: { [key: string]: V }): void declare export function set(obj: ObservableMap, key: K, value: V): void declare export function set(obj: IObservableArray, index: number, value: T): void declare export function set(obj: any, values: { [key: string]: any }): void declare export function set(obj: any, key: string, value: any): void declare export function remove(obj: ObservableMap, key: K): void declare export function remove(obj: IObservableArray, index: number): void declare export function remove(obj: any, key: string): void declare export function has(obj: ObservableMap, key: K): boolean declare export function has(obj: IObservableArray, index: number): boolean declare export function has(obj: any, key: string): boolean declare export function get(obj: ObservableMap, key: K): V | void declare export function get(obj: IObservableArray, index: number): T | void declare export function get(obj: any, key: string): any declare export function onReactionError( handler: (error: any, derivation: IDerivation) => void ): () => void declare export function onBecomeObserved( value: IObservable | IComputedValue | IObservableArray | ObservableMap, listener: Lambda ): Lambda declare export function onBecomeObserved( value: ObservableMap | Object, property: K, listener: Lambda ): Lambda declare export function onBecomeUnobserved( value: IObservable | IComputedValue | IObservableArray | ObservableMap, listener: Lambda ): Lambda declare export function onBecomeUnobserved( value: ObservableMap | Object, property: K, listener: Lambda ): Lambda declare export function getAtom(thing: any, property?: string): IDepTreeNode declare export function getDebugName(thing: any, property?: string): string declare export function getDependencyTree(thing: any, property?: string): IDependencyTree declare export function getObserverTree(thing: any, property?: string): IObserverTree