UNPKG

15.5 kBTypeScriptView Raw
1import { Action as ReduxAction, Reducer as ReduxReducer, Dispatch as ReduxDispatch, ReducersMapObject, Middleware, StoreEnhancer, StoreCreator, Store as ReduxStore, ActionCreator } from 'redux';
2declare type CheckIfParameterOptional<P> = P extends [unknown, ...unknown[]] ? false : true;
3declare type Without<FirstType, SecondType> = {
4 [KeyType in Exclude<keyof FirstType, keyof SecondType>]: never;
5};
6export declare type MergeExclusive<FirstType, SecondType> = FirstType | SecondType extends object ? (Without<FirstType, SecondType> & SecondType) | (Without<SecondType, FirstType> & FirstType) : FirstType | SecondType;
7export interface Action<TPayload = any, TMeta = any> extends ReduxAction<string> {
8 payload?: TPayload;
9 meta?: TMeta;
10}
11export declare type Reducer<TState = any> = (state: TState, payload?: Action['payload'], meta?: Action['meta']) => TState | void;
12export interface Models<TModels extends Models<TModels>> {
13 [key: string]: Model<TModels>;
14}
15export interface NamedModel<TModels extends Models<TModels>, TState = any, TBaseState = TState> extends Model<TModels, TState, TBaseState> {
16 name: string;
17 reducers: ModelReducers<TState>;
18}
19export interface Model<TModels extends Models<TModels>, TState = any, TBaseState = TState> {
20 name?: string;
21 state: TState;
22 reducers?: ModelReducers<TState>;
23 baseReducer?: ReduxReducer<TBaseState>;
24 effects?: ModelEffects<TModels> | ModelEffectsCreator<TModels>;
25}
26export declare type ModelReducers<TState = any> = {
27 [key: string]: Reducer<TState>;
28};
29export interface ModelEffects<TModels extends Models<TModels>> {
30 [key: string]: ModelEffect<TModels>;
31}
32export declare type ModelEffectThisTyped = {
33 [key: string]: (payload?: any, meta?: any) => Action<any, any>;
34};
35export declare type ModelEffect<TModels extends Models<TModels>> = (this: ModelEffectThisTyped, payload: Action['payload'], rootState: RematchRootState<TModels>, meta: Action['meta']) => any;
36export declare type ModelEffectsCreator<TModels extends Models<TModels>> = (dispatch: RematchDispatch<TModels>) => ModelEffects<TModels>;
37export interface PluginConfig<TModels extends Models<TModels>, TExtraModels extends Models<TModels>, TExposedModels = Partial<TExtraModels>> {
38 models?: TExposedModels;
39 redux?: InitConfigRedux;
40}
41export interface Plugin<TModels extends Models<TModels>, TExtraModels extends Models<TModels> = Record<string, never>, TExposedModels = Partial<TExtraModels>> extends PluginHooks<TModels, TExtraModels> {
42 config?: PluginConfig<TModels, TExtraModels, TExposedModels>;
43 exposed?: PluginExposed<TModels, TExtraModels>;
44}
45export interface PluginHooks<TModels extends Models<TModels>, TExtraModels extends Models<TModels>> {
46 onStoreCreated?: StoreCreatedHook<TModels, TExtraModels>;
47 onModel?: ModelHook<TModels, TExtraModels>;
48 onReducer?: ReducerHook<TModels, TExtraModels>;
49 onRootReducer?: RootReducerHook<TModels, TExtraModels>;
50 createMiddleware?: MiddlewareCreator<TModels, TExtraModels>;
51}
52export declare type ModelHook<TModels extends Models<TModels>, TExtraModels extends Models<TModels>> = (model: NamedModel<TModels>, rematch: RematchStore<TModels, TExtraModels>) => void;
53export declare type ReducerHook<TModels extends Models<TModels>, TExtraModels extends Models<TModels>> = (reducer: ReduxReducer, modelName: string, rematch: RematchBag<TModels, TExtraModels>) => ReduxReducer | void;
54export declare type RootReducerHook<TModels extends Models<TModels>, TExtraModels extends Models<TModels>> = (reducer: ReduxReducer, rematch: RematchBag<TModels, TExtraModels>) => ReduxReducer | void;
55export declare type StoreCreatedHook<TModels extends Models<TModels>, TExtraModels extends Models<TModels>> = (store: RematchStore<TModels, TExtraModels>, rematch: RematchBag<TModels, TExtraModels>) => RematchStore<TModels, TExtraModels> | void;
56export declare type MiddlewareCreator<TModels extends Models<TModels>, TExtraModels extends Models<TModels> = Record<string, never>> = (rematch: RematchBag<TModels, TExtraModels>) => Middleware;
57export declare type ObjectNotAFunction = {
58 [k: string]: any;
59} & ({
60 bind?: never;
61} | {
62 call?: never;
63});
64export declare type PluginExposed<TModels extends Models<TModels>, TExtraModels extends Models<TModels>> = {
65 [key: string]: ExposedFunction<TModels, TExtraModels> | ObjectNotAFunction;
66};
67export declare type ExposedFunction<TModels extends Models<TModels>, TExtraModels extends Models<TModels>> = (rematch: RematchStore<TModels, TExtraModels>, ...args: any) => any;
68export interface RematchBag<TModels extends Models<TModels>, TExtraModels extends Models<TModels>> {
69 models: NamedModel<TModels>[];
70 reduxConfig: ConfigRedux;
71 forEachPlugin: <Hook extends keyof PluginHooks<TModels, TExtraModels>>(method: Hook, fn: (content: NonNullable<PluginHooks<TModels, TExtraModels>[Hook]>) => void) => void;
72 effects: ModelEffects<TModels>;
73}
74export interface InitConfig<TModels extends Models<TModels>, TExtraModels extends Models<TModels>> {
75 name?: string;
76 models?: TModels | Partial<TModels>;
77 plugins?: Plugin<TModels, TExtraModels>[];
78 redux?: InitConfigRedux;
79}
80export interface Config<TModels extends Models<TModels>, TExtraModels extends Models<TModels>> extends InitConfig<TModels, TExtraModels> {
81 name: string;
82 models: TModels | Partial<TModels>;
83 plugins: Plugin<TModels, TExtraModels>[];
84 redux: ConfigRedux;
85}
86export interface InitConfigRedux<TRootState = any, DevtoolComposerGeneric = any> {
87 initialState?: TRootState;
88 reducers?: ModelReducers<TRootState>;
89 enhancers?: StoreEnhancer[];
90 middlewares?: Middleware[];
91 rootReducers?: ReducersMapObject<TRootState, Action>;
92 combineReducers?: ((reducers: ReducersMapObject<TRootState, Action>) => ReduxReducer<TRootState>) | undefined;
93 createStore?: StoreCreator | undefined;
94 devtoolOptions?: DevtoolOptions;
95 devtoolComposer?: DevtoolComposerGeneric;
96}
97export interface ConfigRedux<TRootState = any> extends InitConfigRedux<TRootState> {
98 reducers: ModelReducers<TRootState>;
99 enhancers: StoreEnhancer[];
100 middlewares: Middleware[];
101 rootReducers: ReducersMapObject<TRootState, Action>;
102}
103export interface RematchStore<TModels extends Models<TModels>, TExtraModels extends Models<TModels>> extends ReduxStore<RematchRootState<TModels, TExtraModels>, Action> {
104 [index: string]: ExposedFunction<TModels, TExtraModels> | Record<string, any> | string;
105 name: string;
106 dispatch: RematchDispatch<TModels>;
107 addModel: (model: NamedModel<TModels>) => void;
108}
109export declare type RematchRootState<TModels extends Models<TModels>, TExtraModels extends Models<TModels> = Record<string, never>> = ExtractRematchStateFromModels<TModels, TExtraModels>;
110export declare type ExtractRematchStateFromModels<TModels extends Models<TModels>, TExtraModels extends Models<TModels>> = {
111 [modelKey in keyof TModels]: TModels[modelKey]['state'];
112} & {
113 [modelKey in keyof TExtraModels]: TExtraModels[modelKey]['state'];
114};
115export declare type RematchDispatch<TModels extends Models<TModels>> = ReduxDispatch & ExtractRematchDispatchersFromModels<TModels>;
116export declare type ExtractRematchDispatchersFromModels<TModels extends Models<TModels>> = {
117 [modelKey in keyof TModels]: TModels[modelKey] extends Model<TModels> ? ModelDispatcher<TModels[modelKey], TModels> : never;
118};
119export declare type ModelDispatcher<TModel extends Model<TModels>, TModels extends Models<TModels>> = MergeExclusive<ExtractRematchDispatchersFromEffects<TModel['effects'], TModels>, ExtractRematchDispatchersFromReducers<TModel['state'], TModel['reducers'], TModels>>;
120export declare type ReturnOfDispatcher<IsEffect extends boolean, TReturn = any, TPayload = void, TMeta = void> = IsEffect extends true ? TReturn : Action<TPayload, TMeta>;
121export declare type RematchDispatcher<IsEffect extends boolean, TPayload extends [p?: unknown] = never, TMeta extends [m?: unknown] = never, TReturn = any> = [TPayload, TMeta] extends [never, never] ? (() => ReturnOfDispatcher<IsEffect, TReturn>) & {
122 isEffect: IsEffect;
123} : [TMeta] extends [never] ? CheckIfParameterOptional<TPayload> extends true ? ((payload?: TPayload[0]) => ReturnOfDispatcher<IsEffect, TReturn, TPayload[0]>) & {
124 isEffect: IsEffect;
125} : ((payload: TPayload[0]) => ReturnOfDispatcher<IsEffect, TReturn, TPayload[0]>) & {
126 isEffect: IsEffect;
127} : CheckIfParameterOptional<TMeta> extends true ? CheckIfParameterOptional<TPayload> extends true ? ((payload?: TPayload[0], meta?: TMeta[0]) => ReturnOfDispatcher<IsEffect, TReturn, TPayload[0], TMeta[0]>) & {
128 isEffect: IsEffect;
129} : ((payload: TPayload[0], meta?: TMeta[0]) => ReturnOfDispatcher<IsEffect, TReturn, TPayload[0], TMeta[0]>) & {
130 isEffect: IsEffect;
131} : ((payload: TPayload[0], meta: TMeta[0]) => ReturnOfDispatcher<IsEffect, TReturn, TPayload[0], TMeta[0]>) & {
132 isEffect: IsEffect;
133};
134declare type ExtractParameterFromReducer<P extends unknown[], V extends 'payload' | 'meta'> = P extends [] ? never : P extends [p?: infer TPayload] ? V extends 'payload' ? P extends [infer TPayloadMayUndefined, ...unknown[]] ? [p: TPayloadMayUndefined] : [p?: TPayload] : never : P extends [p?: infer TPayload, m?: infer TMeta, ...args: unknown[]] ? V extends 'payload' ? P extends [infer TPayloadMayUndefined, ...unknown[]] ? [p: TPayloadMayUndefined] : [p?: TPayload] : P extends [unknown, infer TMetaMayUndefined, ...unknown[]] ? [m: TMetaMayUndefined] : [m?: TMeta] : never;
135export declare type ExtractRematchDispatchersFromReducers<TState, TReducers extends Model<TModels, TState>['reducers'], TModels extends Models<TModels>> = {
136 [reducerKey in keyof TReducers]: ExtractRematchDispatcherFromReducer<TState, TReducers[reducerKey]>;
137};
138export declare type ExtractRematchDispatcherFromReducer<TState, TReducer> = TReducer extends () => any ? RematchDispatcher<false> : TReducer extends (state: TState, ...args: infer TRest) => TState | void ? TRest extends [] ? RematchDispatcher<false> : TRest[1] extends undefined ? RematchDispatcher<false, ExtractParameterFromReducer<TRest, 'payload'>> : RematchDispatcher<false, ExtractParameterFromReducer<TRest, 'payload'>, ExtractParameterFromReducer<TRest, 'meta'>> : never;
139export declare type ExtractRematchDispatchersFromEffects<TEffects extends Model<TModels>['effects'], TModels extends Models<TModels>> = TEffects extends (...args: any[]) => infer R ? R extends ModelEffects<TModels> ? ExtractRematchDispatchersFromEffectsObject<R, TModels> : never : TEffects extends ModelEffects<TModels> ? ExtractRematchDispatchersFromEffectsObject<TEffects, TModels> : never;
140export declare type ExtractRematchDispatchersFromEffectsObject<TEffects extends ModelEffects<TModels>, TModels extends Models<TModels>> = {
141 [effectKey in keyof TEffects]: ExtractRematchDispatcherFromEffect<TEffects[effectKey], TModels>;
142};
143declare type ExtractParameterFromEffect<P extends unknown[], V extends 'payload' | 'meta'> = P extends [] ? never : P extends [p?: infer TPayload, s?: unknown] ? V extends 'payload' ? P extends [infer TPayloadMayUndefined, ...unknown[]] ? [p: TPayloadMayUndefined] : [p?: TPayload] : never : P extends [
144 p?: infer TPayload,
145 s?: unknown,
146 m?: infer TMeta,
147 ...args: unknown[]
148] ? V extends 'payload' ? P extends [infer TPayloadMayUndefined, ...unknown[]] ? [p: TPayloadMayUndefined] : [p?: TPayload] : P extends [unknown, unknown, infer TMetaMayUndefined, ...unknown[]] ? [m: TMetaMayUndefined] : [m?: TMeta] : never;
149export declare type ExtractRematchDispatcherFromEffect<TEffect extends ModelEffect<TModels>, TModels extends Models<TModels>> = TEffect extends (...args: infer TRest) => infer TReturn ? TRest extends [] ? RematchDispatcher<true, never, never, TReturn> : TRest[1] extends undefined ? RematchDispatcher<true, ExtractParameterFromEffect<TRest, 'payload'>, never, TReturn> : TRest[2] extends undefined ? RematchDispatcher<true, ExtractParameterFromEffect<TRest, 'payload'>, never, TReturn> : RematchDispatcher<true, ExtractParameterFromEffect<TRest, 'payload'>, ExtractParameterFromEffect<TRest, 'meta'>, TReturn> : never;
150export interface DevtoolOptions {
151 disabled?: boolean;
152 name?: string;
153 actionCreators?: ActionCreator<any>[] | {
154 [key: string]: ActionCreator<any>;
155 };
156 latency?: number;
157 maxAge?: number;
158 serialize?: boolean | {
159 date?: boolean;
160 regex?: boolean;
161 undefined?: boolean;
162 error?: boolean;
163 symbol?: boolean;
164 map?: boolean;
165 set?: boolean;
166 function?: boolean | Function;
167 };
168 actionSanitizer?: <A extends Action>(action: A, id: number) => A;
169 stateSanitizer?: <S>(state: S, index: number) => S;
170 actionsBlacklist?: string | string[];
171 actionsWhitelist?: string | string[];
172 predicate?: <S, A extends Action>(state: S, action: A) => boolean;
173 shouldRecordChanges?: boolean;
174 pauseActionType?: string;
175 autoPause?: boolean;
176 shouldStartLocked?: boolean;
177 shouldHotReload?: boolean;
178 shouldCatchErrors?: boolean;
179 features?: {
180 pause?: boolean;
181 lock?: boolean;
182 persist?: boolean;
183 export?: boolean | 'custom';
184 import?: boolean | 'custom';
185 jump?: boolean;
186 skip?: boolean;
187 reorder?: boolean;
188 dispatch?: boolean;
189 test?: boolean;
190 };
191 trace?: boolean | (<A extends Action>(action: A) => string);
192 traceLimit?: number;
193 [key: string]: any;
194}
195export interface ModelCreator {
196 <RM extends Models<RM>>(): <R extends ModelReducers<S> | undefined, BR extends ReduxReducer<BS> | undefined, E extends ModelEffects<RM> | ModelEffectsCreator<RM> | undefined, S, BS = S>(mo: {
197 name?: string;
198 state: S;
199 reducers?: R;
200 baseReducer?: BR;
201 effects?: E;
202 }) => {
203 name?: string;
204 state: S;
205 } & (E extends undefined ? {} : {
206 effects: E;
207 }) & (R extends undefined ? {} : {
208 reducers: R;
209 }) & (BR extends undefined ? {} : {
210 baseReducer: BR;
211 });
212}
213declare module 'redux' {
214 interface Dispatch<A extends Action = AnyAction> {
215 [modelName: string]: any;
216 }
217}
218declare module 'react-redux' {
219 interface Connect {
220 <RM extends Models<RM>, State, TStateProps, TDispatchProps, TOwnProps>(mapStateToProps: MapStateToPropsParam<TStateProps, TOwnProps, State>, mapDispatchToProps: MapRematchDispatchToPropsNonObject<TDispatchProps, TOwnProps, RM>): InferableComponentEnhancerWithProps<TStateProps & TDispatchProps, TOwnProps>;
221 }
222 type MapRematchDispatchToPropsNonObject<TDispatchProps, TOwnProps, RM extends Models<RM>> = MapRematchDispatchToPropsFactory<TDispatchProps, TOwnProps, RM> | MapRematchDispatchToPropsFunction<TDispatchProps, TOwnProps, RM>;
223 type MapRematchDispatchToPropsFactory<TDispatchProps, TOwnProps, RM extends Models<RM>> = (dispatch: any, ownProps: TOwnProps) => MapRematchDispatchToPropsFunction<TDispatchProps, TOwnProps, RM>;
224 type MapRematchDispatchToPropsFunction<TDispatchProps, TOwnProps, RM extends Models<RM>> = (dispatch: any, ownProps: TOwnProps) => TDispatchProps;
225}
226declare global {
227 interface Window {
228 __REDUX_DEVTOOLS_EXTENSION_COMPOSE__?: any;
229 }
230}
231export {};
232//# sourceMappingURL=types.d.ts.map
\No newline at end of file