// Type definitions for Alt 0.16.10 // Project: https://github.com/goatslacker/alt // Definitions by: Michael Shearer // Definitions: https://github.com/borisyankov/DefinitelyTyped /// /// declare module AltJS { interface StoreReduce { action:any; data: any; } export interface StoreModel { //Actions bindAction?( action:Action, handler:ActionHandler):void; bindActions?(actions:ActionsClass):void; //Methods/Listeners exportPublicMethods?(exportConfig:any):void; bindListeners?(config:{[methodName:string]:Action | Actions}):void; exportAsync?(source:Source):void; registerAsync?(datasource:Source):void; //state setState?(state:S):void; setState?(stateFn:(currentState:S, nextState:S) => S):void; getState?():S; waitFor?(store:AltStore):void; //events onSerialize?(fn:(data:any) => any):void; onDeserialize?(fn:(data:any) => any):void; on?(event:AltJS.lifeCycleEvents, callback:() => any):void; emitChange?():void; waitFor?(storeOrStores:AltStore | Array>):void; otherwise?(data:any, action:AltJS.Action):void; observe?(alt:Alt):any; reduce?(state:any, config:StoreReduce):Object; preventDefault?():void; afterEach?(payload:Object, state:Object):void; beforeEach?(payload:Object, state:Object):void; // TODO: Embed dispatcher interface in def dispatcher?:any; //instance getInstance?():AltJS.AltStore; alt?:Alt; displayName?:string; } export type Source = {[name:string]: () => SourceModel}; export interface SourceModel { local(state:any):any; remote(state:any):Promise; shouldFetch?(fetchFn:(...args:Array) => boolean):void; loading?:(args:any) => void; success?:(state:S) => void; error?:(args:any) => void; interceptResponse?(response:any, action:Action, ...args:Array):any; } export interface AltStore { getState():S; listen(handler:(state:S) => any):() => void; unlisten(handler:(state:S) => any):void; emitChange():void; } export enum lifeCycleEvents { bootstrap, snapshot, init, rollback, error } export type Actions = {[action:string]:Action}; export interface Action { ( args:T):void; defer(data:any):void; } export interface ActionsClass { generateActions?( ...action:Array):void; dispatch( ...payload:Array):void; actions?:Actions; } type StateTransform = (store:StoreModel) => AltJS.AltStore; interface AltConfig { dispatcher?:any; serialize?:(serializeFn:(data:Object) => string) => void; deserialize?:(deserializeFn:(serialData:string) => Object) => void; storeTransforms?:Array; batchingFunction?:(callback:( ...data:Array) => any) => void; } class Alt { constructor(config?:AltConfig); actions:Actions; bootstrap(jsonData:string):void; takeSnapshot( ...storeNames:Array):string; flush():Object; recycle( ...stores:Array>):void; rollback():void; dispatch(action?:AltJS.Action, data?:Object, details?:any):void; //Actions methods addActions(actionsName:string, ActionsClass: ActionsClassConstructor):void; createActions(ActionsClass: ActionsClassConstructor, exportObj?: Object):T; createActions(ActionsClass: ActionsClassConstructor, exportObj?: Object, ...constructorArgs:Array):T; generateActions( ...actions:Array):T; getActions(actionsName:string):AltJS.Actions; //Stores methods addStore(name:string, store:StoreModel, saveStore?:boolean):void; createStore(store:StoreModel, name?:string):AltJS.AltStore; getStore(name:string):AltJS.AltStore; } export interface AltFactory { new(config?:AltConfig):Alt; } type ActionsClassConstructor = new (alt:Alt) => AltJS.ActionsClass; type ActionHandler = ( ...data:Array) => any; type ExportConfig = {[key:string]:(...args:Array) => any}; } declare module "alt/utils/chromeDebug" { function chromeDebug(alt:AltJS.Alt):void; export = chromeDebug; } declare module "alt/AltContainer" { import React = require("react"); interface ContainerProps { store?:AltJS.AltStore; stores?:Array>; inject?:{[key:string]:any}; actions?:{[key:string]:Object}; render?:(...props:Array) => React.ReactElement; flux?:AltJS.Alt; transform?:(store:AltJS.AltStore, actions:any) => any; shouldComponentUpdate?:(props:any) => boolean; component?:React.Component; } type AltContainer = React.ReactElement; var AltContainer:React.ComponentClass; export = AltContainer; } declare module "alt" { var alt:AltJS.AltFactory; export = alt; }