import assign from './utils/assign' ; import { Action , compose , Dispatch , PreloadedState , Reducer , StoreEnhancer , } from 'redux' ; import { Config , EnhancerOptions } from './index' ; function enhancer ( options ? ) { const config = options || { } ; config . features = { pause : true , export : true , test : true } ; config . type = 'redux' ; if ( config . autoPause === undefined ) config . autoPause = true ; if ( config . latency === undefined ) config . latency = 500 ; return function ( createStore ) { return function < S , A extends Action < unknown > > ( reducer , preloadedState ) { const store = createStore ( reducer , preloadedState ) ; const origDispatch = store . dispatch ; const devTools = window . __REDUX_DEVTOOLS_EXTENSION__ ! . connect ( config ) ; devTools . init ( store . getState ( ) ) ; const dispatch = function ( action ) { const r = origDispatch ( action ) ; devTools . send ( action , store . getState ( ) ) ; return r ; } ; if ( Object . assign ) return Object . assign ( store , { dispatch : dispatch } ) ; return assign ( store , 'dispatch' , dispatch ) ; } ; } ; } function composeWithEnhancer ( config ? ) { return function ( ... funcs ) { return compose ( compose ( ... funcs ) , enhancer ( config ) ) ; } ; } export function composeWithDevTools ( config ) ; export function composeWithDevTools ( ... funcs ) ; export function composeWithDevTools ( ... funcs ) { if ( typeof window !== 'undefined' && window . __REDUX_DEVTOOLS_EXTENSION__ ) { if ( funcs . length === 0 ) return enhancer ( ) ; if ( typeof funcs [ 0 ] === 'object' ) return composeWithEnhancer ( funcs [ 0 ] ) ; return composeWithEnhancer ( ) ( ... ( funcs as StoreEnhancer [ ] ) ) ; } if ( funcs . length === 0 ) return undefined ; if ( typeof funcs [ 0 ] === 'object' ) return compose ; return compose ( ... ( funcs as StoreEnhancer [ ] ) ) ; } export const devToolsEnhancer = typeof window !== 'undefined' && window . __REDUX_DEVTOOLS_EXTENSION__ ? enhancer : function ( ) { return function ( noop ) { return noop ; } ; } ;